@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,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in GenerateImage tool — text-to-image via the OpenAI Images API
|
|
3
|
+
* (`gpt-image-2`).
|
|
4
|
+
*
|
|
5
|
+
* Credentials come from config, not env: the tool finds the `kind: "openai"`
|
|
6
|
+
* entry in `settings.providers[]` and uses its `apiKey` + `baseUrl`. No
|
|
7
|
+
* `OPENAI_API_KEY` required, no new config — an existing OpenAI provider is
|
|
8
|
+
* reused as-is.
|
|
9
|
+
*
|
|
10
|
+
* The generated PNG is decoded from the API's base64 payload and written to
|
|
11
|
+
* `<cwd>/.code-shell/generated_images/<timestamp>.png`; the tool returns the
|
|
12
|
+
* absolute path so the model can Read or reference it on later turns. This
|
|
13
|
+
* mirrors codex's imagegen CLI fallback (`scripts/image_gen.py`): call API →
|
|
14
|
+
* take b64_json → decode → write → report path.
|
|
15
|
+
*
|
|
16
|
+
* Scope is deliberately narrow (text-to-image only). Edit/mask/transparent/
|
|
17
|
+
* batch are out of scope — see the design doc.
|
|
18
|
+
*
|
|
19
|
+
* Uses the native `fetch` (codeshell does not depend on the `openai` SDK).
|
|
20
|
+
*/
|
|
21
|
+
import type { ToolDefinition } from "../../types.js";
|
|
22
|
+
import type { ToolContext } from "../context.js";
|
|
23
|
+
/** A configured imageGen/videoGen instance (subset used here). */
|
|
24
|
+
interface GenInstance {
|
|
25
|
+
id: string;
|
|
26
|
+
kind: string;
|
|
27
|
+
baseUrl: string;
|
|
28
|
+
apiKey?: string;
|
|
29
|
+
defaultModel?: string;
|
|
30
|
+
catalogId?: string;
|
|
31
|
+
apiKeyRef?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Effective key for an instance: its own `apiKey`, or — when empty and
|
|
35
|
+
* `apiKeyRef` is set — the key of the referenced instance in the same list
|
|
36
|
+
* (reuse-key feature). Returns undefined when neither yields a key.
|
|
37
|
+
*/
|
|
38
|
+
export declare function effectiveApiKey(inst: GenInstance, list: GenInstance[]): string | undefined;
|
|
39
|
+
export declare const generateImageToolDef: ToolDefinition;
|
|
40
|
+
/**
|
|
41
|
+
* List the configured, usable image providers for a workspace (TODO 7.1) —
|
|
42
|
+
* either `imageGen.providers[]` ids+kinds, or the back-compat LLM-provider
|
|
43
|
+
* kinds. Used to build a dynamic tool description so the model sees which
|
|
44
|
+
* backends are actually available. Returns [] on any read error.
|
|
45
|
+
*/
|
|
46
|
+
export declare function listConfiguredImageProviders(cwd?: string): Array<{
|
|
47
|
+
id?: string;
|
|
48
|
+
kind: string;
|
|
49
|
+
catalogId?: string;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Build the GenerateImage tool description for a workspace, appending the
|
|
53
|
+
* configured providers so the model knows what's available and which `provider`
|
|
54
|
+
* values are valid (TODO 7.1). Falls back to the static description when none
|
|
55
|
+
* are configured (the guard hides the tool in that case anyway).
|
|
56
|
+
*/
|
|
57
|
+
export declare function generateImageToolDefFor(cwd: string): ToolDefinition;
|
|
58
|
+
export declare function isGenerateImageAvailable(cwd?: string, nowMs?: number): boolean;
|
|
59
|
+
export declare function generateImageTool(args: Record<string, unknown>, ctx?: ToolContext): Promise<string>;
|
|
60
|
+
export {};
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in GenerateImage tool — text-to-image via the OpenAI Images API
|
|
3
|
+
* (`gpt-image-2`).
|
|
4
|
+
*
|
|
5
|
+
* Credentials come from config, not env: the tool finds the `kind: "openai"`
|
|
6
|
+
* entry in `settings.providers[]` and uses its `apiKey` + `baseUrl`. No
|
|
7
|
+
* `OPENAI_API_KEY` required, no new config — an existing OpenAI provider is
|
|
8
|
+
* reused as-is.
|
|
9
|
+
*
|
|
10
|
+
* The generated PNG is decoded from the API's base64 payload and written to
|
|
11
|
+
* `<cwd>/.code-shell/generated_images/<timestamp>.png`; the tool returns the
|
|
12
|
+
* absolute path so the model can Read or reference it on later turns. This
|
|
13
|
+
* mirrors codex's imagegen CLI fallback (`scripts/image_gen.py`): call API →
|
|
14
|
+
* take b64_json → decode → write → report path.
|
|
15
|
+
*
|
|
16
|
+
* Scope is deliberately narrow (text-to-image only). Edit/mask/transparent/
|
|
17
|
+
* batch are out of scope — see the design doc.
|
|
18
|
+
*
|
|
19
|
+
* Uses the native `fetch` (codeshell does not depend on the `openai` SDK).
|
|
20
|
+
*/
|
|
21
|
+
import { writeFile, mkdir, readFile } from "node:fs/promises";
|
|
22
|
+
import { join, isAbsolute, resolve as resolvePath, basename, extname } from "node:path";
|
|
23
|
+
import { randomBytes } from "node:crypto";
|
|
24
|
+
import { SettingsManager } from "../../settings/manager.js";
|
|
25
|
+
import { getImageProvider, DEFAULT_IMAGE_MODEL, } from "./image-providers.js";
|
|
26
|
+
import { getMergedCatalog, findCatalogEntry } from "../../model-catalog/index.js";
|
|
27
|
+
import { genInstancesFromConnections } from "../../model-catalog/gen-connections.js";
|
|
28
|
+
/**
|
|
29
|
+
* Effective key for an instance: its own `apiKey`, or — when empty and
|
|
30
|
+
* `apiKeyRef` is set — the key of the referenced instance in the same list
|
|
31
|
+
* (reuse-key feature). Returns undefined when neither yields a key.
|
|
32
|
+
*/
|
|
33
|
+
export function effectiveApiKey(inst, list) {
|
|
34
|
+
if (inst.apiKey)
|
|
35
|
+
return inst.apiKey;
|
|
36
|
+
if (inst.apiKeyRef) {
|
|
37
|
+
const ref = list.find((p) => p.id === inst.apiKeyRef);
|
|
38
|
+
if (ref?.apiKey)
|
|
39
|
+
return ref.apiKey;
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve a ResolvedImageProvider from a candidate list whose entries already
|
|
45
|
+
* carry a direct `apiKey` (the unified store dereferences credentials upfront).
|
|
46
|
+
* `prefer` selects by id (explicit → no silent fallback); else `def` then the
|
|
47
|
+
* first usable. Shared by the unified-store path.
|
|
48
|
+
*/
|
|
49
|
+
function resolveFromGenList(list, prefer, def) {
|
|
50
|
+
const usable = (p) => !!p.apiKey && getImageProvider(p.kind) !== null;
|
|
51
|
+
const credsOf = (p) => ({ baseUrl: p.baseUrl, apiKey: p.apiKey });
|
|
52
|
+
if (prefer) {
|
|
53
|
+
const chosen = list.find((p) => p.id === prefer);
|
|
54
|
+
if (chosen && usable(chosen))
|
|
55
|
+
return { kind: chosen.kind, creds: credsOf(chosen), defaultModel: chosen.defaultModel };
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const preferred = def ? list.find((p) => p.id === def) : undefined;
|
|
59
|
+
const chosen = (preferred && usable(preferred) ? preferred : undefined) ?? list.find(usable);
|
|
60
|
+
return chosen ? { kind: chosen.kind, creds: credsOf(chosen), defaultModel: chosen.defaultModel } : null;
|
|
61
|
+
}
|
|
62
|
+
const DEFAULT_SIZE = "1024x1024";
|
|
63
|
+
const DEFAULT_QUALITY = "auto";
|
|
64
|
+
/** Provider `kind`s that have an image adapter, in resolution preference. */
|
|
65
|
+
const IMAGE_PROVIDER_KINDS = ["openai", "google"];
|
|
66
|
+
export const generateImageToolDef = {
|
|
67
|
+
name: "GenerateImage",
|
|
68
|
+
description: "Generate an image from a text prompt, or edit/re-imagine existing image(s) by passing " +
|
|
69
|
+
"`referenceImages` (image-to-image). Saves a PNG into the workspace and returns its " +
|
|
70
|
+
"absolute path; read or reference that path on later turns. Defaults to the OpenAI Images " +
|
|
71
|
+
"API (gpt-image-2); requires a matching provider configured in settings. " +
|
|
72
|
+
"For raster assets (photos, illustrations, mockups, textures) — not for " +
|
|
73
|
+
"SVG/vector icons or anything better built directly in code.",
|
|
74
|
+
inputSchema: {
|
|
75
|
+
type: "object",
|
|
76
|
+
properties: {
|
|
77
|
+
prompt: {
|
|
78
|
+
type: "string",
|
|
79
|
+
description: "Description of the image to generate",
|
|
80
|
+
},
|
|
81
|
+
size: {
|
|
82
|
+
type: "string",
|
|
83
|
+
enum: ["1024x1024", "1536x1024", "1024x1536", "auto"],
|
|
84
|
+
description: "Image dimensions (default 1024x1024)",
|
|
85
|
+
},
|
|
86
|
+
quality: {
|
|
87
|
+
type: "string",
|
|
88
|
+
enum: ["low", "medium", "high", "auto"],
|
|
89
|
+
description: "Render quality (default auto). Use low for drafts, high for final assets.",
|
|
90
|
+
},
|
|
91
|
+
provider: {
|
|
92
|
+
type: "string",
|
|
93
|
+
description: "Image provider to use. With imageGen configured, this is the instance `id` " +
|
|
94
|
+
"(e.g. \"gemini\"); otherwise it's a provider kind (e.g. \"openai\"). " +
|
|
95
|
+
"Defaults to the configured default / first available. Only specify to override.",
|
|
96
|
+
},
|
|
97
|
+
model: {
|
|
98
|
+
type: "string",
|
|
99
|
+
description: "Image model id (e.g. \"gpt-image-2\"). Defaults to the provider's default model. " +
|
|
100
|
+
"Only specify to override.",
|
|
101
|
+
},
|
|
102
|
+
referenceImages: {
|
|
103
|
+
type: "array",
|
|
104
|
+
items: { type: "string" },
|
|
105
|
+
description: "Optional workspace image path(s) to use as visual references (image-to-image / " +
|
|
106
|
+
"edit). When provided, the prompt edits/re-imagines these inputs instead of " +
|
|
107
|
+
"generating from scratch — use it to keep a subject, style, or composition. " +
|
|
108
|
+
"Paths are relative to the workspace (or absolute). PNG/JPEG/WebP, up to 16.",
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
required: ["prompt"],
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Resolve an image provider from settings (TODO 7.1). Preference order:
|
|
116
|
+
*
|
|
117
|
+
* 1. `imageGen.providers[]` — the canonical, LLM-decoupled config. `prefer`
|
|
118
|
+
* selects an instance by its `id`; otherwise `imageGen.defaultProvider`,
|
|
119
|
+
* else the first entry. Each instance names its own adapter `kind`.
|
|
120
|
+
* 2. Fallback (no `imageGen`): scan LLM `providers[]` for an image-capable
|
|
121
|
+
* `kind` — keeps existing configs working with no migration. Here
|
|
122
|
+
* `prefer` is treated as a kind.
|
|
123
|
+
*
|
|
124
|
+
* Returns null when nothing usable is configured (or the requested one lacks
|
|
125
|
+
* a key / has no adapter).
|
|
126
|
+
*/
|
|
127
|
+
function resolveImageProvider(cwd, prefer) {
|
|
128
|
+
const settings = new SettingsManager(cwd, "full").get();
|
|
129
|
+
// 0. Unified store (统一模型接入方案): modelConnections (tag=image) +
|
|
130
|
+
// credentials. Takes precedence over the legacy imageGen.providers[] so the
|
|
131
|
+
// unified connection page drives image generation. Falls through to the
|
|
132
|
+
// legacy paths below when no image connection is configured.
|
|
133
|
+
const conns = settings.modelConnections;
|
|
134
|
+
const creds = settings.credentials;
|
|
135
|
+
if (Array.isArray(conns) && conns.some((c) => c.tag === "image")) {
|
|
136
|
+
const list = genInstancesFromConnections(conns, (Array.isArray(creds) ? creds : []), getMergedCatalog(), "image");
|
|
137
|
+
const def = settings.defaults?.image;
|
|
138
|
+
const resolved = resolveFromGenList(list, prefer, def);
|
|
139
|
+
if (resolved)
|
|
140
|
+
return resolved;
|
|
141
|
+
if (prefer)
|
|
142
|
+
return null; // explicit request not usable → don't silently fall back
|
|
143
|
+
}
|
|
144
|
+
// 1. Canonical imageGen config.
|
|
145
|
+
const imageGen = settings.imageGen;
|
|
146
|
+
if (imageGen && Array.isArray(imageGen.providers) && imageGen.providers.length > 0) {
|
|
147
|
+
const list = imageGen.providers;
|
|
148
|
+
const usable = (p) => !!effectiveApiKey(p, list) && getImageProvider(p.kind) !== null;
|
|
149
|
+
const credsOf = (p) => ({ baseUrl: p.baseUrl, apiKey: effectiveApiKey(p, list) });
|
|
150
|
+
if (prefer) {
|
|
151
|
+
// Explicit request — respect the user's intent. If that exact instance
|
|
152
|
+
// isn't usable (no key / no adapter), DON'T silently use another one.
|
|
153
|
+
const chosen = list.find((p) => p.id === prefer);
|
|
154
|
+
if (chosen && usable(chosen)) {
|
|
155
|
+
return { kind: chosen.kind, creds: credsOf(chosen), defaultModel: chosen.defaultModel };
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
// No explicit request: prefer defaultProvider, but if it isn't usable
|
|
160
|
+
// (e.g. configured but no key yet) fall back to the first usable entry,
|
|
161
|
+
// rather than erroring. (User-confirmed: default-with-no-key → fall back.)
|
|
162
|
+
const preferred = imageGen.defaultProvider
|
|
163
|
+
? list.find((p) => p.id === imageGen.defaultProvider)
|
|
164
|
+
: undefined;
|
|
165
|
+
const chosen = (preferred && usable(preferred) ? preferred : undefined) ?? list.find(usable);
|
|
166
|
+
if (chosen) {
|
|
167
|
+
return { kind: chosen.kind, creds: credsOf(chosen), defaultModel: chosen.defaultModel };
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
// 2. Back-compat: resolve from legacy LLM providers[] by kind. The field was
|
|
172
|
+
// dropped from the schema; un-migrated settings.json still carry it via the
|
|
173
|
+
// schema's .passthrough(), so read it through an inline cast.
|
|
174
|
+
const legacyProviders = settings.providers ?? [];
|
|
175
|
+
const kinds = prefer ? [prefer] : [...IMAGE_PROVIDER_KINDS];
|
|
176
|
+
for (const kind of kinds) {
|
|
177
|
+
if (!prefer && !IMAGE_PROVIDER_KINDS.includes(kind))
|
|
178
|
+
continue;
|
|
179
|
+
const provider = legacyProviders.find((p) => p.kind === kind);
|
|
180
|
+
if (provider && provider.apiKey) {
|
|
181
|
+
return { kind, creds: { baseUrl: provider.baseUrl, apiKey: provider.apiKey } };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Tool-visibility guard: GenerateImage needs a kind:"openai" provider with a
|
|
188
|
+
* key. resolveOpenAIProvider returns null when none is configured.
|
|
189
|
+
*
|
|
190
|
+
* Cached per-cwd with a short TTL: the guard runs on EVERY message's toolDefs
|
|
191
|
+
* assembly (engine.ts), and resolveOpenAIProvider reads + parses settings from
|
|
192
|
+
* disk each call. The 1s TTL collapses the back-to-back reads (same message,
|
|
193
|
+
* rapid turns) while still picking up a newly-configured key well within the
|
|
194
|
+
* gap before the user's next message. The execution path
|
|
195
|
+
* (resolveOpenAIProvider) is intentionally NOT cached — only this boolean.
|
|
196
|
+
*/
|
|
197
|
+
const availCache = new Map();
|
|
198
|
+
const AVAIL_TTL_MS = 1000;
|
|
199
|
+
/**
|
|
200
|
+
* List the configured, usable image providers for a workspace (TODO 7.1) —
|
|
201
|
+
* either `imageGen.providers[]` ids+kinds, or the back-compat LLM-provider
|
|
202
|
+
* kinds. Used to build a dynamic tool description so the model sees which
|
|
203
|
+
* backends are actually available. Returns [] on any read error.
|
|
204
|
+
*/
|
|
205
|
+
export function listConfiguredImageProviders(cwd = process.cwd()) {
|
|
206
|
+
try {
|
|
207
|
+
const settings = new SettingsManager(cwd, "full").get();
|
|
208
|
+
const imageGen = settings.imageGen;
|
|
209
|
+
if (imageGen?.providers?.length) {
|
|
210
|
+
const list = imageGen.providers;
|
|
211
|
+
return list
|
|
212
|
+
.filter((p) => !!effectiveApiKey(p, list) && getImageProvider(p.kind) !== null)
|
|
213
|
+
.map((p) => ({ id: p.id, kind: p.kind, catalogId: p.catalogId }));
|
|
214
|
+
}
|
|
215
|
+
// Legacy LLM providers[] back-compat (field dropped from schema; read via
|
|
216
|
+
// .passthrough() with an inline cast).
|
|
217
|
+
const legacyProviders = settings.providers ?? [];
|
|
218
|
+
return legacyProviders
|
|
219
|
+
.filter((p) => p.apiKey &&
|
|
220
|
+
IMAGE_PROVIDER_KINDS.includes(p.kind))
|
|
221
|
+
.map((p) => ({ kind: p.kind }));
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return [];
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Build the GenerateImage tool description for a workspace, appending the
|
|
229
|
+
* configured providers so the model knows what's available and which `provider`
|
|
230
|
+
* values are valid (TODO 7.1). Falls back to the static description when none
|
|
231
|
+
* are configured (the guard hides the tool in that case anyway).
|
|
232
|
+
*/
|
|
233
|
+
export function generateImageToolDefFor(cwd) {
|
|
234
|
+
const providers = listConfiguredImageProviders(cwd);
|
|
235
|
+
if (providers.length === 0)
|
|
236
|
+
return generateImageToolDef;
|
|
237
|
+
const names = providers.map((p) => p.id ?? p.kind).join(", ");
|
|
238
|
+
// Per-instance params hints from the catalog (paramsDoc) — so the model knows
|
|
239
|
+
// what each configured model accepts (different models differ).
|
|
240
|
+
const catalog = getMergedCatalog();
|
|
241
|
+
const paramLines = providers
|
|
242
|
+
.map((p) => {
|
|
243
|
+
const entry = findCatalogEntry(catalog, p.catalogId, p.kind);
|
|
244
|
+
return entry?.paramsDoc ? ` - ${p.id ?? p.kind}: ${entry.paramsDoc}` : null;
|
|
245
|
+
})
|
|
246
|
+
.filter((x) => x !== null);
|
|
247
|
+
const paramsBlock = paramLines.length ? `\nParams per provider:\n${paramLines.join("\n")}` : "";
|
|
248
|
+
return {
|
|
249
|
+
...generateImageToolDef,
|
|
250
|
+
description: generateImageToolDef.description +
|
|
251
|
+
` Configured provider(s): ${names}. Pass \`provider\` to pick one.` +
|
|
252
|
+
paramsBlock,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
export function isGenerateImageAvailable(cwd = process.cwd(), nowMs = Date.now()) {
|
|
256
|
+
const hit = availCache.get(cwd);
|
|
257
|
+
if (hit && nowMs - hit.at < AVAIL_TTL_MS)
|
|
258
|
+
return hit.value;
|
|
259
|
+
let value = false;
|
|
260
|
+
try {
|
|
261
|
+
value = resolveImageProvider(cwd) !== null;
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
value = false;
|
|
265
|
+
}
|
|
266
|
+
availCache.set(cwd, { at: nowMs, value });
|
|
267
|
+
return value;
|
|
268
|
+
}
|
|
269
|
+
/** Map a file extension to an image MIME type the image APIs accept. */
|
|
270
|
+
const IMAGE_MIME_BY_EXT = {
|
|
271
|
+
".png": "image/png",
|
|
272
|
+
".jpg": "image/jpeg",
|
|
273
|
+
".jpeg": "image/jpeg",
|
|
274
|
+
".webp": "image/webp",
|
|
275
|
+
".gif": "image/gif",
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* Read reference-image paths (workspace-relative or absolute) into decoded
|
|
279
|
+
* {@link InputImage}s for image-to-image. Returns either the loaded images or a
|
|
280
|
+
* user-facing error string (bad path, unreadable, unsupported type, too many).
|
|
281
|
+
*/
|
|
282
|
+
async function loadReferenceImages(paths, cwd) {
|
|
283
|
+
if (paths.length > 16) {
|
|
284
|
+
return { ok: false, error: `too many reference images (${paths.length}); max is 16` };
|
|
285
|
+
}
|
|
286
|
+
const images = [];
|
|
287
|
+
for (const p of paths) {
|
|
288
|
+
if (typeof p !== "string" || !p.trim()) {
|
|
289
|
+
return { ok: false, error: "referenceImages entries must be non-empty path strings" };
|
|
290
|
+
}
|
|
291
|
+
const ext = extname(p).toLowerCase();
|
|
292
|
+
const mimeType = IMAGE_MIME_BY_EXT[ext];
|
|
293
|
+
if (!mimeType) {
|
|
294
|
+
return {
|
|
295
|
+
ok: false,
|
|
296
|
+
error: `unsupported reference image type "${ext || "(none)"}" for ${p}; use PNG/JPEG/WebP/GIF`,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const abs = isAbsolute(p) ? p : resolvePath(cwd, p);
|
|
300
|
+
let bytes;
|
|
301
|
+
try {
|
|
302
|
+
bytes = await readFile(abs);
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
return { ok: false, error: `could not read reference image ${p}: ${err.message}` };
|
|
306
|
+
}
|
|
307
|
+
images.push({ filename: basename(abs), mimeType, bytes });
|
|
308
|
+
}
|
|
309
|
+
return { ok: true, images };
|
|
310
|
+
}
|
|
311
|
+
export async function generateImageTool(args, ctx) {
|
|
312
|
+
const prompt = args.prompt;
|
|
313
|
+
if (typeof prompt !== "string" || !prompt.trim()) {
|
|
314
|
+
return "Error: prompt is required";
|
|
315
|
+
}
|
|
316
|
+
const size = typeof args.size === "string" ? args.size : DEFAULT_SIZE;
|
|
317
|
+
const quality = typeof args.quality === "string" ? args.quality : DEFAULT_QUALITY;
|
|
318
|
+
const preferKind = typeof args.provider === "string" && args.provider ? args.provider : undefined;
|
|
319
|
+
const overrideModel = typeof args.model === "string" && args.model ? args.model : undefined;
|
|
320
|
+
const cwd = ctx?.cwd ?? process.cwd();
|
|
321
|
+
// Optional reference images → image-to-image. Resolve + decode before the
|
|
322
|
+
// provider call so a bad path fails fast with a clear message.
|
|
323
|
+
let inputImages;
|
|
324
|
+
if (Array.isArray(args.referenceImages) && args.referenceImages.length > 0) {
|
|
325
|
+
const loaded = await loadReferenceImages(args.referenceImages, cwd);
|
|
326
|
+
if (!loaded.ok)
|
|
327
|
+
return `Error: ${loaded.error}`;
|
|
328
|
+
inputImages = loaded.images;
|
|
329
|
+
}
|
|
330
|
+
const resolved = resolveImageProvider(cwd, preferKind);
|
|
331
|
+
if (!resolved) {
|
|
332
|
+
return preferKind
|
|
333
|
+
? `Error: no image provider "${preferKind}" is available (unknown id/kind, or it has no API key). Configure it in your code-shell settings, or omit \`provider\` to use the default.`
|
|
334
|
+
: 'Error: no image provider available. Configure an image provider (including an apiKey) ' +
|
|
335
|
+
"in your code-shell settings to use GenerateImage.";
|
|
336
|
+
}
|
|
337
|
+
const adapter = getImageProvider(resolved.kind);
|
|
338
|
+
if (!adapter) {
|
|
339
|
+
return `Error: image generation is not supported for provider kind "${resolved.kind}".`;
|
|
340
|
+
}
|
|
341
|
+
// Model precedence: call arg > instance defaultModel (imageGen) > kind default.
|
|
342
|
+
const model = overrideModel ?? resolved.defaultModel ?? DEFAULT_IMAGE_MODEL[resolved.kind] ?? "gpt-image-2";
|
|
343
|
+
const result = await adapter.generate({
|
|
344
|
+
prompt,
|
|
345
|
+
size,
|
|
346
|
+
quality,
|
|
347
|
+
model,
|
|
348
|
+
creds: resolved.creds,
|
|
349
|
+
inputImages,
|
|
350
|
+
signal: ctx?.signal,
|
|
351
|
+
});
|
|
352
|
+
if (!result.ok) {
|
|
353
|
+
return `Error generating image: ${result.error}`;
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
const dir = join(cwd, ".code-shell", "generated_images");
|
|
357
|
+
await mkdir(dir, { recursive: true });
|
|
358
|
+
// Timestamp keeps names sortable/recognizable; the random suffix prevents
|
|
359
|
+
// collisions when multiple GenerateImage calls run concurrently in one turn
|
|
360
|
+
// (Date.now() alone repeats within the same millisecond → writeFile would
|
|
361
|
+
// silently overwrite and drop an image).
|
|
362
|
+
const path = join(dir, `${Date.now()}-${randomBytes(3).toString("hex")}.png`);
|
|
363
|
+
await writeFile(path, Buffer.from(result.b64, "base64"));
|
|
364
|
+
// Name the provider/model actually used, so the user/agent knows which
|
|
365
|
+
// image backend produced this (esp. when a default fell back to another).
|
|
366
|
+
const mode = inputImages?.length
|
|
367
|
+
? ` from ${inputImages.length} reference image(s)`
|
|
368
|
+
: "";
|
|
369
|
+
return `Generated image with ${resolved.kind} (${model})${mode}, saved to ${path}`;
|
|
370
|
+
}
|
|
371
|
+
catch (err) {
|
|
372
|
+
return `Error saving generated image: ${err.message}`;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in GenerateVideo tool (TODO 7.1 块3) — text-to-video via a
|
|
3
|
+
* {@link VideoProvider} adapter (submit / poll / download).
|
|
4
|
+
*
|
|
5
|
+
* Video generation is always slow (tens of seconds to minutes), so this tool
|
|
6
|
+
* is fire-and-forget by design: it submits the job, returns a handle
|
|
7
|
+
* immediately, and polls in the BACKGROUND. When the job finishes it writes
|
|
8
|
+
* the file to `<cwd>/.code-shell/generated_videos/` and enqueues a completion
|
|
9
|
+
* notification (same notificationQueue path as background agents / shells), so
|
|
10
|
+
* the main turn is never blocked (consistent with TODO 3.2 / 4.1).
|
|
11
|
+
*
|
|
12
|
+
* Concrete provider adapters (Seedance / Kling) are not wired yet — their
|
|
13
|
+
* private APIs need confirmed docs. Until then the only resolvable provider is
|
|
14
|
+
* the test-injected fake, so in production this tool is dormant (returns a
|
|
15
|
+
* "no video provider configured" message) rather than half-working.
|
|
16
|
+
*/
|
|
17
|
+
import type { ToolDefinition } from "../../types.js";
|
|
18
|
+
import type { ToolContext } from "../context.js";
|
|
19
|
+
import { type VideoProvider, type VideoProviderCreds } from "./video-providers.js";
|
|
20
|
+
import { type ImageUploader, type UploaderCreds } from "./image-uploader.js";
|
|
21
|
+
/**
|
|
22
|
+
* Normalize image inputs (URLs or local paths) into public URLs the provider
|
|
23
|
+
* can consume. `images[]` wins over the single `image`. Local paths are
|
|
24
|
+
* uploaded via the injected {@link ImageUploader}; URLs pass through. Caps at
|
|
25
|
+
* {@link MAX_IMAGES} (fal reference-to-video allows up to 9).
|
|
26
|
+
*/
|
|
27
|
+
export declare function __normalizeImagesForTests(images: string[] | undefined, image: string | undefined, uploader: ImageUploader, creds: UploaderCreds, signal?: AbortSignal): Promise<{
|
|
28
|
+
ok: true;
|
|
29
|
+
urls: string[];
|
|
30
|
+
} | {
|
|
31
|
+
ok: false;
|
|
32
|
+
error: string;
|
|
33
|
+
}>;
|
|
34
|
+
export declare const generateVideoToolDef: ToolDefinition;
|
|
35
|
+
export declare function __setVideoProviderForTests(p: VideoProvider | null): void;
|
|
36
|
+
export declare function isGenerateVideoAvailable(cwd?: string, nowMs?: number): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* List configured, usable video providers (TODO 7.1). Returns [] when no
|
|
39
|
+
* adapters are wired (VIDEO_PROVIDER_KINDS empty) or none configured.
|
|
40
|
+
*/
|
|
41
|
+
export declare function listConfiguredVideoProviders(cwd?: string): Array<{
|
|
42
|
+
id?: string;
|
|
43
|
+
kind: string;
|
|
44
|
+
catalogId?: string;
|
|
45
|
+
}>;
|
|
46
|
+
/** Dynamic GenerateVideo description naming configured providers (TODO 7.1). */
|
|
47
|
+
export declare function generateVideoToolDefFor(cwd: string): ToolDefinition;
|
|
48
|
+
interface ResolvedVideoProvider {
|
|
49
|
+
kind: string;
|
|
50
|
+
creds: VideoProviderCreds;
|
|
51
|
+
defaultModel?: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function __resolveVideoProviderForTests(cwd: string, preferKind?: string): ResolvedVideoProvider | null;
|
|
54
|
+
export declare function generateVideoTool(args: Record<string, unknown>, ctx?: ToolContext): Promise<string>;
|
|
55
|
+
export {};
|