@cjhyy/code-shell-core 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -23
- package/dist/agent/agent-definition-registry.d.ts +2 -2
- package/dist/agent/agent-definition-registry.js +47 -10
- package/dist/agent/agent-definition.d.ts +5 -0
- package/dist/agent/agent-definition.js +14 -0
- package/dist/automation/index.d.ts +7 -4
- package/dist/automation/index.js +4 -2
- package/dist/automation/runner.js +3 -1
- package/dist/automation/scheduler.d.ts +57 -1
- package/dist/automation/scheduler.js +123 -23
- package/dist/automation/store.d.ts +6 -2
- package/dist/automation/store.js +7 -3
- package/dist/capabilities/index.d.ts +109 -0
- package/dist/capabilities/index.js +80 -0
- package/dist/capability-control/disabled-lists.d.ts +2 -1
- package/dist/capability-control/disabled-lists.js +3 -5
- package/dist/capability-control/overlay.d.ts +14 -1
- package/dist/capability-control/overlay.js +40 -0
- package/dist/capability-control/service.js +6 -4
- package/dist/cli/agent-server-stdio.d.ts +1 -1
- package/dist/cli/agent-server-stdio.js +66 -6
- package/dist/cli/agent-server-tcp.js +7 -3
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +17 -1
- package/dist/context/manager.js +36 -1
- package/dist/credentials/access.d.ts +3 -1
- package/dist/credentials/access.js +24 -3
- package/dist/credentials/index.d.ts +1 -1
- package/dist/credentials/index.js +1 -1
- package/dist/credentials/oauth.d.ts +4 -1
- package/dist/credentials/oauth.js +14 -0
- package/dist/credentials/store.d.ts +15 -1
- package/dist/credentials/store.js +17 -4
- package/dist/credentials/types.d.ts +24 -0
- package/dist/credentials/use-credential-tool.js +15 -1
- package/dist/engine/auxiliary-pipeline.d.ts +40 -0
- package/dist/engine/auxiliary-pipeline.js +181 -0
- package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
- package/dist/{settings → engine}/disk-defaults.js +5 -2
- package/dist/engine/dynamic-tool-defs.d.ts +4 -0
- package/dist/engine/dynamic-tool-defs.js +4 -0
- package/dist/engine/engine.d.ts +254 -195
- package/dist/engine/engine.js +1812 -2041
- package/dist/engine/file-history-hook.d.ts +11 -0
- package/dist/engine/file-history-hook.js +31 -0
- package/dist/engine/goal-judge-context.d.ts +9 -0
- package/dist/engine/goal-judge-context.js +234 -0
- package/dist/engine/injected-context-cache.d.ts +6 -0
- package/dist/engine/injected-context-cache.js +13 -0
- package/dist/engine/input-attachments.d.ts +1 -1
- package/dist/engine/model-facade.d.ts +3 -3
- package/dist/engine/model-facade.js +15 -14
- package/dist/engine/permission-controller.d.ts +55 -0
- package/dist/engine/permission-controller.js +148 -0
- package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
- package/dist/engine/prompt-cache-diagnostics.js +178 -0
- package/dist/engine/run-accounting.d.ts +41 -0
- package/dist/engine/run-accounting.js +126 -0
- package/dist/engine/run-context.d.ts +44 -0
- package/dist/engine/run-context.js +88 -0
- package/dist/engine/run-environment.d.ts +30 -0
- package/dist/engine/run-environment.js +77 -0
- package/dist/engine/run-finalize.d.ts +58 -0
- package/dist/engine/run-finalize.js +245 -0
- package/dist/engine/run-goal.d.ts +58 -0
- package/dist/engine/run-goal.js +188 -0
- package/dist/engine/run-image-input.d.ts +1 -1
- package/dist/engine/run-image-input.js +5 -3
- package/dist/engine/run-session-open.d.ts +41 -0
- package/dist/engine/run-session-open.js +186 -0
- package/dist/engine/run-setup.d.ts +42 -0
- package/dist/engine/run-setup.js +58 -0
- package/dist/engine/run-tooling.d.ts +125 -0
- package/dist/engine/run-tooling.js +283 -0
- package/dist/engine/run-types.d.ts +139 -0
- package/dist/engine/run-types.js +12 -0
- package/dist/engine/run-workspace.d.ts +50 -0
- package/dist/engine/run-workspace.js +114 -0
- package/dist/engine/steer-queue.d.ts +1 -1
- package/dist/engine/subagent-spawner.d.ts +32 -0
- package/dist/engine/subagent-spawner.js +287 -0
- package/dist/engine/tool-summary.d.ts +2 -2
- package/dist/engine/tool-summary.js +2 -2
- package/dist/engine/turn-loop.d.ts +49 -10
- package/dist/engine/turn-loop.js +370 -104
- package/dist/engine/types.d.ts +30 -3
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +24 -10
- package/dist/hooks/goal-stop-hook.d.ts +17 -28
- package/dist/hooks/goal-stop-hook.js +110 -465
- package/dist/hooks/registry.js +1 -1
- package/dist/index.d.ts +48 -108
- package/dist/index.extension.d.ts +51 -0
- package/dist/index.extension.js +39 -0
- package/dist/index.internal.d.ts +86 -0
- package/dist/index.internal.js +92 -0
- package/dist/index.js +34 -123
- package/dist/links/cli.d.ts +48 -0
- package/dist/links/cli.js +617 -0
- package/dist/links/http.d.ts +40 -0
- package/dist/links/http.js +166 -0
- package/dist/links/index.d.ts +4 -0
- package/dist/links/index.js +3 -0
- package/dist/links/link-action-tool.d.ts +5 -0
- package/dist/links/link-action-tool.js +241 -0
- package/dist/links/providers.d.ts +8 -0
- package/dist/links/providers.js +665 -0
- package/dist/links/types.d.ts +44 -0
- package/dist/llm/client-base.d.ts +7 -0
- package/dist/llm/client-base.js +60 -0
- package/dist/llm/model-pool.d.ts +1 -1
- package/dist/llm/model-pool.js +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -0
- package/dist/llm/providers/anthropic.js +9 -0
- package/dist/llm/providers/openai.d.ts +1 -0
- package/dist/llm/providers/openai.js +17 -0
- package/dist/model-catalog/index.js +15 -2
- package/dist/model-catalog/resolve.d.ts +13 -1
- package/dist/model-catalog/resolve.js +37 -2
- package/dist/model-catalog/types.d.ts +74 -48
- package/dist/model-catalog/types.js +16 -5
- package/dist/model-catalog/upsert.d.ts +3 -1
- package/dist/model-catalog/upsert.js +9 -0
- package/dist/onboarding.d.ts +0 -1
- package/dist/onboarding.js +1 -22
- package/dist/panel-apps/bindings.d.ts +24 -0
- package/dist/panel-apps/bindings.js +69 -0
- package/dist/panel-apps/github-archive.d.ts +21 -0
- package/dist/panel-apps/github-archive.js +98 -0
- package/dist/panel-apps/index.d.ts +4 -0
- package/dist/panel-apps/index.js +4 -0
- package/dist/panel-apps/installer.d.ts +68 -0
- package/dist/panel-apps/installer.js +622 -0
- package/dist/panel-apps/manifest.d.ts +364 -0
- package/dist/panel-apps/manifest.js +189 -0
- package/dist/panel-apps/paths.d.ts +13 -0
- package/dist/panel-apps/paths.js +38 -0
- package/dist/panel-apps/registry.d.ts +51 -0
- package/dist/panel-apps/registry.js +99 -0
- package/dist/panel-apps/runtime.d.ts +80 -0
- package/dist/panel-apps/runtime.js +154 -0
- package/dist/plugins/gitOps.js +8 -1
- package/dist/plugins/installedPlugins.d.ts +2 -1
- package/dist/plugins/installedPlugins.js +146 -8
- package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
- package/dist/plugins/installer/codex/convertAgents.js +62 -8
- package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
- package/dist/plugins/installer/codex/convertCommands.js +35 -12
- package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
- package/dist/plugins/installer/codex/convertHooks.js +82 -0
- package/dist/plugins/installer/codex/convertSkills.js +41 -6
- package/dist/plugins/installer/install.d.ts +7 -1
- package/dist/plugins/installer/install.js +21 -87
- package/dist/plugins/installer/installFromArchive.d.ts +26 -4
- package/dist/plugins/installer/installFromArchive.js +44 -27
- package/dist/plugins/installer/installFromNpm.d.ts +31 -0
- package/dist/plugins/installer/installFromNpm.js +273 -0
- package/dist/plugins/installer/loadPluginAgents.js +17 -4
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +245 -35
- package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
- package/dist/plugins/installer/normalizeManifest.js +306 -0
- package/dist/plugins/installer/npmTar.d.ts +13 -0
- package/dist/plugins/installer/npmTar.js +321 -0
- package/dist/plugins/installer/parseSource.d.ts +11 -0
- package/dist/plugins/installer/parseSource.js +48 -0
- package/dist/plugins/installer/preview.d.ts +101 -0
- package/dist/plugins/installer/preview.js +336 -0
- package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
- package/dist/plugins/installer/projectPluginSource.js +140 -0
- package/dist/plugins/installer/types.d.ts +775 -0
- package/dist/plugins/installer/types.js +100 -0
- package/dist/plugins/installer/unzip.d.ts +11 -0
- package/dist/plugins/installer/unzip.js +123 -9
- package/dist/plugins/installer/update.d.ts +2 -2
- package/dist/plugins/installer/update.js +43 -4
- package/dist/plugins/loadPluginHooks.d.ts +19 -2
- package/dist/plugins/loadPluginHooks.js +97 -86
- package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
- package/dist/plugins/pluginAutomationTemplates.js +50 -0
- package/dist/plugins/pluginCatalog.d.ts +45 -0
- package/dist/plugins/pluginCatalog.js +87 -0
- package/dist/plugins/pluginCommandHook.d.ts +6 -0
- package/dist/plugins/pluginCommandHook.js +25 -8
- package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
- package/dist/plugins/pluginCommandsLoader.js +181 -7
- package/dist/plugins/pluginContent.d.ts +10 -1
- package/dist/plugins/pluginContent.js +87 -30
- package/dist/plugins/pluginHookApproval.d.ts +30 -0
- package/dist/plugins/pluginHookApproval.js +160 -0
- package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
- package/dist/plugins/pluginHookIntegrity.js +361 -0
- package/dist/plugins/pluginInstaller.js +71 -12
- package/dist/plugins/pluginMcpApproval.d.ts +19 -0
- package/dist/plugins/pluginMcpApproval.js +110 -0
- package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
- package/dist/plugins/pluginMcpIntegrity.js +74 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/varRewrite.d.ts +9 -5
- package/dist/plugins/varRewrite.js +26 -17
- package/dist/preset/index.d.ts +11 -8
- package/dist/preset/index.js +62 -203
- package/dist/product/define.js +9 -3
- package/dist/product/types.d.ts +0 -2
- package/dist/profile/activation.d.ts +36 -0
- package/dist/profile/activation.js +57 -0
- package/dist/profile/catalog-store.d.ts +77 -0
- package/dist/profile/catalog-store.js +346 -0
- package/dist/profile/catalog.d.ts +54 -0
- package/dist/profile/catalog.js +152 -0
- package/dist/profile/index.d.ts +7 -0
- package/dist/profile/index.js +7 -0
- package/dist/profile/requirements.d.ts +76 -0
- package/dist/profile/requirements.js +117 -0
- package/dist/profile/resolve.d.ts +11 -0
- package/dist/profile/resolve.js +41 -0
- package/dist/profile/store.d.ts +17 -0
- package/dist/profile/store.js +167 -0
- package/dist/profile/types.d.ts +321 -0
- package/dist/profile/types.js +104 -0
- package/dist/prompt/composer.d.ts +46 -7
- package/dist/prompt/composer.js +78 -48
- package/dist/prompt/instruction-scanner.d.ts +6 -5
- package/dist/prompt/instruction-scanner.js +8 -23
- package/dist/prompt/section-loader.d.ts +2 -2
- package/dist/prompt/section-loader.js +7 -4
- package/dist/prompt/sections/browser.md +10 -9
- package/dist/prompt/sections/harness-base.md +9 -0
- package/dist/protocol/chat-session-manager.d.ts +64 -1
- package/dist/protocol/chat-session-manager.js +104 -0
- package/dist/protocol/chat-session.d.ts +61 -10
- package/dist/protocol/chat-session.js +135 -25
- package/dist/protocol/client.d.ts +33 -3
- package/dist/protocol/client.js +96 -5
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +2 -2
- package/dist/protocol/mobile-remote-types.d.ts +406 -0
- package/dist/protocol/mobile-remote-types.js +1 -0
- package/dist/protocol/server.d.ts +127 -3
- package/dist/protocol/server.js +1309 -182
- package/dist/protocol/types.d.ts +152 -34
- package/dist/protocol/types.js +16 -0
- package/dist/run/ArtifactTracker.d.ts +6 -1
- package/dist/run/ArtifactTracker.js +29 -21
- package/dist/run/EngineRunner.d.ts +2 -0
- package/dist/run/EngineRunner.js +1 -0
- package/dist/run/RunManager.d.ts +26 -0
- package/dist/run/RunManager.js +82 -11
- package/dist/run/factory.d.ts +3 -0
- package/dist/run/factory.js +2 -0
- package/dist/runtime/safe-spawn.d.ts +6 -0
- package/dist/runtime/safe-spawn.js +8 -13
- package/dist/services/auto-dream.d.ts +13 -1
- package/dist/services/auto-dream.js +56 -8
- package/dist/services/dream-consolidation.js +10 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.js +4 -1
- package/dist/services/session-memory.d.ts +4 -4
- package/dist/services/session-memory.js +13 -10
- package/dist/session/memory.d.ts +26 -7
- package/dist/session/memory.js +79 -21
- package/dist/session/session-manager.d.ts +182 -28
- package/dist/session/session-manager.js +910 -130
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +46 -5
- package/dist/session/transcript.js +159 -3
- package/dist/settings/feature-flags.d.ts +40 -0
- package/dist/settings/feature-flags.js +40 -0
- package/dist/settings/manager.d.ts +39 -1
- package/dist/settings/manager.js +102 -41
- package/dist/settings/migrate-config.js +4 -2
- package/dist/settings/schema.d.ts +511 -177
- package/dist/settings/schema.js +98 -25
- package/dist/skills/scanner.d.ts +6 -2
- package/dist/skills/scanner.js +160 -9
- package/dist/sources/adapter.d.ts +14 -0
- package/dist/sources/adapter.js +7 -0
- package/dist/sources/adapters/local-files.d.ts +10 -0
- package/dist/sources/adapters/local-files.js +127 -0
- package/dist/sources/adapters/mcp-resource.d.ts +17 -0
- package/dist/sources/adapters/mcp-resource.js +41 -0
- package/dist/sources/adapters/mock.d.ts +3 -0
- package/dist/sources/adapters/mock.js +29 -0
- package/dist/sources/binding.d.ts +6 -0
- package/dist/sources/binding.js +24 -0
- package/dist/sources/catalog.d.ts +6 -0
- package/dist/sources/catalog.js +64 -0
- package/dist/sources/context-summary.d.ts +8 -0
- package/dist/sources/context-summary.js +13 -0
- package/dist/sources/credential-status.d.ts +2 -0
- package/dist/sources/credential-status.js +13 -0
- package/dist/sources/index.d.ts +10 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/resolve.d.ts +28 -0
- package/dist/sources/resolve.js +47 -0
- package/dist/sources/truncate-utf8.d.ts +7 -0
- package/dist/sources/truncate-utf8.js +18 -0
- package/dist/sources/types.d.ts +71 -0
- package/dist/sources/types.js +26 -0
- package/dist/testing/fetch-stub.d.ts +32 -0
- package/dist/testing/fetch-stub.js +24 -0
- package/dist/themes/image.d.ts +18 -0
- package/dist/themes/image.js +117 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/installer.d.ts +50 -0
- package/dist/themes/installer.js +290 -0
- package/dist/themes/manifest.d.ts +102 -0
- package/dist/themes/manifest.js +86 -0
- package/dist/themes/paths.d.ts +14 -0
- package/dist/themes/paths.js +33 -0
- package/dist/tool-system/browser-bridge.d.ts +53 -11
- package/dist/tool-system/browser-bridge.js +8 -9
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
- package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
- package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
- package/dist/tool-system/builtin/agent-notifications.js +291 -101
- package/dist/tool-system/builtin/agent-output-file.js +1 -3
- package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
- package/dist/tool-system/builtin/agent-progress.js +83 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
- package/dist/tool-system/builtin/agent-registry.js +178 -9
- package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
- package/dist/tool-system/builtin/agent.d.ts +2 -0
- package/dist/tool-system/builtin/agent.js +274 -33
- package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
- package/dist/tool-system/builtin/background-jobs.js +96 -4
- package/dist/tool-system/builtin/background-work.d.ts +6 -0
- package/dist/tool-system/builtin/background-work.js +8 -1
- package/dist/tool-system/builtin/bash.js +5 -2
- package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
- package/dist/tool-system/builtin/browser-tools.js +89 -23
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
- package/dist/tool-system/builtin/edit.js +2 -6
- package/dist/tool-system/builtin/file-cache.d.ts +2 -0
- package/dist/tool-system/builtin/file-cache.js +4 -0
- package/dist/tool-system/builtin/generate-image.js +17 -10
- package/dist/tool-system/builtin/generate-video.js +26 -7
- package/dist/tool-system/builtin/grep.js +2 -2
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +32 -7
- package/dist/tool-system/builtin/index.js +237 -167
- package/dist/tool-system/builtin/memory.d.ts +6 -0
- package/dist/tool-system/builtin/memory.js +36 -15
- package/dist/tool-system/builtin/panel.d.ts +9 -0
- package/dist/tool-system/builtin/panel.js +314 -0
- package/dist/tool-system/builtin/read.js +5 -1
- package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
- package/dist/tool-system/builtin/send-message-to-session.js +67 -0
- package/dist/tool-system/builtin/sources.d.ts +8 -0
- package/dist/tool-system/builtin/sources.js +137 -0
- package/dist/tool-system/builtin/tool-search.js +7 -2
- package/dist/tool-system/builtin/update-automation-memory.js +2 -0
- package/dist/tool-system/builtin/web-fetch.js +17 -13
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/capability-module.d.ts +93 -0
- package/dist/tool-system/capability-module.js +53 -0
- package/dist/tool-system/context.d.ts +77 -19
- package/dist/tool-system/executor.js +75 -50
- package/dist/tool-system/external-tool-exposure.d.ts +60 -0
- package/dist/tool-system/external-tool-exposure.js +304 -0
- package/dist/tool-system/mcp-manager.d.ts +11 -1
- package/dist/tool-system/mcp-manager.js +19 -4
- package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
- package/dist/tool-system/mcp-tool-policy.js +34 -0
- package/dist/tool-system/panel-bridge.d.ts +53 -0
- package/dist/tool-system/panel-bridge.js +1 -0
- package/dist/tool-system/permission.d.ts +26 -0
- package/dist/tool-system/permission.js +46 -0
- package/dist/tool-system/registry.d.ts +12 -1
- package/dist/tool-system/registry.js +31 -7
- package/dist/tool-system/sandbox/index.js +3 -8
- package/dist/tool-system/sandbox/seatbelt.js +2 -6
- package/dist/tool-system/session-tool-host.d.ts +139 -0
- package/dist/tool-system/session-tool-host.js +167 -0
- package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
- package/dist/tool-system/testing/tool-registry-harness.js +51 -0
- package/dist/tool-system/validation.d.ts +14 -7
- package/dist/tool-system/validation.js +701 -7
- package/dist/types.d.ts +186 -20
- package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
- package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
- package/dist/utils/file-mutex.d.ts +65 -0
- package/dist/utils/file-mutex.js +145 -0
- package/dist/utils/json.d.ts +2 -4
- package/dist/utils/json.js +2 -4
- package/dist/utils/lockfile.d.ts +30 -1
- package/dist/utils/lockfile.js +2 -2
- package/dist/utils/secret-scrubber.d.ts +8 -0
- package/dist/utils/secret-scrubber.js +227 -0
- package/dist/utils/toolDisplay.js +1 -1
- package/package.json +20 -5
- package/THIRD_PARTY_NOTICES.md +0 -206
- package/dist/arena/arena.d.ts +0 -45
- package/dist/arena/arena.js +0 -362
- package/dist/arena/context/context-tools.d.ts +0 -16
- package/dist/arena/context/context-tools.js +0 -272
- package/dist/arena/context/within-root.d.ts +0 -7
- package/dist/arena/context/within-root.js +0 -15
- package/dist/arena/detect-mode.d.ts +0 -20
- package/dist/arena/detect-mode.js +0 -78
- package/dist/arena/digest-builder.d.ts +0 -25
- package/dist/arena/digest-builder.js +0 -120
- package/dist/arena/index.d.ts +0 -29
- package/dist/arena/index.js +0 -29
- package/dist/arena/iterate/convergence.d.ts +0 -25
- package/dist/arena/iterate/convergence.js +0 -103
- package/dist/arena/iterate/formats/index.d.ts +0 -22
- package/dist/arena/iterate/formats/index.js +0 -283
- package/dist/arena/iterate/index.d.ts +0 -11
- package/dist/arena/iterate/index.js +0 -9
- package/dist/arena/iterate/iterative-arena.d.ts +0 -23
- package/dist/arena/iterate/iterative-arena.js +0 -237
- package/dist/arena/iterate/parse.d.ts +0 -42
- package/dist/arena/iterate/parse.js +0 -123
- package/dist/arena/iterate/phases/argue.d.ts +0 -22
- package/dist/arena/iterate/phases/argue.js +0 -165
- package/dist/arena/iterate/phases/revise.d.ts +0 -16
- package/dist/arena/iterate/phases/revise.js +0 -62
- package/dist/arena/iterate/phases/tournament.d.ts +0 -34
- package/dist/arena/iterate/phases/tournament.js +0 -113
- package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
- package/dist/arena/iterate/tools/web-tools.js +0 -54
- package/dist/arena/iterate/types.d.ts +0 -152
- package/dist/arena/iterate/types.js +0 -8
- package/dist/arena/ledger.d.ts +0 -47
- package/dist/arena/ledger.js +0 -159
- package/dist/arena/lenses/architecture.d.ts +0 -5
- package/dist/arena/lenses/architecture.js +0 -22
- package/dist/arena/lenses/engineering.d.ts +0 -5
- package/dist/arena/lenses/engineering.js +0 -22
- package/dist/arena/lenses/general.d.ts +0 -5
- package/dist/arena/lenses/general.js +0 -20
- package/dist/arena/lenses/index.d.ts +0 -16
- package/dist/arena/lenses/index.js +0 -47
- package/dist/arena/lenses/product.d.ts +0 -5
- package/dist/arena/lenses/product.js +0 -22
- package/dist/arena/model-presets.d.ts +0 -23
- package/dist/arena/model-presets.js +0 -44
- package/dist/arena/phases/adjudication.d.ts +0 -25
- package/dist/arena/phases/adjudication.js +0 -142
- package/dist/arena/phases/build-consensus.d.ts +0 -30
- package/dist/arena/phases/build-consensus.js +0 -85
- package/dist/arena/phases/claim-registry.d.ts +0 -26
- package/dist/arena/phases/claim-registry.js +0 -60
- package/dist/arena/phases/cross-review.d.ts +0 -47
- package/dist/arena/phases/cross-review.js +0 -224
- package/dist/arena/phases/debate-rounds.d.ts +0 -28
- package/dist/arena/phases/debate-rounds.js +0 -161
- package/dist/arena/phases/participant-research.d.ts +0 -39
- package/dist/arena/phases/participant-research.js +0 -316
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
- package/dist/arena/phases/planning-detail-expansion.js +0 -120
- package/dist/arena/planner.d.ts +0 -28
- package/dist/arena/planner.js +0 -312
- package/dist/arena/providers/docs.d.ts +0 -7
- package/dist/arena/providers/docs.js +0 -111
- package/dist/arena/providers/git.d.ts +0 -8
- package/dist/arena/providers/git.js +0 -174
- package/dist/arena/providers/index.d.ts +0 -32
- package/dist/arena/providers/index.js +0 -132
- package/dist/arena/providers/none.d.ts +0 -7
- package/dist/arena/providers/none.js +0 -11
- package/dist/arena/providers/repo.d.ts +0 -7
- package/dist/arena/providers/repo.js +0 -258
- package/dist/arena/render/session.d.ts +0 -17
- package/dist/arena/render/session.js +0 -190
- package/dist/arena/render/terminal.d.ts +0 -34
- package/dist/arena/render/terminal.js +0 -286
- package/dist/arena/strategies/discussion.d.ts +0 -25
- package/dist/arena/strategies/discussion.js +0 -143
- package/dist/arena/strategies/index.d.ts +0 -15
- package/dist/arena/strategies/index.js +0 -28
- package/dist/arena/strategies/language-wrapper.d.ts +0 -17
- package/dist/arena/strategies/language-wrapper.js +0 -102
- package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
- package/dist/arena/strategies/lens-wrapper.js +0 -236
- package/dist/arena/strategies/planning.d.ts +0 -30
- package/dist/arena/strategies/planning.js +0 -225
- package/dist/arena/strategies/review.d.ts +0 -26
- package/dist/arena/strategies/review.js +0 -168
- package/dist/arena/strategies/utils.d.ts +0 -36
- package/dist/arena/strategies/utils.js +0 -603
- package/dist/arena/tools/selector.d.ts +0 -17
- package/dist/arena/tools/selector.js +0 -61
- package/dist/arena/transitions.d.ts +0 -53
- package/dist/arena/transitions.js +0 -97
- package/dist/arena/types.d.ts +0 -518
- package/dist/arena/types.js +0 -27
- package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
- package/dist/cc-orchestrator/agent-adapter.js +0 -143
- package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
- package/dist/cc-orchestrator/cc-capability.js +0 -53
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
- package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
- package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
- package/dist/cc-orchestrator/codex-session-history.js +0 -247
- package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
- package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
- package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-changes.js +0 -231
- package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-driver.js +0 -284
- package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
- package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
- package/dist/cc-orchestrator/index.d.ts +0 -8
- package/dist/cc-orchestrator/index.js +0 -8
- package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
- package/dist/cc-orchestrator/relevance-judge.js +0 -29
- package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
- package/dist/cc-orchestrator/session-discovery.js +0 -125
- package/dist/cc-orchestrator/session-history.d.ts +0 -54
- package/dist/cc-orchestrator/session-history.js +0 -150
- package/dist/cron/cron-runtime.d.ts +0 -2
- package/dist/cron/cron-runtime.js +0 -2
- package/dist/cron/cron-store.d.ts +0 -2
- package/dist/cron/cron-store.js +0 -2
- package/dist/cron/scheduler.d.ts +0 -7
- package/dist/cron/scheduler.js +0 -7
- package/dist/engine/goal.js +0 -206
- package/dist/external-agents/config.d.ts +0 -2
- package/dist/external-agents/config.js +0 -15
- package/dist/external-agents/types.d.ts +0 -31
- package/dist/git/parse-log.d.ts +0 -13
- package/dist/git/parse-log.js +0 -21
- package/dist/git/utils.d.ts +0 -49
- package/dist/git/utils.js +0 -161
- package/dist/git/worktree/crud.d.ts +0 -72
- package/dist/git/worktree/crud.js +0 -235
- package/dist/git/worktree/diff.d.ts +0 -14
- package/dist/git/worktree/diff.js +0 -82
- package/dist/git/worktree/git-exec.d.ts +0 -7
- package/dist/git/worktree/git-exec.js +0 -87
- package/dist/git/worktree/index.d.ts +0 -5
- package/dist/git/worktree/index.js +0 -5
- package/dist/git/worktree/query.d.ts +0 -43
- package/dist/git/worktree/query.js +0 -128
- package/dist/git/worktree/slug.d.ts +0 -11
- package/dist/git/worktree/slug.js +0 -58
- package/dist/git/worktree.d.ts +0 -1
- package/dist/git/worktree.js +0 -5
- package/dist/lsp/client.d.ts +0 -41
- package/dist/lsp/client.js +0 -186
- package/dist/lsp/manager.d.ts +0 -40
- package/dist/lsp/manager.js +0 -155
- package/dist/lsp/root-path.d.ts +0 -9
- package/dist/lsp/root-path.js +0 -12
- package/dist/lsp/servers.d.ts +0 -16
- package/dist/lsp/servers.js +0 -60
- package/dist/prompt/sections/coding.md +0 -35
- package/dist/quota/credentials.d.ts +0 -3
- package/dist/quota/credentials.js +0 -80
- package/dist/quota/index.d.ts +0 -36
- package/dist/quota/index.js +0 -155
- package/dist/quota/types.d.ts +0 -48
- package/dist/quota/types.js +0 -13
- package/dist/review/review-prompt.d.ts +0 -28
- package/dist/review/review-prompt.js +0 -81
- package/dist/state.d.ts +0 -160
- package/dist/state.js +0 -267
- package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
- package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
- package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
- package/dist/tool-system/builtin/apply-patch/index.js +0 -105
- package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
- package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
- package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
- package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
- package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
- package/dist/tool-system/builtin/apply-patch/types.js +0 -13
- package/dist/tool-system/builtin/arena.d.ts +0 -31
- package/dist/tool-system/builtin/arena.js +0 -416
- package/dist/tool-system/builtin/brief.d.ts +0 -6
- package/dist/tool-system/builtin/brief.js +0 -41
- package/dist/tool-system/builtin/check-quota.d.ts +0 -15
- package/dist/tool-system/builtin/check-quota.js +0 -34
- package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
- package/dist/tool-system/builtin/drive-claude-code.js +0 -698
- package/dist/tool-system/builtin/lsp.d.ts +0 -7
- package/dist/tool-system/builtin/lsp.js +0 -144
- package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -127
- package/dist/tool-system/builtin/worktree.d.ts +0 -11
- package/dist/tool-system/builtin/worktree.js +0 -363
- /package/dist/{external-agents → links}/types.js +0 -0
- /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
- /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
|
@@ -1,698 +0,0 @@
|
|
|
1
|
-
import { runAgentOnce } from "../../cc-orchestrator/external-agent-driver.js";
|
|
2
|
-
import { claudeAdapter, codexAdapter } from "../../cc-orchestrator/agent-adapter.js";
|
|
3
|
-
import { backgroundJobRegistry } from "./background-jobs.js";
|
|
4
|
-
import { readExternalChangedFiles } from "../../cc-orchestrator/external-agent-changes.js";
|
|
5
|
-
import { isExistingDirectory, normalizeCwdPath } from "../../cc-orchestrator/cwd-normalize.js";
|
|
6
|
-
import { notificationQueue } from "./agent-notifications.js";
|
|
7
|
-
import { existsSync, realpathSync, statSync } from "node:fs";
|
|
8
|
-
import { extname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
9
|
-
import { externalAgentSessionStore, } from "../../cc-orchestrator/external-agent-session-store.js";
|
|
10
|
-
import { logger } from "../../logging/logger.js";
|
|
11
|
-
export const DRIVE_AGENT_FOREGROUND_HANDOFF_MS = 110_000;
|
|
12
|
-
export const DRIVE_AGENT_TOOL_TIMEOUT_MS = 1_800_000;
|
|
13
|
-
const CLI_ADAPTERS = {
|
|
14
|
-
claude: { adapter: claudeAdapter, command: "claude" },
|
|
15
|
-
codex: { adapter: codexAdapter, command: "codex" },
|
|
16
|
-
};
|
|
17
|
-
export const driveAgentToolDef = {
|
|
18
|
-
name: "DriveAgent",
|
|
19
|
-
description: "Delegate a task to an external coding-agent CLI — drives `claude` (Claude Code) or `codex` " +
|
|
20
|
-
"(OpenAI Codex) for one turn. Pick with `cli` (defaults to claude). Use to hand a coding/" +
|
|
21
|
-
"research task to the agent, or continue an existing session of it. " +
|
|
22
|
-
"Runs in the BACKGROUND by default — these tasks are typically long (minutes to hours), so this " +
|
|
23
|
-
"returns immediately and the result is delivered to you later via a completion notification " +
|
|
24
|
-
"that wakes you. Do NOT sleep-poll for it; just continue or end your turn — you'll be woken " +
|
|
25
|
-
"with the result. " +
|
|
26
|
-
"Before launching writable work in a cwd, call DriveAgentJobs(action:'list', cwd) to see any " +
|
|
27
|
-
"already-running DriveAgent jobs there, their prompt summaries, owner sessions, CLI kind, and " +
|
|
28
|
-
"known changed files; use DriveAgentJobs(action:'cancel', jobId) if you must stop one. " +
|
|
29
|
-
"For a quick task where you want the answer inline, pass background:false. " +
|
|
30
|
-
"It has NO time concept of its own: for 'in N minutes' / 'every N' / looping, use CronCreate " +
|
|
31
|
-
"instead (never sleep). A scheduled CronCreate job runs one codeshell turn whose prompt can " +
|
|
32
|
-
"instruct it to call DriveAgent; to continue a prior session across runs, have that turn pass " +
|
|
33
|
-
"the sessionId this tool returned as resumeSessionId (same cli). To make the single turn work " +
|
|
34
|
-
"longer/deeper, write that into `prompt` (e.g. 'keep working until done'). " +
|
|
35
|
-
"Pass `resumeSessionId` to continue a prior session of the SAME cli (keeps context); omit to start fresh.\n" +
|
|
36
|
-
"SCOPE & BUDGET (read before fanning out): each driven agent consumes a large, SHARED token budget. " +
|
|
37
|
-
"Do NOT launch many agents at once to 'cover more ground' — that burns the budget and leaves every " +
|
|
38
|
-
"task half-done. Default to ONE agent at a time; only run a few in parallel when the work TRULY splits " +
|
|
39
|
-
"into independent pieces, and even then keep the count small (≈2-3). Prefer finishing one task before " +
|
|
40
|
-
"starting the next. " +
|
|
41
|
-
"Make each `prompt` a COMPLETE, self-contained task that instructs the agent to finish the whole thing " +
|
|
42
|
-
"end-to-end and verify its own work before returning — never a vague 'start looking into X'. " +
|
|
43
|
-
"Give it a concrete definition of done and, for open-ended work, a bound (files/scope/steps) so it " +
|
|
44
|
-
"doesn't sprawl. If a big job must be split, split it into a SEQUENCE you drive one at a time (resume " +
|
|
45
|
-
"the same session), not a swarm launched simultaneously.",
|
|
46
|
-
inputSchema: {
|
|
47
|
-
type: "object",
|
|
48
|
-
properties: {
|
|
49
|
-
prompt: {
|
|
50
|
-
type: "string",
|
|
51
|
-
description: "The task for the agent. Make it COMPLETE and self-contained: state the goal, a concrete definition of done, and (for open-ended work) an explicit scope bound so it finishes end-to-end and verifies its own work rather than sprawling or stopping half-way.",
|
|
52
|
-
},
|
|
53
|
-
cli: {
|
|
54
|
-
type: "string",
|
|
55
|
-
enum: ["claude", "codex"],
|
|
56
|
-
description: "Which external CLI to drive. 'claude' = Claude Code (default), 'codex' = OpenAI Codex. resumeSessionId is only valid against the same cli that produced it.",
|
|
57
|
-
},
|
|
58
|
-
resumeSessionId: {
|
|
59
|
-
type: "string",
|
|
60
|
-
description: "Existing session id to resume (keeps context). Must come from a prior run of the SAME cli. Omit for a fresh session.",
|
|
61
|
-
},
|
|
62
|
-
model: {
|
|
63
|
-
type: "string",
|
|
64
|
-
description: "Optional model override, passed through to `claude --model` / `codex exec --model`. Omit to use the CLI default; only pass when the user explicitly requests a model.",
|
|
65
|
-
},
|
|
66
|
-
cwd: { type: "string", description: "Working directory the run operates in." },
|
|
67
|
-
attachmentPaths: {
|
|
68
|
-
type: "array",
|
|
69
|
-
items: { type: "string" },
|
|
70
|
-
description: "Optional local file paths to hand to the driven agent. Paths must resolve inside cwd. Images are also passed to Codex with -i when the installed Codex CLI supports it; otherwise all paths are listed in the prompt.",
|
|
71
|
-
},
|
|
72
|
-
permissionMode: {
|
|
73
|
-
type: "string",
|
|
74
|
-
enum: ["default", "acceptEdits", "bypassPermissions"],
|
|
75
|
-
description: "Permission/sandbox level. Defaults to 'bypassPermissions' (full auto — needed so the agent's tools run unattended; there is no interactive approval loop here). For codex: default→read-only sandbox, acceptEdits→workspace-write, bypassPermissions→no sandbox. Pass 'default'/'acceptEdits' to gate.",
|
|
76
|
-
},
|
|
77
|
-
background: {
|
|
78
|
-
type: "boolean",
|
|
79
|
-
description: "Defaults to TRUE: run in the background and notify you on completion (right for long tasks). Pass false to run in the foreground and get the result inline (only for quick tasks).",
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
required: ["prompt", "cwd"],
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
const defaultRunner = (opts) => {
|
|
86
|
-
const { adapter, command } = CLI_ADAPTERS[opts.cli];
|
|
87
|
-
return runAgentOnce(adapter, {
|
|
88
|
-
command,
|
|
89
|
-
prompt: opts.prompt,
|
|
90
|
-
resumeSessionId: opts.resumeSessionId,
|
|
91
|
-
model: opts.model,
|
|
92
|
-
cwd: opts.cwd,
|
|
93
|
-
permissionMode: opts.permissionMode ?? "default",
|
|
94
|
-
imagePaths: opts.imagePaths,
|
|
95
|
-
}, opts.signal);
|
|
96
|
-
};
|
|
97
|
-
function newDriveJobId() {
|
|
98
|
-
return `cc-${process.hrtime.bigint().toString(36)}`;
|
|
99
|
-
}
|
|
100
|
-
function summarizePrompt(prompt, max = 120) {
|
|
101
|
-
const oneLine = prompt.replace(/\s+/g, " ").trim();
|
|
102
|
-
if (oneLine.length <= max)
|
|
103
|
-
return oneLine;
|
|
104
|
-
return `${oneLine.slice(0, Math.max(0, max - 3))}...`;
|
|
105
|
-
}
|
|
106
|
-
function isDriveAgentJob(job) {
|
|
107
|
-
return job.kind === "drive-agent" || job.description.startsWith("DriveAgent(");
|
|
108
|
-
}
|
|
109
|
-
function changedFilesSummary(job) {
|
|
110
|
-
const files = job.changedFiles ?? [];
|
|
111
|
-
if (files.length === 0)
|
|
112
|
-
return "unknown";
|
|
113
|
-
if (files.length <= 4)
|
|
114
|
-
return files.join(",");
|
|
115
|
-
return `${files.slice(0, 4).join(",")} (+${files.length - 4} more)`;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Canonicalize external transcript paths against the DriveAgent cwd. Claude
|
|
119
|
-
* normally records absolute paths while Codex apply_patch normally records
|
|
120
|
-
* relative paths; returning a cwd-relative display path for in-workspace files
|
|
121
|
-
* gives the renderer one stable identity and removes duplicate transcript hits.
|
|
122
|
-
*/
|
|
123
|
-
function normalizeChangedFiles(cwd, files) {
|
|
124
|
-
const seen = new Set();
|
|
125
|
-
const out = [];
|
|
126
|
-
for (const file of files) {
|
|
127
|
-
if (typeof file !== "string" || !file.trim())
|
|
128
|
-
continue;
|
|
129
|
-
const absolute = resolve(cwd, file.trim());
|
|
130
|
-
if (seen.has(absolute))
|
|
131
|
-
continue;
|
|
132
|
-
seen.add(absolute);
|
|
133
|
-
const rel = relative(cwd, absolute);
|
|
134
|
-
out.push(rel && rel !== ".." && !rel.startsWith(`..${sep}`) ? rel : absolute);
|
|
135
|
-
}
|
|
136
|
-
return out;
|
|
137
|
-
}
|
|
138
|
-
function jobDurationSeconds(job) {
|
|
139
|
-
const end = job.finishedAt ?? Date.now();
|
|
140
|
-
return `${Math.max(0, (end - job.startedAt) / 1000).toFixed(1)}s`;
|
|
141
|
-
}
|
|
142
|
-
function formatDriveJobListLine(job) {
|
|
143
|
-
const prompt = job.promptSummary || job.description || "(no prompt summary)";
|
|
144
|
-
const cwd = job.cwd ?? "(unknown cwd)";
|
|
145
|
-
const cli = job.cli ?? "unknown";
|
|
146
|
-
return [
|
|
147
|
-
`${job.jobId}`,
|
|
148
|
-
`status=${job.status}`,
|
|
149
|
-
`cli=${cli}`,
|
|
150
|
-
`session=${job.sessionId}`,
|
|
151
|
-
`cwd=${cwd}`,
|
|
152
|
-
`startedAt=${new Date(job.startedAt).toISOString()}`,
|
|
153
|
-
`duration=${jobDurationSeconds(job)}`,
|
|
154
|
-
`changedFiles=${changedFilesSummary(job)}`,
|
|
155
|
-
`prompt="${prompt}"`,
|
|
156
|
-
].join(" ");
|
|
157
|
-
}
|
|
158
|
-
function isValidSessionId(sessionId) {
|
|
159
|
-
return typeof sessionId === "string" && sessionId.length > 0;
|
|
160
|
-
}
|
|
161
|
-
function argSignal(args) {
|
|
162
|
-
const signal = args.__signal;
|
|
163
|
-
return signal &&
|
|
164
|
-
typeof signal === "object" &&
|
|
165
|
-
typeof signal.aborted === "boolean" &&
|
|
166
|
-
typeof signal.addEventListener === "function"
|
|
167
|
-
? signal
|
|
168
|
-
: undefined;
|
|
169
|
-
}
|
|
170
|
-
function startRun(runner, opts) {
|
|
171
|
-
return Promise.resolve().then(() => runner(opts));
|
|
172
|
-
}
|
|
173
|
-
function resolveAttachmentPaths(raw, cwd) {
|
|
174
|
-
if (raw === undefined)
|
|
175
|
-
return { paths: [] };
|
|
176
|
-
if (!Array.isArray(raw))
|
|
177
|
-
return { paths: [], error: "attachmentPaths must be an array of strings" };
|
|
178
|
-
const cwdReal = realpathSync(cwd);
|
|
179
|
-
const paths = [];
|
|
180
|
-
for (const item of raw) {
|
|
181
|
-
if (typeof item !== "string" || !item.trim()) {
|
|
182
|
-
return { paths: [], error: "attachmentPaths must contain only non-empty strings" };
|
|
183
|
-
}
|
|
184
|
-
const candidate = isAbsolute(item) ? item : resolve(cwd, item);
|
|
185
|
-
if (!existsSync(candidate))
|
|
186
|
-
return { paths: [], error: `attachment path not found: ${item}` };
|
|
187
|
-
const real = realpathSync(candidate);
|
|
188
|
-
const rel = relative(cwdReal, real);
|
|
189
|
-
if (rel === "" || rel === ".." || rel.startsWith(`..${sep}`)) {
|
|
190
|
-
return { paths: [], error: `attachment path is outside cwd: ${item}` };
|
|
191
|
-
}
|
|
192
|
-
const info = statSync(real);
|
|
193
|
-
if (!info.isFile())
|
|
194
|
-
return { paths: [], error: `attachment path is not a file: ${item}` };
|
|
195
|
-
paths.push(real);
|
|
196
|
-
}
|
|
197
|
-
return { paths };
|
|
198
|
-
}
|
|
199
|
-
const DRIVE_IMAGE_EXTS = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp"]);
|
|
200
|
-
function appendAttachmentPrompt(prompt, paths) {
|
|
201
|
-
if (paths.length === 0)
|
|
202
|
-
return prompt;
|
|
203
|
-
const lines = ["", "Attached files:"];
|
|
204
|
-
for (const path of paths) {
|
|
205
|
-
const kind = DRIVE_IMAGE_EXTS.has(extname(path).toLowerCase()) ? "image" : "file";
|
|
206
|
-
lines.push(`- ${path} (${kind})`);
|
|
207
|
-
}
|
|
208
|
-
return `${prompt}\n${lines.join("\n")}`;
|
|
209
|
-
}
|
|
210
|
-
function recordSuccessfulSession(store, cli, cwd, result, includeErroredSession = false) {
|
|
211
|
-
if ((!includeErroredSession && result.isError) || !result.sessionId)
|
|
212
|
-
return;
|
|
213
|
-
try {
|
|
214
|
-
store.record({ cli, sessionId: result.sessionId, cwd });
|
|
215
|
-
}
|
|
216
|
-
catch (err) {
|
|
217
|
-
logger.warn("drive_agent.session_binding_record_failed", {
|
|
218
|
-
cat: "cc",
|
|
219
|
-
cli,
|
|
220
|
-
sessionId: result.sessionId,
|
|
221
|
-
cwd,
|
|
222
|
-
error: err instanceof Error ? err.message : String(err),
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
function duplicateCwdWarning(cwd, writable) {
|
|
227
|
-
if (!writable)
|
|
228
|
-
return undefined;
|
|
229
|
-
const running = backgroundJobRegistry.listRunningByCwd(cwd).filter(isDriveAgentJob);
|
|
230
|
-
if (running.length === 0)
|
|
231
|
-
return undefined;
|
|
232
|
-
const jobs = running.map(formatDriveJobListLine).join("; ");
|
|
233
|
-
return (`Warning: another DriveAgent job is already running in cwd ${cwd}. ` +
|
|
234
|
-
"Concurrent writable agents in the same directory can overwrite each other's work. " +
|
|
235
|
-
`Run DriveAgentJobs(action:"list", cwd:"${cwd}") before dispatching parallel work for details/cancellation. ` +
|
|
236
|
-
`Running: ${jobs}`);
|
|
237
|
-
}
|
|
238
|
-
function attachDriveCompletion(params) {
|
|
239
|
-
const { jobId, sessionId, label, cli, cwd, run, sessionStore, readChangedFiles, recordExternalFileChanges, originClientMessageId, } = params;
|
|
240
|
-
void run
|
|
241
|
-
.then((r) => {
|
|
242
|
-
const jobStatus = backgroundJobRegistry.get(jobId)?.status;
|
|
243
|
-
if (jobStatus !== "running" && jobStatus !== "cancelling")
|
|
244
|
-
return;
|
|
245
|
-
const cancelling = jobStatus === "cancelling";
|
|
246
|
-
recordSuccessfulSession(sessionStore, cli, cwd, r, cancelling);
|
|
247
|
-
// Attribute external changes BEFORE publishing completion. Previously the
|
|
248
|
-
// notification event was emitted first and carried no files; changedFiles
|
|
249
|
-
// only reached the background-work registry/panel, so the chat turn card
|
|
250
|
-
// could never count DriveAgent edits.
|
|
251
|
-
const rawChangedFiles = r.sessionId ? readChangedFiles(cli, cwd, r.sessionId) : [];
|
|
252
|
-
const changedFiles = normalizeChangedFiles(cwd, rawChangedFiles);
|
|
253
|
-
if (changedFiles.length > 0) {
|
|
254
|
-
recordExternalFileChanges?.({
|
|
255
|
-
jobId,
|
|
256
|
-
description: label,
|
|
257
|
-
cli,
|
|
258
|
-
cwd,
|
|
259
|
-
status: cancelling ? "cancelled" : r.isError ? "failed" : "completed",
|
|
260
|
-
changedFiles,
|
|
261
|
-
...(originClientMessageId ? { originClientMessageId } : {}),
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
logger.debug("changed_files.drive_completion", {
|
|
265
|
-
cat: "changed_files",
|
|
266
|
-
jobId,
|
|
267
|
-
sessionId,
|
|
268
|
-
externalSessionId: r.sessionId || undefined,
|
|
269
|
-
cli,
|
|
270
|
-
cwd,
|
|
271
|
-
originClientMessageId,
|
|
272
|
-
rawSize: rawChangedFiles.length,
|
|
273
|
-
size: changedFiles.length,
|
|
274
|
-
files: changedFiles,
|
|
275
|
-
});
|
|
276
|
-
if (cancelling) {
|
|
277
|
-
backgroundJobRegistry.recordArtifacts(jobId, {
|
|
278
|
-
ccSessionId: r.sessionId || undefined,
|
|
279
|
-
changedFiles,
|
|
280
|
-
});
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
// Deliver the result back so the woken agent actually sees the answer
|
|
284
|
-
// (not just "a job finished"). Mirrors the video/sub-agent completion
|
|
285
|
-
// path — enqueue lands in the same notificationQueue the wakeup drains.
|
|
286
|
-
notificationQueue.enqueue(r.isError
|
|
287
|
-
? {
|
|
288
|
-
agentId: jobId,
|
|
289
|
-
description: label,
|
|
290
|
-
status: "failed",
|
|
291
|
-
workKind: "cc",
|
|
292
|
-
error: r.finalText || "(no output)",
|
|
293
|
-
ccSessionId: r.sessionId || undefined,
|
|
294
|
-
...(changedFiles.length ? { changedFiles, cwd } : {}),
|
|
295
|
-
...(originClientMessageId ? { originClientMessageId } : {}),
|
|
296
|
-
enqueuedAt: Date.now(),
|
|
297
|
-
}
|
|
298
|
-
: {
|
|
299
|
-
agentId: jobId,
|
|
300
|
-
description: label,
|
|
301
|
-
status: "completed",
|
|
302
|
-
workKind: "cc",
|
|
303
|
-
finalText: r.finalText,
|
|
304
|
-
ccSessionId: r.sessionId || undefined,
|
|
305
|
-
...(changedFiles.length ? { changedFiles, cwd } : {}),
|
|
306
|
-
...(originClientMessageId ? { originClientMessageId } : {}),
|
|
307
|
-
enqueuedAt: Date.now(),
|
|
308
|
-
}, sessionId);
|
|
309
|
-
// Retain the job in the panel with its result + the external CLI
|
|
310
|
-
// session id + changed files.
|
|
311
|
-
backgroundJobRegistry.finish(jobId, {
|
|
312
|
-
status: r.isError ? "failed" : "completed",
|
|
313
|
-
finalText: r.finalText || undefined,
|
|
314
|
-
ccSessionId: r.sessionId || undefined,
|
|
315
|
-
...(changedFiles.length ? { changedFiles } : {}),
|
|
316
|
-
});
|
|
317
|
-
})
|
|
318
|
-
.catch((err) => {
|
|
319
|
-
if (backgroundJobRegistry.get(jobId)?.status !== "running")
|
|
320
|
-
return;
|
|
321
|
-
const msg = err?.message ?? String(err);
|
|
322
|
-
notificationQueue.enqueue({
|
|
323
|
-
agentId: jobId,
|
|
324
|
-
description: label,
|
|
325
|
-
status: "failed",
|
|
326
|
-
workKind: "cc",
|
|
327
|
-
error: msg,
|
|
328
|
-
enqueuedAt: Date.now(),
|
|
329
|
-
}, sessionId);
|
|
330
|
-
backgroundJobRegistry.finish(jobId, { status: "failed", finalText: msg });
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
function trackBackgroundRun(params) {
|
|
334
|
-
const warning = duplicateCwdWarning(params.cwd, params.writable);
|
|
335
|
-
const jobId = newDriveJobId();
|
|
336
|
-
const run = params.start();
|
|
337
|
-
backgroundJobRegistry.start(jobId, params.sessionId, params.label, {
|
|
338
|
-
kind: "drive-agent",
|
|
339
|
-
cwd: params.cwd,
|
|
340
|
-
cli: params.cli,
|
|
341
|
-
promptSummary: params.promptSummary,
|
|
342
|
-
originClientMessageId: params.originClientMessageId,
|
|
343
|
-
abort: async () => {
|
|
344
|
-
params.abort();
|
|
345
|
-
await run.catch(() => undefined);
|
|
346
|
-
},
|
|
347
|
-
});
|
|
348
|
-
attachDriveCompletion({ ...params, jobId, run });
|
|
349
|
-
return { jobId, ...(warning ? { warning } : {}) };
|
|
350
|
-
}
|
|
351
|
-
async function waitForForegroundOrHandoff(run, handoffMs) {
|
|
352
|
-
if (handoffMs < 0) {
|
|
353
|
-
return { kind: "completed", result: await run };
|
|
354
|
-
}
|
|
355
|
-
let timer;
|
|
356
|
-
try {
|
|
357
|
-
return await Promise.race([
|
|
358
|
-
run.then((result) => ({ kind: "completed", result })),
|
|
359
|
-
new Promise((resolve) => {
|
|
360
|
-
timer = setTimeout(() => resolve({ kind: "handoff" }), handoffMs);
|
|
361
|
-
}),
|
|
362
|
-
]);
|
|
363
|
-
}
|
|
364
|
-
finally {
|
|
365
|
-
if (timer)
|
|
366
|
-
clearTimeout(timer);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
function makeAbortController(parent, linkParent = false) {
|
|
370
|
-
const controller = new AbortController();
|
|
371
|
-
if (!parent)
|
|
372
|
-
return controller;
|
|
373
|
-
if (parent.aborted) {
|
|
374
|
-
controller.abort(parent.reason);
|
|
375
|
-
}
|
|
376
|
-
else if (linkParent) {
|
|
377
|
-
parent.addEventListener("abort", () => controller.abort(parent.reason), { once: true });
|
|
378
|
-
}
|
|
379
|
-
return controller;
|
|
380
|
-
}
|
|
381
|
-
/** Factory so tests can inject a fake runner. `fixedCli` (back-compat) forces a
|
|
382
|
-
* cli and hides the `cli` arg — that's how DriveClaudeCode stays a thin alias. */
|
|
383
|
-
export function makeDriveAgentTool(runner = defaultRunner, fixedCli, options = {}) {
|
|
384
|
-
return async (args, ctx) => {
|
|
385
|
-
const prompt = typeof args.prompt === "string" ? args.prompt : "";
|
|
386
|
-
const rawRequestedCwd = typeof args.cwd === "string" ? args.cwd : process.cwd();
|
|
387
|
-
const requestedCwd = normalizeCwdPath(rawRequestedCwd);
|
|
388
|
-
if (!prompt)
|
|
389
|
-
return "Error: prompt is required";
|
|
390
|
-
const cli = fixedCli ??
|
|
391
|
-
(args.cli === "codex"
|
|
392
|
-
? "codex"
|
|
393
|
-
: args.cli === "claude" || args.cli === undefined
|
|
394
|
-
? "claude"
|
|
395
|
-
: "invalid");
|
|
396
|
-
if (cli === "invalid")
|
|
397
|
-
return `Error: unknown cli "${String(args.cli)}" (expected "claude" or "codex")`;
|
|
398
|
-
const resumeSessionId = typeof args.resumeSessionId === "string" ? args.resumeSessionId : undefined;
|
|
399
|
-
const model = typeof args.model === "string" && args.model.trim() ? args.model : undefined;
|
|
400
|
-
const sessionStore = options.sessionStore ?? externalAgentSessionStore;
|
|
401
|
-
let cwd = requestedCwd;
|
|
402
|
-
let resumeNote = "";
|
|
403
|
-
if (resumeSessionId) {
|
|
404
|
-
const binding = sessionStore.get(cli, resumeSessionId);
|
|
405
|
-
if (binding) {
|
|
406
|
-
const storedCwd = normalizeCwdPath(binding.cwd);
|
|
407
|
-
if (!isExistingDirectory(storedCwd)) {
|
|
408
|
-
return `Error: cannot resume ${cli} session ${resumeSessionId}: stored cwd no longer exists or is not a directory: ${storedCwd}`;
|
|
409
|
-
}
|
|
410
|
-
if (storedCwd !== requestedCwd) {
|
|
411
|
-
cwd = storedCwd;
|
|
412
|
-
resumeNote = `Note: resume session ${resumeSessionId} is bound to stored cwd ${storedCwd}; ignoring requested cwd ${requestedCwd}.`;
|
|
413
|
-
logger.info("drive_agent.resume_forced_stored_cwd", {
|
|
414
|
-
cat: "cc",
|
|
415
|
-
cli,
|
|
416
|
-
sessionId: resumeSessionId,
|
|
417
|
-
requestedCwd,
|
|
418
|
-
storedCwd,
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
// Default to bypassPermissions: this tool is a fire-one-turn delegation to
|
|
424
|
-
// an external CLI with nobody watching for approvals, and there is no
|
|
425
|
-
// interactive approval loop here — so under "default" a tool that needs
|
|
426
|
-
// approval (WebSearch/WebFetch/Write) silently can't run (the
|
|
427
|
-
// "DriveClaudeCode 没有联网能力" report). A caller that wants gating passes
|
|
428
|
-
// an explicit mode, which is honored. (For codex, the mode maps to a sandbox
|
|
429
|
-
// tier inside codexAdapter.)
|
|
430
|
-
const permissionMode = args.permissionMode === "default" ||
|
|
431
|
-
args.permissionMode === "acceptEdits" ||
|
|
432
|
-
args.permissionMode === "bypassPermissions"
|
|
433
|
-
? args.permissionMode
|
|
434
|
-
: "bypassPermissions";
|
|
435
|
-
const resolvedAttachmentPaths = resolveAttachmentPaths(args.attachmentPaths, cwd);
|
|
436
|
-
if (resolvedAttachmentPaths.error)
|
|
437
|
-
return `Error: ${resolvedAttachmentPaths.error}`;
|
|
438
|
-
const attachmentPaths = resolvedAttachmentPaths.paths;
|
|
439
|
-
const promptWithAttachments = appendAttachmentPrompt(prompt, attachmentPaths);
|
|
440
|
-
const imagePaths = cli === "codex"
|
|
441
|
-
? attachmentPaths.filter((path) => DRIVE_IMAGE_EXTS.has(extname(path).toLowerCase()))
|
|
442
|
-
: [];
|
|
443
|
-
const cliName = cli === "codex" ? "Codex" : "Claude Code";
|
|
444
|
-
const label = `DriveAgent(${cli}): ${prompt.slice(0, 40)}`;
|
|
445
|
-
const promptSummary = summarizePrompt(prompt);
|
|
446
|
-
const callerSignal = ctx?.signal ?? argSignal(args);
|
|
447
|
-
const runOptsBase = {
|
|
448
|
-
cli,
|
|
449
|
-
prompt: promptWithAttachments,
|
|
450
|
-
resumeSessionId,
|
|
451
|
-
model,
|
|
452
|
-
cwd,
|
|
453
|
-
permissionMode,
|
|
454
|
-
imagePaths,
|
|
455
|
-
};
|
|
456
|
-
const foregroundHandoffMs = options.foregroundHandoffMs ?? DRIVE_AGENT_FOREGROUND_HANDOFF_MS;
|
|
457
|
-
const isWritableRun = permissionMode !== "default";
|
|
458
|
-
// Background by default (these tasks are typically long). Only an explicit
|
|
459
|
-
// background:false runs in the foreground and returns the result inline.
|
|
460
|
-
const background = args.background !== false;
|
|
461
|
-
if (background) {
|
|
462
|
-
// Fail loud on a missing sessionId: a background job whose completion
|
|
463
|
-
// notification can't be routed (enqueue drops invalid/empty sessionId)
|
|
464
|
-
// would run to completion and then silently vanish — nobody gets woken
|
|
465
|
-
// with the result. Refuse up front instead of launching disappearing work.
|
|
466
|
-
const sessionId = ctx?.sessionId;
|
|
467
|
-
if (typeof sessionId !== "string" || sessionId.length === 0) {
|
|
468
|
-
return `Error: cannot start a background ${cliName} job without a session — its result notification would be dropped. Retry with background:false, or ensure the tool runs inside a session.`;
|
|
469
|
-
}
|
|
470
|
-
const abortController = makeAbortController(callerSignal, false);
|
|
471
|
-
const tracked = trackBackgroundRun({
|
|
472
|
-
sessionId,
|
|
473
|
-
label,
|
|
474
|
-
cli,
|
|
475
|
-
cwd,
|
|
476
|
-
promptSummary,
|
|
477
|
-
start: () => startRun(runner, { ...runOptsBase, signal: abortController.signal }),
|
|
478
|
-
abort: () => abortController.abort(),
|
|
479
|
-
sessionStore,
|
|
480
|
-
writable: isWritableRun,
|
|
481
|
-
readChangedFiles: options.readChangedFiles ?? readExternalChangedFiles,
|
|
482
|
-
recordExternalFileChanges: ctx?.recordExternalFileChanges,
|
|
483
|
-
originClientMessageId: ctx?.originClientMessageId,
|
|
484
|
-
});
|
|
485
|
-
return [
|
|
486
|
-
resumeNote,
|
|
487
|
-
`已在后台启动 ${cliName}(jobId ${tracked.jobId})。完成后会通知你结果,无需轮询。`,
|
|
488
|
-
tracked.warning,
|
|
489
|
-
]
|
|
490
|
-
.filter(Boolean)
|
|
491
|
-
.join("\n");
|
|
492
|
-
}
|
|
493
|
-
const foregroundAbort = makeAbortController(callerSignal, true);
|
|
494
|
-
const run = startRun(runner, { ...runOptsBase, signal: foregroundAbort.signal });
|
|
495
|
-
const result = await waitForForegroundOrHandoff(run, foregroundHandoffMs);
|
|
496
|
-
if (result.kind === "handoff" && isValidSessionId(ctx?.sessionId)) {
|
|
497
|
-
const tracked = trackBackgroundRun({
|
|
498
|
-
sessionId: ctx.sessionId,
|
|
499
|
-
label,
|
|
500
|
-
cli,
|
|
501
|
-
cwd,
|
|
502
|
-
promptSummary,
|
|
503
|
-
start: () => run,
|
|
504
|
-
abort: () => foregroundAbort.abort(),
|
|
505
|
-
sessionStore,
|
|
506
|
-
writable: isWritableRun,
|
|
507
|
-
readChangedFiles: options.readChangedFiles ?? readExternalChangedFiles,
|
|
508
|
-
recordExternalFileChanges: ctx?.recordExternalFileChanges,
|
|
509
|
-
originClientMessageId: ctx?.originClientMessageId,
|
|
510
|
-
});
|
|
511
|
-
return [
|
|
512
|
-
resumeNote,
|
|
513
|
-
`${cliName} foreground run exceeded ${foregroundHandoffMs}ms; moved it to background (jobId ${tracked.jobId}). Completion will notify this session, so do not poll.`,
|
|
514
|
-
tracked.warning,
|
|
515
|
-
]
|
|
516
|
-
.filter(Boolean)
|
|
517
|
-
.join("\n");
|
|
518
|
-
}
|
|
519
|
-
const r = result.kind === "completed" ? result.result : await run;
|
|
520
|
-
recordSuccessfulSession(sessionStore, cli, cwd, r);
|
|
521
|
-
const prefix = resumeNote ? `${resumeNote}\n` : "";
|
|
522
|
-
if (r.isError)
|
|
523
|
-
return `${prefix}${cliName} 运行出错(session ${r.sessionId}):\n${r.finalText}`;
|
|
524
|
-
return `${prefix}${cliName} 完成(session ${r.sessionId}):\n${r.finalText}`;
|
|
525
|
-
};
|
|
526
|
-
}
|
|
527
|
-
export const driveAgentTool = makeDriveAgentTool();
|
|
528
|
-
export const driveAgentJobsToolDef = {
|
|
529
|
-
name: "DriveAgentJobs",
|
|
530
|
-
description: "List, inspect, or cancel background DriveAgent jobs. Use action:'list' before launching " +
|
|
531
|
-
"writable DriveAgent work in a cwd to see already-running jobs there, including prompt " +
|
|
532
|
-
"summary, owner session, cwd, CLI kind, status, start time, and known changed files. " +
|
|
533
|
-
"Use action:'inspect' with jobId for full details, or action:'cancel' with jobId to abort " +
|
|
534
|
-
"a running DriveAgent external CLI process and deliver a cancellation notification.",
|
|
535
|
-
inputSchema: {
|
|
536
|
-
type: "object",
|
|
537
|
-
properties: {
|
|
538
|
-
action: {
|
|
539
|
-
type: "string",
|
|
540
|
-
enum: ["list", "inspect", "cancel"],
|
|
541
|
-
description: "What to do. Defaults to list.",
|
|
542
|
-
},
|
|
543
|
-
jobId: {
|
|
544
|
-
type: "string",
|
|
545
|
-
description: "DriveAgent jobId for inspect or cancel.",
|
|
546
|
-
},
|
|
547
|
-
cwd: {
|
|
548
|
-
type: "string",
|
|
549
|
-
description: "When listing, restrict to DriveAgent jobs in this cwd. This is cross-session so it can catch same-directory write conflicts before dispatch.",
|
|
550
|
-
},
|
|
551
|
-
status: {
|
|
552
|
-
type: "string",
|
|
553
|
-
enum: ["running", "all"],
|
|
554
|
-
description: "When listing: running (default) or all retained DriveAgent jobs.",
|
|
555
|
-
},
|
|
556
|
-
all: {
|
|
557
|
-
type: "boolean",
|
|
558
|
-
description: "When listing without cwd: true lists DriveAgent jobs from every session; default lists only this session when session context exists.",
|
|
559
|
-
},
|
|
560
|
-
},
|
|
561
|
-
},
|
|
562
|
-
};
|
|
563
|
-
function jobIdArg(args) {
|
|
564
|
-
const camel = typeof args.jobId === "string" ? args.jobId.trim() : "";
|
|
565
|
-
if (camel)
|
|
566
|
-
return camel;
|
|
567
|
-
const snake = typeof args.job_id === "string" ? args.job_id.trim() : "";
|
|
568
|
-
return snake || undefined;
|
|
569
|
-
}
|
|
570
|
-
function listDriveAgentJobs(args, ctx) {
|
|
571
|
-
const rawCwd = typeof args.cwd === "string" && args.cwd.trim() ? args.cwd : undefined;
|
|
572
|
-
const cwd = rawCwd ? normalizeCwdPath(rawCwd) : undefined;
|
|
573
|
-
const sessionId = ctx?.sessionId;
|
|
574
|
-
const listAllSessions = args.all === true || !!cwd || !sessionId;
|
|
575
|
-
const status = args.status === "all" ? "all" : "running";
|
|
576
|
-
let jobs = listAllSessions || !sessionId
|
|
577
|
-
? backgroundJobRegistry.list()
|
|
578
|
-
: backgroundJobRegistry.listForSession(sessionId);
|
|
579
|
-
jobs = jobs.filter(isDriveAgentJob);
|
|
580
|
-
if (cwd)
|
|
581
|
-
jobs = jobs.filter((job) => job.cwd === cwd);
|
|
582
|
-
if (status === "running") {
|
|
583
|
-
jobs = jobs.filter((job) => job.status === "running" || job.status === "cancelling");
|
|
584
|
-
}
|
|
585
|
-
if (jobs.length === 0) {
|
|
586
|
-
if (cwd)
|
|
587
|
-
return `No ${status} DriveAgent jobs in cwd ${cwd}.`;
|
|
588
|
-
if (listAllSessions)
|
|
589
|
-
return `No ${status} DriveAgent jobs in this process.`;
|
|
590
|
-
return `No ${status} DriveAgent jobs in this session.`;
|
|
591
|
-
}
|
|
592
|
-
return jobs.map(formatDriveJobListLine).join("\n");
|
|
593
|
-
}
|
|
594
|
-
function inspectDriveAgentJob(jobId) {
|
|
595
|
-
if (!jobId)
|
|
596
|
-
return "Error: jobId is required.";
|
|
597
|
-
const job = backgroundJobRegistry.get(jobId);
|
|
598
|
-
if (!job || !isDriveAgentJob(job))
|
|
599
|
-
return `Error: DriveAgent jobId "${jobId}" not found.`;
|
|
600
|
-
const lines = [
|
|
601
|
-
`jobId: ${job.jobId}`,
|
|
602
|
-
`status: ${job.status}`,
|
|
603
|
-
`cli: ${job.cli ?? "unknown"}`,
|
|
604
|
-
`session: ${job.sessionId}`,
|
|
605
|
-
`cwd: ${job.cwd ?? "(unknown cwd)"}`,
|
|
606
|
-
`startedAt: ${new Date(job.startedAt).toISOString()}`,
|
|
607
|
-
`duration: ${jobDurationSeconds(job)}`,
|
|
608
|
-
`prompt: ${job.promptSummary || job.description || "(no prompt summary)"}`,
|
|
609
|
-
`description: ${job.description}`,
|
|
610
|
-
];
|
|
611
|
-
if (job.finishedAt !== undefined)
|
|
612
|
-
lines.push(`finishedAt: ${new Date(job.finishedAt).toISOString()}`);
|
|
613
|
-
if (job.ccSessionId)
|
|
614
|
-
lines.push(`ccSessionId: ${job.ccSessionId}`);
|
|
615
|
-
if (job.changedFiles && job.changedFiles.length > 0) {
|
|
616
|
-
lines.push("changedFiles:", ...job.changedFiles.map((file) => `- ${file}`));
|
|
617
|
-
}
|
|
618
|
-
else {
|
|
619
|
-
lines.push("changedFiles: unknown");
|
|
620
|
-
}
|
|
621
|
-
if (job.finalText)
|
|
622
|
-
lines.push("finalText:", job.finalText);
|
|
623
|
-
return lines.join("\n");
|
|
624
|
-
}
|
|
625
|
-
async function cancelDriveAgentJob(jobId) {
|
|
626
|
-
if (!jobId)
|
|
627
|
-
return "Error: jobId is required.";
|
|
628
|
-
const job = backgroundJobRegistry.get(jobId);
|
|
629
|
-
if (!job || !isDriveAgentJob(job))
|
|
630
|
-
return `Error: DriveAgent jobId "${jobId}" not found.`;
|
|
631
|
-
if (job.status !== "running") {
|
|
632
|
-
return `DriveAgent job ${jobId} is already ${job.status}; nothing to cancel.`;
|
|
633
|
-
}
|
|
634
|
-
if (!job.abort) {
|
|
635
|
-
return `Error: DriveAgent job ${jobId} has no cancellation handle recorded.`;
|
|
636
|
-
}
|
|
637
|
-
const finalText = `DriveAgent job ${jobId} cancelled by DriveAgentJobs.`;
|
|
638
|
-
const ok = await backgroundJobRegistry.cancel(jobId, { finalText });
|
|
639
|
-
if (!ok)
|
|
640
|
-
return `Failed to cancel DriveAgent job ${jobId}.`;
|
|
641
|
-
notificationQueue.enqueue({
|
|
642
|
-
agentId: jobId,
|
|
643
|
-
description: job.description,
|
|
644
|
-
status: "cancelled",
|
|
645
|
-
workKind: "cc",
|
|
646
|
-
error: finalText,
|
|
647
|
-
ccSessionId: job.ccSessionId,
|
|
648
|
-
...(job.changedFiles?.length ? { changedFiles: job.changedFiles, cwd: job.cwd } : {}),
|
|
649
|
-
...(job.originClientMessageId ? { originClientMessageId: job.originClientMessageId } : {}),
|
|
650
|
-
enqueuedAt: Date.now(),
|
|
651
|
-
}, job.sessionId);
|
|
652
|
-
return `DriveAgent job ${jobId} cancelled.`;
|
|
653
|
-
}
|
|
654
|
-
export async function driveAgentJobsTool(args, ctx) {
|
|
655
|
-
const action = args.action === "inspect" || args.action === "cancel" || args.action === "list"
|
|
656
|
-
? args.action
|
|
657
|
-
: "list";
|
|
658
|
-
if (action === "inspect")
|
|
659
|
-
return inspectDriveAgentJob(jobIdArg(args));
|
|
660
|
-
if (action === "cancel")
|
|
661
|
-
return await cancelDriveAgentJob(jobIdArg(args));
|
|
662
|
-
return listDriveAgentJobs(args, ctx);
|
|
663
|
-
}
|
|
664
|
-
// ── Back-compat: DriveClaudeCode = DriveAgent pinned to cli:"claude" ──────────
|
|
665
|
-
// Kept so old prompts / memories / call sites that reference DriveClaudeCode
|
|
666
|
-
// keep working. It's a thin alias over the same machinery (fixedCli "claude").
|
|
667
|
-
export const driveClaudeCodeToolDef = {
|
|
668
|
-
...driveAgentToolDef,
|
|
669
|
-
name: "DriveClaudeCode",
|
|
670
|
-
description: "(Alias of DriveAgent with cli:claude.) Delegate a task to the external Claude Code CLI " +
|
|
671
|
-
"(drives `claude` for one turn). Prefer DriveAgent for new calls; this name is kept for " +
|
|
672
|
-
"compatibility. " +
|
|
673
|
-
driveAgentToolDef.description,
|
|
674
|
-
inputSchema: {
|
|
675
|
-
type: "object",
|
|
676
|
-
properties: {
|
|
677
|
-
// intentionally omit `cli` — this alias is always claude
|
|
678
|
-
prompt: driveAgentToolDef.inputSchema.properties.prompt,
|
|
679
|
-
resumeSessionId: {
|
|
680
|
-
type: "string",
|
|
681
|
-
description: "Existing CC session id to resume (keeps context). Omit for a fresh session.",
|
|
682
|
-
},
|
|
683
|
-
model: driveAgentToolDef.inputSchema.properties.model,
|
|
684
|
-
cwd: driveAgentToolDef.inputSchema.properties.cwd,
|
|
685
|
-
attachmentPaths: driveAgentToolDef.inputSchema.properties.attachmentPaths,
|
|
686
|
-
permissionMode: driveAgentToolDef.inputSchema.properties.permissionMode,
|
|
687
|
-
background: driveAgentToolDef.inputSchema.properties.background,
|
|
688
|
-
},
|
|
689
|
-
required: ["prompt", "cwd"],
|
|
690
|
-
},
|
|
691
|
-
};
|
|
692
|
-
export function makeDriveClaudeCodeTool(runner, options) {
|
|
693
|
-
const generic = runner
|
|
694
|
-
? ({ prompt, resumeSessionId, model, cwd, permissionMode, signal }) => runner({ prompt, resumeSessionId, model, cwd, permissionMode, signal })
|
|
695
|
-
: undefined;
|
|
696
|
-
return makeDriveAgentTool(generic ?? defaultRunner, "claude", options);
|
|
697
|
-
}
|
|
698
|
-
export const driveClaudeCodeTool = makeDriveClaudeCodeTool();
|