@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
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { readFileSync, existsSync, readdirSync, statSync, openSync, readSync, closeSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { encodeCwd } from "./session-discovery.js";
|
|
5
|
+
/**
|
|
6
|
+
* #6 — attribute file changes made by a background external agent (DriveAgent
|
|
7
|
+
* running `claude` / `codex`). Those Edit/Write calls land in the external CLI's
|
|
8
|
+
* own transcript, invisible to the host's in-session file-change aggregator.
|
|
9
|
+
* Given the external session id + cwd, locate that transcript and extract the
|
|
10
|
+
* set of changed files, so the UI can show "N files edited" for the run.
|
|
11
|
+
*
|
|
12
|
+
* Read-only; tolerant — a malformed line is skipped, a missing transcript
|
|
13
|
+
* returns []. Never throws for the caller.
|
|
14
|
+
*/
|
|
15
|
+
const CLAUDE_WRITE_TOOLS = new Set(["Write", "Edit", "MultiEdit", "NotebookEdit"]);
|
|
16
|
+
const CODEX_WRITE_TOOLS = new Set(["apply_patch", "ApplyPatch", "write_file", "edit_file"]);
|
|
17
|
+
/** Pull the changed-file path out of a claude tool_use input block. */
|
|
18
|
+
function claudeInputPath(input) {
|
|
19
|
+
if (!input || typeof input !== "object")
|
|
20
|
+
return undefined;
|
|
21
|
+
const o = input;
|
|
22
|
+
const p = o.file_path ?? o.notebook_path;
|
|
23
|
+
return typeof p === "string" && p.length > 0 ? p : undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse claude transcript JSONL text → deduped list of changed file paths.
|
|
27
|
+
* Each line is `{ message: { content: [{ type:"tool_use", name, input }] } }`.
|
|
28
|
+
* Exported for direct unit testing without a transcript file on disk.
|
|
29
|
+
*/
|
|
30
|
+
export function extractChangedFilesFromClaudeLines(text) {
|
|
31
|
+
const seen = new Set();
|
|
32
|
+
for (const line of text.split("\n")) {
|
|
33
|
+
if (!line.trim())
|
|
34
|
+
continue;
|
|
35
|
+
let d;
|
|
36
|
+
try {
|
|
37
|
+
d = JSON.parse(line);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const content = d?.message?.content;
|
|
43
|
+
if (!Array.isArray(content))
|
|
44
|
+
continue;
|
|
45
|
+
for (const block of content) {
|
|
46
|
+
if (block &&
|
|
47
|
+
typeof block === "object" &&
|
|
48
|
+
block.type === "tool_use" &&
|
|
49
|
+
CLAUDE_WRITE_TOOLS.has(block.name ?? "")) {
|
|
50
|
+
const p = claudeInputPath(block.input);
|
|
51
|
+
if (p)
|
|
52
|
+
seen.add(p);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return [...seen];
|
|
57
|
+
}
|
|
58
|
+
/** Locate `<claudeHome>/projects/<encodeCwd(cwd)>/<sid>.jsonl` and extract changes. */
|
|
59
|
+
export function readClaudeChangedFiles(cwd, sessionId, claudeHome = join(homedir(), ".claude")) {
|
|
60
|
+
const file = join(claudeHome, "projects", encodeCwd(cwd), `${sessionId}.jsonl`);
|
|
61
|
+
if (!existsSync(file))
|
|
62
|
+
return [];
|
|
63
|
+
let text;
|
|
64
|
+
try {
|
|
65
|
+
text = readFileSync(file, "utf-8");
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
return extractChangedFilesFromClaudeLines(text);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parse codex rollout JSONL text → changed file paths. Codex tool calls are
|
|
74
|
+
* `{type:"response_item", payload:{type:"function_call", name, arguments}}` or
|
|
75
|
+
* `{...custom_tool_call, input}`. apply_patch carries the patch text; write/edit
|
|
76
|
+
* carry a file path in arguments. Exported for unit testing.
|
|
77
|
+
*/
|
|
78
|
+
export function extractChangedFilesFromCodexLines(text) {
|
|
79
|
+
const seen = new Set();
|
|
80
|
+
for (const line of text.split("\n")) {
|
|
81
|
+
if (!line.trim())
|
|
82
|
+
continue;
|
|
83
|
+
let d;
|
|
84
|
+
try {
|
|
85
|
+
d = JSON.parse(line);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (d?.type !== "response_item" || !d.payload)
|
|
91
|
+
continue;
|
|
92
|
+
const p = d.payload;
|
|
93
|
+
const name = typeof p.name === "string" ? p.name : "";
|
|
94
|
+
if (!CODEX_WRITE_TOOLS.has(name))
|
|
95
|
+
continue;
|
|
96
|
+
// function_call.arguments is a JSON string; custom_tool_call.input a string.
|
|
97
|
+
const rawArgs = typeof p.arguments === "string" ? p.arguments : typeof p.input === "string" ? p.input : "";
|
|
98
|
+
for (const f of filesFromCodexArgs(name, rawArgs))
|
|
99
|
+
seen.add(f);
|
|
100
|
+
}
|
|
101
|
+
return [...seen];
|
|
102
|
+
}
|
|
103
|
+
/** Pull file paths out of a codex tool's arguments string. */
|
|
104
|
+
function filesFromCodexArgs(name, raw) {
|
|
105
|
+
if (!raw)
|
|
106
|
+
return [];
|
|
107
|
+
if (name === "apply_patch" || name === "ApplyPatch") {
|
|
108
|
+
// apply_patch payload wraps a patch; headers look like `*** Update File: <p>`
|
|
109
|
+
// or `*** Add File: <p>`. Match those directly off the raw text.
|
|
110
|
+
const out = [];
|
|
111
|
+
const re = /\*\*\*\s+(?:Update|Add|Delete) File:\s+(.+)/g;
|
|
112
|
+
let m;
|
|
113
|
+
while ((m = re.exec(raw)) !== null) {
|
|
114
|
+
const f = m[1]?.trim();
|
|
115
|
+
if (f)
|
|
116
|
+
out.push(f);
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const a = JSON.parse(raw);
|
|
122
|
+
const p = a.file_path ?? a.path;
|
|
123
|
+
return typeof p === "string" && p ? [p] : [];
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Locate a codex rollout by threadId+cwd under `<codexHome>/sessions` and extract changes. */
|
|
130
|
+
export function readCodexChangedFiles(cwd, threadId, codexHome = join(homedir(), ".codex")) {
|
|
131
|
+
const file = findRolloutFile(codexHome, cwd, threadId);
|
|
132
|
+
if (!file)
|
|
133
|
+
return [];
|
|
134
|
+
let text;
|
|
135
|
+
try {
|
|
136
|
+
text = readFileSync(file, "utf-8");
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
return extractChangedFilesFromCodexLines(text);
|
|
142
|
+
}
|
|
143
|
+
/** Dispatch by CLI. Unknown cli → []. Never throws. */
|
|
144
|
+
export function readExternalChangedFiles(cli, cwd, sessionId) {
|
|
145
|
+
try {
|
|
146
|
+
if (cli === "codex")
|
|
147
|
+
return readCodexChangedFiles(cwd, sessionId);
|
|
148
|
+
return readClaudeChangedFiles(cwd, sessionId);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ── codex rollout location (mirrors codex-session-history.ts) ──────────────
|
|
155
|
+
function findRolloutFile(codexHome, cwd, threadId) {
|
|
156
|
+
const root = join(codexHome, "sessions");
|
|
157
|
+
if (!existsSync(root))
|
|
158
|
+
return undefined;
|
|
159
|
+
for (const file of walkRollouts(root)) {
|
|
160
|
+
let meta;
|
|
161
|
+
try {
|
|
162
|
+
meta = readSessionMeta(file);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (meta && meta.id === threadId && meta.cwd === cwd)
|
|
168
|
+
return file;
|
|
169
|
+
}
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
function* walkRollouts(root) {
|
|
173
|
+
let entries;
|
|
174
|
+
try {
|
|
175
|
+
entries = readdirSync(root);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
for (const name of entries) {
|
|
181
|
+
const full = join(root, name);
|
|
182
|
+
let st;
|
|
183
|
+
try {
|
|
184
|
+
st = statSync(full);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (st.isDirectory())
|
|
190
|
+
yield* walkRollouts(full);
|
|
191
|
+
else if (name.startsWith("rollout-") && name.endsWith(".jsonl"))
|
|
192
|
+
yield full;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function readSessionMeta(file, maxBytes = 1 << 16) {
|
|
196
|
+
const fd = openSync(file, "r");
|
|
197
|
+
let text;
|
|
198
|
+
try {
|
|
199
|
+
const buf = Buffer.alloc(maxBytes);
|
|
200
|
+
const n = readSync(fd, buf, 0, maxBytes, 0);
|
|
201
|
+
text = buf.toString("utf-8", 0, n);
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
closeSync(fd);
|
|
205
|
+
}
|
|
206
|
+
const nl = text.indexOf("\n");
|
|
207
|
+
const first = (nl === -1 ? text : text.slice(0, nl)).trim();
|
|
208
|
+
if (!first)
|
|
209
|
+
return undefined;
|
|
210
|
+
const d = JSON.parse(first);
|
|
211
|
+
if (d.type !== "session_meta" || !d.payload)
|
|
212
|
+
return undefined;
|
|
213
|
+
return { id: d.payload.id, cwd: d.payload.cwd };
|
|
214
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AgentAdapter, BuildArgsOpts, PermissionMode } from "./agent-adapter.js";
|
|
2
|
+
export interface AgentRunResult {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
finalText: string;
|
|
5
|
+
isError: boolean;
|
|
6
|
+
exitCode: number | null;
|
|
7
|
+
lines: string[];
|
|
8
|
+
}
|
|
9
|
+
/** Pure: reduce collected output lines + exit code to a result. Unit-testable. */
|
|
10
|
+
export declare function runWithLines(adapter: AgentAdapter, lines: string[], exitCode: number | null): AgentRunResult;
|
|
11
|
+
export interface DriverRunOpts extends Omit<BuildArgsOpts, "permissionMode"> {
|
|
12
|
+
permissionMode?: PermissionMode;
|
|
13
|
+
}
|
|
14
|
+
/** Spawn ONE headless agent run, collect stream-json to exit, return result.
|
|
15
|
+
* No time concept — a single turn. Honors AbortSignal (kills the child). */
|
|
16
|
+
export declare function runAgentOnce(adapter: AgentAdapter, opts: DriverRunOpts & {
|
|
17
|
+
command: string;
|
|
18
|
+
}, signal?: AbortSignal): Promise<AgentRunResult>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import { pathWithCommonBins } from "./cc-capability.js";
|
|
4
|
+
/** Pure: reduce collected output lines + exit code to a result. Unit-testable. */
|
|
5
|
+
export function runWithLines(adapter, lines, exitCode) {
|
|
6
|
+
const parsed = adapter.parseResult(lines);
|
|
7
|
+
return { ...parsed, exitCode, lines };
|
|
8
|
+
}
|
|
9
|
+
/** Spawn ONE headless agent run, collect stream-json to exit, return result.
|
|
10
|
+
* No time concept — a single turn. Honors AbortSignal (kills the child). */
|
|
11
|
+
export function runAgentOnce(adapter, opts, signal) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const args = adapter.buildArgs({
|
|
14
|
+
prompt: opts.prompt,
|
|
15
|
+
resumeSessionId: opts.resumeSessionId,
|
|
16
|
+
permissionMode: opts.permissionMode ?? "default",
|
|
17
|
+
cwd: opts.cwd,
|
|
18
|
+
});
|
|
19
|
+
// claude takes the prompt in argv (`-p <prompt>`) and wants stdin closed
|
|
20
|
+
// (verified: avoids a 3s wait). codex `exec` reads the prompt from stdin
|
|
21
|
+
// (argv ends with `-`), so adapters that set promptViaStdin get a piped
|
|
22
|
+
// stdin we write the prompt to.
|
|
23
|
+
const viaStdin = adapter.promptViaStdin === true;
|
|
24
|
+
const child = spawn(opts.command, args, {
|
|
25
|
+
cwd: opts.cwd,
|
|
26
|
+
env: { ...process.env, PATH: pathWithCommonBins() },
|
|
27
|
+
// NOT detached: this child is owned by the (long-lived) worker that reads
|
|
28
|
+
// its stdout. Detaching orphaned it across a worker/app restart — the
|
|
29
|
+
// reader promise then never resolved and the completion notification never
|
|
30
|
+
// fired (the "后台任务没返回" bug). Bound to the worker, it lives or dies
|
|
31
|
+
// with the process that's actually listening for its result.
|
|
32
|
+
detached: false,
|
|
33
|
+
stdio: [viaStdin ? "pipe" : "ignore", "pipe", "pipe"],
|
|
34
|
+
});
|
|
35
|
+
if (viaStdin && child.stdin) {
|
|
36
|
+
child.stdin.end(opts.prompt);
|
|
37
|
+
}
|
|
38
|
+
const lines = [];
|
|
39
|
+
if (child.stdout) {
|
|
40
|
+
const rl = createInterface({ input: child.stdout });
|
|
41
|
+
rl.on("line", (line) => lines.push(line));
|
|
42
|
+
}
|
|
43
|
+
// Not detached → no own process group, so kill the child directly (a
|
|
44
|
+
// negative-pid group kill would target the worker's group). claude has no
|
|
45
|
+
// long-lived child tree of its own here, so a direct SIGTERM is sufficient.
|
|
46
|
+
const onAbort = () => {
|
|
47
|
+
try {
|
|
48
|
+
child.kill("SIGTERM");
|
|
49
|
+
}
|
|
50
|
+
catch { /* already gone */ }
|
|
51
|
+
};
|
|
52
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
53
|
+
child.on("error", (err) => {
|
|
54
|
+
signal?.removeEventListener("abort", onAbort);
|
|
55
|
+
// A missing binary is the most common failure (user hasn't installed the
|
|
56
|
+
// CLI, or GUI-launched Electron's PATH misses it). Turn the cryptic
|
|
57
|
+
// "spawn codex ENOENT" into something actionable that names the command.
|
|
58
|
+
if (err.code === "ENOENT") {
|
|
59
|
+
reject(new Error(`未找到命令 "${opts.command}"。请先安装该 CLI 并确保它在 PATH 中(${adapter.kind === "codex" ? "Codex CLI" : "Claude Code CLI"})。`));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
reject(err);
|
|
63
|
+
});
|
|
64
|
+
child.on("exit", (code) => {
|
|
65
|
+
signal?.removeEventListener("abort", onAbort);
|
|
66
|
+
resolve(runWithLines(adapter, lines, code));
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./cc-capability.js";
|
|
2
|
+
export * from "./agent-adapter.js";
|
|
3
|
+
export * from "./external-agent-driver.js";
|
|
4
|
+
export * from "./session-discovery.js";
|
|
5
|
+
export * from "./codex-session-discovery.js";
|
|
6
|
+
export * from "./relevance-judge.js";
|
|
7
|
+
export * from "./session-history.js";
|
|
8
|
+
export * from "./codex-session-history.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./cc-capability.js";
|
|
2
|
+
export * from "./agent-adapter.js";
|
|
3
|
+
export * from "./external-agent-driver.js";
|
|
4
|
+
export * from "./session-discovery.js";
|
|
5
|
+
export * from "./codex-session-discovery.js";
|
|
6
|
+
export * from "./relevance-judge.js";
|
|
7
|
+
export * from "./session-history.js";
|
|
8
|
+
export * from "./codex-session-history.js";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface JudgeDecision {
|
|
2
|
+
action: "continue-same" | "continue-fresh" | "stop";
|
|
3
|
+
handoffSummary?: string;
|
|
4
|
+
reason: string;
|
|
5
|
+
}
|
|
6
|
+
export interface JudgeInput {
|
|
7
|
+
goal?: string;
|
|
8
|
+
lastResult: string;
|
|
9
|
+
nextPrompt: string;
|
|
10
|
+
}
|
|
11
|
+
/** Injected aux-model call: takes a prompt, returns raw text. */
|
|
12
|
+
export type AuxLlm = (prompt: string) => Promise<string>;
|
|
13
|
+
export declare function buildJudgePrompt(input: JudgeInput): string;
|
|
14
|
+
export declare function parseJudgeResponse(raw: string): JudgeDecision;
|
|
15
|
+
export declare function judgeContinuation(input: JudgeInput, llm: AuxLlm): Promise<JudgeDecision>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const SYSTEM = `You decide how a scheduled task loop should continue after one run.
|
|
2
|
+
Reply with ONLY a JSON object: {"action": "continue-same"|"continue-fresh"|"stop", "handoffSummary"?: string, "reason": string}.
|
|
3
|
+
- "stop": the goal is met; no more runs needed.
|
|
4
|
+
- "continue-same": next run should resume the SAME session (work is related, keep context).
|
|
5
|
+
- "continue-fresh": next run should start a FRESH session because the next step is unrelated to what was just done; put a short context summary in handoffSummary.`;
|
|
6
|
+
export function buildJudgePrompt(input) {
|
|
7
|
+
return [
|
|
8
|
+
SYSTEM,
|
|
9
|
+
input.goal ? `\nOverall goal: ${input.goal}` : "",
|
|
10
|
+
`\nWhat the last run produced:\n${input.lastResult.slice(0, 4000)}`,
|
|
11
|
+
`\nThe next scheduled prompt:\n${input.nextPrompt}`,
|
|
12
|
+
`\nDecision JSON:`,
|
|
13
|
+
].join("\n");
|
|
14
|
+
}
|
|
15
|
+
export function parseJudgeResponse(raw) {
|
|
16
|
+
try {
|
|
17
|
+
const m = raw.match(/\{[\s\S]*\}/);
|
|
18
|
+
const d = JSON.parse(m ? m[0] : raw);
|
|
19
|
+
if (d.action === "stop" || d.action === "continue-fresh" || d.action === "continue-same") {
|
|
20
|
+
return { action: d.action, handoffSummary: typeof d.handoffSummary === "string" ? d.handoffSummary : undefined, reason: typeof d.reason === "string" ? d.reason : "" };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch { /* fall through */ }
|
|
24
|
+
return { action: "continue-same", reason: "unparseable judge output; defaulting to continue-same" };
|
|
25
|
+
}
|
|
26
|
+
export async function judgeContinuation(input, llm) {
|
|
27
|
+
const raw = await llm(buildJudgePrompt(input));
|
|
28
|
+
return parseJudgeResponse(raw);
|
|
29
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Encode a cwd to claude's project dir name: every non-[A-Za-z0-9] char → '-'.
|
|
2
|
+
* Mirrors `~/.claude/projects/<encoded>` (verified against real layout). */
|
|
3
|
+
export declare function encodeCwd(cwd: string): string;
|
|
4
|
+
export interface DiscoveredSession {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
firstMessage: string;
|
|
7
|
+
lastModified: number;
|
|
8
|
+
messageCount: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Bound how many sessions a discovery scan deep-reads + returns. Without this,
|
|
12
|
+
* `discoverSessions` read EVERY `.jsonl` file fully (title + message count) on
|
|
13
|
+
* every list open — O(all history) work that makes the CC/Codex room list slow
|
|
14
|
+
* and unwieldy once a project accumulates sessions. The default surfaces only
|
|
15
|
+
* the recent, useful slice; the UI fetches older ones on demand by passing a
|
|
16
|
+
* larger `limit` (or `sinceMs: 0`).
|
|
17
|
+
*/
|
|
18
|
+
export interface DiscoverOptions {
|
|
19
|
+
/** Max sessions to return (after the recency filter), newest first.
|
|
20
|
+
* undefined or <= 0 = no cap. */
|
|
21
|
+
limit?: number;
|
|
22
|
+
/** Only include sessions modified within this many ms of `now`.
|
|
23
|
+
* undefined or <= 0 = no window. */
|
|
24
|
+
sinceMs?: number;
|
|
25
|
+
/** Injectable clock for tests. Defaults to Date.now(). */
|
|
26
|
+
now?: number;
|
|
27
|
+
}
|
|
28
|
+
/** Default room-list window: last 2 weeks AND at most 20 — the intersection. */
|
|
29
|
+
export declare const DEFAULT_DISCOVER_LIMIT = 20;
|
|
30
|
+
export declare const DEFAULT_DISCOVER_SINCE_MS: number;
|
|
31
|
+
/**
|
|
32
|
+
* Apply the recency window + limit to mtime-sorted stats, returning the slice to
|
|
33
|
+
* deep-read. Shared by the claude + codex discovery paths so they bound work
|
|
34
|
+
* identically. `total` (caller-side) lets the UI show a "load more" affordance.
|
|
35
|
+
*/
|
|
36
|
+
export declare function selectRecentStats<T extends {
|
|
37
|
+
mtimeMs: number;
|
|
38
|
+
}>(stats: T[], opts?: DiscoverOptions): T[];
|
|
39
|
+
/** List claude sessions for `cwd`. `claudeHome` defaults to ~/.claude (override
|
|
40
|
+
* for tests). Read-only, on-demand scan; no index. Stats every file cheaply,
|
|
41
|
+
* then deep-reads (title + count) ONLY the recent slice (opts) so an old,
|
|
42
|
+
* large history doesn't get fully read on every list open. */
|
|
43
|
+
export declare function discoverSessions(cwd: string, claudeHome?: string, opts?: DiscoverOptions): DiscoveredSession[];
|
|
44
|
+
/** Count of all session files for `cwd`, cheaply (stat only). Lets the UI know
|
|
45
|
+
* whether a bounded `discoverSessions` left older sessions unshown. */
|
|
46
|
+
export declare function countSessions(cwd: string, claudeHome?: string): number;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, statSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
/** Encode a cwd to claude's project dir name: every non-[A-Za-z0-9] char → '-'.
|
|
5
|
+
* Mirrors `~/.claude/projects/<encoded>` (verified against real layout). */
|
|
6
|
+
export function encodeCwd(cwd) {
|
|
7
|
+
return cwd.replace(/[^A-Za-z0-9]/g, "-");
|
|
8
|
+
}
|
|
9
|
+
/** Default room-list window: last 2 weeks AND at most 20 — the intersection. */
|
|
10
|
+
export const DEFAULT_DISCOVER_LIMIT = 20;
|
|
11
|
+
export const DEFAULT_DISCOVER_SINCE_MS = 14 * 24 * 60 * 60 * 1000;
|
|
12
|
+
function claudeProjectsDir(claudeHome) {
|
|
13
|
+
return join(claudeHome, "projects");
|
|
14
|
+
}
|
|
15
|
+
/** Extract first *real* user message text, skipping caveat/command noise. */
|
|
16
|
+
function firstUserMessage(lines) {
|
|
17
|
+
for (const line of lines) {
|
|
18
|
+
if (!line.trim())
|
|
19
|
+
continue;
|
|
20
|
+
let d;
|
|
21
|
+
try {
|
|
22
|
+
d = JSON.parse(line);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (d.type !== "user")
|
|
28
|
+
continue;
|
|
29
|
+
const c = d.message?.content;
|
|
30
|
+
const text = typeof c === "string"
|
|
31
|
+
? c
|
|
32
|
+
: Array.isArray(c)
|
|
33
|
+
? c.map((p) => (typeof p?.text === "string" ? p.text : "")).join("")
|
|
34
|
+
: "";
|
|
35
|
+
const t = text.trim();
|
|
36
|
+
if (!t)
|
|
37
|
+
continue;
|
|
38
|
+
if (t.startsWith("<local-command-caveat>") || t.startsWith("<command-name>"))
|
|
39
|
+
continue;
|
|
40
|
+
return t.slice(0, 200);
|
|
41
|
+
}
|
|
42
|
+
return "";
|
|
43
|
+
}
|
|
44
|
+
function countUserMessages(lines) {
|
|
45
|
+
let n = 0;
|
|
46
|
+
for (const line of lines) {
|
|
47
|
+
if (!line.trim())
|
|
48
|
+
continue;
|
|
49
|
+
try {
|
|
50
|
+
if (JSON.parse(line).type === "user")
|
|
51
|
+
n++;
|
|
52
|
+
}
|
|
53
|
+
catch { /* skip */ }
|
|
54
|
+
}
|
|
55
|
+
return n;
|
|
56
|
+
}
|
|
57
|
+
/** Cheap (sessionId, mtime) pairs for every session file — stat only, no read. */
|
|
58
|
+
function listSessionStats(dir) {
|
|
59
|
+
const stats = [];
|
|
60
|
+
for (const name of readdirSync(dir)) {
|
|
61
|
+
if (!name.endsWith(".jsonl"))
|
|
62
|
+
continue;
|
|
63
|
+
const file = join(dir, name);
|
|
64
|
+
let st;
|
|
65
|
+
try {
|
|
66
|
+
st = statSync(file);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
stats.push({ sessionId: name.replace(/\.jsonl$/, ""), file, mtimeMs: st.mtimeMs });
|
|
72
|
+
}
|
|
73
|
+
return stats;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Apply the recency window + limit to mtime-sorted stats, returning the slice to
|
|
77
|
+
* deep-read. Shared by the claude + codex discovery paths so they bound work
|
|
78
|
+
* identically. `total` (caller-side) lets the UI show a "load more" affordance.
|
|
79
|
+
*/
|
|
80
|
+
export function selectRecentStats(stats, opts = {}) {
|
|
81
|
+
const now = opts.now ?? Date.now();
|
|
82
|
+
let sel = stats.slice().sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
83
|
+
if (opts.sinceMs && opts.sinceMs > 0) {
|
|
84
|
+
const cutoff = now - opts.sinceMs;
|
|
85
|
+
sel = sel.filter((s) => s.mtimeMs >= cutoff);
|
|
86
|
+
}
|
|
87
|
+
if (opts.limit && opts.limit > 0)
|
|
88
|
+
sel = sel.slice(0, opts.limit);
|
|
89
|
+
return sel;
|
|
90
|
+
}
|
|
91
|
+
/** List claude sessions for `cwd`. `claudeHome` defaults to ~/.claude (override
|
|
92
|
+
* for tests). Read-only, on-demand scan; no index. Stats every file cheaply,
|
|
93
|
+
* then deep-reads (title + count) ONLY the recent slice (opts) so an old,
|
|
94
|
+
* large history doesn't get fully read on every list open. */
|
|
95
|
+
export function discoverSessions(cwd, claudeHome = join(homedir(), ".claude"), opts = {}) {
|
|
96
|
+
const dir = join(claudeProjectsDir(claudeHome), encodeCwd(cwd));
|
|
97
|
+
if (!existsSync(dir))
|
|
98
|
+
return [];
|
|
99
|
+
const selected = selectRecentStats(listSessionStats(dir), opts);
|
|
100
|
+
const out = [];
|
|
101
|
+
for (const s of selected) {
|
|
102
|
+
let lines;
|
|
103
|
+
try {
|
|
104
|
+
lines = readFileSync(s.file, "utf-8").split("\n");
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
out.push({
|
|
110
|
+
sessionId: s.sessionId,
|
|
111
|
+
firstMessage: firstUserMessage(lines),
|
|
112
|
+
lastModified: s.mtimeMs,
|
|
113
|
+
messageCount: countUserMessages(lines),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
/** Count of all session files for `cwd`, cheaply (stat only). Lets the UI know
|
|
119
|
+
* whether a bounded `discoverSessions` left older sessions unshown. */
|
|
120
|
+
export function countSessions(cwd, claudeHome = join(homedir(), ".claude")) {
|
|
121
|
+
const dir = join(claudeProjectsDir(claudeHome), encodeCwd(cwd));
|
|
122
|
+
if (!existsSync(dir))
|
|
123
|
+
return 0;
|
|
124
|
+
return listSessionStats(dir).length;
|
|
125
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface HistoryMessage {
|
|
2
|
+
role: "user" | "assistant";
|
|
3
|
+
text: string;
|
|
4
|
+
/** `summary` is a lossy one-field preview; `args` is the full tool_use input
|
|
5
|
+
* (e.g. a sub-agent's `prompt`) so a replayed tool card can show the real
|
|
6
|
+
* parameters, not just the whitelisted field. */
|
|
7
|
+
tools?: {
|
|
8
|
+
name: string;
|
|
9
|
+
summary: string;
|
|
10
|
+
args?: Record<string, unknown>;
|
|
11
|
+
}[];
|
|
12
|
+
ts?: number;
|
|
13
|
+
}
|
|
14
|
+
/** Read the last `limit` user/assistant messages from a claude session jsonl. */
|
|
15
|
+
export declare function readRecentHistory(cwd: string, sessionId: string, limit: number, claudeHome?: string): {
|
|
16
|
+
messages: HistoryMessage[];
|
|
17
|
+
hasMore: boolean;
|
|
18
|
+
totalCount: number;
|
|
19
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { encodeCwd } from "./session-discovery.js";
|
|
5
|
+
const NOISE = ["<local-command-caveat>", "<command-name>"];
|
|
6
|
+
function textOf(content) {
|
|
7
|
+
if (typeof content === "string")
|
|
8
|
+
return content;
|
|
9
|
+
if (Array.isArray(content))
|
|
10
|
+
return content.map((p) => (typeof p?.text === "string" ? p.text : "")).join("");
|
|
11
|
+
return "";
|
|
12
|
+
}
|
|
13
|
+
function toolsOf(content) {
|
|
14
|
+
if (!Array.isArray(content))
|
|
15
|
+
return [];
|
|
16
|
+
const out = [];
|
|
17
|
+
for (const p of content) {
|
|
18
|
+
if (p?.type === "tool_use") {
|
|
19
|
+
const inp = p.input ?? {};
|
|
20
|
+
const summary = inp.command ?? inp.file_path ?? inp.path ?? inp.url ?? inp.pattern ?? inp.query ?? "";
|
|
21
|
+
const args = inp && typeof inp === "object" && Object.keys(inp).length > 0 ? inp : undefined;
|
|
22
|
+
out.push({ name: typeof p.name === "string" ? p.name : "tool", summary: String(summary).slice(0, 120), args });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
/** Read the last `limit` user/assistant messages from a claude session jsonl. */
|
|
28
|
+
export function readRecentHistory(cwd, sessionId, limit, claudeHome = join(homedir(), ".claude")) {
|
|
29
|
+
const file = join(claudeHome, "projects", encodeCwd(cwd), `${sessionId}.jsonl`);
|
|
30
|
+
if (!existsSync(file))
|
|
31
|
+
return { messages: [], hasMore: false, totalCount: 0 };
|
|
32
|
+
let raw;
|
|
33
|
+
try {
|
|
34
|
+
raw = readFileSync(file, "utf-8");
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { messages: [], hasMore: false, totalCount: 0 };
|
|
38
|
+
}
|
|
39
|
+
const all = [];
|
|
40
|
+
for (const line of raw.split("\n")) {
|
|
41
|
+
if (!line.trim())
|
|
42
|
+
continue;
|
|
43
|
+
let d;
|
|
44
|
+
try {
|
|
45
|
+
d = JSON.parse(line);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (d.type === "user") {
|
|
51
|
+
const t = textOf(d.message?.content).trim();
|
|
52
|
+
if (!t || NOISE.some((n) => t.startsWith(n)))
|
|
53
|
+
continue;
|
|
54
|
+
all.push({ role: "user", text: t.slice(0, 4000) });
|
|
55
|
+
}
|
|
56
|
+
else if (d.type === "assistant") {
|
|
57
|
+
const t = textOf(d.message?.content).trim();
|
|
58
|
+
const tools = toolsOf(d.message?.content);
|
|
59
|
+
if (!t && tools.length === 0)
|
|
60
|
+
continue;
|
|
61
|
+
all.push({ role: "assistant", text: t.slice(0, 4000), tools: tools.length ? tools : undefined });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const lim = limit > 0 ? limit : 20;
|
|
65
|
+
const start = Math.max(0, all.length - lim);
|
|
66
|
+
return { messages: all.slice(start), hasMore: start > 0, totalCount: all.length };
|
|
67
|
+
}
|
|
@@ -29,4 +29,29 @@
|
|
|
29
29
|
* transport is stdio NDJSON and the protocol surface is unchanged, this
|
|
30
30
|
* bootstrap is invisible to them.
|
|
31
31
|
*/
|
|
32
|
-
|
|
32
|
+
import type { EngineConfigSlice } from "../protocol/chat-session-manager.js";
|
|
33
|
+
import { type ValidatedSettings } from "../settings/schema.js";
|
|
34
|
+
/**
|
|
35
|
+
* Resolve per-session agent config: protocol slice overrides win, else fall
|
|
36
|
+
* back to disk settings.agent.*. Fixes the bug where settings.agent.* never
|
|
37
|
+
* reached session engines (slice arrived with only permissionMode+cwd).
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveSessionAgentConfig(slice: EngineConfigSlice, settings: ValidatedSettings): {
|
|
40
|
+
preset: string;
|
|
41
|
+
customSystemPrompt: string | undefined;
|
|
42
|
+
appendSystemPrompt: string | undefined;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Resolve a session's effective cwd. A protocol slice with an explicit cwd
|
|
46
|
+
* points the session at that project; a slice WITHOUT a cwd is a no-repo
|
|
47
|
+
* "纯聊天" session (the renderer omits cwd when no project is selected) and must
|
|
48
|
+
* land in the no-repo sandbox (~/.code-shell/no-repo) — NOT the worker's boot
|
|
49
|
+
* cwd.
|
|
50
|
+
*
|
|
51
|
+
* Why not the boot cwd: this stdio worker is long-lived and reused across
|
|
52
|
+
* sessions/projects, so its boot cwd is whatever project first spawned it.
|
|
53
|
+
* Inheriting it for a no-repo chat would (a) silently run the chat against a
|
|
54
|
+
* stale, unrelated project's files and (b) defeat the no-repo skill/plugin
|
|
55
|
+
* whitelist inversion (which only fires when cwd === noRepoDir).
|
|
56
|
+
*/
|
|
57
|
+
export declare function resolveSessionCwd(slice: EngineConfigSlice): string;
|