@cjhyy/code-shell-core 0.7.1 → 0.8.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 +36 -23
- package/dist/agent/agent-definition-registry.d.ts +2 -2
- package/dist/agent/agent-definition-registry.js +47 -10
- package/dist/agent/agent-definition.d.ts +5 -0
- package/dist/agent/agent-definition.js +14 -0
- package/dist/automation/index.d.ts +7 -4
- package/dist/automation/index.js +4 -2
- package/dist/automation/runner.js +3 -1
- package/dist/automation/scheduler.d.ts +57 -1
- package/dist/automation/scheduler.js +123 -23
- package/dist/automation/store.d.ts +6 -2
- package/dist/automation/store.js +7 -3
- package/dist/capabilities/index.d.ts +109 -0
- package/dist/capabilities/index.js +80 -0
- package/dist/capability-control/disabled-lists.d.ts +2 -1
- package/dist/capability-control/disabled-lists.js +3 -5
- package/dist/capability-control/overlay.d.ts +14 -1
- package/dist/capability-control/overlay.js +40 -0
- package/dist/capability-control/service.js +6 -4
- package/dist/cli/agent-server-stdio.d.ts +1 -1
- package/dist/cli/agent-server-stdio.js +66 -6
- package/dist/cli/agent-server-tcp.js +7 -3
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +17 -1
- package/dist/context/manager.js +36 -1
- package/dist/credentials/access.d.ts +3 -1
- package/dist/credentials/access.js +24 -3
- package/dist/credentials/index.d.ts +1 -1
- package/dist/credentials/index.js +1 -1
- package/dist/credentials/oauth.d.ts +4 -1
- package/dist/credentials/oauth.js +14 -0
- package/dist/credentials/store.d.ts +15 -1
- package/dist/credentials/store.js +17 -4
- package/dist/credentials/types.d.ts +24 -0
- package/dist/credentials/use-credential-tool.js +15 -1
- package/dist/engine/auxiliary-pipeline.d.ts +40 -0
- package/dist/engine/auxiliary-pipeline.js +181 -0
- package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
- package/dist/{settings → engine}/disk-defaults.js +5 -2
- package/dist/engine/dynamic-tool-defs.d.ts +4 -0
- package/dist/engine/dynamic-tool-defs.js +4 -0
- package/dist/engine/engine.d.ts +254 -195
- package/dist/engine/engine.js +1812 -2041
- package/dist/engine/file-history-hook.d.ts +11 -0
- package/dist/engine/file-history-hook.js +31 -0
- package/dist/engine/goal-judge-context.d.ts +9 -0
- package/dist/engine/goal-judge-context.js +234 -0
- package/dist/engine/injected-context-cache.d.ts +6 -0
- package/dist/engine/injected-context-cache.js +13 -0
- package/dist/engine/input-attachments.d.ts +1 -1
- package/dist/engine/model-facade.d.ts +3 -3
- package/dist/engine/model-facade.js +15 -14
- package/dist/engine/permission-controller.d.ts +55 -0
- package/dist/engine/permission-controller.js +148 -0
- package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
- package/dist/engine/prompt-cache-diagnostics.js +178 -0
- package/dist/engine/run-accounting.d.ts +41 -0
- package/dist/engine/run-accounting.js +126 -0
- package/dist/engine/run-context.d.ts +44 -0
- package/dist/engine/run-context.js +88 -0
- package/dist/engine/run-environment.d.ts +30 -0
- package/dist/engine/run-environment.js +77 -0
- package/dist/engine/run-finalize.d.ts +58 -0
- package/dist/engine/run-finalize.js +245 -0
- package/dist/engine/run-goal.d.ts +58 -0
- package/dist/engine/run-goal.js +188 -0
- package/dist/engine/run-image-input.d.ts +1 -1
- package/dist/engine/run-image-input.js +5 -3
- package/dist/engine/run-session-open.d.ts +41 -0
- package/dist/engine/run-session-open.js +186 -0
- package/dist/engine/run-setup.d.ts +42 -0
- package/dist/engine/run-setup.js +58 -0
- package/dist/engine/run-tooling.d.ts +125 -0
- package/dist/engine/run-tooling.js +283 -0
- package/dist/engine/run-types.d.ts +139 -0
- package/dist/engine/run-types.js +12 -0
- package/dist/engine/run-workspace.d.ts +50 -0
- package/dist/engine/run-workspace.js +114 -0
- package/dist/engine/steer-queue.d.ts +1 -1
- package/dist/engine/subagent-spawner.d.ts +32 -0
- package/dist/engine/subagent-spawner.js +287 -0
- package/dist/engine/tool-summary.d.ts +2 -2
- package/dist/engine/tool-summary.js +2 -2
- package/dist/engine/turn-loop.d.ts +49 -10
- package/dist/engine/turn-loop.js +370 -104
- package/dist/engine/types.d.ts +30 -3
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +24 -10
- package/dist/hooks/goal-stop-hook.d.ts +17 -28
- package/dist/hooks/goal-stop-hook.js +110 -465
- package/dist/hooks/registry.js +1 -1
- package/dist/index.d.ts +48 -108
- package/dist/index.extension.d.ts +51 -0
- package/dist/index.extension.js +39 -0
- package/dist/index.internal.d.ts +86 -0
- package/dist/index.internal.js +92 -0
- package/dist/index.js +34 -123
- package/dist/links/cli.d.ts +48 -0
- package/dist/links/cli.js +617 -0
- package/dist/links/http.d.ts +40 -0
- package/dist/links/http.js +166 -0
- package/dist/links/index.d.ts +4 -0
- package/dist/links/index.js +3 -0
- package/dist/links/link-action-tool.d.ts +5 -0
- package/dist/links/link-action-tool.js +241 -0
- package/dist/links/providers.d.ts +8 -0
- package/dist/links/providers.js +665 -0
- package/dist/links/types.d.ts +44 -0
- package/dist/llm/client-base.d.ts +7 -0
- package/dist/llm/client-base.js +60 -0
- package/dist/llm/model-pool.d.ts +1 -1
- package/dist/llm/model-pool.js +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -0
- package/dist/llm/providers/anthropic.js +9 -0
- package/dist/llm/providers/openai.d.ts +1 -0
- package/dist/llm/providers/openai.js +17 -0
- package/dist/model-catalog/index.js +15 -2
- package/dist/model-catalog/resolve.d.ts +13 -1
- package/dist/model-catalog/resolve.js +37 -2
- package/dist/model-catalog/types.d.ts +74 -48
- package/dist/model-catalog/types.js +16 -5
- package/dist/model-catalog/upsert.d.ts +3 -1
- package/dist/model-catalog/upsert.js +9 -0
- package/dist/onboarding.d.ts +0 -1
- package/dist/onboarding.js +1 -22
- package/dist/panel-apps/bindings.d.ts +24 -0
- package/dist/panel-apps/bindings.js +69 -0
- package/dist/panel-apps/github-archive.d.ts +21 -0
- package/dist/panel-apps/github-archive.js +98 -0
- package/dist/panel-apps/index.d.ts +4 -0
- package/dist/panel-apps/index.js +4 -0
- package/dist/panel-apps/installer.d.ts +68 -0
- package/dist/panel-apps/installer.js +622 -0
- package/dist/panel-apps/manifest.d.ts +364 -0
- package/dist/panel-apps/manifest.js +189 -0
- package/dist/panel-apps/paths.d.ts +13 -0
- package/dist/panel-apps/paths.js +38 -0
- package/dist/panel-apps/registry.d.ts +51 -0
- package/dist/panel-apps/registry.js +99 -0
- package/dist/panel-apps/runtime.d.ts +80 -0
- package/dist/panel-apps/runtime.js +154 -0
- package/dist/plugins/gitOps.js +8 -1
- package/dist/plugins/installedPlugins.d.ts +2 -1
- package/dist/plugins/installedPlugins.js +146 -8
- package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
- package/dist/plugins/installer/codex/convertAgents.js +62 -8
- package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
- package/dist/plugins/installer/codex/convertCommands.js +35 -12
- package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
- package/dist/plugins/installer/codex/convertHooks.js +82 -0
- package/dist/plugins/installer/codex/convertSkills.js +41 -6
- package/dist/plugins/installer/install.d.ts +7 -1
- package/dist/plugins/installer/install.js +21 -87
- package/dist/plugins/installer/installFromArchive.d.ts +26 -4
- package/dist/plugins/installer/installFromArchive.js +44 -27
- package/dist/plugins/installer/installFromNpm.d.ts +31 -0
- package/dist/plugins/installer/installFromNpm.js +273 -0
- package/dist/plugins/installer/loadPluginAgents.js +17 -4
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +245 -35
- package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
- package/dist/plugins/installer/normalizeManifest.js +306 -0
- package/dist/plugins/installer/npmTar.d.ts +13 -0
- package/dist/plugins/installer/npmTar.js +321 -0
- package/dist/plugins/installer/parseSource.d.ts +11 -0
- package/dist/plugins/installer/parseSource.js +48 -0
- package/dist/plugins/installer/preview.d.ts +101 -0
- package/dist/plugins/installer/preview.js +336 -0
- package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
- package/dist/plugins/installer/projectPluginSource.js +140 -0
- package/dist/plugins/installer/types.d.ts +775 -0
- package/dist/plugins/installer/types.js +100 -0
- package/dist/plugins/installer/unzip.d.ts +11 -0
- package/dist/plugins/installer/unzip.js +123 -9
- package/dist/plugins/installer/update.d.ts +2 -2
- package/dist/plugins/installer/update.js +43 -4
- package/dist/plugins/loadPluginHooks.d.ts +19 -2
- package/dist/plugins/loadPluginHooks.js +97 -86
- package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
- package/dist/plugins/pluginAutomationTemplates.js +50 -0
- package/dist/plugins/pluginCatalog.d.ts +45 -0
- package/dist/plugins/pluginCatalog.js +87 -0
- package/dist/plugins/pluginCommandHook.d.ts +6 -0
- package/dist/plugins/pluginCommandHook.js +25 -8
- package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
- package/dist/plugins/pluginCommandsLoader.js +181 -7
- package/dist/plugins/pluginContent.d.ts +10 -1
- package/dist/plugins/pluginContent.js +87 -30
- package/dist/plugins/pluginHookApproval.d.ts +30 -0
- package/dist/plugins/pluginHookApproval.js +160 -0
- package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
- package/dist/plugins/pluginHookIntegrity.js +361 -0
- package/dist/plugins/pluginInstaller.js +71 -12
- package/dist/plugins/pluginMcpApproval.d.ts +19 -0
- package/dist/plugins/pluginMcpApproval.js +110 -0
- package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
- package/dist/plugins/pluginMcpIntegrity.js +74 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/varRewrite.d.ts +9 -5
- package/dist/plugins/varRewrite.js +26 -17
- package/dist/preset/index.d.ts +11 -8
- package/dist/preset/index.js +62 -203
- package/dist/product/define.js +9 -3
- package/dist/product/types.d.ts +0 -2
- package/dist/profile/activation.d.ts +36 -0
- package/dist/profile/activation.js +57 -0
- package/dist/profile/catalog-store.d.ts +77 -0
- package/dist/profile/catalog-store.js +346 -0
- package/dist/profile/catalog.d.ts +54 -0
- package/dist/profile/catalog.js +152 -0
- package/dist/profile/index.d.ts +7 -0
- package/dist/profile/index.js +7 -0
- package/dist/profile/requirements.d.ts +76 -0
- package/dist/profile/requirements.js +117 -0
- package/dist/profile/resolve.d.ts +11 -0
- package/dist/profile/resolve.js +41 -0
- package/dist/profile/store.d.ts +17 -0
- package/dist/profile/store.js +167 -0
- package/dist/profile/types.d.ts +321 -0
- package/dist/profile/types.js +104 -0
- package/dist/prompt/composer.d.ts +46 -7
- package/dist/prompt/composer.js +78 -48
- package/dist/prompt/instruction-scanner.d.ts +6 -5
- package/dist/prompt/instruction-scanner.js +8 -23
- package/dist/prompt/section-loader.d.ts +2 -2
- package/dist/prompt/section-loader.js +7 -4
- package/dist/prompt/sections/browser.md +10 -9
- package/dist/prompt/sections/harness-base.md +9 -0
- package/dist/protocol/chat-session-manager.d.ts +64 -1
- package/dist/protocol/chat-session-manager.js +104 -0
- package/dist/protocol/chat-session.d.ts +61 -10
- package/dist/protocol/chat-session.js +135 -25
- package/dist/protocol/client.d.ts +33 -3
- package/dist/protocol/client.js +96 -5
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +2 -2
- package/dist/protocol/mobile-remote-types.d.ts +406 -0
- package/dist/protocol/mobile-remote-types.js +1 -0
- package/dist/protocol/server.d.ts +127 -3
- package/dist/protocol/server.js +1309 -182
- package/dist/protocol/types.d.ts +152 -34
- package/dist/protocol/types.js +16 -0
- package/dist/run/ArtifactTracker.d.ts +6 -1
- package/dist/run/ArtifactTracker.js +29 -21
- package/dist/run/EngineRunner.d.ts +2 -0
- package/dist/run/EngineRunner.js +1 -0
- package/dist/run/RunManager.d.ts +26 -0
- package/dist/run/RunManager.js +82 -11
- package/dist/run/factory.d.ts +3 -0
- package/dist/run/factory.js +2 -0
- package/dist/runtime/safe-spawn.d.ts +6 -0
- package/dist/runtime/safe-spawn.js +8 -13
- package/dist/services/auto-dream.d.ts +13 -1
- package/dist/services/auto-dream.js +56 -8
- package/dist/services/dream-consolidation.js +10 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.js +4 -1
- package/dist/services/session-memory.d.ts +4 -4
- package/dist/services/session-memory.js +13 -10
- package/dist/session/memory.d.ts +26 -7
- package/dist/session/memory.js +79 -21
- package/dist/session/session-manager.d.ts +182 -28
- package/dist/session/session-manager.js +910 -130
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +46 -5
- package/dist/session/transcript.js +159 -3
- package/dist/settings/feature-flags.d.ts +40 -0
- package/dist/settings/feature-flags.js +40 -0
- package/dist/settings/manager.d.ts +39 -1
- package/dist/settings/manager.js +102 -41
- package/dist/settings/migrate-config.js +4 -2
- package/dist/settings/schema.d.ts +511 -177
- package/dist/settings/schema.js +98 -25
- package/dist/skills/scanner.d.ts +6 -2
- package/dist/skills/scanner.js +160 -9
- package/dist/sources/adapter.d.ts +14 -0
- package/dist/sources/adapter.js +7 -0
- package/dist/sources/adapters/local-files.d.ts +10 -0
- package/dist/sources/adapters/local-files.js +127 -0
- package/dist/sources/adapters/mcp-resource.d.ts +17 -0
- package/dist/sources/adapters/mcp-resource.js +41 -0
- package/dist/sources/adapters/mock.d.ts +3 -0
- package/dist/sources/adapters/mock.js +29 -0
- package/dist/sources/binding.d.ts +6 -0
- package/dist/sources/binding.js +24 -0
- package/dist/sources/catalog.d.ts +6 -0
- package/dist/sources/catalog.js +64 -0
- package/dist/sources/context-summary.d.ts +8 -0
- package/dist/sources/context-summary.js +13 -0
- package/dist/sources/credential-status.d.ts +2 -0
- package/dist/sources/credential-status.js +13 -0
- package/dist/sources/index.d.ts +10 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/resolve.d.ts +28 -0
- package/dist/sources/resolve.js +47 -0
- package/dist/sources/truncate-utf8.d.ts +7 -0
- package/dist/sources/truncate-utf8.js +18 -0
- package/dist/sources/types.d.ts +71 -0
- package/dist/sources/types.js +26 -0
- package/dist/testing/fetch-stub.d.ts +32 -0
- package/dist/testing/fetch-stub.js +24 -0
- package/dist/themes/image.d.ts +18 -0
- package/dist/themes/image.js +117 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/installer.d.ts +50 -0
- package/dist/themes/installer.js +290 -0
- package/dist/themes/manifest.d.ts +102 -0
- package/dist/themes/manifest.js +86 -0
- package/dist/themes/paths.d.ts +14 -0
- package/dist/themes/paths.js +33 -0
- package/dist/tool-system/browser-bridge.d.ts +53 -11
- package/dist/tool-system/browser-bridge.js +8 -9
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
- package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
- package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
- package/dist/tool-system/builtin/agent-notifications.js +291 -101
- package/dist/tool-system/builtin/agent-output-file.js +1 -3
- package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
- package/dist/tool-system/builtin/agent-progress.js +83 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
- package/dist/tool-system/builtin/agent-registry.js +178 -9
- package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
- package/dist/tool-system/builtin/agent.d.ts +2 -0
- package/dist/tool-system/builtin/agent.js +274 -33
- package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
- package/dist/tool-system/builtin/background-jobs.js +96 -4
- package/dist/tool-system/builtin/background-work.d.ts +6 -0
- package/dist/tool-system/builtin/background-work.js +8 -1
- package/dist/tool-system/builtin/bash.js +5 -2
- package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
- package/dist/tool-system/builtin/browser-tools.js +89 -23
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
- package/dist/tool-system/builtin/edit.js +2 -6
- package/dist/tool-system/builtin/file-cache.d.ts +2 -0
- package/dist/tool-system/builtin/file-cache.js +4 -0
- package/dist/tool-system/builtin/generate-image.js +17 -10
- package/dist/tool-system/builtin/generate-video.js +26 -7
- package/dist/tool-system/builtin/grep.js +2 -2
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +32 -7
- package/dist/tool-system/builtin/index.js +237 -167
- package/dist/tool-system/builtin/memory.d.ts +6 -0
- package/dist/tool-system/builtin/memory.js +36 -15
- package/dist/tool-system/builtin/panel.d.ts +9 -0
- package/dist/tool-system/builtin/panel.js +314 -0
- package/dist/tool-system/builtin/read.js +5 -1
- package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
- package/dist/tool-system/builtin/send-message-to-session.js +67 -0
- package/dist/tool-system/builtin/sources.d.ts +8 -0
- package/dist/tool-system/builtin/sources.js +137 -0
- package/dist/tool-system/builtin/tool-search.js +7 -2
- package/dist/tool-system/builtin/update-automation-memory.js +2 -0
- package/dist/tool-system/builtin/web-fetch.js +17 -13
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/capability-module.d.ts +93 -0
- package/dist/tool-system/capability-module.js +53 -0
- package/dist/tool-system/context.d.ts +77 -19
- package/dist/tool-system/executor.js +75 -50
- package/dist/tool-system/external-tool-exposure.d.ts +60 -0
- package/dist/tool-system/external-tool-exposure.js +304 -0
- package/dist/tool-system/mcp-manager.d.ts +11 -1
- package/dist/tool-system/mcp-manager.js +19 -4
- package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
- package/dist/tool-system/mcp-tool-policy.js +34 -0
- package/dist/tool-system/panel-bridge.d.ts +53 -0
- package/dist/tool-system/panel-bridge.js +1 -0
- package/dist/tool-system/permission.d.ts +26 -0
- package/dist/tool-system/permission.js +46 -0
- package/dist/tool-system/registry.d.ts +12 -1
- package/dist/tool-system/registry.js +31 -7
- package/dist/tool-system/sandbox/index.js +3 -8
- package/dist/tool-system/sandbox/seatbelt.js +2 -6
- package/dist/tool-system/session-tool-host.d.ts +139 -0
- package/dist/tool-system/session-tool-host.js +167 -0
- package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
- package/dist/tool-system/testing/tool-registry-harness.js +51 -0
- package/dist/tool-system/validation.d.ts +14 -7
- package/dist/tool-system/validation.js +701 -7
- package/dist/types.d.ts +186 -20
- package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
- package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
- package/dist/utils/file-mutex.d.ts +65 -0
- package/dist/utils/file-mutex.js +145 -0
- package/dist/utils/json.d.ts +2 -4
- package/dist/utils/json.js +2 -4
- package/dist/utils/lockfile.d.ts +30 -1
- package/dist/utils/lockfile.js +2 -2
- package/dist/utils/secret-scrubber.d.ts +8 -0
- package/dist/utils/secret-scrubber.js +227 -0
- package/dist/utils/toolDisplay.js +1 -1
- package/package.json +20 -5
- package/THIRD_PARTY_NOTICES.md +0 -206
- package/dist/arena/arena.d.ts +0 -45
- package/dist/arena/arena.js +0 -362
- package/dist/arena/context/context-tools.d.ts +0 -16
- package/dist/arena/context/context-tools.js +0 -272
- package/dist/arena/context/within-root.d.ts +0 -7
- package/dist/arena/context/within-root.js +0 -15
- package/dist/arena/detect-mode.d.ts +0 -20
- package/dist/arena/detect-mode.js +0 -78
- package/dist/arena/digest-builder.d.ts +0 -25
- package/dist/arena/digest-builder.js +0 -120
- package/dist/arena/index.d.ts +0 -29
- package/dist/arena/index.js +0 -29
- package/dist/arena/iterate/convergence.d.ts +0 -25
- package/dist/arena/iterate/convergence.js +0 -103
- package/dist/arena/iterate/formats/index.d.ts +0 -22
- package/dist/arena/iterate/formats/index.js +0 -283
- package/dist/arena/iterate/index.d.ts +0 -11
- package/dist/arena/iterate/index.js +0 -9
- package/dist/arena/iterate/iterative-arena.d.ts +0 -23
- package/dist/arena/iterate/iterative-arena.js +0 -237
- package/dist/arena/iterate/parse.d.ts +0 -42
- package/dist/arena/iterate/parse.js +0 -123
- package/dist/arena/iterate/phases/argue.d.ts +0 -22
- package/dist/arena/iterate/phases/argue.js +0 -165
- package/dist/arena/iterate/phases/revise.d.ts +0 -16
- package/dist/arena/iterate/phases/revise.js +0 -62
- package/dist/arena/iterate/phases/tournament.d.ts +0 -34
- package/dist/arena/iterate/phases/tournament.js +0 -113
- package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
- package/dist/arena/iterate/tools/web-tools.js +0 -54
- package/dist/arena/iterate/types.d.ts +0 -152
- package/dist/arena/iterate/types.js +0 -8
- package/dist/arena/ledger.d.ts +0 -47
- package/dist/arena/ledger.js +0 -159
- package/dist/arena/lenses/architecture.d.ts +0 -5
- package/dist/arena/lenses/architecture.js +0 -22
- package/dist/arena/lenses/engineering.d.ts +0 -5
- package/dist/arena/lenses/engineering.js +0 -22
- package/dist/arena/lenses/general.d.ts +0 -5
- package/dist/arena/lenses/general.js +0 -20
- package/dist/arena/lenses/index.d.ts +0 -16
- package/dist/arena/lenses/index.js +0 -47
- package/dist/arena/lenses/product.d.ts +0 -5
- package/dist/arena/lenses/product.js +0 -22
- package/dist/arena/model-presets.d.ts +0 -23
- package/dist/arena/model-presets.js +0 -44
- package/dist/arena/phases/adjudication.d.ts +0 -25
- package/dist/arena/phases/adjudication.js +0 -142
- package/dist/arena/phases/build-consensus.d.ts +0 -30
- package/dist/arena/phases/build-consensus.js +0 -85
- package/dist/arena/phases/claim-registry.d.ts +0 -26
- package/dist/arena/phases/claim-registry.js +0 -60
- package/dist/arena/phases/cross-review.d.ts +0 -47
- package/dist/arena/phases/cross-review.js +0 -224
- package/dist/arena/phases/debate-rounds.d.ts +0 -28
- package/dist/arena/phases/debate-rounds.js +0 -161
- package/dist/arena/phases/participant-research.d.ts +0 -39
- package/dist/arena/phases/participant-research.js +0 -316
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
- package/dist/arena/phases/planning-detail-expansion.js +0 -120
- package/dist/arena/planner.d.ts +0 -28
- package/dist/arena/planner.js +0 -312
- package/dist/arena/providers/docs.d.ts +0 -7
- package/dist/arena/providers/docs.js +0 -111
- package/dist/arena/providers/git.d.ts +0 -8
- package/dist/arena/providers/git.js +0 -174
- package/dist/arena/providers/index.d.ts +0 -32
- package/dist/arena/providers/index.js +0 -132
- package/dist/arena/providers/none.d.ts +0 -7
- package/dist/arena/providers/none.js +0 -11
- package/dist/arena/providers/repo.d.ts +0 -7
- package/dist/arena/providers/repo.js +0 -258
- package/dist/arena/render/session.d.ts +0 -17
- package/dist/arena/render/session.js +0 -190
- package/dist/arena/render/terminal.d.ts +0 -34
- package/dist/arena/render/terminal.js +0 -286
- package/dist/arena/strategies/discussion.d.ts +0 -25
- package/dist/arena/strategies/discussion.js +0 -143
- package/dist/arena/strategies/index.d.ts +0 -15
- package/dist/arena/strategies/index.js +0 -28
- package/dist/arena/strategies/language-wrapper.d.ts +0 -17
- package/dist/arena/strategies/language-wrapper.js +0 -102
- package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
- package/dist/arena/strategies/lens-wrapper.js +0 -236
- package/dist/arena/strategies/planning.d.ts +0 -30
- package/dist/arena/strategies/planning.js +0 -225
- package/dist/arena/strategies/review.d.ts +0 -26
- package/dist/arena/strategies/review.js +0 -168
- package/dist/arena/strategies/utils.d.ts +0 -36
- package/dist/arena/strategies/utils.js +0 -603
- package/dist/arena/tools/selector.d.ts +0 -17
- package/dist/arena/tools/selector.js +0 -61
- package/dist/arena/transitions.d.ts +0 -53
- package/dist/arena/transitions.js +0 -97
- package/dist/arena/types.d.ts +0 -518
- package/dist/arena/types.js +0 -27
- package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
- package/dist/cc-orchestrator/agent-adapter.js +0 -143
- package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
- package/dist/cc-orchestrator/cc-capability.js +0 -53
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
- package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
- package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
- package/dist/cc-orchestrator/codex-session-history.js +0 -247
- package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
- package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
- package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-changes.js +0 -231
- package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-driver.js +0 -284
- package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
- package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
- package/dist/cc-orchestrator/index.d.ts +0 -8
- package/dist/cc-orchestrator/index.js +0 -8
- package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
- package/dist/cc-orchestrator/relevance-judge.js +0 -29
- package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
- package/dist/cc-orchestrator/session-discovery.js +0 -125
- package/dist/cc-orchestrator/session-history.d.ts +0 -54
- package/dist/cc-orchestrator/session-history.js +0 -150
- package/dist/cron/cron-runtime.d.ts +0 -2
- package/dist/cron/cron-runtime.js +0 -2
- package/dist/cron/cron-store.d.ts +0 -2
- package/dist/cron/cron-store.js +0 -2
- package/dist/cron/scheduler.d.ts +0 -7
- package/dist/cron/scheduler.js +0 -7
- package/dist/engine/goal.js +0 -206
- package/dist/external-agents/config.d.ts +0 -2
- package/dist/external-agents/config.js +0 -15
- package/dist/external-agents/types.d.ts +0 -31
- package/dist/git/parse-log.d.ts +0 -13
- package/dist/git/parse-log.js +0 -21
- package/dist/git/utils.d.ts +0 -49
- package/dist/git/utils.js +0 -161
- package/dist/git/worktree/crud.d.ts +0 -72
- package/dist/git/worktree/crud.js +0 -235
- package/dist/git/worktree/diff.d.ts +0 -14
- package/dist/git/worktree/diff.js +0 -82
- package/dist/git/worktree/git-exec.d.ts +0 -7
- package/dist/git/worktree/git-exec.js +0 -87
- package/dist/git/worktree/index.d.ts +0 -5
- package/dist/git/worktree/index.js +0 -5
- package/dist/git/worktree/query.d.ts +0 -43
- package/dist/git/worktree/query.js +0 -128
- package/dist/git/worktree/slug.d.ts +0 -11
- package/dist/git/worktree/slug.js +0 -58
- package/dist/git/worktree.d.ts +0 -1
- package/dist/git/worktree.js +0 -5
- package/dist/lsp/client.d.ts +0 -41
- package/dist/lsp/client.js +0 -186
- package/dist/lsp/manager.d.ts +0 -40
- package/dist/lsp/manager.js +0 -155
- package/dist/lsp/root-path.d.ts +0 -9
- package/dist/lsp/root-path.js +0 -12
- package/dist/lsp/servers.d.ts +0 -16
- package/dist/lsp/servers.js +0 -60
- package/dist/prompt/sections/coding.md +0 -35
- package/dist/quota/credentials.d.ts +0 -3
- package/dist/quota/credentials.js +0 -80
- package/dist/quota/index.d.ts +0 -36
- package/dist/quota/index.js +0 -155
- package/dist/quota/types.d.ts +0 -48
- package/dist/quota/types.js +0 -13
- package/dist/review/review-prompt.d.ts +0 -28
- package/dist/review/review-prompt.js +0 -81
- package/dist/state.d.ts +0 -160
- package/dist/state.js +0 -267
- package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
- package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
- package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
- package/dist/tool-system/builtin/apply-patch/index.js +0 -105
- package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
- package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
- package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
- package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
- package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
- package/dist/tool-system/builtin/apply-patch/types.js +0 -13
- package/dist/tool-system/builtin/arena.d.ts +0 -31
- package/dist/tool-system/builtin/arena.js +0 -416
- package/dist/tool-system/builtin/brief.d.ts +0 -6
- package/dist/tool-system/builtin/brief.js +0 -41
- package/dist/tool-system/builtin/check-quota.d.ts +0 -15
- package/dist/tool-system/builtin/check-quota.js +0 -34
- package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
- package/dist/tool-system/builtin/drive-claude-code.js +0 -698
- package/dist/tool-system/builtin/lsp.d.ts +0 -7
- package/dist/tool-system/builtin/lsp.js +0 -144
- package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -127
- package/dist/tool-system/builtin/worktree.d.ts +0 -11
- package/dist/tool-system/builtin/worktree.js +0 -363
- /package/dist/{external-agents → links}/types.js +0 -0
- /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
- /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { ChatSession } from "./chat-session.js";
|
|
2
|
+
import type { SessionKind } from "../types.js";
|
|
2
3
|
import type { Engine } from "../engine/engine.js";
|
|
3
4
|
import type { EngineRuntime } from "../engine/runtime.js";
|
|
4
5
|
import type { EngineConfig } from "../engine/types.js";
|
|
5
|
-
export type EngineConfigSlice = Pick<EngineConfig, "permissionMode" | "preset" | "customSystemPrompt" | "appendSystemPrompt" | "goal" | "maxTurns" | "maxContextTokens" | "cwd" | "projectTrusted">;
|
|
6
|
+
export type EngineConfigSlice = Pick<EngineConfig, "permissionMode" | "preset" | "customSystemPrompt" | "appendSystemPrompt" | "goal" | "maxTurns" | "maxContextTokens" | "cwd" | "projectTrusted" | "sessionStorageDir">;
|
|
7
|
+
/** Identity scope every ChatSessionManager belongs to when none is injected. */
|
|
8
|
+
export declare const LOCAL_CHAT_IDENTITY = "local";
|
|
6
9
|
export interface ChatSessionManagerOptions {
|
|
7
10
|
/**
|
|
8
11
|
* Shared runtime, supplied here so callers and engineFactory closures
|
|
@@ -14,6 +17,35 @@ export interface ChatSessionManagerOptions {
|
|
|
14
17
|
engineFactory: (slice: EngineConfigSlice) => Engine;
|
|
15
18
|
maxSessions?: number;
|
|
16
19
|
idleTtlMs?: number;
|
|
20
|
+
/** Host lifecycle generation attached to Pet projection snapshots/deltas. */
|
|
21
|
+
projectionGeneration?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Identity scope this manager serves. Defaults to "local" — the single
|
|
24
|
+
* OS-user manager every host uses today. A server host that authenticates
|
|
25
|
+
* connections derives one manager per identity via {@link
|
|
26
|
+
* ChatSessionManager.forIdentity}; sessions never cross identities.
|
|
27
|
+
*/
|
|
28
|
+
identity?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Base data root used to derive per-identity session persistence
|
|
31
|
+
* (`<dataRoot>/identities/<id>/sessions`). Defaults to `codeShellHome()`
|
|
32
|
+
* (`CODE_SHELL_HOME` env → `~/.code-shell`). Only consulted when a
|
|
33
|
+
* non-default identity manager is derived — the default "local" manager
|
|
34
|
+
* never redirects persistence.
|
|
35
|
+
*/
|
|
36
|
+
dataRoot?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface LiveChatSessionSnapshot {
|
|
39
|
+
generation: number;
|
|
40
|
+
/** Identity scope of the manager that produced this snapshot. */
|
|
41
|
+
identity: string;
|
|
42
|
+
sessions: Array<{
|
|
43
|
+
sessionId: string;
|
|
44
|
+
busy: boolean;
|
|
45
|
+
queueDepth: number;
|
|
46
|
+
lastActivityAt: number;
|
|
47
|
+
kind: SessionKind;
|
|
48
|
+
}>;
|
|
17
49
|
}
|
|
18
50
|
export declare const CLOSED_CHAT_SESSION_TOMBSTONE_LIMIT = 4096;
|
|
19
51
|
export declare class ChatSessionManager {
|
|
@@ -22,12 +54,34 @@ export declare class ChatSessionManager {
|
|
|
22
54
|
private readonly closedSessions;
|
|
23
55
|
private readonly sessionGeneration;
|
|
24
56
|
readonly runtime: EngineRuntime;
|
|
57
|
+
/** Identity scope this manager serves ("local" unless injected). */
|
|
58
|
+
readonly identity: string;
|
|
25
59
|
private readonly factory;
|
|
26
60
|
private readonly maxSessions;
|
|
27
61
|
private readonly idleTtlMs;
|
|
62
|
+
private readonly projectionGeneration;
|
|
63
|
+
/** Construction options retained so forIdentity() can derive siblings. */
|
|
64
|
+
private readonly baseOptions;
|
|
28
65
|
private sweeper;
|
|
29
66
|
constructor(opts: ChatSessionManagerOptions);
|
|
67
|
+
/**
|
|
68
|
+
* Derive a manager scoped to another identity. The derived manager shares
|
|
69
|
+
* this manager's runtime/limits but persists its sessions under
|
|
70
|
+
* `<dataRoot>/identities/<identity>/sessions` by injecting
|
|
71
|
+
* `sessionStorageDir` into every engineFactory slice (Task 1's SessionManager
|
|
72
|
+
* storageDir seam). Asking for this manager's own identity returns `this`
|
|
73
|
+
* unchanged, so the default single-identity ("local") path is byte-for-byte
|
|
74
|
+
* today's behavior. Callers (AgentServer) cache derived managers per
|
|
75
|
+
* identity; each call here builds a fresh instance.
|
|
76
|
+
*/
|
|
77
|
+
forIdentity(identity: string): ChatSessionManager;
|
|
30
78
|
getOrCreate(sessionId: string, slice: EngineConfigSlice): Promise<ChatSession>;
|
|
79
|
+
/**
|
|
80
|
+
* Cold-resume a persisted session using its own cwd. The first detached
|
|
81
|
+
* Engine is only a storage probe; all actual work runs on the second Engine
|
|
82
|
+
* built from the recovered project slice.
|
|
83
|
+
*/
|
|
84
|
+
getOrCreatePersisted(sessionId: string, slice?: Partial<EngineConfigSlice>, restorePersistedModel?: boolean): Promise<ChatSession | null>;
|
|
31
85
|
private getOrCreateNow;
|
|
32
86
|
get(sessionId: string): ChatSession | undefined;
|
|
33
87
|
isClosing(sessionId: string): boolean;
|
|
@@ -41,6 +95,8 @@ export declare class ChatSessionManager {
|
|
|
41
95
|
* the values so a callback that closes a session can't perturb the walk.
|
|
42
96
|
*/
|
|
43
97
|
forEachSession(fn: (s: ChatSession) => void): void;
|
|
98
|
+
/** Snapshot-safe, read-only source shared by query("sessions") and Pet projection. */
|
|
99
|
+
getLiveSessionSnapshot(): LiveChatSessionSnapshot;
|
|
44
100
|
close(sessionId: string): Promise<void>;
|
|
45
101
|
private closeSession;
|
|
46
102
|
private rememberClosedSession;
|
|
@@ -58,3 +114,10 @@ export declare class ChatSessionManager {
|
|
|
58
114
|
private unregisterMcpOwner;
|
|
59
115
|
private engineSessionManager;
|
|
60
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Factory counterpart of `new ChatSessionManager(opts)` for identity/dataRoot
|
|
119
|
+
* aware hosts (identity dimension foundations, Task 2). Identity defaults to
|
|
120
|
+
* "local" and dataRoot to `codeShellHome()`, so omitting both is exactly the
|
|
121
|
+
* constructor every existing host already calls.
|
|
122
|
+
*/
|
|
123
|
+
export declare function createChatSessionManager(opts: ChatSessionManagerOptions): ChatSessionManager;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
1
2
|
import { ChatSession } from "./chat-session.js";
|
|
3
|
+
import { codeShellHome } from "../session/session-manager.js";
|
|
2
4
|
import { backgroundShellManager } from "../runtime/background-shell.js";
|
|
3
5
|
import { clearAgentOutputFiles } from "../tool-system/builtin/agent-output-file.js";
|
|
4
6
|
import { backgroundJobRegistry } from "../tool-system/builtin/background-jobs.js";
|
|
@@ -7,6 +9,25 @@ import { clearInjectCredentialSessionAllow } from "../credentials/inject-credent
|
|
|
7
9
|
import { logger } from "../logging/logger.js";
|
|
8
10
|
import { clearSessionPathApprovals, openSessionPathApprovals } from "../tool-system/path-policy.js";
|
|
9
11
|
import { clearInteractiveApprovalSession, openInteractiveApprovalSession, } from "../tool-system/permission.js";
|
|
12
|
+
/** Identity scope every ChatSessionManager belongs to when none is injected. */
|
|
13
|
+
export const LOCAL_CHAT_IDENTITY = "local";
|
|
14
|
+
/**
|
|
15
|
+
* An identity becomes an on-disk path segment (`<root>/identities/<id>`), so
|
|
16
|
+
* it gets the same conservative validation as session ids: no separators, no
|
|
17
|
+
* parent-dir tokens, short, and a strict character allow-list.
|
|
18
|
+
*/
|
|
19
|
+
function assertSafeIdentity(identity) {
|
|
20
|
+
if (typeof identity !== "string" || identity.length === 0 || identity.length > 64) {
|
|
21
|
+
throw new Error(`invalid identity: must be a non-empty string of at most 64 chars`);
|
|
22
|
+
}
|
|
23
|
+
if (identity.includes("/") ||
|
|
24
|
+
identity.includes("\\") ||
|
|
25
|
+
identity === "." ||
|
|
26
|
+
identity.includes("..") ||
|
|
27
|
+
!/^[A-Za-z0-9_.-]+$/.test(identity)) {
|
|
28
|
+
throw new Error(`invalid identity: unexpected characters: ${identity}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
10
31
|
export const CLOSED_CHAT_SESSION_TOMBSTONE_LIMIT = 4096;
|
|
11
32
|
export class ChatSessionManager {
|
|
12
33
|
sessions = new Map();
|
|
@@ -14,15 +35,47 @@ export class ChatSessionManager {
|
|
|
14
35
|
closedSessions = new Set();
|
|
15
36
|
sessionGeneration = new Map();
|
|
16
37
|
runtime;
|
|
38
|
+
/** Identity scope this manager serves ("local" unless injected). */
|
|
39
|
+
identity;
|
|
17
40
|
factory;
|
|
18
41
|
maxSessions;
|
|
19
42
|
idleTtlMs;
|
|
43
|
+
projectionGeneration;
|
|
44
|
+
/** Construction options retained so forIdentity() can derive siblings. */
|
|
45
|
+
baseOptions;
|
|
20
46
|
sweeper = null;
|
|
21
47
|
constructor(opts) {
|
|
22
48
|
this.runtime = opts.runtime;
|
|
49
|
+
this.identity = opts.identity ?? LOCAL_CHAT_IDENTITY;
|
|
50
|
+
if (opts.identity !== undefined)
|
|
51
|
+
assertSafeIdentity(opts.identity);
|
|
23
52
|
this.factory = opts.engineFactory;
|
|
24
53
|
this.maxSessions = opts.maxSessions ?? 16;
|
|
25
54
|
this.idleTtlMs = opts.idleTtlMs ?? 30 * 60 * 1000;
|
|
55
|
+
this.projectionGeneration = opts.projectionGeneration ?? 1;
|
|
56
|
+
this.baseOptions = opts;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Derive a manager scoped to another identity. The derived manager shares
|
|
60
|
+
* this manager's runtime/limits but persists its sessions under
|
|
61
|
+
* `<dataRoot>/identities/<identity>/sessions` by injecting
|
|
62
|
+
* `sessionStorageDir` into every engineFactory slice (Task 1's SessionManager
|
|
63
|
+
* storageDir seam). Asking for this manager's own identity returns `this`
|
|
64
|
+
* unchanged, so the default single-identity ("local") path is byte-for-byte
|
|
65
|
+
* today's behavior. Callers (AgentServer) cache derived managers per
|
|
66
|
+
* identity; each call here builds a fresh instance.
|
|
67
|
+
*/
|
|
68
|
+
forIdentity(identity) {
|
|
69
|
+
assertSafeIdentity(identity);
|
|
70
|
+
if (identity === this.identity)
|
|
71
|
+
return this;
|
|
72
|
+
const sessionStorageDir = join(this.baseOptions.dataRoot ?? codeShellHome(), "identities", identity, "sessions");
|
|
73
|
+
const baseFactory = this.baseOptions.engineFactory;
|
|
74
|
+
return new ChatSessionManager({
|
|
75
|
+
...this.baseOptions,
|
|
76
|
+
identity,
|
|
77
|
+
engineFactory: (slice) => baseFactory({ ...slice, sessionStorageDir }),
|
|
78
|
+
});
|
|
26
79
|
}
|
|
27
80
|
async getOrCreate(sessionId, slice) {
|
|
28
81
|
const closing = this.closingSessions.get(sessionId);
|
|
@@ -31,6 +84,30 @@ export class ChatSessionManager {
|
|
|
31
84
|
}
|
|
32
85
|
return this.getOrCreateNow(sessionId, slice);
|
|
33
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Cold-resume a persisted session using its own cwd. The first detached
|
|
89
|
+
* Engine is only a storage probe; all actual work runs on the second Engine
|
|
90
|
+
* built from the recovered project slice.
|
|
91
|
+
*/
|
|
92
|
+
async getOrCreatePersisted(sessionId, slice = {}, restorePersistedModel = true) {
|
|
93
|
+
const existing = this.sessions.get(sessionId);
|
|
94
|
+
if (existing)
|
|
95
|
+
return existing;
|
|
96
|
+
const probe = this.factory(slice);
|
|
97
|
+
if (!probe.sessionExistsOnDisk(sessionId))
|
|
98
|
+
return null;
|
|
99
|
+
const cwd = probe.getSessionManager().readSessionMainRoot(sessionId);
|
|
100
|
+
if (!cwd)
|
|
101
|
+
return null;
|
|
102
|
+
const session = await this.getOrCreate(sessionId, {
|
|
103
|
+
...slice,
|
|
104
|
+
cwd,
|
|
105
|
+
projectTrusted: slice.projectTrusted ?? false,
|
|
106
|
+
});
|
|
107
|
+
if (restorePersistedModel)
|
|
108
|
+
session.engine.restoreSessionModel(sessionId);
|
|
109
|
+
return session;
|
|
110
|
+
}
|
|
34
111
|
getOrCreateNow(sessionId, slice) {
|
|
35
112
|
openSessionPathApprovals(sessionId);
|
|
36
113
|
openInteractiveApprovalSession(sessionId);
|
|
@@ -87,6 +164,23 @@ export class ChatSessionManager {
|
|
|
87
164
|
for (const s of [...this.sessions.values()])
|
|
88
165
|
fn(s);
|
|
89
166
|
}
|
|
167
|
+
/** Snapshot-safe, read-only source shared by query("sessions") and Pet projection. */
|
|
168
|
+
getLiveSessionSnapshot() {
|
|
169
|
+
const sessions = [];
|
|
170
|
+
this.forEachSession((session) => {
|
|
171
|
+
sessions.push({
|
|
172
|
+
sessionId: session.id,
|
|
173
|
+
busy: session.isBusy(),
|
|
174
|
+
queueDepth: session.queueDepth(),
|
|
175
|
+
lastActivityAt: session.lastActivityAt,
|
|
176
|
+
kind: session.engine
|
|
177
|
+
.getSessionManager?.()
|
|
178
|
+
.readSessionKind?.(session.id) ?? "work",
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
sessions.sort((a, b) => a.sessionId.localeCompare(b.sessionId));
|
|
182
|
+
return { generation: this.projectionGeneration, identity: this.identity, sessions };
|
|
183
|
+
}
|
|
90
184
|
close(sessionId) {
|
|
91
185
|
return this.closeSession(sessionId, true);
|
|
92
186
|
}
|
|
@@ -205,6 +299,7 @@ export class ChatSessionManager {
|
|
|
205
299
|
void mcpPool.unregisterOwner(session.engine).catch((err) => {
|
|
206
300
|
logger.warn("chat_session.mcp_owner_unregister_failed", {
|
|
207
301
|
sessionId: session.id,
|
|
302
|
+
identity: this.identity,
|
|
208
303
|
error: err instanceof Error ? err.message : String(err),
|
|
209
304
|
});
|
|
210
305
|
});
|
|
@@ -219,3 +314,12 @@ export class ChatSessionManager {
|
|
|
219
314
|
return manager;
|
|
220
315
|
}
|
|
221
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* Factory counterpart of `new ChatSessionManager(opts)` for identity/dataRoot
|
|
319
|
+
* aware hosts (identity dimension foundations, Task 2). Identity defaults to
|
|
320
|
+
* "local" and dataRoot to `codeShellHome()`, so omitting both is exactly the
|
|
321
|
+
* constructor every existing host already calls.
|
|
322
|
+
*/
|
|
323
|
+
export function createChatSessionManager(opts) {
|
|
324
|
+
return new ChatSessionManager(opts);
|
|
325
|
+
}
|
|
@@ -1,22 +1,32 @@
|
|
|
1
1
|
import type { Engine, EngineResult } from "../engine/engine.js";
|
|
2
2
|
import type { ModelEntry } from "../llm/model-pool.js";
|
|
3
3
|
import type { StreamEvent } from "../types.js";
|
|
4
|
-
import type { PermissionMode } from "../types.js";
|
|
5
|
-
import type { InputAttachmentMeta } from "./types.js";
|
|
4
|
+
import type { PermissionMode, SessionKind } from "../types.js";
|
|
5
|
+
import type { InputAttachmentMeta, PendingApprovalMetadata } from "./types.js";
|
|
6
6
|
import type { ApprovalRouter } from "../tool-system/permission.js";
|
|
7
|
+
import type { RunBehaviorMode } from "../engine/run-types.js";
|
|
8
|
+
import type { SessionMessageTarget } from "../session/session-message.js";
|
|
9
|
+
import type { LegacyPetWorkspaceOption } from "../types.js";
|
|
10
|
+
import { type GoalConfig } from "../goal/lifecycle.js";
|
|
7
11
|
export interface ChatSessionOptions {
|
|
8
12
|
id: string;
|
|
9
13
|
engine: Engine;
|
|
10
14
|
onStream?: (event: StreamEvent) => void;
|
|
11
15
|
}
|
|
16
|
+
export interface PendingApprovalEntry {
|
|
17
|
+
resolve: (decision: unknown) => void;
|
|
18
|
+
metadata: PendingApprovalMetadata;
|
|
19
|
+
}
|
|
12
20
|
export interface TurnOpts {
|
|
13
21
|
/** Working directory override for this turn. If omitted, Engine uses its
|
|
14
22
|
* configured cwd. */
|
|
15
23
|
cwd?: string;
|
|
16
24
|
onStream?: (event: StreamEvent) => void;
|
|
25
|
+
/** User-facing text persisted beside the full model-facing task. */
|
|
26
|
+
displayText?: string;
|
|
17
27
|
/** Goal mode for this turn — forwarded to engine.run (loop-until-done).
|
|
18
28
|
* String objective or full GoalConfig (objective + optional budgets). */
|
|
19
|
-
goal?: string | import("../
|
|
29
|
+
goal?: string | import("../goal/lifecycle.js").GoalConfig;
|
|
20
30
|
/** Marks this turn as a synthetic system-reminder injection (background-job
|
|
21
31
|
* completion notification) rather than the user's own input — persisted so
|
|
22
32
|
* the disk reader skips it as a user bubble on replay. See Engine.run. */
|
|
@@ -29,6 +39,20 @@ export interface TurnOpts {
|
|
|
29
39
|
permissionMode?: PermissionMode;
|
|
30
40
|
/** Plan-mode snapshot for this queued turn only. */
|
|
31
41
|
planMode?: boolean;
|
|
42
|
+
/** Named behavior profile snapshot for this queued turn only. */
|
|
43
|
+
behaviorMode?: RunBehaviorMode;
|
|
44
|
+
/** Generic per-run parameters consumed by the active behavior profile. */
|
|
45
|
+
profileParams?: Record<string, unknown>;
|
|
46
|
+
/** Digital human to bind durably to this Work Session. */
|
|
47
|
+
workspaceProfile?: string;
|
|
48
|
+
/** Closed same-project Session catalog available to SendMessageToSession. */
|
|
49
|
+
sessionMessageTargets?: readonly SessionMessageTarget[];
|
|
50
|
+
/** @deprecated Compat alias for `profileParams.runtimeContext`. */
|
|
51
|
+
petRuntimeContext?: string;
|
|
52
|
+
/** @deprecated Compat alias for `profileParams.workspaces`. */
|
|
53
|
+
petWorkspaces?: LegacyPetWorkspaceOption[];
|
|
54
|
+
/** Durable classification used only when the Engine creates the session. */
|
|
55
|
+
kind?: SessionKind;
|
|
32
56
|
/** Connection owner router for permission prompts in this turn. */
|
|
33
57
|
approvalRouter?: ApprovalRouter;
|
|
34
58
|
}
|
|
@@ -41,16 +65,16 @@ export declare class ChatSession {
|
|
|
41
65
|
readonly id: string;
|
|
42
66
|
readonly engine: Engine;
|
|
43
67
|
/**
|
|
44
|
-
* Per-session approval callbacks indexed by
|
|
68
|
+
* Per-session approval callbacks and resolver-free metadata indexed by requestId.
|
|
45
69
|
* `readonly` guards the Map reference (preventing reassignment); the
|
|
46
70
|
* contents are mutated by `.set()` / `.delete()` as approvals come and go.
|
|
47
|
-
*
|
|
48
|
-
* request and clean them up on response.
|
|
71
|
+
* The resolver stays process-local; only metadata is eligible for Pet snapshots.
|
|
49
72
|
*/
|
|
50
|
-
readonly pendingApprovals: Map<string,
|
|
73
|
+
readonly pendingApprovals: Map<string, PendingApprovalEntry>;
|
|
51
74
|
lastActivityAt: number;
|
|
52
75
|
private queue;
|
|
53
76
|
private active;
|
|
77
|
+
private exclusiveOperation;
|
|
54
78
|
private controller;
|
|
55
79
|
private readonly defaultOnStream?;
|
|
56
80
|
/**
|
|
@@ -81,6 +105,13 @@ export declare class ChatSession {
|
|
|
81
105
|
private resolveSettled;
|
|
82
106
|
constructor(opts: ChatSessionOptions);
|
|
83
107
|
enqueueTurn(task: string, opts: TurnOpts): Promise<EngineResult>;
|
|
108
|
+
/**
|
|
109
|
+
* Run session maintenance (for example context-package summarization) under
|
|
110
|
+
* the same per-session mutex as turns. Existing activity fails fast; turns
|
|
111
|
+
* arriving after the lock is acquired remain queued until maintenance has
|
|
112
|
+
* persisted its final usage/state update.
|
|
113
|
+
*/
|
|
114
|
+
runExclusive<T>(operation: (signal: AbortSignal) => Promise<T>): Promise<T>;
|
|
84
115
|
/**
|
|
85
116
|
* True when the user hit Stop and hasn't started a new turn since. The server
|
|
86
117
|
* consults this before auto-waking an idle session on a background-job
|
|
@@ -118,16 +149,34 @@ export declare class ChatSession {
|
|
|
118
149
|
maxStopBlocks: number;
|
|
119
150
|
} | null;
|
|
120
151
|
/**
|
|
121
|
-
* Read this session's persisted active goal (state.
|
|
152
|
+
* Read this session's persisted active goal (state.goalLifecycle), or undefined
|
|
122
153
|
* when none. Cheap — reads only state.json. The host calls this on session
|
|
123
154
|
* load to re-surface the goal block + Cancel button after a reload.
|
|
124
155
|
*/
|
|
125
|
-
getGoal(): import("../
|
|
156
|
+
getGoal(): import("../goal/lifecycle.js").GoalConfig | undefined;
|
|
126
157
|
/**
|
|
127
158
|
* Clear this session's persisted active goal (CC /goal clear). Works idle or
|
|
128
159
|
* mid-run. Returns true if a goal was actually cleared.
|
|
129
160
|
*/
|
|
130
|
-
clearGoal(
|
|
161
|
+
clearGoal(expected?: {
|
|
162
|
+
goalId?: string;
|
|
163
|
+
revision?: number;
|
|
164
|
+
}): boolean;
|
|
165
|
+
/** Edit or pause/resume this session's persistent goal. */
|
|
166
|
+
updateGoal(patch: {
|
|
167
|
+
objective?: string;
|
|
168
|
+
paused?: boolean;
|
|
169
|
+
expectedGoalId?: string;
|
|
170
|
+
expectedRevision?: number;
|
|
171
|
+
}): import("../goal/lifecycle.js").GoalConfig | undefined;
|
|
172
|
+
/** Whether a paused Goal can reuse this run's already Goal-capable prompt/tools. */
|
|
173
|
+
canResumeGoalInPlace(): boolean;
|
|
174
|
+
/**
|
|
175
|
+
* Queue the synthetic turn which actually drives an idle/dormant Goal after
|
|
176
|
+
* Resume. The version guard is checked at queue head, so a later edit/delete
|
|
177
|
+
* cannot leave a stale "resume" turn behind another user turn.
|
|
178
|
+
*/
|
|
179
|
+
enqueueGoalResumeTurn(goal: GoalConfig, opts?: Omit<TurnOpts, "goal">): Promise<boolean>;
|
|
131
180
|
/**
|
|
132
181
|
* Switch this session's active model (per-session, not worker-global).
|
|
133
182
|
* Applies immediately when idle; defers to the next run boundary when a
|
|
@@ -144,6 +193,8 @@ export declare class ChatSession {
|
|
|
144
193
|
* path and the deferred run-boundary path.
|
|
145
194
|
*/
|
|
146
195
|
private applyModelSwitch;
|
|
196
|
+
/** Apply and clear a deferred switch before another run may start. */
|
|
197
|
+
private applyPendingModelSwitchAtRunBoundary;
|
|
147
198
|
queueDepth(): number;
|
|
148
199
|
private pump;
|
|
149
200
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isAbortError } from "../llm/client-base.js";
|
|
2
|
+
import { isSameGoalInstance } from "../goal/lifecycle.js";
|
|
2
3
|
/**
|
|
3
4
|
* One ChatSession per UI chat tab. Owns a single Engine, an AbortController
|
|
4
5
|
* for the active turn, and a FIFO queue so a fast second send waits for the
|
|
@@ -8,16 +9,16 @@ export class ChatSession {
|
|
|
8
9
|
id;
|
|
9
10
|
engine;
|
|
10
11
|
/**
|
|
11
|
-
* Per-session approval callbacks indexed by
|
|
12
|
+
* Per-session approval callbacks and resolver-free metadata indexed by requestId.
|
|
12
13
|
* `readonly` guards the Map reference (preventing reassignment); the
|
|
13
14
|
* contents are mutated by `.set()` / `.delete()` as approvals come and go.
|
|
14
|
-
*
|
|
15
|
-
* request and clean them up on response.
|
|
15
|
+
* The resolver stays process-local; only metadata is eligible for Pet snapshots.
|
|
16
16
|
*/
|
|
17
17
|
pendingApprovals = new Map();
|
|
18
18
|
lastActivityAt = Date.now();
|
|
19
19
|
queue = [];
|
|
20
20
|
active = null;
|
|
21
|
+
exclusiveOperation = false;
|
|
21
22
|
controller = null;
|
|
22
23
|
defaultOnStream;
|
|
23
24
|
/**
|
|
@@ -62,6 +63,36 @@ export class ChatSession {
|
|
|
62
63
|
this.pump();
|
|
63
64
|
});
|
|
64
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Run session maintenance (for example context-package summarization) under
|
|
68
|
+
* the same per-session mutex as turns. Existing activity fails fast; turns
|
|
69
|
+
* arriving after the lock is acquired remain queued until maintenance has
|
|
70
|
+
* persisted its final usage/state update.
|
|
71
|
+
*/
|
|
72
|
+
async runExclusive(operation) {
|
|
73
|
+
if (this.active || this.exclusiveOperation || this.queue.length > 0) {
|
|
74
|
+
throw new Error("source session is still producing or has queued turns");
|
|
75
|
+
}
|
|
76
|
+
this.lastActivityAt = Date.now();
|
|
77
|
+
this.exclusiveOperation = true;
|
|
78
|
+
this.settlePromise = new Promise((resolve) => {
|
|
79
|
+
this.resolveSettled = resolve;
|
|
80
|
+
});
|
|
81
|
+
this.controller = new AbortController();
|
|
82
|
+
try {
|
|
83
|
+
return await operation(this.controller.signal);
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
this.lastActivityAt = Date.now();
|
|
87
|
+
this.resolveSettled?.();
|
|
88
|
+
this.resolveSettled = null;
|
|
89
|
+
this.controller = null;
|
|
90
|
+
this.exclusiveOperation = false;
|
|
91
|
+
this.applyPendingModelSwitchAtRunBoundary();
|
|
92
|
+
if (this.queue.length > 0)
|
|
93
|
+
void this.pump();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
65
96
|
/**
|
|
66
97
|
* True when the user hit Stop and hasn't started a new turn since. The server
|
|
67
98
|
* consults this before auto-waking an idle session on a background-job
|
|
@@ -94,7 +125,7 @@ export class ChatSession {
|
|
|
94
125
|
}
|
|
95
126
|
}
|
|
96
127
|
isBusy() {
|
|
97
|
-
return this.active !== null;
|
|
128
|
+
return this.active !== null || this.exclusiveOperation;
|
|
98
129
|
}
|
|
99
130
|
/** Resolves after the active engine.run() has completed its pump finally. */
|
|
100
131
|
get settled() {
|
|
@@ -110,7 +141,7 @@ export class ChatSession {
|
|
|
110
141
|
return this.engine.extendGoalRun(opts);
|
|
111
142
|
}
|
|
112
143
|
/**
|
|
113
|
-
* Read this session's persisted active goal (state.
|
|
144
|
+
* Read this session's persisted active goal (state.goalLifecycle), or undefined
|
|
114
145
|
* when none. Cheap — reads only state.json. The host calls this on session
|
|
115
146
|
* load to re-surface the goal block + Cancel button after a reload.
|
|
116
147
|
*/
|
|
@@ -121,8 +152,56 @@ export class ChatSession {
|
|
|
121
152
|
* Clear this session's persisted active goal (CC /goal clear). Works idle or
|
|
122
153
|
* mid-run. Returns true if a goal was actually cleared.
|
|
123
154
|
*/
|
|
124
|
-
clearGoal() {
|
|
125
|
-
return this.engine.clearGoal(this.id);
|
|
155
|
+
clearGoal(expected) {
|
|
156
|
+
return this.engine.clearGoal(this.id, expected);
|
|
157
|
+
}
|
|
158
|
+
/** Edit or pause/resume this session's persistent goal. */
|
|
159
|
+
updateGoal(patch) {
|
|
160
|
+
return this.engine.updateGoal(this.id, patch);
|
|
161
|
+
}
|
|
162
|
+
/** Whether a paused Goal can reuse this run's already Goal-capable prompt/tools. */
|
|
163
|
+
canResumeGoalInPlace() {
|
|
164
|
+
return this.engine.canResumeGoalInPlace(this.id);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Queue the synthetic turn which actually drives an idle/dormant Goal after
|
|
168
|
+
* Resume. The version guard is checked at queue head, so a later edit/delete
|
|
169
|
+
* cannot leave a stale "resume" turn behind another user turn.
|
|
170
|
+
*/
|
|
171
|
+
enqueueGoalResumeTurn(goal, opts = {}) {
|
|
172
|
+
this.lastActivityAt = Date.now();
|
|
173
|
+
this.cancelledSinceLastTurn = false;
|
|
174
|
+
return new Promise((resolve, reject) => {
|
|
175
|
+
// Resume is level-triggered, not an instruction that should accumulate.
|
|
176
|
+
// While another turn owns the session, pause -> resume can otherwise
|
|
177
|
+
// leave multiple continuation turns for the same Goal instance queued.
|
|
178
|
+
// Supersede only pending entries; an already-active resume is governed by
|
|
179
|
+
// the live TurnLoop control path.
|
|
180
|
+
if (goal.goalId) {
|
|
181
|
+
for (let index = this.queue.length - 1; index >= 0; index--) {
|
|
182
|
+
const pending = this.queue[index];
|
|
183
|
+
if (pending?.goalResumeId !== goal.goalId)
|
|
184
|
+
continue;
|
|
185
|
+
this.queue.splice(index, 1);
|
|
186
|
+
pending.onSkipped?.();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
this.queue.push({
|
|
190
|
+
task: "<system-reminder>\n用户已恢复持久目标。请读取当前持久目标并继续执行。\n</system-reminder>",
|
|
191
|
+
opts: { ...opts, injected: true },
|
|
192
|
+
...(goal.goalId ? { goalResumeId: goal.goalId } : {}),
|
|
193
|
+
guard: () => {
|
|
194
|
+
const current = this.engine.getGoal(this.id);
|
|
195
|
+
// Edits retain the same user-owned goalId and should update the
|
|
196
|
+
// queued resume, not cancel it. Pause/delete/replacement must skip.
|
|
197
|
+
return current?.paused !== true && isSameGoalInstance(current, goal);
|
|
198
|
+
},
|
|
199
|
+
onSkipped: () => resolve(false),
|
|
200
|
+
resolve: () => resolve(true),
|
|
201
|
+
reject,
|
|
202
|
+
});
|
|
203
|
+
void this.pump();
|
|
204
|
+
});
|
|
126
205
|
}
|
|
127
206
|
/**
|
|
128
207
|
* Switch this session's active model (per-session, not worker-global).
|
|
@@ -150,17 +229,48 @@ export class ChatSession {
|
|
|
150
229
|
* path and the deferred run-boundary path.
|
|
151
230
|
*/
|
|
152
231
|
applyModelSwitch(key) {
|
|
153
|
-
|
|
232
|
+
// persist: false — a per-session switch must not become the global boot
|
|
233
|
+
// default (settings.defaults.text); only explicit default-model changes
|
|
234
|
+
// (legacy single-engine path, TUI /model) persist.
|
|
235
|
+
const entry = this.engine.switchModel(key, { persist: false });
|
|
154
236
|
this.engine.resetSessionUsage(this.id);
|
|
155
237
|
return entry;
|
|
156
238
|
}
|
|
239
|
+
/** Apply and clear a deferred switch before another run may start. */
|
|
240
|
+
applyPendingModelSwitchAtRunBoundary() {
|
|
241
|
+
const key = this.pendingModel;
|
|
242
|
+
this.pendingModel = null;
|
|
243
|
+
if (key === null)
|
|
244
|
+
return;
|
|
245
|
+
try {
|
|
246
|
+
this.applyModelSwitch(key);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// requestModelSwitch already returned when the switch was queued. A
|
|
250
|
+
// run-boundary persistence failure must not become an unhandled pump
|
|
251
|
+
// rejection or prevent the session from settling/continuing.
|
|
252
|
+
}
|
|
253
|
+
}
|
|
157
254
|
queueDepth() {
|
|
158
255
|
return this.queue.length;
|
|
159
256
|
}
|
|
160
257
|
async pump() {
|
|
161
|
-
if (this.active)
|
|
258
|
+
if (this.active || this.exclusiveOperation)
|
|
162
259
|
return;
|
|
163
|
-
|
|
260
|
+
let next;
|
|
261
|
+
while ((next = this.queue.shift())) {
|
|
262
|
+
let allowed = true;
|
|
263
|
+
try {
|
|
264
|
+
allowed = next.guard?.() ?? true;
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
allowed = false;
|
|
268
|
+
}
|
|
269
|
+
if (allowed)
|
|
270
|
+
break;
|
|
271
|
+
next.onSkipped?.();
|
|
272
|
+
next = undefined;
|
|
273
|
+
}
|
|
164
274
|
if (!next)
|
|
165
275
|
return;
|
|
166
276
|
this.active = next;
|
|
@@ -174,6 +284,7 @@ export class ChatSession {
|
|
|
174
284
|
const result = await this.engine.run(next.task, {
|
|
175
285
|
cwd: next.opts.cwd,
|
|
176
286
|
sessionId: this.id,
|
|
287
|
+
displayText: next.opts.displayText,
|
|
177
288
|
signal: this.controller.signal,
|
|
178
289
|
onStream,
|
|
179
290
|
goal: next.opts.goal,
|
|
@@ -182,6 +293,13 @@ export class ChatSession {
|
|
|
182
293
|
attachments: next.opts.attachments,
|
|
183
294
|
permissionMode: next.opts.permissionMode,
|
|
184
295
|
planMode: next.opts.planMode,
|
|
296
|
+
behaviorMode: next.opts.behaviorMode,
|
|
297
|
+
profileParams: next.opts.profileParams,
|
|
298
|
+
workspaceProfile: next.opts.workspaceProfile,
|
|
299
|
+
sessionMessageTargets: next.opts.sessionMessageTargets,
|
|
300
|
+
petRuntimeContext: next.opts.petRuntimeContext,
|
|
301
|
+
petWorkspaces: next.opts.petWorkspaces,
|
|
302
|
+
kind: next.opts.kind,
|
|
185
303
|
approvalRouter: next.opts.approvalRouter,
|
|
186
304
|
});
|
|
187
305
|
this.lastActivityAt = Date.now();
|
|
@@ -217,21 +335,13 @@ export class ChatSession {
|
|
|
217
335
|
// Run boundary: apply any model switch that was deferred because it was
|
|
218
336
|
// requested mid-run. Done here (not in pump) so it still applies when
|
|
219
337
|
// no further turn is queued.
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
// run-boundary persistence failure must not become an unhandled pump
|
|
228
|
-
// rejection or prevent the session from settling/continuing.
|
|
229
|
-
}
|
|
230
|
-
finally {
|
|
231
|
-
this.pendingModel = null;
|
|
232
|
-
// Drain the next turn even if deferred model switching failed.
|
|
233
|
-
if (this.queue.length > 0)
|
|
234
|
-
void this.pump();
|
|
338
|
+
this.applyPendingModelSwitchAtRunBoundary();
|
|
339
|
+
// Drain the next turn even if deferred model switching failed.
|
|
340
|
+
if (this.queue.length > 0) {
|
|
341
|
+
// Let the just-settled turn's resolve/reject handlers publish their
|
|
342
|
+
// terminal lifecycle before a queued turn can synchronously emit its
|
|
343
|
+
// session_started event. This preserves external QueryGuard ordering.
|
|
344
|
+
queueMicrotask(() => void this.pump());
|
|
235
345
|
}
|
|
236
346
|
}
|
|
237
347
|
}
|