@cjhyy/code-shell-core 0.5.0-rc.1 → 0.6.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -10
- package/dist/agent/agent-definition-registry.d.ts +21 -3
- package/dist/agent/agent-definition-registry.js +49 -18
- package/dist/agent/agent-definition.d.ts +32 -0
- package/dist/agent/agent-definition.js +49 -4
- package/dist/arena/arena.js +11 -12
- package/dist/arena/context/context-tools.js +47 -6
- package/dist/arena/context/within-root.d.ts +7 -0
- package/dist/arena/context/within-root.js +15 -0
- package/dist/arena/iterate/phases/argue.js +8 -2
- package/dist/arena/iterate/phases/revise.js +1 -1
- package/dist/arena/iterate/phases/tournament.js +3 -3
- package/dist/arena/ledger.js +9 -1
- package/dist/arena/phases/adjudication.js +1 -4
- package/dist/arena/phases/build-consensus.js +1 -4
- package/dist/arena/phases/cross-review.js +2 -8
- package/dist/arena/phases/debate-rounds.js +1 -4
- package/dist/arena/phases/participant-research.js +1 -4
- package/dist/arena/phases/planning-detail-expansion.js +8 -10
- package/dist/arena/planner.js +0 -1
- package/dist/arena/providers/docs.d.ts +1 -0
- package/dist/arena/providers/docs.js +5 -2
- package/dist/arena/providers/repo.d.ts +1 -0
- package/dist/arena/providers/repo.js +5 -2
- package/dist/arena/strategies/utils.d.ts +1 -4
- package/dist/arena/strategies/utils.js +7 -51
- package/dist/arena/transitions.d.ts +7 -2
- package/dist/arena/transitions.js +9 -4
- package/dist/arena/types.d.ts +8 -2
- package/dist/automation/cron-expr.d.ts +41 -0
- package/dist/automation/cron-expr.js +169 -0
- package/dist/automation/index.d.ts +41 -0
- package/dist/automation/index.js +39 -0
- package/dist/automation/runner.d.ts +84 -0
- package/dist/automation/runner.js +92 -0
- package/dist/automation/scheduler.d.ts +194 -0
- package/dist/automation/scheduler.js +623 -0
- package/dist/automation/store.d.ts +39 -0
- package/dist/automation/store.js +122 -0
- package/dist/automation/write-policy.d.ts +34 -0
- package/dist/automation/write-policy.js +113 -0
- package/dist/automation/write-run.d.ts +51 -0
- package/dist/automation/write-run.js +38 -0
- package/dist/capability-control/disabled-lists.d.ts +25 -0
- package/dist/capability-control/disabled-lists.js +57 -0
- package/dist/capability-control/index.d.ts +5 -0
- package/dist/capability-control/index.js +3 -0
- package/dist/capability-control/overlay.d.ts +64 -0
- package/dist/capability-control/overlay.js +116 -0
- package/dist/capability-control/project.d.ts +65 -0
- package/dist/capability-control/project.js +147 -0
- package/dist/capability-control/service.d.ts +70 -0
- package/dist/capability-control/service.js +147 -0
- package/dist/capability-control/types.d.ts +62 -0
- package/dist/capability-control/types.js +17 -0
- package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
- package/dist/cc-orchestrator/agent-adapter.js +133 -0
- package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
- package/dist/cc-orchestrator/cc-capability.js +53 -0
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
- package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
- package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
- package/dist/cc-orchestrator/codex-session-history.js +187 -0
- package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
- package/dist/cc-orchestrator/external-agent-changes.js +214 -0
- package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
- package/dist/cc-orchestrator/external-agent-driver.js +69 -0
- package/dist/cc-orchestrator/index.d.ts +8 -0
- package/dist/cc-orchestrator/index.js +8 -0
- package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
- package/dist/cc-orchestrator/relevance-judge.js +29 -0
- package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
- package/dist/cc-orchestrator/session-discovery.js +125 -0
- package/dist/cc-orchestrator/session-history.d.ts +19 -0
- package/dist/cc-orchestrator/session-history.js +67 -0
- package/dist/cli/agent-server-stdio.d.ts +26 -1
- package/dist/cli/agent-server-stdio.js +221 -28
- package/dist/cli/agent-server-tcp.d.ts +20 -0
- package/dist/cli/agent-server-tcp.js +134 -0
- package/dist/cli/graceful-shutdown.d.ts +27 -0
- package/dist/cli/graceful-shutdown.js +30 -0
- package/dist/context/compaction.d.ts +56 -0
- package/dist/context/compaction.js +209 -15
- package/dist/context/manager.d.ts +0 -20
- package/dist/context/manager.js +25 -41
- package/dist/cost-tracker.js +5 -61
- package/dist/credentials/cipher.d.ts +49 -0
- package/dist/credentials/cipher.js +45 -0
- package/dist/credentials/cookie-jar.d.ts +24 -0
- package/dist/credentials/cookie-jar.js +40 -0
- package/dist/credentials/index.d.ts +7 -0
- package/dist/credentials/index.js +5 -0
- package/dist/credentials/inject-credential-tool.d.ts +20 -0
- package/dist/credentials/inject-credential-tool.js +130 -0
- package/dist/credentials/store.d.ts +72 -0
- package/dist/credentials/store.js +184 -0
- package/dist/credentials/types.d.ts +56 -0
- package/dist/credentials/use-credential-tool.d.ts +29 -0
- package/dist/credentials/use-credential-tool.js +205 -0
- package/dist/credentials/use-gate.d.ts +56 -0
- package/dist/credentials/use-gate.js +52 -0
- package/dist/cron/cron-runtime.d.ts +2 -0
- package/dist/cron/cron-runtime.js +2 -0
- package/dist/cron/cron-store.d.ts +2 -0
- package/dist/cron/cron-store.js +2 -0
- package/dist/cron/scheduler.d.ts +5 -32
- package/dist/cron/scheduler.js +5 -113
- package/dist/data/model-metadata.d.ts +77 -0
- package/dist/data/model-metadata.js +56 -0
- package/dist/data/model-metadata.json +216 -0
- package/dist/data/openrouter-models.d.ts +18 -7
- package/dist/data/openrouter-models.js +35 -8
- package/dist/data/openrouter-sync.js +1 -1
- package/dist/engine/aux-key.d.ts +10 -0
- package/dist/engine/aux-key.js +11 -0
- package/dist/engine/dynamic-tool-defs.d.ts +19 -0
- package/dist/engine/dynamic-tool-defs.js +36 -0
- package/dist/engine/engine.d.ts +431 -108
- package/dist/engine/engine.js +1630 -279
- package/dist/engine/friendly-error.d.ts +18 -0
- package/dist/engine/friendly-error.js +63 -0
- package/dist/engine/goal.d.ts +187 -0
- package/dist/engine/goal.js +196 -0
- package/dist/engine/image-compression.d.ts +81 -0
- package/dist/engine/image-compression.js +186 -0
- package/dist/engine/image-policy.d.ts +165 -0
- package/dist/engine/image-policy.js +189 -0
- package/dist/engine/model-connections-pool.d.ts +17 -0
- package/dist/engine/model-connections-pool.js +66 -0
- package/dist/engine/model-facade.d.ts +10 -0
- package/dist/engine/model-facade.js +25 -0
- package/dist/engine/patch-orphaned-tools.js +3 -0
- package/dist/engine/reactive-threshold.d.ts +13 -0
- package/dist/engine/reactive-threshold.js +17 -0
- package/dist/engine/resolve-llm-config.d.ts +16 -0
- package/dist/engine/resolve-llm-config.js +44 -0
- package/dist/engine/runtime.js +9 -1
- package/dist/engine/sandbox-cache-key.d.ts +10 -0
- package/dist/engine/sandbox-cache-key.js +9 -0
- package/dist/engine/sandbox-config.d.ts +31 -0
- package/dist/engine/sandbox-config.js +38 -0
- package/dist/engine/session-title.d.ts +13 -0
- package/dist/engine/session-title.js +34 -0
- package/dist/engine/session-usage.d.ts +19 -0
- package/dist/engine/session-usage.js +25 -0
- package/dist/engine/steer-queue.d.ts +32 -0
- package/dist/engine/steer-queue.js +26 -0
- package/dist/engine/streaming-tool-queue.d.ts +12 -0
- package/dist/engine/streaming-tool-queue.js +50 -10
- package/dist/engine/turn-loop.d.ts +94 -9
- package/dist/engine/turn-loop.js +775 -342
- package/dist/engine/types.d.ts +175 -0
- package/dist/engine/types.js +13 -0
- package/dist/external-agents/config.d.ts +2 -0
- package/dist/external-agents/config.js +15 -0
- package/dist/external-agents/types.d.ts +31 -0
- package/dist/external-agents/types.js +1 -0
- package/dist/git/parse-log.d.ts +13 -0
- package/dist/git/parse-log.js +21 -0
- package/dist/git/utils.d.ts +8 -6
- package/dist/git/utils.js +62 -26
- package/dist/git/worktree.d.ts +48 -0
- package/dist/git/worktree.js +111 -20
- package/dist/hooks/events.d.ts +23 -1
- package/dist/hooks/goal-stop-hook.d.ts +58 -0
- package/dist/hooks/goal-stop-hook.js +279 -0
- package/dist/hooks/hook-output.d.ts +33 -0
- package/dist/hooks/hook-output.js +79 -0
- package/dist/hooks/registry.d.ts +15 -0
- package/dist/hooks/registry.js +57 -1
- package/dist/hooks/shell-runner.d.ts +2 -0
- package/dist/hooks/shell-runner.js +48 -18
- package/dist/index.d.ts +79 -11
- package/dist/index.js +89 -6
- package/dist/llm/capabilities/param-specs.d.ts +14 -0
- package/dist/llm/capabilities/param-specs.js +62 -0
- package/dist/llm/capabilities/reasoning-control.d.ts +24 -0
- package/dist/llm/capabilities/reasoning-control.js +38 -0
- package/dist/llm/capabilities/rules.js +37 -3
- package/dist/llm/capabilities/types.d.ts +32 -2
- package/dist/llm/clamp-max-tokens.d.ts +11 -0
- package/dist/llm/clamp-max-tokens.js +17 -0
- package/dist/llm/client-base.d.ts +69 -5
- package/dist/llm/client-base.js +185 -25
- package/dist/llm/client-factory.d.ts +3 -3
- package/dist/llm/client-factory.js +2 -2
- package/dist/llm/model-cache.js +4 -2
- package/dist/llm/model-pool.d.ts +29 -11
- package/dist/llm/model-pool.js +36 -20
- package/dist/llm/provider-auth.d.ts +41 -0
- package/dist/llm/provider-auth.js +76 -0
- package/dist/llm/provider-catalog.d.ts +6 -2
- package/dist/llm/providers/anthropic.d.ts +32 -2
- package/dist/llm/providers/anthropic.js +207 -18
- package/dist/llm/providers/openai.d.ts +47 -2
- package/dist/llm/providers/openai.js +478 -71
- package/dist/llm/reasoning-setting.d.ts +51 -0
- package/dist/llm/reasoning-setting.js +40 -0
- package/dist/llm/stop-reason.d.ts +13 -0
- package/dist/llm/stop-reason.js +21 -0
- package/dist/llm/stream-watchdog.js +5 -1
- package/dist/llm/strip-vision.d.ts +32 -0
- package/dist/llm/strip-vision.js +94 -0
- package/dist/llm/token-counter.js +9 -2
- package/dist/llm/types.d.ts +9 -6
- package/dist/logging/logger.js +18 -4
- package/dist/logging/sanitize-messages.d.ts +10 -0
- package/dist/logging/sanitize-messages.js +112 -0
- package/dist/lsp/client.js +28 -8
- package/dist/lsp/manager.d.ts +1 -1
- package/dist/lsp/manager.js +42 -11
- package/dist/lsp/root-path.d.ts +9 -0
- package/dist/lsp/root-path.js +12 -0
- package/dist/model-catalog/builtin.d.ts +12 -0
- package/dist/model-catalog/builtin.js +407 -0
- package/dist/model-catalog/gen-connections.d.ts +20 -0
- package/dist/model-catalog/gen-connections.js +28 -0
- package/dist/model-catalog/index.d.ts +41 -0
- package/dist/model-catalog/index.js +90 -0
- package/dist/model-catalog/params.d.ts +20 -0
- package/dist/model-catalog/params.js +45 -0
- package/dist/model-catalog/resolve.d.ts +48 -0
- package/dist/model-catalog/resolve.js +33 -0
- package/dist/model-catalog/save-entry.d.ts +32 -0
- package/dist/model-catalog/save-entry.js +104 -0
- package/dist/model-catalog/types.d.ts +561 -0
- package/dist/model-catalog/types.js +93 -0
- package/dist/model-catalog/upsert.d.ts +9 -0
- package/dist/model-catalog/upsert.js +8 -0
- package/dist/onboarding.d.ts +12 -82
- package/dist/onboarding.js +75 -333
- package/dist/plugins/gitOps.d.ts +53 -0
- package/dist/plugins/gitOps.js +130 -5
- package/dist/plugins/installer/checkUpdate.d.ts +16 -0
- package/dist/plugins/installer/checkUpdate.js +32 -0
- package/dist/plugins/installer/codex/convertAgents.d.ts +7 -0
- package/dist/plugins/installer/codex/convertAgents.js +55 -0
- package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
- package/dist/plugins/installer/codex/convertCommands.js +46 -0
- package/dist/plugins/installer/codex/convertMcp.d.ts +11 -0
- package/dist/plugins/installer/codex/convertMcp.js +85 -0
- package/dist/plugins/installer/codex/convertSkills.d.ts +12 -0
- package/dist/plugins/installer/codex/convertSkills.js +33 -0
- package/dist/plugins/installer/detectFormat.d.ts +2 -0
- package/dist/plugins/installer/detectFormat.js +6 -0
- package/dist/plugins/installer/install.d.ts +7 -0
- package/dist/plugins/installer/install.js +123 -0
- package/dist/plugins/installer/installFromArchive.d.ts +43 -0
- package/dist/plugins/installer/installFromArchive.js +134 -0
- package/dist/plugins/installer/installFromSource.d.ts +13 -0
- package/dist/plugins/installer/installFromSource.js +51 -0
- package/dist/plugins/installer/list.d.ts +9 -0
- package/dist/plugins/installer/list.js +30 -0
- package/dist/plugins/installer/loadPluginAgents.d.ts +3 -0
- package/dist/plugins/installer/loadPluginAgents.js +27 -0
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +107 -0
- package/dist/plugins/installer/parseSource.d.ts +20 -0
- package/dist/plugins/installer/parseSource.js +74 -0
- package/dist/plugins/installer/paths.d.ts +5 -0
- package/dist/plugins/installer/paths.js +25 -0
- package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
- package/dist/plugins/installer/pruneDisabled.js +73 -0
- package/dist/plugins/installer/types.d.ts +52 -0
- package/dist/plugins/installer/types.js +28 -0
- package/dist/plugins/installer/uninstall.d.ts +2 -0
- package/dist/plugins/installer/uninstall.js +18 -0
- package/dist/plugins/installer/unzip.d.ts +14 -0
- package/dist/plugins/installer/unzip.js +82 -0
- package/dist/plugins/installer/update.d.ts +28 -0
- package/dist/plugins/installer/update.js +97 -0
- package/dist/plugins/loadPluginHooks.d.ts +54 -1
- package/dist/plugins/loadPluginHooks.js +83 -1
- package/dist/plugins/marketplaceManager.d.ts +15 -1
- package/dist/plugins/marketplaceManager.js +58 -4
- package/dist/plugins/pluginCommandHook.js +34 -14
- package/dist/plugins/pluginContent.d.ts +30 -0
- package/dist/plugins/pluginContent.js +83 -0
- package/dist/plugins/pluginInstaller.d.ts +34 -0
- package/dist/plugins/pluginInstaller.js +168 -35
- package/dist/plugins/schemas.js +41 -6
- package/dist/plugins/types.d.ts +10 -0
- package/dist/preset/index.d.ts +7 -1
- package/dist/preset/index.js +112 -6
- package/dist/product/types.d.ts +1 -1
- package/dist/prompt/composer.d.ts +31 -0
- package/dist/prompt/composer.js +95 -25
- package/dist/prompt/instruction-scanner.js +5 -3
- package/dist/prompt/section-loader.js +1 -0
- package/dist/prompt/sections/base.md +1 -0
- package/dist/prompt/sections/browser.md +10 -0
- package/dist/prompt/sections/coding.md +4 -0
- package/dist/prompt/sections/orchestration.md +8 -0
- package/dist/protocol/chat-session-manager.d.ts +15 -2
- package/dist/protocol/chat-session-manager.js +46 -0
- package/dist/protocol/chat-session.d.ts +82 -0
- package/dist/protocol/chat-session.js +121 -1
- package/dist/protocol/client.d.ts +27 -0
- package/dist/protocol/client.js +38 -0
- package/dist/protocol/redact.d.ts +50 -0
- package/dist/protocol/redact.js +71 -0
- package/dist/protocol/server.d.ts +153 -2
- package/dist/protocol/server.js +807 -39
- package/dist/protocol/tcp-transport.d.ts +45 -0
- package/dist/protocol/tcp-transport.js +74 -0
- package/dist/protocol/transport.js +3 -2
- package/dist/protocol/types.d.ts +69 -0
- package/dist/protocol/types.js +22 -0
- package/dist/quota/credentials.d.ts +3 -0
- package/dist/quota/credentials.js +80 -0
- package/dist/quota/index.d.ts +36 -0
- package/dist/quota/index.js +155 -0
- package/dist/quota/types.d.ts +48 -0
- package/dist/quota/types.js +13 -0
- package/dist/remote/bridge.d.ts +11 -2
- package/dist/remote/bridge.js +61 -33
- package/dist/review/review-prompt.d.ts +28 -0
- package/dist/review/review-prompt.js +81 -0
- package/dist/run/ArtifactTracker.js +5 -4
- package/dist/run/EngineRunner.d.ts +27 -1
- package/dist/run/EngineRunner.js +46 -8
- package/dist/run/FileRunStore.js +40 -11
- package/dist/run/RunApprovalBackend.js +25 -5
- package/dist/run/RunLock.d.ts +28 -2
- package/dist/run/RunLock.js +49 -7
- package/dist/run/RunManager.d.ts +12 -0
- package/dist/run/RunManager.js +86 -3
- package/dist/run/RunQueue.d.ts +1 -0
- package/dist/run/RunQueue.js +8 -2
- package/dist/run/factory.d.ts +8 -1
- package/dist/run/factory.js +1 -0
- package/dist/run/index.d.ts +2 -2
- package/dist/run/index.js +1 -1
- package/dist/run/redirect-target.d.ts +7 -0
- package/dist/run/redirect-target.js +13 -0
- package/dist/run/types.js +1 -1
- package/dist/runtime/background-shell.d.ts +139 -0
- package/dist/runtime/background-shell.js +495 -0
- package/dist/runtime/output-clean.d.ts +24 -0
- package/dist/runtime/output-clean.js +41 -0
- package/dist/runtime/ring-file.d.ts +64 -0
- package/dist/runtime/ring-file.js +174 -0
- package/dist/runtime/safe-spawn.js +15 -34
- package/dist/runtime/spawn-common.d.ts +148 -0
- package/dist/runtime/spawn-common.js +303 -0
- package/dist/runtime/truncate-output.d.ts +22 -0
- package/dist/runtime/truncate-output.js +49 -0
- package/dist/runtime/utf8-cut.d.ts +11 -0
- package/dist/runtime/utf8-cut.js +23 -0
- package/dist/services/auto-dream.d.ts +4 -0
- package/dist/services/auto-dream.js +26 -26
- package/dist/services/browser-open.d.ts +13 -0
- package/dist/services/browser-open.js +16 -0
- package/dist/services/diagnostics.d.ts +1 -2
- package/dist/services/diagnostics.js +12 -7
- package/dist/services/dream-consolidation.d.ts +57 -0
- package/dist/services/dream-consolidation.js +151 -0
- package/dist/services/extract-memories.d.ts +14 -1
- package/dist/services/extract-memories.js +45 -6
- package/dist/services/memory-orchestrator.d.ts +21 -0
- package/dist/services/memory-orchestrator.js +125 -32
- package/dist/services/notifier.d.ts +8 -0
- package/dist/services/notifier.js +39 -25
- package/dist/services/oauth.js +5 -7
- package/dist/services/session-memory-sort.d.ts +8 -0
- package/dist/services/session-memory-sort.js +9 -0
- package/dist/services/session-memory.js +30 -19
- package/dist/session/file-history.d.ts +124 -1
- package/dist/session/file-history.js +232 -9
- package/dist/session/memory.d.ts +116 -2
- package/dist/session/memory.js +250 -28
- package/dist/session/session-manager.d.ts +63 -1
- package/dist/session/session-manager.js +186 -5
- package/dist/session/simple-diff.d.ts +23 -0
- package/dist/session/simple-diff.js +84 -0
- package/dist/session/transcript.d.ts +25 -1
- package/dist/session/transcript.js +35 -2
- package/dist/session/undo-target.d.ts +67 -0
- package/dist/session/undo-target.js +144 -0
- package/dist/settings/disk-defaults.d.ts +42 -0
- package/dist/settings/disk-defaults.js +33 -0
- package/dist/settings/feature-flags.d.ts +64 -0
- package/dist/settings/feature-flags.js +61 -0
- package/dist/settings/manager.d.ts +101 -1
- package/dist/settings/manager.js +345 -15
- package/dist/settings/migrate-config.d.ts +45 -0
- package/dist/settings/migrate-config.js +125 -0
- package/dist/settings/personalization.d.ts +19 -0
- package/dist/settings/personalization.js +7 -0
- package/dist/settings/schema-export.d.ts +25 -0
- package/dist/settings/schema-export.js +38 -0
- package/dist/settings/schema.d.ts +1827 -396
- package/dist/settings/schema.js +361 -81
- package/dist/skills/scanner.d.ts +9 -0
- package/dist/skills/scanner.js +30 -2
- package/dist/stt/resolve-transcribe.d.ts +31 -0
- package/dist/stt/resolve-transcribe.js +108 -0
- package/dist/stt/transcribe.d.ts +51 -0
- package/dist/stt/transcribe.js +65 -0
- package/dist/tool-system/browser-bridge.d.ts +226 -0
- package/dist/tool-system/browser-bridge.js +163 -0
- package/dist/tool-system/builtin/add-marketplace.d.ts +12 -0
- package/dist/tool-system/builtin/add-marketplace.js +76 -0
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
- package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
- package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
- package/dist/tool-system/builtin/agent-notifications.js +9 -3
- package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
- package/dist/tool-system/builtin/agent-output-file.js +72 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +23 -0
- package/dist/tool-system/builtin/agent-registry.js +16 -4
- package/dist/tool-system/builtin/agent.d.ts +50 -11
- package/dist/tool-system/builtin/agent.js +576 -73
- package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
- package/dist/tool-system/builtin/apply-patch/index.js +7 -3
- package/dist/tool-system/builtin/arena.js +6 -7
- package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
- package/dist/tool-system/builtin/background-jobs.js +124 -0
- package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
- package/dist/tool-system/builtin/background-shell-tools.js +108 -0
- package/dist/tool-system/builtin/background-work.d.ts +67 -0
- package/dist/tool-system/builtin/background-work.js +86 -0
- package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
- package/dist/tool-system/builtin/bash-output-style.js +40 -0
- package/dist/tool-system/builtin/bash.d.ts +5 -2
- package/dist/tool-system/builtin/bash.js +98 -62
- package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
- package/dist/tool-system/builtin/browser-tools.js +312 -0
- package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
- package/dist/tool-system/builtin/cancel-goal.js +64 -0
- package/dist/tool-system/builtin/check-quota.d.ts +15 -0
- package/dist/tool-system/builtin/check-quota.js +34 -0
- package/dist/tool-system/builtin/complete-goal.d.ts +25 -0
- package/dist/tool-system/builtin/complete-goal.js +45 -0
- package/dist/tool-system/builtin/config.js +7 -0
- package/dist/tool-system/builtin/cron.d.ts +7 -0
- package/dist/tool-system/builtin/cron.js +105 -9
- package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
- package/dist/tool-system/builtin/drive-claude-code.js +157 -0
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
- package/dist/tool-system/builtin/edit.d.ts +2 -1
- package/dist/tool-system/builtin/edit.js +21 -12
- package/dist/tool-system/builtin/eol.d.ts +29 -0
- package/dist/tool-system/builtin/eol.js +37 -0
- package/dist/tool-system/builtin/file-cache.d.ts +6 -0
- package/dist/tool-system/builtin/file-cache.js +8 -0
- package/dist/tool-system/builtin/generate-image.d.ts +60 -0
- package/dist/tool-system/builtin/generate-image.js +374 -0
- package/dist/tool-system/builtin/generate-video.d.ts +55 -0
- package/dist/tool-system/builtin/generate-video.js +361 -0
- package/dist/tool-system/builtin/grep.js +6 -2
- package/dist/tool-system/builtin/image-providers.d.ts +86 -0
- package/dist/tool-system/builtin/image-providers.js +190 -0
- package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
- package/dist/tool-system/builtin/image-uploader.js +74 -0
- package/dist/tool-system/builtin/index.d.ts +24 -1
- package/dist/tool-system/builtin/index.js +310 -25
- package/dist/tool-system/builtin/mcp-tools.js +23 -3
- package/dist/tool-system/builtin/memory.js +45 -7
- package/dist/tool-system/builtin/notebook-edit.d.ts +2 -1
- package/dist/tool-system/builtin/notebook-edit.js +1 -1
- package/dist/tool-system/builtin/powershell.js +4 -1
- package/dist/tool-system/builtin/read.d.ts +2 -1
- package/dist/tool-system/builtin/read.js +11 -3
- package/dist/tool-system/builtin/repl.js +4 -1
- package/dist/tool-system/builtin/skill.js +9 -0
- package/dist/tool-system/builtin/sleep.js +12 -5
- package/dist/tool-system/builtin/task.js +4 -1
- package/dist/tool-system/builtin/tool-search.js +25 -7
- package/dist/tool-system/builtin/update-automation-memory.d.ts +24 -0
- package/dist/tool-system/builtin/update-automation-memory.js +60 -0
- package/dist/tool-system/builtin/video-providers.d.ts +154 -0
- package/dist/tool-system/builtin/video-providers.js +235 -0
- package/dist/tool-system/builtin/view-image.d.ts +18 -0
- package/dist/tool-system/builtin/view-image.js +96 -0
- package/dist/tool-system/builtin/web-fetch.js +12 -2
- package/dist/tool-system/builtin/web-search.d.ts +4 -1
- package/dist/tool-system/builtin/web-search.js +57 -10
- package/dist/tool-system/builtin/worktree.d.ts +2 -1
- package/dist/tool-system/builtin/worktree.js +31 -4
- package/dist/tool-system/builtin/write.d.ts +2 -1
- package/dist/tool-system/builtin/write.js +1 -1
- package/dist/tool-system/context.d.ts +166 -6
- package/dist/tool-system/executor.d.ts +3 -2
- package/dist/tool-system/executor.js +197 -119
- package/dist/tool-system/investigation-guard.d.ts +4 -1
- package/dist/tool-system/investigation-guard.js +20 -4
- package/dist/tool-system/mcp-manager.d.ts +78 -16
- package/dist/tool-system/mcp-manager.js +357 -28
- package/dist/tool-system/path-policy.d.ts +99 -0
- package/dist/tool-system/path-policy.js +578 -0
- package/dist/tool-system/permission.d.ts +36 -1
- package/dist/tool-system/permission.js +322 -117
- package/dist/tool-system/plan-mode-allowlist.d.ts +32 -0
- package/dist/tool-system/plan-mode-allowlist.js +65 -0
- package/dist/tool-system/registry.d.ts +1 -0
- package/dist/tool-system/registry.js +26 -1
- package/dist/tool-system/sandbox/index.d.ts +8 -0
- package/dist/tool-system/sandbox/index.js +7 -2
- package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
- package/dist/tool-system/validate-tool-metadata.js +63 -0
- package/dist/tool-system/validation.d.ts +10 -0
- package/dist/tool-system/validation.js +16 -3
- package/dist/types.d.ts +301 -15
- package/dist/updater.js +20 -9
- package/dist/utils/envUtils.d.ts +0 -9
- package/dist/utils/envUtils.js +3 -28
- package/dist/utils/exec.d.ts +40 -0
- package/dist/utils/exec.js +144 -0
- package/dist/utils/format.js +4 -2
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +92 -0
- package/dist/utils/lockfile.js +9 -2
- package/dist/utils/theme.d.ts +7 -1
- package/dist/utils/theme.js +5 -3
- package/dist/utils/toolDisplay.js +0 -1
- package/package.json +14 -7
- package/dist/agent/coordinator.d.ts +0 -49
- package/dist/agent/coordinator.js +0 -77
- package/dist/settings/manager.test.js +0 -73
- package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
- package/dist/tool-system/builtin/remote-trigger.js +0 -54
- package/dist/tool-system/builtin/send-message.d.ts +0 -6
- package/dist/tool-system/builtin/send-message.js +0 -47
- /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
package/dist/run/RunLock.js
CHANGED
|
@@ -13,18 +13,33 @@ import { logger } from "../logging/logger.js";
|
|
|
13
13
|
export class RunLock {
|
|
14
14
|
runsDir;
|
|
15
15
|
staleMs;
|
|
16
|
+
targetWaitMs;
|
|
17
|
+
targetPollMs;
|
|
16
18
|
releaseFns = new Map();
|
|
17
19
|
constructor(config) {
|
|
18
20
|
this.runsDir = config?.runsDir ?? join(homedir(), ".code-shell", "runs");
|
|
19
21
|
this.staleMs = config?.staleMs ?? 60_000;
|
|
22
|
+
this.targetWaitMs = config?.targetWaitMs ?? 2_000;
|
|
23
|
+
this.targetPollMs = config?.targetPollMs ?? 10;
|
|
20
24
|
}
|
|
21
25
|
/**
|
|
22
|
-
* Acquire a lock for a run.
|
|
26
|
+
* Acquire a lock for a run. Missing target and held-lock failures are
|
|
27
|
+
* intentionally distinct so callers don't silently abandon a run as "locked"
|
|
28
|
+
* when the real issue is a bad/mismatched run store path.
|
|
29
|
+
*
|
|
30
|
+
* Race note: if the queue reaches acquire() before the file is visible, a
|
|
31
|
+
* short wait bridges that gap. Only a proper-lockfile conflict is "locked".
|
|
23
32
|
*/
|
|
24
33
|
async acquire(runId) {
|
|
25
34
|
const lockTarget = this.lockTarget(runId);
|
|
26
|
-
if (!
|
|
27
|
-
|
|
35
|
+
if (!(await this.waitForTarget(lockTarget))) {
|
|
36
|
+
logger.warn("run.lock.target_missing", { runId, lockTarget });
|
|
37
|
+
return {
|
|
38
|
+
acquired: false,
|
|
39
|
+
reason: "missing_target",
|
|
40
|
+
message: `Lock target did not appear: ${lockTarget}`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
28
43
|
try {
|
|
29
44
|
const release = await lock(lockTarget, {
|
|
30
45
|
stale: this.staleMs,
|
|
@@ -32,12 +47,39 @@ export class RunLock {
|
|
|
32
47
|
});
|
|
33
48
|
this.releaseFns.set(runId, release);
|
|
34
49
|
logger.info("run.lock.acquired", { runId });
|
|
35
|
-
return true;
|
|
50
|
+
return { acquired: true };
|
|
36
51
|
}
|
|
37
|
-
catch {
|
|
38
|
-
|
|
39
|
-
|
|
52
|
+
catch (err) {
|
|
53
|
+
const e = err;
|
|
54
|
+
logger.warn("run.lock.conflict", {
|
|
55
|
+
runId,
|
|
56
|
+
lockTarget,
|
|
57
|
+
code: e?.code,
|
|
58
|
+
message: e?.message,
|
|
59
|
+
alreadyHeldByThisInstance: this.releaseFns.has(runId),
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
acquired: false,
|
|
63
|
+
reason: "locked",
|
|
64
|
+
code: e?.code,
|
|
65
|
+
message: e?.message,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Wait (up to ~targetWaitMs) for the lock target file to exist, polling on a
|
|
71
|
+
* short interval. Returns true once present, false if it never appears
|
|
72
|
+
* within the window. Bridges the submit→executeRun create race without
|
|
73
|
+
* blocking meaningfully when the file is already there (first check hits).
|
|
74
|
+
*/
|
|
75
|
+
async waitForTarget(lockTarget) {
|
|
76
|
+
const deadline = Date.now() + this.targetWaitMs;
|
|
77
|
+
while (!existsSync(lockTarget)) {
|
|
78
|
+
if (Date.now() >= deadline)
|
|
79
|
+
return false;
|
|
80
|
+
await new Promise((r) => setTimeout(r, this.targetPollMs));
|
|
40
81
|
}
|
|
82
|
+
return true;
|
|
41
83
|
}
|
|
42
84
|
/**
|
|
43
85
|
* Release the lock for a run.
|
package/dist/run/RunManager.d.ts
CHANGED
|
@@ -49,10 +49,22 @@ export declare class RunManager {
|
|
|
49
49
|
private readonly abortControllers;
|
|
50
50
|
/** Active execution handles — used to resolve pending approvals/input while Engine is suspended */
|
|
51
51
|
private readonly executionHandles;
|
|
52
|
+
/**
|
|
53
|
+
* Runs with a resume()/cancel() decision currently being applied. Guards the
|
|
54
|
+
* approval/input resume race: resume() and cancel() each have multiple await
|
|
55
|
+
* points, and the status check at the top of resume() reads a value that
|
|
56
|
+
* stays `waiting_*` until a later `await transition()` lands. Two concurrent
|
|
57
|
+
* resumes (double-click approve), or resume racing cancel, would both pass
|
|
58
|
+
* that check and both drive transitions / resolve the handle. The handle's
|
|
59
|
+
* resolve is idempotent, but the duplicate transitions and (worse) the
|
|
60
|
+
* mismatched-input re-queue path are not. We serialize per-run here.
|
|
61
|
+
*/
|
|
62
|
+
private readonly resolvingRuns;
|
|
52
63
|
constructor(config: RunManagerConfig);
|
|
53
64
|
submit(input: SubmitRunInput): Promise<RunSnapshot>;
|
|
54
65
|
start(runId: string): Promise<void>;
|
|
55
66
|
resume(runId: string, input?: ResumeRunInput): Promise<void>;
|
|
67
|
+
private resumeInner;
|
|
56
68
|
cancel(runId: string, reason?: string): Promise<void>;
|
|
57
69
|
get(runId: string): Promise<RunSnapshot | null>;
|
|
58
70
|
list(query?: ListRunsQuery): Promise<RunSnapshot[]>;
|
package/dist/run/RunManager.js
CHANGED
|
@@ -33,6 +33,17 @@ export class RunManager {
|
|
|
33
33
|
abortControllers = new Map();
|
|
34
34
|
/** Active execution handles — used to resolve pending approvals/input while Engine is suspended */
|
|
35
35
|
executionHandles = new Map();
|
|
36
|
+
/**
|
|
37
|
+
* Runs with a resume()/cancel() decision currently being applied. Guards the
|
|
38
|
+
* approval/input resume race: resume() and cancel() each have multiple await
|
|
39
|
+
* points, and the status check at the top of resume() reads a value that
|
|
40
|
+
* stays `waiting_*` until a later `await transition()` lands. Two concurrent
|
|
41
|
+
* resumes (double-click approve), or resume racing cancel, would both pass
|
|
42
|
+
* that check and both drive transitions / resolve the handle. The handle's
|
|
43
|
+
* resolve is idempotent, but the duplicate transitions and (worse) the
|
|
44
|
+
* mismatched-input re-queue path are not. We serialize per-run here.
|
|
45
|
+
*/
|
|
46
|
+
resolvingRuns = new Set();
|
|
36
47
|
constructor(config) {
|
|
37
48
|
this.store = config.store;
|
|
38
49
|
this.queue = new RunQueue({ concurrency: config.concurrency ?? 1 });
|
|
@@ -99,6 +110,23 @@ export class RunManager {
|
|
|
99
110
|
}
|
|
100
111
|
// ─── Resume ────────────────────────────────────────────────────
|
|
101
112
|
async resume(runId, input) {
|
|
113
|
+
// Serialize resume/cancel decisions per run. Without this, two concurrent
|
|
114
|
+
// resumes (or resume racing cancel) both pass the status check below —
|
|
115
|
+
// status stays `waiting_*` until a later `await transition()` — and both
|
|
116
|
+
// drive transitions / the re-queue path. Reject the late arrival rather
|
|
117
|
+
// than letting it double-resolve.
|
|
118
|
+
if (this.resolvingRuns.has(runId)) {
|
|
119
|
+
throw new Error(`Cannot resume run ${runId}: another resume/cancel is already in progress`);
|
|
120
|
+
}
|
|
121
|
+
this.resolvingRuns.add(runId);
|
|
122
|
+
try {
|
|
123
|
+
await this.resumeInner(runId, input);
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
this.resolvingRuns.delete(runId);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async resumeInner(runId, input) {
|
|
102
130
|
const run = await this.getOrThrow(runId);
|
|
103
131
|
if (run.status !== "waiting_input" &&
|
|
104
132
|
run.status !== "waiting_approval" &&
|
|
@@ -137,6 +165,13 @@ export class RunManager {
|
|
|
137
165
|
handle.resolveInput(input.userInput);
|
|
138
166
|
return;
|
|
139
167
|
}
|
|
168
|
+
// A handle exists (Engine is live and suspended) but the input doesn't
|
|
169
|
+
// match what it's waiting for — e.g. userInput supplied for a
|
|
170
|
+
// waiting_approval run. Falling through to Case 2 would re-enqueue a
|
|
171
|
+
// FRESH execution while the suspended Engine still dangles (duplicate
|
|
172
|
+
// run + leaked handle). Reject with a clear message instead.
|
|
173
|
+
throw new Error(`Cannot resume run ${runId}: it is ${run.status} but the provided input does not match ` +
|
|
174
|
+
`(expected ${run.status === "waiting_approval" ? "approvalDecision" : "userInput"}).`);
|
|
140
175
|
}
|
|
141
176
|
// Case 2: No active handle (process restarted, or blocked state)
|
|
142
177
|
// Re-queue the run for a fresh execution attempt
|
|
@@ -293,9 +328,25 @@ export class RunManager {
|
|
|
293
328
|
async executeRun(runId) {
|
|
294
329
|
const run = await this.getOrThrow(runId);
|
|
295
330
|
// Acquire run lock — prevents concurrent execution by multiple workers
|
|
296
|
-
const
|
|
297
|
-
if (!acquired) {
|
|
298
|
-
|
|
331
|
+
const lockResult = await this.lock.acquire(runId);
|
|
332
|
+
if (!lockResult.acquired) {
|
|
333
|
+
if (lockResult.reason === "missing_target") {
|
|
334
|
+
const errorMsg = lockResult.message ?? "Run lock target was missing";
|
|
335
|
+
run.error = errorMsg;
|
|
336
|
+
await this.transition(run, "blocked");
|
|
337
|
+
await this.emitRunEvent(runId, "run_blocked", {
|
|
338
|
+
error: errorMsg,
|
|
339
|
+
reason: "missing_lock_target",
|
|
340
|
+
});
|
|
341
|
+
logger.error("run.lock.target_missing", { runId, error: errorMsg });
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
logger.warn("run.lock.failed", {
|
|
345
|
+
runId,
|
|
346
|
+
reason: "already locked by another worker",
|
|
347
|
+
code: lockResult.code,
|
|
348
|
+
message: lockResult.message,
|
|
349
|
+
});
|
|
299
350
|
return;
|
|
300
351
|
}
|
|
301
352
|
// Start heartbeat so crash recovery can detect liveness
|
|
@@ -331,6 +382,38 @@ export class RunManager {
|
|
|
331
382
|
// Feed events to checkpoint writer and artifact tracker
|
|
332
383
|
await checkpointWriter.onStreamEvent(event);
|
|
333
384
|
await artifactTracker.onStreamEvent(event);
|
|
385
|
+
// Link the run's sessionId the moment the engine resolves it.
|
|
386
|
+
// session_started fires at run START (engine.ts:1081); without this,
|
|
387
|
+
// sessionId is only written at completion, so in-flight runs have
|
|
388
|
+
// sessionId=null on disk and never reach the sidebar import.
|
|
389
|
+
//
|
|
390
|
+
// The `!agentId` guard is defensive: the built-in engine already
|
|
391
|
+
// suppresses sub-agent session_started upstream (engine.ts:830-835),
|
|
392
|
+
// but a custom RunExecutor could forward sub-agent events — and only
|
|
393
|
+
// the MAIN run's session should identify the run, never a sub-agent's.
|
|
394
|
+
if (event.type === "session_started" &&
|
|
395
|
+
!event.agentId) {
|
|
396
|
+
try {
|
|
397
|
+
const run = await this.getOrThrow(runId);
|
|
398
|
+
if (run.sessionId !== event.sessionId) {
|
|
399
|
+
run.sessionId = event.sessionId;
|
|
400
|
+
checkpointWriter.setSessionId(event.sessionId);
|
|
401
|
+
await this.store.update(run);
|
|
402
|
+
await this.emitRunEvent(runId, "session_linked", {
|
|
403
|
+
sessionId: event.sessionId,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
catch (linkErr) {
|
|
408
|
+
// Don't let a snapshot-write failure abort the run as a swallowed
|
|
409
|
+
// unhandled rejection — log and continue; the completion-time link
|
|
410
|
+
// is the backstop.
|
|
411
|
+
logger.warn("run.session_link_error", {
|
|
412
|
+
runId,
|
|
413
|
+
error: linkErr instanceof Error ? linkErr.message : String(linkErr),
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
}
|
|
334
417
|
// Forward to run subscribers
|
|
335
418
|
this.notifySubscribers(runId, { type: "engine_stream", event });
|
|
336
419
|
},
|
package/dist/run/RunQueue.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export type RunQueueExecutor = (runId: string) => Promise<void>;
|
|
|
11
11
|
export declare class RunQueue {
|
|
12
12
|
private readonly concurrency;
|
|
13
13
|
private readonly pending;
|
|
14
|
+
private readonly pendingSet;
|
|
14
15
|
private readonly active;
|
|
15
16
|
private executor;
|
|
16
17
|
private draining;
|
package/dist/run/RunQueue.js
CHANGED
|
@@ -6,7 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export class RunQueue {
|
|
8
8
|
concurrency;
|
|
9
|
+
// `pending` keeps FIFO order; `pendingSet` mirrors its membership for O(1)
|
|
10
|
+
// dedup/lookup (the array's includes() was O(n)).
|
|
9
11
|
pending = [];
|
|
12
|
+
pendingSet = new Set();
|
|
10
13
|
active = new Set();
|
|
11
14
|
executor = null;
|
|
12
15
|
draining = false;
|
|
@@ -17,15 +20,17 @@ export class RunQueue {
|
|
|
17
20
|
this.executor = fn;
|
|
18
21
|
}
|
|
19
22
|
enqueue(runId) {
|
|
20
|
-
if (this.
|
|
23
|
+
if (this.pendingSet.has(runId) || this.active.has(runId))
|
|
21
24
|
return;
|
|
22
25
|
this.pending.push(runId);
|
|
26
|
+
this.pendingSet.add(runId);
|
|
23
27
|
this.drain();
|
|
24
28
|
}
|
|
25
29
|
cancel(runId) {
|
|
26
30
|
const idx = this.pending.indexOf(runId);
|
|
27
31
|
if (idx !== -1) {
|
|
28
32
|
this.pending.splice(idx, 1);
|
|
33
|
+
this.pendingSet.delete(runId);
|
|
29
34
|
return true;
|
|
30
35
|
}
|
|
31
36
|
return false;
|
|
@@ -34,7 +39,7 @@ export class RunQueue {
|
|
|
34
39
|
return this.active.has(runId);
|
|
35
40
|
}
|
|
36
41
|
isPending(runId) {
|
|
37
|
-
return this.
|
|
42
|
+
return this.pendingSet.has(runId);
|
|
38
43
|
}
|
|
39
44
|
get activeCount() {
|
|
40
45
|
return this.active.size;
|
|
@@ -57,6 +62,7 @@ export class RunQueue {
|
|
|
57
62
|
return;
|
|
58
63
|
while (this.active.size < this.concurrency && this.pending.length > 0) {
|
|
59
64
|
const runId = this.pending.shift();
|
|
65
|
+
this.pendingSet.delete(runId);
|
|
60
66
|
this.active.add(runId);
|
|
61
67
|
this.executor(runId)
|
|
62
68
|
.catch((err) => {
|
package/dist/run/factory.d.ts
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* ```
|
|
19
19
|
*/
|
|
20
20
|
import type { LLMConfig, PermissionMode } from "../types.js";
|
|
21
|
-
import type { EngineConfig, EngineHookConfig } from "../engine/
|
|
21
|
+
import type { EngineConfig, EngineHookConfig } from "../engine/types.js";
|
|
22
22
|
import type { Evaluator } from "./Evaluator.js";
|
|
23
23
|
import { RunManager } from "./RunManager.js";
|
|
24
24
|
export interface CreateRunManagerOptions {
|
|
@@ -56,6 +56,13 @@ export interface CreateRunManagerOptions {
|
|
|
56
56
|
defaultTags?: string[];
|
|
57
57
|
/** Metadata merged into every submitted run. Submit input wins on conflicts. */
|
|
58
58
|
defaultMetadata?: Record<string, unknown>;
|
|
59
|
+
/**
|
|
60
|
+
* Override the approval backend for every run. Used by unattended hosts
|
|
61
|
+
* (automation/cron) that must auto-decide without a UI — e.g.
|
|
62
|
+
* `new HeadlessApprovalBackend("approve-read-only")`. When unset, runs use
|
|
63
|
+
* the interactive run-aware backend.
|
|
64
|
+
*/
|
|
65
|
+
approvalBackend?: import("../tool-system/permission.js").ApprovalBackend;
|
|
59
66
|
}
|
|
60
67
|
/**
|
|
61
68
|
* Create a fully configured RunManager with one call.
|
package/dist/run/factory.js
CHANGED
|
@@ -41,6 +41,7 @@ export function createRunManager(options) {
|
|
|
41
41
|
customSystemPrompt: options.customSystemPrompt,
|
|
42
42
|
appendSystemPrompt: options.appendSystemPrompt,
|
|
43
43
|
hooks: options.hooks,
|
|
44
|
+
...(options.approvalBackend ? { approvalBackend: options.approvalBackend } : {}),
|
|
44
45
|
},
|
|
45
46
|
concurrency: options.concurrency ?? 1,
|
|
46
47
|
runsDir,
|
package/dist/run/index.d.ts
CHANGED
|
@@ -9,9 +9,9 @@ export { RunQueue } from "./RunQueue.js";
|
|
|
9
9
|
export { RunApprovalBackend, createRunAskUserFn, type RunLifecycleHooks, type PendingApproval, type PendingInput, } from "./RunApprovalBackend.js";
|
|
10
10
|
export { CheckpointWriter, type CheckpointWriterConfig } from "./CheckpointWriter.js";
|
|
11
11
|
export { ArtifactTracker, type ArtifactTrackerConfig } from "./ArtifactTracker.js";
|
|
12
|
-
export { RunLock, type RunLockConfig } from "./RunLock.js";
|
|
12
|
+
export { RunLock, type RunLockConfig, type RunLockAcquireResult } from "./RunLock.js";
|
|
13
13
|
export { Heartbeat, type HeartbeatConfig, type HeartbeatData } from "./Heartbeat.js";
|
|
14
14
|
export { NoopEvaluator, CompositeEvaluator, type Evaluator, type EvaluatorResult, type EvaluatorVerdict, type EvaluatorContext, } from "./Evaluator.js";
|
|
15
|
-
export { EngineRunner, type EngineRunnerConfig, type RunExecutionHandle, type RunExecutor, type CustomToolEntry, } from "./EngineRunner.js";
|
|
15
|
+
export { EngineRunner, AUTOMATION_PROMPT_NOTE, AUTOMATION_RUN_SOURCE, type EngineRunnerConfig, type RunExecutionHandle, type RunExecutor, type CustomToolEntry, } from "./EngineRunner.js";
|
|
16
16
|
export { RunManager, type RunManagerConfig } from "./RunManager.js";
|
|
17
17
|
export { createRunManager, type CreateRunManagerOptions } from "./factory.js";
|
package/dist/run/index.js
CHANGED
|
@@ -16,7 +16,7 @@ export { Heartbeat } from "./Heartbeat.js";
|
|
|
16
16
|
// Evaluator
|
|
17
17
|
export { NoopEvaluator, CompositeEvaluator, } from "./Evaluator.js";
|
|
18
18
|
// Runner
|
|
19
|
-
export { EngineRunner, } from "./EngineRunner.js";
|
|
19
|
+
export { EngineRunner, AUTOMATION_PROMPT_NOTE, AUTOMATION_RUN_SOURCE, } from "./EngineRunner.js";
|
|
20
20
|
// Manager
|
|
21
21
|
export { RunManager } from "./RunManager.js";
|
|
22
22
|
// Factory
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract the file target of a trailing shell redirect (`> file` / `>> file`).
|
|
3
|
+
* Handles quoted paths with spaces — the old /> \s*(\S+)\s*$/ matched only the
|
|
4
|
+
* first non-whitespace run, so `> "my file.txt"` yielded `"my`
|
|
5
|
+
* (review-2026-05-30). Returns undefined when there's no trailing redirect.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseRedirectTarget(command: string): string | undefined;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract the file target of a trailing shell redirect (`> file` / `>> file`).
|
|
3
|
+
* Handles quoted paths with spaces — the old /> \s*(\S+)\s*$/ matched only the
|
|
4
|
+
* first non-whitespace run, so `> "my file.txt"` yielded `"my`
|
|
5
|
+
* (review-2026-05-30). Returns undefined when there's no trailing redirect.
|
|
6
|
+
*/
|
|
7
|
+
export function parseRedirectTarget(command) {
|
|
8
|
+
// Optional quote captured in group 1; body in group 2 (or unquoted in 3).
|
|
9
|
+
const m = command.match(/>>?\s*(?:(['"])(.*?)\1|(\S+))\s*$/);
|
|
10
|
+
if (!m)
|
|
11
|
+
return undefined;
|
|
12
|
+
return m[2] !== undefined ? m[2] : m[3];
|
|
13
|
+
}
|
package/dist/run/types.js
CHANGED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BackgroundShellManager — session-scoped registry + lifecycle for
|
|
3
|
+
* fire-and-forget background shells (design §4).
|
|
4
|
+
*
|
|
5
|
+
* A background shell is a long-lived process (typically `npm run dev`)
|
|
6
|
+
* started via `Bash(run_in_background=true)`. Unlike the foreground Bash
|
|
7
|
+
* path (which awaits the command to completion), this:
|
|
8
|
+
*
|
|
9
|
+
* - spawns the command **detached** so it owns its own process group
|
|
10
|
+
* (so KillShell can reap the whole `sh → npm → node vite` tree, §难点2);
|
|
11
|
+
* - returns a `shell_id` immediately, never blocking the turn;
|
|
12
|
+
* - streams output to an in-memory ring buffer + a wrap-around disk file,
|
|
13
|
+
* stripping ANSI/progress noise only when handed to the agent (§难点4);
|
|
14
|
+
* - detects a served port best-effort from the output (§难点3);
|
|
15
|
+
* - is **completely separate** from `asyncAgentRegistry` so Engine.run's
|
|
16
|
+
* wait-for-background loop never waits on a dev server (§难点5);
|
|
17
|
+
* - on exit, enqueues a one-line completion notification (no output body,
|
|
18
|
+
* §难点6 / D6) keyed by sessionId.
|
|
19
|
+
*
|
|
20
|
+
* Lifetime is process-local and session-scoped: `killSession(sid)` on
|
|
21
|
+
* explicit session deletion, `killAll()` on app/worker exit. Crashing the
|
|
22
|
+
* worker leaks the detached children as orphans — pidfiles let a restarted
|
|
23
|
+
* worker discover and reap them (§难点1, `reapOrphansFromPidfiles`).
|
|
24
|
+
*/
|
|
25
|
+
import type { SandboxBackend } from "../tool-system/sandbox/index.js";
|
|
26
|
+
export type BgShellStatus = "starting" | "running" | "exited" | "killed" | "orphaned";
|
|
27
|
+
/** Per-session soft cap on background shells (design §7 — fork-bomb guard). */
|
|
28
|
+
export declare const MAX_SHELLS_PER_SESSION = 16;
|
|
29
|
+
interface PidfileRecord {
|
|
30
|
+
shellId: string;
|
|
31
|
+
pgid: number;
|
|
32
|
+
command: string;
|
|
33
|
+
port?: number;
|
|
34
|
+
startedAt: number;
|
|
35
|
+
sessionId: string;
|
|
36
|
+
}
|
|
37
|
+
export interface BgShell {
|
|
38
|
+
shellId: string;
|
|
39
|
+
sessionId: string;
|
|
40
|
+
command: string;
|
|
41
|
+
cwd: string;
|
|
42
|
+
pgid: number;
|
|
43
|
+
status: BgShellStatus;
|
|
44
|
+
startedAt: number;
|
|
45
|
+
exitedAt?: number;
|
|
46
|
+
exitCode: number | null;
|
|
47
|
+
signal: NodeJS.Signals | null;
|
|
48
|
+
detectedPort?: number;
|
|
49
|
+
/** Absolute stream position (RingFile.totalWritten) already returned to the
|
|
50
|
+
* agent. Absolute — not window-relative — so it survives ring wraparound. */
|
|
51
|
+
agentReadOffset: number;
|
|
52
|
+
/** Total bytes the shell has written so far (monotonic, survives ring
|
|
53
|
+
* wraparound). Lets the UI show live progress for long jobs like downloads
|
|
54
|
+
* ("↑ 1.1 GB") even though the panel doesn't parse the output itself. */
|
|
55
|
+
totalBytes: number;
|
|
56
|
+
didWrap: boolean;
|
|
57
|
+
diskAvailable: boolean;
|
|
58
|
+
}
|
|
59
|
+
export interface SpawnBackgroundOptions {
|
|
60
|
+
command: string;
|
|
61
|
+
cwd: string;
|
|
62
|
+
sessionId: string;
|
|
63
|
+
shell?: string;
|
|
64
|
+
sandbox?: SandboxBackend;
|
|
65
|
+
/**
|
|
66
|
+
* Project `localEnvironment.env` to layer on top of the base shell env
|
|
67
|
+
* (see mergeShellEnv). Same source as the foreground Bash tool's
|
|
68
|
+
* `ctx.shellEnv` — passed through so a background dev server sees the same
|
|
69
|
+
* project env as a one-shot command.
|
|
70
|
+
*/
|
|
71
|
+
shellEnv?: Record<string, string>;
|
|
72
|
+
}
|
|
73
|
+
export type SpawnResult = {
|
|
74
|
+
ok: true;
|
|
75
|
+
shellId: string;
|
|
76
|
+
} | {
|
|
77
|
+
ok: false;
|
|
78
|
+
error: string;
|
|
79
|
+
};
|
|
80
|
+
export type ReadResult = {
|
|
81
|
+
ok: true;
|
|
82
|
+
text: string;
|
|
83
|
+
header: string;
|
|
84
|
+
} | {
|
|
85
|
+
ok: false;
|
|
86
|
+
error: string;
|
|
87
|
+
};
|
|
88
|
+
export type KillResult = {
|
|
89
|
+
ok: true;
|
|
90
|
+
alreadyExited?: boolean;
|
|
91
|
+
status: BgShellStatus;
|
|
92
|
+
} | {
|
|
93
|
+
ok: false;
|
|
94
|
+
error: string;
|
|
95
|
+
};
|
|
96
|
+
export declare class BackgroundShellManager {
|
|
97
|
+
private shells;
|
|
98
|
+
spawnBackground(opts: SpawnBackgroundOptions): SpawnResult;
|
|
99
|
+
private finalize;
|
|
100
|
+
private enqueueExitNotification;
|
|
101
|
+
private updatePidfilePort;
|
|
102
|
+
get(shellId: string): BgShell | undefined;
|
|
103
|
+
/** Raw retained output (no cleaning) — test/UI helper. */
|
|
104
|
+
readOutputRaw(shellId: string): string | undefined;
|
|
105
|
+
listForSession(sessionId: string): BgShell[];
|
|
106
|
+
/**
|
|
107
|
+
* Read a shell's output. `mode=incremental` (default) returns text since the
|
|
108
|
+
* agent's last read; `mode=all` returns the full retained buffer. Output is
|
|
109
|
+
* ANSI-stripped and progress-folded, capped at the last READ_RETURN_CAP
|
|
110
|
+
* chars. `expectSessionId`, when given, enforces session ownership.
|
|
111
|
+
*/
|
|
112
|
+
readOutput(shellId: string, mode?: "incremental" | "all", expectSessionId?: string): ReadResult;
|
|
113
|
+
/**
|
|
114
|
+
* Build the status header line for a readOutput result. `mode` shapes the cap
|
|
115
|
+
* note: `all` keeps the trailing 16KB (older output omitted from THIS view),
|
|
116
|
+
* while incremental paginates (more output available on the next read).
|
|
117
|
+
*/
|
|
118
|
+
private buildHeader;
|
|
119
|
+
/** Terminate a shell (its whole process group). Idempotent. */
|
|
120
|
+
kill(shellId: string, expectSessionId?: string): Promise<KillResult>;
|
|
121
|
+
/** Kill every background shell belonging to `sessionId`. */
|
|
122
|
+
killSession(sessionId: string): Promise<void>;
|
|
123
|
+
/** Kill every background shell (app/worker exit). */
|
|
124
|
+
killAll(): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Scan pidfiles left by a previous (crashed) worker. For each: if the pgid
|
|
127
|
+
* is still alive it's an orphan (the dev server outlived its worker) — list
|
|
128
|
+
* it as `orphaned` so KillShell can clean it up; if dead, delete the stale
|
|
129
|
+
* pidfile. Returns the orphaned records found.
|
|
130
|
+
*/
|
|
131
|
+
reapOrphansFromPidfiles(): PidfileRecord[];
|
|
132
|
+
private registerOrphan;
|
|
133
|
+
/** Test/reset helper — clears the registry without killing (used in tests). */
|
|
134
|
+
_clear(): void;
|
|
135
|
+
private toPublic;
|
|
136
|
+
}
|
|
137
|
+
/** Process-local singleton, mirroring asyncAgentRegistry's lifetime contract. */
|
|
138
|
+
export declare const backgroundShellManager: BackgroundShellManager;
|
|
139
|
+
export {};
|