Files
deepseek-harness/docs/event-producer-consumer.md
Hypatia May 8a8c1965d7 feat(web): show durable token usage and context occupancy in the stats line
The chat stats line took its token totals from the loaded conversation nodes,
so paging changed them and compaction erased the billing behind replaced
content. It also had no way to show context occupancy: the numerator and
capacity never reached the browser.

Both now come from token-meter session projections read through the standard
useProjection seat. Window nodes keep supplying turn and step counts plus LLM
and tool wall times, which are correctly window-scoped facts about what is on
screen; accounting no longer comes from there.

`tokenUsage` supplies billing and cache hit. `contextPressure` supplies
occupancy, pairing the newest provider-reported prompt size with the newest
capacity recorded by `request/context`. Deployments without token-meter drop
the token groups; a route whose adapter advertises no capacity drops the
occupancy group rather than rendering a placeholder.

Occupancy is deliberately approximate: the numerator and capacity are
independent last-wins fields, not one atomic request observation, so switching
models pairs a fresh capacity with the prior route's pressure until the next
request reports usage. It is a user-facing reference figure that nothing in the
harness makes decisions from, and it matches how the TUI status line has always
computed occupancy. The Agent Note and token-meter README state this as a
decision, including why the atomic alternative was implemented and rejected, so
it is not re-litigated as a defect.

Snapshot delta is one added `Context N% of 128K` segment across eight web
goldens; the preceding commit absorbed master's pre-existing golden drift.
2026-07-30 14:48:19 +08:00

17 KiB

Event Producer And Consumer Matrix

This matrix shows which packages dispatch each harness-owned event and which packages listen to it. It is intentionally a table rather than one large graph: events are many-to-many, and dense relation data is easier to review in rows. Receiver and event-name types also cover contained dispatch sites that deliberately bypass ctx.emit, such as subagent lifecycle containment.

Event Mode Declared in Dispatchers Listeners
agent-loop/config-start-failed emit packages/core/agent-loop/src/index.ts:148 agent-loop (events.dispatch) tui
agent/cancel-requested emit packages/core/agent/src/types.ts:319 agent-loop (emitAgentEvent) goal-session
agent/created emit packages/core/agent/src/types.ts:250 agent (events.dispatch) goal-session, tui
agent/disposed emit packages/core/agent/src/types.ts:259 agent (events.dispatch) agent-loop, goal-session, tui
agent/error emit packages/core/agent/src/types.ts:433 agent-loop (emitAgentEvent) apiproxy, goal-session, session-telemetry, tui
agent/inbox/dequeue emit packages/core/agent/src/types.ts:297 agent-loop (emitAgentEvent) agent, apiproxy, tui
agent/inbox/discard emit packages/core/agent/src/types.ts:309 agent-loop (emitAgentEvent) agent, apiproxy, tui
agent/inbox/enqueue emit packages/core/agent/src/types.ts:278 agent-loop (emitAgentEvent) agent, apiproxy, goal-session
agent/inbox/update emit packages/core/agent/src/types.ts:287 agent-loop (emitAgentEvent) apiproxy
agent/prompt-submit waterfall packages/core/agent/src/types.ts:346 agent-loop (waterfall) goal-session, hooks-claude, hooks-codex, repeat-tool-guard, tui
agent/request waterfall packages/core/agent/src/types.ts:372 agent-loop (waterfall) agent
agent/request-error waterfall packages/core/agent/src/types.ts:391 agent-loop (waterfall) compact-basic, llm-retry
agent/session-start emit packages/core/agent/src/types.ts:332 agent-loop (emitAgentEvent) goal, goal-session, hooks-claude, hooks-codex, workspace-context
agent/settled emit packages/core/agent/src/types.ts:420 agent-loop (emitAgentEvent) compact-basic
agent/status emit packages/core/agent/src/types.ts:268 agent-loop (emitAgentEvent) agent, apiproxy, goal-session, tui
agent/step serial packages/core/agent/src/types.ts:359 agent-loop (serial) compact-basic, plan-mode, session-checkpoint-policy, time-context, tmux-context, tool-skill, user-approval, workspace-context
agent/turn-stopping serial packages/core/agent/src/types.ts:406 agent-loop (serial) hooks-claude, hooks-codex
approval/request waterfall packages/ui/user-approval/src/index.ts:30 user-approval (waterfall) acp, apiproxy
commands/change emit packages/ui/commands/src/index.ts:154 commands (events.dispatch) apiproxy, tui
domain/changed emit packages/storage/storage-domain/src/events.ts:46 storage-domain (emit) apiproxy, storage-domain, workspace
fs/edit-intent waterfall packages/fs/fs/src/index.ts:62 tool-fs (waterfall) fs-policy
fs/observed emit packages/fs/fs/src/index.ts:71 tool-fs (emit) fs-policy, skill-local
fs/write-intent waterfall packages/fs/fs/src/index.ts:54 tool-fs (waterfall) fs-policy
goal/changed emit packages/goal/goal/src/domain.ts:135 goal (emit) goal-session
llm/stream waterfall packages/llm/llm/src/index.ts:59 llm (waterfall) agent-loop, llm, llm-replay, session-checkpoint-policy, session-title
session/created emit packages/core/session/src/index.ts:71 session (events.dispatch) apiproxy, compact, goal, hook-protocol, jsonrpc, llm-retry, plan-mode, session, session-persistence, session-telemetry, tools, user-approval
session/disposed emit packages/core/session/src/index.ts:81 session (events.dispatch) agent-loop, apiproxy, session-persistence, session-projection-cache, session-telemetry, session-title
session/event emit packages/core/session/src/index.ts:93 session (events.dispatch) acp, apiproxy, cli-demo, compact, compact-basic, goal, goal-session, hook-protocol, jsonrpc, session, session-persistence, session-projection, session-projection-cache, session-telemetry, session-title, token-meter, tools, tui, user-approval, workspace-context
session/flush parallel packages/core/session/src/index.ts:103 session (events.dispatch) session-persistence, session-telemetry
skills/change emit packages/skill/skill/src/index.ts:188 skill (events.dispatch) tui
subagent/end emit packages/subagent/subagent/src/index.ts:140 subagent (events.dispatch) hooks-claude, jsonrpc, subagent
subagent/provider-added emit packages/subagent/subagent/src/index.ts:114 subagent (emit) subagent, tool-subagent
subagent/provider-removed emit packages/subagent/subagent/src/index.ts:120 subagent (events.dispatch) subagent, tool-subagent
subagent/start emit packages/subagent/subagent/src/index.ts:131 subagent (events.dispatch) hooks-claude, subagent
system-prompt/assemble waterfall packages/core/system-prompt/src/index.ts:29 system-prompt (waterfall) agent, system-prompt
system-prompt/change emit packages/core/system-prompt/src/index.ts:35 system-prompt (emit) -
telemetry/record waterfall packages/telemetry/session-telemetry/src/index.ts:41 session-telemetry (waterfall) -
tools/change emit packages/core/tools/src/index.ts:156 tools (emit) -
tools/code-dispatch-log waterfall packages/core/tools/src/index.ts:138 tools (waterfall) spill-policy
tools/execute waterfall packages/core/tools/src/index.ts:113 tools (waterfall) session-checkpoint-policy, timeout-policy
tools/post-execute waterfall packages/core/tools/src/index.ts:125 tools (waterfall) hooks-claude, hooks-codex, repeat-tool-guard, spill-policy, tool-fs-search, workspace-context
tools/pre-execute waterfall packages/core/tools/src/index.ts:102 tools (waterfall) hooks-claude, hooks-codex, tool-tasks
tools/result emit packages/core/tools/src/index.ts:146 tools (events.dispatch) subagent-inprocess, workspace-context
workflow/agent-end emit packages/workflow/workflow/src/index.ts:81 workflow (events.dispatch) workflow
workflow/agent-start emit packages/workflow/workflow/src/index.ts:70 workflow (events.dispatch) workflow
workflow/end emit packages/workflow/workflow/src/index.ts:91 workflow (events.dispatch) workflow
workflow/log emit packages/workflow/workflow/src/index.ts:60 workflow (events.dispatch) -
workflow/phase emit packages/workflow/workflow/src/index.ts:53 workflow (events.dispatch) -
workflow/start emit packages/workflow/workflow/src/index.ts:45 workflow (events.dispatch) workflow

Non-harness or undeclared event strings seen in package source

Event string Dispatchers Listeners
commands/changed runtime (emit) ui-command
connection/reset runtime (emit) ui-command
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, modules, webserver
internal/status - agent
locale/change locale (emit) locale, ui-models, 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.