@songsid/agend 2.3.4-beta.6 → 2.3.5-alpha.2
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 +2 -0
- package/README.zh-TW.md +2 -0
- package/THIRD_PARTY_NOTICES.md +53 -0
- package/dist/agent-endpoint.d.ts +5 -1
- package/dist/agent-endpoint.js +12 -2
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/backend/claude-code.d.ts +15 -12
- package/dist/backend/claude-code.js +137 -133
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-package.d.ts +5 -2
- package/dist/backend/codex-package.js +1 -5
- package/dist/backend/codex-package.js.map +1 -1
- package/dist/backend/codex.d.ts +136 -113
- package/dist/backend/codex.js +1271 -1219
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok-model-cache.d.ts +7 -0
- package/dist/backend/grok-model-cache.js +65 -0
- package/dist/backend/grok-model-cache.js.map +1 -0
- package/dist/backend/grok.d.ts +2 -0
- package/dist/backend/grok.js +22 -0
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/native-pane.d.ts +9 -0
- package/dist/backend/native-pane.js +59 -0
- package/dist/backend/native-pane.js.map +1 -0
- package/dist/backend/types.d.ts +7 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/ipc-bridge.d.ts +2 -0
- package/dist/channel/mcp-tools.js +1 -1
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +59 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +62 -5
- package/dist/daemon.js +749 -267
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +15 -3
- package/dist/delivery-consumed-watch.js +23 -1
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-outbox.d.ts +5 -0
- package/dist/delivery-outbox.js +32 -4
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +2 -35
- package/dist/delivery-reconciliation.js +2 -156
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/fleet-context.d.ts +2 -2
- package/dist/fleet-level-config.d.ts +1 -1
- package/dist/fleet-level-config.js +2 -0
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +125 -2
- package/dist/fleet-manager.js +1157 -27
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-windows-runtime.d.ts +92 -0
- package/dist/fleet-windows-runtime.js +373 -0
- package/dist/fleet-windows-runtime.js.map +1 -0
- package/dist/instance-config-impact.js +4 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +20 -3
- package/dist/instance-lifecycle.js +358 -156
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/local-pane-endpoint.d.ts +46 -0
- package/dist/local-pane-endpoint.js +189 -0
- package/dist/local-pane-endpoint.js.map +1 -0
- package/dist/local-pane-launcher.d.ts +2 -0
- package/dist/local-pane-launcher.js +38 -0
- package/dist/local-pane-launcher.js.map +1 -0
- package/dist/local-pane-stage.ps1 +101 -0
- package/dist/locale.js +34 -0
- package/dist/locale.js.map +1 -1
- package/dist/model-catalog-defaults.d.ts +14 -0
- package/dist/model-catalog-defaults.js +20 -0
- package/dist/model-catalog-defaults.js.map +1 -0
- package/dist/native-agent-admission.d.ts +7 -0
- package/dist/native-agent-admission.js +26 -0
- package/dist/native-agent-admission.js.map +1 -0
- package/dist/native-daemon-client.d.ts +13 -0
- package/dist/native-daemon-client.js +28 -0
- package/dist/native-daemon-client.js.map +1 -0
- package/dist/native-instance-api.d.ts +14 -0
- package/dist/native-instance-api.js +205 -0
- package/dist/native-instance-api.js.map +1 -0
- package/dist/native-instance-input.d.ts +84 -0
- package/dist/native-instance-input.js +54 -0
- package/dist/native-instance-input.js.map +1 -0
- package/dist/native-instance-registry.d.ts +32 -0
- package/dist/native-instance-registry.js +105 -0
- package/dist/native-instance-registry.js.map +1 -0
- package/dist/native-mcp.d.ts +40 -0
- package/dist/native-mcp.js +278 -0
- package/dist/native-mcp.js.map +1 -0
- package/dist/native-model-catalog.d.ts +5 -0
- package/dist/native-model-catalog.js +76 -0
- package/dist/native-model-catalog.js.map +1 -0
- package/dist/native-pane-crash-budget.d.ts +20 -0
- package/dist/native-pane-crash-budget.js +60 -0
- package/dist/native-pane-crash-budget.js.map +1 -0
- package/dist/native-pane-create.d.ts +26 -0
- package/dist/native-pane-create.js +53 -0
- package/dist/native-pane-create.js.map +1 -0
- package/dist/native-pane-lifecycle.d.ts +65 -0
- package/dist/native-pane-lifecycle.js +227 -0
- package/dist/native-pane-lifecycle.js.map +1 -0
- package/dist/native-pane-manager.d.ts +58 -0
- package/dist/native-pane-manager.js +563 -0
- package/dist/native-pane-manager.js.map +1 -0
- package/dist/native-pane-output-log.d.ts +15 -0
- package/dist/native-pane-output-log.js +108 -0
- package/dist/native-pane-output-log.js.map +1 -0
- package/dist/native-pane-reconciliation.d.ts +4 -0
- package/dist/native-pane-reconciliation.js +40 -0
- package/dist/native-pane-reconciliation.js.map +1 -0
- package/dist/native-pane-recovery.d.ts +12 -0
- package/dist/native-pane-recovery.js +10 -0
- package/dist/native-pane-recovery.js.map +1 -0
- package/dist/native-pane-tools.d.ts +2 -0
- package/dist/native-pane-tools.js +14 -0
- package/dist/native-pane-tools.js.map +1 -0
- package/dist/needs-you-hub.d.ts +2 -0
- package/dist/needs-you-hub.js +1 -0
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +12 -1
- package/dist/needs-you.js +8 -1
- package/dist/needs-you.js.map +1 -1
- package/dist/outbound-handlers.d.ts +16 -2
- package/dist/outbound-handlers.js +67 -3
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +38 -0
- package/dist/outbound-schemas.js +12 -0
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pane-port.d.ts +107 -0
- package/dist/pane-port.js +2 -0
- package/dist/pane-port.js.map +1 -0
- package/dist/runtime-api.d.ts +8 -0
- package/dist/runtime-api.js +96 -0
- package/dist/runtime-api.js.map +1 -0
- package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +21 -0
- package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
- package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +19 -0
- package/dist/runtime-assets/@xterm/addon-serialize/package.json +29 -0
- package/dist/runtime-assets/@xterm/headless/LICENSE +21 -0
- package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +2 -0
- package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +46 -0
- package/dist/runtime-assets/@xterm/headless/package.json +29 -0
- package/dist/runtime-assets/node-pty/CONPTY-LICENSE +21 -0
- package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +503 -0
- package/dist/runtime-assets/node-pty/LICENSE +69 -0
- package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +16 -0
- package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +47 -0
- package/dist/runtime-assets/node-pty/lib/index.js +52 -0
- package/dist/runtime-assets/node-pty/lib/interfaces.js +7 -0
- package/dist/runtime-assets/node-pty/lib/shared/conout.js +11 -0
- package/dist/runtime-assets/node-pty/lib/terminal.js +190 -0
- package/dist/runtime-assets/node-pty/lib/types.js +7 -0
- package/dist/runtime-assets/node-pty/lib/unixTerminal.js +346 -0
- package/dist/runtime-assets/node-pty/lib/utils.js +39 -0
- package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +125 -0
- package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +320 -0
- package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +199 -0
- package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +22 -0
- package/dist/runtime-assets/node-pty/package.json +64 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/dist/runtime-bundle.d.ts +17 -0
- package/dist/runtime-bundle.js +147 -0
- package/dist/runtime-bundle.js.map +1 -0
- package/dist/runtime-cli.d.ts +2 -0
- package/dist/runtime-cli.js +117 -0
- package/dist/runtime-cli.js.map +1 -0
- package/dist/runtime-client-store.d.ts +49 -0
- package/dist/runtime-client-store.js +292 -0
- package/dist/runtime-client-store.js.map +1 -0
- package/dist/runtime-client.d.ts +100 -0
- package/dist/runtime-client.js +700 -0
- package/dist/runtime-client.js.map +1 -0
- package/dist/runtime-coordinator.d.ts +82 -0
- package/dist/runtime-coordinator.js +864 -0
- package/dist/runtime-coordinator.js.map +1 -0
- package/dist/runtime-pane-assets.d.ts +17 -0
- package/dist/runtime-pane-assets.js +23 -0
- package/dist/runtime-pane-assets.js.map +1 -0
- package/dist/runtime-pane-boot.d.ts +2 -0
- package/dist/runtime-pane-boot.js +24 -0
- package/dist/runtime-pane-boot.js.map +1 -0
- package/dist/runtime-pane-codex-index.d.ts +1 -0
- package/dist/runtime-pane-codex-index.js +47 -0
- package/dist/runtime-pane-codex-index.js.map +1 -0
- package/dist/runtime-pane-config.d.ts +16 -0
- package/dist/runtime-pane-config.js +54 -0
- package/dist/runtime-pane-config.js.map +1 -0
- package/dist/runtime-pane-host.d.ts +43 -0
- package/dist/runtime-pane-host.js +403 -0
- package/dist/runtime-pane-host.js.map +1 -0
- package/dist/runtime-pane-job-owner.d.ts +1 -0
- package/dist/runtime-pane-job-owner.js +29 -0
- package/dist/runtime-pane-job-owner.js.map +1 -0
- package/dist/runtime-pane-job.ps1 +116 -0
- package/dist/runtime-pane-link.d.ts +40 -0
- package/dist/runtime-pane-link.js +246 -0
- package/dist/runtime-pane-link.js.map +1 -0
- package/dist/runtime-pane-mcp-protocol.d.ts +32 -0
- package/dist/runtime-pane-mcp-protocol.js +39 -0
- package/dist/runtime-pane-mcp-protocol.js.map +1 -0
- package/dist/runtime-pane-mcp-relay.d.ts +17 -0
- package/dist/runtime-pane-mcp-relay.js +70 -0
- package/dist/runtime-pane-mcp-relay.js.map +1 -0
- package/dist/runtime-pane-mcp.d.ts +43 -0
- package/dist/runtime-pane-mcp.js +137 -0
- package/dist/runtime-pane-mcp.js.map +1 -0
- package/dist/runtime-pane-native.d.ts +45 -0
- package/dist/runtime-pane-native.js +65 -0
- package/dist/runtime-pane-native.js.map +1 -0
- package/dist/runtime-pane-output.d.ts +19 -0
- package/dist/runtime-pane-output.js +53 -0
- package/dist/runtime-pane-output.js.map +1 -0
- package/dist/runtime-pane-port.d.ts +134 -0
- package/dist/runtime-pane-port.js +537 -0
- package/dist/runtime-pane-port.js.map +1 -0
- package/dist/runtime-pane-private.d.ts +14 -0
- package/dist/runtime-pane-private.js +51 -0
- package/dist/runtime-pane-private.js.map +1 -0
- package/dist/runtime-pane-private.ps1 +14 -0
- package/dist/runtime-pane-process.d.ts +4 -0
- package/dist/runtime-pane-process.js +108 -0
- package/dist/runtime-pane-process.js.map +1 -0
- package/dist/runtime-pane-protocol.d.ts +169 -0
- package/dist/runtime-pane-protocol.js +189 -0
- package/dist/runtime-pane-protocol.js.map +1 -0
- package/dist/runtime-pane-screen.d.ts +19 -0
- package/dist/runtime-pane-screen.js +76 -0
- package/dist/runtime-pane-screen.js.map +1 -0
- package/dist/runtime-pane-service.d.ts +11 -0
- package/dist/runtime-pane-service.js +221 -0
- package/dist/runtime-pane-service.js.map +1 -0
- package/dist/runtime-pane-stdio-protocol.d.ts +54 -0
- package/dist/runtime-pane-stdio-protocol.js +94 -0
- package/dist/runtime-pane-stdio-protocol.js.map +1 -0
- package/dist/runtime-pane-stdio.d.ts +3 -0
- package/dist/runtime-pane-stdio.js +123 -0
- package/dist/runtime-pane-stdio.js.map +1 -0
- package/dist/runtime-pane-store.d.ts +33 -0
- package/dist/runtime-pane-store.js +164 -0
- package/dist/runtime-pane-store.js.map +1 -0
- package/dist/runtime-pane-transcript-protocol.d.ts +43 -0
- package/dist/runtime-pane-transcript-protocol.js +58 -0
- package/dist/runtime-pane-transcript-protocol.js.map +1 -0
- package/dist/runtime-pane-transcript.d.ts +45 -0
- package/dist/runtime-pane-transcript.js +605 -0
- package/dist/runtime-pane-transcript.js.map +1 -0
- package/dist/runtime-pane-worker.d.ts +1 -0
- package/dist/runtime-pane-worker.js +154 -0
- package/dist/runtime-pane-worker.js.map +1 -0
- package/dist/runtime-protocol.d.ts +149 -0
- package/dist/runtime-protocol.js +19 -0
- package/dist/runtime-protocol.js.map +1 -0
- package/dist/runtime-switches.d.ts +79 -0
- package/dist/runtime-switches.js +90 -0
- package/dist/runtime-switches.js.map +1 -0
- package/dist/runtime-transcript-delta-reader.d.ts +23 -0
- package/dist/runtime-transcript-delta-reader.js +74 -0
- package/dist/runtime-transcript-delta-reader.js.map +1 -0
- package/dist/runtime-transcript-source.d.ts +36 -0
- package/dist/runtime-transcript-source.js +189 -0
- package/dist/runtime-transcript-source.js.map +1 -0
- package/dist/runtime-windows-bridge.d.ts +41 -0
- package/dist/runtime-windows-bridge.js +157 -0
- package/dist/runtime-windows-bridge.js.map +1 -0
- package/dist/settings-api.js +58 -0
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +28 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +15 -1
- package/dist/settings-confirmation.js +46 -9
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.js +23 -1
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +11 -2
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/tmux-control.d.ts +2 -1
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +2 -1
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-pane-host.d.ts +26 -0
- package/dist/tmux-pane-host.js +25 -0
- package/dist/tmux-pane-host.js.map +1 -0
- package/dist/topic-commands.js +3 -0
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.d.ts +1 -1
- package/dist/transcript-delta-reader.js +1 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-monitor.d.ts +3 -0
- package/dist/transcript-monitor.js +22 -46
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-needles.d.ts +35 -0
- package/dist/transcript-needles.js +158 -0
- package/dist/transcript-needles.js.map +1 -0
- package/dist/transcript-records.d.ts +21 -0
- package/dist/transcript-records.js +140 -0
- package/dist/transcript-records.js.map +1 -0
- package/dist/transcript-sources.d.ts +5 -0
- package/dist/transcript-sources.js +8 -79
- package/dist/transcript-sources.js.map +1 -1
- package/dist/types.d.ts +21 -0
- package/dist/ui/agent-proposals.js +90 -0
- package/dist/ui/agent-runtime.js +106 -0
- package/dist/ui/chat-store.js +13 -2
- package/dist/ui/chat-strings.js +48 -0
- package/dist/ui/cli-picker.js +42 -0
- package/dist/ui/native-instance-settings.js +47 -0
- package/dist/ui/native-pane-recovery.js +45 -0
- package/dist/ui/panel-chat.js +61 -32
- package/dist/ui/panel-details.js +2 -1
- package/dist/ui/panel-fleet.js +99 -18
- package/dist/ui/panel-needs.js +152 -3
- package/dist/ui/panel-runtimes.js +231 -0
- package/dist/ui/panel-settings.js +14 -8
- package/dist/ui/panel-windows-agent.js +86 -0
- package/dist/ui/panel-windows-cli.js +143 -0
- package/dist/ui/provider-marks.js +83 -0
- package/dist/ui/runtime-catalog.js +55 -0
- package/dist/ui/settings-catalog.js +37 -10
- package/dist/ui/settings-confirm.js +3 -1
- package/dist/ui/settings-dialogs.js +14 -5
- package/dist/ui/settings-registry.js +5 -0
- package/dist/ui/settings-strings.js +14 -0
- package/dist/ui/shared/app-i18n.js +2 -2
- package/dist/ui/shared/app-route.js +6 -2
- package/dist/ui/shared/app-shell.js +3 -2
- package/dist/ui/shared/app-store.js +1 -0
- package/dist/ui/shared/app-stream.js +3 -1
- package/dist/ui/shared/app.css +301 -0
- package/dist/ui/shared/app.js +4 -0
- package/dist/ui/shared/header-tools.js +6 -4
- package/dist/ui/shared/instance-nav.js +20 -4
- package/dist/ui/shared/instance-switch.js +4 -3
- package/dist/ui/shared/ui-menu.js +28 -8
- package/dist/ui/shared/view-strings.js +6 -0
- package/dist/ui/windows-agents-nav.js +2 -0
- package/dist/ui/windows-cli-catalog.js +79 -0
- package/dist/update-check.d.ts +8 -2
- package/dist/update-check.js +5 -2
- package/dist/update-check.js.map +1 -1
- package/dist/web-api.d.ts +25 -0
- package/dist/web-api.js +171 -6
- package/dist/web-api.js.map +1 -1
- package/dist/web-chat-history.d.ts +19 -2
- package/dist/web-chat-history.js +72 -3
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-shell-routes.d.ts +4 -1
- package/dist/web-shell-routes.js +7 -2
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/windows-agents.d.ts +112 -0
- package/dist/windows-agents.js +463 -0
- package/dist/windows-agents.js.map +1 -0
- package/dist/windows-cli-api.d.ts +23 -0
- package/dist/windows-cli-api.js +158 -0
- package/dist/windows-cli-api.js.map +1 -0
- package/dist/windows-cli-providers.d.ts +115 -0
- package/dist/windows-cli-providers.js +429 -0
- package/dist/windows-cli-providers.js.map +1 -0
- package/dist/windows-cli-worker.d.ts +58 -0
- package/dist/windows-cli-worker.js +479 -0
- package/dist/windows-cli-worker.js.map +1 -0
- package/dist/windows-cli.d.ts +115 -0
- package/dist/windows-cli.js +402 -0
- package/dist/windows-cli.js.map +1 -0
- package/dist/windows-native-mcp.d.ts +19 -0
- package/dist/windows-native-mcp.js +143 -0
- package/dist/windows-native-mcp.js.map +1 -0
- package/dist/windows-pane-mcp.d.ts +26 -0
- package/dist/windows-pane-mcp.js +187 -0
- package/dist/windows-pane-mcp.js.map +1 -0
- package/package.json +9 -3
- package/templates/runtime-assets/conpty-LICENSE +21 -0
- package/templates/runtime-assets/conpty-NOTICE.md +503 -0
- package/templates/runtime-assets/local-pane-stage.ps1 +101 -0
- package/templates/runtime-assets/runtime-pane-job.ps1 +116 -0
- package/templates/runtime-assets/runtime-pane-private.ps1 +14 -0
- package/templates/runtime-assets/xterm-LICENSE +21 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a delivery's marker turned up in a transcript delta:
|
|
3
|
+
* - `user` — the CLI consumed it as a user message of its own (the strongest signal);
|
|
4
|
+
* - `absorbed` — consumed INTO a running turn at a tool boundary (#1201). Claude Code 2.1.293 writes no user entry for
|
|
5
|
+
* that: a `queue-operation` remove with `reason: "absorbed_mid_turn"` and an `attachment` of type `queued_command`
|
|
6
|
+
* whose `prompt` is the message (tests/fixtures/claude-2.1.293-steer-consumed-mid-turn.transcript.jsonl);
|
|
7
|
+
* - `queued` — Claude Code's queue-operation enqueue: accepted into its input queue, not consumed yet.
|
|
8
|
+
* Consumed means `user` or `absorbed`.
|
|
9
|
+
*/
|
|
10
|
+
export type TranscriptMarkerKind = "user" | "absorbed" | "queued";
|
|
11
|
+
/** Whether a marker kind means the CLI took the message (as its own turn, or into the running one). */
|
|
12
|
+
export declare function markerConsumed(kind: TranscriptMarkerKind | null | undefined): kind is "user" | "absorbed";
|
|
13
|
+
export declare function transcriptDeltaDeliveryMarker(rawDelta: string, backend: string, deliveryId: string): TranscriptMarkerKind | null;
|
|
14
|
+
/**
|
|
15
|
+
* What a transcript proof looks for: an enveloped delivery's id marker (a delivery id string), or — for a raw paste,
|
|
16
|
+
* which carries no envelope (a silent schedule, a system command) — its exact text (#1647).
|
|
17
|
+
*/
|
|
18
|
+
export type TranscriptNeedle = string | {
|
|
19
|
+
readonly rawText: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* #1647: a raw paste's exact text as a user entry of the CLI's own — a message that, whitespace aside and without Claude
|
|
23
|
+
* Code's paste wrapper, IS the pasted text — is the record of the turn that took the paste. The delta starts at the
|
|
24
|
+
* checkpoint taken before the write, so an earlier copy of the same words (a schedule repeats them every run) is never
|
|
25
|
+
* in it. A quote of the text inside a longer message, a tool result or a queued entry is not. Raw text is not unique
|
|
26
|
+
* the way a delivery marker is: the caller must hold a transcript that belongs to the target alone (#1663 P1-2).
|
|
27
|
+
*/
|
|
28
|
+
export declare function transcriptDeltaHasRawText(rawDelta: string, backend: string, rawText: string): boolean;
|
|
29
|
+
/** One needle against one delta: the marker's kind, `user` for a raw paste's own entry, or null. */
|
|
30
|
+
export declare function transcriptDeltaNeedle(rawDelta: string, backend: string, needle: TranscriptNeedle): TranscriptMarkerKind | null;
|
|
31
|
+
/**
|
|
32
|
+
* Whether the CLI consumed the delivery: its unique marker at the start of a persisted user-message body, or of the
|
|
33
|
+
* message Claude Code absorbed into a running turn (#1201).
|
|
34
|
+
*/
|
|
35
|
+
export declare function transcriptDeltaHasDeliveryMarker(rawDelta: string, backend: string, deliveryId: string): boolean;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/** Pure consumed/absorbed/queued and raw-paste proof grammar shared by local and native readers. */
|
|
2
|
+
import { normalizeTurnText } from "./transcript-turns.js";
|
|
3
|
+
const ENTER_MARKER = (deliveryId) => `[agend-delivery-id:${deliveryId}]`;
|
|
4
|
+
function userTextsFromEntry(entry, backend) {
|
|
5
|
+
if (!entry || typeof entry !== "object")
|
|
6
|
+
return [];
|
|
7
|
+
const value = entry;
|
|
8
|
+
if (backend === "claude-code") {
|
|
9
|
+
const message = value.message;
|
|
10
|
+
if (value.type !== "user" || message?.role !== "user")
|
|
11
|
+
return [];
|
|
12
|
+
const content = message.content;
|
|
13
|
+
if (typeof content === "string")
|
|
14
|
+
return [content];
|
|
15
|
+
if (!Array.isArray(content))
|
|
16
|
+
return [];
|
|
17
|
+
return content.filter((item) => item?.type === "text" && typeof item.text === "string")
|
|
18
|
+
.map((item) => item.text);
|
|
19
|
+
}
|
|
20
|
+
if (backend === "codex") {
|
|
21
|
+
const payload = value.payload;
|
|
22
|
+
if (value.type !== "response_item" || payload?.type !== "message" || payload?.role !== "user")
|
|
23
|
+
return [];
|
|
24
|
+
if (!Array.isArray(payload.content))
|
|
25
|
+
return [];
|
|
26
|
+
return payload.content.filter((item) => item?.type === "input_text" && typeof item.text === "string")
|
|
27
|
+
.map((item) => item.text);
|
|
28
|
+
}
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Claude Code persists a pasted message wrapped in `\n\n<pasted_content id="<hex>">\n` — every paste, small or large
|
|
33
|
+
* (seen on all 640 delivery entries of 2.1.284–2.1.289, none of which begins with the marker itself). The wrapper is the
|
|
34
|
+
* CLI's own, in a fixed shape, so it is the one thing allowed in front of the marker; anything else in front still
|
|
35
|
+
* disqualifies the entry.
|
|
36
|
+
*/
|
|
37
|
+
const CLAUDE_PASTE_WRAPPER = /^\s*<pasted_content id="[0-9a-f]+">\r?\n/;
|
|
38
|
+
/** A unique marker counts only at the start of a persisted body (after the CLI's own paste wrapper, if it adds one). */
|
|
39
|
+
function leadsWithMarker(text, backend, marker) {
|
|
40
|
+
if (text.startsWith(marker))
|
|
41
|
+
return true;
|
|
42
|
+
if (backend !== "claude-code")
|
|
43
|
+
return false;
|
|
44
|
+
const wrapper = CLAUDE_PASTE_WRAPPER.exec(text);
|
|
45
|
+
return !!wrapper && text.startsWith(marker, wrapper[0].length);
|
|
46
|
+
}
|
|
47
|
+
/** Whether a marker kind means the CLI took the message (as its own turn, or into the running one). */
|
|
48
|
+
export function markerConsumed(kind) {
|
|
49
|
+
return kind === "user" || kind === "absorbed";
|
|
50
|
+
}
|
|
51
|
+
/** Claude Code's record of a queued message absorbed into the running turn: the message's own text, or null. */
|
|
52
|
+
function claudeAbsorbedText(value) {
|
|
53
|
+
if (value.type === "attachment" && value.attachment?.type === "queued_command" && typeof value.attachment.prompt === "string") {
|
|
54
|
+
return value.attachment.prompt;
|
|
55
|
+
}
|
|
56
|
+
if (value.type === "queue-operation" && value.operation === "remove" && value.reason === "absorbed_mid_turn"
|
|
57
|
+
&& typeof value.content === "string")
|
|
58
|
+
return value.content;
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
export function transcriptDeltaDeliveryMarker(rawDelta, backend, deliveryId) {
|
|
62
|
+
const marker = ENTER_MARKER(deliveryId);
|
|
63
|
+
let queued = false;
|
|
64
|
+
let absorbed = false;
|
|
65
|
+
for (const line of rawDelta.split(/\r?\n/)) {
|
|
66
|
+
if (!line.trim())
|
|
67
|
+
continue;
|
|
68
|
+
try {
|
|
69
|
+
const entry = JSON.parse(line);
|
|
70
|
+
const firstUserText = userTextsFromEntry(entry, backend)[0];
|
|
71
|
+
if (firstUserText !== undefined && leadsWithMarker(firstUserText, backend, marker))
|
|
72
|
+
return "user";
|
|
73
|
+
const value = entry;
|
|
74
|
+
if (backend !== "claude-code" || !value || typeof value !== "object")
|
|
75
|
+
continue;
|
|
76
|
+
const absorbedText = claudeAbsorbedText(value);
|
|
77
|
+
if (absorbedText !== null && leadsWithMarker(absorbedText, backend, marker))
|
|
78
|
+
absorbed = true;
|
|
79
|
+
if (value.type === "queue-operation" && value.operation === "enqueue"
|
|
80
|
+
&& typeof value.content === "string" && leadsWithMarker(value.content, backend, marker))
|
|
81
|
+
queued = true;
|
|
82
|
+
}
|
|
83
|
+
catch { /* incomplete/malformed JSONL is not proof */ }
|
|
84
|
+
}
|
|
85
|
+
return absorbed ? "absorbed" : queued ? "queued" : null;
|
|
86
|
+
}
|
|
87
|
+
/** Claude Code's closing tag after a persisted paste: `</pasted_content id="<hex>">` (seen on 2.1.29x transcripts). */
|
|
88
|
+
const CLAUDE_PASTE_WRAPPER_END = /\r?\n?<\/pasted_content id="[0-9a-f]+">\s*$/;
|
|
89
|
+
/**
|
|
90
|
+
* #1663 P1-1: the user message's ORIGINAL body when it is one piece of text and nothing else — Claude Code's string
|
|
91
|
+
* content, or a content list of exactly one text block; Codex's content of exactly one input_text. Anything else (a
|
|
92
|
+
* second block of any kind: more text, an image, a file) is not a plain text message, so it is no raw paste's own
|
|
93
|
+
* entry: null. (userTextsFromEntry, which the marker match shares, keeps only the text blocks — not this question.)
|
|
94
|
+
*/
|
|
95
|
+
function soleUserText(entry, backend) {
|
|
96
|
+
if (!entry || typeof entry !== "object")
|
|
97
|
+
return null;
|
|
98
|
+
const value = entry;
|
|
99
|
+
const sole = (content, type) => Array.isArray(content) && content.length === 1 && content[0]?.type === type && typeof content[0].text === "string" ? content[0].text : null;
|
|
100
|
+
if (backend === "claude-code") {
|
|
101
|
+
const message = value.message;
|
|
102
|
+
if (value.type !== "user" || message?.role !== "user")
|
|
103
|
+
return null;
|
|
104
|
+
return typeof message.content === "string" ? message.content : sole(message.content, "text");
|
|
105
|
+
}
|
|
106
|
+
if (backend === "codex") {
|
|
107
|
+
const payload = value.payload;
|
|
108
|
+
if (value.type !== "response_item" || payload?.type !== "message" || payload?.role !== "user")
|
|
109
|
+
return null;
|
|
110
|
+
return sole(payload.content, "input_text");
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
/** A persisted user body without the CLI's own paste wrapper (claude-code wraps a long paste in both tags). */
|
|
115
|
+
function withoutPasteWrapper(text, backend) {
|
|
116
|
+
if (backend !== "claude-code")
|
|
117
|
+
return text;
|
|
118
|
+
const open = CLAUDE_PASTE_WRAPPER.exec(text);
|
|
119
|
+
return open ? text.slice(open[0].length).replace(CLAUDE_PASTE_WRAPPER_END, "") : text;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* #1647: a raw paste's exact text as a user entry of the CLI's own — a message that, whitespace aside and without Claude
|
|
123
|
+
* Code's paste wrapper, IS the pasted text — is the record of the turn that took the paste. The delta starts at the
|
|
124
|
+
* checkpoint taken before the write, so an earlier copy of the same words (a schedule repeats them every run) is never
|
|
125
|
+
* in it. A quote of the text inside a longer message, a tool result or a queued entry is not. Raw text is not unique
|
|
126
|
+
* the way a delivery marker is: the caller must hold a transcript that belongs to the target alone (#1663 P1-2).
|
|
127
|
+
*/
|
|
128
|
+
export function transcriptDeltaHasRawText(rawDelta, backend, rawText) {
|
|
129
|
+
const wanted = normalizeTurnText(rawText);
|
|
130
|
+
if (!wanted)
|
|
131
|
+
return false;
|
|
132
|
+
for (const line of rawDelta.split(/\r?\n/)) {
|
|
133
|
+
if (!line.trim())
|
|
134
|
+
continue;
|
|
135
|
+
try {
|
|
136
|
+
// The WHOLE user message must be the paste: its original body is one text and nothing else (#1663 P1-1).
|
|
137
|
+
const body = soleUserText(JSON.parse(line), backend);
|
|
138
|
+
if (body !== null && normalizeTurnText(withoutPasteWrapper(body, backend)) === wanted)
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
catch { /* incomplete/malformed JSONL is not proof */ }
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
/** One needle against one delta: the marker's kind, `user` for a raw paste's own entry, or null. */
|
|
146
|
+
export function transcriptDeltaNeedle(rawDelta, backend, needle) {
|
|
147
|
+
if (typeof needle === "string")
|
|
148
|
+
return transcriptDeltaDeliveryMarker(rawDelta, backend, needle);
|
|
149
|
+
return transcriptDeltaHasRawText(rawDelta, backend, needle.rawText) ? "user" : null;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Whether the CLI consumed the delivery: its unique marker at the start of a persisted user-message body, or of the
|
|
153
|
+
* message Claude Code absorbed into a running turn (#1201).
|
|
154
|
+
*/
|
|
155
|
+
export function transcriptDeltaHasDeliveryMarker(rawDelta, backend, deliveryId) {
|
|
156
|
+
return markerConsumed(transcriptDeltaDeliveryMarker(rawDelta, backend, deliveryId));
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=transcript-needles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-needles.js","sourceRoot":"","sources":["../src/transcript-needles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Provider record grammar only. No filesystem, SQLite, backend construction or account access. */
|
|
2
|
+
import type { TranscriptEvents } from "./transcript-sources.js";
|
|
3
|
+
import type { TranscriptTurnEvent } from "./transcript-turns.js";
|
|
4
|
+
export type TranscriptRecordEvent = ["tool_use", string, unknown] | ["tool_result", string, unknown] | ["assistant_text", string] | ["system_informational", string] | ["api_error", string, number | null, number | null, string | null] | ["user_prompt"];
|
|
5
|
+
export interface CodexRecordState {
|
|
6
|
+
openTurnId: string;
|
|
7
|
+
openTurn: string | null;
|
|
8
|
+
turnKnown: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** The package root a rollout tool output reports a missing code-mode host under, or null. */
|
|
11
|
+
export declare function codexCodeModeHostMissingRoot(output: unknown): string | null;
|
|
12
|
+
export declare function codexTurnRecord(entry: Record<string, unknown>, state: CodexRecordState, turns: TranscriptTurnEvent[]): boolean;
|
|
13
|
+
export declare function codexToolRecord(entry: Record<string, unknown>, events: TranscriptEvents): void;
|
|
14
|
+
export declare function codexWholeLine(head: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* #1218 P0: a rollout line too long to parse (an output of MBs, a huge call input) — what its head still says, so the
|
|
17
|
+
* bubble keeps the step: a call by its name, or an output. Turn records and messages are read whole (codexWholeLine).
|
|
18
|
+
*/
|
|
19
|
+
export declare function codexLongHead(head: string, events: TranscriptEvents): void;
|
|
20
|
+
export declare function claudeTranscriptRecord(entry: any, emit: (...event: TranscriptRecordEvent) => void): void;
|
|
21
|
+
export declare function claudeTranscriptLongHead(head: string, emit: (...event: TranscriptRecordEvent) => void): void;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
const CODE_MODE_HOST_SPAWN_FAILED = /^failed to spawn code-mode host (\/[^\n]*)\/bin\/codex-code-mode-host: No such file or directory \(os error 2\)$/;
|
|
2
|
+
/** The package root a rollout tool output reports a missing code-mode host under, or null. */
|
|
3
|
+
export function codexCodeModeHostMissingRoot(output) {
|
|
4
|
+
return typeof output === "string" ? CODE_MODE_HOST_SPAWN_FAILED.exec(output)?.[1] ?? null : null;
|
|
5
|
+
}
|
|
6
|
+
export function codexTurnRecord(entry, state, turns) {
|
|
7
|
+
const p = entry.payload;
|
|
8
|
+
if (!p)
|
|
9
|
+
return false;
|
|
10
|
+
if (entry.type === "event_msg") {
|
|
11
|
+
if (p.type === "task_started" && typeof p.turn_id === "string") {
|
|
12
|
+
state.openTurnId = p.turn_id;
|
|
13
|
+
state.openTurn = p.turn_id;
|
|
14
|
+
state.turnKnown = true;
|
|
15
|
+
turns.push({ kind: "start", turnId: p.turn_id });
|
|
16
|
+
}
|
|
17
|
+
else if ((p.type === "task_complete" || p.type === "turn_aborted") && typeof p.turn_id === "string") {
|
|
18
|
+
const end = p.type === "turn_aborted" ? "aborted" : p.last_agent_message == null ? "error" : "complete";
|
|
19
|
+
if (state.openTurn === p.turn_id)
|
|
20
|
+
state.openTurn = null;
|
|
21
|
+
state.turnKnown = true;
|
|
22
|
+
turns.push({ kind: "end", turnId: p.turn_id, end });
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (entry.type === "response_item" && p.type === "message" && p.role === "user") {
|
|
27
|
+
const text = (p.content ?? [])
|
|
28
|
+
.map(block => typeof block.text === "string" ? block.text : "").join("\n");
|
|
29
|
+
const at = Date.parse(String(entry.timestamp ?? ""));
|
|
30
|
+
if (text.trim() && Number.isFinite(at))
|
|
31
|
+
turns.push({ kind: "user", turnId: state.openTurnId, text, at });
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
export function codexToolRecord(entry, events) {
|
|
37
|
+
const p = entry.payload;
|
|
38
|
+
if (!p || entry.type !== "response_item")
|
|
39
|
+
return;
|
|
40
|
+
if (p.type === "function_call") {
|
|
41
|
+
let input = p.arguments;
|
|
42
|
+
if (typeof input === "string") {
|
|
43
|
+
try {
|
|
44
|
+
input = JSON.parse(input);
|
|
45
|
+
}
|
|
46
|
+
catch { /* keep raw */ }
|
|
47
|
+
}
|
|
48
|
+
events.toolUses.push({ name: String(p.name ?? "unknown"), input });
|
|
49
|
+
}
|
|
50
|
+
else if (p.type === "custom_tool_call") {
|
|
51
|
+
events.toolUses.push({ name: String(p.name ?? "unknown"), input: p.input });
|
|
52
|
+
}
|
|
53
|
+
else if (p.type === "local_shell_call") {
|
|
54
|
+
const action = p.action;
|
|
55
|
+
events.toolUses.push({ name: "shell", input: { command: action?.command } });
|
|
56
|
+
}
|
|
57
|
+
else if (p.type === "function_call_output" || p.type === "custom_tool_call_output") {
|
|
58
|
+
events.toolResults.push({ name: String(p.name ?? "unknown") });
|
|
59
|
+
const root = codexCodeModeHostMissingRoot(p.output);
|
|
60
|
+
if (root)
|
|
61
|
+
(events.codexPackageMissingHost ??= []).push(root);
|
|
62
|
+
}
|
|
63
|
+
else if (p.type === "message" && p.role === "assistant") {
|
|
64
|
+
const content = p.content;
|
|
65
|
+
for (const block of content ?? []) {
|
|
66
|
+
const text = block.text;
|
|
67
|
+
if (typeof text === "string" && text.trim())
|
|
68
|
+
events.assistantTexts.push(text);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function codexWholeLine(head) {
|
|
73
|
+
return head.includes('"type":"event_msg"') || (head.includes('"type":"response_item"') && /"payload":\{"type":"message"/.test(head));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* #1218 P0: a rollout line too long to parse (an output of MBs, a huge call input) — what its head still says, so the
|
|
77
|
+
* bubble keeps the step: a call by its name, or an output. Turn records and messages are read whole (codexWholeLine).
|
|
78
|
+
*/
|
|
79
|
+
export function codexLongHead(head, events) {
|
|
80
|
+
if (!head.includes('"type":"response_item"'))
|
|
81
|
+
return;
|
|
82
|
+
const type = /"payload":\{[^{}]{0,400}?"type":"(function_call|custom_tool_call|function_call_output|custom_tool_call_output)"/.exec(head)?.[1];
|
|
83
|
+
if (type === "function_call" || type === "custom_tool_call") {
|
|
84
|
+
const name = /"name":"([^"]{1,200})"/.exec(head)?.[1];
|
|
85
|
+
events.toolUses.push({ name: name ?? "unknown", input: undefined });
|
|
86
|
+
}
|
|
87
|
+
else if (type)
|
|
88
|
+
events.toolResults.push({ name: "unknown" });
|
|
89
|
+
}
|
|
90
|
+
export function claudeTranscriptRecord(entry, emit) {
|
|
91
|
+
// #2834: Claude's own status notes (e.g. its usage-limit auto-continue) — a system record, not model output.
|
|
92
|
+
if (entry.type === "system" && entry.subtype === "informational" && typeof entry.content === "string") {
|
|
93
|
+
emit("system_informational", entry.content);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const msg = entry.message;
|
|
97
|
+
if (!msg?.role || !msg?.content)
|
|
98
|
+
return;
|
|
99
|
+
// #2822: Claude records a failed API call as an assistant record of its own (`isApiErrorMessage`) — the CLI's own
|
|
100
|
+
// error, not model output: told as "api_error", never as "assistant_text".
|
|
101
|
+
if (entry.type === "assistant" && entry.isApiErrorMessage === true) {
|
|
102
|
+
const text = Array.isArray(msg.content)
|
|
103
|
+
? msg.content.map((b) => (b?.type === "text" && typeof b.text === "string" ? b.text : "")).join("")
|
|
104
|
+
: String(msg.content);
|
|
105
|
+
const at = typeof entry.timestamp === "string" ? Date.parse(entry.timestamp) : NaN;
|
|
106
|
+
emit("api_error", text, typeof entry.apiErrorStatus === "number" ? entry.apiErrorStatus : null, Number.isFinite(at) ? at : null, typeof entry.error === "string" ? entry.error : null);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// #2822: a prompt (a person's message, a system notice; a string, or text/image blocks) — never a meta record or a
|
|
110
|
+
// tool result. The point a later API error is judged against.
|
|
111
|
+
if (entry.type === "user" && entry.isMeta !== true && (typeof msg.content === "string"
|
|
112
|
+
? msg.content.trim() !== ""
|
|
113
|
+
: Array.isArray(msg.content) && msg.content.length > 0 && msg.content.every((b) => b?.type === "text" || b?.type === "image"))) {
|
|
114
|
+
emit("user_prompt");
|
|
115
|
+
}
|
|
116
|
+
const contents = Array.isArray(msg.content) ? msg.content : [{ type: "text", text: msg.content }];
|
|
117
|
+
for (const block of contents) {
|
|
118
|
+
if (block.type === "tool_use") {
|
|
119
|
+
emit("tool_use", block.name ?? "unknown", block.input ?? {});
|
|
120
|
+
}
|
|
121
|
+
else if (block.type === "tool_result") {
|
|
122
|
+
emit("tool_result", block.tool_use_id ?? "unknown", block.content);
|
|
123
|
+
}
|
|
124
|
+
else if (block.type === "text" && msg.role === "assistant" && block.text?.trim()) {
|
|
125
|
+
emit("assistant_text", block.text);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export function claudeTranscriptLongHead(head, emit) {
|
|
130
|
+
if (head.includes('"type":"tool_result"')) {
|
|
131
|
+
for (const m of head.matchAll(/"tool_use_id":"([^"]{1,200})"/g))
|
|
132
|
+
emit("tool_result", m[1], undefined);
|
|
133
|
+
}
|
|
134
|
+
for (const m of head.matchAll(/"type":"tool_use"/g)) {
|
|
135
|
+
const name = /"name":"([^"]{1,200})"/.exec(head.slice(m.index, m.index + 400));
|
|
136
|
+
if (name)
|
|
137
|
+
emit("tool_use", name[1], {});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=transcript-records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-records.js","sourceRoot":"","sources":["../src/transcript-records.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type RolloutIndex } from "./rollout-index.js";
|
|
2
|
+
import { type TranscriptRecordEvent } from "./transcript-records.js";
|
|
2
3
|
import { type KiroDbLane } from "./kiro-transcript-lane.js";
|
|
3
4
|
export { extractKiroAssistantStrings } from "./kiro-db-reader.js";
|
|
4
5
|
import type { TranscriptTurnEvent } from "./transcript-turns.js";
|
|
@@ -7,6 +8,8 @@ export interface ToolUseEvent {
|
|
|
7
8
|
input: unknown;
|
|
8
9
|
}
|
|
9
10
|
export interface TranscriptEvents {
|
|
11
|
+
/** Ordered provider-specific records (native Claude preserves API errors, informational notes and prompts). */
|
|
12
|
+
records?: TranscriptRecordEvent[];
|
|
10
13
|
toolUses: ToolUseEvent[];
|
|
11
14
|
toolResults: Array<{
|
|
12
15
|
name: string;
|
|
@@ -32,6 +35,8 @@ export interface TranscriptSource {
|
|
|
32
35
|
reset(): void;
|
|
33
36
|
/** Optional durable-delivery checkpoint taken immediately before pane paste. */
|
|
34
37
|
checkpoint?(): Promise<TranscriptCheckpoint | null>;
|
|
38
|
+
/** Native runner checkpoint: scoped identities only; never encoded as a coordinator-local path. */
|
|
39
|
+
runtimeCheckpoint?(): Promise<import("./runtime-pane-transcript-protocol.js").RuntimeTranscriptReference | null>;
|
|
35
40
|
/** Release anything held between polls; the next poll may acquire it again. */
|
|
36
41
|
close?(): void;
|
|
37
42
|
/**
|
|
@@ -31,7 +31,7 @@ import { open as openFile, readdir, readFile, stat } from "node:fs/promises";
|
|
|
31
31
|
import { homedir } from "node:os";
|
|
32
32
|
import { join, resolve } from "node:path";
|
|
33
33
|
import { sharedRolloutIndex } from "./rollout-index.js";
|
|
34
|
-
import {
|
|
34
|
+
import { codexTurnRecord, codexToolRecord, codexWholeLine, codexLongHead } from "./transcript-records.js";
|
|
35
35
|
import Database from "better-sqlite3";
|
|
36
36
|
import { sharedKiroTranscriptLane } from "./kiro-transcript-lane.js";
|
|
37
37
|
export { extractKiroAssistantStrings } from "./kiro-db-reader.js";
|
|
@@ -288,34 +288,12 @@ export class CodexRolloutSource {
|
|
|
288
288
|
* the open turn as another user message.
|
|
289
289
|
*/
|
|
290
290
|
turnRecord(entry, turns) {
|
|
291
|
-
const
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
this.openTurn = p.turn_id;
|
|
298
|
-
this.turnKnown = true;
|
|
299
|
-
turns.push({ kind: "start", turnId: p.turn_id });
|
|
300
|
-
}
|
|
301
|
-
else if ((p.type === "task_complete" || p.type === "turn_aborted") && typeof p.turn_id === "string") {
|
|
302
|
-
const end = p.type === "turn_aborted" ? "aborted" : p.last_agent_message == null ? "error" : "complete";
|
|
303
|
-
if (this.openTurn === p.turn_id)
|
|
304
|
-
this.openTurn = null;
|
|
305
|
-
this.turnKnown = true;
|
|
306
|
-
turns.push({ kind: "end", turnId: p.turn_id, end });
|
|
307
|
-
}
|
|
308
|
-
return true;
|
|
309
|
-
}
|
|
310
|
-
if (entry.type === "response_item" && p.type === "message" && p.role === "user") {
|
|
311
|
-
const text = (p.content ?? [])
|
|
312
|
-
.map(block => typeof block.text === "string" ? block.text : "").join("\n");
|
|
313
|
-
const at = Date.parse(String(entry.timestamp ?? ""));
|
|
314
|
-
if (text.trim() && Number.isFinite(at))
|
|
315
|
-
turns.push({ kind: "user", turnId: this.openTurnId, text, at });
|
|
316
|
-
return true;
|
|
317
|
-
}
|
|
318
|
-
return false;
|
|
291
|
+
const state = { openTurnId: this.openTurnId, openTurn: this.openTurn, turnKnown: this.turnKnown };
|
|
292
|
+
const handled = codexTurnRecord(entry, state, turns);
|
|
293
|
+
this.openTurnId = state.openTurnId;
|
|
294
|
+
this.openTurn = state.openTurn;
|
|
295
|
+
this.turnKnown = state.turnKnown;
|
|
296
|
+
return handled;
|
|
319
297
|
}
|
|
320
298
|
snapshotExistingFiles() {
|
|
321
299
|
this.initialOffsets = new Map(this.candidateFiles(true).map(file => [file.path, file.size]));
|
|
@@ -456,62 +434,13 @@ export class CodexRolloutSource {
|
|
|
456
434
|
continue;
|
|
457
435
|
if (entry.type !== "response_item")
|
|
458
436
|
continue;
|
|
459
|
-
|
|
460
|
-
let input = p.arguments;
|
|
461
|
-
if (typeof input === "string") {
|
|
462
|
-
try {
|
|
463
|
-
input = JSON.parse(input);
|
|
464
|
-
}
|
|
465
|
-
catch { /* keep raw */ }
|
|
466
|
-
}
|
|
467
|
-
events.toolUses.push({ name: String(p.name ?? "unknown"), input });
|
|
468
|
-
}
|
|
469
|
-
else if (p.type === "custom_tool_call") {
|
|
470
|
-
events.toolUses.push({ name: String(p.name ?? "unknown"), input: p.input });
|
|
471
|
-
}
|
|
472
|
-
else if (p.type === "local_shell_call") {
|
|
473
|
-
const action = p.action;
|
|
474
|
-
events.toolUses.push({ name: "shell", input: { command: action?.command } });
|
|
475
|
-
}
|
|
476
|
-
else if (p.type === "function_call_output" || p.type === "custom_tool_call_output") {
|
|
477
|
-
events.toolResults.push({ name: String(p.name ?? "unknown") });
|
|
478
|
-
const root = codexCodeModeHostMissingRoot(p.output);
|
|
479
|
-
if (root)
|
|
480
|
-
(events.codexPackageMissingHost ??= []).push(root);
|
|
481
|
-
}
|
|
482
|
-
else if (p.type === "message" && p.role === "assistant") {
|
|
483
|
-
const content = p.content;
|
|
484
|
-
for (const block of content ?? []) {
|
|
485
|
-
const text = block.text;
|
|
486
|
-
if (typeof text === "string" && text.trim())
|
|
487
|
-
events.assistantTexts.push(text);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
437
|
+
codexToolRecord(entry, events);
|
|
490
438
|
}
|
|
491
439
|
if (turns.length)
|
|
492
440
|
events.turns = turns;
|
|
493
441
|
return events;
|
|
494
442
|
}
|
|
495
443
|
}
|
|
496
|
-
/** #1786 review: the long rollout lines read whole — turn records (event_msg) and messages (a pasted prompt, a long reply). */
|
|
497
|
-
function codexWholeLine(head) {
|
|
498
|
-
return head.includes('"type":"event_msg"') || (head.includes('"type":"response_item"') && /"payload":\{"type":"message"/.test(head));
|
|
499
|
-
}
|
|
500
|
-
/**
|
|
501
|
-
* #1218 P0: a rollout line too long to parse (an output of MBs, a huge call input) — what its head still says, so the
|
|
502
|
-
* bubble keeps the step: a call by its name, or an output. Turn records and messages are read whole (codexWholeLine).
|
|
503
|
-
*/
|
|
504
|
-
function codexLongHead(head, events) {
|
|
505
|
-
if (!head.includes('"type":"response_item"'))
|
|
506
|
-
return;
|
|
507
|
-
const type = /"payload":\{[^{}]{0,400}?"type":"(function_call|custom_tool_call|function_call_output|custom_tool_call_output)"/.exec(head)?.[1];
|
|
508
|
-
if (type === "function_call" || type === "custom_tool_call") {
|
|
509
|
-
const name = /"name":"([^"]{1,200})"/.exec(head)?.[1];
|
|
510
|
-
events.toolUses.push({ name: name ?? "unknown", input: undefined });
|
|
511
|
-
}
|
|
512
|
-
else if (type)
|
|
513
|
-
events.toolResults.push({ name: "unknown" });
|
|
514
|
-
}
|
|
515
444
|
/* -------------------------------------------------------------------- muse */
|
|
516
445
|
/**
|
|
517
446
|
* #1510: muse's turn boundaries, from its session logs (`<root>/<YYYY>/<MM>/<DD>/<id>/session.jsonl`, recorded on
|