@deepseek-harness-tui/dsh-tui 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -5
- package/assets/claude-girl/claude-girl-happy.png +0 -0
- package/assets/claude-girl/claude-girl.png +0 -0
- package/assets/codex-girl/codex-girl-happy.png +0 -0
- package/assets/codex-girl/codex-girl.png +0 -0
- package/bin/dsh-tui.js +104 -18
- package/cordis.patch.yml +2 -0
- package/cordis.yml +2 -0
- package/guide/dsh-tui-guide/SKILL.md +4 -2
- package/guide/dsh-tui-guide/claude-backend.en.md +203 -0
- package/guide/dsh-tui-guide/claude-backend.md +161 -0
- package/guide/dsh-tui-guide/codex-backend.en.md +297 -0
- package/guide/dsh-tui-guide/codex-backend.md +257 -0
- package/guide/dsh-tui-guide/configuration.en.md +9 -2
- package/guide/dsh-tui-guide/configuration.md +9 -2
- package/guide/dsh-tui-guide/interaction.en.md +169 -27
- package/guide/dsh-tui-guide/interaction.md +115 -17
- package/guide/dsh-tui-guide/themes.en.md +24 -2
- package/guide/dsh-tui-guide/themes.md +21 -2
- package/guide/dsh-tui-guide/user-guide.en.md +38 -23
- package/guide/dsh-tui-guide/user-guide.md +22 -11
- package/guide/dsh-tui-guide/vscode.en.md +1 -0
- package/guide/dsh-tui-guide/vscode.md +1 -0
- package/lib/settings.json +139 -6
- package/lib/types/adapter/channel/state.d.ts.map +1 -1
- package/lib/types/adapter/channel/state.js +1 -0
- package/lib/types/adapter/channel/ui-policy.d.ts +17 -2
- package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
- package/lib/types/adapter/channel/ui-policy.js +29 -0
- package/lib/types/adapter/channel/ui.d.ts.map +1 -1
- package/lib/types/adapter/channel/ui.js +45 -5
- package/lib/types/adapter/ports/channel-catalog.d.ts +7 -0
- package/lib/types/adapter/ports/channel-catalog.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-display.d.ts +7 -1
- package/lib/types/adapter/ports/channel-display.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-session.d.ts +5 -0
- package/lib/types/adapter/ports/channel-session.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-settings.d.ts +20 -0
- package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-ui.d.ts +183 -6
- package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-view.d.ts +477 -13
- package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
- package/lib/types/agent/backend.d.ts +168 -0
- package/lib/types/agent/backend.d.ts.map +1 -0
- package/lib/types/agent/backend.js +1 -0
- package/lib/types/agent/capabilities.d.ts +461 -0
- package/lib/types/agent/capabilities.d.ts.map +1 -0
- package/lib/types/agent/capabilities.js +1 -0
- package/lib/types/agent/events.d.ts +733 -0
- package/lib/types/agent/events.d.ts.map +1 -0
- package/lib/types/agent/events.js +2 -0
- package/lib/types/agent/index.d.ts +8 -0
- package/lib/types/agent/index.d.ts.map +1 -0
- package/lib/types/agent/index.js +7 -0
- package/lib/types/agent/messages.d.ts +52 -0
- package/lib/types/agent/messages.d.ts.map +1 -0
- package/lib/types/agent/messages.js +91 -0
- package/lib/types/agent/presentation.d.ts +29 -0
- package/lib/types/agent/presentation.d.ts.map +1 -0
- package/lib/types/agent/presentation.js +4 -0
- package/lib/types/agent/refs.d.ts +30 -0
- package/lib/types/agent/refs.d.ts.map +1 -0
- package/lib/types/agent/refs.js +39 -0
- package/lib/types/agent/session.d.ts +78 -0
- package/lib/types/agent/session.d.ts.map +1 -0
- package/lib/types/agent/session.js +1 -0
- package/lib/types/backends/claude/activity.d.ts +53 -0
- package/lib/types/backends/claude/activity.d.ts.map +1 -0
- package/lib/types/backends/claude/activity.js +103 -0
- package/lib/types/backends/claude/auth.d.ts +245 -0
- package/lib/types/backends/claude/auth.d.ts.map +1 -0
- package/lib/types/backends/claude/auth.js +503 -0
- package/lib/types/backends/claude/backend.d.ts +32 -0
- package/lib/types/backends/claude/backend.d.ts.map +1 -0
- package/lib/types/backends/claude/backend.js +296 -0
- package/lib/types/backends/claude/catalog.d.ts +17 -0
- package/lib/types/backends/claude/catalog.d.ts.map +1 -0
- package/lib/types/backends/claude/catalog.js +94 -0
- package/lib/types/backends/claude/channels.d.ts +63 -0
- package/lib/types/backends/claude/channels.d.ts.map +1 -0
- package/lib/types/backends/claude/channels.js +275 -0
- package/lib/types/backends/claude/contract.d.ts +37 -0
- package/lib/types/backends/claude/contract.d.ts.map +1 -0
- package/lib/types/backends/claude/contract.js +46 -0
- package/lib/types/backends/claude/controls.d.ts +134 -0
- package/lib/types/backends/claude/controls.d.ts.map +1 -0
- package/lib/types/backends/claude/controls.js +425 -0
- package/lib/types/backends/claude/dialogs.d.ts +62 -0
- package/lib/types/backends/claude/dialogs.d.ts.map +1 -0
- package/lib/types/backends/claude/dialogs.js +253 -0
- package/lib/types/backends/claude/flag-settings.d.ts +12 -0
- package/lib/types/backends/claude/flag-settings.d.ts.map +1 -0
- package/lib/types/backends/claude/flag-settings.js +49 -0
- package/lib/types/backends/claude/images.d.ts +49 -0
- package/lib/types/backends/claude/images.d.ts.map +1 -0
- package/lib/types/backends/claude/images.js +94 -0
- package/lib/types/backends/claude/index.d.ts +5 -0
- package/lib/types/backends/claude/index.d.ts.map +1 -0
- package/lib/types/backends/claude/index.js +4 -0
- package/lib/types/backends/claude/install.d.ts +15 -0
- package/lib/types/backends/claude/install.d.ts.map +1 -0
- package/lib/types/backends/claude/install.js +91 -0
- package/lib/types/backends/claude/modelEnv.d.ts +64 -0
- package/lib/types/backends/claude/modelEnv.d.ts.map +1 -0
- package/lib/types/backends/claude/modelEnv.js +199 -0
- package/lib/types/backends/claude/narrow.d.ts +10 -0
- package/lib/types/backends/claude/narrow.d.ts.map +1 -0
- package/lib/types/backends/claude/narrow.js +8 -0
- package/lib/types/backends/claude/older-history.d.ts +16 -0
- package/lib/types/backends/claude/older-history.d.ts.map +1 -0
- package/lib/types/backends/claude/older-history.js +101 -0
- package/lib/types/backends/claude/options.d.ts +181 -0
- package/lib/types/backends/claude/options.d.ts.map +1 -0
- package/lib/types/backends/claude/options.js +208 -0
- package/lib/types/backends/claude/permissions.d.ts +83 -0
- package/lib/types/backends/claude/permissions.d.ts.map +1 -0
- package/lib/types/backends/claude/permissions.js +331 -0
- package/lib/types/backends/claude/prefs.d.ts +55 -0
- package/lib/types/backends/claude/prefs.d.ts.map +1 -0
- package/lib/types/backends/claude/prefs.js +150 -0
- package/lib/types/backends/claude/process.d.ts +19 -0
- package/lib/types/backends/claude/process.d.ts.map +1 -0
- package/lib/types/backends/claude/process.js +156 -0
- package/lib/types/backends/claude/replay.d.ts +129 -0
- package/lib/types/backends/claude/replay.d.ts.map +1 -0
- package/lib/types/backends/claude/replay.js +505 -0
- package/lib/types/backends/claude/sdk-warnings.d.ts +23 -0
- package/lib/types/backends/claude/sdk-warnings.d.ts.map +1 -0
- package/lib/types/backends/claude/sdk-warnings.js +55 -0
- package/lib/types/backends/claude/sdk.d.ts +12 -0
- package/lib/types/backends/claude/sdk.d.ts.map +1 -0
- package/lib/types/backends/claude/sdk.js +34 -0
- package/lib/types/backends/claude/send-message.d.ts +54 -0
- package/lib/types/backends/claude/send-message.d.ts.map +1 -0
- package/lib/types/backends/claude/send-message.js +65 -0
- package/lib/types/backends/claude/session/auth.d.ts +47 -0
- package/lib/types/backends/claude/session/auth.d.ts.map +1 -0
- package/lib/types/backends/claude/session/auth.js +226 -0
- package/lib/types/backends/claude/session/channels.d.ts +82 -0
- package/lib/types/backends/claude/session/channels.d.ts.map +1 -0
- package/lib/types/backends/claude/session/channels.js +45 -0
- package/lib/types/backends/claude/session/input.d.ts +16 -0
- package/lib/types/backends/claude/session/input.d.ts.map +1 -0
- package/lib/types/backends/claude/session/input.js +64 -0
- package/lib/types/backends/claude/session/lifecycle.d.ts +6 -0
- package/lib/types/backends/claude/session/lifecycle.d.ts.map +1 -0
- package/lib/types/backends/claude/session/lifecycle.js +852 -0
- package/lib/types/backends/claude/session/store.d.ts +17 -0
- package/lib/types/backends/claude/session/store.d.ts.map +1 -0
- package/lib/types/backends/claude/session/store.js +122 -0
- package/lib/types/backends/claude/session/subagents.d.ts +13 -0
- package/lib/types/backends/claude/session/subagents.d.ts.map +1 -0
- package/lib/types/backends/claude/session/subagents.js +77 -0
- package/lib/types/backends/claude/session/types.d.ts +89 -0
- package/lib/types/backends/claude/session/types.d.ts.map +1 -0
- package/lib/types/backends/claude/session/types.js +1 -0
- package/lib/types/backends/claude/session.d.ts +4 -0
- package/lib/types/backends/claude/session.d.ts.map +1 -0
- package/lib/types/backends/claude/session.js +2 -0
- package/lib/types/backends/claude/side-query.d.ts +34 -0
- package/lib/types/backends/claude/side-query.d.ts.map +1 -0
- package/lib/types/backends/claude/side-query.js +116 -0
- package/lib/types/backends/claude/task-output.d.ts +13 -0
- package/lib/types/backends/claude/task-output.d.ts.map +1 -0
- package/lib/types/backends/claude/task-output.js +101 -0
- package/lib/types/backends/claude/tools.d.ts +45 -0
- package/lib/types/backends/claude/tools.d.ts.map +1 -0
- package/lib/types/backends/claude/tools.js +231 -0
- package/lib/types/backends/claude/transcript-file.d.ts +41 -0
- package/lib/types/backends/claude/transcript-file.d.ts.map +1 -0
- package/lib/types/backends/claude/transcript-file.js +195 -0
- package/lib/types/backends/claude/translate/attempts.d.ts +33 -0
- package/lib/types/backends/claude/translate/attempts.d.ts.map +1 -0
- package/lib/types/backends/claude/translate/attempts.js +243 -0
- package/lib/types/backends/claude/translate/content.d.ts +33 -0
- package/lib/types/backends/claude/translate/content.d.ts.map +1 -0
- package/lib/types/backends/claude/translate/content.js +91 -0
- package/lib/types/backends/claude/translate/core.d.ts +76 -0
- package/lib/types/backends/claude/translate/core.d.ts.map +1 -0
- package/lib/types/backends/claude/translate/core.js +447 -0
- package/lib/types/backends/claude/translate/events.d.ts +9 -0
- package/lib/types/backends/claude/translate/events.d.ts.map +1 -0
- package/lib/types/backends/claude/translate/events.js +77 -0
- package/lib/types/backends/claude/translate/lanes.d.ts +31 -0
- package/lib/types/backends/claude/translate/lanes.d.ts.map +1 -0
- package/lib/types/backends/claude/translate/lanes.js +177 -0
- package/lib/types/backends/claude/translate/messages.d.ts +36 -0
- package/lib/types/backends/claude/translate/messages.d.ts.map +1 -0
- package/lib/types/backends/claude/translate/messages.js +202 -0
- package/lib/types/backends/claude/translate/system.d.ts +40 -0
- package/lib/types/backends/claude/translate/system.d.ts.map +1 -0
- package/lib/types/backends/claude/translate/system.js +399 -0
- package/lib/types/backends/claude/translate/tasks.d.ts +19 -0
- package/lib/types/backends/claude/translate/tasks.d.ts.map +1 -0
- package/lib/types/backends/claude/translate/tasks.js +159 -0
- package/lib/types/backends/claude/translate/types.d.ts +114 -0
- package/lib/types/backends/claude/translate/types.d.ts.map +1 -0
- package/lib/types/backends/claude/translate/types.js +1 -0
- package/lib/types/backends/claude/translate.d.ts +9 -0
- package/lib/types/backends/claude/translate.d.ts.map +1 -0
- package/lib/types/backends/claude/translate.js +6 -0
- package/lib/types/backends/codex/auth/external-tokens.d.ts +66 -0
- package/lib/types/backends/codex/auth/external-tokens.d.ts.map +1 -0
- package/lib/types/backends/codex/auth/external-tokens.js +325 -0
- package/lib/types/backends/codex/auth/route.d.ts +14 -0
- package/lib/types/backends/codex/auth/route.d.ts.map +1 -0
- package/lib/types/backends/codex/auth/route.js +52 -0
- package/lib/types/backends/codex/auth/status.d.ts +16 -0
- package/lib/types/backends/codex/auth/status.d.ts.map +1 -0
- package/lib/types/backends/codex/auth/status.js +115 -0
- package/lib/types/backends/codex/backend.d.ts +58 -0
- package/lib/types/backends/codex/backend.d.ts.map +1 -0
- package/lib/types/backends/codex/backend.js +201 -0
- package/lib/types/backends/codex/catalog.d.ts +17 -0
- package/lib/types/backends/codex/catalog.d.ts.map +1 -0
- package/lib/types/backends/codex/catalog.js +128 -0
- package/lib/types/backends/codex/channels.d.ts +59 -0
- package/lib/types/backends/codex/channels.d.ts.map +1 -0
- package/lib/types/backends/codex/channels.js +274 -0
- package/lib/types/backends/codex/contract.d.ts +46 -0
- package/lib/types/backends/codex/contract.d.ts.map +1 -0
- package/lib/types/backends/codex/contract.js +80 -0
- package/lib/types/backends/codex/detect.d.ts +14 -0
- package/lib/types/backends/codex/detect.d.ts.map +1 -0
- package/lib/types/backends/codex/detect.js +90 -0
- package/lib/types/backends/codex/index.d.ts +6 -0
- package/lib/types/backends/codex/index.d.ts.map +1 -0
- package/lib/types/backends/codex/index.js +5 -0
- package/lib/types/backends/codex/modes.d.ts +16 -0
- package/lib/types/backends/codex/modes.d.ts.map +1 -0
- package/lib/types/backends/codex/modes.js +49 -0
- package/lib/types/backends/codex/narrow.d.ts +20 -0
- package/lib/types/backends/codex/narrow.d.ts.map +1 -0
- package/lib/types/backends/codex/narrow.js +18 -0
- package/lib/types/backends/codex/prefs.d.ts +42 -0
- package/lib/types/backends/codex/prefs.d.ts.map +1 -0
- package/lib/types/backends/codex/prefs.js +124 -0
- package/lib/types/backends/codex/protocol/index.d.ts +149 -0
- package/lib/types/backends/codex/protocol/index.d.ts.map +1 -0
- package/lib/types/backends/codex/protocol/index.js +130 -0
- package/lib/types/backends/codex/rpc/binary.d.ts +35 -0
- package/lib/types/backends/codex/rpc/binary.d.ts.map +1 -0
- package/lib/types/backends/codex/rpc/binary.js +174 -0
- package/lib/types/backends/codex/rpc/client.d.ts +72 -0
- package/lib/types/backends/codex/rpc/client.d.ts.map +1 -0
- package/lib/types/backends/codex/rpc/client.js +214 -0
- package/lib/types/backends/codex/rpc/hub.d.ts +105 -0
- package/lib/types/backends/codex/rpc/hub.d.ts.map +1 -0
- package/lib/types/backends/codex/rpc/hub.js +532 -0
- package/lib/types/backends/codex/rpc/transport.d.ts +39 -0
- package/lib/types/backends/codex/rpc/transport.d.ts.map +1 -0
- package/lib/types/backends/codex/rpc/transport.js +212 -0
- package/lib/types/backends/codex/session/activity.d.ts +18 -0
- package/lib/types/backends/codex/session/activity.d.ts.map +1 -0
- package/lib/types/backends/codex/session/activity.js +108 -0
- package/lib/types/backends/codex/session/approvals.d.ts +39 -0
- package/lib/types/backends/codex/session/approvals.d.ts.map +1 -0
- package/lib/types/backends/codex/session/approvals.js +477 -0
- package/lib/types/backends/codex/session/commands.d.ts +37 -0
- package/lib/types/backends/codex/session/commands.d.ts.map +1 -0
- package/lib/types/backends/codex/session/commands.js +141 -0
- package/lib/types/backends/codex/session/controls.d.ts +37 -0
- package/lib/types/backends/codex/session/controls.d.ts.map +1 -0
- package/lib/types/backends/codex/session/controls.js +303 -0
- package/lib/types/backends/codex/session/goals.d.ts +25 -0
- package/lib/types/backends/codex/session/goals.d.ts.map +1 -0
- package/lib/types/backends/codex/session/goals.js +97 -0
- package/lib/types/backends/codex/session/history.d.ts +52 -0
- package/lib/types/backends/codex/session/history.d.ts.map +1 -0
- package/lib/types/backends/codex/session/history.js +196 -0
- package/lib/types/backends/codex/session/images.d.ts +17 -0
- package/lib/types/backends/codex/session/images.d.ts.map +1 -0
- package/lib/types/backends/codex/session/images.js +138 -0
- package/lib/types/backends/codex/session/input.d.ts +75 -0
- package/lib/types/backends/codex/session/input.d.ts.map +1 -0
- package/lib/types/backends/codex/session/input.js +294 -0
- package/lib/types/backends/codex/session/plan-review.d.ts +19 -0
- package/lib/types/backends/codex/session/plan-review.d.ts.map +1 -0
- package/lib/types/backends/codex/session/plan-review.js +48 -0
- package/lib/types/backends/codex/session/prompts.d.ts +7 -0
- package/lib/types/backends/codex/session/prompts.d.ts.map +1 -0
- package/lib/types/backends/codex/session/prompts.js +47 -0
- package/lib/types/backends/codex/session/session.d.ts +12 -0
- package/lib/types/backends/codex/session/session.d.ts.map +1 -0
- package/lib/types/backends/codex/session/session.js +871 -0
- package/lib/types/backends/codex/session/side-query.d.ts +25 -0
- package/lib/types/backends/codex/session/side-query.d.ts.map +1 -0
- package/lib/types/backends/codex/session/side-query.js +121 -0
- package/lib/types/backends/codex/session/state.d.ts +57 -0
- package/lib/types/backends/codex/session/state.d.ts.map +1 -0
- package/lib/types/backends/codex/session/state.js +1 -0
- package/lib/types/backends/codex/session/subagents.d.ts +28 -0
- package/lib/types/backends/codex/session/subagents.d.ts.map +1 -0
- package/lib/types/backends/codex/session/subagents.js +286 -0
- package/lib/types/backends/codex/session/tasks.d.ts +25 -0
- package/lib/types/backends/codex/session/tasks.d.ts.map +1 -0
- package/lib/types/backends/codex/session/tasks.js +207 -0
- package/lib/types/backends/codex/session/tool-output.d.ts +9 -0
- package/lib/types/backends/codex/session/tool-output.d.ts.map +1 -0
- package/lib/types/backends/codex/session/tool-output.js +29 -0
- package/lib/types/backends/codex/translate/commands.d.ts +30 -0
- package/lib/types/backends/codex/translate/commands.d.ts.map +1 -0
- package/lib/types/backends/codex/translate/commands.js +103 -0
- package/lib/types/backends/codex/translate/events.d.ts +9 -0
- package/lib/types/backends/codex/translate/events.d.ts.map +1 -0
- package/lib/types/backends/codex/translate/events.js +71 -0
- package/lib/types/backends/codex/translate/items.d.ts +112 -0
- package/lib/types/backends/codex/translate/items.d.ts.map +1 -0
- package/lib/types/backends/codex/translate/items.js +375 -0
- package/lib/types/backends/codex/translate/live.d.ts +39 -0
- package/lib/types/backends/codex/translate/live.d.ts.map +1 -0
- package/lib/types/backends/codex/translate/live.js +315 -0
- package/lib/types/backends/codex/translate/notices.d.ts +27 -0
- package/lib/types/backends/codex/translate/notices.d.ts.map +1 -0
- package/lib/types/backends/codex/translate/notices.js +99 -0
- package/lib/types/backends/codex/translate/presentation.d.ts +49 -0
- package/lib/types/backends/codex/translate/presentation.d.ts.map +1 -0
- package/lib/types/backends/codex/translate/presentation.js +237 -0
- package/lib/types/backends/codex/translate/replay.d.ts +18 -0
- package/lib/types/backends/codex/translate/replay.d.ts.map +1 -0
- package/lib/types/backends/codex/translate/replay.js +33 -0
- package/lib/types/backends/codex/translate/usage.d.ts +29 -0
- package/lib/types/backends/codex/translate/usage.d.ts.map +1 -0
- package/lib/types/backends/codex/translate/usage.js +65 -0
- package/lib/types/backends/shared/atomic-file.d.ts +4 -0
- package/lib/types/backends/shared/atomic-file.d.ts.map +1 -0
- package/lib/types/backends/shared/atomic-file.js +52 -0
- package/lib/types/backends/shared/channel-tokens.d.ts +29 -0
- package/lib/types/backends/shared/channel-tokens.d.ts.map +1 -0
- package/lib/types/backends/shared/channel-tokens.js +161 -0
- package/lib/types/backends/shared/display-path.d.ts +3 -0
- package/lib/types/backends/shared/display-path.d.ts.map +1 -0
- package/lib/types/backends/shared/display-path.js +12 -0
- package/lib/types/branding.d.ts +92 -0
- package/lib/types/branding.d.ts.map +1 -0
- package/lib/types/branding.js +117 -0
- package/lib/types/channel/activity.d.ts +53 -0
- package/lib/types/channel/activity.d.ts.map +1 -0
- package/lib/types/channel/activity.js +955 -0
- package/lib/types/channel/capabilities.d.ts +24 -0
- package/lib/types/channel/capabilities.d.ts.map +1 -0
- package/lib/types/channel/capabilities.js +57 -0
- package/lib/types/channel/channel-slug.d.ts +9 -0
- package/lib/types/channel/channel-slug.d.ts.map +1 -0
- package/lib/types/channel/channel-slug.js +15 -0
- package/lib/types/channel/channel-wizard.d.ts +30 -0
- package/lib/types/channel/channel-wizard.d.ts.map +1 -0
- package/lib/types/channel/channel-wizard.js +226 -0
- package/lib/types/channel/elicitation.d.ts +135 -0
- package/lib/types/channel/elicitation.d.ts.map +1 -0
- package/lib/types/channel/elicitation.js +360 -0
- package/lib/types/channel/goal-command.d.ts +49 -0
- package/lib/types/channel/goal-command.d.ts.map +1 -0
- package/lib/types/channel/goal-command.js +72 -0
- package/lib/types/channel/history-restore.d.ts +16 -0
- package/lib/types/channel/history-restore.d.ts.map +1 -0
- package/lib/types/channel/history-restore.js +214 -0
- package/lib/types/channel/interaction.d.ts +38 -0
- package/lib/types/channel/interaction.d.ts.map +1 -0
- package/lib/types/channel/interaction.js +110 -0
- package/lib/types/channel/job-format.d.ts +6 -0
- package/lib/types/channel/job-format.d.ts.map +1 -0
- package/lib/types/channel/job-format.js +12 -0
- package/lib/types/channel/live-output.d.ts +35 -0
- package/lib/types/channel/live-output.d.ts.map +1 -0
- package/lib/types/channel/live-output.js +74 -0
- package/lib/types/channel/model-capabilities.d.ts +10 -0
- package/lib/types/channel/model-capabilities.d.ts.map +1 -0
- package/lib/types/channel/model-capabilities.js +51 -0
- package/lib/types/channel/permissions.d.ts +155 -0
- package/lib/types/channel/permissions.d.ts.map +1 -0
- package/lib/types/channel/permissions.js +188 -0
- package/lib/types/channel/projection.d.ts +110 -0
- package/lib/types/channel/projection.d.ts.map +1 -0
- package/lib/types/channel/projection.js +1521 -0
- package/lib/types/channel/question-record.d.ts +76 -0
- package/lib/types/channel/question-record.d.ts.map +1 -0
- package/lib/types/channel/question-record.js +109 -0
- package/lib/types/channel/questions.d.ts +204 -0
- package/lib/types/channel/questions.d.ts.map +1 -0
- package/lib/types/channel/questions.js +286 -0
- package/lib/types/channel/sanitize.d.ts +49 -0
- package/lib/types/channel/sanitize.d.ts.map +1 -0
- package/lib/types/channel/sanitize.js +88 -0
- package/lib/types/channel/selection-record.d.ts +18 -0
- package/lib/types/channel/selection-record.d.ts.map +1 -0
- package/lib/types/channel/selection-record.js +45 -0
- package/lib/types/channel/side-prompts.d.ts +59 -0
- package/lib/types/channel/side-prompts.d.ts.map +1 -0
- package/lib/types/channel/side-prompts.js +127 -0
- package/lib/types/channel/transcript.d.ts +17 -0
- package/lib/types/channel/transcript.d.ts.map +1 -0
- package/lib/types/channel/transcript.js +19 -0
- package/lib/types/channel/usage.d.ts +48 -0
- package/lib/types/channel/usage.d.ts.map +1 -0
- package/lib/types/channel/usage.js +143 -0
- package/lib/types/commands.d.ts +147 -0
- package/lib/types/commands.d.ts.map +1 -1
- package/lib/types/commands.js +196 -2
- package/lib/types/components/AgentMessageComposer.d.ts +50 -0
- package/lib/types/components/AgentMessageComposer.d.ts.map +1 -0
- package/lib/types/components/AgentMessageComposer.js +159 -0
- package/lib/types/components/BtwPanel.d.ts +13 -12
- package/lib/types/components/BtwPanel.d.ts.map +1 -1
- package/lib/types/components/BtwPanel.js +35 -24
- package/lib/types/components/ChannelPicker.d.ts +40 -0
- package/lib/types/components/ChannelPicker.d.ts.map +1 -0
- package/lib/types/components/ChannelPicker.js +26 -0
- package/lib/types/components/Chat/JobCard.d.ts +29 -31
- package/lib/types/components/Chat/JobCard.d.ts.map +1 -1
- package/lib/types/components/Chat/JobCard.js +31 -112
- package/lib/types/components/Chat/SubagentMessage.d.ts +4 -1
- package/lib/types/components/Chat/SubagentMessage.d.ts.map +1 -1
- package/lib/types/components/Chat/SubagentMessage.js +10 -3
- package/lib/types/components/ClaudeGirl.d.ts +27 -0
- package/lib/types/components/ClaudeGirl.d.ts.map +1 -0
- package/lib/types/components/ClaudeGirl.js +30 -0
- package/lib/types/components/CodeBlockFrame.d.ts +19 -0
- package/lib/types/components/CodeBlockFrame.d.ts.map +1 -0
- package/lib/types/components/CodeBlockFrame.js +138 -0
- package/lib/types/components/CommandSuggestions.d.ts +10 -1
- package/lib/types/components/CommandSuggestions.d.ts.map +1 -1
- package/lib/types/components/CommandSuggestions.js +20 -3
- package/lib/types/components/ContextBarView.d.ts +2 -2
- package/lib/types/components/ContextBarView.d.ts.map +1 -1
- package/lib/types/components/ContextBarView.js +18 -8
- package/lib/types/components/EffortChargeGlyph.d.ts +1 -1
- package/lib/types/components/EffortChargeGlyph.d.ts.map +1 -1
- package/lib/types/components/EffortChargeGlyph.js +3 -4
- package/lib/types/components/EffortInputBorder.d.ts +1 -2
- package/lib/types/components/EffortInputBorder.d.ts.map +1 -1
- package/lib/types/components/EffortInputBorder.js +7 -4
- package/lib/types/components/EffortSlider.d.ts +5 -1
- package/lib/types/components/EffortSlider.d.ts.map +1 -1
- package/lib/types/components/EffortSlider.js +2 -2
- package/lib/types/components/EffortTierBadge.d.ts +1 -2
- package/lib/types/components/EffortTierBadge.d.ts.map +1 -1
- package/lib/types/components/EffortTierBadge.js +8 -5
- package/lib/types/components/GoalTodoPanel.d.ts +2 -1
- package/lib/types/components/GoalTodoPanel.d.ts.map +1 -1
- package/lib/types/components/GoalTodoPanel.js +11 -5
- package/lib/types/components/InlineMathParagraph.js +1 -1
- package/lib/types/components/JobsPanel.d.ts +8 -9
- package/lib/types/components/JobsPanel.d.ts.map +1 -1
- package/lib/types/components/JobsPanel.js +72 -13
- package/lib/types/components/KernelPicker.d.ts +28 -0
- package/lib/types/components/KernelPicker.d.ts.map +1 -0
- package/lib/types/components/KernelPicker.js +37 -0
- package/lib/types/components/LogoV2.d.ts +7 -1
- package/lib/types/components/LogoV2.d.ts.map +1 -1
- package/lib/types/components/LogoV2.js +120 -24
- package/lib/types/components/Markdown.d.ts +2 -1
- package/lib/types/components/Markdown.d.ts.map +1 -1
- package/lib/types/components/Markdown.js +37 -8
- package/lib/types/components/MathBlock.d.ts.map +1 -1
- package/lib/types/components/MathBlock.js +3 -1
- package/lib/types/components/MermaidDiagram.d.ts.map +1 -1
- package/lib/types/components/MermaidDiagram.js +7 -5
- package/lib/types/components/MessageList.d.ts +21 -3
- package/lib/types/components/MessageList.d.ts.map +1 -1
- package/lib/types/components/MessageList.js +62 -42
- package/lib/types/components/ModePicker.d.ts +20 -0
- package/lib/types/components/ModePicker.d.ts.map +1 -0
- package/lib/types/components/ModePicker.js +17 -0
- package/lib/types/components/PromptInput.d.ts +2 -2
- package/lib/types/components/PromptInput.d.ts.map +1 -1
- package/lib/types/components/PromptInput.js +308 -55
- package/lib/types/components/SdkInstallWizard.d.ts +44 -0
- package/lib/types/components/SdkInstallWizard.d.ts.map +1 -0
- package/lib/types/components/SdkInstallWizard.js +18 -0
- package/lib/types/components/SearchBox.d.ts +7 -8
- package/lib/types/components/SearchBox.d.ts.map +1 -1
- package/lib/types/components/SearchBox.js +18 -9
- package/lib/types/components/SplitDiffView.d.ts.map +1 -1
- package/lib/types/components/SplitDiffView.js +113 -6
- package/lib/types/components/StarPrompt.d.ts.map +1 -1
- package/lib/types/components/StarPrompt.js +5 -3
- package/lib/types/components/StreamingMarkdown.d.ts.map +1 -1
- package/lib/types/components/StreamingMarkdown.js +6 -4
- package/lib/types/components/SubagentCard.d.ts +2 -1
- package/lib/types/components/SubagentCard.d.ts.map +1 -1
- package/lib/types/components/SubagentCard.js +25 -18
- package/lib/types/components/SubagentDashboard.d.ts +10 -6
- package/lib/types/components/SubagentDashboard.d.ts.map +1 -1
- package/lib/types/components/SubagentDashboard.js +32 -21
- package/lib/types/components/SubagentDetailScene.d.ts +16 -1
- package/lib/types/components/SubagentDetailScene.d.ts.map +1 -1
- package/lib/types/components/SubagentDetailScene.js +196 -45
- package/lib/types/components/SyntaxText.d.ts.map +1 -1
- package/lib/types/components/SyntaxText.js +4 -1
- package/lib/types/components/TurnInterruptedRow.d.ts +3 -1
- package/lib/types/components/TurnInterruptedRow.d.ts.map +1 -1
- package/lib/types/components/TurnInterruptedRow.js +6 -3
- package/lib/types/components/TurnUsageRow.d.ts +24 -0
- package/lib/types/components/TurnUsageRow.d.ts.map +1 -0
- package/lib/types/components/TurnUsageRow.js +46 -0
- package/lib/types/components/WorkingSpinner.d.ts +2 -1
- package/lib/types/components/WorkingSpinner.d.ts.map +1 -1
- package/lib/types/components/WorkingSpinner.js +21 -4
- package/lib/types/components/approvals/ApprovalPanel.d.ts +36 -13
- package/lib/types/components/approvals/ApprovalPanel.d.ts.map +1 -1
- package/lib/types/components/approvals/ApprovalPanel.js +173 -25
- package/lib/types/components/claudeGirlSprite.d.ts +18 -0
- package/lib/types/components/claudeGirlSprite.d.ts.map +1 -0
- package/lib/types/components/claudeGirlSprite.js +48 -0
- package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -1
- package/lib/types/components/design-system/ThemeProvider.js +46 -13
- package/lib/types/components/design-system/ThemedText.d.ts +3 -1
- package/lib/types/components/design-system/ThemedText.d.ts.map +1 -1
- package/lib/types/components/design-system/ThemedText.js +2 -2
- package/lib/types/components/diffPatch.d.ts +55 -0
- package/lib/types/components/diffPatch.d.ts.map +1 -0
- package/lib/types/components/diffPatch.js +142 -0
- package/lib/types/components/kernelCatalog.d.ts +48 -0
- package/lib/types/components/kernelCatalog.d.ts.map +1 -0
- package/lib/types/components/kernelCatalog.js +53 -0
- package/lib/types/components/launchpadActions.d.ts +13 -6
- package/lib/types/components/launchpadActions.d.ts.map +1 -1
- package/lib/types/components/launchpadActions.js +26 -4
- package/lib/types/components/launchpadParams.d.ts +101 -0
- package/lib/types/components/launchpadParams.d.ts.map +1 -0
- package/lib/types/components/launchpadParams.js +171 -0
- package/lib/types/components/maidPortrait.d.ts +37 -5
- package/lib/types/components/maidPortrait.d.ts.map +1 -1
- package/lib/types/components/maidPortrait.js +73 -54
- package/lib/types/components/messages/AgentMessageFlow.d.ts +20 -0
- package/lib/types/components/messages/AgentMessageFlow.d.ts.map +1 -0
- package/lib/types/components/messages/AgentMessageFlow.js +37 -0
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts +6 -1
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantThinkingMessage.js +29 -5
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts +11 -2
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantToolUseMessage.js +289 -36
- package/lib/types/components/messages/TranscriptLeaves.d.ts +85 -0
- package/lib/types/components/messages/TranscriptLeaves.d.ts.map +1 -0
- package/lib/types/components/messages/TranscriptLeaves.js +74 -0
- package/lib/types/components/messages/agentTeam.d.ts +69 -0
- package/lib/types/components/messages/agentTeam.d.ts.map +1 -0
- package/lib/types/components/messages/agentTeam.js +53 -0
- package/lib/types/components/messages/liveOutputLines.d.ts +33 -0
- package/lib/types/components/messages/liveOutputLines.d.ts.map +1 -0
- package/lib/types/components/messages/liveOutputLines.js +100 -0
- package/lib/types/components/messages/subagentTranscript.d.ts +146 -0
- package/lib/types/components/messages/subagentTranscript.d.ts.map +1 -0
- package/lib/types/components/messages/subagentTranscript.js +304 -0
- package/lib/types/components/questions/AskUserQuestionPanel.d.ts +16 -1
- package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -1
- package/lib/types/components/questions/AskUserQuestionPanel.js +76 -6
- package/lib/types/components/questions/PlanReviewPanel.d.ts +8 -3
- package/lib/types/components/questions/PlanReviewPanel.d.ts.map +1 -1
- package/lib/types/components/questions/PlanReviewPanel.js +11 -6
- package/lib/types/components/questions/ProviderModelEditor.d.ts +12 -0
- package/lib/types/components/questions/ProviderModelEditor.d.ts.map +1 -0
- package/lib/types/components/questions/ProviderModelEditor.js +266 -0
- package/lib/types/components/shimmer.d.ts +26 -0
- package/lib/types/components/shimmer.d.ts.map +1 -1
- package/lib/types/components/shimmer.js +26 -0
- package/lib/types/components/sidePanel/InfoPanel.d.ts.map +1 -1
- package/lib/types/components/sidePanel/InfoPanel.js +13 -8
- package/lib/types/components/sidePanel/PanelBar.d.ts +0 -24
- package/lib/types/components/sidePanel/PanelBar.d.ts.map +1 -1
- package/lib/types/components/sidePanel/PanelBar.js +55 -77
- package/lib/types/components/sidePanel/PanelStore.d.ts +3 -1
- package/lib/types/components/sidePanel/PanelStore.d.ts.map +1 -1
- package/lib/types/components/sidePanel/PanelStore.js +8 -4
- package/lib/types/components/sidePanel/SidePanelColumn.d.ts +3 -10
- package/lib/types/components/sidePanel/SidePanelColumn.d.ts.map +1 -1
- package/lib/types/components/sidePanel/SidePanelColumn.js +9 -12
- package/lib/types/components/sidePanel/TrajectoryPanel.d.ts.map +1 -1
- package/lib/types/components/sidePanel/TrajectoryPanel.js +78 -14
- package/lib/types/components/sidePanel/agentViewStore.d.ts +20 -0
- package/lib/types/components/sidePanel/agentViewStore.d.ts.map +1 -0
- package/lib/types/components/sidePanel/agentViewStore.js +26 -0
- package/lib/types/components/sidePanel/btw/BtwComposer.d.ts +50 -0
- package/lib/types/components/sidePanel/btw/BtwComposer.d.ts.map +1 -0
- package/lib/types/components/sidePanel/btw/BtwComposer.js +45 -0
- package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts +13 -0
- package/lib/types/components/sidePanel/btw/BtwPanelAdapter.d.ts.map +1 -0
- package/lib/types/components/sidePanel/btw/BtwPanelAdapter.js +147 -0
- package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts +14 -0
- package/lib/types/components/sidePanel/btw/BtwThreadScene.d.ts.map +1 -0
- package/lib/types/components/sidePanel/btw/BtwThreadScene.js +131 -0
- package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts +30 -0
- package/lib/types/components/sidePanel/btw/BtwThreadView.d.ts.map +1 -0
- package/lib/types/components/sidePanel/btw/BtwThreadView.js +87 -0
- package/lib/types/components/sidePanel/btw/threads.d.ts +111 -0
- package/lib/types/components/sidePanel/btw/threads.d.ts.map +1 -0
- package/lib/types/components/sidePanel/btw/threads.js +302 -0
- package/lib/types/components/sidePanel/builtinPanels.d.ts.map +1 -1
- package/lib/types/components/sidePanel/builtinPanels.js +70 -30
- package/lib/types/components/sidePanel/companion/CompanionPanel.d.ts +4 -46
- package/lib/types/components/sidePanel/companion/CompanionPanel.d.ts.map +1 -1
- package/lib/types/components/sidePanel/companion/CompanionPanel.js +19 -55
- package/lib/types/components/sidePanel/companion/mood.d.ts +32 -0
- package/lib/types/components/sidePanel/companion/mood.d.ts.map +1 -1
- package/lib/types/components/sidePanel/companion/mood.js +44 -0
- package/lib/types/components/sidePanel/companion/skins.d.ts +34 -0
- package/lib/types/components/sidePanel/companion/skins.d.ts.map +1 -1
- package/lib/types/components/sidePanel/companion/skins.js +203 -29
- package/lib/types/components/splashFonts.d.ts +17 -9
- package/lib/types/components/splashFonts.d.ts.map +1 -1
- package/lib/types/components/splashFonts.js +119 -15
- package/lib/types/components/splashLayout.d.ts.map +1 -1
- package/lib/types/components/splashLayout.js +3 -1
- package/lib/types/components/subagentDetailMemory.d.ts +17 -0
- package/lib/types/components/subagentDetailMemory.d.ts.map +1 -0
- package/lib/types/components/subagentDetailMemory.js +28 -0
- package/lib/types/components/trajectory/Inspector.d.ts.map +1 -1
- package/lib/types/components/trajectory/Inspector.js +9 -0
- package/lib/types/components/trajectory/Ledger.d.ts.map +1 -1
- package/lib/types/components/trajectory/Ledger.js +7 -1
- package/lib/types/components/trajectory/scope.d.ts +64 -0
- package/lib/types/components/trajectory/scope.d.ts.map +1 -0
- package/lib/types/components/trajectory/scope.js +88 -0
- package/lib/types/components/trajectory/useTrajectoryScope.d.ts +42 -0
- package/lib/types/components/trajectory/useTrajectoryScope.d.ts.map +1 -0
- package/lib/types/components/trajectory/useTrajectoryScope.js +86 -0
- package/lib/types/customTheme.d.ts +4 -6
- package/lib/types/customTheme.d.ts.map +1 -1
- package/lib/types/customTheme.js +6 -8
- package/lib/types/dsh-adapter/approvals.d.ts +18 -5
- package/lib/types/dsh-adapter/approvals.d.ts.map +1 -1
- package/lib/types/dsh-adapter/approvals.js +17 -4
- package/lib/types/dsh-adapter/backend/session.d.ts +64 -0
- package/lib/types/dsh-adapter/backend/session.d.ts.map +1 -0
- package/lib/types/dsh-adapter/backend/session.js +291 -0
- package/lib/types/dsh-adapter/backend/translate.d.ts +58 -0
- package/lib/types/dsh-adapter/backend/translate.d.ts.map +1 -0
- package/lib/types/dsh-adapter/backend/translate.js +467 -0
- package/lib/types/dsh-adapter/backends.d.ts +49 -0
- package/lib/types/dsh-adapter/backends.d.ts.map +1 -0
- package/lib/types/dsh-adapter/backends.js +124 -0
- package/lib/types/dsh-adapter/channel/action-readiness.d.ts +16 -0
- package/lib/types/dsh-adapter/channel/action-readiness.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/action-readiness.js +109 -0
- package/lib/types/dsh-adapter/channel/agent-view-projection.d.ts +2 -2
- package/lib/types/dsh-adapter/channel/agent-view-projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/background-action.d.ts +2 -2
- package/lib/types/dsh-adapter/channel/background-action.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/background-action.js +7 -5
- package/lib/types/dsh-adapter/channel/binding-events.d.ts +19 -9
- package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/binding-events.js +58 -135
- package/lib/types/dsh-adapter/channel/binding.d.ts +61 -14
- package/lib/types/dsh-adapter/channel/binding.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/binding.js +102 -35
- package/lib/types/dsh-adapter/channel/command-completions.d.ts +3 -0
- package/lib/types/dsh-adapter/channel/command-completions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/command-completions.js +33 -4
- package/lib/types/dsh-adapter/channel/compaction.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/compaction.js +3 -2
- package/lib/types/dsh-adapter/channel/composer-images.d.ts +5 -0
- package/lib/types/dsh-adapter/channel/composer-images.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/composer-images.js +4 -3
- package/lib/types/dsh-adapter/channel/core/actions.d.ts +39 -0
- package/lib/types/dsh-adapter/channel/core/actions.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/actions.js +152 -0
- package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts +145 -0
- package/lib/types/dsh-adapter/channel/core/binding-feed.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/binding-feed.js +289 -0
- package/lib/types/dsh-adapter/channel/core/compose.d.ts +217 -0
- package/lib/types/dsh-adapter/channel/core/compose.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/compose.js +938 -0
- package/lib/types/dsh-adapter/channel/core/files.d.ts +57 -0
- package/lib/types/dsh-adapter/channel/core/files.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/files.js +45 -0
- package/lib/types/dsh-adapter/channel/core/host.d.ts +55 -0
- package/lib/types/dsh-adapter/channel/core/host.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/host.js +116 -0
- package/lib/types/dsh-adapter/channel/core/local-actions.d.ts +46 -0
- package/lib/types/dsh-adapter/channel/core/local-actions.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/local-actions.js +117 -0
- package/lib/types/dsh-adapter/channel/core/local-images.d.ts +20 -0
- package/lib/types/dsh-adapter/channel/core/local-images.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/local-images.js +147 -0
- package/lib/types/dsh-adapter/channel/core/reports.d.ts +12 -0
- package/lib/types/dsh-adapter/channel/core/reports.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/reports.js +77 -0
- package/lib/types/dsh-adapter/channel/core/session-controls.d.ts +39 -0
- package/lib/types/dsh-adapter/channel/core/session-controls.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/session-controls.js +219 -0
- package/lib/types/dsh-adapter/channel/core/session-switch.d.ts +174 -0
- package/lib/types/dsh-adapter/channel/core/session-switch.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/session-switch.js +390 -0
- package/lib/types/dsh-adapter/channel/core/sessions.d.ts +40 -0
- package/lib/types/dsh-adapter/channel/core/sessions.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/core/sessions.js +268 -0
- package/lib/types/dsh-adapter/channel/decisions.d.ts +4 -3
- package/lib/types/dsh-adapter/channel/decisions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/decisions.js +4 -4
- package/lib/types/dsh-adapter/channel/emitter.d.ts +15 -2
- package/lib/types/dsh-adapter/channel/emitter.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/emitter.js +5 -3
- package/lib/types/dsh-adapter/channel/extensions.d.ts +36 -0
- package/lib/types/dsh-adapter/channel/extensions.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/extensions.js +714 -0
- package/lib/types/dsh-adapter/channel/ide-selection.d.ts +1 -10
- package/lib/types/dsh-adapter/channel/ide-selection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/ide-selection.js +4 -46
- package/lib/types/dsh-adapter/channel/input-actions.d.ts +27 -4
- package/lib/types/dsh-adapter/channel/input-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/input-actions.js +240 -21
- package/lib/types/dsh-adapter/channel/input-delivery.d.ts +21 -5
- package/lib/types/dsh-adapter/channel/input-delivery.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/input-delivery.js +65 -27
- package/lib/types/dsh-adapter/channel/local-actions.d.ts +10 -32
- package/lib/types/dsh-adapter/channel/local-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/local-actions.js +10 -78
- package/lib/types/dsh-adapter/channel/local-fs.d.ts +3 -0
- package/lib/types/dsh-adapter/channel/local-fs.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/local-fs.js +46 -0
- package/lib/types/dsh-adapter/channel/mode-actions.d.ts +3 -3
- package/lib/types/dsh-adapter/channel/mode-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts +2 -2
- package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/model-actions.d.ts +3 -3
- package/lib/types/dsh-adapter/channel/model-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/model-actions.js +38 -5
- package/lib/types/dsh-adapter/channel/model-switch.d.ts +2 -2
- package/lib/types/dsh-adapter/channel/model-switch.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/model-switch.js +9 -6
- package/lib/types/dsh-adapter/channel/preferences.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/preferences.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/preferences.js +16 -0
- package/lib/types/dsh-adapter/channel/projection.d.ts +16 -13
- package/lib/types/dsh-adapter/channel/projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/projection.js +38 -1143
- package/lib/types/dsh-adapter/channel/question-record.d.ts +3 -75
- package/lib/types/dsh-adapter/channel/question-record.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/question-record.js +3 -107
- package/lib/types/dsh-adapter/channel/session-activity.d.ts +9 -0
- package/lib/types/dsh-adapter/channel/session-activity.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/session-activity.js +42 -0
- package/lib/types/dsh-adapter/channel/session-adoption.d.ts +4 -4
- package/lib/types/dsh-adapter/channel/session-adoption.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-adoption.js +3 -1
- package/lib/types/dsh-adapter/channel/session-fork.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/session-fork.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-fork.js +2 -1
- package/lib/types/dsh-adapter/channel/session-live-adoption.d.ts +7 -3
- package/lib/types/dsh-adapter/channel/session-live-adoption.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-live-adoption.js +1 -1
- package/lib/types/dsh-adapter/channel/session-metadata.d.ts +2 -9
- package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-reset.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/session-reset.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-reset.js +4 -0
- package/lib/types/dsh-adapter/channel/session-resume.d.ts +5 -10
- package/lib/types/dsh-adapter/channel/session-resume.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-resume.js +74 -113
- package/lib/types/dsh-adapter/channel/session-rewind.d.ts +4 -4
- package/lib/types/dsh-adapter/channel/session-rewind.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-rewind.js +7 -6
- package/lib/types/dsh-adapter/channel/session-tree-actions.d.ts +4 -4
- package/lib/types/dsh-adapter/channel/session-tree-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-tree-actions.js +8 -7
- package/lib/types/dsh-adapter/channel/settings-host.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/settings-host.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/settings-host.js +8 -0
- package/lib/types/dsh-adapter/channel/skill-catalog.d.ts +5 -1
- package/lib/types/dsh-adapter/channel/skill-catalog.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/skill-catalog.js +2 -2
- package/lib/types/dsh-adapter/channel/state.d.ts +72 -1
- package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/state.js +7 -3
- package/lib/types/dsh-adapter/channel/subagent-projection.d.ts +58 -3
- package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/subagent-projection.js +153 -9
- package/lib/types/dsh-adapter/channel/subagent-transcript.d.ts +114 -0
- package/lib/types/dsh-adapter/channel/subagent-transcript.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/subagent-transcript.js +279 -0
- package/lib/types/dsh-adapter/channel/transcript.d.ts +7 -15
- package/lib/types/dsh-adapter/channel/transcript.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/transcript.js +17 -21
- package/lib/types/dsh-adapter/channel/types.d.ts +16 -7
- package/lib/types/dsh-adapter/channel/types.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/usage.d.ts +3 -23
- package/lib/types/dsh-adapter/channel/usage.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/usage.js +5 -111
- package/lib/types/dsh-adapter/channel/workspace-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/workspace-actions.js +2 -1
- package/lib/types/dsh-adapter/channel.d.ts +17 -8
- package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.js +24 -1059
- package/lib/types/dsh-adapter/context-occupancy.d.ts +6 -1
- package/lib/types/dsh-adapter/context-occupancy.d.ts.map +1 -1
- package/lib/types/dsh-adapter/context-occupancy.js +6 -1
- package/lib/types/dsh-adapter/decision-guard.d.ts +24 -0
- package/lib/types/dsh-adapter/decision-guard.d.ts.map +1 -1
- package/lib/types/dsh-adapter/decision-guard.js +44 -0
- package/lib/types/dsh-adapter/extension-events.d.ts +4 -1
- package/lib/types/dsh-adapter/extension-events.d.ts.map +1 -1
- package/lib/types/dsh-adapter/extension-events.js +22 -10
- package/lib/types/dsh-adapter/index.d.ts +41 -3
- package/lib/types/dsh-adapter/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/index.js +28 -1
- package/lib/types/dsh-adapter/jobs.d.ts +5 -3
- package/lib/types/dsh-adapter/jobs.d.ts.map +1 -1
- package/lib/types/dsh-adapter/jobs.js +53 -14
- package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts +1 -16
- package/lib/types/dsh-adapter/migrate/parse/jsonl.d.ts.map +1 -1
- package/lib/types/dsh-adapter/migrate/parse/jsonl.js +3 -29
- package/lib/types/dsh-adapter/oauth-credential-source.d.ts +34 -0
- package/lib/types/dsh-adapter/oauth-credential-source.d.ts.map +1 -0
- package/lib/types/dsh-adapter/oauth-credential-source.js +66 -0
- package/lib/types/dsh-adapter/plugin.d.ts +38 -2
- package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin.js +546 -110
- package/lib/types/dsh-adapter/provider-model-capabilities.d.ts +10 -0
- package/lib/types/dsh-adapter/provider-model-capabilities.d.ts.map +1 -0
- package/lib/types/dsh-adapter/provider-model-capabilities.js +80 -0
- package/lib/types/dsh-adapter/providerWizard.d.ts +8 -2
- package/lib/types/dsh-adapter/providerWizard.d.ts.map +1 -1
- package/lib/types/dsh-adapter/providerWizard.js +118 -52
- package/lib/types/dsh-adapter/questions.d.ts +29 -124
- package/lib/types/dsh-adapter/questions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/questions.js +33 -267
- package/lib/types/dsh-adapter/recap.d.ts +3 -15
- package/lib/types/dsh-adapter/recap.d.ts.map +1 -1
- package/lib/types/dsh-adapter/recap.js +3 -46
- package/lib/types/dsh-adapter/sanitize.d.ts +4 -44
- package/lib/types/dsh-adapter/sanitize.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sanitize.js +4 -84
- package/lib/types/dsh-adapter/session-mount-heartbeat.d.ts +3 -1
- package/lib/types/dsh-adapter/session-mount-heartbeat.d.ts.map +1 -1
- package/lib/types/dsh-adapter/session-mount-heartbeat.js +4 -2
- package/lib/types/dsh-adapter/sessions/digest.d.ts +18 -3
- package/lib/types/dsh-adapter/sessions/digest.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/digest.js +60 -27
- package/lib/types/dsh-adapter/sessions/list.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/list.js +6 -4
- package/lib/types/dsh-adapter/sessions/recovery.d.ts +2 -2
- package/lib/types/dsh-adapter/sessions/recovery.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/recovery.js +23 -14
- package/lib/types/dsh-adapter/sessions/store.d.ts +2 -0
- package/lib/types/dsh-adapter/sessions/store.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/store.js +1 -0
- package/lib/types/dsh-adapter/sessions/types.d.ts +2 -0
- package/lib/types/dsh-adapter/sessions/types.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sideQuestion.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sideQuestion.js +3 -13
- package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
- package/lib/types/dsh-adapter/subagents.js +7 -0
- package/lib/types/dsh-adapter/themes.d.ts +1 -1
- package/lib/types/dsh-adapter/themes.d.ts.map +1 -1
- package/lib/types/dsh-adapter/trajectory/agent-source.d.ts +84 -0
- package/lib/types/dsh-adapter/trajectory/agent-source.d.ts.map +1 -0
- package/lib/types/dsh-adapter/trajectory/agent-source.js +601 -0
- package/lib/types/dsh-adapter/trajectory/guards.d.ts +31 -1
- package/lib/types/dsh-adapter/trajectory/guards.d.ts.map +1 -1
- package/lib/types/dsh-adapter/trajectory/guards.js +28 -0
- package/lib/types/dsh-adapter/trajectory/index.d.ts +3 -1
- package/lib/types/dsh-adapter/trajectory/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/trajectory/index.js +1 -0
- package/lib/types/dsh-adapter/trajectory/inspect.d.ts +7 -0
- package/lib/types/dsh-adapter/trajectory/inspect.d.ts.map +1 -1
- package/lib/types/dsh-adapter/trajectory/inspect.js +70 -2
- package/lib/types/dsh-adapter/trajectory/projection.d.ts +4 -0
- package/lib/types/dsh-adapter/trajectory/projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/trajectory/projection.js +36 -0
- package/lib/types/dsh-adapter/trajectory/types.d.ts +13 -0
- package/lib/types/dsh-adapter/trajectory/types.d.ts.map +1 -1
- package/lib/types/effortPrefs.d.ts +7 -0
- package/lib/types/effortPrefs.d.ts.map +1 -1
- package/lib/types/effortPrefs.js +11 -2
- package/lib/types/handoffAck.d.ts +57 -0
- package/lib/types/handoffAck.d.ts.map +1 -0
- package/lib/types/handoffAck.js +154 -0
- package/lib/types/handoffEvents.d.ts +52 -0
- package/lib/types/handoffEvents.d.ts.map +1 -0
- package/lib/types/handoffEvents.js +128 -0
- package/lib/types/i18n.d.ts +3189 -68
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +855 -9
- package/lib/types/ink/colorize.d.ts.map +1 -1
- package/lib/types/ink/colorize.js +8 -2
- package/lib/types/ink/components/AlternateScreen.d.ts +12 -1
- package/lib/types/ink/components/AlternateScreen.d.ts.map +1 -1
- package/lib/types/ink/components/AlternateScreen.js +25 -4
- package/lib/types/ink/components/App.d.ts +5 -1
- package/lib/types/ink/components/App.d.ts.map +1 -1
- package/lib/types/ink/components/App.js +52 -5
- package/lib/types/ink/components/Image.d.ts +8 -1
- package/lib/types/ink/components/Image.d.ts.map +1 -1
- package/lib/types/ink/components/Image.js +2 -2
- package/lib/types/ink/components/Text.d.ts +8 -1
- package/lib/types/ink/components/Text.d.ts.map +1 -1
- package/lib/types/ink/components/Text.js +11 -1
- package/lib/types/ink/dom.d.ts.map +1 -1
- package/lib/types/ink/dom.js +75 -3
- package/lib/types/ink/hooks/use-input.d.ts.map +1 -1
- package/lib/types/ink/hooks/use-input.js +9 -4
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +8 -2
- package/lib/types/ink/kitty-graphics.d.ts +7 -2
- package/lib/types/ink/kitty-graphics.d.ts.map +1 -1
- package/lib/types/ink/kitty-graphics.js +15 -7
- package/lib/types/ink/node-cache.d.ts +15 -1
- package/lib/types/ink/node-cache.d.ts.map +1 -1
- package/lib/types/ink/node-cache.js +4 -1
- package/lib/types/ink/output.d.ts.map +1 -1
- package/lib/types/ink/output.js +2 -0
- package/lib/types/ink/parse-keypress.d.ts +13 -0
- package/lib/types/ink/parse-keypress.d.ts.map +1 -1
- package/lib/types/ink/parse-keypress.js +438 -19
- package/lib/types/ink/reconciler.d.ts.map +1 -1
- package/lib/types/ink/reconciler.js +9 -0
- package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
- package/lib/types/ink/render-node-to-output.js +200 -4
- package/lib/types/ink/render-stats.d.ts +35 -0
- package/lib/types/ink/render-stats.d.ts.map +1 -0
- package/lib/types/ink/render-stats.js +53 -0
- package/lib/types/ink/sixel-codec.d.ts +11 -1
- package/lib/types/ink/sixel-codec.d.ts.map +1 -1
- package/lib/types/ink/sixel-codec.js +10 -3
- package/lib/types/ink/sixel-graphics.js +2 -2
- package/lib/types/ink/styles.d.ts +46 -0
- package/lib/types/ink/styles.d.ts.map +1 -1
- package/lib/types/ink/terminal-image.d.ts +7 -0
- package/lib/types/ink/terminal-image.d.ts.map +1 -1
- package/lib/types/ink/terminal-querier.d.ts +1 -1
- package/lib/types/ink/terminal-querier.js +4 -4
- package/lib/types/ink/text-decoration.d.ts +49 -0
- package/lib/types/ink/text-decoration.d.ts.map +1 -0
- package/lib/types/ink/text-decoration.js +235 -0
- package/lib/types/ink/update-overflow-guard.d.ts +9 -0
- package/lib/types/ink/update-overflow-guard.d.ts.map +1 -1
- package/lib/types/ink/update-overflow-guard.js +41 -0
- package/lib/types/ink/wrap-text.d.ts.map +1 -1
- package/lib/types/ink/wrap-text.js +5 -1
- package/lib/types/kernelPrefs.d.ts +51 -0
- package/lib/types/kernelPrefs.d.ts.map +1 -0
- package/lib/types/kernelPrefs.js +126 -0
- package/lib/types/modelRecents.d.ts +10 -2
- package/lib/types/modelRecents.d.ts.map +1 -1
- package/lib/types/modelRecents.js +20 -7
- package/lib/types/screens/AgentTranscriptScene.d.ts +42 -0
- package/lib/types/screens/AgentTranscriptScene.d.ts.map +1 -0
- package/lib/types/screens/AgentTranscriptScene.js +269 -0
- package/lib/types/screens/Chat.d.ts +45 -7
- package/lib/types/screens/Chat.d.ts.map +1 -1
- package/lib/types/screens/Chat.js +625 -113
- package/lib/types/screens/Launchpad.d.ts +24 -7
- package/lib/types/screens/Launchpad.d.ts.map +1 -1
- package/lib/types/screens/Launchpad.js +147 -28
- package/lib/types/screens/SessionSupervisor.d.ts +3 -3
- package/lib/types/screens/SessionSupervisor.d.ts.map +1 -1
- package/lib/types/screens/SessionSupervisor.js +69 -5
- package/lib/types/screens/Settings.d.ts.map +1 -1
- package/lib/types/screens/Settings.js +211 -7
- package/lib/types/screens/StatusLine.d.ts +40 -1
- package/lib/types/screens/StatusLine.d.ts.map +1 -1
- package/lib/types/screens/StatusLine.js +131 -19
- package/lib/types/screens/StatusMetrics.d.ts +53 -17
- package/lib/types/screens/StatusMetrics.d.ts.map +1 -1
- package/lib/types/screens/StatusMetrics.js +141 -30
- package/lib/types/screens/TrajectoryScene.d.ts.map +1 -1
- package/lib/types/screens/TrajectoryScene.js +74 -12
- package/lib/types/screens/chat/backendCommands.d.ts +37 -0
- package/lib/types/screens/chat/backendCommands.d.ts.map +1 -0
- package/lib/types/screens/chat/backendCommands.js +51 -0
- package/lib/types/screens/chat/useBackendChannels.d.ts +20 -0
- package/lib/types/screens/chat/useBackendChannels.d.ts.map +1 -0
- package/lib/types/screens/chat/useBackendChannels.js +117 -0
- package/lib/types/screens/chat/useKernelPicker.d.ts +23 -0
- package/lib/types/screens/chat/useKernelPicker.d.ts.map +1 -0
- package/lib/types/screens/chat/useKernelPicker.js +72 -0
- package/lib/types/screens/chatOverlay.d.ts +32 -2
- package/lib/types/screens/chatOverlay.d.ts.map +1 -1
- package/lib/types/screens/chatOverlay.js +9 -0
- package/lib/types/screens/sessionSupervisor/useForeignSessions.d.ts.map +1 -1
- package/lib/types/screens/sessionSupervisor/useForeignSessions.js +5 -1
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts +14 -0
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts.map +1 -1
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.js +97 -22
- package/lib/types/sessionHistory.d.ts +18 -1
- package/lib/types/sessionHistory.d.ts.map +1 -1
- package/lib/types/sessionHistory.js +46 -4
- package/lib/types/sessionPins.d.ts +7 -0
- package/lib/types/sessionPins.d.ts.map +1 -1
- package/lib/types/sessionPins.js +9 -0
- package/lib/types/sessions/resumeFailure.d.ts.map +1 -1
- package/lib/types/sessions/resumeFailure.js +2 -1
- package/lib/types/settings/definitions.d.ts +74 -0
- package/lib/types/settings/definitions.d.ts.map +1 -1
- package/lib/types/settings/definitions.js +50 -4
- package/lib/types/terminal-utils/hyperlink.d.ts +2 -2
- package/lib/types/terminal-utils/hyperlink.d.ts.map +1 -1
- package/lib/types/terminal-utils/hyperlink.js +21 -4
- package/lib/types/terminal-utils/markdown.d.ts +34 -6
- package/lib/types/terminal-utils/markdown.d.ts.map +1 -1
- package/lib/types/terminal-utils/markdown.js +257 -66
- package/lib/types/theme.d.ts +49 -8
- package/lib/types/theme.d.ts.map +1 -1
- package/lib/types/theme.js +514 -18
- package/lib/types/tips.js +2 -2
- package/lib/types/trajectory/effortIgnition.d.ts +25 -7
- package/lib/types/trajectory/effortIgnition.d.ts.map +1 -1
- package/lib/types/trajectory/effortIgnition.js +106 -34
- package/lib/types/trajectory/window.d.ts +26 -0
- package/lib/types/trajectory/window.d.ts.map +1 -0
- package/lib/types/trajectory/window.js +27 -0
- package/lib/types/tuiDisplayPrefs.d.ts +38 -1
- package/lib/types/tuiDisplayPrefs.d.ts.map +1 -1
- package/lib/types/tuiDisplayPrefs.js +45 -1
- package/lib/types/update.d.ts +88 -3
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +285 -18
- package/lib/types/utils/crashDetail.d.ts +56 -0
- package/lib/types/utils/crashDetail.d.ts.map +1 -0
- package/lib/types/utils/crashDetail.js +175 -0
- package/lib/types/utils/imageResize.d.ts +9 -23
- package/lib/types/utils/imageResize.d.ts.map +1 -1
- package/lib/types/utils/imageResize.js +24 -20
- package/lib/types/utils/inputPaste.d.ts +9 -8
- package/lib/types/utils/inputPaste.d.ts.map +1 -1
- package/lib/types/utils/inputPaste.js +53 -16
- package/lib/types/utils/jsonl.d.ts +24 -0
- package/lib/types/utils/jsonl.d.ts.map +1 -0
- package/lib/types/utils/jsonl.js +36 -0
- package/package.json +18 -2
|
@@ -1,1146 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { isCompactionCheckpointSource, toolResultPayload } from '../compat/messages.js';
|
|
7
|
-
import { addUsageToCostBuckets, emptyCostBuckets, isPeakHour } from '../../deepseekPricing.js';
|
|
8
|
-
import { t } from '../../i18n.js';
|
|
9
|
-
import { logForDebugging } from '../../utils/debug.js';
|
|
10
|
-
import { cleanRenderText } from '../sanitize.js';
|
|
11
|
-
import { NOTICE_CELLS } from './decisions.js';
|
|
12
|
-
import { markChannelReadDirty } from '../../adapter/channel/read-view.js';
|
|
13
|
-
import { buildQuestionRecord, parseQuestionRecordAnswers, parseQuestionRecordQuestions, } from './question-record.js';
|
|
14
|
-
/** One authoritative reducer for both durable replay and live session events. */
|
|
1
|
+
import { createChannelProjection as createSharedProjection } from '../../channel/projection.js';
|
|
2
|
+
import { createDshTranslator, dshPricingWindow } from '../backend/translate.js';
|
|
3
|
+
const LIVE = { replay: false };
|
|
4
|
+
const REPLAY = { replay: true };
|
|
5
|
+
/** One reducer for both durable replay and live session events. */
|
|
15
6
|
export function createChannelProjection(state, deps) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
*/
|
|
50
|
-
const handledAssistantMessages = new Set();
|
|
51
|
-
const handledAssistantChunks = new Set();
|
|
52
|
-
/** One Agent runs one request at a time. Durable step boundaries also let
|
|
53
|
-
* a freshly attached projector accept chunks whose start it missed. */
|
|
54
|
-
let openStep;
|
|
55
|
-
let activeAttempt;
|
|
56
|
-
let lastStreamRevision = -1;
|
|
57
|
-
/** 最近一次 request/header 的模型:durable usage 的模型归属真源。replay
|
|
58
|
-
* 会按历史请求逐个还原,因此 /model 切换(reset + replay 整个 seed)
|
|
59
|
-
* 不会把换模型前的用量重估到新模型;旧日志没有 header 时回退
|
|
60
|
-
* 事件发生时的 state.model(AC-A4)。 */
|
|
61
|
-
let eventModel;
|
|
62
|
-
const assistantRowsByStep = new Map();
|
|
63
|
-
const lastTextDelta = new Map();
|
|
64
|
-
const stepKey = (turn, step) => `${turn}:${step}`;
|
|
65
|
-
const touchRow = (row) => { markChannelReadDirty(row); markChannelReadDirty(state.rows); };
|
|
66
|
-
const appendRow = (row) => { state.rows.push(row); markChannelReadDirty(state.rows); };
|
|
67
|
-
const removeRow = (row) => {
|
|
68
|
-
const index = state.rows.indexOf(row);
|
|
69
|
-
if (index !== -1) {
|
|
70
|
-
state.rows.splice(index, 1);
|
|
71
|
-
markChannelReadDirty(state.rows);
|
|
72
|
-
}
|
|
73
|
-
if (streaming === row)
|
|
74
|
-
streaming = undefined;
|
|
75
|
-
if (reasoning === row)
|
|
76
|
-
reasoning = undefined;
|
|
77
|
-
if (lastReasoningRow?.row === row)
|
|
78
|
-
lastReasoningRow = undefined;
|
|
79
|
-
const sealedIndex = sealedReasoning.indexOf(row);
|
|
80
|
-
if (sealedIndex !== -1)
|
|
81
|
-
sealedReasoning.splice(sealedIndex, 1);
|
|
82
|
-
lastTextDelta.delete(row);
|
|
7
|
+
const translator = createDshTranslator({
|
|
8
|
+
tools: () => deps.tools,
|
|
9
|
+
scope: () => deps.agent(),
|
|
10
|
+
attachments: () => deps.attachments(),
|
|
11
|
+
});
|
|
12
|
+
const projector = createSharedProjection(state, {
|
|
13
|
+
rowIds: deps.rowIds,
|
|
14
|
+
resetContextWarning: () => deps.resetContextWarning(),
|
|
15
|
+
checkContextWarning: () => deps.checkContextWarning(),
|
|
16
|
+
notify: (...args) => deps.notify(...args),
|
|
17
|
+
jobs: deps.jobs,
|
|
18
|
+
inputConvergence: deps.inputConvergence,
|
|
19
|
+
renderer: deps.renderer,
|
|
20
|
+
selectionAttached: messageId => deps.selectionAttached(messageId),
|
|
21
|
+
pricingWindow: dshPricingWindow,
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
/** Forget every per-session ledger on both halves. */
|
|
25
|
+
reset() {
|
|
26
|
+
translator.reset();
|
|
27
|
+
projector.reset();
|
|
28
|
+
},
|
|
29
|
+
replayEvents(events) {
|
|
30
|
+
projector.apply(translator.translateReplay(events), REPLAY);
|
|
31
|
+
},
|
|
32
|
+
renderEvent(event) {
|
|
33
|
+
projector.apply(translator.translateEvent(event), LIVE);
|
|
34
|
+
},
|
|
35
|
+
renderStreamFrame(frame) {
|
|
36
|
+
projector.apply(translator.translateFrame(frame), LIVE);
|
|
37
|
+
},
|
|
38
|
+
settleStreaming: projector.settleStreaming,
|
|
39
|
+
updateSpinnerMode: projector.updateSpinnerMode,
|
|
83
40
|
};
|
|
84
|
-
const discardAttempt = (turn, step) => {
|
|
85
|
-
const key = stepKey(turn, step);
|
|
86
|
-
const row = assistantRowsByStep.get(key);
|
|
87
|
-
if (row !== undefined && row.seq === undefined) {
|
|
88
|
-
state.responseChars = Math.max(0, state.responseChars - row.text.length);
|
|
89
|
-
removeRow(row);
|
|
90
|
-
assistantRowsByStep.delete(key);
|
|
91
|
-
}
|
|
92
|
-
if (lastReasoningRow !== undefined && lastReasoningRow.turn === turn && lastReasoningRow.step === step && lastReasoningRow.row.seq === undefined) {
|
|
93
|
-
removeRow(lastReasoningRow.row);
|
|
94
|
-
}
|
|
95
|
-
if (activeAttempt !== undefined && activeAttempt.turn === turn && activeAttempt.step === step)
|
|
96
|
-
activeAttempt = undefined;
|
|
97
|
-
if (tpsStep !== undefined && tpsStep.turn === turn && tpsStep.step === step) {
|
|
98
|
-
tpsStep.firstTokenTime = undefined;
|
|
99
|
-
tpsStep.outputChars = 0;
|
|
100
|
-
}
|
|
101
|
-
updateSpinnerMode();
|
|
102
|
-
};
|
|
103
|
-
/** Durable session image blocks, loaded lazily through the attachment
|
|
104
|
-
* store. Projection never reads pixels; the UI decodes on demand. */
|
|
105
|
-
const transcriptImages = (content) => transcriptImagesOf(content, deps.attachments);
|
|
106
|
-
/** V3 deltas are ordered by frame revision and must stay byte-exact.
|
|
107
|
-
* Legacy reconnect/proxy events may instead repeat a cumulative prefix. */
|
|
108
|
-
const appendTextDelta = (row, delta, legacy) => {
|
|
109
|
-
if (delta === '')
|
|
110
|
-
return;
|
|
111
|
-
if (!legacy) {
|
|
112
|
-
row.text += delta;
|
|
113
|
-
touchRow(row);
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
if (lastTextDelta.get(row) === delta)
|
|
117
|
-
return;
|
|
118
|
-
lastTextDelta.set(row, delta);
|
|
119
|
-
if (delta.startsWith(row.text)) {
|
|
120
|
-
row.text = delta;
|
|
121
|
-
touchRow(row);
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
const maxOverlap = Math.min(row.text.length, delta.length, 4096);
|
|
125
|
-
for (let size = maxOverlap; size > 0; size--) {
|
|
126
|
-
if (row.text.endsWith(delta.slice(0, size))) {
|
|
127
|
-
row.text += delta.slice(size);
|
|
128
|
-
touchRow(row);
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
row.text += delta;
|
|
133
|
-
touchRow(row);
|
|
134
|
-
};
|
|
135
|
-
/** The host-plane tools registry (dsh-tools). Resolved once; absent in
|
|
136
|
-
* bare embedders — every presenter call soft-fails to undefined and the
|
|
137
|
-
* card falls back to raw text. */
|
|
138
|
-
const toolsRegistry = deps.tools;
|
|
139
|
-
/** Ask the producing tool how its call should render (diff/terminal/…).
|
|
140
|
-
* Scoped to the live agent so preset-owned tool definitions resolve —
|
|
141
|
-
* the dsh-host-apiproxy presenter pattern. Unknown tool, unparseable
|
|
142
|
-
* args, or a throwing presenter all degrade to the plain text card. */
|
|
143
|
-
const presentCallView = (name, rawArgs) => {
|
|
144
|
-
try {
|
|
145
|
-
const tool = toolsRegistry?.get(name, deps.agent());
|
|
146
|
-
if (tool?.presentCall === undefined)
|
|
147
|
-
return undefined;
|
|
148
|
-
return tool.presentCall(JSON.parse(rawArgs));
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
return undefined;
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
/** Same for the settled result; `meta` is the tool-private presentation
|
|
155
|
-
* payload the tool attached to its tool/result event (dsh-tool-fs reads
|
|
156
|
-
* its result-time contextual diff back from here). */
|
|
157
|
-
const presentResultView = (name, rawArgs, data) => {
|
|
158
|
-
try {
|
|
159
|
-
// Harness goal/todo tools first: their raw JSON reads as noise in the
|
|
160
|
-
// transcript — fold recognizable shapes into a summary card before the
|
|
161
|
-
// registry gets a chance to (not) know them.
|
|
162
|
-
const local = harnessToolResultView(name, data);
|
|
163
|
-
if (local !== undefined)
|
|
164
|
-
return local;
|
|
165
|
-
const tool = toolsRegistry?.get(name, deps.agent());
|
|
166
|
-
if (tool?.presentResult === undefined)
|
|
167
|
-
return undefined;
|
|
168
|
-
return tool.presentResult(JSON.parse(rawArgs), {
|
|
169
|
-
...toolResultPayload(data.message),
|
|
170
|
-
...(data.meta !== undefined ? { meta: data.meta } : {}),
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
return undefined;
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
// ContentBlockMap is merge-extensible: plugin-added block types are
|
|
178
|
-
// silently skipped (v1 renders text blocks only) — never crashes.
|
|
179
|
-
const textOf = (content) => (content ?? []).map(block => (block.type === 'text' ? block.text : '')).join('').trim();
|
|
180
|
-
/**
|
|
181
|
-
* Transcript-facing text of a user message: the FIRST text block only.
|
|
182
|
-
* `@`-mention attachments (issue #15) ride as later blocks — model-facing
|
|
183
|
-
* only — so joining every block would dump file contents into the bubble,
|
|
184
|
-
* the sticky header, and session titles.
|
|
185
|
-
*/
|
|
186
|
-
const firstTextOf = (content) => (content ?? []).find(block => block.type === 'text')?.text.trim() ?? '';
|
|
187
|
-
const ensureStreaming = (seq) => {
|
|
188
|
-
if (streaming !== undefined)
|
|
189
|
-
return streaming;
|
|
190
|
-
// A reconnect can replay the first delta after the sealed message was
|
|
191
|
-
// already observed. Reuse that durable row instead of opening a second
|
|
192
|
-
// assistant bubble for the same event sequence.
|
|
193
|
-
const existing = seq === undefined
|
|
194
|
-
? undefined
|
|
195
|
-
: [...state.rows].reverse().find(row => row.kind === 'assistant' && row.seq === seq);
|
|
196
|
-
if (existing !== undefined) {
|
|
197
|
-
existing.streaming = true;
|
|
198
|
-
touchRow(existing);
|
|
199
|
-
streaming = existing;
|
|
200
|
-
return existing;
|
|
201
|
-
}
|
|
202
|
-
streaming = { id: deps.rowIds.value, kind: 'assistant', text: '', streaming: true, fresh: true, ...seq !== undefined ? { seq } : {} };
|
|
203
|
-
deps.rowIds.value += 1;
|
|
204
|
-
appendRow(streaming);
|
|
205
|
-
return streaming;
|
|
206
|
-
};
|
|
207
|
-
/** Latest reasoning row keyed by its (turn, step) — lets a resumed
|
|
208
|
-
* mid-step stream REVIVE the row the replay sealed (crash-orphan tail:
|
|
209
|
-
* replay folds the partial row, live continuation chunks would
|
|
210
|
-
* otherwise open a SECOND row for the same step, splitting one
|
|
211
|
-
* thinking block in two). */
|
|
212
|
-
let lastReasoningRow;
|
|
213
|
-
const ensureReasoning = (seq, turn, step) => {
|
|
214
|
-
if (reasoning === undefined) {
|
|
215
|
-
// Same-step revive: the sealed row is this step's thinking — continue
|
|
216
|
-
// it (durationMs carried over via reasoningStart back-dating).
|
|
217
|
-
if (lastReasoningRow !== undefined &&
|
|
218
|
-
turn !== undefined &&
|
|
219
|
-
lastReasoningRow.turn === turn &&
|
|
220
|
-
lastReasoningRow.step === step) {
|
|
221
|
-
reasoning = lastReasoningRow.row;
|
|
222
|
-
reasoning.streaming = true;
|
|
223
|
-
reasoning.thinkingOpen = false;
|
|
224
|
-
touchRow(reasoning);
|
|
225
|
-
const sealedIdx = sealedReasoning.indexOf(reasoning);
|
|
226
|
-
if (sealedIdx !== -1)
|
|
227
|
-
sealedReasoning.splice(sealedIdx, 1);
|
|
228
|
-
reasoningStart = Date.now() - (reasoning.durationMs ?? 0);
|
|
229
|
-
logForDebugging('thinking: revived sealed reasoning row for same step');
|
|
230
|
-
return reasoning;
|
|
231
|
-
}
|
|
232
|
-
reasoningStart = Date.now();
|
|
233
|
-
reasoning = { id: deps.rowIds.value, kind: 'reasoning', text: '', streaming: true, ...seq !== undefined ? { seq } : {} };
|
|
234
|
-
deps.rowIds.value += 1;
|
|
235
|
-
appendRow(reasoning);
|
|
236
|
-
logForDebugging('thinking: reasoning row open (expanded)');
|
|
237
|
-
}
|
|
238
|
-
if (turn !== undefined && step !== undefined) {
|
|
239
|
-
lastReasoningRow = { row: reasoning, turn, step };
|
|
240
|
-
}
|
|
241
|
-
return reasoning;
|
|
242
|
-
};
|
|
243
|
-
/** Settle live reasoning the moment the model moves PAST
|
|
244
|
-
* thinking — the answer's first text token or a tool call — not at
|
|
245
|
-
* `assistant/message` (end of step). A long reply pushes the thinking
|
|
246
|
-
* block into terminal scrollback long before the message seals, and
|
|
247
|
-
* scrollback rows cannot be repainted (the cursor cannot reach them),
|
|
248
|
-
* so a late fold leaves a stale unfolded preview frozen above the
|
|
249
|
-
* window — the user scrolls up and the thinking looks "not folded".
|
|
250
|
-
* Folding while the block still sits in the live window keeps the
|
|
251
|
-
* shrink inside the diff engine's reachable region. Full mode keeps the
|
|
252
|
-
* settled block open separately, so its spinner can stop immediately. */
|
|
253
|
-
const settleLiveReasoning = (where) => {
|
|
254
|
-
if (reasoning === undefined)
|
|
255
|
-
return;
|
|
256
|
-
const duration = Math.max(0, Date.now() - reasoningStart);
|
|
257
|
-
reasoning.durationMs = duration;
|
|
258
|
-
reasoning.streaming = false;
|
|
259
|
-
reasoning.thinkingOpen = state.thinkingFold === 'full';
|
|
260
|
-
touchRow(reasoning);
|
|
261
|
-
sealedReasoning.push(reasoning);
|
|
262
|
-
reasoning = undefined;
|
|
263
|
-
logForDebugging(`thinking: folded at ${where} (${duration}ms)`);
|
|
264
|
-
};
|
|
265
|
-
const settleStreaming = () => {
|
|
266
|
-
if (streaming !== undefined) {
|
|
267
|
-
streaming.streaming = false;
|
|
268
|
-
touchRow(streaming);
|
|
269
|
-
}
|
|
270
|
-
streaming = undefined;
|
|
271
|
-
const folded = sealedReasoning.length + (reasoning !== undefined ? 1 : 0);
|
|
272
|
-
for (const row of sealedReasoning) {
|
|
273
|
-
row.streaming = false;
|
|
274
|
-
row.thinkingOpen = false;
|
|
275
|
-
touchRow(row);
|
|
276
|
-
}
|
|
277
|
-
sealedReasoning.length = 0;
|
|
278
|
-
if (reasoning !== undefined) {
|
|
279
|
-
reasoning.streaming = false;
|
|
280
|
-
reasoning.thinkingOpen = false;
|
|
281
|
-
reasoning.durationMs = Math.max(0, Date.now() - reasoningStart);
|
|
282
|
-
touchRow(reasoning);
|
|
283
|
-
}
|
|
284
|
-
reasoning = undefined;
|
|
285
|
-
if (folded > 0)
|
|
286
|
-
logForDebugging(`thinking: folded ${folded} reasoning row(s) at turn settle`);
|
|
287
|
-
};
|
|
288
|
-
/**
|
|
289
|
-
* Project one answered `ask_user_question` result into the transcript.
|
|
290
|
-
*
|
|
291
|
-
* The row shape reuses what `pushLocal` emits (`local` title + one
|
|
292
|
-
* `local-output` per line), so rendering, preview clipping and the local
|
|
293
|
-
* rows' fold exemption all keep their existing behavior. A failed ask
|
|
294
|
-
* renders the log's own error text — never a fabricated answer (the ask
|
|
295
|
-
* was cancelled/aborted, so no human ever chose anything).
|
|
296
|
-
*/
|
|
297
|
-
const projectAskResult = (event, rawArguments) => {
|
|
298
|
-
const append = (record) => {
|
|
299
|
-
appendRow({ id: deps.rowIds.value, kind: 'local', text: record.title, seq: event.seq });
|
|
300
|
-
deps.rowIds.value += 1;
|
|
301
|
-
for (const line of record.lines) {
|
|
302
|
-
appendRow({
|
|
303
|
-
id: deps.rowIds.value,
|
|
304
|
-
kind: 'local-output',
|
|
305
|
-
text: preview(line, LOCAL_OUTPUT_LIMIT),
|
|
306
|
-
seq: event.seq,
|
|
307
|
-
});
|
|
308
|
-
deps.rowIds.value += 1;
|
|
309
|
-
}
|
|
310
|
-
};
|
|
311
|
-
if (event.data.error !== undefined || toolResultPayload(event.data.message).isError) {
|
|
312
|
-
const errorText = toolErrorText(event);
|
|
313
|
-
append({ title: errorText, lines: [] });
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
const answers = parseQuestionRecordAnswers(textOf(toolResultPayload(event.data.message).content));
|
|
317
|
-
// No parseable answers (unparseable durable payload, or an older host):
|
|
318
|
-
// `answers: []` still yields the title, so the transcript shows that a
|
|
319
|
-
// questionnaire happened instead of dropping the fact silently.
|
|
320
|
-
append(buildQuestionRecord(parseQuestionRecordQuestions(rawArguments), answers ?? []));
|
|
321
|
-
};
|
|
322
|
-
/** Recompute the spinner phase from live row/tool state. */
|
|
323
|
-
const updateSpinnerMode = () => {
|
|
324
|
-
if (state.activeToolCount > 0) {
|
|
325
|
-
state.spinnerMode = 'tool-use';
|
|
326
|
-
}
|
|
327
|
-
else if (reasoning !== undefined) {
|
|
328
|
-
// Only LIVE reasoning counts — sealed rows stay streaming=true for
|
|
329
|
-
// transcript expansion until turn/end but the model is past thinking.
|
|
330
|
-
state.spinnerMode = 'thinking';
|
|
331
|
-
}
|
|
332
|
-
else if (streaming !== undefined) {
|
|
333
|
-
state.spinnerMode = 'responding';
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
state.spinnerMode = 'requesting';
|
|
337
|
-
}
|
|
338
|
-
};
|
|
339
|
-
/** Fold one goal mutation into the channel's goal projection. */
|
|
340
|
-
const applyGoalChange = (change) => {
|
|
341
|
-
if (change.operation === 'clear') {
|
|
342
|
-
state.goal = undefined;
|
|
343
|
-
}
|
|
344
|
-
else if (change.goal !== undefined) {
|
|
345
|
-
state.goal = {
|
|
346
|
-
...change.goal,
|
|
347
|
-
roundsStarted: change.roundsStarted ?? state.goal?.roundsStarted ?? 0,
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
};
|
|
351
|
-
/**
|
|
352
|
-
* Fold one goal-sourced message into the channel's goal projection.
|
|
353
|
-
* Round-zero goal messages may carry the full durable snapshot (or a clear
|
|
354
|
-
* tombstone) in their source; positive-round messages are admitted
|
|
355
|
-
* continuation prompts that only advance the rounds counter.
|
|
356
|
-
*/
|
|
357
|
-
const applyGoalEvent = (event) => {
|
|
358
|
-
const source = event.data.source;
|
|
359
|
-
if (source.round > 0) {
|
|
360
|
-
// Admitted continuation round — the snapshot itself is unchanged.
|
|
361
|
-
if (state.goal !== undefined) {
|
|
362
|
-
state.goal = {
|
|
363
|
-
...state.goal,
|
|
364
|
-
roundsStarted: Math.max(state.goal.roundsStarted, source.round),
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
const change = source.change;
|
|
370
|
-
// oxlint-disable-next-line typescript/no-unnecessary-condition -- durable replay data may not match the static type
|
|
371
|
-
if (change === undefined || change.kind !== 'goal/change')
|
|
372
|
-
return;
|
|
373
|
-
applyGoalChange(change);
|
|
374
|
-
};
|
|
375
|
-
/** Replay paints settled history without the live smooth-reveal animation. */
|
|
376
|
-
let replaying = false;
|
|
377
|
-
const replayEvents = (events) => {
|
|
378
|
-
// Event sequence numbers restart with a replacement session; reset the
|
|
379
|
-
// idempotency ledger before replay so an old session cannot suppress a
|
|
380
|
-
// legitimate message in the new transcript.
|
|
381
|
-
handledAssistantMessages.clear();
|
|
382
|
-
handledAssistantChunks.clear();
|
|
383
|
-
openStep = undefined;
|
|
384
|
-
activeAttempt = undefined;
|
|
385
|
-
lastStreamRevision = -1;
|
|
386
|
-
eventModel = undefined;
|
|
387
|
-
assistantRowsByStep.clear();
|
|
388
|
-
lastTextDelta.clear();
|
|
389
|
-
replaying = true;
|
|
390
|
-
try {
|
|
391
|
-
for (const event of prepareReplayEvents(events))
|
|
392
|
-
renderEvent(event);
|
|
393
|
-
}
|
|
394
|
-
finally {
|
|
395
|
-
replaying = false;
|
|
396
|
-
}
|
|
397
|
-
};
|
|
398
|
-
/**
|
|
399
|
-
* One live stream delta, from a 0.1.5 `agent/assistant-stream` chunk frame
|
|
400
|
-
* or a legacy `assistant/chunk` session event (pre-0.1.5 hosts and raw
|
|
401
|
-
* pre-V3 logs). `seq` exists only on the durable-event path.
|
|
402
|
-
*/
|
|
403
|
-
const renderStreamChunk = (turn, step, chunk, time, seq) => {
|
|
404
|
-
if (chunk.type === 'text-delta') {
|
|
405
|
-
if (chunk.text) {
|
|
406
|
-
// Fold the thinking preview while it is still in the live
|
|
407
|
-
// window (see settleLiveReasoning) — before this text grows the
|
|
408
|
-
// transcript and pushes the block into scrollback.
|
|
409
|
-
settleLiveReasoning('first text token');
|
|
410
|
-
const key = stepKey(turn, step);
|
|
411
|
-
const row = assistantRowsByStep.get(key) ?? ensureStreaming(seq);
|
|
412
|
-
assistantRowsByStep.set(key, row);
|
|
413
|
-
streaming = row;
|
|
414
|
-
row.streaming = true;
|
|
415
|
-
touchRow(row);
|
|
416
|
-
const before = row.text.length;
|
|
417
|
-
appendTextDelta(row, chunk.text, seq !== undefined);
|
|
418
|
-
state.responseChars += Math.max(0, row.text.length - before);
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
else if (chunk.type === 'reasoning-delta') {
|
|
422
|
-
if (chunk.text) {
|
|
423
|
-
const row = ensureReasoning(seq, turn, step);
|
|
424
|
-
appendTextDelta(row, chunk.text, seq !== undefined);
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
const tps = tpsStep;
|
|
428
|
-
if (tps !== undefined &&
|
|
429
|
-
tps.turn === turn &&
|
|
430
|
-
tps.step === step &&
|
|
431
|
-
isTokenDelta(chunk)) {
|
|
432
|
-
tps.firstTokenTime ??= time;
|
|
433
|
-
tps.outputChars += tokenDeltaChars(chunk);
|
|
434
|
-
const elapsedMs = Math.max(0, time - tps.firstTokenTime);
|
|
435
|
-
if (elapsedMs > 500) {
|
|
436
|
-
const decodeMs = tpsTurnDecodeMs + elapsedMs;
|
|
437
|
-
const outputTokens = tpsTurnDecodeTokens + Math.ceil(tps.outputChars / 4);
|
|
438
|
-
state.tps = outputTokens / (decodeMs / 1000);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
updateSpinnerMode();
|
|
442
|
-
};
|
|
443
|
-
/**
|
|
444
|
-
* Live assistant stream frame (0.1.5+): the transient per-token counterpart
|
|
445
|
-
* of the durable `assistant/message`/`assistant/attempt` settlement. Start
|
|
446
|
-
* frames own the attempt's (turn, step); a reattach rebuilds that pair
|
|
447
|
-
* from the open durable step. Settlement owns the text; an abandoned end
|
|
448
|
-
* must discard provisional rows even when no durable event was written.
|
|
449
|
-
*/
|
|
450
|
-
const renderStreamFrame = (frame) => {
|
|
451
|
-
if (frame.revision <= lastStreamRevision)
|
|
452
|
-
return;
|
|
453
|
-
lastStreamRevision = frame.revision;
|
|
454
|
-
if (frame.type === 'start') {
|
|
455
|
-
if (activeAttempt !== undefined)
|
|
456
|
-
discardAttempt(activeAttempt.turn, activeAttempt.step);
|
|
457
|
-
activeAttempt = { attemptId: frame.attemptId, turn: frame.turn, step: frame.step };
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
|
-
if (frame.type === 'end') {
|
|
461
|
-
if (activeAttempt?.attemptId !== frame.attemptId)
|
|
462
|
-
return;
|
|
463
|
-
if (frame.outcome.kind === 'abandoned' || frame.outcome.eventType === 'assistant/attempt') {
|
|
464
|
-
discardAttempt(activeAttempt.turn, activeAttempt.step);
|
|
465
|
-
}
|
|
466
|
-
activeAttempt = undefined;
|
|
467
|
-
return;
|
|
468
|
-
}
|
|
469
|
-
if (activeAttempt === undefined && openStep !== undefined) {
|
|
470
|
-
activeAttempt = { attemptId: frame.attemptId, ...openStep };
|
|
471
|
-
}
|
|
472
|
-
const where = activeAttempt?.attemptId === frame.attemptId ? activeAttempt : undefined;
|
|
473
|
-
if (where === undefined)
|
|
474
|
-
return;
|
|
475
|
-
renderStreamChunk(where.turn, where.step, frame.chunk, frame.time);
|
|
476
|
-
};
|
|
477
|
-
const renderEvent = (event) => {
|
|
478
|
-
// Top-level `goal/change` events are how the goal service actually
|
|
479
|
-
// records durable goal mutations (create/edit/pause/resume/complete/
|
|
480
|
-
// block/clear) — confirmed in production logs. The pinned peer's
|
|
481
|
-
// SessionEvent union predates the type, so admit it structurally: the
|
|
482
|
-
// goal chip and panel stay dark without this fold.
|
|
483
|
-
if (event.type === 'goal/change') {
|
|
484
|
-
applyGoalChange(event.data);
|
|
485
|
-
return;
|
|
486
|
-
}
|
|
487
|
-
switch (event.type) {
|
|
488
|
-
case 'user/message': {
|
|
489
|
-
// Both legacy and V4 checkpoints render as a folded summary rather
|
|
490
|
-
// than disappearing with the other injected context.
|
|
491
|
-
if (isCompactionCheckpointSource(event.data.source)) {
|
|
492
|
-
const summary = textOf(event.data.content);
|
|
493
|
-
appendRow({ id: deps.rowIds.value, kind: 'notice', text: t('compact-done') });
|
|
494
|
-
deps.rowIds.value += 1;
|
|
495
|
-
if (summary) {
|
|
496
|
-
appendRow({ id: deps.rowIds.value, kind: 'compact', text: summary });
|
|
497
|
-
deps.rowIds.value += 1;
|
|
498
|
-
}
|
|
499
|
-
// The checkpoint replaces the whole pre-compact surface. Occupancy
|
|
500
|
-
// needs no rewriting here: the official token meter folds this same
|
|
501
|
-
// event and reprices the surface by its logged shadow price, so the
|
|
502
|
-
// channel's `contextOccupancy` drops the moment the checkpoint lands
|
|
503
|
-
// (the projection's change feed republishes the footer). The old
|
|
504
|
-
// chars/4 rewrite below was a worse estimate of a number the host
|
|
505
|
-
// already knows: it ignored the retained tail the official
|
|
506
|
-
// `compaction-basic` keeps (default `retainRatio` 0.16), ignored the
|
|
507
|
-
// tool catalog, and could not see the summary's real size.
|
|
508
|
-
//
|
|
509
|
-
// The SEGMENTED bar keeps its own heuristic composition (system +
|
|
510
|
-
// the summary prompt): it describes what the surface is made of,
|
|
511
|
-
// never the occupancy total.
|
|
512
|
-
state.contextSegments = {
|
|
513
|
-
system: state.contextSegments.system,
|
|
514
|
-
prompt: estimateTokens(summary),
|
|
515
|
-
assistant: 0,
|
|
516
|
-
thinking: 0,
|
|
517
|
-
tools: 0,
|
|
518
|
-
};
|
|
519
|
-
// The latch must release: compaction is the remediation for a low
|
|
520
|
-
// context, so the warning has to be able to fire again afterwards.
|
|
521
|
-
deps.resetContextWarning();
|
|
522
|
-
break;
|
|
523
|
-
}
|
|
524
|
-
// Same-session goal domain: goal-sourced messages are the round
|
|
525
|
-
// driver's continuation prompts (positive rounds advance the
|
|
526
|
-
// counter); some hosts also inline the durable snapshot in a
|
|
527
|
-
// round-zero source. They are not transcript bubbles — they drive
|
|
528
|
-
// the goal panel's live projection (replayed on resume/rewind like
|
|
529
|
-
// every other event; the snapshot itself arrives as the top-level
|
|
530
|
-
// `goal/change` event admitted above).
|
|
531
|
-
if (event.data.source.kind === 'goal') {
|
|
532
|
-
applyGoalEvent(event);
|
|
533
|
-
break;
|
|
534
|
-
}
|
|
535
|
-
// Injected context (plugin/skill source) is not a human bubble; v1
|
|
536
|
-
// renders direct human prompts only.
|
|
537
|
-
if (event.data.source.kind !== 'user')
|
|
538
|
-
break;
|
|
539
|
-
const text = firstTextOf(event.data.content);
|
|
540
|
-
const images = transcriptImages(event.data.content);
|
|
541
|
-
if (text || images.length > 0) {
|
|
542
|
-
// IDE selection indicator: the delivery path remembered what this
|
|
543
|
-
// message attached; the durable event carries the same message id.
|
|
544
|
-
// On replay (session resumed in a NEW process) the in-memory map
|
|
545
|
-
// starts empty, so the indicator falls back to the durable content
|
|
546
|
-
// itself — the `<attached-file … selection>` block IS part of the
|
|
547
|
-
// persisted event, and the session log is the source of truth
|
|
548
|
-
// (maintainer review round 3: the indicator used to vanish after a
|
|
549
|
-
// restart because nothing re-derived it from the event).
|
|
550
|
-
const selectionAttached = deps.selectionAttached(event.data.id)
|
|
551
|
-
?? replaySelectionAttachment(event.data.content);
|
|
552
|
-
appendRow({
|
|
553
|
-
id: deps.rowIds.value,
|
|
554
|
-
kind: 'user',
|
|
555
|
-
text,
|
|
556
|
-
...(images.length === 0 ? {} : { images }),
|
|
557
|
-
...(selectionAttached === undefined ? {} : { selectionAttached }),
|
|
558
|
-
seq: event.seq,
|
|
559
|
-
});
|
|
560
|
-
state.lastUserText = text || t('transcript-image-message', { count: images.length });
|
|
561
|
-
// The context estimate counts everything sent to the model —
|
|
562
|
-
// typed text AND the `@`-mention attachment blocks.
|
|
563
|
-
state.contextSegments.prompt += estimateTokens(textOf(event.data.content));
|
|
564
|
-
deps.rowIds.value += 1;
|
|
565
|
-
}
|
|
566
|
-
break;
|
|
567
|
-
}
|
|
568
|
-
case 'step/start': {
|
|
569
|
-
openStep = { turn: event.data.turn, step: event.data.step };
|
|
570
|
-
if (tpsTurn === event.data.turn) {
|
|
571
|
-
tpsStep = {
|
|
572
|
-
turn: event.data.turn,
|
|
573
|
-
step: event.data.step,
|
|
574
|
-
firstTokenTime: undefined,
|
|
575
|
-
outputChars: 0,
|
|
576
|
-
};
|
|
577
|
-
}
|
|
578
|
-
break;
|
|
579
|
-
}
|
|
580
|
-
case 'assistant/attempt': {
|
|
581
|
-
discardAttempt(event.data.turn, event.data.step);
|
|
582
|
-
break;
|
|
583
|
-
}
|
|
584
|
-
case 'assistant/message': {
|
|
585
|
-
if (handledAssistantMessages.has(event.seq))
|
|
586
|
-
break;
|
|
587
|
-
handledAssistantMessages.add(event.seq);
|
|
588
|
-
// V3 embeds its complete attempt stream; older settlements may omit
|
|
589
|
-
// reasoning that is still durably recorded in assistant/chunk events.
|
|
590
|
-
const canonical = Array.isArray(event.data.stream);
|
|
591
|
-
const text = textOf(event.data.message.content);
|
|
592
|
-
const images = transcriptImages(event.data.message.content);
|
|
593
|
-
const reasoningText = event.data.message.content
|
|
594
|
-
.map(block => (block.type === 'reasoning' ? block.text : ''))
|
|
595
|
-
.join('');
|
|
596
|
-
const settledReasoning = lastReasoningRow !== undefined && lastReasoningRow.turn === event.data.turn && lastReasoningRow.step === event.data.step
|
|
597
|
-
? lastReasoningRow.row : reasoning;
|
|
598
|
-
if (settledReasoning !== undefined) {
|
|
599
|
-
if (reasoningText === '') {
|
|
600
|
-
if (canonical)
|
|
601
|
-
removeRow(settledReasoning);
|
|
602
|
-
}
|
|
603
|
-
else {
|
|
604
|
-
settledReasoning.text = reasoningText;
|
|
605
|
-
settledReasoning.seq ??= event.seq;
|
|
606
|
-
touchRow(settledReasoning);
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
else if (reasoningText !== '') {
|
|
610
|
-
// Replays and reattachments may not have seen any reasoning delta.
|
|
611
|
-
// Insert before a live text row to preserve message block order.
|
|
612
|
-
const rebuilt = {
|
|
613
|
-
id: deps.rowIds.value,
|
|
614
|
-
kind: 'reasoning',
|
|
615
|
-
text: reasoningText,
|
|
616
|
-
seq: event.seq,
|
|
617
|
-
};
|
|
618
|
-
deps.rowIds.value += 1;
|
|
619
|
-
const textRow = assistantRowsByStep.get(stepKey(event.data.turn, event.data.step));
|
|
620
|
-
const textIndex = textRow === undefined ? -1 : state.rows.indexOf(textRow);
|
|
621
|
-
if (textIndex === -1)
|
|
622
|
-
appendRow(rebuilt);
|
|
623
|
-
else {
|
|
624
|
-
state.rows.splice(textIndex, 0, rebuilt);
|
|
625
|
-
markChannelReadDirty(state.rows);
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
// Reasoning/tool-only steps emit no text: creating an assistant row
|
|
629
|
-
// anyway leaves an empty `●` bullet in the transcript. A pre-existing
|
|
630
|
-
// streaming row always has text (ensureStreaming is only reached on
|
|
631
|
-
// non-empty text deltas), so only create one when text arrives.
|
|
632
|
-
// Key the step→row ledger only when the event carries a durable
|
|
633
|
-
// turn/step; a message without them must never collide onto a
|
|
634
|
-
// previous step's row (a bare `undefined:undefined` key would make
|
|
635
|
-
// every turn/step-less message reuse the FIRST one's assistant row).
|
|
636
|
-
const msgTurn = event.data.turn;
|
|
637
|
-
const msgStep = event.data.step;
|
|
638
|
-
const msgKey = msgTurn !== undefined && msgStep !== undefined
|
|
639
|
-
? stepKey(msgTurn, msgStep)
|
|
640
|
-
: undefined;
|
|
641
|
-
const row = (msgKey !== undefined ? assistantRowsByStep.get(msgKey) : undefined) ?? streaming ??
|
|
642
|
-
(text || images.length > 0
|
|
643
|
-
? ([...state.rows].reverse().find(candidate => candidate.kind === 'assistant' && candidate.seq === event.seq) ?? ensureStreaming(event.seq))
|
|
644
|
-
: undefined);
|
|
645
|
-
if (row !== undefined && canonical && !text && images.length === 0) {
|
|
646
|
-
removeRow(row);
|
|
647
|
-
if (msgKey !== undefined)
|
|
648
|
-
assistantRowsByStep.delete(msgKey);
|
|
649
|
-
}
|
|
650
|
-
else if (row !== undefined) {
|
|
651
|
-
if (msgKey !== undefined)
|
|
652
|
-
assistantRowsByStep.set(msgKey, row);
|
|
653
|
-
row.seq ??= event.seq;
|
|
654
|
-
row.time = event.time;
|
|
655
|
-
if (text || canonical)
|
|
656
|
-
row.text = text;
|
|
657
|
-
row.images = images.length === 0 ? undefined : images;
|
|
658
|
-
row.streaming = false;
|
|
659
|
-
// Live settles keep the smooth-reveal cursor alive (a one-shot
|
|
660
|
-
// non-streaming delivery still paints as a flow); replayed
|
|
661
|
-
// settles must not — the transcript would typewrite on open.
|
|
662
|
-
if (!replaying && text)
|
|
663
|
-
row.fresh = true;
|
|
664
|
-
touchRow(row);
|
|
665
|
-
}
|
|
666
|
-
streaming = undefined;
|
|
667
|
-
if (reasoning !== undefined) {
|
|
668
|
-
// Backstop fold: reasoning whose step ended with no text token
|
|
669
|
-
// and no tool call (settleLiveReasoning handles those earlier —
|
|
670
|
-
// while the block is still in the repaintable live window;
|
|
671
|
-
// here a long reply may already have pushed it into scrollback,
|
|
672
|
-
// where the shrink cannot be repainted). `full` mode
|
|
673
|
-
// (/settings opt-in) keeps the block expanded until turn settle
|
|
674
|
-
// — settleStreaming folds the sealed rows then.
|
|
675
|
-
reasoning.durationMs = Math.max(0, Date.now() - reasoningStart);
|
|
676
|
-
reasoning.streaming = false;
|
|
677
|
-
reasoning.thinkingOpen = state.thinkingFold === 'full';
|
|
678
|
-
touchRow(reasoning);
|
|
679
|
-
sealedReasoning.push(reasoning);
|
|
680
|
-
logForDebugging(`thinking: step sealed (${reasoning.durationMs}ms), expanded until turn/end`);
|
|
681
|
-
}
|
|
682
|
-
reasoning = undefined;
|
|
683
|
-
if (activeAttempt !== undefined && activeAttempt.turn === event.data.turn && activeAttempt.step === event.data.step)
|
|
684
|
-
activeAttempt = undefined;
|
|
685
|
-
updateSpinnerMode();
|
|
686
|
-
const usage = event.data.usage;
|
|
687
|
-
if (usage !== undefined) {
|
|
688
|
-
// oxlint-disable-next-line typescript/no-unnecessary-condition -- durable replay data may lack tokens
|
|
689
|
-
state.tokens.input += usage.inputTokens ?? 0;
|
|
690
|
-
// oxlint-disable-next-line typescript/no-unnecessary-condition -- durable replay data may lack tokens
|
|
691
|
-
state.tokens.output += usage.outputTokens ?? 0;
|
|
692
|
-
// Cache split totals feed the session cost estimate (hit-priced
|
|
693
|
-
// input vs. uncached input) — the durable replay may lack them.
|
|
694
|
-
state.tokens.cacheRead += usage.cacheReadTokens ?? 0;
|
|
695
|
-
state.tokens.cacheWrite += usage.cacheWriteTokens ?? 0;
|
|
696
|
-
// Peak/idle bucketing by the request's own time (the durable replay
|
|
697
|
-
// replays historical events, so a resumed session prices each
|
|
698
|
-
// request at the rate window it actually ran in — the session cost
|
|
699
|
-
// estimate never prices the whole session at the current window).
|
|
700
|
-
const peak = isPeakHour(new Date(event.time));
|
|
701
|
-
{
|
|
702
|
-
const bucket = peak
|
|
703
|
-
? state.tokens.peak
|
|
704
|
-
: state.tokens.idle;
|
|
705
|
-
bucket.input += usage.inputTokens ?? 0;
|
|
706
|
-
bucket.output += usage.outputTokens ?? 0;
|
|
707
|
-
bucket.cacheRead += usage.cacheReadTokens ?? 0;
|
|
708
|
-
bucket.cacheWrite += usage.cacheWriteTokens ?? 0;
|
|
709
|
-
}
|
|
710
|
-
// 主会话费用分桶(DESIGN D2):与 tokens 同口径,但按事件发生时
|
|
711
|
-
// 的模型归属——replay 用 request/header 还原历史请求模型,旧日志
|
|
712
|
-
// 回退 channel 模型;换模型不会把历史 token 重估到新模型。
|
|
713
|
-
const costInput = usage.inputTokens ?? 0;
|
|
714
|
-
const costOutput = usage.outputTokens ?? 0;
|
|
715
|
-
const costCacheRead = usage.cacheReadTokens ?? 0;
|
|
716
|
-
const costCacheWrite = usage.cacheWriteTokens ?? 0;
|
|
717
|
-
if (costInput !== 0 || costOutput !== 0 || costCacheRead !== 0 || costCacheWrite !== 0) {
|
|
718
|
-
const model = eventModel ?? state.model;
|
|
719
|
-
const cost = state.mainCost[model] ?? emptyCostBuckets();
|
|
720
|
-
addUsageToCostBuckets(cost, {
|
|
721
|
-
input: costInput,
|
|
722
|
-
output: costOutput,
|
|
723
|
-
cacheRead: costCacheRead,
|
|
724
|
-
cacheWrite: costCacheWrite,
|
|
725
|
-
}, peak);
|
|
726
|
-
state.mainCost[model] = cost;
|
|
727
|
-
}
|
|
728
|
-
// The most recent request's usage describes the CURRENT context:
|
|
729
|
-
// input (uncached) + cache hits all occupy the window. Cache hits
|
|
730
|
-
// also drive the status-line `cache N` readout.
|
|
731
|
-
state.lastUsage = {
|
|
732
|
-
// oxlint-disable-next-line typescript/no-unnecessary-condition -- durable replay data may lack tokens
|
|
733
|
-
input: usage.inputTokens ?? 0,
|
|
734
|
-
// oxlint-disable-next-line typescript/no-unnecessary-condition -- durable replay data may lack tokens
|
|
735
|
-
output: usage.outputTokens ?? 0,
|
|
736
|
-
cacheRead: usage.cacheReadTokens ?? 0,
|
|
737
|
-
cacheWrite: usage.cacheWriteTokens ?? 0,
|
|
738
|
-
};
|
|
739
|
-
}
|
|
740
|
-
const tpsMessageStep = tpsStep;
|
|
741
|
-
if (tpsTurn === event.data.turn &&
|
|
742
|
-
tpsMessageStep !== undefined &&
|
|
743
|
-
tpsMessageStep.turn === event.data.turn &&
|
|
744
|
-
tpsMessageStep.step === event.data.step &&
|
|
745
|
-
tpsMessageStep.firstTokenTime !== undefined) {
|
|
746
|
-
const outputTokens = usageOutputTokens(usage)
|
|
747
|
-
?? (tpsMessageStep.outputChars > 0
|
|
748
|
-
? Math.ceil(tpsMessageStep.outputChars / 4)
|
|
749
|
-
: undefined);
|
|
750
|
-
if (outputTokens !== undefined) {
|
|
751
|
-
tpsTurnDecodeMs += Math.max(0, event.time - tpsMessageStep.firstTokenTime);
|
|
752
|
-
tpsTurnDecodeTokens += outputTokens;
|
|
753
|
-
tpsTurnSampled = true;
|
|
754
|
-
if (tpsTurnDecodeMs > 0) {
|
|
755
|
-
state.tps = tpsTurnDecodeTokens / (tpsTurnDecodeMs / 1000);
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
}
|
|
759
|
-
if (tpsMessageStep !== undefined &&
|
|
760
|
-
tpsMessageStep.turn === event.data.turn &&
|
|
761
|
-
tpsMessageStep.step === event.data.step) {
|
|
762
|
-
tpsStep = undefined;
|
|
763
|
-
}
|
|
764
|
-
// Context-bar segmentation (pi-nano-context style): assistant text
|
|
765
|
-
// and tool calls in the assistant segment, thinking separately.
|
|
766
|
-
for (const block of event.data.message.content) {
|
|
767
|
-
if (block.type === 'text' && block.text) {
|
|
768
|
-
state.contextSegments.assistant += estimateTokens(block.text);
|
|
769
|
-
}
|
|
770
|
-
else if (block.type === 'reasoning' && block.text) {
|
|
771
|
-
state.contextSegments.thinking += estimateTokens(block.text);
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
break;
|
|
775
|
-
}
|
|
776
|
-
case 'tool/call': {
|
|
777
|
-
// The ask-user-question tool renders as the interactive questionnaire
|
|
778
|
-
// panel (DSH user-interaction seam), not as a tool card: the model is
|
|
779
|
-
// parked waiting for the human, so no running card, no active-tool
|
|
780
|
-
// spinner, no args noise in the transcript. Only the ARGUMENTS are
|
|
781
|
-
// remembered: the paired tool/result below projects the answered
|
|
782
|
-
// record from them (issue #1009), so `/resume`, rewind and replay
|
|
783
|
-
// rebuild it from the persisted log like every other transcript row.
|
|
784
|
-
if (event.data.name === 'ask_user_question') {
|
|
785
|
-
askCalls.set(event.data.callId, event.data.arguments);
|
|
786
|
-
break;
|
|
787
|
-
}
|
|
788
|
-
// The Task tool's plain card is replaced by the live subagent card
|
|
789
|
-
// (Kimi Code semantics): the delegation itself renders as a subagent
|
|
790
|
-
// row, so the raw args/result card would only duplicate it. The call
|
|
791
|
-
// still runs - only its transcript rendering is suppressed.
|
|
792
|
-
if (isSubagentToolName(event.data.name)) {
|
|
793
|
-
// The parent-scoped subagent reducer owns pending descriptions,
|
|
794
|
-
// including delegations made while this transcript is parked.
|
|
795
|
-
break;
|
|
796
|
-
}
|
|
797
|
-
// Reasoning that led to a tool call is done thinking — fold the
|
|
798
|
-
// preview now, before the tool card grows the transcript past it
|
|
799
|
-
// (see settleLiveReasoning).
|
|
800
|
-
settleLiveReasoning('tool call');
|
|
801
|
-
const card = {
|
|
802
|
-
id: deps.rowIds.value,
|
|
803
|
-
kind: 'tool',
|
|
804
|
-
text: '',
|
|
805
|
-
seq: event.seq,
|
|
806
|
-
// Smooth-reveal participation flag: live cards animate their body
|
|
807
|
-
// in; replayed cards (resume/rewind) paint complete.
|
|
808
|
-
fresh: !replaying,
|
|
809
|
-
tool: {
|
|
810
|
-
callId: event.data.callId,
|
|
811
|
-
name: event.data.name,
|
|
812
|
-
argsText: preview(event.data.arguments, ARGS_PREVIEW_LIMIT),
|
|
813
|
-
argsFull: event.data.arguments,
|
|
814
|
-
status: 'running',
|
|
815
|
-
callView: presentCallView(event.data.name, event.data.arguments),
|
|
816
|
-
startedAt: Date.now(),
|
|
817
|
-
},
|
|
818
|
-
};
|
|
819
|
-
deps.rowIds.value += 1;
|
|
820
|
-
toolCards.set(event.data.callId, card);
|
|
821
|
-
appendRow(card);
|
|
822
|
-
state.activeToolCount += 1;
|
|
823
|
-
state.contextSegments.assistant += estimateTokens(`${event.data.name}${event.data.arguments}`);
|
|
824
|
-
updateSpinnerMode();
|
|
825
|
-
break;
|
|
826
|
-
}
|
|
827
|
-
case 'tool/result': {
|
|
828
|
-
const callId = event.data.message.source.callId;
|
|
829
|
-
const card = toolCards.get(callId);
|
|
830
|
-
const askArguments = askCalls.get(callId);
|
|
831
|
-
// A call with no card is usually an ask_user_question (above) — its
|
|
832
|
-
// interaction lives in the panel, but its OUTCOME still belongs in
|
|
833
|
-
// the transcript. Project it from the durable log here: consumed
|
|
834
|
-
// before the card branch so the two can never both fire, and deleted
|
|
835
|
-
// so a repeated replay of the same result cannot double the record.
|
|
836
|
-
if (card === undefined && askArguments !== undefined) {
|
|
837
|
-
projectAskResult(event, askArguments);
|
|
838
|
-
askCalls.delete(callId);
|
|
839
|
-
break;
|
|
840
|
-
}
|
|
841
|
-
if (card !== undefined && card.tool !== undefined) {
|
|
842
|
-
const images = transcriptImages(event.data.message.content);
|
|
843
|
-
card.images = images.length === 0 ? undefined : images;
|
|
844
|
-
card.tool.durationMs = Math.max(0, Date.now() - card.tool.startedAt);
|
|
845
|
-
const payload = toolResultPayload(event.data.message);
|
|
846
|
-
if (event.data.error !== undefined || payload.isError) {
|
|
847
|
-
card.tool.status = 'error';
|
|
848
|
-
const errorText = toolErrorText(event);
|
|
849
|
-
card.tool.errorText = errorText;
|
|
850
|
-
state.contextSegments.tools += estimateTokens(errorText);
|
|
851
|
-
}
|
|
852
|
-
else {
|
|
853
|
-
card.tool.status = 'ok';
|
|
854
|
-
const result = textOf(payload.content);
|
|
855
|
-
card.tool.resultFull = result || undefined;
|
|
856
|
-
card.tool.resultText = result ? preview(result, RESULT_PREVIEW_LIMIT) : undefined;
|
|
857
|
-
// The tool's own settled-state view (applied diff, terminal
|
|
858
|
-
// output, read content…) wins over the raw text body. argsFull
|
|
859
|
-
// pairs the args: live cards are never folded, so it is intact.
|
|
860
|
-
card.tool.resultView = presentResultView(card.tool.name, card.tool.argsFull ?? '', event.data);
|
|
861
|
-
state.contextSegments.tools += estimateTokens(result);
|
|
862
|
-
// A job_output result doubles as the job card's output feed:
|
|
863
|
-
// the registry's read() is consuming and reserved for the
|
|
864
|
-
// owning agent, so the UI mirrors the tail that already streams
|
|
865
|
-
// through the transcript instead of polling the job itself.
|
|
866
|
-
if (card.tool.name === 'job_output' && result !== '') {
|
|
867
|
-
const id = parseJobOutputId(card.tool.argsFull);
|
|
868
|
-
if (id !== undefined)
|
|
869
|
-
deps.jobs.onOutputSeen(id, result, event.time ?? Date.now());
|
|
870
|
-
}
|
|
871
|
-
// A `started background job <id>` ack pairs the job with its
|
|
872
|
-
// tool call: capture the FULL command from the args (the
|
|
873
|
-
// registry label is the friendly description) for the panel.
|
|
874
|
-
const startAck = BACKGROUND_START_ACK.exec(result);
|
|
875
|
-
if (startAck !== null) {
|
|
876
|
-
const command = toolCommandOf(card.tool.argsFull);
|
|
877
|
-
if (command !== undefined)
|
|
878
|
-
deps.jobs.onStarted(startAck[1], command);
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
state.activeToolCount = Math.max(0, state.activeToolCount - 1);
|
|
882
|
-
// The card is settled: no later event looks it up by callId, so
|
|
883
|
-
// drop the index entry. The card itself stays in state.rows
|
|
884
|
-
// (bounded by MAX_ROWS + foldRows, which also drops the full
|
|
885
|
-
// args/result payloads of folded cards).
|
|
886
|
-
toolCards.delete(event.data.message.source.callId);
|
|
887
|
-
touchRow(card);
|
|
888
|
-
updateSpinnerMode();
|
|
889
|
-
}
|
|
890
|
-
break;
|
|
891
|
-
}
|
|
892
|
-
case 'step/end': {
|
|
893
|
-
if (openStep !== undefined && openStep.turn === event.data.turn && openStep.step === event.data.step)
|
|
894
|
-
openStep = undefined;
|
|
895
|
-
if (tpsStep !== undefined &&
|
|
896
|
-
tpsStep.turn === event.data.turn &&
|
|
897
|
-
tpsStep.step === event.data.step) {
|
|
898
|
-
tpsStep = undefined;
|
|
899
|
-
}
|
|
900
|
-
break;
|
|
901
|
-
}
|
|
902
|
-
case 'turn/start': {
|
|
903
|
-
deps.inputConvergence.cancelInFlight = false;
|
|
904
|
-
state.cancelPending = false;
|
|
905
|
-
state.working = true;
|
|
906
|
-
state.turnStart = Date.now();
|
|
907
|
-
state.responseChars = 0;
|
|
908
|
-
state.spinnerMode = 'requesting';
|
|
909
|
-
// Keep the prior turn visible until this turn produces a measurable
|
|
910
|
-
// decode span, while starting a fresh weighted step fold.
|
|
911
|
-
tpsBeforeTurn = state.tps;
|
|
912
|
-
tpsTurn = event.data.turn;
|
|
913
|
-
tpsTurnDecodeMs = 0;
|
|
914
|
-
tpsTurnDecodeTokens = 0;
|
|
915
|
-
tpsTurnSampled = false;
|
|
916
|
-
tpsStep = undefined;
|
|
917
|
-
break;
|
|
918
|
-
}
|
|
919
|
-
case 'turn/end': {
|
|
920
|
-
if (activeAttempt !== undefined)
|
|
921
|
-
discardAttempt(activeAttempt.turn, activeAttempt.step);
|
|
922
|
-
openStep = undefined;
|
|
923
|
-
deps.inputConvergence.cancelInFlight = false;
|
|
924
|
-
state.cancelPending = false;
|
|
925
|
-
settleStreaming();
|
|
926
|
-
state.working = false;
|
|
927
|
-
state.activeToolCount = 0;
|
|
928
|
-
if (tpsTurn !== undefined && tpsTurn === event.data.turn) {
|
|
929
|
-
if (tpsTurnSampled && tpsTurnDecodeMs > 0) {
|
|
930
|
-
const turnTps = tpsTurnDecodeTokens / (tpsTurnDecodeMs / 1000);
|
|
931
|
-
state.tps = turnTps;
|
|
932
|
-
state.tpsSamples.push({ tps: turnTps, at: event.time });
|
|
933
|
-
if (state.tpsSamples.length > 500)
|
|
934
|
-
state.tpsSamples.shift();
|
|
935
|
-
}
|
|
936
|
-
else {
|
|
937
|
-
// Do not leave a chars/4 live estimate behind when no completed
|
|
938
|
-
// decode sample exists for this turn.
|
|
939
|
-
state.tps = tpsBeforeTurn;
|
|
940
|
-
}
|
|
941
|
-
tpsTurn = undefined;
|
|
942
|
-
tpsStep = undefined;
|
|
943
|
-
tpsTurnDecodeMs = 0;
|
|
944
|
-
tpsTurnDecodeTokens = 0;
|
|
945
|
-
tpsTurnSampled = false;
|
|
946
|
-
}
|
|
947
|
-
// Occupancy is evaluated on EVERY turn end, not only a completed one:
|
|
948
|
-
// the request that overflowed the window is exactly the one whose turn
|
|
949
|
-
// ends as an error (it writes no successful usage sample at all), and
|
|
950
|
-
// an aborted turn has still grown the surface. Replay drains a resumed
|
|
951
|
-
// session's history through the projector; its totals describe the
|
|
952
|
-
// past, not a live context-low state.
|
|
953
|
-
if (!replaying)
|
|
954
|
-
deps.checkContextWarning();
|
|
955
|
-
const reason = event.data.reason;
|
|
956
|
-
if (reason.kind === 'completed') {
|
|
957
|
-
break;
|
|
958
|
-
}
|
|
959
|
-
if (reason.kind === 'aborted' || reason.kind === 'interrupted') {
|
|
960
|
-
// `Agent.cancel()` closes the turn as `aborted`; `interrupted`
|
|
961
|
-
// only appears for crash-orphaned turns. Both user-interruption
|
|
962
|
-
// paths render as a distinct dim row.
|
|
963
|
-
appendRow({
|
|
964
|
-
id: deps.rowIds.value,
|
|
965
|
-
kind: 'interrupt',
|
|
966
|
-
text: t('interrupted-by-user') + t('interrupted-ask-next'),
|
|
967
|
-
});
|
|
968
|
-
deps.rowIds.value += 1;
|
|
969
|
-
break;
|
|
970
|
-
}
|
|
971
|
-
// The notice renders as a single-line Divider title: error.message
|
|
972
|
-
// can carry newlines/control chars, and an embedded \n splits the
|
|
973
|
-
// rule across rows. cleanRenderText is the render-path single-line
|
|
974
|
-
// contract (sessionTree's preview() folds likewise for the tree).
|
|
975
|
-
const detail = reason.kind === 'error' ? cleanRenderText(reason.error.message, NOTICE_CELLS) : '';
|
|
976
|
-
appendRow({ id: deps.rowIds.value, kind: 'notice', text: `turn ${reason.kind}${detail ? ` · ${detail}` : ''}` });
|
|
977
|
-
deps.rowIds.value += 1;
|
|
978
|
-
// Historical failure notices belong to the transcript row above;
|
|
979
|
-
// re-raising them as a live toast on every /resume re-alarmes the
|
|
980
|
-
// user over a turn that already ended.
|
|
981
|
-
if (!replaying)
|
|
982
|
-
deps.notify(t('turn-failed', { detail: detail ? ` · ${detail}` : '' }), { color: 'error', timeoutMs: 8000 });
|
|
983
|
-
break;
|
|
984
|
-
}
|
|
985
|
-
case 'request/context':
|
|
986
|
-
// Adapter-advertised context capacity; drives the context-low
|
|
987
|
-
// warning when the route reports one.
|
|
988
|
-
if (event.data.contextWindow !== undefined) {
|
|
989
|
-
state.contextWindow = event.data.contextWindow;
|
|
990
|
-
}
|
|
991
|
-
break;
|
|
992
|
-
case 'system/message': {
|
|
993
|
-
// V3 system prompts are surface nodes, not header fields: the latest
|
|
994
|
-
// node holds the active instructions (an empty render clears them).
|
|
995
|
-
// The context bar's system segment tracks that live text.
|
|
996
|
-
state.contextSegments.system = estimateTokens(textOf(event.data.message.content));
|
|
997
|
-
break;
|
|
998
|
-
}
|
|
999
|
-
case 'request/header': {
|
|
1000
|
-
// Reasoning effort readout (status line): the header carries the
|
|
1001
|
-
// conversation's call config (provider/model/effort/sampling). The
|
|
1002
|
-
// system prompt moved out of the header at V3 (see system/message);
|
|
1003
|
-
// pre-V3 logs still carry it, admitted structurally below.
|
|
1004
|
-
// oxlint-disable-next-line typescript/no-unnecessary-condition -- durable session data may lack header config
|
|
1005
|
-
const effort = event.data.header.config?.reasoningEffort;
|
|
1006
|
-
if (typeof effort === 'string') {
|
|
1007
|
-
state.reasoningEffort = effort;
|
|
1008
|
-
}
|
|
1009
|
-
// 模型归属真源:该请求的 usage 按这里的 model 计价(replay 时逐请求
|
|
1010
|
-
// 还原;live 时与 state.model 同步更新,AC-A4)。header 缺/空 model
|
|
1011
|
-
// 必须清掉上一条 header 的值——否则后续 usage 会沿用旧模型进错桶;
|
|
1012
|
-
// 归属时再回退 state.model(旧日志没有 header 的既有语义)。
|
|
1013
|
-
const headerModel = event.data.header.config?.model;
|
|
1014
|
-
eventModel = typeof headerModel === 'string' && headerModel !== '' ? headerModel : undefined;
|
|
1015
|
-
const legacySystem = event.data.header.system;
|
|
1016
|
-
if (typeof legacySystem === 'string') {
|
|
1017
|
-
state.contextSegments.system = estimateTokens(legacySystem);
|
|
1018
|
-
}
|
|
1019
|
-
break;
|
|
1020
|
-
}
|
|
1021
|
-
case 'session/title':
|
|
1022
|
-
state.sessionTitle = event.data.title;
|
|
1023
|
-
break;
|
|
1024
|
-
default:
|
|
1025
|
-
// Pre-0.1.5 live streams and raw pre-V3 logs carry per-token chunks
|
|
1026
|
-
// as durable session events; 0.1.5 moved live chunks to transient
|
|
1027
|
-
// `agent/assistant-stream` frames (renderStreamFrame) and compacts the
|
|
1028
|
-
// durable record into `assistant/message.stream`. Match by name so the
|
|
1029
|
-
// current union (which no longer lists the type) stays compile-clean.
|
|
1030
|
-
if (event.type === 'assistant/chunk') {
|
|
1031
|
-
if (handledAssistantChunks.has(event.seq))
|
|
1032
|
-
break;
|
|
1033
|
-
handledAssistantChunks.add(event.seq);
|
|
1034
|
-
const data = event.data;
|
|
1035
|
-
renderStreamChunk(data.turn, data.step, data.chunk, event.time, event.seq);
|
|
1036
|
-
break;
|
|
1037
|
-
}
|
|
1038
|
-
// dsh-tool-todo owns this optional module augmentation in alpha.2.
|
|
1039
|
-
// Match by name so the TUI remains loadable without that plugin.
|
|
1040
|
-
if (event.type === 'todo/write') {
|
|
1041
|
-
const todos = todoPanelItems(event.data);
|
|
1042
|
-
if (todos !== undefined)
|
|
1043
|
-
state.todos = todos;
|
|
1044
|
-
break;
|
|
1045
|
-
}
|
|
1046
|
-
// Logged preset switch (blank sessions only, issue #8): a transcript
|
|
1047
|
-
// marker so a replayed log shows which composition produced the
|
|
1048
|
-
// turns after it. Not in dsh-session's typed union — matched here by
|
|
1049
|
-
// name, like the other plugin-defined events above.
|
|
1050
|
-
if (event.type === 'agent-preset/selected') {
|
|
1051
|
-
const data = event.data;
|
|
1052
|
-
const recordedPreset = typeof data.agentPreset === 'string' ? data.agentPreset : undefined;
|
|
1053
|
-
const renamedOfficialPreset = (recordedPreset === 'code' && state.agentPreset === 'ptc') ||
|
|
1054
|
-
(recordedPreset === 'ptc' && state.agentPreset === 'code');
|
|
1055
|
-
const preset = renamedOfficialPreset && state.agentPreset !== undefined
|
|
1056
|
-
? state.agentPreset
|
|
1057
|
-
: recordedPreset ?? 'unknown';
|
|
1058
|
-
appendRow({
|
|
1059
|
-
id: deps.rowIds.value,
|
|
1060
|
-
kind: 'notice',
|
|
1061
|
-
text: t('agent-preset-switched', { preset }),
|
|
1062
|
-
});
|
|
1063
|
-
deps.rowIds.value += 1;
|
|
1064
|
-
break;
|
|
1065
|
-
}
|
|
1066
|
-
// `/color` accent (dsh-tui plugin event, replayed on resume/rewind
|
|
1067
|
-
// like session/title): last write wins, '' clears to the default.
|
|
1068
|
-
if (event.type === 'session/color') {
|
|
1069
|
-
const data = event.data;
|
|
1070
|
-
state.sessionColor = typeof data.color === 'string' ? data.color : '';
|
|
1071
|
-
break;
|
|
1072
|
-
}
|
|
1073
|
-
// The compaction bracket is a plugin-appended event pair (not part of
|
|
1074
|
-
// dsh-session's typed map). Opening it here rather than in the manual
|
|
1075
|
-
// path is what makes an AUTOMATIC pressure compaction visible too: the
|
|
1076
|
-
// host writes `compaction/start` before the summarizer runs and
|
|
1077
|
-
// `compaction/end` once the checkpoint is committed or abandoned.
|
|
1078
|
-
// A manual request already installed its own cancellable row, so this
|
|
1079
|
-
// only fills the gap for one this process did not start.
|
|
1080
|
-
if (event.type === 'compaction/start') {
|
|
1081
|
-
// Replay is settled history, and a process killed between start and
|
|
1082
|
-
// end leaves an unmatched start in the log: painting a row for it
|
|
1083
|
-
// would show a compaction that nothing will ever clear.
|
|
1084
|
-
if (!replaying && state.compaction === undefined) {
|
|
1085
|
-
state.compaction = {
|
|
1086
|
-
startedAt: typeof event.time === 'number' ? event.time : Date.now(),
|
|
1087
|
-
phase: 'prefill',
|
|
1088
|
-
outputChars: 0,
|
|
1089
|
-
cancellable: false,
|
|
1090
|
-
};
|
|
1091
|
-
}
|
|
1092
|
-
break;
|
|
1093
|
-
}
|
|
1094
|
-
if (event.type === 'compaction/end') {
|
|
1095
|
-
state.compaction = undefined;
|
|
1096
|
-
break;
|
|
1097
|
-
}
|
|
1098
|
-
// Custom plugin events (tuiRenderers seam): a registered renderer
|
|
1099
|
-
// maps the payload to text rows — title as a local row, body as
|
|
1100
|
-
// preview-clipped local-output rows, same shape pushLocal uses.
|
|
1101
|
-
// Runs on the live stream AND on replay (resume/rewind), so the
|
|
1102
|
-
// projection must stay total; the runtime isolates renderer
|
|
1103
|
-
// crashes per type.
|
|
1104
|
-
if (deps.renderer !== undefined) {
|
|
1105
|
-
const rendered = deps.renderer.render(event.type, event.data);
|
|
1106
|
-
if (rendered !== undefined) {
|
|
1107
|
-
if (rendered.title !== undefined && rendered.title !== '') {
|
|
1108
|
-
appendRow({ id: deps.rowIds.value, kind: 'local', text: rendered.title });
|
|
1109
|
-
deps.rowIds.value += 1;
|
|
1110
|
-
}
|
|
1111
|
-
for (const line of rendered.lines) {
|
|
1112
|
-
appendRow({
|
|
1113
|
-
id: deps.rowIds.value,
|
|
1114
|
-
kind: 'local-output',
|
|
1115
|
-
text: preview(String(line), LOCAL_OUTPUT_LIMIT),
|
|
1116
|
-
});
|
|
1117
|
-
deps.rowIds.value += 1;
|
|
1118
|
-
}
|
|
1119
|
-
}
|
|
1120
|
-
}
|
|
1121
|
-
break;
|
|
1122
|
-
}
|
|
1123
|
-
};
|
|
1124
|
-
function reset() {
|
|
1125
|
-
streaming = undefined;
|
|
1126
|
-
reasoning = undefined;
|
|
1127
|
-
sealedReasoning.length = 0;
|
|
1128
|
-
lastReasoningRow = undefined;
|
|
1129
|
-
toolCards.clear();
|
|
1130
|
-
askCalls.clear();
|
|
1131
|
-
handledAssistantMessages.clear();
|
|
1132
|
-
handledAssistantChunks.clear();
|
|
1133
|
-
openStep = undefined;
|
|
1134
|
-
activeAttempt = undefined;
|
|
1135
|
-
lastStreamRevision = -1;
|
|
1136
|
-
eventModel = undefined;
|
|
1137
|
-
assistantRowsByStep.clear();
|
|
1138
|
-
lastTextDelta.clear();
|
|
1139
|
-
tpsTurn = undefined;
|
|
1140
|
-
tpsStep = undefined;
|
|
1141
|
-
tpsTurnDecodeMs = 0;
|
|
1142
|
-
tpsTurnDecodeTokens = 0;
|
|
1143
|
-
tpsTurnSampled = false;
|
|
1144
|
-
}
|
|
1145
|
-
return { reset, replayEvents, renderEvent, renderStreamFrame, settleStreaming, updateSpinnerMode, presentCallView, presentResultView, textOf, firstTextOf };
|
|
1146
41
|
}
|