* feat(#1682): OpenCode session.idle + opencode-subset dialect + Claude parity — Slice 1b/c - Plugin (.opencode/plugins/gsd-core.js): handle session.idle (↔ Claude Stop lifecycle point; no-op sentinel — state already persisted to .planning/). Completes the compaction/idle pair (#1914 shipped compaction). - Declare hookEvents: 'opencode-subset' in the OpenCode descriptor — the reserved dialect now has a real consumer (no longer zero-consumer). - host-integration.cts: add HOOK_EVENT_SURFACES + hookEventSurfaceFor() — the pure consumer that resolves a dialect to its host-fireable event surface. opencode-subset = session/tool/file subset with NO workflow-phase events (engine owns phase sequencing; ADR-1239 §OpenCode binding). - Tests: hookEventSurfaceFor unit tests (claude/gemini/opencode-subset/null); plugin session.idle no-throw; compaction breadcrumb; opencode-subset surface parity vs the plugin's handlers (Claude parity). * fix(#1682): don't declare hookEvents on opencode (hooksSurface:none invariant) The repo invariant couples runtime.hookEvents to the managed settings.json hook surface: hooksSurface:'none' runtimes (opencode — plugin owns hooks) must NOT declare hookEvents. Declaring 'opencode-subset' there violated 3 capability- registry invariants + 2 install-plan golden masters + opencode golden parity. The opencode-subset dialect is still IMPLEMENTED — just not via the legacy descriptor field: hookEventSurfaceFor() (host-integration.cts) is its consumer, and the OpenCode plugin consumes the subset events at runtime (session.idle added here; compaction shipped in #1914). Declaring it on the descriptor would require weakening the hooksSurface:none ⇔ no-hookEvents invariant (flagged for decision). * fix(#1682): refresh opencode golden parity for plugins/gsd-core.js (session.idle) * docs(changeset): OpenCode session.idle + opencode-subset dialect (#1682) * docs(changeset): backfill PR #1930
This commit is contained in:
@@ -651,6 +651,18 @@ const GsdCorePlugin = async ({ directory } = {}) => {
|
||||
handleHookResult(r);
|
||||
return;
|
||||
}
|
||||
|
||||
// session.idle ↔ Claude Stop lifecycle point (#1682 Slice 1b/c).
|
||||
// OpenCode fires session.idle when the run quiesces. GSD maps it to the
|
||||
// Stop equivalent — the opencode-subset lifecycle peer of compaction
|
||||
// (compaction preserves state across context-window summarization; idle
|
||||
// marks end-of-turn). No-op sentinel today (GSD state is already
|
||||
// persisted to .planning/), but it MUST be recognized so the declared
|
||||
// opencode-subset surface is fully wired and a future Stop-class hook can
|
||||
// attach without a plugin change.
|
||||
if (event.type === "session.idle") {
|
||||
return;
|
||||
}
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user