This report is the detailed companion to the v2 compatibility guide. It describes the gap between this plugin's v1 behavior and a native OpenCode v2 Promise plugin. It does not claim that native v2 support has shipped.
d6deb62379c54dc60468b80c498bd6a5899797cf.src/v2/setup.ts, which invokes the v1 factory and
translates selected hooks.| Capability | Classification | Disposition |
|---|---|---|
| Session context and prompt transforms | Direct official mapping | Implement with session.hook("context"); remove v1 payload conversion. |
| Tools and lifecycle | Direct mapping; v1-only hooks change | Port registration and compatible hooks; redesign cancellation/permission-dependent hooks. |
| Command definitions | Direct official mapping | Add executable Promise commands. |
| Global command interception | Unavailable | Retire the v1 interception contract. |
Current adapter draft.update |
Unverified/incompatible | Do not treat it as Promise command parity; replace with draft.add. |
| MCP registration | Direct official mapping | Register through ctx.mcp.transform and reload. |
| Events and live Companion signals | Direct official mapping | Consume volatile { type, data } events; redesign reconnect/reload reconstruction. |
| Cache telemetry | Direct official mapping | Read session.step.ended data.tokens.cache.read/write. |
| Atomic model failover | Unavailable | Retire the exact atomic contract. |
| Non-atomic model retry | Supported only with behavior change | Redesign retry and transcript semantics explicitly. |
| Explicit reusable session IDs | Direct official mapping | Use session.create({ id }); keep it separate from scheduler semantics. |
| Background scheduler, child/todo/status reads | Unavailable | Retire or separately redesign the legacy job-board contract. |
| External multiplexer panes | Unavailable | Retire external pane parity or design a separate TUI replacement. |
| Tool cancellation and permissions | Unavailable | Use host-managed controls; retire v1 interception. |
| Interview recovery | Supported only with behavior change | Persist and reconcile history explicitly. |
| TUI controls | Direct official mapping | Implement a native tui: true surface. |
/preset semantics |
Supported only with behavior change | Rebuild selection and session/configuration updates explicitly. |
Classification: Direct official mapping.
{ info, parts } values before running those transforms.session.hook("context") receives sessionID,
agent, model, mutable system, messages, and tools. This is the
supported replacement for raw v1 message transforms.Source: Promise session domain, current adapter context bridge.
Classification: Direct official mapping for registration and execution observation; supported only with behavior change for v1 hook semantics.
tool.transform adds a tool; tool.hook exposes
execute.before with mutable input and execute.after with completed/error
results. shell.hook("create.before") is the shell-specific lifecycle hook.Source: Promise tool domain, Promise shell domain.
Classification: Direct official mapping for command definitions; unavailable for the v1 global pre-execution interception contract.
/deepwork, /reflect, /loop, and /interview
commands, and uses command.execute.before to rewrite or intercept command
execution globally.command.transform adds executable
{ name, description, execute } definitions and provides reload(). The
Promise command domain does not expose a global command.execute.before
hook.draft.update translation is unverified and incompatible with the native
Promise CommandDraft, so it must not be treated as command parity.Source: Promise command domain, current command adapter.
Classification: Direct official mapping.
mcp.transform can list/get/set/update/remove server
configurations and mcp.reload() applies the result.ctx.mcp; it must not rely on the v1 config mutation or describe MCP
support as config-only because the adapter currently omits this bridge.Source: Promise MCP domain, current v1 config bridge.
Classification: Direct official mapping for observation; supported only with behavior change for v1 lifecycle semantics.
ctx.event.subscribe() returns a live, volatile
stream of events shaped as { type, data } (with transport metadata on some
events). It is an observation stream, not a replay/history API, pane-control
API, task scheduler, or atomic execution transaction.data field and map the
published event schema. The current adapter forwards each event unchanged
to the v1 hook and interview bridge; its handlers still read properties,
so this forward path is unchanged and incompatible. An event stream cannot
create, mirror, or control tmux/zellij panes.Source: Promise event domain,
Promise event subscription,
v2 event shape,
current unchanged forwarder,
current properties reader.
Classification: Direct official mapping.
session.step.ended is a durable v2 event whose
data.tokens contains cache.read and cache.write. A native subscriber
can read those counters directly from the event.session.step.ended and its { type, data } payload. The current
adapter does not translate this payload shape, so its cache handling is not
native telemetry parity.Source: session step event, generated v2 event payload, current unchanged event forwarder.
Classification: Direct official mapping for live signals; supported only with behavior change for reconnect/reload reconstruction.
ctx.event.subscribe() carries live session.status
and permission events, including permission.asked and
permission.replied. These are the direct source for live Companion
signals. This does not infer a current question event from the separate v1
question contract.Source: session status event, permission events, Promise event domain.
Classification: Unavailable for atomic failover; supported only with behavior change for non-atomic retry. Small-model selection remains an inventory decision.
ForegroundFallbackManager reacts to provider/rate-limit
failures, aborts, selects the next model, and re-prompts. The current code
also uses runtime.smallModel() for SmartFetch secondary-model selection.session.switchModel, session.interrupt, and session
hooks for model.request, http.request, and http.response exist. None
defines an atomic failure-detection, model-switch, retry, and transcript
transaction.switchModel must not be described as atomic failover.Source: Promise session domain, current model selection, current fallback manager.
Classification: Direct official mapping for explicit reusable session IDs; unavailable for the legacy scheduler and child/todo/status semantics.
session exposes create, and the official
session.create input accepts an explicit id. This is a direct mapping for
reusable session identity. It does not expose the v1 child/todo/status/
prompt-async read model or a background-job scheduler.Source: Promise session domain, explicit session ID input, current scheduler/board, current supervisor.
Classification: Unavailable for external multiplexer parity; supported only with behavior change through native TUI controls.
Source: TUI context UI surface, current multiplexer session manager.
Classification: Unavailable for exact v1 interception; supported only with behavior change through host-managed controls.
execute.before and
execute.after; Session provides whole-session interrupt. The Promise plugin
context does not expose a v1-equivalent permission-prompt interception or
per-tool cancellation hook.Source: Promise tool hooks, Promise session operations, current tool lifecycle hooks.
Classification: Supported only with behavior change.
Map, repopulates it from the v2 context hook, and updates it from
streamed text events. The interview service separately persists Q/A history
and final documents to markdown; the tests assert that history is appended
and preserved across writes.Source: Promise storage domain, current in-memory/context reconstruction, current markdown persistence, history preservation tests.
Classification: Direct official mapping for TUI controls; supported only with behavior change for preset semantics.
/preset has an interactive switcher, and v1 uses TUI
notifications/toasts for user feedback.tui: true; the
TUI context exposes ui.toast, dialogs including select, keymap commands,
slots, tabs, data, attention, and durable storage. Promise command
definitions and session.switchModel are also available, but do not by
themselves recreate the v1 preset semantics./preset selection and its configuration/session effects explicitly. Do not
claim current adapter parity.Source: Promise plugin definition, TUI controls, current v2 setup.
The native implementation should proceed in this order: