@cjhyy/code-shell-core 0.7.1 → 0.8.1
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/path-policy.js +99 -2
- 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
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
* transport is stdio NDJSON and the protocol surface is unchanged, this
|
|
30
30
|
* bootstrap is invisible to them.
|
|
31
31
|
*/
|
|
32
|
+
import { join } from "node:path";
|
|
32
33
|
import { Engine } from "../engine/engine.js";
|
|
33
34
|
import { EngineRuntime } from "../engine/runtime.js";
|
|
34
35
|
import { ChatSessionManager } from "../protocol/chat-session-manager.js";
|
|
@@ -36,8 +37,9 @@ import { SessionManager } from "../session/session-manager.js";
|
|
|
36
37
|
import { validateSettings } from "../settings/schema.js";
|
|
37
38
|
import { AgentServer } from "../protocol/server.js";
|
|
38
39
|
import { StdioTransport } from "../protocol/transport.js";
|
|
39
|
-
import { createNotification } from "../protocol/types.js";
|
|
40
|
+
import { createNotification, Methods } from "../protocol/types.js";
|
|
40
41
|
import { setCronChangedSink } from "../tool-system/builtin/cron.js";
|
|
42
|
+
import { setModelCatalogChangedSink } from "../tool-system/builtin/edit-model-catalog.js";
|
|
41
43
|
import { SettingsManager, noRepoDir } from "../settings/manager.js";
|
|
42
44
|
import { personalizationFrom } from "../settings/personalization.js";
|
|
43
45
|
import { MCPManager } from "../tool-system/mcp-manager.js";
|
|
@@ -51,6 +53,34 @@ import { cronScheduler } from "../automation/scheduler.js";
|
|
|
51
53
|
import { CronStore, defaultCronStorePath } from "../automation/store.js";
|
|
52
54
|
import { resolveLLMConfigForTag } from "../engine/resolve-llm-config.js";
|
|
53
55
|
import { createIpcCredentialAccess, setDefaultCredentialAccess } from "../credentials/access.js";
|
|
56
|
+
async function loadConfiguredExtensionModules() {
|
|
57
|
+
const specs = (process.env.CODE_SHELL_CAPABILITY_MODULES ?? "")
|
|
58
|
+
.split(",")
|
|
59
|
+
.map((entry) => entry.trim())
|
|
60
|
+
.filter(Boolean);
|
|
61
|
+
const modules = [];
|
|
62
|
+
for (const spec of specs) {
|
|
63
|
+
const [moduleId, exportName = "createCapability"] = spec.split("#", 2);
|
|
64
|
+
if (!moduleId)
|
|
65
|
+
continue;
|
|
66
|
+
try {
|
|
67
|
+
const loaded = (await import(moduleId));
|
|
68
|
+
const factory = loaded[exportName];
|
|
69
|
+
if (typeof factory !== "function") {
|
|
70
|
+
throw new Error(`export ${exportName} is not a capability factory`);
|
|
71
|
+
}
|
|
72
|
+
modules.push(factory());
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
logger.warn("capability.module_unavailable", {
|
|
76
|
+
moduleId,
|
|
77
|
+
exportName,
|
|
78
|
+
error: err instanceof Error ? err.message : String(err),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return modules;
|
|
83
|
+
}
|
|
54
84
|
/**
|
|
55
85
|
* Resolve per-session agent config: protocol slice overrides win, else fall
|
|
56
86
|
* back to disk settings.agent.*. Fixes the bug where settings.agent.* never
|
|
@@ -58,7 +88,7 @@ import { createIpcCredentialAccess, setDefaultCredentialAccess } from "../creden
|
|
|
58
88
|
*/
|
|
59
89
|
export function resolveSessionAgentConfig(slice, settings) {
|
|
60
90
|
return {
|
|
61
|
-
preset: slice.preset ?? settings.agent.preset,
|
|
91
|
+
preset: slice.preset ?? settings.agent.preset ?? settings.profile?.preset,
|
|
62
92
|
customSystemPrompt: slice.customSystemPrompt ?? settings.agent.customSystemPrompt,
|
|
63
93
|
appendSystemPrompt: slice.appendSystemPrompt ?? settings.agent.appendSystemPrompt,
|
|
64
94
|
};
|
|
@@ -81,6 +111,15 @@ export function resolveSessionCwd(slice) {
|
|
|
81
111
|
}
|
|
82
112
|
// ─── Read base config from environment / settings ─────────────────
|
|
83
113
|
const cwd = process.env.AGENT_CWD ?? process.cwd();
|
|
114
|
+
const extensionModules = await loadConfiguredExtensionModules();
|
|
115
|
+
// Injectable data root (identity dimension foundations, Task 3). Server
|
|
116
|
+
// Phase 2 per-user workers spawn this entry with CODE_SHELL_DATA_ROOT set to
|
|
117
|
+
// the user's isolated data root; session persistence (engine session store,
|
|
118
|
+
// the disk goal/wakeup readers) and cron persistence then live under it.
|
|
119
|
+
// Unset (every existing host today) keeps the default `~/.code-shell` layout
|
|
120
|
+
// byte-for-byte.
|
|
121
|
+
const dataRoot = process.env.CODE_SHELL_DATA_ROOT?.trim() || undefined;
|
|
122
|
+
const dataSessionsDir = dataRoot ? join(dataRoot, "sessions") : undefined;
|
|
84
123
|
// Load settings once to derive llm config for the seed engine.
|
|
85
124
|
// Desktop is a host application: read the full disk hierarchy (incl. the
|
|
86
125
|
// user's ~/.code-shell). The SDK default 'project' would skip user config.
|
|
@@ -115,16 +154,17 @@ const llmConfig = seedLlm;
|
|
|
115
154
|
const seedEngine = new Engine({
|
|
116
155
|
llm: llmConfig,
|
|
117
156
|
cwd,
|
|
118
|
-
preset: settings.agent.preset,
|
|
157
|
+
preset: settings.agent.preset ?? settings.profile?.preset,
|
|
119
158
|
enabledBuiltinTools: settings.agent.enabledBuiltinTools,
|
|
120
159
|
disabledBuiltinTools: settings.agent.disabledBuiltinTools,
|
|
121
160
|
builtinToolHost: "desktop",
|
|
161
|
+
extensionModules,
|
|
122
162
|
settingsScope: "full",
|
|
123
163
|
// No runtime — Engine.populateModelPoolFromSettings() runs in ctor.
|
|
124
164
|
});
|
|
125
165
|
// ─── Step 2: extract shared resources ────────────────────────────
|
|
126
166
|
const modelPool = seedEngine.getModelPool();
|
|
127
|
-
const toolRegistry = seedEngine.
|
|
167
|
+
const toolRegistry = seedEngine.getRuntimeToolRegistry();
|
|
128
168
|
// Capture the seed engine's resolved llmConfig + clientDefaults
|
|
129
169
|
// (post-populateModelPoolFromSettings). Session engines inherit defaults so
|
|
130
170
|
// the temperature ClientDefault / images.detail apply uniformly without each
|
|
@@ -222,6 +262,7 @@ const chatManager = new ChatSessionManager({
|
|
|
222
262
|
// session it creates is a desktop-origin session.
|
|
223
263
|
origin: "desktop",
|
|
224
264
|
builtinToolHost: "desktop",
|
|
265
|
+
extensionModules,
|
|
225
266
|
// Inherit full scope so spawned subagents read user config too.
|
|
226
267
|
settingsScope: "full",
|
|
227
268
|
// MCP servers from settings — the worker reads the full disk
|
|
@@ -252,11 +293,17 @@ const chatManager = new ChatSessionManager({
|
|
|
252
293
|
...personalizationFrom(live.agent),
|
|
253
294
|
maxTurns: slice.maxTurns,
|
|
254
295
|
maxContextTokens: slice.maxContextTokens,
|
|
296
|
+
// Session persistence root: an identity-derived manager passes an
|
|
297
|
+
// explicit per-identity dir through the slice; otherwise the worker's
|
|
298
|
+
// injected data root (CODE_SHELL_DATA_ROOT) applies; otherwise
|
|
299
|
+
// undefined keeps the engine's default sessions root (today's path).
|
|
300
|
+
sessionStorageDir: slice.sessionStorageDir ?? dataSessionsDir,
|
|
255
301
|
// cwd already set to sessionCwd above (slice.cwd → no-repo fallback).
|
|
256
302
|
});
|
|
257
303
|
},
|
|
258
304
|
maxSessions: 16,
|
|
259
305
|
idleTtlMs: 30 * 60 * 1000,
|
|
306
|
+
...(dataRoot ? { dataRoot } : {}),
|
|
260
307
|
});
|
|
261
308
|
chatManager.startIdleSweeper();
|
|
262
309
|
// ─── Cron persistence ────────────────────────────────────────────
|
|
@@ -270,7 +317,7 @@ chatManager.startIdleSweeper();
|
|
|
270
317
|
// main process owns execution); persistence is its only cron role. Without
|
|
271
318
|
// this, loadJobs()/CronCreate would arm timers in this process too, double-
|
|
272
319
|
// running jobs and corrupting run stats.
|
|
273
|
-
cronScheduler.setStore(new CronStore(defaultCronStorePath()));
|
|
320
|
+
cronScheduler.setStore(new CronStore(defaultCronStorePath(dataRoot)));
|
|
274
321
|
cronScheduler.setExecutionEnabled(false);
|
|
275
322
|
cronScheduler.loadJobs();
|
|
276
323
|
// ─── Step 5: AgentServer over stdio ──────────────────────────────
|
|
@@ -283,21 +330,34 @@ setDefaultCredentialAccess(createIpcCredentialAccess(stdioTransport));
|
|
|
283
330
|
setCronChangedSink(() => {
|
|
284
331
|
stdioTransport.send(createNotification("agent/cronChanged", {}));
|
|
285
332
|
});
|
|
333
|
+
// EditModelCatalog writes in this worker process, while the mounted settings
|
|
334
|
+
// and connection pages live in the desktop renderer. Notify them immediately
|
|
335
|
+
// after a successful write instead of relying on a later turn_complete event.
|
|
336
|
+
setModelCatalogChangedSink(() => {
|
|
337
|
+
stdioTransport.send(createNotification(Methods.SettingsChanged, {}));
|
|
338
|
+
});
|
|
286
339
|
// Disk-only active-goal reader for agent/goalGet. In worker mode there is no
|
|
287
340
|
// legacyEngine, and reopening a session after restart doesn't create a live
|
|
288
341
|
// ChatSession (that only happens on a send), so chatManager.get() misses. This
|
|
289
342
|
// reads the same ~/.code-shell/sessions/<id>/state.json every Engine writes, so
|
|
290
343
|
// the goal block re-surfaces on load ("goal 还在但页面不显示" fix).
|
|
291
|
-
const goalDiskReader = new SessionManager();
|
|
344
|
+
const goalDiskReader = new SessionManager(dataSessionsDir);
|
|
292
345
|
const agentServer = new AgentServer({
|
|
293
346
|
chatManager,
|
|
294
347
|
transport: stdioTransport,
|
|
348
|
+
extensionModules,
|
|
295
349
|
workspaceBridge: true,
|
|
350
|
+
panelBridge: true,
|
|
351
|
+
// Cold background-wakeup rehydrate must read the same sessions store the
|
|
352
|
+
// engines write when the data root is relocated (undefined → default root).
|
|
353
|
+
sessionDiskRoot: dataSessionsDir,
|
|
296
354
|
// Config hot-reload (layer 2) reads disk through the SAME closure the
|
|
297
355
|
// engineFactory uses for new sessions, so a reloaded running session and a
|
|
298
356
|
// newly-created session converge on identical disk config (no divergence).
|
|
299
357
|
settingsReader: freshSettings,
|
|
300
358
|
readActiveGoalFromDisk: (sessionId) => goalDiskReader.readActiveGoal(sessionId),
|
|
359
|
+
updateActiveGoalOnDisk: (sessionId, patch) => goalDiskReader.updateActiveGoal(sessionId, patch)?.goal,
|
|
360
|
+
clearActiveGoalOnDisk: (sessionId, expected) => goalDiskReader.clearActiveGoal(sessionId, expected),
|
|
301
361
|
});
|
|
302
362
|
// Clean up on termination signals. Without this, SIGTERM (parent kill),
|
|
303
363
|
// SIGINT (Ctrl+C), or SIGHUP would drop the process without closing sessions,
|
|
@@ -35,6 +35,7 @@ import { CronStore, defaultCronStorePath } from "../automation/store.js";
|
|
|
35
35
|
import { resolveLLMConfigForTag } from "../engine/resolve-llm-config.js";
|
|
36
36
|
import { randomUUID } from "node:crypto";
|
|
37
37
|
import { getApprovalRouter } from "../tool-system/permission.js";
|
|
38
|
+
import { SessionManager } from "../session/session-manager.js";
|
|
38
39
|
const cwd = process.env.AGENT_CWD ?? process.cwd();
|
|
39
40
|
const port = Number(process.env.AGENT_TCP_PORT ?? "4321");
|
|
40
41
|
const host = process.env.AGENT_TCP_HOST ?? "127.0.0.1";
|
|
@@ -47,15 +48,14 @@ const settingsManager = new SettingsManager(cwd, "full");
|
|
|
47
48
|
const settings = settingsManager.get();
|
|
48
49
|
const seedLlm = resolveLLMConfigForTag(settings, "text", settings.defaults?.text);
|
|
49
50
|
if (!seedLlm) {
|
|
50
|
-
console.error(`[agent-server] 没有可用的文本模型连接(defaults.text=${settings.defaults?.text ?? "未设置"})。` +
|
|
51
|
-
`请在「连接」页添加并填写凭证。`);
|
|
51
|
+
console.error(`[agent-server] 没有可用的文本模型连接(defaults.text=${settings.defaults?.text ?? "未设置"})。` + `请在「连接」页添加并填写凭证。`);
|
|
52
52
|
process.exit(1);
|
|
53
53
|
}
|
|
54
54
|
const llmConfig = seedLlm;
|
|
55
55
|
// ── Shared runtime (same bootstrap as stdio) ─────────────────────
|
|
56
56
|
const seedEngine = new Engine({ llm: llmConfig, cwd, settingsScope: "full" });
|
|
57
57
|
const modelPool = seedEngine.getModelPool();
|
|
58
|
-
const toolRegistry = seedEngine.
|
|
58
|
+
const toolRegistry = seedEngine.getRuntimeToolRegistry();
|
|
59
59
|
const resolvedLlmConfig = seedEngine.getConfig().llm;
|
|
60
60
|
const resolvedClientDefaults = seedEngine.getConfig().clientDefaults;
|
|
61
61
|
const mcpPool = new MCPManager(toolRegistry);
|
|
@@ -115,12 +115,16 @@ const automation = startAutomation({
|
|
|
115
115
|
// ── Serve over TCP ──────────────────────────────────────────────
|
|
116
116
|
// One AgentServer per accepted connection, all sharing the same chatManager.
|
|
117
117
|
const servers = new Set();
|
|
118
|
+
const goalDiskManager = new SessionManager();
|
|
118
119
|
listenTcp({ port, host }, (transport, socket) => {
|
|
119
120
|
const server = new AgentServer({
|
|
120
121
|
chatManager,
|
|
121
122
|
transport,
|
|
122
123
|
connectionId: randomUUID(),
|
|
123
124
|
approvalRouter: getApprovalRouter(),
|
|
125
|
+
readActiveGoalFromDisk: (sessionId) => goalDiskManager.readActiveGoal(sessionId),
|
|
126
|
+
updateActiveGoalOnDisk: (sessionId, patch) => goalDiskManager.updateActiveGoal(sessionId, patch)?.goal,
|
|
127
|
+
clearActiveGoalOnDisk: (sessionId, expected) => goalDiskManager.clearActiveGoal(sessionId, expected),
|
|
124
128
|
});
|
|
125
129
|
servers.add(server);
|
|
126
130
|
socket.once("close", () => {
|
|
@@ -177,12 +177,48 @@ export declare function applyToolResultBudget(messages: Message[], maxTotalChars
|
|
|
177
177
|
* Returns the truncated string with a notice.
|
|
178
178
|
*/
|
|
179
179
|
export declare function truncateToolResult(result: string, maxChars?: number): string;
|
|
180
|
+
export declare function buildSummarizationPrompt(messagesToSummarize: Message[], priorSummary?: string, options?: {
|
|
181
|
+
maxTextChars?: number;
|
|
182
|
+
}): string;
|
|
183
|
+
/** Target size for a portable context package (roughly one background page). */
|
|
184
|
+
export declare const CONTEXT_PACKAGE_TARGET_TOKENS = 1500;
|
|
185
|
+
/** Hard output ceiling; the design allows a 1,500-2,000 token final package. */
|
|
186
|
+
export declare const CONTEXT_PACKAGE_MAX_OUTPUT_TOKENS = 2000;
|
|
187
|
+
export interface SerializedContextPackage {
|
|
188
|
+
/** Complete textual representation. Image bytes are replaced by explicit metadata placeholders. */
|
|
189
|
+
text: string;
|
|
190
|
+
/** False when the selection contains images/placeholders but no facts a text model can summarize. */
|
|
191
|
+
hasSummarizableContent: boolean;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Serialize a selected context range without head-only truncation. Text, tool
|
|
195
|
+
* arguments/results, nested structured results, and reasoning are retained in
|
|
196
|
+
* full. Raw image bytes are intentionally not copied into a text prompt; an
|
|
197
|
+
* explicit metadata placeholder makes that conversion visible and bounded.
|
|
198
|
+
*/
|
|
199
|
+
export declare function serializeContextPackageMessages(messages: Message[]): SerializedContextPackage;
|
|
200
|
+
export declare function buildContextPackagePromptFromSerialized(serializedConversation: string, priorSummary?: string): string;
|
|
180
201
|
/**
|
|
181
|
-
* Build
|
|
182
|
-
*
|
|
202
|
+
* Build the session-transfer variant on top of the same structured prompt used
|
|
203
|
+
* by /compact. Keeping this wrapper small makes changes to the canonical nine
|
|
204
|
+
* sections flow into both compaction and context packaging.
|
|
183
205
|
*/
|
|
184
|
-
export declare function
|
|
206
|
+
export declare function buildContextPackagePrompt(messagesToSummarize: Message[], priorSummary?: string): string;
|
|
185
207
|
export declare function extractAnchoredSummary(messages: Message[]): string | undefined;
|
|
208
|
+
/**
|
|
209
|
+
* Build the single anchored-summary message that replaces a compacted span.
|
|
210
|
+
* Emits the same `<anchored-summary>` marker `extractAnchoredSummary` reads, so
|
|
211
|
+
* a later compaction pass can feed it back for a rolling merge-update. The
|
|
212
|
+
* optional referenced-file list points the model at paths it may want to Read
|
|
213
|
+
* back; the transcript path lets it recover exact detail on demand. Shared by
|
|
214
|
+
* applySummaryCompaction (recency-window compaction) and any caller that
|
|
215
|
+
* collapses a specific span into one summary, keeping the marker format
|
|
216
|
+
* identical across both.
|
|
217
|
+
*/
|
|
218
|
+
export declare function buildAnchoredSummaryMessage(summary: string, options?: {
|
|
219
|
+
transcriptPath?: string;
|
|
220
|
+
referencedFiles?: string[];
|
|
221
|
+
}): Message;
|
|
186
222
|
/**
|
|
187
223
|
* Apply LLM-generated summary compaction (hybrid mode).
|
|
188
224
|
*
|
|
@@ -251,11 +251,7 @@ export function snipCompact(messages, keepFirstN = 3, keepLastM = 8) {
|
|
|
251
251
|
content: `<system-reminder>[${snippedCount} messages snipped to save context. ` +
|
|
252
252
|
`Use the transcript file to review details if needed.]</system-reminder>`,
|
|
253
253
|
};
|
|
254
|
-
return [
|
|
255
|
-
...messages.slice(0, keepFirstN),
|
|
256
|
-
snipMarker,
|
|
257
|
-
...messages.slice(lastStart),
|
|
258
|
-
];
|
|
254
|
+
return [...messages.slice(0, keepFirstN), snipMarker, ...messages.slice(lastStart)];
|
|
259
255
|
}
|
|
260
256
|
/**
|
|
261
257
|
* Window strategy: keep first message + last N messages.
|
|
@@ -669,19 +665,27 @@ export function truncateToolResult(result, maxChars = 30_000) {
|
|
|
669
665
|
const tailSize = Math.floor(maxChars * 0.2);
|
|
670
666
|
const head = result.slice(0, headSize);
|
|
671
667
|
const tail = result.slice(-tailSize);
|
|
672
|
-
return (head +
|
|
673
|
-
`\n\n... [${result.length - headSize - tailSize} characters truncated] ...\n\n` +
|
|
674
|
-
tail);
|
|
668
|
+
return (head + `\n\n... [${result.length - headSize - tailSize} characters truncated] ...\n\n` + tail);
|
|
675
669
|
}
|
|
676
670
|
/**
|
|
677
671
|
* Build a structured summarization prompt from messages to be compacted.
|
|
678
672
|
* Produces a 9-section summary preserving key details.
|
|
679
673
|
*/
|
|
680
|
-
|
|
674
|
+
const SUMMARY_SECTION_LIST = "1. **Primary Request**: What the user originally asked for\n" +
|
|
675
|
+
"2. **Key Concepts**: Important technical terms, patterns, file paths\n" +
|
|
676
|
+
"3. **Files Referenced**: List of files read/edited with key content\n" +
|
|
677
|
+
"4. **Errors & Fixes**: Any errors encountered and how they were resolved\n" +
|
|
678
|
+
"5. **Actions Taken**: Tools used and their outcomes\n" +
|
|
679
|
+
"6. **User Messages**: All distinct user requests (verbatim if short)\n" +
|
|
680
|
+
"7. **Pending Tasks**: Anything started but not finished\n" +
|
|
681
|
+
"8. **Current State**: Where things stand right now\n" +
|
|
682
|
+
"9. **Next Steps**: What should happen next\n";
|
|
683
|
+
export function buildSummarizationPrompt(messagesToSummarize, priorSummary, options = {}) {
|
|
681
684
|
const parts = [];
|
|
685
|
+
const maxTextChars = options.maxTextChars ?? 3_000;
|
|
682
686
|
for (const msg of messagesToSummarize) {
|
|
683
687
|
if (typeof msg.content === "string") {
|
|
684
|
-
parts.push(`[${msg.role}]: ${msg.content.slice(0,
|
|
688
|
+
parts.push(`[${msg.role}]: ${msg.content.slice(0, maxTextChars)}`);
|
|
685
689
|
}
|
|
686
690
|
else {
|
|
687
691
|
for (const block of msg.content) {
|
|
@@ -699,15 +703,6 @@ export function buildSummarizationPrompt(messagesToSummarize, priorSummary) {
|
|
|
699
703
|
}
|
|
700
704
|
}
|
|
701
705
|
}
|
|
702
|
-
const sectionList = "1. **Primary Request**: What the user originally asked for\n" +
|
|
703
|
-
"2. **Key Concepts**: Important technical terms, patterns, file paths\n" +
|
|
704
|
-
"3. **Files Referenced**: List of files read/edited with key content\n" +
|
|
705
|
-
"4. **Errors & Fixes**: Any errors encountered and how they were resolved\n" +
|
|
706
|
-
"5. **Actions Taken**: Tools used and their outcomes\n" +
|
|
707
|
-
"6. **User Messages**: All distinct user requests (verbatim if short)\n" +
|
|
708
|
-
"7. **Pending Tasks**: Anything started but not finished\n" +
|
|
709
|
-
"8. **Current State**: Where things stand right now\n" +
|
|
710
|
-
"9. **Next Steps**: What should happen next\n";
|
|
711
706
|
if (priorSummary) {
|
|
712
707
|
return ("You are updating an anchored conversation summary. A prior summary is " +
|
|
713
708
|
"shown first, followed by NEW conversation that occurred after that " +
|
|
@@ -719,7 +714,7 @@ export function buildSummarizationPrompt(messagesToSummarize, priorSummary) {
|
|
|
719
714
|
"- Stays in the same 9-section structure below\n" +
|
|
720
715
|
"- Is factual; preserves file paths, function names, and error " +
|
|
721
716
|
"messages exactly\n\n" +
|
|
722
|
-
|
|
717
|
+
SUMMARY_SECTION_LIST +
|
|
723
718
|
"\n=== Prior summary ===\n" +
|
|
724
719
|
priorSummary +
|
|
725
720
|
"\n\n=== New conversation ===\n\n" +
|
|
@@ -727,10 +722,110 @@ export function buildSummarizationPrompt(messagesToSummarize, priorSummary) {
|
|
|
727
722
|
}
|
|
728
723
|
return ("Summarize the following conversation into these sections. " +
|
|
729
724
|
"Be factual. Preserve file paths, function names, and error messages exactly.\n\n" +
|
|
730
|
-
|
|
725
|
+
SUMMARY_SECTION_LIST +
|
|
731
726
|
"\nConversation:\n\n" +
|
|
732
727
|
parts.join("\n"));
|
|
733
728
|
}
|
|
729
|
+
/** Target size for a portable context package (roughly one background page). */
|
|
730
|
+
export const CONTEXT_PACKAGE_TARGET_TOKENS = 1_500;
|
|
731
|
+
/** Hard output ceiling; the design allows a 1,500-2,000 token final package. */
|
|
732
|
+
export const CONTEXT_PACKAGE_MAX_OUTPUT_TOKENS = 2_000;
|
|
733
|
+
function serializeContextPackageBlock(block) {
|
|
734
|
+
switch (block.type) {
|
|
735
|
+
case "text": {
|
|
736
|
+
const text = block.text ?? "";
|
|
737
|
+
return { text, hasSummarizableContent: text.trim().length > 0 };
|
|
738
|
+
}
|
|
739
|
+
case "reasoning": {
|
|
740
|
+
const text = block.reasoningContent ?? block.text ?? "";
|
|
741
|
+
return {
|
|
742
|
+
text: `[reasoning]: ${text}`,
|
|
743
|
+
hasSummarizableContent: text.trim().length > 0,
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
case "tool_use": {
|
|
747
|
+
const args = JSON.stringify(block.input ?? {});
|
|
748
|
+
const name = block.name ?? "unknown_tool";
|
|
749
|
+
return {
|
|
750
|
+
text: `[tool_use id=${block.id ?? "unknown"}]: ${name}(${args})`,
|
|
751
|
+
hasSummarizableContent: name !== "unknown_tool" || args !== "{}",
|
|
752
|
+
};
|
|
753
|
+
}
|
|
754
|
+
case "tool_result": {
|
|
755
|
+
if (typeof block.content === "string") {
|
|
756
|
+
return {
|
|
757
|
+
text: `[tool_result tool_use_id=${block.tool_use_id ?? "unknown"}${block.is_error ? " is_error=true" : ""}]: ${block.content}`,
|
|
758
|
+
hasSummarizableContent: block.content.trim().length > 0,
|
|
759
|
+
};
|
|
760
|
+
}
|
|
761
|
+
const nested = (block.content ?? []).map(serializeContextPackageBlock);
|
|
762
|
+
return {
|
|
763
|
+
text: `[tool_result tool_use_id=${block.tool_use_id ?? "unknown"}${block.is_error ? " is_error=true" : ""}]:\n` +
|
|
764
|
+
nested.map((item) => item.text).join("\n"),
|
|
765
|
+
hasSummarizableContent: nested.some((item) => item.hasSummarizableContent),
|
|
766
|
+
};
|
|
767
|
+
}
|
|
768
|
+
case "image": {
|
|
769
|
+
const source = block.source;
|
|
770
|
+
const mediaType = source?.media_type ?? "unknown";
|
|
771
|
+
const encoding = source?.type ?? "unknown";
|
|
772
|
+
const encodedChars = source?.data.length ?? 0;
|
|
773
|
+
return {
|
|
774
|
+
text: `[image media_type=${mediaType} encoding=${encoding} encoded_chars=${encodedChars}; binary payload intentionally represented by metadata]`,
|
|
775
|
+
hasSummarizableContent: false,
|
|
776
|
+
};
|
|
777
|
+
}
|
|
778
|
+
default: {
|
|
779
|
+
return {
|
|
780
|
+
text: `[unknown content block]: ${JSON.stringify(block)}`,
|
|
781
|
+
hasSummarizableContent: true,
|
|
782
|
+
};
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
/**
|
|
787
|
+
* Serialize a selected context range without head-only truncation. Text, tool
|
|
788
|
+
* arguments/results, nested structured results, and reasoning are retained in
|
|
789
|
+
* full. Raw image bytes are intentionally not copied into a text prompt; an
|
|
790
|
+
* explicit metadata placeholder makes that conversion visible and bounded.
|
|
791
|
+
*/
|
|
792
|
+
export function serializeContextPackageMessages(messages) {
|
|
793
|
+
const lines = [];
|
|
794
|
+
let hasSummarizableContent = false;
|
|
795
|
+
for (const message of messages) {
|
|
796
|
+
if (typeof message.content === "string") {
|
|
797
|
+
lines.push(`[${message.role}]: ${message.content}`);
|
|
798
|
+
if (message.content.trim())
|
|
799
|
+
hasSummarizableContent = true;
|
|
800
|
+
continue;
|
|
801
|
+
}
|
|
802
|
+
for (const block of message.content) {
|
|
803
|
+
const serialized = serializeContextPackageBlock(block);
|
|
804
|
+
lines.push(`[${message.role}] ${serialized.text}`);
|
|
805
|
+
hasSummarizableContent ||= serialized.hasSummarizableContent;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
return { text: lines.join("\n"), hasSummarizableContent };
|
|
809
|
+
}
|
|
810
|
+
export function buildContextPackagePromptFromSerialized(serializedConversation, priorSummary) {
|
|
811
|
+
const instruction = "Create a portable background context package for a new session. " +
|
|
812
|
+
"Target about 1,500 tokens (never more than 2,000). Preserve the selected " +
|
|
813
|
+
"range's questions, conclusions, failed attempts, files and symbols, commands, " +
|
|
814
|
+
"exact errors, unresolved items, and concrete next steps. Do not imply that work " +
|
|
815
|
+
"outside the supplied range occurred. Be factual and retain explicit image placeholders.\n\n";
|
|
816
|
+
return (instruction +
|
|
817
|
+
buildSummarizationPrompt([{ role: "user", content: serializedConversation }], priorSummary, {
|
|
818
|
+
maxTextChars: Number.POSITIVE_INFINITY,
|
|
819
|
+
}));
|
|
820
|
+
}
|
|
821
|
+
/**
|
|
822
|
+
* Build the session-transfer variant on top of the same structured prompt used
|
|
823
|
+
* by /compact. Keeping this wrapper small makes changes to the canonical nine
|
|
824
|
+
* sections flow into both compaction and context packaging.
|
|
825
|
+
*/
|
|
826
|
+
export function buildContextPackagePrompt(messagesToSummarize, priorSummary) {
|
|
827
|
+
return buildContextPackagePromptFromSerialized(serializeContextPackageMessages(messagesToSummarize).text, priorSummary);
|
|
828
|
+
}
|
|
734
829
|
// ─── Anchored summary marker ────────────────────────────────────────
|
|
735
830
|
//
|
|
736
831
|
// applySummaryCompaction wraps the LLM-generated summary in these tags so the
|
|
@@ -757,6 +852,37 @@ export function extractAnchoredSummary(messages) {
|
|
|
757
852
|
}
|
|
758
853
|
return undefined;
|
|
759
854
|
}
|
|
855
|
+
/**
|
|
856
|
+
* Build the single anchored-summary message that replaces a compacted span.
|
|
857
|
+
* Emits the same `<anchored-summary>` marker `extractAnchoredSummary` reads, so
|
|
858
|
+
* a later compaction pass can feed it back for a rolling merge-update. The
|
|
859
|
+
* optional referenced-file list points the model at paths it may want to Read
|
|
860
|
+
* back; the transcript path lets it recover exact detail on demand. Shared by
|
|
861
|
+
* applySummaryCompaction (recency-window compaction) and any caller that
|
|
862
|
+
* collapses a specific span into one summary, keeping the marker format
|
|
863
|
+
* identical across both.
|
|
864
|
+
*/
|
|
865
|
+
export function buildAnchoredSummaryMessage(summary, options = {}) {
|
|
866
|
+
const { transcriptPath, referencedFiles = [] } = options;
|
|
867
|
+
let body = `This session is being continued from a previous conversation that ran out of context. ` +
|
|
868
|
+
`The summary below covers the earlier portion of the conversation.\n\n` +
|
|
869
|
+
`${ANCHORED_OPEN}\n${summary}\n${ANCHORED_CLOSE}`;
|
|
870
|
+
if (transcriptPath) {
|
|
871
|
+
body +=
|
|
872
|
+
`\n\nIf you need specific details from before compaction (like exact code snippets, ` +
|
|
873
|
+
`error messages, or content you generated), read the full transcript at: ${transcriptPath}`;
|
|
874
|
+
}
|
|
875
|
+
if (referencedFiles.length > 0) {
|
|
876
|
+
body +=
|
|
877
|
+
`\n\nFiles referenced before compaction (use Read tool if you need their current content):\n` +
|
|
878
|
+
referencedFiles.map((f) => `- ${f}`).join("\n");
|
|
879
|
+
}
|
|
880
|
+
body += `\n\nRecent messages are preserved verbatim below. Continue from where you left off.`;
|
|
881
|
+
return {
|
|
882
|
+
role: "user",
|
|
883
|
+
content: `<system-reminder>${body}</system-reminder>`,
|
|
884
|
+
};
|
|
885
|
+
}
|
|
760
886
|
/**
|
|
761
887
|
* Apply LLM-generated summary compaction (hybrid mode).
|
|
762
888
|
*
|
|
@@ -777,24 +903,10 @@ export function applySummaryCompaction(messages, summary, keepRecentN, transcrip
|
|
|
777
903
|
const recent = messages.slice(startIndex);
|
|
778
904
|
// Extract file paths (not contents) that were referenced before compaction
|
|
779
905
|
const referencedFiles = extractReferencedFilePaths(compactedMessages);
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
body +=
|
|
785
|
-
`\n\nIf you need specific details from before compaction (like exact code snippets, ` +
|
|
786
|
-
`error messages, or content you generated), read the full transcript at: ${transcriptPath}`;
|
|
787
|
-
}
|
|
788
|
-
if (referencedFiles.length > 0) {
|
|
789
|
-
body +=
|
|
790
|
-
`\n\nFiles referenced before compaction (use Read tool if you need their current content):\n` +
|
|
791
|
-
referencedFiles.map((f) => `- ${f}`).join("\n");
|
|
792
|
-
}
|
|
793
|
-
body += `\n\nRecent messages are preserved verbatim below. Continue from where you left off.`;
|
|
794
|
-
const summaryMsg = {
|
|
795
|
-
role: "user",
|
|
796
|
-
content: `<system-reminder>${body}</system-reminder>`,
|
|
797
|
-
};
|
|
906
|
+
const summaryMsg = buildAnchoredSummaryMessage(summary, {
|
|
907
|
+
...(transcriptPath ? { transcriptPath } : {}),
|
|
908
|
+
referencedFiles,
|
|
909
|
+
});
|
|
798
910
|
return [first, summaryMsg, ...recent];
|
|
799
911
|
}
|
|
800
912
|
// ─── API Round Grouping & Progressive Recovery ──────────────────────
|
|
@@ -31,7 +31,7 @@ export interface ContextManagerConfig {
|
|
|
31
31
|
* Injected by the Engine so the ContextManager doesn't depend on LLM directly.
|
|
32
32
|
*/
|
|
33
33
|
export type SummarizeFn = (prompt: string, signal?: AbortSignal) => Promise<string>;
|
|
34
|
-
export type CompactStrategy = "micro" | "summary" | "window" | "snip" | "emergency";
|
|
34
|
+
export type CompactStrategy = "micro" | "summary" | "window" | "snip" | "emergency" | "range";
|
|
35
35
|
export type OnCompactFn = (info: {
|
|
36
36
|
strategy: CompactStrategy;
|
|
37
37
|
before: number;
|
|
@@ -127,6 +127,22 @@ export declare class ContextManager {
|
|
|
127
127
|
* gets summarized here.
|
|
128
128
|
*/
|
|
129
129
|
forceSummarize(messages: Message[], signal?: AbortSignal): Promise<Message[]>;
|
|
130
|
+
/**
|
|
131
|
+
* Generic range archival: summarize a caller-chosen contiguous index window
|
|
132
|
+
* `[range.start, range.end)` into a single anchored summary message, leaving
|
|
133
|
+
* everything outside the window untouched. Unlike manage()/forceSummarize,
|
|
134
|
+
* the window is caller-specified, not derived from a pressure heuristic — the
|
|
135
|
+
* caller decides which span to collapse. Returns the input unchanged when no
|
|
136
|
+
* summarizeFn is set, when the (clamped) window is empty, or when the summary
|
|
137
|
+
* is empty/too short. The emitted summary uses the same anchored marker the
|
|
138
|
+
* rolling-summary path reads, so a later compaction can merge-update it.
|
|
139
|
+
*/
|
|
140
|
+
summarizeRange(messages: Message[], range: {
|
|
141
|
+
start: number;
|
|
142
|
+
end: number;
|
|
143
|
+
}, opts?: {
|
|
144
|
+
signal?: AbortSignal;
|
|
145
|
+
}): Promise<Message[]>;
|
|
130
146
|
/**
|
|
131
147
|
* Persist large tool_result blocks to disk and replace them with a
|
|
132
148
|
* preview + filepath. No-op when transcript path hasn't been set
|
package/dist/context/manager.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Tier 2: LLM summary (async) — generate summary of older messages via model call
|
|
6
6
|
* Tier 3: window compact (sync, emergency) — aggressive truncation fallback
|
|
7
7
|
*/
|
|
8
|
-
import { estimateTokens, microcompact, dedupeFileReads, maskOldObservations, snipCompact, windowCompact, truncateToolResult, buildSummarizationPrompt, applySummaryCompaction, applyToolResultBudget, extractAnchoredSummary, } from "./compaction.js";
|
|
8
|
+
import { estimateTokens, microcompact, dedupeFileReads, maskOldObservations, snipCompact, windowCompact, truncateToolResult, buildSummarizationPrompt, applySummaryCompaction, applyToolResultBudget, extractAnchoredSummary, buildAnchoredSummaryMessage, extractReferencedFilePaths, } from "./compaction.js";
|
|
9
9
|
import { applyToolResultPersistence, createContentReplacementState, reconstructContentReplacementState, resolveToolResultsDir, } from "./tool-result-storage.js";
|
|
10
10
|
import { logger } from "../logging/logger.js";
|
|
11
11
|
const DEFAULT_CONFIG = {
|
|
@@ -529,6 +529,41 @@ export class ContextManager {
|
|
|
529
529
|
}
|
|
530
530
|
return result;
|
|
531
531
|
}
|
|
532
|
+
/**
|
|
533
|
+
* Generic range archival: summarize a caller-chosen contiguous index window
|
|
534
|
+
* `[range.start, range.end)` into a single anchored summary message, leaving
|
|
535
|
+
* everything outside the window untouched. Unlike manage()/forceSummarize,
|
|
536
|
+
* the window is caller-specified, not derived from a pressure heuristic — the
|
|
537
|
+
* caller decides which span to collapse. Returns the input unchanged when no
|
|
538
|
+
* summarizeFn is set, when the (clamped) window is empty, or when the summary
|
|
539
|
+
* is empty/too short. The emitted summary uses the same anchored marker the
|
|
540
|
+
* rolling-summary path reads, so a later compaction can merge-update it.
|
|
541
|
+
*/
|
|
542
|
+
async summarizeRange(messages, range, opts = {}) {
|
|
543
|
+
const start = Math.max(0, Math.min(range.start, messages.length));
|
|
544
|
+
const end = Math.max(start, Math.min(range.end, messages.length));
|
|
545
|
+
if (!this.summarizeFn || end - start < 1)
|
|
546
|
+
return messages;
|
|
547
|
+
const window = messages.slice(start, end);
|
|
548
|
+
// Feed a prior anchored summary back so the LLM merge-updates rather than
|
|
549
|
+
// re-summarizes from scratch, matching the rolling-summary behavior of
|
|
550
|
+
// trySummaryCompact().
|
|
551
|
+
const priorSummary = extractAnchoredSummary(messages) ?? this.lastSummary;
|
|
552
|
+
const prompt = buildSummarizationPrompt(window, priorSummary);
|
|
553
|
+
const summary = await this.summarizeFn(prompt, opts.signal);
|
|
554
|
+
if (!summary || summary.length <= 50)
|
|
555
|
+
return messages;
|
|
556
|
+
this.lastSummary = summary;
|
|
557
|
+
const summaryMessage = buildAnchoredSummaryMessage(summary, {
|
|
558
|
+
...(this.transcriptPath ? { transcriptPath: this.transcriptPath } : {}),
|
|
559
|
+
referencedFiles: extractReferencedFilePaths(window),
|
|
560
|
+
});
|
|
561
|
+
const before = this.estimateTokensHybrid(messages);
|
|
562
|
+
const out = [...messages.slice(0, start), summaryMessage, ...messages.slice(end)];
|
|
563
|
+
const after = this.estimateTokensHybrid(out);
|
|
564
|
+
this.onCompact?.({ strategy: "range", before, after });
|
|
565
|
+
return out;
|
|
566
|
+
}
|
|
532
567
|
/**
|
|
533
568
|
* Persist large tool_result blocks to disk and replace them with a
|
|
534
569
|
* preview + filepath. No-op when transcript path hasn't been set
|
|
@@ -18,11 +18,13 @@ export interface CredentialAccess {
|
|
|
18
18
|
listMasked(cwd: string | undefined, scope: CredentialAccessScope): CredentialMetadata[];
|
|
19
19
|
resolveMeta(cwd: string | undefined, id: string, scope: CredentialAccessScope): CredentialMetadata | undefined;
|
|
20
20
|
envExposures(cwd: string | undefined, scope: CredentialAccessScope): Record<string, string>;
|
|
21
|
+
/** Subscribe to host credential snapshot changes (desktop worker uses this to cancel in-flight Links). */
|
|
22
|
+
subscribe?(listener: () => void): () => void;
|
|
21
23
|
resolveValue?(req: {
|
|
22
24
|
cwd?: string;
|
|
23
25
|
id: string;
|
|
24
26
|
scope: CredentialAccessScope;
|
|
25
|
-
purpose: "use" | "mcp";
|
|
27
|
+
purpose: "use" | "mcp" | "link";
|
|
26
28
|
}): Promise<string>;
|
|
27
29
|
/** Resolve only the bearer material needed by an MCP request. */
|
|
28
30
|
resolveOAuthAccess?(req: {
|