@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
package/dist/run/RunManager.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { nanoid } from "nanoid";
|
|
14
14
|
import { logger } from "../logging/logger.js";
|
|
15
15
|
import { RunQueue } from "./RunQueue.js";
|
|
16
|
-
import { EngineRunner } from "./EngineRunner.js";
|
|
16
|
+
import { EngineRunner, } from "./EngineRunner.js";
|
|
17
17
|
import { CheckpointWriter } from "./CheckpointWriter.js";
|
|
18
18
|
import { ArtifactTracker } from "./ArtifactTracker.js";
|
|
19
19
|
import { RunLock } from "./RunLock.js";
|
|
@@ -21,6 +21,8 @@ import { Heartbeat } from "./Heartbeat.js";
|
|
|
21
21
|
import { NoopEvaluator } from "./Evaluator.js";
|
|
22
22
|
import { assertSafeRunFileId, assertSafeRunId } from "./ids.js";
|
|
23
23
|
import { VALID_TRANSITIONS } from "./types.js";
|
|
24
|
+
import { composeArtifactDetectors, resolveCapabilities, } from "../capabilities/index.js";
|
|
25
|
+
import { resolveAgentPreset } from "../preset/index.js";
|
|
24
26
|
function hasOwnString(value, key) {
|
|
25
27
|
return (value !== undefined &&
|
|
26
28
|
Object.prototype.hasOwnProperty.call(value, key) &&
|
|
@@ -32,9 +34,19 @@ export class RunManager {
|
|
|
32
34
|
runner;
|
|
33
35
|
lock;
|
|
34
36
|
heartbeat;
|
|
37
|
+
/**
|
|
38
|
+
* Page size for crash-recovery scans (see listAllByStatus).
|
|
39
|
+
*
|
|
40
|
+
* Deliberately NOT a constructor option: hosts have no reason to tune it, and
|
|
41
|
+
* exposing it would invite a caller to re-introduce the UI's 50-row default.
|
|
42
|
+
* Tests override it to exercise the multi-page loop cheaply.
|
|
43
|
+
*/
|
|
44
|
+
recoverPageSize = 200;
|
|
35
45
|
evaluator;
|
|
36
46
|
defaultTags;
|
|
37
47
|
defaultMetadata;
|
|
48
|
+
defaultPreset;
|
|
49
|
+
artifactDetectors;
|
|
38
50
|
subscribers = new Map();
|
|
39
51
|
abortControllers = new Map();
|
|
40
52
|
/** Active execution handles — used to resolve pending approvals/input while Engine is suspended */
|
|
@@ -53,10 +65,13 @@ export class RunManager {
|
|
|
53
65
|
constructor(config) {
|
|
54
66
|
this.store = config.store;
|
|
55
67
|
this.queue = new RunQueue({ concurrency: config.concurrency ?? 1 });
|
|
68
|
+
const localCapabilities = config.capabilities ??
|
|
69
|
+
(isRunExecutor(config.executor) ? [] : (config.executor.capabilities ?? []));
|
|
70
|
+
const capabilities = resolveCapabilities(localCapabilities);
|
|
56
71
|
// Accept either a RunExecutor instance or an EngineRunnerConfig
|
|
57
72
|
this.runner = isRunExecutor(config.executor)
|
|
58
73
|
? config.executor
|
|
59
|
-
: new EngineRunner(config.executor);
|
|
74
|
+
: new EngineRunner({ ...config.executor, capabilities });
|
|
60
75
|
this.lock = new RunLock({
|
|
61
76
|
runsDir: config.runsDir,
|
|
62
77
|
staleMs: config.staleLockMs,
|
|
@@ -68,6 +83,8 @@ export class RunManager {
|
|
|
68
83
|
this.evaluator = config.evaluator ?? new NoopEvaluator();
|
|
69
84
|
this.defaultTags = config.defaultTags ?? [];
|
|
70
85
|
this.defaultMetadata = config.defaultMetadata ?? {};
|
|
86
|
+
this.defaultPreset = resolveAgentPreset(undefined, capabilities).name;
|
|
87
|
+
this.artifactDetectors = composeArtifactDetectors(capabilities);
|
|
71
88
|
// Wire queue executor
|
|
72
89
|
this.queue.setExecutor((runId) => this.executeRun(runId));
|
|
73
90
|
}
|
|
@@ -81,7 +98,7 @@ export class RunManager {
|
|
|
81
98
|
const snapshot = {
|
|
82
99
|
runId,
|
|
83
100
|
objective: input.objective,
|
|
84
|
-
preset: input.preset ??
|
|
101
|
+
preset: input.preset ?? this.defaultPreset,
|
|
85
102
|
cwd: input.cwd ?? process.cwd(),
|
|
86
103
|
status: "queued",
|
|
87
104
|
createdAt: now,
|
|
@@ -280,14 +297,26 @@ export class RunManager {
|
|
|
280
297
|
* Returns the IDs of recovered runs.
|
|
281
298
|
*/
|
|
282
299
|
async recover() {
|
|
283
|
-
const runs = await this.
|
|
300
|
+
const runs = await this.listAllByStatus("running");
|
|
284
301
|
const recovered = [];
|
|
285
302
|
for (const run of runs) {
|
|
286
303
|
const processAlive = this.heartbeat.isProcessAlive(run.runId);
|
|
287
304
|
const stale = this.heartbeat.isStale(run.runId);
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
305
|
+
// Process liveness has VETO power: never recover a run whose owning
|
|
306
|
+
// process is still alive. A live process can miss a heartbeat window for
|
|
307
|
+
// benign reasons (a long synchronous tool call, GC pause, a suspended
|
|
308
|
+
// laptop), and recovering it force-unlocks the lock and re-queues work
|
|
309
|
+
// that is still executing — the same run then runs twice.
|
|
310
|
+
//
|
|
311
|
+
// This matches the documented contract above ("stale AND dead → recover").
|
|
312
|
+
// The old condition (`processAlive && !stale`) recovered a live-but-stale
|
|
313
|
+
// run, which was reproducible with a run owning the current PID and a
|
|
314
|
+
// 60s-old heartbeat.
|
|
315
|
+
if (processAlive || !stale) {
|
|
316
|
+
logger.info("run.recover.skip", {
|
|
317
|
+
runId: run.runId,
|
|
318
|
+
reason: processAlive ? "process alive" : "heartbeat recent",
|
|
319
|
+
});
|
|
291
320
|
continue;
|
|
292
321
|
}
|
|
293
322
|
// Process is dead or heartbeat is stale — recover
|
|
@@ -324,7 +353,7 @@ export class RunManager {
|
|
|
324
353
|
}
|
|
325
354
|
// Also check waiting runs with stale heartbeats (process died while waiting)
|
|
326
355
|
for (const status of ["waiting_input", "waiting_approval"]) {
|
|
327
|
-
const waitingRuns = await this.
|
|
356
|
+
const waitingRuns = await this.listAllByStatus(status);
|
|
328
357
|
for (const run of waitingRuns) {
|
|
329
358
|
const stale = this.heartbeat.isStale(run.runId);
|
|
330
359
|
if (stale && !this.heartbeat.isProcessAlive(run.runId)) {
|
|
@@ -337,6 +366,45 @@ export class RunManager {
|
|
|
337
366
|
}
|
|
338
367
|
return recovered;
|
|
339
368
|
}
|
|
369
|
+
/**
|
|
370
|
+
* Drain EVERY run with the given status, page by page.
|
|
371
|
+
*
|
|
372
|
+
* `store.list()` defaults to `limit: 50` because it backs a UI list. Crash
|
|
373
|
+
* recovery must not inherit a UI page size: with 55 stale running runs, the
|
|
374
|
+
* bare `list({ status })` call recovered the first 50 and left the remaining 5
|
|
375
|
+
* pinned in "running" forever (no later pass would revisit them, because
|
|
376
|
+
* recovery only runs at startup).
|
|
377
|
+
*
|
|
378
|
+
* Pages until a short page arrives. `maxPages` is a runaway guard for a store
|
|
379
|
+
* that ignores `offset` — without it a buggy store would loop forever.
|
|
380
|
+
*/
|
|
381
|
+
async listAllByStatus(status) {
|
|
382
|
+
// Overridable so a test can force the multi-page path without creating more
|
|
383
|
+
// rows than the production page size (which cost ~30s under load).
|
|
384
|
+
const pageSize = this.recoverPageSize;
|
|
385
|
+
const maxPages = 10_000;
|
|
386
|
+
const all = [];
|
|
387
|
+
const seen = new Set();
|
|
388
|
+
for (let page = 0; page < maxPages; page += 1) {
|
|
389
|
+
const batch = await this.store.list({
|
|
390
|
+
status,
|
|
391
|
+
limit: pageSize,
|
|
392
|
+
offset: page * pageSize,
|
|
393
|
+
});
|
|
394
|
+
for (const run of batch) {
|
|
395
|
+
// Dedupe defensively: concurrent writes can shift the offset window and
|
|
396
|
+
// surface the same run twice, which would double-recover it.
|
|
397
|
+
if (seen.has(run.runId))
|
|
398
|
+
continue;
|
|
399
|
+
seen.add(run.runId);
|
|
400
|
+
all.push(run);
|
|
401
|
+
}
|
|
402
|
+
if (batch.length < pageSize)
|
|
403
|
+
return all;
|
|
404
|
+
}
|
|
405
|
+
logger.warn("run.recover.page_limit", { status, scanned: all.length });
|
|
406
|
+
return all;
|
|
407
|
+
}
|
|
340
408
|
/**
|
|
341
409
|
* Graceful shutdown — stop all heartbeats and release all locks.
|
|
342
410
|
*/
|
|
@@ -388,7 +456,11 @@ export class RunManager {
|
|
|
388
456
|
objective: run.objective,
|
|
389
457
|
store: this.store,
|
|
390
458
|
});
|
|
391
|
-
const artifactTracker = new ArtifactTracker({
|
|
459
|
+
const artifactTracker = new ArtifactTracker({
|
|
460
|
+
runId,
|
|
461
|
+
store: this.store,
|
|
462
|
+
detectors: this.artifactDetectors,
|
|
463
|
+
});
|
|
392
464
|
// Build lifecycle hooks so Engine can notify us about approval/input needs
|
|
393
465
|
const lifecycleHooks = {
|
|
394
466
|
onApprovalNeeded: async (request) => {
|
|
@@ -413,8 +485,7 @@ export class RunManager {
|
|
|
413
485
|
// suppresses sub-agent session_started upstream (engine.ts:830-835),
|
|
414
486
|
// but a custom RunExecutor could forward sub-agent events — and only
|
|
415
487
|
// the MAIN run's session should identify the run, never a sub-agent's.
|
|
416
|
-
if (event.type === "session_started" &&
|
|
417
|
-
!event.agentId) {
|
|
488
|
+
if (event.type === "session_started" && !event.agentId) {
|
|
418
489
|
try {
|
|
419
490
|
const run = await this.getOrThrow(runId);
|
|
420
491
|
if (run.sessionId !== event.sessionId) {
|
package/dist/run/factory.d.ts
CHANGED
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
import type { LLMConfig, PermissionMode } from "../types.js";
|
|
21
21
|
import type { EngineConfig, EngineHookConfig } from "../engine/types.js";
|
|
22
22
|
import type { Evaluator } from "./Evaluator.js";
|
|
23
|
+
import type { CapabilityModule } from "../capabilities/index.js";
|
|
23
24
|
import { RunManager } from "./RunManager.js";
|
|
24
25
|
export interface CreateRunManagerOptions {
|
|
25
26
|
/** LLM configuration (required). */
|
|
@@ -63,6 +64,8 @@ export interface CreateRunManagerOptions {
|
|
|
63
64
|
* the interactive run-aware backend.
|
|
64
65
|
*/
|
|
65
66
|
approvalBackend?: import("../tool-system/permission.js").ApprovalBackend;
|
|
67
|
+
/** Product/domain capabilities installed into each Engine. */
|
|
68
|
+
capabilities?: readonly CapabilityModule[];
|
|
66
69
|
}
|
|
67
70
|
/**
|
|
68
71
|
* Create a fully configured RunManager with one call.
|
package/dist/run/factory.js
CHANGED
|
@@ -41,6 +41,7 @@ export function createRunManager(options) {
|
|
|
41
41
|
customSystemPrompt: options.customSystemPrompt,
|
|
42
42
|
appendSystemPrompt: options.appendSystemPrompt,
|
|
43
43
|
hooks: options.hooks,
|
|
44
|
+
capabilities: options.capabilities,
|
|
44
45
|
...(options.approvalBackend ? { approvalBackend: options.approvalBackend } : {}),
|
|
45
46
|
},
|
|
46
47
|
concurrency: options.concurrency ?? 1,
|
|
@@ -48,5 +49,6 @@ export function createRunManager(options) {
|
|
|
48
49
|
evaluator: options.evaluator,
|
|
49
50
|
defaultTags: options.defaultTags,
|
|
50
51
|
defaultMetadata: options.defaultMetadata,
|
|
52
|
+
capabilities: options.capabilities,
|
|
51
53
|
});
|
|
52
54
|
}
|
|
@@ -52,6 +52,12 @@ export interface SafeSpawnOptions {
|
|
|
52
52
|
ioDrainGraceMs?: number;
|
|
53
53
|
/** Optional cancellation signal. If already aborted, SafeSpawn resolves immediately without spawning. */
|
|
54
54
|
signal?: AbortSignal;
|
|
55
|
+
/**
|
|
56
|
+
* POSIX only: launch the direct child as a process-group leader so timeout
|
|
57
|
+
* and abort terminate helpers such as git-remote-https as well. Windows
|
|
58
|
+
* already uses taskkill /T for direct children.
|
|
59
|
+
*/
|
|
60
|
+
processGroup?: boolean;
|
|
55
61
|
}
|
|
56
62
|
export interface SafeSpawnShellOptions extends SafeSpawnOptions {
|
|
57
63
|
/** Optional sandbox to wrap the command through. Required for shell-mode. If omitted, the command runs through `shell ?? /bin/bash -c`. */
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
*/
|
|
36
36
|
import { spawn } from "node:child_process";
|
|
37
37
|
import { StringDecoder } from "node:string_decoder";
|
|
38
|
-
import { resolveSpawnTarget, defaultShellBinary, killChildTree, killProcessGroup } from "./spawn-common.js";
|
|
38
|
+
import { resolveSpawnTarget, defaultShellBinary, killChildTree, killProcessGroup, } from "./spawn-common.js";
|
|
39
39
|
export const DEFAULT_MAX_OUTPUT_BYTES = 1_000_000;
|
|
40
40
|
export const DEFAULT_IO_DRAIN_GRACE_MS = 100;
|
|
41
41
|
const TIMEOUT_SIGKILL_GRACE_MS = 2000;
|
|
@@ -51,6 +51,7 @@ export function safeSpawn(file, args, opts) {
|
|
|
51
51
|
opts,
|
|
52
52
|
cleanup: undefined,
|
|
53
53
|
resolveMs: undefined,
|
|
54
|
+
detached: opts.processGroup === true && process.platform !== "win32",
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
57
|
/**
|
|
@@ -85,7 +86,7 @@ export function safeSpawnShell(command, opts) {
|
|
|
85
86
|
detached: true,
|
|
86
87
|
});
|
|
87
88
|
}
|
|
88
|
-
function runLifecycle({ file, args, opts, cleanup, resolveMs, detached }) {
|
|
89
|
+
function runLifecycle({ file, args, opts, cleanup, resolveMs, detached, }) {
|
|
89
90
|
const maxBytes = opts.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;
|
|
90
91
|
const abortGrace = opts.ioDrainGraceMs ?? DEFAULT_IO_DRAIN_GRACE_MS;
|
|
91
92
|
const lifecycleStartedAt = spawnProfileEnabled() ? performance.now() : 0;
|
|
@@ -225,11 +226,7 @@ function runLifecycle({ file, args, opts, cleanup, resolveMs, detached }) {
|
|
|
225
226
|
// throw above, so we surface the same reason. If timeout or abort
|
|
226
227
|
// fired concurrently, give those precedence — the user-facing cause
|
|
227
228
|
// is the cancel/timeout, not the resulting process death.
|
|
228
|
-
const reason = timedOut
|
|
229
|
-
? "timeout"
|
|
230
|
-
: aborted
|
|
231
|
-
? "aborted"
|
|
232
|
-
: "spawn_failed";
|
|
229
|
+
const reason = timedOut ? "timeout" : aborted ? "aborted" : "spawn_failed";
|
|
233
230
|
finish({
|
|
234
231
|
reason,
|
|
235
232
|
stdout,
|
|
@@ -268,11 +265,7 @@ function runLifecycle({ file, args, opts, cleanup, resolveMs, detached }) {
|
|
|
268
265
|
stderr += tailErr;
|
|
269
266
|
}
|
|
270
267
|
}
|
|
271
|
-
const reason = timedOut
|
|
272
|
-
? "timeout"
|
|
273
|
-
: aborted
|
|
274
|
-
? "aborted"
|
|
275
|
-
: "ok";
|
|
268
|
+
const reason = timedOut ? "timeout" : aborted ? "aborted" : "ok";
|
|
276
269
|
finish({
|
|
277
270
|
reason,
|
|
278
271
|
stdout,
|
|
@@ -305,7 +298,9 @@ function safeCleanup(cleanup) {
|
|
|
305
298
|
try {
|
|
306
299
|
cleanup();
|
|
307
300
|
}
|
|
308
|
-
catch {
|
|
301
|
+
catch {
|
|
302
|
+
/* best-effort */
|
|
303
|
+
}
|
|
309
304
|
}
|
|
310
305
|
function emptyResult(overrides) {
|
|
311
306
|
return {
|
|
@@ -19,11 +19,23 @@ export declare function shouldAutoDream(config?: AutoDreamConfig): boolean;
|
|
|
19
19
|
/**
|
|
20
20
|
* Record that a session was completed (increment counter).
|
|
21
21
|
*/
|
|
22
|
+
/**
|
|
23
|
+
* Sessions counted since the last consolidation.
|
|
24
|
+
*
|
|
25
|
+
* Callers snapshot this BEFORE starting an async dream run and pass it back to
|
|
26
|
+
* `recordDreamComplete`, so sessions finishing mid-run are not swallowed.
|
|
27
|
+
*/
|
|
28
|
+
export declare function sessionsSinceLastDream(): number;
|
|
22
29
|
export declare function recordSession(): void;
|
|
23
30
|
/**
|
|
24
31
|
* Record that a dream run completed.
|
|
32
|
+
*
|
|
33
|
+
* `consumed` is how many sessions the finished run accounted for — captured
|
|
34
|
+
* BEFORE it started. Subtracting it (instead of zeroing) preserves sessions that
|
|
35
|
+
* completed while the run was in flight: `runDream()` is async, so blindly
|
|
36
|
+
* resetting to 0 threw away increments that belonged to the next cycle.
|
|
25
37
|
*/
|
|
26
|
-
export declare function recordDreamComplete(): void;
|
|
38
|
+
export declare function recordDreamComplete(consumed?: number): void;
|
|
27
39
|
/**
|
|
28
40
|
* System prompt for the auto-dream tool-call loop.
|
|
29
41
|
*
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
8
8
|
import { join } from "node:path";
|
|
9
9
|
import { resolveMemoryBaseDir } from "../session/memory.js";
|
|
10
|
+
import { mutateJsonFile } from "../utils/file-mutex.js";
|
|
10
11
|
const DEFAULT_CONFIG = {
|
|
11
12
|
minSessionsBetween: 5,
|
|
12
13
|
minTimeBetween: 24 * 60 * 60 * 1000, // 24 hours
|
|
@@ -33,6 +34,33 @@ function saveState(state) {
|
|
|
33
34
|
mkdirSync(resolveMemoryBaseDir(), { recursive: true });
|
|
34
35
|
writeFileSync(stateFile, JSON.stringify(state, null, 2), "utf-8");
|
|
35
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Read-modify-write the cadence state under a cross-process lock.
|
|
39
|
+
*
|
|
40
|
+
* The reload happens inside the lock, so a writer that lost the race still sees
|
|
41
|
+
* the winner's value and applies its own change on top instead of overwriting it.
|
|
42
|
+
*/
|
|
43
|
+
function mutateState(change) {
|
|
44
|
+
mkdirSync(resolveMemoryBaseDir(), { recursive: true });
|
|
45
|
+
mutateJsonFile(getStateFile(), {
|
|
46
|
+
parse: (raw) => {
|
|
47
|
+
if (raw === undefined)
|
|
48
|
+
return { lastDreamAt: null, sessionsSinceLastDream: 0 };
|
|
49
|
+
try {
|
|
50
|
+
const parsed = JSON.parse(raw);
|
|
51
|
+
return {
|
|
52
|
+
lastDreamAt: parsed.lastDreamAt ?? null,
|
|
53
|
+
sessionsSinceLastDream: Number(parsed.sessionsSinceLastDream) || 0,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return { lastDreamAt: null, sessionsSinceLastDream: 0 };
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
serialize: (state) => JSON.stringify(state, null, 2),
|
|
61
|
+
mutation: (current) => ({ value: change(current) }),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
36
64
|
/**
|
|
37
65
|
* Check if auto-dream should run.
|
|
38
66
|
*/
|
|
@@ -54,19 +82,39 @@ export function shouldAutoDream(config = DEFAULT_CONFIG) {
|
|
|
54
82
|
/**
|
|
55
83
|
* Record that a session was completed (increment counter).
|
|
56
84
|
*/
|
|
85
|
+
/**
|
|
86
|
+
* Sessions counted since the last consolidation.
|
|
87
|
+
*
|
|
88
|
+
* Callers snapshot this BEFORE starting an async dream run and pass it back to
|
|
89
|
+
* `recordDreamComplete`, so sessions finishing mid-run are not swallowed.
|
|
90
|
+
*/
|
|
91
|
+
export function sessionsSinceLastDream() {
|
|
92
|
+
return loadState().sessionsSinceLastDream;
|
|
93
|
+
}
|
|
57
94
|
export function recordSession() {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
95
|
+
// Cross-process increment. Desktop worker, Desktop main/automation, TUI and a
|
|
96
|
+
// standalone agent server can share one CODE_SHELL_HOME, so this was a real
|
|
97
|
+
// multi-writer path: an unlocked read → +1 → write dropped nearly everything
|
|
98
|
+
// (48 concurrent processes recorded 1–2 increments). The cadence then never
|
|
99
|
+
// reached its threshold and auto-consolidation silently stopped happening.
|
|
100
|
+
mutateState((state) => ({
|
|
101
|
+
...state,
|
|
102
|
+
sessionsSinceLastDream: state.sessionsSinceLastDream + 1,
|
|
103
|
+
}));
|
|
61
104
|
}
|
|
62
105
|
/**
|
|
63
106
|
* Record that a dream run completed.
|
|
107
|
+
*
|
|
108
|
+
* `consumed` is how many sessions the finished run accounted for — captured
|
|
109
|
+
* BEFORE it started. Subtracting it (instead of zeroing) preserves sessions that
|
|
110
|
+
* completed while the run was in flight: `runDream()` is async, so blindly
|
|
111
|
+
* resetting to 0 threw away increments that belonged to the next cycle.
|
|
64
112
|
*/
|
|
65
|
-
export function recordDreamComplete() {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
113
|
+
export function recordDreamComplete(consumed) {
|
|
114
|
+
mutateState((state) => ({
|
|
115
|
+
lastDreamAt: new Date().toISOString(),
|
|
116
|
+
sessionsSinceLastDream: consumed === undefined ? 0 : Math.max(0, state.sessionsSinceLastDream - consumed),
|
|
117
|
+
}));
|
|
70
118
|
}
|
|
71
119
|
/**
|
|
72
120
|
* System prompt for the auto-dream tool-call loop.
|
|
@@ -141,7 +141,10 @@ async function dispatchDreamTool(tc, toolRegistry, ctx, consumeWriteBudget) {
|
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
try {
|
|
144
|
-
|
|
144
|
+
// Portable profile memory is intentionally not part of automatic dream
|
|
145
|
+
// routing. Normal profile-bound runs may manage it explicitly, but the
|
|
146
|
+
// consolidation loop remains limited to its existing global/project stores.
|
|
147
|
+
const dreamCtx = { ...ctx, profileMemoryDir: undefined, __dreamLoop: true };
|
|
145
148
|
const result = await toolRegistry.executeTool(tc.toolName, tc.args, { ctx: dreamCtx });
|
|
146
149
|
if (result.isError)
|
|
147
150
|
return result.error ?? `Error executing ${tc.toolName}`;
|
|
@@ -159,6 +162,12 @@ function checkDreamWriteGuard(tc, ctx) {
|
|
|
159
162
|
error: `Error: dream loop may only write to scope "dream" or "user", got "${scope}".`,
|
|
160
163
|
};
|
|
161
164
|
}
|
|
165
|
+
if (tc.args?.location === "profile") {
|
|
166
|
+
return {
|
|
167
|
+
ok: false,
|
|
168
|
+
error: "Error: dream loop does not manage portable profile memory.",
|
|
169
|
+
};
|
|
170
|
+
}
|
|
162
171
|
const location = tc.args?.location === "global" ? "global" : "project";
|
|
163
172
|
const mm = new MemoryManager({
|
|
164
173
|
projectDir: location === "project" ? ctx.cwd : undefined,
|
|
@@ -17,7 +17,7 @@ import { buildExtractionPrompt, parseExtractionResponse, } from "./extract-memor
|
|
|
17
17
|
import { saveSessionMemory, buildSessionMemoryPrompt } from "./session-memory.js";
|
|
18
18
|
import { extractJSON } from "../utils/json.js";
|
|
19
19
|
import { redactSecrets } from "../logging/sanitize-messages.js";
|
|
20
|
-
import { shouldAutoDream, recordSession, recordDreamComplete, buildDreamSystemPrompt, buildDreamUserPrompt, } from "./auto-dream.js";
|
|
20
|
+
import { shouldAutoDream, recordSession, recordDreamComplete, sessionsSinceLastDream, buildDreamSystemPrompt, buildDreamUserPrompt, } from "./auto-dream.js";
|
|
21
21
|
import { applyGlobalDreamPromotionGate, detectUserDirectGlobalPreference, } from "./global-dream-promotion.js";
|
|
22
22
|
import { logger } from "../logging/logger.js";
|
|
23
23
|
export class MemoryOrchestrator {
|
|
@@ -259,13 +259,17 @@ export class MemoryOrchestrator {
|
|
|
259
259
|
? new MemoryManager({ scope: "dream" }).loadScope("dream")
|
|
260
260
|
: [];
|
|
261
261
|
if (userMems.length + dreamMems.length + globalDreamMems.length > 0) {
|
|
262
|
+
// Snapshot the cadence counter BEFORE the (async) run so sessions that
|
|
263
|
+
// finish while it is in flight are carried into the next cycle rather
|
|
264
|
+
// than being zeroed away on completion.
|
|
265
|
+
const consumed = sessionsSinceLastDream();
|
|
262
266
|
const ran = await this.options.runDream({
|
|
263
267
|
systemPrompt: buildDreamSystemPrompt(),
|
|
264
268
|
userPrompt: buildDreamUserPrompt(userMems, dreamMems, globalDreamMems),
|
|
265
269
|
projectDir: this.options.projectDir,
|
|
266
270
|
});
|
|
267
271
|
if (ran) {
|
|
268
|
-
recordDreamComplete();
|
|
272
|
+
recordDreamComplete(consumed);
|
|
269
273
|
dreamTriggered = true;
|
|
270
274
|
logger.info("memory.auto_dream_done", {
|
|
271
275
|
sessionId,
|
package/dist/services/oauth.js
CHANGED
|
@@ -58,6 +58,9 @@ function validateOAuthRequestUrl(url) {
|
|
|
58
58
|
export function createHardenedOAuthFetch(baseFetch = fetch, options = {}) {
|
|
59
59
|
const maxRedirects = Math.max(0, Math.min(10, options.maxRedirects ?? 5));
|
|
60
60
|
return (async (input, init) => {
|
|
61
|
+
// Bun and Node's undici declarations currently expose incompatible global
|
|
62
|
+
// Request overloads even though both accept the standard fetch input at
|
|
63
|
+
// runtime. Keep that ambient type conflict contained at this boundary.
|
|
61
64
|
const initial = new Request(input, init);
|
|
62
65
|
let currentUrl = new URL(initial.url);
|
|
63
66
|
const initialLoopback = isLoopbackHostname(currentUrl.hostname);
|
|
@@ -69,7 +72,7 @@ export function createHardenedOAuthFetch(baseFetch = fetch, options = {}) {
|
|
|
69
72
|
const secretBearing = (method !== "GET" && method !== "HEAD") || headers.has("authorization");
|
|
70
73
|
for (let redirectCount = 0;; redirectCount++) {
|
|
71
74
|
validateOAuthRequestUrl(currentUrl);
|
|
72
|
-
const request = new Request(currentUrl, {
|
|
75
|
+
const request = new Request(currentUrl.toString(), {
|
|
73
76
|
method,
|
|
74
77
|
headers,
|
|
75
78
|
body: body ? body.slice() : undefined,
|
|
@@ -15,19 +15,19 @@ export interface SessionMemoryEntry {
|
|
|
15
15
|
/**
|
|
16
16
|
* Save a session memory entry.
|
|
17
17
|
*/
|
|
18
|
-
export declare function saveSessionMemory(entry: SessionMemoryEntry): void;
|
|
18
|
+
export declare function saveSessionMemory(entry: SessionMemoryEntry, baseDir?: string): void;
|
|
19
19
|
/**
|
|
20
20
|
* Load a session memory by session ID.
|
|
21
21
|
*/
|
|
22
|
-
export declare function loadSessionMemory(sessionId: string): SessionMemoryEntry | null;
|
|
22
|
+
export declare function loadSessionMemory(sessionId: string, baseDir?: string): SessionMemoryEntry | null;
|
|
23
23
|
/**
|
|
24
24
|
* List all session memories, most recent first.
|
|
25
25
|
*/
|
|
26
|
-
export declare function listSessionMemories(limit?: number): SessionMemoryEntry[];
|
|
26
|
+
export declare function listSessionMemories(limit?: number, baseDir?: string): SessionMemoryEntry[];
|
|
27
27
|
/**
|
|
28
28
|
* Search session memories by keyword.
|
|
29
29
|
*/
|
|
30
|
-
export declare function searchSessionMemories(query: string): SessionMemoryEntry[];
|
|
30
|
+
export declare function searchSessionMemories(query: string, baseDir?: string): SessionMemoryEntry[];
|
|
31
31
|
/**
|
|
32
32
|
* Build a prompt for extracting session memory from a conversation.
|
|
33
33
|
*/
|
|
@@ -11,14 +11,17 @@ import { sortSessionMemoriesByRecency } from "./session-memory-sort.js";
|
|
|
11
11
|
// Resolve per-call (NOT a module const): userHome() reads $HOME live, so a
|
|
12
12
|
// relocated/test HOME redirects writes instead of pinning the real ~/.code-shell
|
|
13
13
|
// at import time (bun freezes a module-level homedir() and never re-reads it).
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
// `baseDir` is the explicit injection point (the `~/.code-shell`-equivalent
|
|
15
|
+
// root): when provided it wins over $HOME resolution — identity-scoped server
|
|
16
|
+
// deployments pass their per-user data root here.
|
|
17
|
+
function memoryDir(baseDir) {
|
|
18
|
+
return join(baseDir ?? join(userHome(), ".code-shell"), "session-memories");
|
|
16
19
|
}
|
|
17
20
|
/**
|
|
18
21
|
* Save a session memory entry.
|
|
19
22
|
*/
|
|
20
|
-
export function saveSessionMemory(entry) {
|
|
21
|
-
const dir = memoryDir();
|
|
23
|
+
export function saveSessionMemory(entry, baseDir) {
|
|
24
|
+
const dir = memoryDir(baseDir);
|
|
22
25
|
mkdirSync(dir, { recursive: true });
|
|
23
26
|
const file = join(dir, `${entry.sessionId}.json`);
|
|
24
27
|
writeFileSync(file, JSON.stringify(entry, null, 2), "utf-8");
|
|
@@ -26,8 +29,8 @@ export function saveSessionMemory(entry) {
|
|
|
26
29
|
/**
|
|
27
30
|
* Load a session memory by session ID.
|
|
28
31
|
*/
|
|
29
|
-
export function loadSessionMemory(sessionId) {
|
|
30
|
-
const file = join(memoryDir(), `${sessionId}.json`);
|
|
32
|
+
export function loadSessionMemory(sessionId, baseDir) {
|
|
33
|
+
const file = join(memoryDir(baseDir), `${sessionId}.json`);
|
|
31
34
|
if (!existsSync(file))
|
|
32
35
|
return null;
|
|
33
36
|
try {
|
|
@@ -40,8 +43,8 @@ export function loadSessionMemory(sessionId) {
|
|
|
40
43
|
/**
|
|
41
44
|
* List all session memories, most recent first.
|
|
42
45
|
*/
|
|
43
|
-
export function listSessionMemories(limit = 50) {
|
|
44
|
-
const dir = memoryDir();
|
|
46
|
+
export function listSessionMemories(limit = 50, baseDir) {
|
|
47
|
+
const dir = memoryDir(baseDir);
|
|
45
48
|
if (!existsSync(dir))
|
|
46
49
|
return [];
|
|
47
50
|
// Read all entries, then order by createdAt (not by filename — the filename
|
|
@@ -63,8 +66,8 @@ export function listSessionMemories(limit = 50) {
|
|
|
63
66
|
/**
|
|
64
67
|
* Search session memories by keyword.
|
|
65
68
|
*/
|
|
66
|
-
export function searchSessionMemories(query) {
|
|
67
|
-
const all = listSessionMemories(200);
|
|
69
|
+
export function searchSessionMemories(query, baseDir) {
|
|
70
|
+
const all = listSessionMemories(200, baseDir);
|
|
68
71
|
const q = query.toLowerCase();
|
|
69
72
|
return all.filter((m) => m.summary.toLowerCase().includes(q) ||
|
|
70
73
|
m.keyTopics.some((t) => t.toLowerCase().includes(q)) ||
|
package/dist/session/memory.d.ts
CHANGED
|
@@ -215,20 +215,21 @@ export declare class MemoryManager {
|
|
|
215
215
|
now?: number;
|
|
216
216
|
}): string;
|
|
217
217
|
/**
|
|
218
|
-
*
|
|
219
|
-
* experience) +
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
* recall → drives TTL + UI visibility).
|
|
218
|
+
* Three-layer injection index (用户拍板). Merges GLOBAL (cross-project
|
|
219
|
+
* experience) + DIGITAL-HUMAN (portable profile experience) + PROJECT
|
|
220
|
+
* (this repo's facts) memories into a compact index — one line per entry,
|
|
221
|
+
* name + description only, NO body.
|
|
223
222
|
*
|
|
224
223
|
* This is what fixes "global memory never shows up": global memories are now
|
|
225
224
|
* injected alongside project ones, every session, regardless of cwd.
|
|
226
225
|
*
|
|
227
|
-
* Static because it must construct
|
|
228
|
-
*
|
|
226
|
+
* Static because it must construct the managers for each configured layer.
|
|
227
|
+
* `projectDir` undefined → no project layer; `profileDir` undefined → no
|
|
228
|
+
* digital-human layer.
|
|
229
229
|
*/
|
|
230
230
|
static buildInjectionIndex(opts: {
|
|
231
231
|
projectDir?: string;
|
|
232
|
+
profileDir?: string;
|
|
232
233
|
baseDir?: string;
|
|
233
234
|
maxAgeDays?: number;
|
|
234
235
|
now?: number;
|
|
@@ -253,6 +254,24 @@ export declare class MemoryManager {
|
|
|
253
254
|
* O(N²) re-read of every memory file on every save.
|
|
254
255
|
*/
|
|
255
256
|
private ensureIndexCache;
|
|
257
|
+
/**
|
|
258
|
+
* Rewrite MEMORY.md from the CURRENT set of memory files on disk, under a
|
|
259
|
+
* cross-process lock.
|
|
260
|
+
*
|
|
261
|
+
* The in-memory `indexCache` is a per-instance optimisation, and several
|
|
262
|
+
* managers exist for the same directory (desktop main, agent worker, TUI, a
|
|
263
|
+
* second desktop instance). Writing the cache out verbatim meant a stale
|
|
264
|
+
* snapshot clobbered whatever another writer had added:
|
|
265
|
+
*
|
|
266
|
+
* A saves a → B loads {a}, saves b → A still holds {a}, saves c
|
|
267
|
+
* → files a, b, c all exist, but MEMORY.md lists only a and c.
|
|
268
|
+
*
|
|
269
|
+
* The individual `<name>.md` files are the source of truth; MEMORY.md is a
|
|
270
|
+
* derived index. So rather than trusting any cache, re-derive it from disk
|
|
271
|
+
* inside the lock. `pending` carries this writer's own change, which may not
|
|
272
|
+
* be visible on disk yet (a delete moves the file to trash first, a save
|
|
273
|
+
* writes it first) — it is applied on top of the freshly scanned set.
|
|
274
|
+
*/
|
|
256
275
|
private writeIndex;
|
|
257
276
|
private generateId;
|
|
258
277
|
private availableFileNameForId;
|