@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,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReasoningSetting — the rich, normalized reasoning/thinking config that
|
|
3
|
+
* replaces the old binary `thinking: "enabled"|"disabled"`.
|
|
4
|
+
*
|
|
5
|
+
* - off : no thinking (openai-effort → disabledEffort; deepseek → type:disabled; openrouter → exclude)
|
|
6
|
+
* - on : binary "thinking on" for deepseek-thinking / zai (no effort levels)
|
|
7
|
+
* - effort : openai-effort / openrouter — pick a level
|
|
8
|
+
* - budget : anthropic-budget — explicit thinking token budget
|
|
9
|
+
*
|
|
10
|
+
* `normalizeReasoning` accepts the legacy "enabled"/"disabled" strings so any
|
|
11
|
+
* lingering caller/config still works (mapped to on/off).
|
|
12
|
+
*/
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
import type { ReasoningEffort } from "./capabilities/types.js";
|
|
15
|
+
export declare const REASONING_EFFORTS: readonly ["minimal", "low", "medium", "high", "xhigh"];
|
|
16
|
+
export declare const ReasoningSettingSchema: z.ZodDiscriminatedUnion<"mode", [z.ZodObject<{
|
|
17
|
+
mode: z.ZodLiteral<"off">;
|
|
18
|
+
}, "strip", z.ZodTypeAny, {
|
|
19
|
+
mode: "off";
|
|
20
|
+
}, {
|
|
21
|
+
mode: "off";
|
|
22
|
+
}>, z.ZodObject<{
|
|
23
|
+
mode: z.ZodLiteral<"on">;
|
|
24
|
+
}, "strip", z.ZodTypeAny, {
|
|
25
|
+
mode: "on";
|
|
26
|
+
}, {
|
|
27
|
+
mode: "on";
|
|
28
|
+
}>, z.ZodObject<{
|
|
29
|
+
mode: z.ZodLiteral<"effort">;
|
|
30
|
+
effort: z.ZodString;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
mode: "effort";
|
|
33
|
+
effort: string;
|
|
34
|
+
}, {
|
|
35
|
+
mode: "effort";
|
|
36
|
+
effort: string;
|
|
37
|
+
}>, z.ZodObject<{
|
|
38
|
+
mode: z.ZodLiteral<"budget">;
|
|
39
|
+
budgetTokens: z.ZodNumber;
|
|
40
|
+
}, "strip", z.ZodTypeAny, {
|
|
41
|
+
mode: "budget";
|
|
42
|
+
budgetTokens: number;
|
|
43
|
+
}, {
|
|
44
|
+
mode: "budget";
|
|
45
|
+
budgetTokens: number;
|
|
46
|
+
}>]>;
|
|
47
|
+
export type ReasoningSetting = z.infer<typeof ReasoningSettingSchema>;
|
|
48
|
+
/** Coerce legacy "enabled"/"disabled" or an object into a ReasoningSetting. */
|
|
49
|
+
export declare function normalizeReasoning(raw: ReasoningSetting | "enabled" | "disabled" | undefined): ReasoningSetting | undefined;
|
|
50
|
+
/** Effort to send when a model wants "thinking on" but the user picked no level. */
|
|
51
|
+
export declare const DEFAULT_EFFORT: ReasoningEffort;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReasoningSetting — the rich, normalized reasoning/thinking config that
|
|
3
|
+
* replaces the old binary `thinking: "enabled"|"disabled"`.
|
|
4
|
+
*
|
|
5
|
+
* - off : no thinking (openai-effort → disabledEffort; deepseek → type:disabled; openrouter → exclude)
|
|
6
|
+
* - on : binary "thinking on" for deepseek-thinking / zai (no effort levels)
|
|
7
|
+
* - effort : openai-effort / openrouter — pick a level
|
|
8
|
+
* - budget : anthropic-budget — explicit thinking token budget
|
|
9
|
+
*
|
|
10
|
+
* `normalizeReasoning` accepts the legacy "enabled"/"disabled" strings so any
|
|
11
|
+
* lingering caller/config still works (mapped to on/off).
|
|
12
|
+
*/
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
// Recommended effort levels — used to render UI dropdowns and as capability
|
|
15
|
+
// hints. NOT a hard schema constraint: effort is a free-form, catalog-driven
|
|
16
|
+
// param (a model's real ladder is declared by its catalog ParamSpec, and models
|
|
17
|
+
// gain/rename levels over time — e.g. gpt-5.5 added "xhigh", some models accept
|
|
18
|
+
// "max"). The settings schema validates the *shape* (mode/field names), not the
|
|
19
|
+
// *value*; pinning effort to a closed enum here made one unknown level
|
|
20
|
+
// (a connection's paramValues.reasoning flowing through the legacy models[]
|
|
21
|
+
// bridge) throw in validateSettings and take the whole app down on boot.
|
|
22
|
+
export const REASONING_EFFORTS = ["minimal", "low", "medium", "high", "xhigh"];
|
|
23
|
+
export const ReasoningSettingSchema = z.discriminatedUnion("mode", [
|
|
24
|
+
z.object({ mode: z.literal("off") }),
|
|
25
|
+
z.object({ mode: z.literal("on") }),
|
|
26
|
+
z.object({ mode: z.literal("effort"), effort: z.string().min(1) }),
|
|
27
|
+
z.object({ mode: z.literal("budget"), budgetTokens: z.number().int().positive() }),
|
|
28
|
+
]);
|
|
29
|
+
/** Coerce legacy "enabled"/"disabled" or an object into a ReasoningSetting. */
|
|
30
|
+
export function normalizeReasoning(raw) {
|
|
31
|
+
if (raw == null)
|
|
32
|
+
return undefined;
|
|
33
|
+
if (raw === "enabled")
|
|
34
|
+
return { mode: "on" };
|
|
35
|
+
if (raw === "disabled")
|
|
36
|
+
return { mode: "off" };
|
|
37
|
+
return raw;
|
|
38
|
+
}
|
|
39
|
+
/** Effort to send when a model wants "thinking on" but the user picked no level. */
|
|
40
|
+
export const DEFAULT_EFFORT = "medium";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared stop-reason helpers.
|
|
3
|
+
*
|
|
4
|
+
* Providers report "the response was cut off at the output-token cap" with
|
|
5
|
+
* different finish/stop-reason strings:
|
|
6
|
+
* - OpenAI / OpenAI-compat: finish_reason "length"
|
|
7
|
+
* - Anthropic: stop_reason "max_tokens"
|
|
8
|
+
*
|
|
9
|
+
* The turn loop uses this to decide whether to run a max-output
|
|
10
|
+
* continuation, so the check must accept both spellings.
|
|
11
|
+
*/
|
|
12
|
+
/** True when the stop reason indicates the model hit its output-token cap. */
|
|
13
|
+
export declare function isTruncatedStop(stopReason: string | undefined): boolean;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared stop-reason helpers.
|
|
3
|
+
*
|
|
4
|
+
* Providers report "the response was cut off at the output-token cap" with
|
|
5
|
+
* different finish/stop-reason strings:
|
|
6
|
+
* - OpenAI / OpenAI-compat: finish_reason "length"
|
|
7
|
+
* - Anthropic: stop_reason "max_tokens"
|
|
8
|
+
*
|
|
9
|
+
* The turn loop uses this to decide whether to run a max-output
|
|
10
|
+
* continuation, so the check must accept both spellings.
|
|
11
|
+
*/
|
|
12
|
+
const TRUNCATED_STOP_REASONS = new Set([
|
|
13
|
+
"length", // OpenAI / OpenAI-compatible
|
|
14
|
+
"max_tokens", // Anthropic
|
|
15
|
+
]);
|
|
16
|
+
/** True when the stop reason indicates the model hit its output-token cap. */
|
|
17
|
+
export function isTruncatedStop(stopReason) {
|
|
18
|
+
if (!stopReason)
|
|
19
|
+
return false;
|
|
20
|
+
return TRUNCATED_STOP_REASONS.has(stopReason);
|
|
21
|
+
}
|
|
@@ -64,7 +64,11 @@ export function createStreamWatchdog(opts) {
|
|
|
64
64
|
}
|
|
65
65
|
/** Environment-driven defaults. Read once at import time is fine — these never change inside a process. */
|
|
66
66
|
export const STREAM_WATCHDOG_CONFIG = {
|
|
67
|
-
|
|
67
|
+
// ON by default — a streamed response that connects then stalls mid-flight
|
|
68
|
+
// would otherwise hang until the SDK's (unreliable-for-half-dead-sockets)
|
|
69
|
+
// timeout, which we observed take 15–33 min in practice. Opt OUT with
|
|
70
|
+
// CODESHELL_ENABLE_STREAM_WATCHDOG=0 (rollback knob).
|
|
71
|
+
enabled: process.env.CODESHELL_ENABLE_STREAM_WATCHDOG !== "0",
|
|
68
72
|
idleTimeoutMs: parseInt(process.env.CODESHELL_STREAM_IDLE_TIMEOUT_MS || "", 10) || 90_000,
|
|
69
73
|
retries: parseInt(process.env.CODESHELL_STREAM_WATCHDOG_RETRIES || "", 10) || 2,
|
|
70
74
|
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History-image stripping for non-vision models.
|
|
3
|
+
*
|
|
4
|
+
* Why this exists: the vision gate in `Engine.run` only rejects *new* image
|
|
5
|
+
* attachments on the current turn. But a conversation can accumulate image
|
|
6
|
+
* content blocks while a vision-capable model is active, then the user
|
|
7
|
+
* switches to a non-vision model (e.g. DeepSeek) mid-session. Those
|
|
8
|
+
* *historical* image blocks are still in the transcript and get re-serialized
|
|
9
|
+
* on every subsequent request — OpenAI-compat backends 400 with
|
|
10
|
+
* `unknown variant 'image_url', expected 'text'`, which then falls back out
|
|
11
|
+
* of streaming and degrades the turn.
|
|
12
|
+
*
|
|
13
|
+
* Fix: when the active model has `supportsVision: false`, replace each
|
|
14
|
+
* message's image blocks with a single text placeholder before the request
|
|
15
|
+
* is built. The transcript/store is untouched — only the outgoing copy is
|
|
16
|
+
* sanitized — so switching back to a vision model still sees the images.
|
|
17
|
+
*
|
|
18
|
+
* Pure function, no I/O. Tested in `strip-vision.test.ts`.
|
|
19
|
+
*/
|
|
20
|
+
import type { Message } from "../types.js";
|
|
21
|
+
/** Text we substitute for an elided image block. Surfaced to the model so it
|
|
22
|
+
* knows an image *was* here (vs silently vanishing the context). */
|
|
23
|
+
export declare const VISION_PLACEHOLDER = "[\u56FE\u7247\u5DF2\u7701\u7565:\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u89C6\u89C9\u8F93\u5165]";
|
|
24
|
+
/**
|
|
25
|
+
* Return a copy of `messages` with image content blocks replaced by a text
|
|
26
|
+
* placeholder, but only when `supportsVision` is false.
|
|
27
|
+
*
|
|
28
|
+
* Identity-preserving: when vision is supported, or no message carries an
|
|
29
|
+
* image, the original array (and untouched message objects) are returned as-is
|
|
30
|
+
* so callers pay nothing on the common path.
|
|
31
|
+
*/
|
|
32
|
+
export declare function stripVisionFromHistory(messages: Message[], supportsVision: boolean): Message[];
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History-image stripping for non-vision models.
|
|
3
|
+
*
|
|
4
|
+
* Why this exists: the vision gate in `Engine.run` only rejects *new* image
|
|
5
|
+
* attachments on the current turn. But a conversation can accumulate image
|
|
6
|
+
* content blocks while a vision-capable model is active, then the user
|
|
7
|
+
* switches to a non-vision model (e.g. DeepSeek) mid-session. Those
|
|
8
|
+
* *historical* image blocks are still in the transcript and get re-serialized
|
|
9
|
+
* on every subsequent request — OpenAI-compat backends 400 with
|
|
10
|
+
* `unknown variant 'image_url', expected 'text'`, which then falls back out
|
|
11
|
+
* of streaming and degrades the turn.
|
|
12
|
+
*
|
|
13
|
+
* Fix: when the active model has `supportsVision: false`, replace each
|
|
14
|
+
* message's image blocks with a single text placeholder before the request
|
|
15
|
+
* is built. The transcript/store is untouched — only the outgoing copy is
|
|
16
|
+
* sanitized — so switching back to a vision model still sees the images.
|
|
17
|
+
*
|
|
18
|
+
* Pure function, no I/O. Tested in `strip-vision.test.ts`.
|
|
19
|
+
*/
|
|
20
|
+
/** Text we substitute for an elided image block. Surfaced to the model so it
|
|
21
|
+
* knows an image *was* here (vs silently vanishing the context). */
|
|
22
|
+
export const VISION_PLACEHOLDER = "[图片已省略:当前模型不支持视觉输入]";
|
|
23
|
+
/**
|
|
24
|
+
* Return a copy of `messages` with image content blocks replaced by a text
|
|
25
|
+
* placeholder, but only when `supportsVision` is false.
|
|
26
|
+
*
|
|
27
|
+
* Identity-preserving: when vision is supported, or no message carries an
|
|
28
|
+
* image, the original array (and untouched message objects) are returned as-is
|
|
29
|
+
* so callers pay nothing on the common path.
|
|
30
|
+
*/
|
|
31
|
+
export function stripVisionFromHistory(messages, supportsVision) {
|
|
32
|
+
if (supportsVision)
|
|
33
|
+
return messages;
|
|
34
|
+
let changed = false;
|
|
35
|
+
const out = messages.map((msg) => {
|
|
36
|
+
if (typeof msg.content === "string")
|
|
37
|
+
return msg;
|
|
38
|
+
// Need to process if there's a top-level image, OR a tool_result whose
|
|
39
|
+
// own content array carries a nested image (view_image-produced screenshots
|
|
40
|
+
// live in `tool_result.content: ContentBlock[]`).
|
|
41
|
+
if (!msg.content.some(needsStrip))
|
|
42
|
+
return msg;
|
|
43
|
+
changed = true;
|
|
44
|
+
const rebuilt = [];
|
|
45
|
+
let placeholderInserted = false;
|
|
46
|
+
for (const block of msg.content) {
|
|
47
|
+
if (block.type === "image") {
|
|
48
|
+
// Collapse runs of images into a single placeholder per message —
|
|
49
|
+
// five screenshots don't need five identical notes.
|
|
50
|
+
if (!placeholderInserted) {
|
|
51
|
+
rebuilt.push({ type: "text", text: VISION_PLACEHOLDER });
|
|
52
|
+
placeholderInserted = true;
|
|
53
|
+
}
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (block.type === "tool_result" &&
|
|
57
|
+
Array.isArray(block.content) &&
|
|
58
|
+
block.content.some((b) => b.type === "image")) {
|
|
59
|
+
rebuilt.push({ ...block, content: stripImageBlocks(block.content) });
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
rebuilt.push(block);
|
|
63
|
+
}
|
|
64
|
+
return { ...msg, content: rebuilt };
|
|
65
|
+
});
|
|
66
|
+
return changed ? out : messages;
|
|
67
|
+
}
|
|
68
|
+
/** True if this block holds an image we must elide — either it *is* an image,
|
|
69
|
+
* or it's a tool_result whose nested content array contains one. */
|
|
70
|
+
function needsStrip(block) {
|
|
71
|
+
if (block.type === "image")
|
|
72
|
+
return true;
|
|
73
|
+
return (block.type === "tool_result" &&
|
|
74
|
+
Array.isArray(block.content) &&
|
|
75
|
+
block.content.some((b) => b.type === "image"));
|
|
76
|
+
}
|
|
77
|
+
/** Replace image blocks in a ContentBlock[] with a single text placeholder
|
|
78
|
+
* (consecutive/multiple images collapse to one), preserving other blocks.
|
|
79
|
+
* Used for both the message top level and nested tool_result.content. */
|
|
80
|
+
function stripImageBlocks(blocks) {
|
|
81
|
+
const rebuilt = [];
|
|
82
|
+
let placeholderInserted = false;
|
|
83
|
+
for (const block of blocks) {
|
|
84
|
+
if (block.type === "image") {
|
|
85
|
+
if (!placeholderInserted) {
|
|
86
|
+
rebuilt.push({ type: "text", text: VISION_PLACEHOLDER });
|
|
87
|
+
placeholderInserted = true;
|
|
88
|
+
}
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
rebuilt.push(block);
|
|
92
|
+
}
|
|
93
|
+
return rebuilt;
|
|
94
|
+
}
|
|
@@ -18,9 +18,16 @@ async function getEncoder() {
|
|
|
18
18
|
}
|
|
19
19
|
let encoderSync = null;
|
|
20
20
|
// Kick off the import so synchronous callers can use it on the next tick.
|
|
21
|
-
// First call still falls back to a length estimate.
|
|
22
|
-
|
|
21
|
+
// First call still falls back to a length estimate. The .catch keeps a failed
|
|
22
|
+
// import (corrupt node_modules / packaging error) from becoming an unhandled
|
|
23
|
+
// rejection — the chars/4 fallback below IS the intended degradation, so a
|
|
24
|
+
// load failure should stay silent, not surface as a process-level warning/crash.
|
|
25
|
+
void getEncoder()
|
|
26
|
+
.then((fn) => {
|
|
23
27
|
encoderSync = fn;
|
|
28
|
+
})
|
|
29
|
+
.catch(() => {
|
|
30
|
+
/* encoder unavailable — count() falls back to the length estimate */
|
|
24
31
|
});
|
|
25
32
|
/**
|
|
26
33
|
* Count tokens in `text`. Synchronous. If the encoder isn't loaded yet,
|
package/dist/llm/types.d.ts
CHANGED
|
@@ -20,18 +20,21 @@ export interface CreateMessageOptions {
|
|
|
20
20
|
*/
|
|
21
21
|
recordUsage?: boolean;
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* other compatible endpoints.
|
|
23
|
+
* Reasoning/thinking setting for this call. Overrides LLMConfig.reasoning.
|
|
24
|
+
* Rich shape ({mode:"off"|"on"} | {mode:"effort",effort} |
|
|
25
|
+
* {mode:"budget",budgetTokens}) — translated to the per-vendor wire form by
|
|
26
|
+
* the client's capability layer.
|
|
28
27
|
*/
|
|
29
|
-
|
|
28
|
+
reasoning?: import("./reasoning-setting.js").ReasoningSetting;
|
|
30
29
|
}
|
|
31
30
|
export interface LLMUsageTracker {
|
|
32
31
|
records: TokenUsage[];
|
|
33
32
|
totalPromptTokens: number;
|
|
34
33
|
totalCompletionTokens: number;
|
|
35
34
|
totalTokens: number;
|
|
35
|
+
/** Sum of cache-read tokens across responses (0 when no provider reported any). */
|
|
36
|
+
totalCacheReadTokens: number;
|
|
37
|
+
/** Sum of cache-creation tokens across responses. */
|
|
38
|
+
totalCacheCreationTokens: number;
|
|
36
39
|
requestCount: number;
|
|
37
40
|
}
|
package/dist/logging/logger.js
CHANGED
|
@@ -25,6 +25,7 @@ import { appendFileSync, mkdirSync, existsSync, readdirSync, unlinkSync, readFil
|
|
|
25
25
|
import { join, dirname } from "node:path";
|
|
26
26
|
import { homedir } from "node:os";
|
|
27
27
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
28
|
+
import { redactSecrets } from "./sanitize-messages.js";
|
|
28
29
|
const LEVEL_ORDER = {
|
|
29
30
|
debug: 0,
|
|
30
31
|
info: 1,
|
|
@@ -246,7 +247,14 @@ class Logger {
|
|
|
246
247
|
recordError(msg, data) {
|
|
247
248
|
if (inMemoryErrors.length >= MAX_IN_MEMORY_ERRORS)
|
|
248
249
|
inMemoryErrors.shift();
|
|
249
|
-
|
|
250
|
+
// Scrub secrets out of msg + data before parking the entry in the in-
|
|
251
|
+
// memory ring. The ring is exposed via diagnostics endpoints, so
|
|
252
|
+
// anything that survives here is reachable by protocol clients.
|
|
253
|
+
inMemoryErrors.push({
|
|
254
|
+
msg: redactSecrets(msg),
|
|
255
|
+
t: new Date().toISOString(),
|
|
256
|
+
data: data ? redactSecrets(data) : undefined,
|
|
257
|
+
});
|
|
250
258
|
}
|
|
251
259
|
write(level, msg, data) {
|
|
252
260
|
if (!this.enabled)
|
|
@@ -262,7 +270,13 @@ class Logger {
|
|
|
262
270
|
return;
|
|
263
271
|
}
|
|
264
272
|
const t = new Date().toISOString();
|
|
265
|
-
|
|
273
|
+
// Scrub msg + data before the entry is built. msg is a plain string so
|
|
274
|
+
// only bearer-tokens / URL secret query params can hide there; data is
|
|
275
|
+
// arbitrary so it gets the full recursive walk. Done at the boundary so
|
|
276
|
+
// every level/category sink shares the same redaction rules.
|
|
277
|
+
const safeMsg = redactSecrets(msg);
|
|
278
|
+
const safeData = data ? redactSecrets(data) : undefined;
|
|
279
|
+
const entry = { t, l: level, msg: safeMsg, ...this.context };
|
|
266
280
|
if (cat && !entry.cat)
|
|
267
281
|
entry.cat = cat;
|
|
268
282
|
// Stamp the current process-wide session id unless this logger's
|
|
@@ -270,8 +284,8 @@ class Logger {
|
|
|
270
284
|
// children created before Engine.run() still pick up the real sid.
|
|
271
285
|
if (entry.sid === undefined)
|
|
272
286
|
entry.sid = getCurrentSid();
|
|
273
|
-
if (
|
|
274
|
-
entry.d =
|
|
287
|
+
if (safeData)
|
|
288
|
+
entry.d = safeData;
|
|
275
289
|
const line = JSON.stringify(entry) + "\n";
|
|
276
290
|
if (this.stderrEcho) {
|
|
277
291
|
process.stderr.write(line);
|
|
@@ -32,6 +32,16 @@ export declare function sanitizeContent(content: Message["content"]): Message["c
|
|
|
32
32
|
* path for the overwhelmingly common pure-text case).
|
|
33
33
|
*/
|
|
34
34
|
export declare function sanitizeMessages(messages: readonly Message[]): Message[];
|
|
35
|
+
/**
|
|
36
|
+
* Recursively walk a value and return a *new* value with secret-looking
|
|
37
|
+
* fields replaced by "[redacted]". Used by the logger (so anything ending up
|
|
38
|
+
* in `entry.d` is scrubbed) and by diagnostics / in-memory error capture.
|
|
39
|
+
*
|
|
40
|
+
* Pure / no I/O. Does not mutate the input — important because the same
|
|
41
|
+
* object may also be on its way to a transcript or UI stream where the
|
|
42
|
+
* unredacted form is correct.
|
|
43
|
+
*/
|
|
44
|
+
export declare function redactSecrets<T>(value: T, depth?: number): T;
|
|
35
45
|
/**
|
|
36
46
|
* Sanitize a free-form task string before logging.
|
|
37
47
|
*
|
|
@@ -129,6 +129,118 @@ export function sanitizeMessages(messages) {
|
|
|
129
129
|
}
|
|
130
130
|
return touched ? out : messages;
|
|
131
131
|
}
|
|
132
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
133
|
+
// Secret redaction
|
|
134
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
135
|
+
//
|
|
136
|
+
// Beyond image payloads, log/diagnostics entries can carry API keys,
|
|
137
|
+
// authorization headers, provider tokens, and similar secrets via
|
|
138
|
+
// `data` blobs (settings dumps, provider configs, error responses, …).
|
|
139
|
+
// These walkers redact secrets *in place on a deep clone* so the caller
|
|
140
|
+
// can still log "useful shape, scrubbed values".
|
|
141
|
+
const SECRET_KEY_RE = /(^|[._-])(api[_-]?key|authorization|x[_-]api[_-]key|bearer[_-]?token|access[_-]?token|refresh[_-]?token|session[_-]?token|token|secret|password|client[_-]?secret|cookie)($|[._-])/i;
|
|
142
|
+
// Header containers whose VALUES are all header values — any of them can carry
|
|
143
|
+
// a bespoke auth token under a non-secret-looking key name (e.g.
|
|
144
|
+
// `x-custom-auth`), which SECRET_KEY_RE alone would miss. Treat the whole
|
|
145
|
+
// container as sensitive: every non-empty value inside is redacted.
|
|
146
|
+
const HEADERS_CONTAINER_RE = /^(httpHeaders|headers|defaultHeaders|envHeaders)$/;
|
|
147
|
+
/** Redact all non-empty string/scalar values of a headers container object. */
|
|
148
|
+
function redactHeaderValues(headers) {
|
|
149
|
+
const out = {};
|
|
150
|
+
for (const [hName, hVal] of Object.entries(headers)) {
|
|
151
|
+
// Preserve present-vs-absent for empty/null, redact everything else.
|
|
152
|
+
if (hVal === null || hVal === undefined || hVal === "")
|
|
153
|
+
out[hName] = hVal;
|
|
154
|
+
else
|
|
155
|
+
out[hName] = REDACTED;
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
const BEARER_RE = /\bBearer\s+[A-Za-z0-9._\-+/=~]{8,}/g;
|
|
160
|
+
// URL query parameters that look like credentials. Conservative — only
|
|
161
|
+
// trigger on a small named set so a normal `?id=…&q=…` URL passes through.
|
|
162
|
+
const URL_SECRET_QS_RE = /([?&](?:key|api_key|apikey|access_token|token|auth|sig|signature)=)[^&#\s]+/gi;
|
|
163
|
+
const REDACTED = "[redacted]";
|
|
164
|
+
const MAX_DEPTH = 10;
|
|
165
|
+
function isSecretKey(key) {
|
|
166
|
+
return SECRET_KEY_RE.test(key);
|
|
167
|
+
}
|
|
168
|
+
/** Scrub bare `Bearer <token>` and credential-looking URL query params from a string. */
|
|
169
|
+
function redactSecretsInString(s) {
|
|
170
|
+
let out = s;
|
|
171
|
+
if (BEARER_RE.test(out))
|
|
172
|
+
out = out.replace(BEARER_RE, "Bearer [redacted]");
|
|
173
|
+
if (URL_SECRET_QS_RE.test(out))
|
|
174
|
+
out = out.replace(URL_SECRET_QS_RE, "$1[redacted]");
|
|
175
|
+
return out;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Recursively walk a value and return a *new* value with secret-looking
|
|
179
|
+
* fields replaced by "[redacted]". Used by the logger (so anything ending up
|
|
180
|
+
* in `entry.d` is scrubbed) and by diagnostics / in-memory error capture.
|
|
181
|
+
*
|
|
182
|
+
* Pure / no I/O. Does not mutate the input — important because the same
|
|
183
|
+
* object may also be on its way to a transcript or UI stream where the
|
|
184
|
+
* unredacted form is correct.
|
|
185
|
+
*/
|
|
186
|
+
export function redactSecrets(value, depth = 0) {
|
|
187
|
+
if (value === null || value === undefined)
|
|
188
|
+
return value;
|
|
189
|
+
if (depth > MAX_DEPTH)
|
|
190
|
+
return value;
|
|
191
|
+
const t = typeof value;
|
|
192
|
+
if (t === "string")
|
|
193
|
+
return redactSecretsInString(value);
|
|
194
|
+
if (t === "number" || t === "boolean" || t === "bigint" || t === "symbol")
|
|
195
|
+
return value;
|
|
196
|
+
if (t === "function")
|
|
197
|
+
return value;
|
|
198
|
+
if (Array.isArray(value)) {
|
|
199
|
+
return value.map((v) => redactSecrets(v, depth + 1));
|
|
200
|
+
}
|
|
201
|
+
// Error objects: preserve name/message/stack shape but redact within.
|
|
202
|
+
if (value instanceof Error) {
|
|
203
|
+
const clone = {
|
|
204
|
+
name: value.name,
|
|
205
|
+
message: redactSecretsInString(value.message),
|
|
206
|
+
...(value.stack ? { stack: redactSecretsInString(value.stack) } : {}),
|
|
207
|
+
};
|
|
208
|
+
// Some libraries attach extra properties (`.response`, `.config`, …) —
|
|
209
|
+
// walk them as well.
|
|
210
|
+
for (const key of Object.keys(value)) {
|
|
211
|
+
if (key === "name" || key === "message" || key === "stack")
|
|
212
|
+
continue;
|
|
213
|
+
const v = value[key];
|
|
214
|
+
clone[key] = isSecretKey(key) ? REDACTED : redactSecrets(v, depth + 1);
|
|
215
|
+
}
|
|
216
|
+
return clone;
|
|
217
|
+
}
|
|
218
|
+
if (t === "object") {
|
|
219
|
+
const obj = value;
|
|
220
|
+
const out = {};
|
|
221
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
222
|
+
if (isSecretKey(k)) {
|
|
223
|
+
// Preserve presence (null/undefined stay as-is so consumers can
|
|
224
|
+
// still distinguish "key present" vs "key absent"; non-empty values
|
|
225
|
+
// collapse to [redacted]).
|
|
226
|
+
if (v === null || v === undefined || v === "")
|
|
227
|
+
out[k] = v;
|
|
228
|
+
else
|
|
229
|
+
out[k] = REDACTED;
|
|
230
|
+
}
|
|
231
|
+
else if (HEADERS_CONTAINER_RE.test(k) && v && typeof v === "object" && !Array.isArray(v)) {
|
|
232
|
+
// Blanket-redact header values regardless of the inner header name, so a
|
|
233
|
+
// custom `x-custom-auth` doesn't leak in cleartext.
|
|
234
|
+
out[k] = redactHeaderValues(v);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
out[k] = redactSecrets(v, depth + 1);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return out;
|
|
241
|
+
}
|
|
242
|
+
return value;
|
|
243
|
+
}
|
|
132
244
|
/**
|
|
133
245
|
* Sanitize a free-form task string before logging.
|
|
134
246
|
*
|
package/dist/lsp/client.js
CHANGED
|
@@ -10,7 +10,12 @@ export class LSPClient extends EventEmitter {
|
|
|
10
10
|
process;
|
|
11
11
|
nextId = 1;
|
|
12
12
|
pending = new Map();
|
|
13
|
-
buffer
|
|
13
|
+
// The LSP framing uses byte-counted Content-Length, so we buffer bytes,
|
|
14
|
+
// not characters. Joining chunks as strings (`data.toString()` + string
|
|
15
|
+
// concat) can split a multibyte UTF-8 codepoint across chunks and de-
|
|
16
|
+
// synchronize against Content-Length. Stay in Buffer-land until we've
|
|
17
|
+
// sliced out exactly the right body length.
|
|
18
|
+
buffer = Buffer.alloc(0);
|
|
14
19
|
contentLength = -1;
|
|
15
20
|
initialized = false;
|
|
16
21
|
constructor(command, args = [], cwd) {
|
|
@@ -24,7 +29,7 @@ export class LSPClient extends EventEmitter {
|
|
|
24
29
|
cwd: this.cwd,
|
|
25
30
|
stdio: ["pipe", "pipe", "pipe"],
|
|
26
31
|
});
|
|
27
|
-
this.process.stdout?.on("data", (data) => this.handleData(data
|
|
32
|
+
this.process.stdout?.on("data", (data) => this.handleData(data));
|
|
28
33
|
this.process.stderr?.on("data", (_data) => {
|
|
29
34
|
// LSP servers often log to stderr — ignore
|
|
30
35
|
});
|
|
@@ -116,26 +121,41 @@ export class LSPClient extends EventEmitter {
|
|
|
116
121
|
return this.process !== undefined && !this.process.killed;
|
|
117
122
|
}
|
|
118
123
|
handleData(data) {
|
|
119
|
-
|
|
124
|
+
// Append the new chunk as bytes. Buffer.concat avoids the UTF-8
|
|
125
|
+
// boundary corruption that string concatenation produces — a
|
|
126
|
+
// multibyte codepoint split across two TCP/pipe chunks decodes to
|
|
127
|
+
// U+FFFD, mangles the buffer length count, and breaks framing.
|
|
128
|
+
this.buffer = Buffer.concat([this.buffer, data]);
|
|
120
129
|
while (true) {
|
|
121
130
|
if (this.contentLength < 0) {
|
|
131
|
+
// Search for the header terminator in bytes, not chars.
|
|
122
132
|
const headerEnd = this.buffer.indexOf("\r\n\r\n");
|
|
123
133
|
if (headerEnd < 0)
|
|
124
134
|
break;
|
|
125
|
-
|
|
135
|
+
// Headers are ASCII per spec, so toString("ascii") is safe and
|
|
136
|
+
// avoids paying for a UTF-8 decode on the framing band.
|
|
137
|
+
const header = this.buffer.slice(0, headerEnd).toString("ascii");
|
|
126
138
|
const match = header.match(/Content-Length:\s*(\d+)/i);
|
|
127
139
|
if (!match) {
|
|
128
|
-
this.buffer = this.buffer.
|
|
140
|
+
this.buffer = this.buffer.subarray(headerEnd + 4);
|
|
129
141
|
continue;
|
|
130
142
|
}
|
|
131
143
|
this.contentLength = parseInt(match[1], 10);
|
|
132
|
-
this.buffer = this.buffer.
|
|
144
|
+
this.buffer = this.buffer.subarray(headerEnd + 4);
|
|
133
145
|
}
|
|
146
|
+
// Content-Length is a BYTE count — compare against the buffer's
|
|
147
|
+
// byte length, not its character length. Pre-fix this compared
|
|
148
|
+
// string lengths; with multibyte responses (e.g. CJK identifiers,
|
|
149
|
+
// emoji in diagnostics) we'd block waiting for bytes that had
|
|
150
|
+
// already arrived.
|
|
134
151
|
if (this.buffer.length < this.contentLength)
|
|
135
152
|
break;
|
|
136
|
-
const
|
|
137
|
-
this.buffer = this.buffer.
|
|
153
|
+
const bodyBytes = this.buffer.subarray(0, this.contentLength);
|
|
154
|
+
this.buffer = this.buffer.subarray(this.contentLength);
|
|
138
155
|
this.contentLength = -1;
|
|
156
|
+
// Decode the full body in one shot — at this point we have the
|
|
157
|
+
// exact byte count, so the UTF-8 boundary issue is fully gone.
|
|
158
|
+
const content = bodyBytes.toString("utf8");
|
|
139
159
|
try {
|
|
140
160
|
const message = JSON.parse(content);
|
|
141
161
|
if ("id" in message && this.pending.has(message.id)) {
|
package/dist/lsp/manager.d.ts
CHANGED
|
@@ -33,8 +33,8 @@ export declare class LSPServerManager {
|
|
|
33
33
|
* Shutdown all servers.
|
|
34
34
|
*/
|
|
35
35
|
shutdownAll(): Promise<void>;
|
|
36
|
-
private isCommandAvailable;
|
|
37
36
|
}
|
|
37
|
+
export declare function isCommandAvailable(command: string, env?: NodeJS.ProcessEnv): boolean;
|
|
38
38
|
export declare function initializeLSPManager(cwd: string): LSPServerManager;
|
|
39
39
|
export declare function getLSPManager(): LSPServerManager | undefined;
|
|
40
40
|
export {};
|