@cjhyy/code-shell-core 0.7.0 → 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 +20 -5
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +20 -4
- package/dist/context/manager.js +42 -7
- package/dist/context/token-counter.js +5 -3
- package/dist/context/tool-result-storage.d.ts +6 -0
- package/dist/context/tool-result-storage.js +25 -4
- package/dist/credentials/access.d.ts +13 -2
- package/dist/credentials/access.js +99 -4
- package/dist/credentials/index.d.ts +3 -2
- package/dist/credentials/index.js +2 -1
- package/dist/credentials/oauth.d.ts +9 -1
- package/dist/credentials/oauth.js +80 -1
- package/dist/credentials/store.d.ts +16 -2
- package/dist/credentials/store.js +33 -11
- package/dist/credentials/types.d.ts +62 -1
- package/dist/credentials/types.js +16 -1
- 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 +272 -184
- package/dist/engine/engine.js +1869 -1864
- 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/session-title.d.ts +2 -1
- package/dist/engine/session-title.js +4 -1
- 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 +67 -10
- package/dist/engine/turn-loop.js +538 -97
- package/dist/engine/types.d.ts +35 -4
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +26 -9
- package/dist/hooks/events.js +0 -3
- package/dist/hooks/goal-stop-hook.d.ts +28 -29
- package/dist/hooks/goal-stop-hook.js +344 -144
- package/dist/hooks/registry.js +4 -1
- package/dist/hooks/shell-runner.d.ts +12 -1
- package/dist/hooks/shell-runner.js +160 -9
- package/dist/index.d.ts +51 -110
- 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 +37 -125
- 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 +72 -10
- 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/llm/types.d.ts +12 -5
- 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 +10 -4
- package/dist/plugins/pluginCommandHook.js +133 -18
- 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 +77 -3
- package/dist/protocol/chat-session-manager.js +194 -18
- package/dist/protocol/chat-session.d.ts +72 -9
- package/dist/protocol/chat-session.js +151 -16
- package/dist/protocol/client.d.ts +37 -4
- package/dist/protocol/client.js +118 -6
- 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 +152 -14
- package/dist/protocol/server.js +1574 -229
- package/dist/protocol/types.d.ts +182 -32
- package/dist/protocol/types.js +18 -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.d.ts +3 -0
- package/dist/services/dream-consolidation.js +14 -2
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.d.ts +34 -10
- package/dist/services/oauth.js +236 -98
- 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 +208 -25
- package/dist/session/session-manager.js +1232 -116
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +76 -6
- package/dist/session/transcript.js +278 -7
- 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 +279 -34
- package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
- package/dist/tool-system/builtin/background-jobs.js +111 -15
- package/dist/tool-system/builtin/background-work.d.ts +12 -1
- package/dist/tool-system/builtin/background-work.js +12 -1
- package/dist/tool-system/builtin/bash.d.ts +3 -5
- package/dist/tool-system/builtin/bash.js +14 -6
- package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
- 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.d.ts +2 -1
- package/dist/tool-system/builtin/edit.js +14 -10
- 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.d.ts +4 -0
- package/dist/tool-system/builtin/generate-video.js +164 -28
- package/dist/tool-system/builtin/glob.d.ts +2 -1
- package/dist/tool-system/builtin/glob.js +28 -3
- package/dist/tool-system/builtin/grep.d.ts +1 -0
- package/dist/tool-system/builtin/grep.js +82 -17
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +57 -18
- package/dist/tool-system/builtin/index.js +280 -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/video-providers.d.ts +12 -15
- package/dist/tool-system/builtin/video-providers.js +1 -0
- package/dist/tool-system/builtin/view-image.d.ts +2 -2
- package/dist/tool-system/builtin/web-fetch.js +60 -15
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/builtin/write.d.ts +2 -1
- package/dist/tool-system/builtin/write.js +14 -4
- 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 +94 -24
- package/dist/tool-system/executor.js +99 -58
- 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 +17 -1
- package/dist/tool-system/mcp-manager.js +72 -7
- 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.d.ts +19 -0
- package/dist/tool-system/path-policy.js +62 -1
- package/dist/tool-system/permission.d.ts +69 -3
- package/dist/tool-system/permission.js +429 -30
- package/dist/tool-system/registry.d.ts +15 -3
- package/dist/tool-system/registry.js +82 -40
- 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 +201 -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 -43
- package/dist/arena/arena.js +0 -333
- 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 -24
- package/dist/arena/phases/adjudication.js +0 -141
- package/dist/arena/phases/build-consensus.d.ts +0 -29
- package/dist/arena/phases/build-consensus.js +0 -83
- 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 -45
- package/dist/arena/phases/cross-review.js +0 -218
- package/dist/arena/phases/debate-rounds.d.ts +0 -27
- package/dist/arena/phases/debate-rounds.js +0 -159
- package/dist/arena/phases/participant-research.d.ts +0 -38
- package/dist/arena/phases/participant-research.js +0 -314
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
- package/dist/arena/phases/planning-detail-expansion.js +0 -119
- package/dist/arena/planner.d.ts +0 -27
- package/dist/arena/planner.js +0 -311
- 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 -514
- 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 -69
- package/dist/git/worktree/crud.js +0 -206
- 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 -51
- 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 -42
- package/dist/git/worktree/query.js +0 -121
- 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 -415
- 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 -345
- /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
|
@@ -13,6 +13,7 @@ import { createTranscriptTranslator } from "./agent-transcript-translator.js";
|
|
|
13
13
|
import { notificationQueue } from "./agent-notifications.js";
|
|
14
14
|
import { nanoid } from "nanoid";
|
|
15
15
|
import { logger } from "../../logging/logger.js";
|
|
16
|
+
import { applyAgentProgressPhase, applyAgentProgressUsage, initialAgentProgress, reduceAgentProgress, } from "./agent-progress.js";
|
|
16
17
|
/**
|
|
17
18
|
* Invoke a stream callback that came from outside the engine's own
|
|
18
19
|
* TurnLoop wrap (e.g. `subAgentSpawner.parentStream`, which is the
|
|
@@ -69,6 +70,8 @@ export function resolveAgentTypeOverrides(agentType, registry) {
|
|
|
69
70
|
maxTurns: def.maxTurns,
|
|
70
71
|
toolAllowlist: def.tools,
|
|
71
72
|
skillAllowlist: namespacePluginSkills(def.skills, def.source, def.pluginName),
|
|
73
|
+
sandboxMode: def.sandbox,
|
|
74
|
+
mcpAllowlist: def.mcp,
|
|
72
75
|
appendSystemPrompt: def.systemPrompt,
|
|
73
76
|
};
|
|
74
77
|
}
|
|
@@ -269,12 +272,38 @@ streamOverride) {
|
|
|
269
272
|
// that no longer exists. The child Engine is a fresh instance; plan-mode
|
|
270
273
|
// isolation between parent and child is enforced via separate Engine
|
|
271
274
|
// instances (finalized in T6).
|
|
272
|
-
const { text } = await spawner.spawn({ ...opts, streamOverride });
|
|
275
|
+
const { text, usage } = await spawner.spawn({ ...opts, streamOverride });
|
|
276
|
+
if (usage)
|
|
277
|
+
opts.recordBilledUsage?.(usage);
|
|
273
278
|
const finalText = text || `Agent completed but produced no text output.`;
|
|
274
|
-
safeEmit(startEndSink, {
|
|
279
|
+
safeEmit(startEndSink, {
|
|
280
|
+
type: "agent_end",
|
|
281
|
+
agentId,
|
|
282
|
+
name,
|
|
283
|
+
description,
|
|
284
|
+
text: finalText,
|
|
285
|
+
agentType,
|
|
286
|
+
});
|
|
275
287
|
emitSubAgentHook(opts.hooks, "subagent_finish", { agentId, description, text: finalText });
|
|
276
288
|
return finalText;
|
|
277
289
|
}
|
|
290
|
+
function createAgentProgressTracker(agentId) {
|
|
291
|
+
let progress = initialAgentProgress();
|
|
292
|
+
return {
|
|
293
|
+
current: () => progress,
|
|
294
|
+
onEvent: (event) => {
|
|
295
|
+
progress = reduceAgentProgress(progress, event);
|
|
296
|
+
asyncAgentRegistry.updateProgress(agentId, progress);
|
|
297
|
+
},
|
|
298
|
+
onRuntime: (event) => {
|
|
299
|
+
progress =
|
|
300
|
+
event.type === "usage"
|
|
301
|
+
? applyAgentProgressUsage(progress, event.usage)
|
|
302
|
+
: applyAgentProgressPhase(progress, event.phase, Date.now(), event.toolName);
|
|
303
|
+
asyncAgentRegistry.updateProgress(agentId, progress);
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
}
|
|
278
307
|
export async function agentTool(args, ctx) {
|
|
279
308
|
const prompt = args.prompt;
|
|
280
309
|
const description = args.description || "sub-agent";
|
|
@@ -327,10 +356,13 @@ export async function agentTool(args, ctx) {
|
|
|
327
356
|
// through AgentCancel(agent_id).
|
|
328
357
|
if (runInBackground) {
|
|
329
358
|
if (asyncAgentRegistry.runningCount() >= MAX_BACKGROUND_AGENTS) {
|
|
330
|
-
return `Error: too many background agents running (limit ${MAX_BACKGROUND_AGENTS}). ` +
|
|
331
|
-
`Wait for some to finish or cancel one with AgentCancel(agent_id) before launching more
|
|
359
|
+
return (`Error: too many background agents running (limit ${MAX_BACKGROUND_AGENTS}). ` +
|
|
360
|
+
`Wait for some to finish or cancel one with AgentCancel(agent_id) before launching more.`);
|
|
332
361
|
}
|
|
333
362
|
const controller = new AbortController();
|
|
363
|
+
const runtimeGeneration = asyncAgentRegistry.allocateRuntimeGeneration(agentId);
|
|
364
|
+
const progressTracker = createAgentProgressTracker(agentId);
|
|
365
|
+
let liveLease;
|
|
334
366
|
asyncAgentRegistry.register({
|
|
335
367
|
agentId,
|
|
336
368
|
name,
|
|
@@ -339,6 +371,9 @@ export async function agentTool(args, ctx) {
|
|
|
339
371
|
// Tag with the spawning session so the parent Engine.run waits only on
|
|
340
372
|
// its own background agents (hasRunningForSession).
|
|
341
373
|
sessionId: ctx?.sessionId,
|
|
374
|
+
childSessionId: agentId,
|
|
375
|
+
runtimeGeneration,
|
|
376
|
+
progress: progressTracker.current(),
|
|
342
377
|
status: "running",
|
|
343
378
|
startedAt: Date.now(),
|
|
344
379
|
abort: () => controller.abort(),
|
|
@@ -369,14 +404,52 @@ export async function agentTool(args, ctx) {
|
|
|
369
404
|
model: overrides.model,
|
|
370
405
|
toolAllowlist: overrides.toolAllowlist,
|
|
371
406
|
skillAllowlist: overrides.skillAllowlist,
|
|
407
|
+
sandboxMode: overrides.sandboxMode,
|
|
408
|
+
mcpAllowlist: overrides.mcpAllowlist,
|
|
372
409
|
appendSystemPrompt: overrides.appendSystemPrompt,
|
|
373
410
|
readOnlySession: overrides.resolvedType === "researcher" || overrides.resolvedType === "explorer",
|
|
374
411
|
hooks: ctx?.hooks,
|
|
412
|
+
recordBilledUsage: ctx?.recordBilledUsage,
|
|
413
|
+
runtimeGeneration,
|
|
414
|
+
bindLiveControl: (control, ownerToken) => {
|
|
415
|
+
const lease = asyncAgentRegistry.acquireWriterLease(control.childSessionId, control.runtimeGeneration, ownerToken);
|
|
416
|
+
if (!lease)
|
|
417
|
+
return false;
|
|
418
|
+
if (!asyncAgentRegistry.bindLiveControl(agentId, control, lease)) {
|
|
419
|
+
asyncAgentRegistry.releaseWriterLease(lease);
|
|
420
|
+
return false;
|
|
421
|
+
}
|
|
422
|
+
liveLease = lease;
|
|
423
|
+
return lease;
|
|
424
|
+
},
|
|
425
|
+
closeLiveControl: (_control, lease) => {
|
|
426
|
+
if (lease)
|
|
427
|
+
asyncAgentRegistry.closeDirectionIntake(agentId, lease);
|
|
428
|
+
},
|
|
429
|
+
onProgressEvent: progressTracker.onEvent,
|
|
430
|
+
onAgentProgress: progressTracker.onRuntime,
|
|
375
431
|
signal: controller.signal,
|
|
376
432
|
}, parentStream, // uiStream: agent_start/end → main feed
|
|
377
433
|
transcriptSink)
|
|
378
434
|
.then((text) => {
|
|
379
|
-
|
|
435
|
+
if (controller.signal.aborted) {
|
|
436
|
+
if (liveLease)
|
|
437
|
+
asyncAgentRegistry.completeTerminal(agentId, "cancelled", liveLease);
|
|
438
|
+
else
|
|
439
|
+
asyncAgentRegistry.markCancelled(agentId);
|
|
440
|
+
void ctx?.hooks?.emit("notification", {
|
|
441
|
+
kind: "agent_cancelled",
|
|
442
|
+
agentId,
|
|
443
|
+
name,
|
|
444
|
+
description,
|
|
445
|
+
});
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
const transitioned = liveLease
|
|
449
|
+
? asyncAgentRegistry.completeTerminal(agentId, "completed", liveLease)
|
|
450
|
+
: (asyncAgentRegistry.markCompleted(agentId), true);
|
|
451
|
+
if (!transitioned)
|
|
452
|
+
return;
|
|
380
453
|
// External-readable copy of the result (tail / cross-session history).
|
|
381
454
|
// Best-effort; never blocks the completion path.
|
|
382
455
|
void writeAgentOutputFile(agentId, {
|
|
@@ -439,7 +512,10 @@ export async function agentTool(args, ctx) {
|
|
|
439
512
|
// User-initiated cancel: mark status but do NOT enqueue —
|
|
440
513
|
// the main agent doesn't need a follow-up turn. Dock still
|
|
441
514
|
// shows the "cancelled" badge for the fade window.
|
|
442
|
-
|
|
515
|
+
if (liveLease)
|
|
516
|
+
asyncAgentRegistry.completeTerminal(agentId, "cancelled", liveLease);
|
|
517
|
+
else
|
|
518
|
+
asyncAgentRegistry.markCancelled(agentId);
|
|
443
519
|
void ctx?.hooks?.emit("notification", {
|
|
444
520
|
kind: "agent_cancelled",
|
|
445
521
|
agentId,
|
|
@@ -448,7 +524,11 @@ export async function agentTool(args, ctx) {
|
|
|
448
524
|
});
|
|
449
525
|
return;
|
|
450
526
|
}
|
|
451
|
-
|
|
527
|
+
const transitioned = liveLease
|
|
528
|
+
? asyncAgentRegistry.completeTerminal(agentId, "failed", liveLease)
|
|
529
|
+
: (asyncAgentRegistry.markFailed(agentId), true);
|
|
530
|
+
if (!transitioned)
|
|
531
|
+
return;
|
|
452
532
|
void writeAgentOutputFile(agentId, {
|
|
453
533
|
status: "failed",
|
|
454
534
|
body: err.message,
|
|
@@ -532,6 +612,7 @@ function recordCompletedSyncAgent(opts) {
|
|
|
532
612
|
sessionId: opts.parentSessionId,
|
|
533
613
|
// agent_id === childSid: the resumable session lives at sessions/<agentId>/.
|
|
534
614
|
childSessionId: opts.agentId,
|
|
615
|
+
runtimeGeneration: opts.runtimeGeneration,
|
|
535
616
|
status: "completed",
|
|
536
617
|
startedAt: now,
|
|
537
618
|
finishedAt: now,
|
|
@@ -563,6 +644,10 @@ async function runSyncSubAgent(args) {
|
|
|
563
644
|
// the background, so the finally block leaves the parent-abort listener with
|
|
564
645
|
// the background handlers instead of removing it.
|
|
565
646
|
let handedOff = false;
|
|
647
|
+
const childSessionId = resumeSessionId ?? agentId;
|
|
648
|
+
const runtimeGeneration = asyncAgentRegistry.allocateRuntimeGeneration(childSessionId);
|
|
649
|
+
const progressTracker = createAgentProgressTracker(agentId);
|
|
650
|
+
let liveBinding;
|
|
566
651
|
// Run the agent, but don't necessarily await it to completion: race the run
|
|
567
652
|
// against the auto-background timer. The run promise is shared between the
|
|
568
653
|
// inline await and (if we hand off) the background completion handlers, so
|
|
@@ -577,10 +662,30 @@ async function runSyncSubAgent(args) {
|
|
|
577
662
|
model: overrides.model,
|
|
578
663
|
toolAllowlist: overrides.toolAllowlist,
|
|
579
664
|
skillAllowlist: overrides.skillAllowlist,
|
|
665
|
+
sandboxMode: overrides.sandboxMode,
|
|
666
|
+
mcpAllowlist: overrides.mcpAllowlist,
|
|
580
667
|
appendSystemPrompt: overrides.appendSystemPrompt,
|
|
581
668
|
readOnlySession: overrides.resolvedType === "researcher" || overrides.resolvedType === "explorer",
|
|
582
669
|
resumeSessionId,
|
|
583
670
|
hooks: ctx?.hooks,
|
|
671
|
+
recordBilledUsage: ctx?.recordBilledUsage,
|
|
672
|
+
runtimeGeneration,
|
|
673
|
+
bindLiveControl: (control, ownerToken) => {
|
|
674
|
+
const lease = asyncAgentRegistry.acquireWriterLease(control.childSessionId, control.runtimeGeneration, ownerToken);
|
|
675
|
+
if (!lease)
|
|
676
|
+
return false;
|
|
677
|
+
liveBinding = { control, lease };
|
|
678
|
+
return lease;
|
|
679
|
+
},
|
|
680
|
+
closeLiveControl: (_control, lease) => {
|
|
681
|
+
if (!lease)
|
|
682
|
+
return;
|
|
683
|
+
if (handedOff)
|
|
684
|
+
return asyncAgentRegistry.closeDirectionIntake(agentId, lease);
|
|
685
|
+
return asyncAgentRegistry.releaseWriterLease(lease);
|
|
686
|
+
},
|
|
687
|
+
onProgressEvent: progressTracker.onEvent,
|
|
688
|
+
onAgentProgress: progressTracker.onRuntime,
|
|
584
689
|
signal: syncController.signal,
|
|
585
690
|
});
|
|
586
691
|
// Sentinel that the timer resolves with, so we can tell "agent finished" from
|
|
@@ -595,7 +700,12 @@ async function runSyncSubAgent(args) {
|
|
|
595
700
|
try {
|
|
596
701
|
// If there's no timer (threshold 0/∞ disabled), just await as before.
|
|
597
702
|
const winner = timerPromise
|
|
598
|
-
? await Promise.race([
|
|
703
|
+
? await Promise.race([
|
|
704
|
+
runPromise
|
|
705
|
+
.then((t) => ({ ok: true, text: t }))
|
|
706
|
+
.catch((e) => ({ ok: false, err: e })),
|
|
707
|
+
timerPromise,
|
|
708
|
+
])
|
|
599
709
|
: { ok: true, text: await runPromise };
|
|
600
710
|
if (winner === BG_HANDOFF) {
|
|
601
711
|
// Threshold elapsed while the agent is STILL running. Detach it into the
|
|
@@ -612,6 +722,10 @@ async function runSyncSubAgent(args) {
|
|
|
612
722
|
hooks: ctx?.hooks,
|
|
613
723
|
parentSignal,
|
|
614
724
|
onParentAbort,
|
|
725
|
+
childSessionId,
|
|
726
|
+
runtimeGeneration,
|
|
727
|
+
liveBinding,
|
|
728
|
+
progress: progressTracker.current(),
|
|
615
729
|
// The agent_start fired in runSubAgent put the UI card into 'working'.
|
|
616
730
|
// runSubAgent's own agent_end (line ~299) only fires if spawn() RESOLVES;
|
|
617
731
|
// on failure/cancel it throws before that, so the card would hang
|
|
@@ -640,14 +754,26 @@ async function runSyncSubAgent(args) {
|
|
|
640
754
|
agentType: overrides.resolvedType,
|
|
641
755
|
description,
|
|
642
756
|
parentSessionId: ctx?.sessionId,
|
|
757
|
+
runtimeGeneration,
|
|
643
758
|
});
|
|
644
759
|
return winner.text;
|
|
645
760
|
}
|
|
646
761
|
throw winner.err;
|
|
647
762
|
}
|
|
648
763
|
catch (err) {
|
|
649
|
-
emitSubAgentHook(ctx?.hooks, "subagent_error", {
|
|
650
|
-
|
|
764
|
+
emitSubAgentHook(ctx?.hooks, "subagent_error", {
|
|
765
|
+
agentId,
|
|
766
|
+
description,
|
|
767
|
+
error: err.message,
|
|
768
|
+
});
|
|
769
|
+
safeEmit(parentStream, {
|
|
770
|
+
type: "agent_end",
|
|
771
|
+
agentId,
|
|
772
|
+
name,
|
|
773
|
+
description,
|
|
774
|
+
error: err.message,
|
|
775
|
+
agentType: overrides.resolvedType,
|
|
776
|
+
});
|
|
651
777
|
if (parentSignal?.aborted)
|
|
652
778
|
return "Agent was aborted.";
|
|
653
779
|
return `Agent error: ${err.message}`;
|
|
@@ -670,7 +796,7 @@ async function runSyncSubAgent(args) {
|
|
|
670
796
|
* a running (then completed/failed) background agent. Never aborts the agent.
|
|
671
797
|
*/
|
|
672
798
|
function handoffToBackground(runPromise, controller, meta) {
|
|
673
|
-
const { agentId, name, description, agentType, sessionId, hooks, uiStream } = meta;
|
|
799
|
+
const { agentId, name, description, agentType, sessionId, hooks, uiStream, childSessionId, runtimeGeneration, liveBinding, progress, } = meta;
|
|
674
800
|
// The agent outlives the spawning turn now, so parent-turn abort must NOT
|
|
675
801
|
// cascade to it (same contract as an explicit background agent). Detach the
|
|
676
802
|
// parent listener; cancellation from here on goes through AgentCancel.
|
|
@@ -681,10 +807,21 @@ function handoffToBackground(runPromise, controller, meta) {
|
|
|
681
807
|
agentType,
|
|
682
808
|
description,
|
|
683
809
|
sessionId,
|
|
810
|
+
childSessionId,
|
|
811
|
+
runtimeGeneration,
|
|
812
|
+
progress,
|
|
684
813
|
status: "running",
|
|
685
814
|
startedAt: Date.now(),
|
|
686
815
|
abort: () => controller.abort(),
|
|
687
816
|
});
|
|
817
|
+
if (liveBinding &&
|
|
818
|
+
!asyncAgentRegistry.bindLiveControl(agentId, liveBinding.control, liveBinding.lease)) {
|
|
819
|
+
logger.warn("agent_live_control.handoff_bind_failed", {
|
|
820
|
+
agentId,
|
|
821
|
+
childSessionId,
|
|
822
|
+
runtimeGeneration,
|
|
823
|
+
});
|
|
824
|
+
}
|
|
688
825
|
// Tell the UI this agent is now running in the BACKGROUND (still working,
|
|
689
826
|
// just detached from the parent turn). Without this the card's only signals
|
|
690
827
|
// are agent_start (looks foreground) and the eventual agent_end — so during
|
|
@@ -697,7 +834,21 @@ function handoffToBackground(runPromise, controller, meta) {
|
|
|
697
834
|
ensureAgentHeartbeat();
|
|
698
835
|
runPromise
|
|
699
836
|
.then((text) => {
|
|
700
|
-
|
|
837
|
+
if (controller.signal.aborted) {
|
|
838
|
+
if (liveBinding) {
|
|
839
|
+
asyncAgentRegistry.completeTerminal(agentId, "cancelled", liveBinding.lease);
|
|
840
|
+
}
|
|
841
|
+
else {
|
|
842
|
+
asyncAgentRegistry.markCancelled(agentId);
|
|
843
|
+
}
|
|
844
|
+
void hooks?.emit("notification", { kind: "agent_cancelled", agentId, name, description });
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
const transitioned = liveBinding
|
|
848
|
+
? asyncAgentRegistry.completeTerminal(agentId, "completed", liveBinding.lease)
|
|
849
|
+
: (asyncAgentRegistry.markCompleted(agentId), true);
|
|
850
|
+
if (!transitioned)
|
|
851
|
+
return;
|
|
701
852
|
void writeAgentOutputFile(agentId, {
|
|
702
853
|
status: "completed",
|
|
703
854
|
body: text,
|
|
@@ -706,24 +857,53 @@ function handoffToBackground(runPromise, controller, meta) {
|
|
|
706
857
|
onError: (m, meta) => logger.warn(m, meta),
|
|
707
858
|
});
|
|
708
859
|
if (sessionId) {
|
|
709
|
-
notificationQueue.enqueue({
|
|
860
|
+
notificationQueue.enqueue({
|
|
861
|
+
agentId,
|
|
862
|
+
name,
|
|
863
|
+
description,
|
|
864
|
+
status: "completed",
|
|
865
|
+
finalText: text,
|
|
866
|
+
enqueuedAt: Date.now(),
|
|
867
|
+
}, sessionId);
|
|
710
868
|
}
|
|
711
869
|
else {
|
|
712
870
|
logger.warn("agent_completion_without_session", { agentId, name, status: "completed" });
|
|
713
871
|
}
|
|
714
|
-
void hooks?.emit("notification", {
|
|
872
|
+
void hooks?.emit("notification", {
|
|
873
|
+
kind: "agent_completed",
|
|
874
|
+
agentId,
|
|
875
|
+
name,
|
|
876
|
+
description,
|
|
877
|
+
finalText: text,
|
|
878
|
+
});
|
|
715
879
|
})
|
|
716
880
|
.catch((err) => {
|
|
717
881
|
// runSubAgent threw before its success agent_end, so the UI card is still
|
|
718
882
|
// 'working'. Close it out with a terminal agent_end{error} (mirrors the
|
|
719
883
|
// synchronous catch at the agentTool level).
|
|
720
|
-
safeEmit(uiStream, {
|
|
884
|
+
safeEmit(uiStream, {
|
|
885
|
+
type: "agent_end",
|
|
886
|
+
agentId,
|
|
887
|
+
name,
|
|
888
|
+
description,
|
|
889
|
+
error: err.message,
|
|
890
|
+
agentType,
|
|
891
|
+
});
|
|
721
892
|
if (controller.signal.aborted) {
|
|
722
|
-
|
|
893
|
+
if (liveBinding) {
|
|
894
|
+
asyncAgentRegistry.completeTerminal(agentId, "cancelled", liveBinding.lease);
|
|
895
|
+
}
|
|
896
|
+
else {
|
|
897
|
+
asyncAgentRegistry.markCancelled(agentId);
|
|
898
|
+
}
|
|
723
899
|
void hooks?.emit("notification", { kind: "agent_cancelled", agentId, name, description });
|
|
724
900
|
return;
|
|
725
901
|
}
|
|
726
|
-
|
|
902
|
+
const transitioned = liveBinding
|
|
903
|
+
? asyncAgentRegistry.completeTerminal(agentId, "failed", liveBinding.lease)
|
|
904
|
+
: (asyncAgentRegistry.markFailed(agentId), true);
|
|
905
|
+
if (!transitioned)
|
|
906
|
+
return;
|
|
727
907
|
void writeAgentOutputFile(agentId, {
|
|
728
908
|
status: "failed",
|
|
729
909
|
body: err.message,
|
|
@@ -732,12 +912,25 @@ function handoffToBackground(runPromise, controller, meta) {
|
|
|
732
912
|
onError: (m, meta) => logger.warn(m, meta),
|
|
733
913
|
});
|
|
734
914
|
if (sessionId) {
|
|
735
|
-
notificationQueue.enqueue({
|
|
915
|
+
notificationQueue.enqueue({
|
|
916
|
+
agentId,
|
|
917
|
+
name,
|
|
918
|
+
description,
|
|
919
|
+
status: "failed",
|
|
920
|
+
error: err.message,
|
|
921
|
+
enqueuedAt: Date.now(),
|
|
922
|
+
}, sessionId);
|
|
736
923
|
}
|
|
737
924
|
else {
|
|
738
925
|
logger.warn("agent_completion_without_session", { agentId, name, status: "failed" });
|
|
739
926
|
}
|
|
740
|
-
void hooks?.emit("notification", {
|
|
927
|
+
void hooks?.emit("notification", {
|
|
928
|
+
kind: "agent_failed",
|
|
929
|
+
agentId,
|
|
930
|
+
name,
|
|
931
|
+
description,
|
|
932
|
+
error: err.message,
|
|
933
|
+
});
|
|
741
934
|
});
|
|
742
935
|
}
|
|
743
936
|
// ─── AgentStatus / AgentCancel — companions to run_in_background ─
|
|
@@ -780,13 +973,17 @@ export async function agentStatusTool(args, ctx) {
|
|
|
780
973
|
return list
|
|
781
974
|
.map((e) => {
|
|
782
975
|
const dur = ((e.finishedAt ?? Date.now()) - e.startedAt) / 1000;
|
|
783
|
-
|
|
976
|
+
const progress = e.status === "running" && e.progress ? ` — ${e.progress.summary}` : "";
|
|
977
|
+
return `${e.agentId} [${e.status}] ${e.description}${progress} (${dur.toFixed(1)}s)`;
|
|
784
978
|
})
|
|
785
979
|
.join("\n");
|
|
786
980
|
}
|
|
787
981
|
const e = asyncAgentRegistry.get(agentId);
|
|
788
982
|
if (!e)
|
|
789
983
|
return `Error: agent_id "${agentId}" not found.`;
|
|
984
|
+
if (ctx?.sessionId && e.sessionId !== ctx.sessionId) {
|
|
985
|
+
return `Error: agent_id "${agentId}" is not in this session.`;
|
|
986
|
+
}
|
|
790
987
|
const dur = ((e.finishedAt ?? Date.now()) - e.startedAt) / 1000;
|
|
791
988
|
const lines = [
|
|
792
989
|
`agent_id: ${e.agentId}`,
|
|
@@ -804,6 +1001,9 @@ export async function agentStatusTool(args, ctx) {
|
|
|
804
1001
|
lines.push("", "(cancelled — no result delivered)");
|
|
805
1002
|
}
|
|
806
1003
|
else if (e.status === "running") {
|
|
1004
|
+
if (e.progress) {
|
|
1005
|
+
lines.push(`phase: ${e.progress.phase}`, `progress: ${e.progress.summary}`, `tokens: ${e.progress.tokens.total}`, `observed: ${e.progress.observedAt}`);
|
|
1006
|
+
}
|
|
807
1007
|
lines.push("", "(still running — call AgentStatus again later)");
|
|
808
1008
|
}
|
|
809
1009
|
return lines.join("\n");
|
|
@@ -834,9 +1034,7 @@ export async function agentCancelTool(args) {
|
|
|
834
1034
|
return `Agent ${agentId} is already ${e.status}; nothing to cancel.`;
|
|
835
1035
|
}
|
|
836
1036
|
const ok = asyncAgentRegistry.cancel(agentId);
|
|
837
|
-
return ok
|
|
838
|
-
? `Agent ${agentId} cancelled.`
|
|
839
|
-
: `Failed to cancel agent ${agentId}.`;
|
|
1037
|
+
return ok ? `Agent ${agentId} cancelled.` : `Failed to cancel agent ${agentId}.`;
|
|
840
1038
|
}
|
|
841
1039
|
// ─── AgentSendInput — continue a previously-spawned sub-agent ────
|
|
842
1040
|
export const agentSendInputToolDef = {
|
|
@@ -866,24 +1064,47 @@ export const agentSendInputToolDef = {
|
|
|
866
1064
|
description: "The follow-up instruction. The agent already remembers its earlier work — " +
|
|
867
1065
|
"send only what's new (feedback, the next step, a question).",
|
|
868
1066
|
},
|
|
1067
|
+
delivery: {
|
|
1068
|
+
type: "string",
|
|
1069
|
+
enum: ["next-safe-point", "interrupt-and-redrive"],
|
|
1070
|
+
description: "For a running child: queue at the next complete model/tool boundary (default), " +
|
|
1071
|
+
"or cooperatively interrupt the active batch and serially redrive the same runtime.",
|
|
1072
|
+
},
|
|
869
1073
|
},
|
|
1074
|
+
additionalProperties: false,
|
|
870
1075
|
required: ["agent_id", "prompt"],
|
|
871
1076
|
},
|
|
872
1077
|
};
|
|
873
1078
|
export async function agentSendInputTool(args, ctx) {
|
|
1079
|
+
const allowedKeys = new Set(["agent_id", "prompt", "delivery", "__signal"]);
|
|
1080
|
+
if (Object.keys(args).some((key) => !allowedKeys.has(key))) {
|
|
1081
|
+
return "Error: invalid-request: AgentSendInput accepts only agent_id, prompt, and delivery.";
|
|
1082
|
+
}
|
|
874
1083
|
const agentId = args.agent_id?.trim();
|
|
875
1084
|
const prompt = args.prompt;
|
|
1085
|
+
const rawDelivery = args.delivery;
|
|
876
1086
|
if (!agentId)
|
|
877
1087
|
return "Error: agent_id is required.";
|
|
878
1088
|
if (!prompt)
|
|
879
1089
|
return "Error: prompt is required.";
|
|
1090
|
+
if (rawDelivery !== undefined &&
|
|
1091
|
+
rawDelivery !== "next-safe-point" &&
|
|
1092
|
+
rawDelivery !== "interrupt-and-redrive") {
|
|
1093
|
+
return "Error: invalid delivery. Expected next-safe-point or interrupt-and-redrive.";
|
|
1094
|
+
}
|
|
1095
|
+
const delivery = rawDelivery ?? "next-safe-point";
|
|
880
1096
|
if (!ctx?.subAgentSpawner) {
|
|
881
1097
|
return "Error: Agent tool is not configured (no subAgentSpawner in ctx).";
|
|
882
1098
|
}
|
|
883
1099
|
// Same flat-hierarchy rule as Agent: a sub-agent cannot continue (or spawn)
|
|
884
1100
|
// another sub-agent. Layered with the NESTED_AGENT_TOOLS strip in engine.ts.
|
|
885
1101
|
if (ctx.isSubAgent === true) {
|
|
886
|
-
return
|
|
1102
|
+
return JSON.stringify({
|
|
1103
|
+
status: "rejected",
|
|
1104
|
+
reason: "not-direct-parent",
|
|
1105
|
+
rejectedAt: Date.now(),
|
|
1106
|
+
message: "Nested agents are not supported. Sub-agents cannot send input to other sub-agents.",
|
|
1107
|
+
});
|
|
887
1108
|
}
|
|
888
1109
|
const spawner = ctx.subAgentSpawner;
|
|
889
1110
|
const parentSignal = args.__signal;
|
|
@@ -906,17 +1127,41 @@ export async function agentSendInputTool(args, ctx) {
|
|
|
906
1127
|
`It may never have run or its session was cleaned up. ` +
|
|
907
1128
|
`Re-spawn with Agent(...) and a complete task description.`);
|
|
908
1129
|
}
|
|
909
|
-
//
|
|
910
|
-
//
|
|
911
|
-
//
|
|
912
|
-
// to the SAME transcript concurrently — sub-agents have no per-session
|
|
913
|
-
// `active` lock (the protocol layer's serialization only covers top-level
|
|
914
|
-
// sessions), so the two writers interleave and can corrupt the transcript.
|
|
915
|
-
// Refuse until it finishes (or is cancelled).
|
|
1130
|
+
// A running target owns its transcript writer lease. This branch is route-only:
|
|
1131
|
+
// registry validation + the bound live runtime enqueue the direction envelope;
|
|
1132
|
+
// it must never construct/resume a second child Engine.
|
|
916
1133
|
if (entry?.status === "running") {
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
1134
|
+
const ack = await asyncAgentRegistry.routeDirection({
|
|
1135
|
+
callerSessionId: ctx.sessionId ?? "",
|
|
1136
|
+
callerIsSubAgent: false,
|
|
1137
|
+
agentId,
|
|
1138
|
+
prompt,
|
|
1139
|
+
delivery,
|
|
1140
|
+
});
|
|
1141
|
+
return JSON.stringify(ack);
|
|
1142
|
+
}
|
|
1143
|
+
if (entry?.status === "cancelling" || asyncAgentRegistry.getWriterLease(resumeSessionId)) {
|
|
1144
|
+
return `Error: sub-agent "${agentId}" is still cancelling; wait for its previous runtime to fully exit.`;
|
|
1145
|
+
}
|
|
1146
|
+
const callerSessionId = ctx.sessionId ?? "";
|
|
1147
|
+
if (entry) {
|
|
1148
|
+
if (!callerSessionId || entry.sessionId !== callerSessionId) {
|
|
1149
|
+
return `Error: caller is not the direct parent of sub-agent "${agentId}" (not in this session).`;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
else {
|
|
1153
|
+
const persistedParent = spawner.getSessionParentId?.(resumeSessionId);
|
|
1154
|
+
if (!callerSessionId || persistedParent === undefined || persistedParent === null) {
|
|
1155
|
+
return `Error: cannot verify the direct parent of sub-agent "${agentId}"; continuation is denied.`;
|
|
1156
|
+
}
|
|
1157
|
+
if (persistedParent !== callerSessionId) {
|
|
1158
|
+
return `Error: caller is not the direct parent of sub-agent "${agentId}" (not in this session).`;
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
if (delivery === "interrupt-and-redrive") {
|
|
1162
|
+
return (`Error: sub-agent "${agentId}" is no longer running; ` +
|
|
1163
|
+
`interrupt-and-redrive cannot interrupt a terminal target. ` +
|
|
1164
|
+
`Omit delivery to use the existing transcript continuation path.`);
|
|
920
1165
|
}
|
|
921
1166
|
const name = entry?.name;
|
|
922
1167
|
const description = entry?.description ?? "sub-agent continuation";
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
type Listener = () => void;
|
|
24
24
|
export type BackgroundJobStatus = "running" | "cancelling" | "completed" | "failed" | "cancelled";
|
|
25
25
|
export type BackgroundJobKind = "drive-agent" | "video" | "job";
|
|
26
|
+
export type ExternalCliKind = "claude" | "codex";
|
|
26
27
|
/** A background job, running or finished. */
|
|
27
28
|
export interface BackgroundJobEntry {
|
|
28
29
|
jobId: string;
|
|
@@ -43,16 +44,45 @@ export interface BackgroundJobEntry {
|
|
|
43
44
|
ccSessionId?: string;
|
|
44
45
|
/** Files the external agent changed (parsed from its transcript, #6). */
|
|
45
46
|
changedFiles?: string[];
|
|
46
|
-
/**
|
|
47
|
+
/** Directory in which the external job was launched. This is an audit/listing
|
|
48
|
+
* snapshot, not necessarily the workspace the job ultimately writes. */
|
|
49
|
+
launchCwd?: string;
|
|
50
|
+
/** @deprecated Back-compatible serialized alias of launchCwd. */
|
|
47
51
|
cwd?: string;
|
|
52
|
+
/** Normalized snapshot of the declared effective workspace cwd. Preserved
|
|
53
|
+
* separately from its resolved root for mixed git-resolution fallback. */
|
|
54
|
+
effectiveWorkspaceCwd?: string;
|
|
55
|
+
/** Canonical source workspace before per-run isolation. Unlike
|
|
56
|
+
* effectiveWorkspaceRoot, this remains the main checkout for linked
|
|
57
|
+
* worktrees so later writers targeting that checkout can auto-isolate too. */
|
|
58
|
+
workspaceRoot?: string;
|
|
59
|
+
/** Canonical conflict identity: git worktree root when resolvable, otherwise
|
|
60
|
+
* the normalized effective workspace cwd. */
|
|
61
|
+
effectiveWorkspaceRoot?: string;
|
|
62
|
+
/** Git common dir identifies the main repository shared by linked worktrees.
|
|
63
|
+
* Conflict checks deliberately compare worktree roots, so separate
|
|
64
|
+
* worktrees of the same repository remain isolated. */
|
|
65
|
+
gitCommonDir?: string;
|
|
66
|
+
/** Whether effectiveWorkspaceRoot came from git or the cwd fallback. */
|
|
67
|
+
effectiveWorkspaceKind?: "git-worktree" | "cwd";
|
|
48
68
|
/** DriveAgent prompt summary, separate from the UI-oriented description. */
|
|
49
69
|
promptSummary?: string;
|
|
50
70
|
/** External CLI kind for DriveAgent jobs. */
|
|
51
|
-
cli?:
|
|
71
|
+
cli?: ExternalCliKind;
|
|
72
|
+
/** DriveAgent workspace lifecycle metadata. */
|
|
73
|
+
isolation?: "current" | "worktree" | "none";
|
|
74
|
+
worktreePath?: string;
|
|
75
|
+
worktreeBranch?: string;
|
|
76
|
+
worktreeBaseRef?: string;
|
|
77
|
+
worktreeCleanup?: "auto" | "keep" | "detach" | "discard";
|
|
78
|
+
worktreeBranchPrefix?: string;
|
|
79
|
+
worktreeLifecycle?: "running" | "kept" | "detached" | "discarded" | "cleanup-failed";
|
|
52
80
|
/** Client message that launched this external job. */
|
|
53
81
|
originClientMessageId?: string;
|
|
54
|
-
/** Optional cancellation hook for jobs backed by a live process.
|
|
55
|
-
|
|
82
|
+
/** Optional cancellation hook for jobs backed by a live process. It may
|
|
83
|
+
* return a richer terminal outcome when cancellation races with a result
|
|
84
|
+
* that must still be retained (for example, a remotely rendered video). */
|
|
85
|
+
abort?: () => void | BackgroundJobOutcome | Promise<void | BackgroundJobOutcome>;
|
|
56
86
|
}
|
|
57
87
|
/** Outcome passed to finish() to record how a job ended. */
|
|
58
88
|
export interface BackgroundJobOutcome {
|
|
@@ -60,14 +90,29 @@ export interface BackgroundJobOutcome {
|
|
|
60
90
|
finalText?: string;
|
|
61
91
|
ccSessionId?: string;
|
|
62
92
|
changedFiles?: string[];
|
|
93
|
+
worktreeLifecycle?: "running" | "kept" | "detached" | "discarded" | "cleanup-failed";
|
|
63
94
|
}
|
|
64
95
|
export interface BackgroundJobStartOptions {
|
|
65
96
|
kind?: BackgroundJobKind;
|
|
97
|
+
/** Preferred name for the external process's launch directory. */
|
|
98
|
+
launchCwd?: string;
|
|
99
|
+
/** @deprecated Back-compatible alias for launchCwd. */
|
|
66
100
|
cwd?: string;
|
|
101
|
+
/** Optional host-declared workspace the job is expected to write. Defaults
|
|
102
|
+
* to launchCwd. This avoids guessing later shell `cd` commands. */
|
|
103
|
+
effectiveWorkspaceCwd?: string;
|
|
104
|
+
/** Source workspace before a job-specific worktree was created. */
|
|
105
|
+
workspaceRoot?: string;
|
|
67
106
|
promptSummary?: string;
|
|
68
|
-
cli?:
|
|
107
|
+
cli?: ExternalCliKind;
|
|
108
|
+
isolation?: "current" | "worktree" | "none";
|
|
109
|
+
worktreePath?: string;
|
|
110
|
+
worktreeBranch?: string;
|
|
111
|
+
worktreeBaseRef?: string;
|
|
112
|
+
worktreeCleanup?: "auto" | "keep" | "detach" | "discard";
|
|
113
|
+
worktreeBranchPrefix?: string;
|
|
69
114
|
originClientMessageId?: string;
|
|
70
|
-
abort?: () => void | Promise<void>;
|
|
115
|
+
abort?: () => void | BackgroundJobOutcome | Promise<void | BackgroundJobOutcome>;
|
|
71
116
|
}
|
|
72
117
|
declare class BackgroundJobRegistry {
|
|
73
118
|
private jobs;
|
|
@@ -80,13 +125,24 @@ declare class BackgroundJobRegistry {
|
|
|
80
125
|
get(jobId: string): BackgroundJobEntry | undefined;
|
|
81
126
|
/** Persist artifacts discovered while a running job is winding down. */
|
|
82
127
|
recordArtifacts(jobId: string, artifacts: Pick<BackgroundJobOutcome, "ccSessionId" | "changedFiles">): void;
|
|
128
|
+
/** Update retained DriveAgent lifecycle state after an explicit cleanup. */
|
|
129
|
+
recordWorktreeLifecycle(jobId: string, lifecycle: NonNullable<BackgroundJobEntry["worktreeLifecycle"]>, note?: string): boolean;
|
|
83
130
|
cancel(jobId: string, outcome?: Omit<BackgroundJobOutcome, "status">): Promise<boolean>;
|
|
84
131
|
/** True while any running/cancelling job spawned by `sessionId` remains. */
|
|
85
132
|
hasRunningForSession(sessionId: string): boolean;
|
|
86
133
|
/** Running jobs spawned by `sessionId`. Feeds the goal judge's task list. */
|
|
87
134
|
listRunningForSession(sessionId: string): BackgroundJobEntry[];
|
|
88
|
-
/** Running jobs, across all sessions,
|
|
135
|
+
/** Running jobs, across all sessions, in the same effective workspace.
|
|
136
|
+
*
|
|
137
|
+
* Git paths compare by canonical worktree root, so sibling launch directories
|
|
138
|
+
* collide while distinct linked worktrees do not. A declared
|
|
139
|
+
* effectiveWorkspaceCwd takes precedence over launchCwd. If either side could
|
|
140
|
+
* not be resolved through git, exact launch-cwd matching remains the
|
|
141
|
+
* conservative back-compatible fallback. */
|
|
89
142
|
listRunningByCwd(cwd: string): BackgroundJobEntry[];
|
|
143
|
+
/** Running and retained terminal jobs in the effective workspace containing
|
|
144
|
+
* cwd. Used by DriveAgentJobs' cross-session cwd filter. */
|
|
145
|
+
listByWorkspaceCwd(cwd: string): BackgroundJobEntry[];
|
|
90
146
|
/** All jobs (running + retained terminal) for `sessionId`. Feeds the panel. */
|
|
91
147
|
listForSession(sessionId: string): BackgroundJobEntry[];
|
|
92
148
|
/** All jobs (running + retained terminal) across sessions. Feeds all-scope UI. */
|