Moving the agent plane behind presets left two readers on the wrong side of the host/agent line. `dsh-token-meter` was disabled on the host and mounted inside each preset's `compaction` realm, but its three projection units register into the process-wide `sessionProjections` table. A unit registered from one preset answers for every session, so whether a `minimal` session showed a context meter depended on whether some other session had mounted `standard` since boot, and a process that only ever ran `minimal` showed none. The meter takes no configuration, keys every fold by Session, and registers no tool or prompt section, so it returns to the host composition and leaves the presets' `isolate` map; the realm and `compact-basic` stay, because what a preset chooses is whether its agent compacts, not whether its tokens are counted. Nothing named an agent that joined no preset. The join is a scope-parent link, and without it the tools, prompt-section, and skill views resolve the empty global layer: the agent publishes, the turn runs, and the model receives nothing. `AgentPresets` now logs one warning per such agent while a roster is configured, and the invariant companion fails outright — at `system-prompt/assemble` rather than at publication, because an unjoined agent is legal until it addresses a model and `recompose` binds exactly such an agent. The warning stays advisory: a synchronous `agent/created` throw vetoes publication, and the ACP bridge, SDK server, and headless bundle all create an unjoined agent today. Three limits are recorded rather than fixed: projection key presence is not a per-session capability signal, a superseded standing generation is never reclaimed, and a `cordis_mount` temporary plugin belongs to the composition rather than the session that mounted it. Fixes #2203
18 KiB
18 KiB
Event Producer And Consumer Matrix
This matrix shows which packages dispatch each harness-owned event and which packages listen to it. Events are many-to-many, so the dense relation data is presented as a table rather than one large graph. Receiver and event-name types also cover contained dispatch sites that deliberately bypass ctx.emit, such as subagent lifecycle containment.
Non-harness or undeclared event strings seen in package source
| Event string | Dispatchers | Listeners |
|---|---|---|
commands/changed |
runtime (emit) |
ui-command |
connection/reset |
runtime (emit) |
runtime, ui-command, ui-models, ui-permission, ui-settings-general |
credentials/changed |
runtime (emit) |
ui-models |
internal/dispatch |
- | commands, compact, fs, goal, goal-session, hook-protocol, llm-retry, permission, plan-mode, pty-local, runtime, sandbox-policy, scope, session, session-title, subagent, time-context, tool-todo, tools, user-approval, workflow |
internal/plugin |
- | hmr, loader, lsp-local, modules, webserver |
internal/service |
- | agent-presets, gateway |
internal/status |
- | agent |
locale/change |
locale (emit) |
locale |
models/changed |
runtime (emit) |
ui-models |
session/preset-changed |
runtime (emit) |
ui-command |
settings/changed |
runtime (emit) |
runtime, ui-models, ui-permission, ui-settings-general |
slash/input-begin-command |
- | ui-conversation |
slash/input-consume-token |
- | ui-conversation |
slash/input-insert-reference |
- | ui-conversation |
slash/input-insert-text |
- | ui-conversation |
slots/changed |
runtime (emit) |
- |
theme/change |
ui-theme (emit) |
ui-layout, ui-theme |
Maintenance mode: generated: Cordis event declarations and producer/listener edges are resolved from the repository TypeScript Program.