@qduc/term2 0.15.0 → 0.16.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 +324 -316
- package/dist/agent.d.ts +3 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +15 -63
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +129 -19
- package/dist/app.js.map +1 -1
- package/dist/cli.js +25 -16
- package/dist/cli.js.map +1 -1
- package/dist/commands/compact-command.d.ts.map +1 -1
- package/dist/commands/compact-command.js +4 -0
- package/dist/commands/compact-command.js.map +1 -1
- package/dist/commands/effort-command.js +1 -1
- package/dist/commands/effort-command.js.map +1 -1
- package/dist/commands/guarded-settings-command.d.ts.map +1 -1
- package/dist/commands/guarded-settings-command.js +4 -8
- package/dist/commands/guarded-settings-command.js.map +1 -1
- package/dist/commands/model-command.js +1 -1
- package/dist/commands/model-command.js.map +1 -1
- package/dist/commands/resume-command.d.ts +10 -0
- package/dist/commands/resume-command.d.ts.map +1 -0
- package/dist/commands/resume-command.js +40 -0
- package/dist/commands/resume-command.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/ErrorBoundary.js +5 -4
- package/dist/components/ErrorBoundary.js.map +1 -1
- package/dist/components/InputBox.d.ts +2 -0
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +56 -18
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/MarkdownRenderer.d.ts.map +1 -1
- package/dist/components/MarkdownRenderer.js +16 -15
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/common/MenuContainer.d.ts +25 -2
- package/dist/components/common/MenuContainer.d.ts.map +1 -1
- package/dist/components/common/MenuContainer.js +35 -11
- package/dist/components/common/MenuContainer.js.map +1 -1
- package/dist/components/common/ScrollableTabBar.d.ts.map +1 -1
- package/dist/components/common/ScrollableTabBar.js +5 -4
- package/dist/components/common/ScrollableTabBar.js.map +1 -1
- package/dist/components/input/ApplicationInputSurface.d.ts +4 -5
- package/dist/components/input/ApplicationInputSurface.d.ts.map +1 -1
- package/dist/components/input/ApplicationInputSurface.js.map +1 -1
- package/dist/components/input/FirstRunSetupPrompt.d.ts.map +1 -1
- package/dist/components/input/FirstRunSetupPrompt.js +5 -4
- package/dist/components/input/FirstRunSetupPrompt.js.map +1 -1
- package/dist/components/input/MenuSurface.d.ts.map +1 -1
- package/dist/components/input/MenuSurface.js +10 -3
- package/dist/components/input/MenuSurface.js.map +1 -1
- package/dist/components/input/ModelMenuSession.d.ts.map +1 -1
- package/dist/components/input/ModelMenuSession.js +2 -1
- package/dist/components/input/ModelMenuSession.js.map +1 -1
- package/dist/components/input/PendingQueueList.d.ts +2 -0
- package/dist/components/input/PendingQueueList.d.ts.map +1 -1
- package/dist/components/input/PendingQueueList.js +17 -14
- package/dist/components/input/PendingQueueList.js.map +1 -1
- package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -1
- package/dist/components/input/SettingsValueMenuSession.js +2 -1
- package/dist/components/input/SettingsValueMenuSession.js.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTaskManager.js +12 -11
- package/dist/components/layout/BackgroundTaskManager.js.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.d.ts +2 -2
- package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
- package/dist/components/layout/BackgroundTasksPanel.js +10 -9
- package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
- package/dist/components/layout/Banner.d.ts +0 -1
- package/dist/components/layout/Banner.d.ts.map +1 -1
- package/dist/components/layout/Banner.js +43 -73
- package/dist/components/layout/Banner.js.map +1 -1
- package/dist/components/layout/BottomArea.d.ts +6 -5
- package/dist/components/layout/BottomArea.d.ts.map +1 -1
- package/dist/components/layout/BottomArea.js +17 -9
- package/dist/components/layout/BottomArea.js.map +1 -1
- package/dist/components/layout/DiffView.js +5 -5
- package/dist/components/layout/DiffView.js.map +1 -1
- package/dist/components/layout/StatusBar.d.ts +4 -1
- package/dist/components/layout/StatusBar.d.ts.map +1 -1
- package/dist/components/layout/StatusBar.js +305 -95
- package/dist/components/layout/StatusBar.js.map +1 -1
- package/dist/components/layout/background-task-clock.d.ts +43 -0
- package/dist/components/layout/background-task-clock.d.ts.map +1 -0
- package/dist/components/layout/background-task-clock.js +46 -0
- package/dist/components/layout/background-task-clock.js.map +1 -0
- package/dist/components/menu/CopyMenu.d.ts.map +1 -1
- package/dist/components/menu/CopyMenu.js +4 -3
- package/dist/components/menu/CopyMenu.js.map +1 -1
- package/dist/components/menu/MentorPoolSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/MentorPoolSelectionMenu.js +28 -21
- package/dist/components/menu/MentorPoolSelectionMenu.js.map +1 -1
- package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ModelSelectionMenu.js +26 -13
- package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
- package/dist/components/menu/PathSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/PathSelectionMenu.js +4 -3
- package/dist/components/menu/PathSelectionMenu.js.map +1 -1
- package/dist/components/menu/ProviderSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ProviderSelectionMenu.js +46 -26
- package/dist/components/menu/ProviderSelectionMenu.js.map +1 -1
- package/dist/components/menu/RewindMenu.d.ts.map +1 -1
- package/dist/components/menu/RewindMenu.js +4 -3
- package/dist/components/menu/RewindMenu.js.map +1 -1
- package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SettingsSelectionMenu.js +26 -26
- package/dist/components/menu/SettingsSelectionMenu.js.map +1 -1
- package/dist/components/menu/SettingsValueSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SettingsValueSelectionMenu.js +22 -20
- package/dist/components/menu/SettingsValueSelectionMenu.js.map +1 -1
- package/dist/components/menu/SkillSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/SkillSelectionMenu.js +33 -23
- package/dist/components/menu/SkillSelectionMenu.js.map +1 -1
- package/dist/components/menu/SlashCommandMenu.d.ts.map +1 -1
- package/dist/components/menu/SlashCommandMenu.js +11 -6
- package/dist/components/menu/SlashCommandMenu.js.map +1 -1
- package/dist/components/message/ChatMessage.js +2 -2
- package/dist/components/message/ChatMessage.js.map +1 -1
- package/dist/components/message/CodeContextSearchRenderer.d.ts.map +1 -1
- package/dist/components/message/CodeContextSearchRenderer.js +8 -11
- package/dist/components/message/CodeContextSearchRenderer.js.map +1 -1
- package/dist/components/message/CommandGroupSummary.d.ts.map +1 -1
- package/dist/components/message/CommandGroupSummary.js +15 -7
- package/dist/components/message/CommandGroupSummary.js.map +1 -1
- package/dist/components/message/CommandMessage.d.ts.map +1 -1
- package/dist/components/message/CommandMessage.js +111 -91
- package/dist/components/message/CommandMessage.js.map +1 -1
- package/dist/components/message/GrepRenderer.d.ts.map +1 -1
- package/dist/components/message/GrepRenderer.js +5 -8
- package/dist/components/message/GrepRenderer.js.map +1 -1
- package/dist/components/message/MemoryRenderer.d.ts +1 -0
- package/dist/components/message/MemoryRenderer.d.ts.map +1 -1
- package/dist/components/message/MemoryRenderer.js +19 -17
- package/dist/components/message/MemoryRenderer.js.map +1 -1
- package/dist/components/message/MessageList.d.ts +1 -2
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +12 -11
- package/dist/components/message/MessageList.js.map +1 -1
- package/dist/components/message/ReadFileRenderer.d.ts.map +1 -1
- package/dist/components/message/ReadFileRenderer.js +5 -6
- package/dist/components/message/ReadFileRenderer.js.map +1 -1
- package/dist/components/message/SubagentActivityMessage.d.ts.map +1 -1
- package/dist/components/message/SubagentActivityMessage.js +17 -13
- package/dist/components/message/SubagentActivityMessage.js.map +1 -1
- package/dist/components/message/WebFetchRenderer.d.ts.map +1 -1
- package/dist/components/message/WebFetchRenderer.js +7 -11
- package/dist/components/message/WebFetchRenderer.js.map +1 -1
- package/dist/components/message/WebSearchRenderer.d.ts.map +1 -1
- package/dist/components/message/WebSearchRenderer.js +5 -10
- package/dist/components/message/WebSearchRenderer.js.map +1 -1
- package/dist/components/message/command-grouping.d.ts +29 -6
- package/dist/components/message/command-grouping.d.ts.map +1 -1
- package/dist/components/message/command-grouping.js +62 -20
- package/dist/components/message/command-grouping.js.map +1 -1
- package/dist/components/message/command-message-helpers.d.ts +5 -32
- package/dist/components/message/command-message-helpers.d.ts.map +1 -1
- package/dist/components/message/command-message-helpers.js +26 -8
- package/dist/components/message/command-message-helpers.js.map +1 -1
- package/dist/components/message/useCommandVisibility.d.ts.map +1 -1
- package/dist/components/message/useCommandVisibility.js +5 -4
- package/dist/components/message/useCommandVisibility.js.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.js +190 -106
- package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
- package/dist/components/prompt/HandoffConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/prompt/HandoffConfirmationPrompt.js +3 -2
- package/dist/components/prompt/HandoffConfirmationPrompt.js.map +1 -1
- package/dist/components/prompt/InputSurgeConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/prompt/InputSurgeConfirmationPrompt.js +5 -4
- package/dist/components/prompt/InputSurgeConfirmationPrompt.js.map +1 -1
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.js +4 -3
- package/dist/components/prompt/LargeUncachedConfirmationPrompt.js.map +1 -1
- package/dist/components/prompt/ModeSwitchConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/prompt/ModeSwitchConfirmationPrompt.js +4 -3
- package/dist/components/prompt/ModeSwitchConfirmationPrompt.js.map +1 -1
- package/dist/components/prompt/QueuePausedPrompt.d.ts.map +1 -1
- package/dist/components/prompt/QueuePausedPrompt.js +6 -5
- package/dist/components/prompt/QueuePausedPrompt.js.map +1 -1
- package/dist/components/prompt/StandardModeConfirmationPrompt.d.ts.map +1 -1
- package/dist/components/prompt/StandardModeConfirmationPrompt.js +3 -2
- package/dist/components/prompt/StandardModeConfirmationPrompt.js.map +1 -1
- package/dist/components/theme.d.ts +58 -3
- package/dist/components/theme.d.ts.map +1 -1
- package/dist/components/theme.js +84 -17
- package/dist/components/theme.js.map +1 -1
- package/dist/contracts/application-stream.d.ts +14 -0
- package/dist/contracts/application-stream.d.ts.map +1 -1
- package/dist/gateway/assertion.d.ts +4 -1
- package/dist/gateway/assertion.d.ts.map +1 -1
- package/dist/gateway/assertion.js +24 -2
- package/dist/gateway/assertion.js.map +1 -1
- package/dist/gateway/contracts.d.ts +21 -4
- package/dist/gateway/contracts.d.ts.map +1 -1
- package/dist/gateway/contracts.js +11 -0
- package/dist/gateway/contracts.js.map +1 -1
- package/dist/gateway/dynamic-workspace-registry.d.ts +76 -0
- package/dist/gateway/dynamic-workspace-registry.d.ts.map +1 -0
- package/dist/gateway/dynamic-workspace-registry.js +403 -0
- package/dist/gateway/dynamic-workspace-registry.js.map +1 -0
- package/dist/gateway/gateway.d.ts +24 -1
- package/dist/gateway/gateway.d.ts.map +1 -1
- package/dist/gateway/gateway.js +704 -21
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/launcher-seam.d.ts +18 -0
- package/dist/gateway/launcher-seam.d.ts.map +1 -0
- package/dist/gateway/launcher-seam.js +43 -0
- package/dist/gateway/launcher-seam.js.map +1 -0
- package/dist/gateway/pairing.d.ts +25 -0
- package/dist/gateway/pairing.d.ts.map +1 -0
- package/dist/gateway/pairing.js +107 -0
- package/dist/gateway/pairing.js.map +1 -0
- package/dist/gateway/persistence/coordinator.d.ts +2 -0
- package/dist/gateway/persistence/coordinator.d.ts.map +1 -1
- package/dist/gateway/persistence/coordinator.js +13 -0
- package/dist/gateway/persistence/coordinator.js.map +1 -1
- package/dist/gateway/runtime-factory.d.ts +15 -6
- package/dist/gateway/runtime-factory.d.ts.map +1 -1
- package/dist/gateway/runtime-factory.js +38 -9
- package/dist/gateway/runtime-factory.js.map +1 -1
- package/dist/gateway/safe-log.d.ts.map +1 -1
- package/dist/gateway/safe-log.js +19 -0
- package/dist/gateway/safe-log.js.map +1 -1
- package/dist/gateway/server-session.d.ts.map +1 -1
- package/dist/gateway/server-session.js +36 -4
- package/dist/gateway/server-session.js.map +1 -1
- package/dist/gateway/server.d.ts +26 -3
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +105 -17
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/settings-rpc.d.ts +95 -0
- package/dist/gateway/settings-rpc.d.ts.map +1 -0
- package/dist/gateway/settings-rpc.js +227 -0
- package/dist/gateway/settings-rpc.js.map +1 -0
- package/dist/gateway/trusted-clients.d.ts +27 -0
- package/dist/gateway/trusted-clients.d.ts.map +1 -0
- package/dist/gateway/trusted-clients.js +157 -0
- package/dist/gateway/trusted-clients.js.map +1 -0
- package/dist/gateway/worker-boundary.d.ts +6 -5
- package/dist/gateway/worker-boundary.d.ts.map +1 -1
- package/dist/gateway/worker-boundary.js +20 -10
- package/dist/gateway/worker-boundary.js.map +1 -1
- package/dist/gateway/workspace-admission.d.ts +11 -0
- package/dist/gateway/workspace-admission.d.ts.map +1 -1
- package/dist/gateway/workspace-admission.js +89 -16
- package/dist/gateway/workspace-admission.js.map +1 -1
- package/dist/gateway/workspace-boundary-probe.d.ts +18 -0
- package/dist/gateway/workspace-boundary-probe.d.ts.map +1 -0
- package/dist/gateway/workspace-boundary-probe.js +37 -0
- package/dist/gateway/workspace-boundary-probe.js.map +1 -0
- package/dist/hooks/conversation-ui-reducer.d.ts +6 -0
- package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
- package/dist/hooks/conversation-ui-reducer.js +9 -1
- package/dist/hooks/conversation-ui-reducer.js.map +1 -1
- package/dist/hooks/settings-completion-config.d.ts.map +1 -1
- package/dist/hooks/settings-completion-config.js +11 -3
- package/dist/hooks/settings-completion-config.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +6 -1
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +22 -13
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-app-keyboard-shortcuts.d.ts +1 -3
- package/dist/hooks/use-app-keyboard-shortcuts.d.ts.map +1 -1
- package/dist/hooks/use-app-keyboard-shortcuts.js +11 -9
- package/dist/hooks/use-app-keyboard-shortcuts.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +8 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +27 -18
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-opencode-go-usage.d.ts +8 -0
- package/dist/hooks/use-opencode-go-usage.d.ts.map +1 -0
- package/dist/hooks/use-opencode-go-usage.js +45 -0
- package/dist/hooks/use-opencode-go-usage.js.map +1 -0
- package/dist/hooks/use-shell-mode.d.ts +3 -4
- package/dist/hooks/use-shell-mode.d.ts.map +1 -1
- package/dist/hooks/use-shell-mode.js +14 -12
- package/dist/hooks/use-shell-mode.js.map +1 -1
- package/dist/hooks/use-terminal-columns.d.ts +15 -0
- package/dist/hooks/use-terminal-columns.d.ts.map +1 -0
- package/dist/hooks/use-terminal-columns.js +45 -0
- package/dist/hooks/use-terminal-columns.js.map +1 -0
- package/dist/lib/agent-client.d.ts +2 -0
- package/dist/lib/agent-client.d.ts.map +1 -1
- package/dist/lib/agent-client.js +1 -0
- package/dist/lib/agent-client.js.map +1 -1
- package/dist/lib/agent-configuration.d.ts +3 -0
- package/dist/lib/agent-configuration.d.ts.map +1 -1
- package/dist/lib/agent-configuration.js +4 -0
- package/dist/lib/agent-configuration.js.map +1 -1
- package/dist/lib/agent-factory.d.ts +3 -0
- package/dist/lib/agent-factory.d.ts.map +1 -1
- package/dist/lib/agent-factory.js +9 -2
- package/dist/lib/agent-factory.js.map +1 -1
- package/dist/lib/harness-input-idle.d.ts.map +1 -1
- package/dist/lib/harness-input-idle.js +1 -1
- package/dist/lib/harness-input-idle.js.map +1 -1
- package/dist/non-interactive.d.ts.map +1 -1
- package/dist/non-interactive.js +9 -2
- package/dist/non-interactive.js.map +1 -1
- package/dist/prompts/approval-model.md +22 -0
- package/dist/prompts/gpt-5.6.md +3 -2
- package/dist/prompts/mentor-mode-stub.md +3 -0
- package/dist/prompts/orchestrator-mode-stub.md +3 -0
- package/dist/prompts/prefix-quality.test.ts +10 -0
- package/dist/prompts/prompt-constructor.d.ts +2 -0
- package/dist/prompts/prompt-constructor.d.ts.map +1 -1
- package/dist/prompts/prompt-constructor.js +23 -13
- package/dist/prompts/prompt-constructor.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.ts +39 -5
- package/dist/prompts/prompt-constructor.ts +27 -15
- package/dist/prompts/prompt-profiles.d.ts +1 -3
- package/dist/prompts/prompt-profiles.d.ts.map +1 -1
- package/dist/prompts/prompt-profiles.js +2 -7
- package/dist/prompts/prompt-profiles.js.map +1 -1
- package/dist/prompts/prompt-profiles.ts +3 -16
- package/dist/prompts/session-browser.md +3 -0
- package/dist/prompts/subagent-delegation.d.ts +3 -2
- package/dist/prompts/subagent-delegation.d.ts.map +1 -1
- package/dist/prompts/subagent-delegation.js +9 -13
- package/dist/prompts/subagent-delegation.js.map +1 -1
- package/dist/prompts/subagent-delegation.ts +9 -13
- package/dist/providers/chained-wire-state.d.ts +7 -2
- package/dist/providers/chained-wire-state.d.ts.map +1 -1
- package/dist/providers/chained-wire-state.js +16 -7
- package/dist/providers/chained-wire-state.js.map +1 -1
- package/dist/providers/codex-auth.d.ts +2 -5
- package/dist/providers/codex-auth.d.ts.map +1 -1
- package/dist/providers/codex-auth.js +2 -0
- package/dist/providers/codex-auth.js.map +1 -1
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +22 -3
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/grok-auth.d.ts +2 -5
- package/dist/providers/grok-auth.d.ts.map +1 -1
- package/dist/providers/grok-auth.js +2 -0
- package/dist/providers/grok-auth.js.map +1 -1
- package/dist/providers/oauth-account-store.d.ts +5 -0
- package/dist/providers/oauth-account-store.d.ts.map +1 -1
- package/dist/providers/oauth-account-store.js +56 -5
- package/dist/providers/oauth-account-store.js.map +1 -1
- package/dist/providers/oauth-pkce.d.ts +8 -0
- package/dist/providers/oauth-pkce.d.ts.map +1 -1
- package/dist/providers/oauth-pkce.js +91 -19
- package/dist/providers/oauth-pkce.js.map +1 -1
- package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/openai-compatible.provider.js +8 -1
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/opencode-go-usage.d.ts +24 -0
- package/dist/providers/opencode-go-usage.d.ts.map +1 -0
- package/dist/providers/opencode-go-usage.js +37 -0
- package/dist/providers/opencode-go-usage.js.map +1 -0
- package/dist/providers/openrouter.provider.d.ts.map +1 -1
- package/dist/providers/openrouter.provider.js +8 -1
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/providers/responses-websocket-sessions.d.ts +1 -0
- package/dist/providers/responses-websocket-sessions.d.ts.map +1 -1
- package/dist/providers/responses-websocket-sessions.js +16 -2
- package/dist/providers/responses-websocket-sessions.js.map +1 -1
- package/dist/providers/retrying-model.d.ts.map +1 -1
- package/dist/providers/retrying-model.js +31 -3
- package/dist/providers/retrying-model.js.map +1 -1
- package/dist/services/agent-runtime/application-run-loop.d.ts +5 -1
- package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
- package/dist/services/agent-runtime/application-run-loop.js +229 -149
- package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
- package/dist/services/agent-runtime/generation-guard.d.ts +39 -25
- package/dist/services/agent-runtime/generation-guard.d.ts.map +1 -1
- package/dist/services/agent-runtime/generation-guard.js +98 -100
- package/dist/services/agent-runtime/generation-guard.js.map +1 -1
- package/dist/services/agent-runtime/run-budget.d.ts +1 -1
- package/dist/services/agent-runtime/run-budget.d.ts.map +1 -1
- package/dist/services/agent-runtime/run-budget.js +4 -0
- package/dist/services/agent-runtime/run-budget.js.map +1 -1
- package/dist/services/agent-stream.d.ts.map +1 -1
- package/dist/services/agent-stream.js +1 -0
- package/dist/services/agent-stream.js.map +1 -1
- package/dist/services/conversation/conversation-adapter.d.ts +13 -2
- package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
- package/dist/services/conversation/conversation-adapter.js +35 -7
- package/dist/services/conversation/conversation-adapter.js.map +1 -1
- package/dist/services/conversation/conversation-admission-workflow.d.ts +3 -2
- package/dist/services/conversation/conversation-admission-workflow.d.ts.map +1 -1
- package/dist/services/conversation/conversation-admission-workflow.js +6 -1
- package/dist/services/conversation/conversation-admission-workflow.js.map +1 -1
- package/dist/services/conversation/conversation-events.d.ts +43 -2
- package/dist/services/conversation/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.d.ts +14 -1
- package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.js +142 -11
- package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
- package/dist/services/conversation/conversation-orchestrator.types.d.ts +3 -1
- package/dist/services/conversation/conversation-orchestrator.types.d.ts.map +1 -1
- package/dist/services/conversation/conversation-persistence.d.ts +22 -1
- package/dist/services/conversation/conversation-persistence.d.ts.map +1 -1
- package/dist/services/conversation/conversation-persistence.js +61 -0
- package/dist/services/conversation/conversation-persistence.js.map +1 -1
- package/dist/services/conversation/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation/conversation-service.js +45 -29
- package/dist/services/conversation/conversation-service.js.map +1 -1
- package/dist/services/conversation/session-audit.d.ts +70 -0
- package/dist/services/conversation/session-audit.d.ts.map +1 -0
- package/dist/services/conversation/session-audit.js +164 -0
- package/dist/services/conversation/session-audit.js.map +1 -0
- package/dist/services/conversation/session-browser.d.ts +46 -0
- package/dist/services/conversation/session-browser.d.ts.map +1 -0
- package/dist/services/conversation/session-browser.js +380 -0
- package/dist/services/conversation/session-browser.js.map +1 -0
- package/dist/services/input-surge-approval.d.ts +21 -0
- package/dist/services/input-surge-approval.d.ts.map +1 -0
- package/dist/services/input-surge-approval.js +42 -0
- package/dist/services/input-surge-approval.js.map +1 -0
- package/dist/services/large-uncached-input-guard.js +4 -4
- package/dist/services/large-uncached-input-guard.js.map +1 -1
- package/dist/services/logging/assistant-turn-journal.d.ts +15 -0
- package/dist/services/logging/assistant-turn-journal.d.ts.map +1 -1
- package/dist/services/logging/assistant-turn-journal.js +27 -0
- package/dist/services/logging/assistant-turn-journal.js.map +1 -1
- package/dist/services/memory/memory-capabilities.js +2 -2
- package/dist/services/memory/memory-search.d.ts +16 -0
- package/dist/services/memory/memory-search.d.ts.map +1 -0
- package/dist/services/memory/memory-search.js +55 -0
- package/dist/services/memory/memory-search.js.map +1 -0
- package/dist/services/memory/memory-store.d.ts +12 -0
- package/dist/services/memory/memory-store.d.ts.map +1 -1
- package/dist/services/memory/memory-store.js +14 -35
- package/dist/services/memory/memory-store.js.map +1 -1
- package/dist/services/mode-notices.d.ts +11 -0
- package/dist/services/mode-notices.d.ts.map +1 -1
- package/dist/services/mode-notices.js +37 -3
- package/dist/services/mode-notices.js.map +1 -1
- package/dist/services/queue/queue-controller.d.ts +13 -0
- package/dist/services/queue/queue-controller.d.ts.map +1 -1
- package/dist/services/queue/queue-controller.js +32 -1
- package/dist/services/queue/queue-controller.js.map +1 -1
- package/dist/services/retry/in-loop-model-retry.d.ts +12 -0
- package/dist/services/retry/in-loop-model-retry.d.ts.map +1 -0
- package/dist/services/retry/in-loop-model-retry.js +115 -0
- package/dist/services/retry/in-loop-model-retry.js.map +1 -0
- package/dist/services/retry/retry-classifier.d.ts.map +1 -1
- package/dist/services/retry/retry-classifier.js +18 -12
- package/dist/services/retry/retry-classifier.js.map +1 -1
- package/dist/services/retry/retry-error-classification.d.ts.map +1 -1
- package/dist/services/retry/retry-error-classification.js +10 -6
- package/dist/services/retry/retry-error-classification.js.map +1 -1
- package/dist/services/retry/upstream-retry-policy.d.ts.map +1 -1
- package/dist/services/retry/upstream-retry-policy.js +40 -7
- package/dist/services/retry/upstream-retry-policy.js.map +1 -1
- package/dist/services/runtime-setting-router.d.ts.map +1 -1
- package/dist/services/runtime-setting-router.js +7 -2
- package/dist/services/runtime-setting-router.js.map +1 -1
- package/dist/services/session/background-check-in-scheduler.d.ts +44 -0
- package/dist/services/session/background-check-in-scheduler.d.ts.map +1 -0
- package/dist/services/session/background-check-in-scheduler.js +88 -0
- package/dist/services/session/background-check-in-scheduler.js.map +1 -0
- package/dist/services/session/background-task-control.js +4 -1
- package/dist/services/session/background-task-control.js.map +1 -1
- package/dist/services/session/initial-input-preparer.d.ts +2 -1
- package/dist/services/session/initial-input-preparer.d.ts.map +1 -1
- package/dist/services/session/initial-input-preparer.js +3 -1
- package/dist/services/session/initial-input-preparer.js.map +1 -1
- package/dist/services/session/repetition-detector.d.ts +0 -4
- package/dist/services/session/repetition-detector.d.ts.map +1 -1
- package/dist/services/session/repetition-detector.js +0 -7
- package/dist/services/session/repetition-detector.js.map +1 -1
- package/dist/services/session/session-composition.d.ts +6 -2
- package/dist/services/session/session-composition.d.ts.map +1 -1
- package/dist/services/session/session-composition.js +99 -29
- package/dist/services/session/session-composition.js.map +1 -1
- package/dist/services/session/session-lifecycle.d.ts +8 -0
- package/dist/services/session/session-lifecycle.d.ts.map +1 -1
- package/dist/services/session/session-lifecycle.js +4 -0
- package/dist/services/session/session-lifecycle.js.map +1 -1
- package/dist/services/session/session-stream-processor.d.ts.map +1 -1
- package/dist/services/session/session-stream-processor.js +5 -15
- package/dist/services/session/session-stream-processor.js.map +1 -1
- package/dist/services/session/turn-attempt-factory.d.ts +2 -1
- package/dist/services/session/turn-attempt-factory.d.ts.map +1 -1
- package/dist/services/session/turn-attempt-factory.js +1 -0
- package/dist/services/session/turn-attempt-factory.js.map +1 -1
- package/dist/services/session/turn-attempt.d.ts +3 -0
- package/dist/services/session/turn-attempt.d.ts.map +1 -1
- package/dist/services/session/turn-attempt.js +5 -0
- package/dist/services/session/turn-attempt.js.map +1 -1
- package/dist/services/session/turn-coordinator.d.ts +1 -1
- package/dist/services/session/turn-coordinator.d.ts.map +1 -1
- package/dist/services/session/turn-workflow.d.ts.map +1 -1
- package/dist/services/session/turn-workflow.js +4 -1
- package/dist/services/session/turn-workflow.js.map +1 -1
- package/dist/services/settings/settings-schema.d.ts +27 -3
- package/dist/services/settings/settings-schema.d.ts.map +1 -1
- package/dist/services/settings/settings-schema.js +35 -11
- package/dist/services/settings/settings-schema.js.map +1 -1
- package/dist/services/settings/settings-service.d.ts +9 -0
- package/dist/services/settings/settings-service.d.ts.map +1 -1
- package/dist/services/settings/settings-service.js +40 -0
- package/dist/services/settings/settings-service.js.map +1 -1
- package/dist/services/settings/settings-sources.d.ts.map +1 -1
- package/dist/services/settings/settings-sources.js +5 -0
- package/dist/services/settings/settings-sources.js.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +2 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js +6 -0
- package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
- package/dist/services/shell/shell-interaction-session.d.ts +4 -5
- package/dist/services/shell/shell-interaction-session.d.ts.map +1 -1
- package/dist/services/shell/shell-interaction-session.js +8 -20
- package/dist/services/shell/shell-interaction-session.js.map +1 -1
- package/dist/services/stream-event-processor.d.ts.map +1 -1
- package/dist/services/stream-event-processor.js +15 -0
- package/dist/services/stream-event-processor.js.map +1 -1
- package/dist/services/subagents/mentor-runner.d.ts.map +1 -1
- package/dist/services/subagents/mentor-runner.js +2 -0
- package/dist/services/subagents/mentor-runner.js.map +1 -1
- package/dist/services/subagents/nested-runner.d.ts.map +1 -1
- package/dist/services/subagents/nested-runner.js +34 -1
- package/dist/services/subagents/nested-runner.js.map +1 -1
- package/dist/services/subagents/subagent-async-registry.js +1 -1
- package/dist/services/subagents/subagent-async-registry.js.map +1 -1
- package/dist/services/subagents/subagent-notification-store.d.ts +28 -1
- package/dist/services/subagents/subagent-notification-store.d.ts.map +1 -1
- package/dist/services/subagents/subagent-notification-store.js +11 -0
- package/dist/services/subagents/subagent-notification-store.js.map +1 -1
- package/dist/services/subagents/tool-policy.d.ts.map +1 -1
- package/dist/services/subagents/tool-policy.js +10 -5
- package/dist/services/subagents/tool-policy.js.map +1 -1
- package/dist/services/subagents/utils.d.ts +2 -0
- package/dist/services/subagents/utils.d.ts.map +1 -1
- package/dist/services/subagents/utils.js +29 -0
- package/dist/services/subagents/utils.js.map +1 -1
- package/dist/services/tool-execution-ledger.d.ts.map +1 -1
- package/dist/services/tool-execution-ledger.js +5 -1
- package/dist/services/tool-execution-ledger.js.map +1 -1
- package/dist/tools/agent/ask-user.d.ts.map +1 -1
- package/dist/tools/agent/ask-user.js +2 -0
- package/dist/tools/agent/ask-user.js.map +1 -1
- package/dist/tools/agent/run-subagent.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent.js +40 -24
- package/dist/tools/agent/run-subagent.js.map +1 -1
- package/dist/tools/memory/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory/memory-tools.js +322 -59
- package/dist/tools/memory/memory-tools.js.map +1 -1
- package/dist/tools/session-browser/session-browser-tools.d.ts +4 -0
- package/dist/tools/session-browser/session-browser-tools.d.ts.map +1 -0
- package/dist/tools/session-browser/session-browser-tools.js +47 -0
- package/dist/tools/session-browser/session-browser-tools.js.map +1 -0
- package/dist/tools/system/shell.d.ts.map +1 -1
- package/dist/tools/system/shell.js +7 -0
- package/dist/tools/system/shell.js.map +1 -1
- package/dist/tools/types.d.ts +4 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/utils/busy-turn-guard.d.ts +17 -0
- package/dist/utils/busy-turn-guard.d.ts.map +1 -0
- package/dist/utils/busy-turn-guard.js +24 -0
- package/dist/utils/busy-turn-guard.js.map +1 -0
- package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation/conversation-event-handler.js +28 -7
- package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
- package/dist/utils/output/bounded-json.d.ts +33 -0
- package/dist/utils/output/bounded-json.d.ts.map +1 -0
- package/dist/utils/output/bounded-json.js +59 -0
- package/dist/utils/output/bounded-json.js.map +1 -0
- package/dist/utils/output/output-trim.d.ts.map +1 -1
- package/dist/utils/output/output-trim.js +7 -7
- package/dist/utils/output/output-trim.js.map +1 -1
- package/dist/utils/output/text-snippet.d.ts +6 -0
- package/dist/utils/output/text-snippet.d.ts.map +1 -0
- package/dist/utils/output/text-snippet.js +106 -0
- package/dist/utils/output/text-snippet.js.map +1 -0
- package/dist/utils/resume-list.d.ts +3 -1
- package/dist/utils/resume-list.d.ts.map +1 -1
- package/dist/utils/resume-list.js +3 -2
- package/dist/utils/resume-list.js.map +1 -1
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +15 -0
- package/dist/utils/settings-command.js.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-policy.d.ts +2 -0
- package/dist/utils/shell/sandbox/sandbox-policy.d.ts.map +1 -1
- package/dist/utils/shell/sandbox/sandbox-policy.js.map +1 -1
- package/dist/utils/shell/sandbox/shell-sandbox-runner.d.ts +1 -0
- package/dist/utils/shell/sandbox/shell-sandbox-runner.d.ts.map +1 -1
- package/dist/utils/shell/sandbox/shell-sandbox-runner.js +20 -1
- package/dist/utils/shell/sandbox/shell-sandbox-runner.js.map +1 -1
- package/dist/utils/value-suggestions.d.ts.map +1 -1
- package/dist/utils/value-suggestions.js +1 -0
- package/dist/utils/value-suggestions.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { isTruncatedLogEvent } from '../logging/conversation-log-events.js';
|
|
2
|
+
/**
|
|
3
|
+
* Derive an after-the-fact verdict about one persisted session from its event
|
|
4
|
+
* log alone, without resuming it.
|
|
5
|
+
*
|
|
6
|
+
* The in-flight bookkeeping here deliberately mirrors `replayEvents`: a call is
|
|
7
|
+
* registered by `tool_started` (and by `approval_required`, which can name a
|
|
8
|
+
* call the process died before dispatching), retired by `tool_result`, and
|
|
9
|
+
* cleared wholesale by `assistant_turn` and `undo`. That correspondence is the
|
|
10
|
+
* point — the audit reports what a resume of the same log would find, so the
|
|
11
|
+
* two cannot disagree about whether work was left unpaid.
|
|
12
|
+
*
|
|
13
|
+
* `session_cleared` is intentionally not treated as a reset, matching replay,
|
|
14
|
+
* which also ignores it here.
|
|
15
|
+
*/
|
|
16
|
+
export function auditSessionLog(envelopes) {
|
|
17
|
+
const inFlight = new Map();
|
|
18
|
+
const openSubagents = new Map();
|
|
19
|
+
const openShells = new Map();
|
|
20
|
+
const errors = [];
|
|
21
|
+
let sessionId;
|
|
22
|
+
let userTurns = 0;
|
|
23
|
+
let assistantTurns = 0;
|
|
24
|
+
let truncatedEvents = 0;
|
|
25
|
+
let trailingUserMessage = false;
|
|
26
|
+
let pendingApproval;
|
|
27
|
+
let started = 0;
|
|
28
|
+
let completed = 0;
|
|
29
|
+
let failed = 0;
|
|
30
|
+
let aborted = 0;
|
|
31
|
+
let unknown = 0;
|
|
32
|
+
for (const envelope of envelopes) {
|
|
33
|
+
const event = envelope.event;
|
|
34
|
+
if (isTruncatedLogEvent(event)) {
|
|
35
|
+
truncatedEvents++;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
switch (event.type) {
|
|
39
|
+
case 'session_init':
|
|
40
|
+
sessionId = event.id;
|
|
41
|
+
break;
|
|
42
|
+
case 'user_message':
|
|
43
|
+
userTurns++;
|
|
44
|
+
trailingUserMessage = true;
|
|
45
|
+
break;
|
|
46
|
+
case 'assistant_turn':
|
|
47
|
+
assistantTurns++;
|
|
48
|
+
trailingUserMessage = false;
|
|
49
|
+
inFlight.clear();
|
|
50
|
+
pendingApproval = undefined;
|
|
51
|
+
break;
|
|
52
|
+
case 'undo':
|
|
53
|
+
trailingUserMessage = false;
|
|
54
|
+
inFlight.clear();
|
|
55
|
+
pendingApproval = undefined;
|
|
56
|
+
break;
|
|
57
|
+
case 'tool_started':
|
|
58
|
+
started++;
|
|
59
|
+
inFlight.set(event.toolCallId, { callId: event.toolCallId, toolName: event.toolName });
|
|
60
|
+
break;
|
|
61
|
+
case 'tool_result':
|
|
62
|
+
inFlight.delete(event.callId);
|
|
63
|
+
if (event.status === 'completed')
|
|
64
|
+
completed++;
|
|
65
|
+
else if (event.status === 'failed')
|
|
66
|
+
failed++;
|
|
67
|
+
else if (event.status === 'aborted')
|
|
68
|
+
aborted++;
|
|
69
|
+
else
|
|
70
|
+
unknown++;
|
|
71
|
+
break;
|
|
72
|
+
case 'approval_required': {
|
|
73
|
+
const callId = event.approval.callId;
|
|
74
|
+
const pending = { callId: callId ?? '', toolName: event.approval.toolName };
|
|
75
|
+
pendingApproval = pending;
|
|
76
|
+
if (callId && !inFlight.has(callId)) {
|
|
77
|
+
inFlight.set(callId, { callId, toolName: event.approval.toolName });
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case 'approval_resolved':
|
|
82
|
+
pendingApproval = undefined;
|
|
83
|
+
break;
|
|
84
|
+
case 'subagent_started':
|
|
85
|
+
openSubagents.set(event.agentId, { agentId: event.agentId, role: event.role });
|
|
86
|
+
break;
|
|
87
|
+
case 'subagent_completed':
|
|
88
|
+
openSubagents.delete(event.result.agentId);
|
|
89
|
+
break;
|
|
90
|
+
case 'subagent_interrupted':
|
|
91
|
+
case 'subagent_transferred':
|
|
92
|
+
openSubagents.delete(event.agentId);
|
|
93
|
+
break;
|
|
94
|
+
case 'background_shell_started':
|
|
95
|
+
openShells.set(event.jobId, { jobId: event.jobId, command: event.command });
|
|
96
|
+
break;
|
|
97
|
+
case 'background_shell_completed':
|
|
98
|
+
openShells.delete(event.jobId);
|
|
99
|
+
break;
|
|
100
|
+
case 'error':
|
|
101
|
+
errors.push(event.kind ? { message: event.message, kind: event.kind } : { message: event.message });
|
|
102
|
+
break;
|
|
103
|
+
default:
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const unfinishedToolCalls = [...inFlight.values()];
|
|
108
|
+
const outcome = userTurns === 0
|
|
109
|
+
? 'empty'
|
|
110
|
+
: pendingApproval
|
|
111
|
+
? 'awaiting_approval'
|
|
112
|
+
: unfinishedToolCalls.length > 0
|
|
113
|
+
? 'interrupted_mid_tool'
|
|
114
|
+
: trailingUserMessage
|
|
115
|
+
? 'interrupted_mid_turn'
|
|
116
|
+
: 'settled';
|
|
117
|
+
return {
|
|
118
|
+
sessionId,
|
|
119
|
+
outcome,
|
|
120
|
+
userTurns,
|
|
121
|
+
assistantTurns,
|
|
122
|
+
toolCalls: { started, completed, failed, aborted, unknown },
|
|
123
|
+
unfinishedToolCalls,
|
|
124
|
+
unfinishedSubagents: [...openSubagents.values()],
|
|
125
|
+
unfinishedBackgroundShells: [...openShells.values()],
|
|
126
|
+
errors,
|
|
127
|
+
truncatedEvents,
|
|
128
|
+
firstEventAt: envelopes[0]?.ts,
|
|
129
|
+
lastEventAt: envelopes[envelopes.length - 1]?.ts,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
const OUTCOME_SUMMARY = {
|
|
133
|
+
empty: 'No user turns were recorded.',
|
|
134
|
+
settled: 'Ended cleanly after a completed assistant turn.',
|
|
135
|
+
awaiting_approval: 'Stopped waiting for an approval that was never answered.',
|
|
136
|
+
interrupted_mid_tool: 'Ended with tool calls dispatched but never observed.',
|
|
137
|
+
interrupted_mid_turn: 'Ended after a user turn that never produced a reply.',
|
|
138
|
+
};
|
|
139
|
+
/** Render an audit as plain text for a report or a terminal. */
|
|
140
|
+
export function formatSessionAudit(audit) {
|
|
141
|
+
const lines = [];
|
|
142
|
+
lines.push(`Session ${audit.sessionId ?? '(unknown)'}: ${audit.outcome}`);
|
|
143
|
+
lines.push(OUTCOME_SUMMARY[audit.outcome]);
|
|
144
|
+
lines.push(`Turns: ${audit.userTurns} user, ${audit.assistantTurns} assistant`);
|
|
145
|
+
const t = audit.toolCalls;
|
|
146
|
+
lines.push(`Tools: ${t.started} started, ${t.completed} completed, ${t.failed} failed, ${t.aborted} aborted, ${t.unknown} unknown`);
|
|
147
|
+
for (const call of audit.unfinishedToolCalls) {
|
|
148
|
+
lines.push(` unfinished tool: ${call.toolName} (${call.callId || 'no call id'})`);
|
|
149
|
+
}
|
|
150
|
+
for (const agent of audit.unfinishedSubagents) {
|
|
151
|
+
lines.push(` unfinished subagent: ${agent.role} (${agent.agentId})`);
|
|
152
|
+
}
|
|
153
|
+
for (const shell of audit.unfinishedBackgroundShells) {
|
|
154
|
+
lines.push(` unfinished background shell: ${shell.command} (${shell.jobId})`);
|
|
155
|
+
}
|
|
156
|
+
for (const error of audit.errors) {
|
|
157
|
+
lines.push(` error${error.kind ? ` [${error.kind}]` : ''}: ${error.message}`);
|
|
158
|
+
}
|
|
159
|
+
if (audit.truncatedEvents > 0) {
|
|
160
|
+
lines.push(` ${audit.truncatedEvents} truncated event(s): this log is lossy`);
|
|
161
|
+
}
|
|
162
|
+
return lines.join('\n');
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=session-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-audit.js","sourceRoot":"","sources":["../../../source/services/conversation/session-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA4C,MAAM,uCAAuC,CAAC;AA6DtH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,SAAoD;IAClF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IACvD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqC,CAAC;IAChE,MAAM,MAAM,GAAyC,EAAE,CAAC;IAExD,IAAI,SAA6B,CAAC;IAClC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,eAA+C,CAAC;IAEpD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,eAAe,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,cAAc;gBACjB,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM;YACR,KAAK,cAAc;gBACjB,SAAS,EAAE,CAAC;gBACZ,mBAAmB,GAAG,IAAI,CAAC;gBAC3B,MAAM;YACR,KAAK,gBAAgB;gBACnB,cAAc,EAAE,CAAC;gBACjB,mBAAmB,GAAG,KAAK,CAAC;gBAC5B,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACjB,eAAe,GAAG,SAAS,CAAC;gBAC5B,MAAM;YACR,KAAK,MAAM;gBACT,mBAAmB,GAAG,KAAK,CAAC;gBAC5B,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACjB,eAAe,GAAG,SAAS,CAAC;gBAC5B,MAAM;YACR,KAAK,cAAc;gBACjB,OAAO,EAAE,CAAC;gBACV,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACvF,MAAM;YACR,KAAK,aAAa;gBAChB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;oBAAE,SAAS,EAAE,CAAC;qBACzC,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;oBAAE,MAAM,EAAE,CAAC;qBACxC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;oBAAE,OAAO,EAAE,CAAC;;oBAC1C,OAAO,EAAE,CAAC;gBACf,MAAM;YACR,KAAK,mBAAmB,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACrC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC5E,eAAe,GAAG,OAAO,CAAC;gBAC1B,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACtE,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,mBAAmB;gBACtB,eAAe,GAAG,SAAS,CAAC;gBAC5B,MAAM;YACR,KAAK,kBAAkB;gBACrB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC/E,MAAM;YACR,KAAK,oBAAoB;gBACvB,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC3C,MAAM;YACR,KAAK,sBAAsB,CAAC;YAC5B,KAAK,sBAAsB;gBACzB,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpC,MAAM;YACR,KAAK,0BAA0B;gBAC7B,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC5E,MAAM;YACR,KAAK,4BAA4B;gBAC/B,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpG,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,OAAO,GACX,SAAS,KAAK,CAAC;QACb,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC;gBAChC,CAAC,CAAC,sBAAsB;gBACxB,CAAC,CAAC,mBAAmB;oBACrB,CAAC,CAAC,sBAAsB;oBACxB,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,SAAS;QACT,OAAO;QACP,SAAS;QACT,cAAc;QACd,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;QAC3D,mBAAmB;QACnB,mBAAmB,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;QAChD,0BAA0B,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;QACpD,MAAM;QACN,eAAe;QACf,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAAmC;IACtD,KAAK,EAAE,8BAA8B;IACrC,OAAO,EAAE,iDAAiD;IAC1D,iBAAiB,EAAE,0DAA0D;IAC7E,oBAAoB,EAAE,sDAAsD;IAC5E,oBAAoB,EAAE,sDAAsD;CAC7E,CAAC;AAEF,gEAAgE;AAChE,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,SAAS,IAAI,WAAW,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,SAAS,UAAU,KAAK,CAAC,cAAc,YAAY,CAAC,CAAC;IAChF,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,IAAI,CACR,UAAU,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,SAAS,eAAe,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,OAAO,UAAU,CACxH,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,IAAI,YAAY,GAAG,CAAC,CAAC;IACrF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;IACxE,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,0BAA0B,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,kCAAkC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IACjF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,eAAe,wCAAwC,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const MIN_SESSION_BROWSER_CHARS = 512;
|
|
2
|
+
export declare const MAX_SESSION_BROWSER_CHARS = 12000;
|
|
3
|
+
export type SessionBrowserContext = {
|
|
4
|
+
projectPath: string;
|
|
5
|
+
sshHost?: string;
|
|
6
|
+
};
|
|
7
|
+
type BrowserError = {
|
|
8
|
+
error: {
|
|
9
|
+
code: 'not_found' | 'session_unavailable' | 'invalid_cursor' | 'stale_cursor' | 'output_budget_exceeded';
|
|
10
|
+
message: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export type SessionListInput = {
|
|
14
|
+
limit?: number;
|
|
15
|
+
maxChars?: number;
|
|
16
|
+
};
|
|
17
|
+
export type SessionSearchInput = {
|
|
18
|
+
query: string;
|
|
19
|
+
limit?: number;
|
|
20
|
+
maxChars?: number;
|
|
21
|
+
};
|
|
22
|
+
export type SessionReadInput = {
|
|
23
|
+
id: string;
|
|
24
|
+
cursor?: string;
|
|
25
|
+
limit?: number;
|
|
26
|
+
maxChars?: number;
|
|
27
|
+
};
|
|
28
|
+
export declare class SessionBrowser {
|
|
29
|
+
private readonly getContext;
|
|
30
|
+
constructor(getContext: () => SessionBrowserContext);
|
|
31
|
+
list(input: SessionListInput): number | BrowserError | {
|
|
32
|
+
sessions: Array<Record<string, unknown>>;
|
|
33
|
+
omitted: number;
|
|
34
|
+
unavailable: number;
|
|
35
|
+
};
|
|
36
|
+
search(input: SessionSearchInput): number | BrowserError | {
|
|
37
|
+
results: Array<Record<string, unknown>>;
|
|
38
|
+
omitted: number;
|
|
39
|
+
unavailable: number;
|
|
40
|
+
skippedMessageCount: number;
|
|
41
|
+
};
|
|
42
|
+
read(input: SessionReadInput): unknown;
|
|
43
|
+
private conversations;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=session-browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-browser.d.ts","sourceRoot":"","sources":["../../../source/services/conversation/session-browser.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAQhD,MAAM,MAAM,qBAAqB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAG9E,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE;QACL,IAAI,EAAE,WAAW,GAAG,qBAAqB,GAAG,gBAAgB,GAAG,cAAc,GAAG,wBAAwB,CAAC;QACzG,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACrE,MAAM,MAAM,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACtF,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElG,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAvC,YAA6B,UAAU,EAAE,MAAM,qBAAqB,EAAI;IAExE,IAAI,CAAC,KAAK,EAAE,gBAAgB;kBAYO,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;MAiBhE;IAED,MAAM,CAAC,KAAK,EAAE,kBAAkB;iBA4CE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;;MAQ/D;IAED,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAgGrC;IAED,OAAO,CAAC,aAAa;CAUtB"}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import { browseConversationsForProject, loadConversationForProjectReadOnly, } from './conversation-persistence.js';
|
|
2
|
+
import { boundedJsonFailure, fitSerializedEnvelope, fitsSerializedText, safeUtf16Slice, } from '../../utils/output/bounded-json.js';
|
|
3
|
+
import { matchCenteredSnippet } from '../../utils/output/text-snippet.js';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
export const MIN_SESSION_BROWSER_CHARS = 512;
|
|
6
|
+
export const MAX_SESSION_BROWSER_CHARS = 12_000;
|
|
7
|
+
const DEFAULT_INDEX_CHARS = 12_000;
|
|
8
|
+
const DEFAULT_READ_CHARS = 12_000;
|
|
9
|
+
const DEFAULT_LIMIT = 10;
|
|
10
|
+
const DEFAULT_READ_LIMIT = 20;
|
|
11
|
+
const SNIPPET_CHARS = 240;
|
|
12
|
+
const SAFE_SESSION_ID = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
|
|
13
|
+
export class SessionBrowser {
|
|
14
|
+
getContext;
|
|
15
|
+
constructor(getContext) {
|
|
16
|
+
this.getContext = getContext;
|
|
17
|
+
}
|
|
18
|
+
list(input) {
|
|
19
|
+
const budget = input.maxChars ?? DEFAULT_INDEX_CHARS;
|
|
20
|
+
const browsed = this.conversations();
|
|
21
|
+
let unavailable = browsed.unavailable;
|
|
22
|
+
const conversations = browsed.conversations;
|
|
23
|
+
const candidates = [];
|
|
24
|
+
for (const conversation of conversations) {
|
|
25
|
+
const projection = project(conversation);
|
|
26
|
+
if (!projection || !isBrowsableSession(conversation))
|
|
27
|
+
unavailable++;
|
|
28
|
+
else
|
|
29
|
+
candidates.push({ conversation, projection });
|
|
30
|
+
}
|
|
31
|
+
const selected = candidates.slice(0, clamp(input.limit, DEFAULT_LIMIT));
|
|
32
|
+
const result = { sessions: [], omitted: 0, unavailable };
|
|
33
|
+
for (const { conversation, projection } of selected) {
|
|
34
|
+
const firstUser = projection.records.find((record) => record.kind === 'user' && record.text);
|
|
35
|
+
const item = {
|
|
36
|
+
id: conversation.id,
|
|
37
|
+
createdAt: conversation.createdAt,
|
|
38
|
+
updatedAt: updatedAt(conversation),
|
|
39
|
+
...(firstUser ? { firstUserMessage: prefixSnippet(firstUser.text) } : {}),
|
|
40
|
+
...(conversation.model ? { model: conversation.model } : {}),
|
|
41
|
+
...(conversation.provider ? { provider: conversation.provider } : {}),
|
|
42
|
+
messageCount: projection.records.length,
|
|
43
|
+
};
|
|
44
|
+
const candidate = fitted({ ...result, sessions: [...result.sessions, item], omitted: selected.length }, budget);
|
|
45
|
+
if (candidate)
|
|
46
|
+
result.sessions = candidate.sessions;
|
|
47
|
+
else
|
|
48
|
+
result.omitted++;
|
|
49
|
+
}
|
|
50
|
+
return fitted(result, budget) ?? outputBudgetError(budget);
|
|
51
|
+
}
|
|
52
|
+
search(input) {
|
|
53
|
+
const budget = input.maxChars ?? DEFAULT_INDEX_CHARS;
|
|
54
|
+
const terms = termsFor(input.query);
|
|
55
|
+
const browsed = this.conversations();
|
|
56
|
+
let unavailable = browsed.unavailable;
|
|
57
|
+
const conversations = browsed.conversations;
|
|
58
|
+
let skippedMessageCount = 0;
|
|
59
|
+
const matches = [];
|
|
60
|
+
for (const conversation of conversations) {
|
|
61
|
+
const projection = project(conversation);
|
|
62
|
+
if (!projection || !isBrowsableSession(conversation)) {
|
|
63
|
+
unavailable++;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
skippedMessageCount += projection.skipped;
|
|
67
|
+
for (const record of projection.records) {
|
|
68
|
+
if (!record.text)
|
|
69
|
+
continue;
|
|
70
|
+
const score = scoreText(record.text, terms);
|
|
71
|
+
if (score)
|
|
72
|
+
matches.push({
|
|
73
|
+
sessionId: conversation.id,
|
|
74
|
+
kind: record.kind,
|
|
75
|
+
messageIndex: record.index,
|
|
76
|
+
snippet: matchCenteredSnippet(record.text, terms, SNIPPET_CHARS),
|
|
77
|
+
updatedAt: updatedAt(conversation),
|
|
78
|
+
score,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
matches.sort((a, b) => b.score - a.score ||
|
|
83
|
+
b.updatedAt.localeCompare(a.updatedAt) ||
|
|
84
|
+
a.sessionId.localeCompare(b.sessionId) ||
|
|
85
|
+
a.messageIndex - b.messageIndex);
|
|
86
|
+
const selected = matches.slice(0, clamp(input.limit, DEFAULT_LIMIT));
|
|
87
|
+
const result = { results: [], omitted: 0, unavailable, skippedMessageCount };
|
|
88
|
+
for (const match of selected) {
|
|
89
|
+
const { score: _, ...item } = match;
|
|
90
|
+
const candidate = fitted({ ...result, results: [...result.results, item], omitted: selected.length }, budget);
|
|
91
|
+
if (candidate)
|
|
92
|
+
result.results = candidate.results;
|
|
93
|
+
else
|
|
94
|
+
result.omitted++;
|
|
95
|
+
}
|
|
96
|
+
return fitted(result, budget) ?? outputBudgetError(budget);
|
|
97
|
+
}
|
|
98
|
+
read(input) {
|
|
99
|
+
const budget = input.maxChars ?? DEFAULT_READ_CHARS;
|
|
100
|
+
if (!SAFE_SESSION_ID.test(input.id))
|
|
101
|
+
return boundedError('not_found', 'Session was not found.', budget);
|
|
102
|
+
const context = this.getContext();
|
|
103
|
+
const loaded = loadConversationForProjectReadOnly(input.id, context.projectPath, context.sshHost);
|
|
104
|
+
if (loaded.status === 'not_found' || loaded.status === 'project_mismatch')
|
|
105
|
+
return boundedError('not_found', 'Session was not found.', budget);
|
|
106
|
+
if (loaded.status !== 'loaded' || loaded.conversation.id !== input.id || !loaded.conversation.createdAt)
|
|
107
|
+
return boundedError('session_unavailable', 'Session transcript is unavailable.', budget);
|
|
108
|
+
const conversation = loaded.conversation;
|
|
109
|
+
const projection = project(conversation);
|
|
110
|
+
if (!projection || !isBrowsableSession(conversation))
|
|
111
|
+
return boundedError('session_unavailable', 'Session transcript is unavailable.', budget);
|
|
112
|
+
const currentUpdatedAt = updatedAt(conversation);
|
|
113
|
+
const currentRevision = revision(conversation, projection);
|
|
114
|
+
const cursor = input.cursor
|
|
115
|
+
? decodeCursor(input.cursor, input.id)
|
|
116
|
+
: { updatedAt: currentUpdatedAt, revision: currentRevision, nextIndex: 0, nextTextOffset: 0 };
|
|
117
|
+
if (!cursor)
|
|
118
|
+
return boundedError('invalid_cursor', 'The session cursor is invalid.', budget);
|
|
119
|
+
if (input.cursor && (cursor.updatedAt !== currentUpdatedAt || cursor.revision !== currentRevision))
|
|
120
|
+
return boundedError('stale_cursor', 'The session cursor is stale.', budget);
|
|
121
|
+
if (input.cursor && !validCursorPosition(cursor, projection.records))
|
|
122
|
+
return boundedError('invalid_cursor', 'The session cursor is invalid.', budget);
|
|
123
|
+
const session = {
|
|
124
|
+
id: conversation.id,
|
|
125
|
+
createdAt: conversation.createdAt,
|
|
126
|
+
updatedAt: currentUpdatedAt,
|
|
127
|
+
...(conversation.model ? { model: conversation.model } : {}),
|
|
128
|
+
...(conversation.provider ? { provider: conversation.provider } : {}),
|
|
129
|
+
};
|
|
130
|
+
const items = [];
|
|
131
|
+
let index = cursor.nextIndex;
|
|
132
|
+
let offset = cursor.nextTextOffset;
|
|
133
|
+
let omitted = 0;
|
|
134
|
+
const limit = clamp(input.limit, DEFAULT_READ_LIMIT);
|
|
135
|
+
while (index < projection.records.length && items.length < limit) {
|
|
136
|
+
const record = projection.records[index];
|
|
137
|
+
if (offset > record.text.length)
|
|
138
|
+
return boundedError('invalid_cursor', 'The session cursor is invalid.', budget);
|
|
139
|
+
const completeItem = pageItem(record, record.text.slice(offset), offset, true);
|
|
140
|
+
const afterIndex = index + 1;
|
|
141
|
+
const nextCursor = afterIndex < projection.records.length
|
|
142
|
+
? encodeCursor(input.id, currentUpdatedAt, currentRevision, afterIndex, 0)
|
|
143
|
+
: undefined;
|
|
144
|
+
const candidate = fitted({
|
|
145
|
+
session,
|
|
146
|
+
items: [...items, completeItem],
|
|
147
|
+
...(nextCursor ? { nextCursor } : {}),
|
|
148
|
+
omitted: projection.records.length,
|
|
149
|
+
skippedMessageCount: projection.skipped,
|
|
150
|
+
}, budget);
|
|
151
|
+
if (candidate) {
|
|
152
|
+
items.push(completeItem);
|
|
153
|
+
index = afterIndex;
|
|
154
|
+
offset = 0;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
// Preserve source order: once fitting records already occupy this page,
|
|
158
|
+
// leave the next record for its own page rather than making an earlier
|
|
159
|
+
// page invalid by trying to append a partial later record.
|
|
160
|
+
if (items.length > 0) {
|
|
161
|
+
omitted = 1;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
if (record.text.length === offset)
|
|
165
|
+
return outputBudgetError(budget);
|
|
166
|
+
const chunk = largestChunk(record, offset, (text) => {
|
|
167
|
+
const next = encodeCursor(input.id, currentUpdatedAt, currentRevision, index, offset + text.length);
|
|
168
|
+
return fitted({
|
|
169
|
+
session,
|
|
170
|
+
items: [...items, pageItem(record, text, offset, false)],
|
|
171
|
+
nextCursor: next,
|
|
172
|
+
omitted: projection.records.length,
|
|
173
|
+
skippedMessageCount: projection.skipped,
|
|
174
|
+
}, budget);
|
|
175
|
+
});
|
|
176
|
+
if (!chunk)
|
|
177
|
+
return outputBudgetError(budget);
|
|
178
|
+
items.push(pageItem(record, chunk, offset, false));
|
|
179
|
+
offset += chunk.length;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
const nextCursor = index < projection.records.length
|
|
183
|
+
? encodeCursor(input.id, currentUpdatedAt, currentRevision, index, offset)
|
|
184
|
+
: undefined;
|
|
185
|
+
return (fitted({ session, items, ...(nextCursor ? { nextCursor } : {}), omitted, skippedMessageCount: projection.skipped }, budget) ?? outputBudgetError(budget));
|
|
186
|
+
}
|
|
187
|
+
conversations() {
|
|
188
|
+
const context = this.getContext();
|
|
189
|
+
const result = browseConversationsForProject(context.projectPath, context.sshHost);
|
|
190
|
+
return {
|
|
191
|
+
unavailable: result.unavailable,
|
|
192
|
+
conversations: result.conversations.sort((a, b) => updatedAt(b).localeCompare(updatedAt(a)) || a.id.localeCompare(b.id)),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function project(conversation) {
|
|
197
|
+
const records = [];
|
|
198
|
+
let skipped = 0;
|
|
199
|
+
for (let index = 0; index < conversation.messages.length; index++) {
|
|
200
|
+
const message = conversation.messages[index];
|
|
201
|
+
switch (message.sender) {
|
|
202
|
+
case 'user':
|
|
203
|
+
if (typeof message.text !== 'string')
|
|
204
|
+
return null;
|
|
205
|
+
records.push({ index, kind: 'user', text: message.text });
|
|
206
|
+
break;
|
|
207
|
+
case 'bot':
|
|
208
|
+
if (typeof message.text !== 'string')
|
|
209
|
+
return null;
|
|
210
|
+
records.push({ index, kind: 'assistant', text: message.text });
|
|
211
|
+
break;
|
|
212
|
+
case 'reasoning':
|
|
213
|
+
if (typeof message.text !== 'string')
|
|
214
|
+
return null;
|
|
215
|
+
records.push({ index, kind: 'reasoning', text: message.text });
|
|
216
|
+
break;
|
|
217
|
+
case 'system':
|
|
218
|
+
if (typeof message.text !== 'string')
|
|
219
|
+
return null;
|
|
220
|
+
records.push({ index, kind: 'system', text: message.text });
|
|
221
|
+
break;
|
|
222
|
+
case 'command':
|
|
223
|
+
if (typeof message.command !== 'string' || (message.output !== undefined && typeof message.output !== 'string'))
|
|
224
|
+
return null;
|
|
225
|
+
records.push({
|
|
226
|
+
index,
|
|
227
|
+
kind: 'tool',
|
|
228
|
+
text: message.output ? `${message.command}\n${message.output}` : message.command,
|
|
229
|
+
});
|
|
230
|
+
break;
|
|
231
|
+
case 'subagent':
|
|
232
|
+
if (typeof message.task !== 'string' ||
|
|
233
|
+
(message.finalText !== undefined && typeof message.finalText !== 'string'))
|
|
234
|
+
return null;
|
|
235
|
+
records.push({
|
|
236
|
+
index,
|
|
237
|
+
kind: 'subagent',
|
|
238
|
+
text: message.finalText !== undefined ? `${message.task}\n${message.finalText}` : message.task,
|
|
239
|
+
});
|
|
240
|
+
break;
|
|
241
|
+
default:
|
|
242
|
+
skipped++;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return { records, skipped };
|
|
246
|
+
}
|
|
247
|
+
function updatedAt(conversation) {
|
|
248
|
+
return conversation.updatedAt ?? conversation.createdAt;
|
|
249
|
+
}
|
|
250
|
+
function clamp(value, fallback) {
|
|
251
|
+
return Math.max(1, Math.min(50, value ?? fallback));
|
|
252
|
+
}
|
|
253
|
+
function termsFor(query) {
|
|
254
|
+
return query
|
|
255
|
+
.trim()
|
|
256
|
+
.split(/\s+/)
|
|
257
|
+
.filter(Boolean)
|
|
258
|
+
.map((term) => term.toLowerCase());
|
|
259
|
+
}
|
|
260
|
+
function scoreText(text, terms) {
|
|
261
|
+
const lower = text.toLowerCase();
|
|
262
|
+
return terms.reduce((total, term) => total + (lower === term ? 100 : lower.startsWith(term) ? 20 : lower.includes(term) ? 2 : 0), 0);
|
|
263
|
+
}
|
|
264
|
+
function prefixSnippet(text) {
|
|
265
|
+
if (text.length <= SNIPPET_CHARS)
|
|
266
|
+
return text;
|
|
267
|
+
return `${safeUtf16Slice(text, 0, SNIPPET_CHARS - 1)}…`;
|
|
268
|
+
}
|
|
269
|
+
function pageItem(record, text, textOffset, complete) {
|
|
270
|
+
return { index: record.index, kind: record.kind, text, textOffset, totalTextChars: record.text.length, complete };
|
|
271
|
+
}
|
|
272
|
+
function fitted(value, maxChars) {
|
|
273
|
+
const result = fitSerializedEnvelope((charsUsed) => ({ ...value, charsUsed }), { maxChars });
|
|
274
|
+
return result?.value ?? null;
|
|
275
|
+
}
|
|
276
|
+
function outputBudgetError(maxChars) {
|
|
277
|
+
return boundedError('output_budget_exceeded', 'The requested result cannot fit in the output budget.', maxChars);
|
|
278
|
+
}
|
|
279
|
+
function boundedError(code, message, maxChars) {
|
|
280
|
+
const value = { error: { code, message } };
|
|
281
|
+
if (fitsSerializedText(JSON.stringify(value), { maxChars }))
|
|
282
|
+
return value;
|
|
283
|
+
const fallback = boundedJsonFailure({ maxChars });
|
|
284
|
+
return fallback ? JSON.parse(fallback) : 0;
|
|
285
|
+
}
|
|
286
|
+
function largestChunk(record, offset, fits) {
|
|
287
|
+
let low = 1;
|
|
288
|
+
let high = record.text.length - offset;
|
|
289
|
+
let best = '';
|
|
290
|
+
while (low <= high) {
|
|
291
|
+
const middle = Math.floor((low + high) / 2);
|
|
292
|
+
const text = safeUtf16Slice(record.text, offset, offset + middle);
|
|
293
|
+
if (text && fits(text)) {
|
|
294
|
+
best = text;
|
|
295
|
+
low = middle + 1;
|
|
296
|
+
}
|
|
297
|
+
else
|
|
298
|
+
high = middle - 1;
|
|
299
|
+
}
|
|
300
|
+
return best;
|
|
301
|
+
}
|
|
302
|
+
function encodeCursor(sessionId, updatedAt, revision, nextIndex, nextTextOffset) {
|
|
303
|
+
return Buffer.from(JSON.stringify({ v: 1, sessionId, updatedAt, revision, nextIndex, nextTextOffset })).toString('base64url');
|
|
304
|
+
}
|
|
305
|
+
function decodeCursor(cursor, id) {
|
|
306
|
+
try {
|
|
307
|
+
if (!/^[A-Za-z0-9_-]+$/.test(cursor))
|
|
308
|
+
return null;
|
|
309
|
+
const decoded = Buffer.from(cursor, 'base64url').toString('utf8');
|
|
310
|
+
if (Buffer.from(decoded, 'utf8').toString('base64url') !== cursor)
|
|
311
|
+
return null;
|
|
312
|
+
const value = JSON.parse(decoded);
|
|
313
|
+
const nextIndex = value.nextIndex;
|
|
314
|
+
const nextTextOffset = value.nextTextOffset;
|
|
315
|
+
if (decoded !== JSON.stringify(value) ||
|
|
316
|
+
Object.keys(value).join(',') !== 'v,sessionId,updatedAt,revision,nextIndex,nextTextOffset' ||
|
|
317
|
+
value.v !== 1 ||
|
|
318
|
+
value.sessionId !== id ||
|
|
319
|
+
!isUtcTimestamp(value.updatedAt) ||
|
|
320
|
+
typeof value.revision !== 'string' ||
|
|
321
|
+
!/^[A-Za-z0-9_-]{16}$/.test(value.revision) ||
|
|
322
|
+
typeof nextIndex !== 'number' ||
|
|
323
|
+
typeof nextTextOffset !== 'number' ||
|
|
324
|
+
!Number.isSafeInteger(nextIndex) ||
|
|
325
|
+
!Number.isSafeInteger(nextTextOffset) ||
|
|
326
|
+
nextIndex < 0 ||
|
|
327
|
+
nextTextOffset < 0)
|
|
328
|
+
return null;
|
|
329
|
+
return { updatedAt: value.updatedAt, revision: value.revision, nextIndex, nextTextOffset };
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
function isBrowsableSession(conversation) {
|
|
336
|
+
return (SAFE_SESSION_ID.test(conversation.id) &&
|
|
337
|
+
isUtcTimestamp(conversation.createdAt) &&
|
|
338
|
+
isUtcTimestamp(updatedAt(conversation)) &&
|
|
339
|
+
(conversation.model === undefined || typeof conversation.model === 'string') &&
|
|
340
|
+
(conversation.provider === undefined || typeof conversation.provider === 'string'));
|
|
341
|
+
}
|
|
342
|
+
function validCursorPosition(cursor, records) {
|
|
343
|
+
if (cursor.nextIndex > records.length)
|
|
344
|
+
return false;
|
|
345
|
+
if (cursor.nextIndex === records.length)
|
|
346
|
+
return false;
|
|
347
|
+
const text = records[cursor.nextIndex].text;
|
|
348
|
+
if (cursor.nextTextOffset === 0)
|
|
349
|
+
return true;
|
|
350
|
+
if (cursor.nextTextOffset >= text.length)
|
|
351
|
+
return false;
|
|
352
|
+
return !(isHighSurrogate(text.charCodeAt(cursor.nextTextOffset - 1)) &&
|
|
353
|
+
isLowSurrogate(text.charCodeAt(cursor.nextTextOffset)));
|
|
354
|
+
}
|
|
355
|
+
function revision(conversation, projection) {
|
|
356
|
+
return createHash('sha256')
|
|
357
|
+
.update(JSON.stringify({
|
|
358
|
+
id: conversation.id,
|
|
359
|
+
createdAt: conversation.createdAt,
|
|
360
|
+
model: conversation.model,
|
|
361
|
+
provider: conversation.provider,
|
|
362
|
+
records: projection.records,
|
|
363
|
+
skipped: projection.skipped,
|
|
364
|
+
}))
|
|
365
|
+
.digest()
|
|
366
|
+
.subarray(0, 12)
|
|
367
|
+
.toString('base64url');
|
|
368
|
+
}
|
|
369
|
+
function isUtcTimestamp(value) {
|
|
370
|
+
return (typeof value === 'string' &&
|
|
371
|
+
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(value) &&
|
|
372
|
+
!Number.isNaN(Date.parse(value)));
|
|
373
|
+
}
|
|
374
|
+
function isHighSurrogate(value) {
|
|
375
|
+
return value >= 0xd800 && value <= 0xdbff;
|
|
376
|
+
}
|
|
377
|
+
function isLowSurrogate(value) {
|
|
378
|
+
return value >= 0xdc00 && value <= 0xdfff;
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=session-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-browser.js","sourceRoot":"","sources":["../../../source/services/conversation/session-browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type UserTurn } from '../types/user-turn.js';
|
|
2
|
+
declare const inputSurgeApprovalBrand: unique symbol;
|
|
3
|
+
/**
|
|
4
|
+
* One-use authority to admit a previously confirmed input-surge request.
|
|
5
|
+
*
|
|
6
|
+
* The brand is intentionally opaque. Runtime provenance and the content
|
|
7
|
+
* binding live in the module-private WeakMap, so a structurally similar value
|
|
8
|
+
* supplied by a caller has no authority.
|
|
9
|
+
*/
|
|
10
|
+
export type InputSurgeApproval = {
|
|
11
|
+
readonly [inputSurgeApprovalBrand]: never;
|
|
12
|
+
};
|
|
13
|
+
/** Issue one approval for exactly the normalized turn that was confirmed. */
|
|
14
|
+
export declare function issueInputSurgeApproval(input: string | UserTurn): InputSurgeApproval;
|
|
15
|
+
/**
|
|
16
|
+
* Validate and consume an approval at the provider-request admission boundary.
|
|
17
|
+
* An issued approval is single-use even when the presented content differs.
|
|
18
|
+
*/
|
|
19
|
+
export declare function consumeInputSurgeApproval(approval: unknown, input: string | UserTurn): boolean;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=input-surge-approval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-surge-approval.d.ts","sourceRoot":"","sources":["../../source/services/input-surge-approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEzE,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,MAAM,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,CAAC,uBAAuB,CAAC,EAAE,KAAK,CAAC;CAC3C,CAAC;AAyBF,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,kBAAkB,CAIpF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAM9F"}
|