@cjhyy/code-shell-core 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -23
- package/dist/agent/agent-definition-registry.d.ts +2 -2
- package/dist/agent/agent-definition-registry.js +47 -10
- package/dist/agent/agent-definition.d.ts +5 -0
- package/dist/agent/agent-definition.js +14 -0
- package/dist/automation/index.d.ts +7 -4
- package/dist/automation/index.js +4 -2
- package/dist/automation/runner.js +3 -1
- package/dist/automation/scheduler.d.ts +57 -1
- package/dist/automation/scheduler.js +123 -23
- package/dist/automation/store.d.ts +6 -2
- package/dist/automation/store.js +7 -3
- package/dist/capabilities/index.d.ts +109 -0
- package/dist/capabilities/index.js +80 -0
- package/dist/capability-control/disabled-lists.d.ts +2 -1
- package/dist/capability-control/disabled-lists.js +3 -5
- package/dist/capability-control/overlay.d.ts +14 -1
- package/dist/capability-control/overlay.js +40 -0
- package/dist/capability-control/service.js +6 -4
- package/dist/cli/agent-server-stdio.d.ts +1 -1
- package/dist/cli/agent-server-stdio.js +66 -6
- package/dist/cli/agent-server-tcp.js +20 -5
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +20 -4
- package/dist/context/manager.js +42 -7
- package/dist/context/token-counter.js +5 -3
- package/dist/context/tool-result-storage.d.ts +6 -0
- package/dist/context/tool-result-storage.js +25 -4
- package/dist/credentials/access.d.ts +13 -2
- package/dist/credentials/access.js +99 -4
- package/dist/credentials/index.d.ts +3 -2
- package/dist/credentials/index.js +2 -1
- package/dist/credentials/oauth.d.ts +9 -1
- package/dist/credentials/oauth.js +80 -1
- package/dist/credentials/store.d.ts +16 -2
- package/dist/credentials/store.js +33 -11
- package/dist/credentials/types.d.ts +62 -1
- package/dist/credentials/types.js +16 -1
- package/dist/credentials/use-credential-tool.js +15 -1
- package/dist/engine/auxiliary-pipeline.d.ts +40 -0
- package/dist/engine/auxiliary-pipeline.js +181 -0
- package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
- package/dist/{settings → engine}/disk-defaults.js +5 -2
- package/dist/engine/dynamic-tool-defs.d.ts +4 -0
- package/dist/engine/dynamic-tool-defs.js +4 -0
- package/dist/engine/engine.d.ts +272 -184
- package/dist/engine/engine.js +1869 -1864
- package/dist/engine/file-history-hook.d.ts +11 -0
- package/dist/engine/file-history-hook.js +31 -0
- package/dist/engine/goal-judge-context.d.ts +9 -0
- package/dist/engine/goal-judge-context.js +234 -0
- package/dist/engine/injected-context-cache.d.ts +6 -0
- package/dist/engine/injected-context-cache.js +13 -0
- package/dist/engine/input-attachments.d.ts +1 -1
- package/dist/engine/model-facade.d.ts +3 -3
- package/dist/engine/model-facade.js +15 -14
- package/dist/engine/permission-controller.d.ts +55 -0
- package/dist/engine/permission-controller.js +148 -0
- package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
- package/dist/engine/prompt-cache-diagnostics.js +178 -0
- package/dist/engine/run-accounting.d.ts +41 -0
- package/dist/engine/run-accounting.js +126 -0
- package/dist/engine/run-context.d.ts +44 -0
- package/dist/engine/run-context.js +88 -0
- package/dist/engine/run-environment.d.ts +30 -0
- package/dist/engine/run-environment.js +77 -0
- package/dist/engine/run-finalize.d.ts +58 -0
- package/dist/engine/run-finalize.js +245 -0
- package/dist/engine/run-goal.d.ts +58 -0
- package/dist/engine/run-goal.js +188 -0
- package/dist/engine/run-image-input.d.ts +1 -1
- package/dist/engine/run-image-input.js +5 -3
- package/dist/engine/run-session-open.d.ts +41 -0
- package/dist/engine/run-session-open.js +186 -0
- package/dist/engine/run-setup.d.ts +42 -0
- package/dist/engine/run-setup.js +58 -0
- package/dist/engine/run-tooling.d.ts +125 -0
- package/dist/engine/run-tooling.js +283 -0
- package/dist/engine/run-types.d.ts +139 -0
- package/dist/engine/run-types.js +12 -0
- package/dist/engine/run-workspace.d.ts +50 -0
- package/dist/engine/run-workspace.js +114 -0
- package/dist/engine/session-title.d.ts +2 -1
- package/dist/engine/session-title.js +4 -1
- package/dist/engine/steer-queue.d.ts +1 -1
- package/dist/engine/subagent-spawner.d.ts +32 -0
- package/dist/engine/subagent-spawner.js +287 -0
- package/dist/engine/tool-summary.d.ts +2 -2
- package/dist/engine/tool-summary.js +2 -2
- package/dist/engine/turn-loop.d.ts +67 -10
- package/dist/engine/turn-loop.js +538 -97
- package/dist/engine/types.d.ts +35 -4
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +26 -9
- package/dist/hooks/events.js +0 -3
- package/dist/hooks/goal-stop-hook.d.ts +28 -29
- package/dist/hooks/goal-stop-hook.js +344 -144
- package/dist/hooks/registry.js +4 -1
- package/dist/hooks/shell-runner.d.ts +12 -1
- package/dist/hooks/shell-runner.js +160 -9
- package/dist/index.d.ts +51 -110
- package/dist/index.extension.d.ts +51 -0
- package/dist/index.extension.js +39 -0
- package/dist/index.internal.d.ts +86 -0
- package/dist/index.internal.js +92 -0
- package/dist/index.js +37 -125
- package/dist/links/cli.d.ts +48 -0
- package/dist/links/cli.js +617 -0
- package/dist/links/http.d.ts +40 -0
- package/dist/links/http.js +166 -0
- package/dist/links/index.d.ts +4 -0
- package/dist/links/index.js +3 -0
- package/dist/links/link-action-tool.d.ts +5 -0
- package/dist/links/link-action-tool.js +241 -0
- package/dist/links/providers.d.ts +8 -0
- package/dist/links/providers.js +665 -0
- package/dist/links/types.d.ts +44 -0
- package/dist/llm/client-base.d.ts +7 -0
- package/dist/llm/client-base.js +72 -10
- package/dist/llm/model-pool.d.ts +1 -1
- package/dist/llm/model-pool.js +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -0
- package/dist/llm/providers/anthropic.js +9 -0
- package/dist/llm/providers/openai.d.ts +1 -0
- package/dist/llm/providers/openai.js +17 -0
- package/dist/llm/types.d.ts +12 -5
- package/dist/model-catalog/index.js +15 -2
- package/dist/model-catalog/resolve.d.ts +13 -1
- package/dist/model-catalog/resolve.js +37 -2
- package/dist/model-catalog/types.d.ts +74 -48
- package/dist/model-catalog/types.js +16 -5
- package/dist/model-catalog/upsert.d.ts +3 -1
- package/dist/model-catalog/upsert.js +9 -0
- package/dist/onboarding.d.ts +0 -1
- package/dist/onboarding.js +1 -22
- package/dist/panel-apps/bindings.d.ts +24 -0
- package/dist/panel-apps/bindings.js +69 -0
- package/dist/panel-apps/github-archive.d.ts +21 -0
- package/dist/panel-apps/github-archive.js +98 -0
- package/dist/panel-apps/index.d.ts +4 -0
- package/dist/panel-apps/index.js +4 -0
- package/dist/panel-apps/installer.d.ts +68 -0
- package/dist/panel-apps/installer.js +622 -0
- package/dist/panel-apps/manifest.d.ts +364 -0
- package/dist/panel-apps/manifest.js +189 -0
- package/dist/panel-apps/paths.d.ts +13 -0
- package/dist/panel-apps/paths.js +38 -0
- package/dist/panel-apps/registry.d.ts +51 -0
- package/dist/panel-apps/registry.js +99 -0
- package/dist/panel-apps/runtime.d.ts +80 -0
- package/dist/panel-apps/runtime.js +154 -0
- package/dist/plugins/gitOps.js +8 -1
- package/dist/plugins/installedPlugins.d.ts +2 -1
- package/dist/plugins/installedPlugins.js +146 -8
- package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
- package/dist/plugins/installer/codex/convertAgents.js +62 -8
- package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
- package/dist/plugins/installer/codex/convertCommands.js +35 -12
- package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
- package/dist/plugins/installer/codex/convertHooks.js +82 -0
- package/dist/plugins/installer/codex/convertSkills.js +41 -6
- package/dist/plugins/installer/install.d.ts +7 -1
- package/dist/plugins/installer/install.js +21 -87
- package/dist/plugins/installer/installFromArchive.d.ts +26 -4
- package/dist/plugins/installer/installFromArchive.js +44 -27
- package/dist/plugins/installer/installFromNpm.d.ts +31 -0
- package/dist/plugins/installer/installFromNpm.js +273 -0
- package/dist/plugins/installer/loadPluginAgents.js +17 -4
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +245 -35
- package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
- package/dist/plugins/installer/normalizeManifest.js +306 -0
- package/dist/plugins/installer/npmTar.d.ts +13 -0
- package/dist/plugins/installer/npmTar.js +321 -0
- package/dist/plugins/installer/parseSource.d.ts +11 -0
- package/dist/plugins/installer/parseSource.js +48 -0
- package/dist/plugins/installer/preview.d.ts +101 -0
- package/dist/plugins/installer/preview.js +336 -0
- package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
- package/dist/plugins/installer/projectPluginSource.js +140 -0
- package/dist/plugins/installer/types.d.ts +775 -0
- package/dist/plugins/installer/types.js +100 -0
- package/dist/plugins/installer/unzip.d.ts +11 -0
- package/dist/plugins/installer/unzip.js +123 -9
- package/dist/plugins/installer/update.d.ts +2 -2
- package/dist/plugins/installer/update.js +43 -4
- package/dist/plugins/loadPluginHooks.d.ts +19 -2
- package/dist/plugins/loadPluginHooks.js +97 -86
- package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
- package/dist/plugins/pluginAutomationTemplates.js +50 -0
- package/dist/plugins/pluginCatalog.d.ts +45 -0
- package/dist/plugins/pluginCatalog.js +87 -0
- package/dist/plugins/pluginCommandHook.d.ts +10 -4
- package/dist/plugins/pluginCommandHook.js +133 -18
- package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
- package/dist/plugins/pluginCommandsLoader.js +181 -7
- package/dist/plugins/pluginContent.d.ts +10 -1
- package/dist/plugins/pluginContent.js +87 -30
- package/dist/plugins/pluginHookApproval.d.ts +30 -0
- package/dist/plugins/pluginHookApproval.js +160 -0
- package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
- package/dist/plugins/pluginHookIntegrity.js +361 -0
- package/dist/plugins/pluginInstaller.js +71 -12
- package/dist/plugins/pluginMcpApproval.d.ts +19 -0
- package/dist/plugins/pluginMcpApproval.js +110 -0
- package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
- package/dist/plugins/pluginMcpIntegrity.js +74 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/varRewrite.d.ts +9 -5
- package/dist/plugins/varRewrite.js +26 -17
- package/dist/preset/index.d.ts +11 -8
- package/dist/preset/index.js +62 -203
- package/dist/product/define.js +9 -3
- package/dist/product/types.d.ts +0 -2
- package/dist/profile/activation.d.ts +36 -0
- package/dist/profile/activation.js +57 -0
- package/dist/profile/catalog-store.d.ts +77 -0
- package/dist/profile/catalog-store.js +346 -0
- package/dist/profile/catalog.d.ts +54 -0
- package/dist/profile/catalog.js +152 -0
- package/dist/profile/index.d.ts +7 -0
- package/dist/profile/index.js +7 -0
- package/dist/profile/requirements.d.ts +76 -0
- package/dist/profile/requirements.js +117 -0
- package/dist/profile/resolve.d.ts +11 -0
- package/dist/profile/resolve.js +41 -0
- package/dist/profile/store.d.ts +17 -0
- package/dist/profile/store.js +167 -0
- package/dist/profile/types.d.ts +321 -0
- package/dist/profile/types.js +104 -0
- package/dist/prompt/composer.d.ts +46 -7
- package/dist/prompt/composer.js +78 -48
- package/dist/prompt/instruction-scanner.d.ts +6 -5
- package/dist/prompt/instruction-scanner.js +8 -23
- package/dist/prompt/section-loader.d.ts +2 -2
- package/dist/prompt/section-loader.js +7 -4
- package/dist/prompt/sections/browser.md +10 -9
- package/dist/prompt/sections/harness-base.md +9 -0
- package/dist/protocol/chat-session-manager.d.ts +77 -3
- package/dist/protocol/chat-session-manager.js +194 -18
- package/dist/protocol/chat-session.d.ts +72 -9
- package/dist/protocol/chat-session.js +151 -16
- package/dist/protocol/client.d.ts +37 -4
- package/dist/protocol/client.js +118 -6
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +2 -2
- package/dist/protocol/mobile-remote-types.d.ts +406 -0
- package/dist/protocol/mobile-remote-types.js +1 -0
- package/dist/protocol/server.d.ts +152 -14
- package/dist/protocol/server.js +1574 -229
- package/dist/protocol/types.d.ts +182 -32
- package/dist/protocol/types.js +18 -0
- package/dist/run/ArtifactTracker.d.ts +6 -1
- package/dist/run/ArtifactTracker.js +29 -21
- package/dist/run/EngineRunner.d.ts +2 -0
- package/dist/run/EngineRunner.js +1 -0
- package/dist/run/RunManager.d.ts +26 -0
- package/dist/run/RunManager.js +82 -11
- package/dist/run/factory.d.ts +3 -0
- package/dist/run/factory.js +2 -0
- package/dist/runtime/safe-spawn.d.ts +6 -0
- package/dist/runtime/safe-spawn.js +8 -13
- package/dist/services/auto-dream.d.ts +13 -1
- package/dist/services/auto-dream.js +56 -8
- package/dist/services/dream-consolidation.d.ts +3 -0
- package/dist/services/dream-consolidation.js +14 -2
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.d.ts +34 -10
- package/dist/services/oauth.js +236 -98
- package/dist/services/session-memory.d.ts +4 -4
- package/dist/services/session-memory.js +13 -10
- package/dist/session/memory.d.ts +26 -7
- package/dist/session/memory.js +79 -21
- package/dist/session/session-manager.d.ts +208 -25
- package/dist/session/session-manager.js +1232 -116
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +76 -6
- package/dist/session/transcript.js +278 -7
- package/dist/settings/feature-flags.d.ts +40 -0
- package/dist/settings/feature-flags.js +40 -0
- package/dist/settings/manager.d.ts +39 -1
- package/dist/settings/manager.js +102 -41
- package/dist/settings/migrate-config.js +4 -2
- package/dist/settings/schema.d.ts +511 -177
- package/dist/settings/schema.js +98 -25
- package/dist/skills/scanner.d.ts +6 -2
- package/dist/skills/scanner.js +160 -9
- package/dist/sources/adapter.d.ts +14 -0
- package/dist/sources/adapter.js +7 -0
- package/dist/sources/adapters/local-files.d.ts +10 -0
- package/dist/sources/adapters/local-files.js +127 -0
- package/dist/sources/adapters/mcp-resource.d.ts +17 -0
- package/dist/sources/adapters/mcp-resource.js +41 -0
- package/dist/sources/adapters/mock.d.ts +3 -0
- package/dist/sources/adapters/mock.js +29 -0
- package/dist/sources/binding.d.ts +6 -0
- package/dist/sources/binding.js +24 -0
- package/dist/sources/catalog.d.ts +6 -0
- package/dist/sources/catalog.js +64 -0
- package/dist/sources/context-summary.d.ts +8 -0
- package/dist/sources/context-summary.js +13 -0
- package/dist/sources/credential-status.d.ts +2 -0
- package/dist/sources/credential-status.js +13 -0
- package/dist/sources/index.d.ts +10 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/resolve.d.ts +28 -0
- package/dist/sources/resolve.js +47 -0
- package/dist/sources/truncate-utf8.d.ts +7 -0
- package/dist/sources/truncate-utf8.js +18 -0
- package/dist/sources/types.d.ts +71 -0
- package/dist/sources/types.js +26 -0
- package/dist/testing/fetch-stub.d.ts +32 -0
- package/dist/testing/fetch-stub.js +24 -0
- package/dist/themes/image.d.ts +18 -0
- package/dist/themes/image.js +117 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/installer.d.ts +50 -0
- package/dist/themes/installer.js +290 -0
- package/dist/themes/manifest.d.ts +102 -0
- package/dist/themes/manifest.js +86 -0
- package/dist/themes/paths.d.ts +14 -0
- package/dist/themes/paths.js +33 -0
- package/dist/tool-system/browser-bridge.d.ts +53 -11
- package/dist/tool-system/browser-bridge.js +8 -9
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
- package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
- package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
- package/dist/tool-system/builtin/agent-notifications.js +291 -101
- package/dist/tool-system/builtin/agent-output-file.js +1 -3
- package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
- package/dist/tool-system/builtin/agent-progress.js +83 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
- package/dist/tool-system/builtin/agent-registry.js +178 -9
- package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
- package/dist/tool-system/builtin/agent.d.ts +2 -0
- package/dist/tool-system/builtin/agent.js +279 -34
- package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
- package/dist/tool-system/builtin/background-jobs.js +111 -15
- package/dist/tool-system/builtin/background-work.d.ts +12 -1
- package/dist/tool-system/builtin/background-work.js +12 -1
- package/dist/tool-system/builtin/bash.d.ts +3 -5
- package/dist/tool-system/builtin/bash.js +14 -6
- package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
- package/dist/tool-system/builtin/browser-tools.js +89 -23
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
- package/dist/tool-system/builtin/edit.d.ts +2 -1
- package/dist/tool-system/builtin/edit.js +14 -10
- package/dist/tool-system/builtin/file-cache.d.ts +2 -0
- package/dist/tool-system/builtin/file-cache.js +4 -0
- package/dist/tool-system/builtin/generate-image.js +17 -10
- package/dist/tool-system/builtin/generate-video.d.ts +4 -0
- package/dist/tool-system/builtin/generate-video.js +164 -28
- package/dist/tool-system/builtin/glob.d.ts +2 -1
- package/dist/tool-system/builtin/glob.js +28 -3
- package/dist/tool-system/builtin/grep.d.ts +1 -0
- package/dist/tool-system/builtin/grep.js +82 -17
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +57 -18
- package/dist/tool-system/builtin/index.js +280 -167
- package/dist/tool-system/builtin/memory.d.ts +6 -0
- package/dist/tool-system/builtin/memory.js +36 -15
- package/dist/tool-system/builtin/panel.d.ts +9 -0
- package/dist/tool-system/builtin/panel.js +314 -0
- package/dist/tool-system/builtin/read.js +5 -1
- package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
- package/dist/tool-system/builtin/send-message-to-session.js +67 -0
- package/dist/tool-system/builtin/sources.d.ts +8 -0
- package/dist/tool-system/builtin/sources.js +137 -0
- package/dist/tool-system/builtin/tool-search.js +7 -2
- package/dist/tool-system/builtin/update-automation-memory.js +2 -0
- package/dist/tool-system/builtin/video-providers.d.ts +12 -15
- package/dist/tool-system/builtin/video-providers.js +1 -0
- package/dist/tool-system/builtin/view-image.d.ts +2 -2
- package/dist/tool-system/builtin/web-fetch.js +60 -15
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/builtin/write.d.ts +2 -1
- package/dist/tool-system/builtin/write.js +14 -4
- package/dist/tool-system/capability-module.d.ts +93 -0
- package/dist/tool-system/capability-module.js +53 -0
- package/dist/tool-system/context.d.ts +94 -24
- package/dist/tool-system/executor.js +99 -58
- package/dist/tool-system/external-tool-exposure.d.ts +60 -0
- package/dist/tool-system/external-tool-exposure.js +304 -0
- package/dist/tool-system/mcp-manager.d.ts +17 -1
- package/dist/tool-system/mcp-manager.js +72 -7
- package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
- package/dist/tool-system/mcp-tool-policy.js +34 -0
- package/dist/tool-system/panel-bridge.d.ts +53 -0
- package/dist/tool-system/panel-bridge.js +1 -0
- package/dist/tool-system/path-policy.d.ts +19 -0
- package/dist/tool-system/path-policy.js +62 -1
- package/dist/tool-system/permission.d.ts +69 -3
- package/dist/tool-system/permission.js +429 -30
- package/dist/tool-system/registry.d.ts +15 -3
- package/dist/tool-system/registry.js +82 -40
- package/dist/tool-system/sandbox/index.js +3 -8
- package/dist/tool-system/sandbox/seatbelt.js +2 -6
- package/dist/tool-system/session-tool-host.d.ts +139 -0
- package/dist/tool-system/session-tool-host.js +167 -0
- package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
- package/dist/tool-system/testing/tool-registry-harness.js +51 -0
- package/dist/tool-system/validation.d.ts +14 -7
- package/dist/tool-system/validation.js +701 -7
- package/dist/types.d.ts +201 -20
- package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
- package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
- package/dist/utils/file-mutex.d.ts +65 -0
- package/dist/utils/file-mutex.js +145 -0
- package/dist/utils/json.d.ts +2 -4
- package/dist/utils/json.js +2 -4
- package/dist/utils/lockfile.d.ts +30 -1
- package/dist/utils/lockfile.js +2 -2
- package/dist/utils/secret-scrubber.d.ts +8 -0
- package/dist/utils/secret-scrubber.js +227 -0
- package/dist/utils/toolDisplay.js +1 -1
- package/package.json +20 -5
- package/THIRD_PARTY_NOTICES.md +0 -206
- package/dist/arena/arena.d.ts +0 -43
- package/dist/arena/arena.js +0 -333
- package/dist/arena/context/context-tools.d.ts +0 -16
- package/dist/arena/context/context-tools.js +0 -272
- package/dist/arena/context/within-root.d.ts +0 -7
- package/dist/arena/context/within-root.js +0 -15
- package/dist/arena/detect-mode.d.ts +0 -20
- package/dist/arena/detect-mode.js +0 -78
- package/dist/arena/digest-builder.d.ts +0 -25
- package/dist/arena/digest-builder.js +0 -120
- package/dist/arena/index.d.ts +0 -29
- package/dist/arena/index.js +0 -29
- package/dist/arena/iterate/convergence.d.ts +0 -25
- package/dist/arena/iterate/convergence.js +0 -103
- package/dist/arena/iterate/formats/index.d.ts +0 -22
- package/dist/arena/iterate/formats/index.js +0 -283
- package/dist/arena/iterate/index.d.ts +0 -11
- package/dist/arena/iterate/index.js +0 -9
- package/dist/arena/iterate/iterative-arena.d.ts +0 -23
- package/dist/arena/iterate/iterative-arena.js +0 -237
- package/dist/arena/iterate/parse.d.ts +0 -42
- package/dist/arena/iterate/parse.js +0 -123
- package/dist/arena/iterate/phases/argue.d.ts +0 -22
- package/dist/arena/iterate/phases/argue.js +0 -165
- package/dist/arena/iterate/phases/revise.d.ts +0 -16
- package/dist/arena/iterate/phases/revise.js +0 -62
- package/dist/arena/iterate/phases/tournament.d.ts +0 -34
- package/dist/arena/iterate/phases/tournament.js +0 -113
- package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
- package/dist/arena/iterate/tools/web-tools.js +0 -54
- package/dist/arena/iterate/types.d.ts +0 -152
- package/dist/arena/iterate/types.js +0 -8
- package/dist/arena/ledger.d.ts +0 -47
- package/dist/arena/ledger.js +0 -159
- package/dist/arena/lenses/architecture.d.ts +0 -5
- package/dist/arena/lenses/architecture.js +0 -22
- package/dist/arena/lenses/engineering.d.ts +0 -5
- package/dist/arena/lenses/engineering.js +0 -22
- package/dist/arena/lenses/general.d.ts +0 -5
- package/dist/arena/lenses/general.js +0 -20
- package/dist/arena/lenses/index.d.ts +0 -16
- package/dist/arena/lenses/index.js +0 -47
- package/dist/arena/lenses/product.d.ts +0 -5
- package/dist/arena/lenses/product.js +0 -22
- package/dist/arena/model-presets.d.ts +0 -23
- package/dist/arena/model-presets.js +0 -44
- package/dist/arena/phases/adjudication.d.ts +0 -24
- package/dist/arena/phases/adjudication.js +0 -141
- package/dist/arena/phases/build-consensus.d.ts +0 -29
- package/dist/arena/phases/build-consensus.js +0 -83
- package/dist/arena/phases/claim-registry.d.ts +0 -26
- package/dist/arena/phases/claim-registry.js +0 -60
- package/dist/arena/phases/cross-review.d.ts +0 -45
- package/dist/arena/phases/cross-review.js +0 -218
- package/dist/arena/phases/debate-rounds.d.ts +0 -27
- package/dist/arena/phases/debate-rounds.js +0 -159
- package/dist/arena/phases/participant-research.d.ts +0 -38
- package/dist/arena/phases/participant-research.js +0 -314
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
- package/dist/arena/phases/planning-detail-expansion.js +0 -119
- package/dist/arena/planner.d.ts +0 -27
- package/dist/arena/planner.js +0 -311
- package/dist/arena/providers/docs.d.ts +0 -7
- package/dist/arena/providers/docs.js +0 -111
- package/dist/arena/providers/git.d.ts +0 -8
- package/dist/arena/providers/git.js +0 -174
- package/dist/arena/providers/index.d.ts +0 -32
- package/dist/arena/providers/index.js +0 -132
- package/dist/arena/providers/none.d.ts +0 -7
- package/dist/arena/providers/none.js +0 -11
- package/dist/arena/providers/repo.d.ts +0 -7
- package/dist/arena/providers/repo.js +0 -258
- package/dist/arena/render/session.d.ts +0 -17
- package/dist/arena/render/session.js +0 -190
- package/dist/arena/render/terminal.d.ts +0 -34
- package/dist/arena/render/terminal.js +0 -286
- package/dist/arena/strategies/discussion.d.ts +0 -25
- package/dist/arena/strategies/discussion.js +0 -143
- package/dist/arena/strategies/index.d.ts +0 -15
- package/dist/arena/strategies/index.js +0 -28
- package/dist/arena/strategies/language-wrapper.d.ts +0 -17
- package/dist/arena/strategies/language-wrapper.js +0 -102
- package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
- package/dist/arena/strategies/lens-wrapper.js +0 -236
- package/dist/arena/strategies/planning.d.ts +0 -30
- package/dist/arena/strategies/planning.js +0 -225
- package/dist/arena/strategies/review.d.ts +0 -26
- package/dist/arena/strategies/review.js +0 -168
- package/dist/arena/strategies/utils.d.ts +0 -36
- package/dist/arena/strategies/utils.js +0 -603
- package/dist/arena/tools/selector.d.ts +0 -17
- package/dist/arena/tools/selector.js +0 -61
- package/dist/arena/transitions.d.ts +0 -53
- package/dist/arena/transitions.js +0 -97
- package/dist/arena/types.d.ts +0 -514
- package/dist/arena/types.js +0 -27
- package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
- package/dist/cc-orchestrator/agent-adapter.js +0 -143
- package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
- package/dist/cc-orchestrator/cc-capability.js +0 -53
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
- package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
- package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
- package/dist/cc-orchestrator/codex-session-history.js +0 -247
- package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
- package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
- package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-changes.js +0 -231
- package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-driver.js +0 -284
- package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
- package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
- package/dist/cc-orchestrator/index.d.ts +0 -8
- package/dist/cc-orchestrator/index.js +0 -8
- package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
- package/dist/cc-orchestrator/relevance-judge.js +0 -29
- package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
- package/dist/cc-orchestrator/session-discovery.js +0 -125
- package/dist/cc-orchestrator/session-history.d.ts +0 -54
- package/dist/cc-orchestrator/session-history.js +0 -150
- package/dist/cron/cron-runtime.d.ts +0 -2
- package/dist/cron/cron-runtime.js +0 -2
- package/dist/cron/cron-store.d.ts +0 -2
- package/dist/cron/cron-store.js +0 -2
- package/dist/cron/scheduler.d.ts +0 -7
- package/dist/cron/scheduler.js +0 -7
- package/dist/engine/goal.js +0 -206
- package/dist/external-agents/config.d.ts +0 -2
- package/dist/external-agents/config.js +0 -15
- package/dist/external-agents/types.d.ts +0 -31
- package/dist/git/parse-log.d.ts +0 -13
- package/dist/git/parse-log.js +0 -21
- package/dist/git/utils.d.ts +0 -49
- package/dist/git/utils.js +0 -161
- package/dist/git/worktree/crud.d.ts +0 -69
- package/dist/git/worktree/crud.js +0 -206
- package/dist/git/worktree/diff.d.ts +0 -14
- package/dist/git/worktree/diff.js +0 -82
- package/dist/git/worktree/git-exec.d.ts +0 -7
- package/dist/git/worktree/git-exec.js +0 -51
- package/dist/git/worktree/index.d.ts +0 -5
- package/dist/git/worktree/index.js +0 -5
- package/dist/git/worktree/query.d.ts +0 -42
- package/dist/git/worktree/query.js +0 -121
- package/dist/git/worktree/slug.d.ts +0 -11
- package/dist/git/worktree/slug.js +0 -58
- package/dist/git/worktree.d.ts +0 -1
- package/dist/git/worktree.js +0 -5
- package/dist/lsp/client.d.ts +0 -41
- package/dist/lsp/client.js +0 -186
- package/dist/lsp/manager.d.ts +0 -40
- package/dist/lsp/manager.js +0 -155
- package/dist/lsp/root-path.d.ts +0 -9
- package/dist/lsp/root-path.js +0 -12
- package/dist/lsp/servers.d.ts +0 -16
- package/dist/lsp/servers.js +0 -60
- package/dist/prompt/sections/coding.md +0 -35
- package/dist/quota/credentials.d.ts +0 -3
- package/dist/quota/credentials.js +0 -80
- package/dist/quota/index.d.ts +0 -36
- package/dist/quota/index.js +0 -155
- package/dist/quota/types.d.ts +0 -48
- package/dist/quota/types.js +0 -13
- package/dist/review/review-prompt.d.ts +0 -28
- package/dist/review/review-prompt.js +0 -81
- package/dist/state.d.ts +0 -160
- package/dist/state.js +0 -267
- package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
- package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
- package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
- package/dist/tool-system/builtin/apply-patch/index.js +0 -105
- package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
- package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
- package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
- package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
- package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
- package/dist/tool-system/builtin/apply-patch/types.js +0 -13
- package/dist/tool-system/builtin/arena.d.ts +0 -31
- package/dist/tool-system/builtin/arena.js +0 -415
- package/dist/tool-system/builtin/brief.d.ts +0 -6
- package/dist/tool-system/builtin/brief.js +0 -41
- package/dist/tool-system/builtin/check-quota.d.ts +0 -15
- package/dist/tool-system/builtin/check-quota.js +0 -34
- package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
- package/dist/tool-system/builtin/drive-claude-code.js +0 -698
- package/dist/tool-system/builtin/lsp.d.ts +0 -7
- package/dist/tool-system/builtin/lsp.js +0 -144
- package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -127
- package/dist/tool-system/builtin/worktree.d.ts +0 -11
- package/dist/tool-system/builtin/worktree.js +0 -345
- /package/dist/{external-agents → links}/types.js +0 -0
- /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
- /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
package/dist/context/manager.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Tier 2: LLM summary (async) — generate summary of older messages via model call
|
|
6
6
|
* Tier 3: window compact (sync, emergency) — aggressive truncation fallback
|
|
7
7
|
*/
|
|
8
|
-
import { estimateTokens, microcompact, dedupeFileReads, maskOldObservations, snipCompact, windowCompact, truncateToolResult, buildSummarizationPrompt, applySummaryCompaction, applyToolResultBudget, extractAnchoredSummary, } from "./compaction.js";
|
|
8
|
+
import { estimateTokens, microcompact, dedupeFileReads, maskOldObservations, snipCompact, windowCompact, truncateToolResult, buildSummarizationPrompt, applySummaryCompaction, applyToolResultBudget, extractAnchoredSummary, buildAnchoredSummaryMessage, extractReferencedFilePaths, } from "./compaction.js";
|
|
9
9
|
import { applyToolResultPersistence, createContentReplacementState, reconstructContentReplacementState, resolveToolResultsDir, } from "./tool-result-storage.js";
|
|
10
10
|
import { logger } from "../logging/logger.js";
|
|
11
11
|
const DEFAULT_CONFIG = {
|
|
@@ -162,7 +162,7 @@ export class ContextManager {
|
|
|
162
162
|
setSummarizeFn(fn) {
|
|
163
163
|
this.summarizeFn = fn;
|
|
164
164
|
}
|
|
165
|
-
async trySummaryCompact(messages, before, logEvent) {
|
|
165
|
+
async trySummaryCompact(messages, before, logEvent, signal) {
|
|
166
166
|
if (!this.summarizeFn || this.consecutiveSummaryFailures >= 3) {
|
|
167
167
|
return { messages, tokens: before, compacted: false, noProgress: false };
|
|
168
168
|
}
|
|
@@ -178,7 +178,7 @@ export class ContextManager {
|
|
|
178
178
|
// re-summarizes from scratch.
|
|
179
179
|
const priorSummary = extractAnchoredSummary(messages) ?? this.lastSummary;
|
|
180
180
|
const prompt = buildSummarizationPrompt(messagesToSummarize, priorSummary);
|
|
181
|
-
const summary = await this.summarizeFn(prompt);
|
|
181
|
+
const summary = await this.summarizeFn(prompt, signal);
|
|
182
182
|
if (!summary || summary.length <= 50) {
|
|
183
183
|
this.consecutiveSummaryFailures++;
|
|
184
184
|
logger.warn("context.summary_failed", {
|
|
@@ -358,7 +358,7 @@ export class ContextManager {
|
|
|
358
358
|
* Async context management — attempts LLM summarization before falling back.
|
|
359
359
|
* Call this when you have access to the LLM (between turns).
|
|
360
360
|
*/
|
|
361
|
-
async manageAsync(messages) {
|
|
361
|
+
async manageAsync(messages, signal) {
|
|
362
362
|
let result = messages;
|
|
363
363
|
// Tier 0a: Persist large tool_results to disk + replace with preview.
|
|
364
364
|
result = this.persistLargeToolResults(result);
|
|
@@ -428,7 +428,7 @@ export class ContextManager {
|
|
|
428
428
|
// Tier 2: LLM summary if approaching limit, or if micro was the only tier
|
|
429
429
|
// available in the 0.70-0.85 band and it freed nothing.
|
|
430
430
|
if (ratio >= this.config.compactAtRatio || shouldEscalateNoOpMicro) {
|
|
431
|
-
const summarized = await this.trySummaryCompact(result, tokens, "context.summary_compact");
|
|
431
|
+
const summarized = await this.trySummaryCompact(result, tokens, "context.summary_compact", signal);
|
|
432
432
|
result = summarized.messages;
|
|
433
433
|
tokens = summarized.tokens;
|
|
434
434
|
if (summarized.compacted) {
|
|
@@ -488,7 +488,7 @@ export class ContextManager {
|
|
|
488
488
|
* a long-but-under-threshold text-only conversation (the /compact bug) still
|
|
489
489
|
* gets summarized here.
|
|
490
490
|
*/
|
|
491
|
-
async forceSummarize(messages) {
|
|
491
|
+
async forceSummarize(messages, signal) {
|
|
492
492
|
let result = messages;
|
|
493
493
|
// Tier 0: same waste-removal + micro as the automatic path.
|
|
494
494
|
result = this.persistLargeToolResults(result);
|
|
@@ -505,7 +505,7 @@ export class ContextManager {
|
|
|
505
505
|
let tokens = this.estimateTokensHybrid(result);
|
|
506
506
|
// Unconditional LLM summary (no ratio gate).
|
|
507
507
|
{
|
|
508
|
-
const summarized = await this.trySummaryCompact(result, tokens, "context.force_summary_compact");
|
|
508
|
+
const summarized = await this.trySummaryCompact(result, tokens, "context.force_summary_compact", signal);
|
|
509
509
|
result = summarized.messages;
|
|
510
510
|
tokens = summarized.tokens;
|
|
511
511
|
if (summarized.compacted)
|
|
@@ -529,6 +529,41 @@ export class ContextManager {
|
|
|
529
529
|
}
|
|
530
530
|
return result;
|
|
531
531
|
}
|
|
532
|
+
/**
|
|
533
|
+
* Generic range archival: summarize a caller-chosen contiguous index window
|
|
534
|
+
* `[range.start, range.end)` into a single anchored summary message, leaving
|
|
535
|
+
* everything outside the window untouched. Unlike manage()/forceSummarize,
|
|
536
|
+
* the window is caller-specified, not derived from a pressure heuristic — the
|
|
537
|
+
* caller decides which span to collapse. Returns the input unchanged when no
|
|
538
|
+
* summarizeFn is set, when the (clamped) window is empty, or when the summary
|
|
539
|
+
* is empty/too short. The emitted summary uses the same anchored marker the
|
|
540
|
+
* rolling-summary path reads, so a later compaction can merge-update it.
|
|
541
|
+
*/
|
|
542
|
+
async summarizeRange(messages, range, opts = {}) {
|
|
543
|
+
const start = Math.max(0, Math.min(range.start, messages.length));
|
|
544
|
+
const end = Math.max(start, Math.min(range.end, messages.length));
|
|
545
|
+
if (!this.summarizeFn || end - start < 1)
|
|
546
|
+
return messages;
|
|
547
|
+
const window = messages.slice(start, end);
|
|
548
|
+
// Feed a prior anchored summary back so the LLM merge-updates rather than
|
|
549
|
+
// re-summarizes from scratch, matching the rolling-summary behavior of
|
|
550
|
+
// trySummaryCompact().
|
|
551
|
+
const priorSummary = extractAnchoredSummary(messages) ?? this.lastSummary;
|
|
552
|
+
const prompt = buildSummarizationPrompt(window, priorSummary);
|
|
553
|
+
const summary = await this.summarizeFn(prompt, opts.signal);
|
|
554
|
+
if (!summary || summary.length <= 50)
|
|
555
|
+
return messages;
|
|
556
|
+
this.lastSummary = summary;
|
|
557
|
+
const summaryMessage = buildAnchoredSummaryMessage(summary, {
|
|
558
|
+
...(this.transcriptPath ? { transcriptPath: this.transcriptPath } : {}),
|
|
559
|
+
referencedFiles: extractReferencedFilePaths(window),
|
|
560
|
+
});
|
|
561
|
+
const before = this.estimateTokensHybrid(messages);
|
|
562
|
+
const out = [...messages.slice(0, start), summaryMessage, ...messages.slice(end)];
|
|
563
|
+
const after = this.estimateTokensHybrid(out);
|
|
564
|
+
this.onCompact?.({ strategy: "range", before, after });
|
|
565
|
+
return out;
|
|
566
|
+
}
|
|
532
567
|
/**
|
|
533
568
|
* Persist large tool_result blocks to disk and replace them with a
|
|
534
569
|
* preview + filepath. No-op when transcript path hasn't been set
|
|
@@ -15,6 +15,9 @@ const RATIOS = {
|
|
|
15
15
|
mixed: 3.6, // Mixed content (typical for tool results)
|
|
16
16
|
cjk: 1.5, // CJK characters: ~1.5 chars per token
|
|
17
17
|
};
|
|
18
|
+
// Base64 is transport data, not text. A fixed vision estimate prevents large
|
|
19
|
+
// images from spuriously exhausting the text context window.
|
|
20
|
+
const IMAGE_TOKEN_ESTIMATE = 170;
|
|
18
21
|
/**
|
|
19
22
|
* Estimate token count for a string, detecting content type.
|
|
20
23
|
*/
|
|
@@ -80,12 +83,11 @@ function estimateBlockTokens(block) {
|
|
|
80
83
|
if (block.name)
|
|
81
84
|
tokens += estimateStringTokens(block.name);
|
|
82
85
|
if (block.source?.data) {
|
|
83
|
-
tokens +=
|
|
84
|
-
tokens += estimateStringTokens(block.source.data);
|
|
86
|
+
tokens += IMAGE_TOKEN_ESTIMATE;
|
|
85
87
|
}
|
|
86
88
|
const maybeOpenAI = block;
|
|
87
89
|
if (typeof maybeOpenAI.image_url?.url === "string") {
|
|
88
|
-
tokens +=
|
|
90
|
+
tokens += IMAGE_TOKEN_ESTIMATE;
|
|
89
91
|
}
|
|
90
92
|
return tokens;
|
|
91
93
|
}
|
|
@@ -55,6 +55,12 @@ export declare function reconstructContentReplacementState(messages: Message[]):
|
|
|
55
55
|
* transcript path. Layout: <transcriptDir>/tool-results/
|
|
56
56
|
*/
|
|
57
57
|
export declare function resolveToolResultsDir(transcriptPath: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* Convert an externally supplied tool_use_id to a bounded internal filename.
|
|
60
|
+
* The original id remains the key in ContentReplacementState/onPersist; it is
|
|
61
|
+
* never used as a path component.
|
|
62
|
+
*/
|
|
63
|
+
export declare function safeToolResultFilename(toolUseId: string): string;
|
|
58
64
|
interface PersistOptions {
|
|
59
65
|
/** Per-result threshold; default DEFAULT_PERSIST_THRESHOLD. */
|
|
60
66
|
perResultThreshold?: number;
|
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
* parallel Read results), persist the largest ones first until under.
|
|
23
23
|
*/
|
|
24
24
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
25
|
-
import {
|
|
25
|
+
import { createHash } from "node:crypto";
|
|
26
|
+
import { dirname, isAbsolute, join, relative, resolve, sep, win32 } from "node:path";
|
|
26
27
|
import { logger } from "../logging/logger.js";
|
|
27
28
|
// ─── Tunables ───────────────────────────────────────────────────────
|
|
28
29
|
/** Per-result threshold. Larger than this → persist + replace. */
|
|
@@ -77,12 +78,32 @@ function ensureDir(dir) {
|
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
/**
|
|
80
|
-
*
|
|
81
|
-
*
|
|
81
|
+
* Convert an externally supplied tool_use_id to a bounded internal filename.
|
|
82
|
+
* The original id remains the key in ContentReplacementState/onPersist; it is
|
|
83
|
+
* never used as a path component.
|
|
82
84
|
*/
|
|
85
|
+
export function safeToolResultFilename(toolUseId) {
|
|
86
|
+
if (toolUseId.length > 256) {
|
|
87
|
+
throw new RangeError("tool_use_id exceeds the 256 character limit");
|
|
88
|
+
}
|
|
89
|
+
if (isAbsolute(toolUseId) ||
|
|
90
|
+
win32.isAbsolute(toolUseId) ||
|
|
91
|
+
toolUseId.includes("/") ||
|
|
92
|
+
toolUseId.includes("\\")) {
|
|
93
|
+
throw new Error("tool_use_id must not contain a path");
|
|
94
|
+
}
|
|
95
|
+
return `${createHash("sha256").update(toolUseId, "utf8").digest("hex")}.txt`;
|
|
96
|
+
}
|
|
97
|
+
/** Write content to the contained hashed path. Idempotent by original id. */
|
|
83
98
|
function persistToFile(dir, toolUseId, content) {
|
|
99
|
+
const root = resolve(dir);
|
|
100
|
+
const filename = safeToolResultFilename(toolUseId);
|
|
101
|
+
const filepath = resolve(root, filename);
|
|
102
|
+
const rel = relative(root, filepath);
|
|
103
|
+
if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
104
|
+
throw new Error("tool_result path escaped its storage root");
|
|
105
|
+
}
|
|
84
106
|
ensureDir(dir);
|
|
85
|
-
const filepath = join(dir, `${toolUseId}.txt`);
|
|
86
107
|
try {
|
|
87
108
|
// 'wx' = fail if exists. Skipping on collision is correct: same id =
|
|
88
109
|
// same content. Avoids re-writing the same bytes every turn.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Credential, type CredentialType } from "./types.js";
|
|
2
2
|
import type { SettingsScope } from "../settings/manager.js";
|
|
3
3
|
import type { Transport } from "../protocol/transport.js";
|
|
4
4
|
export type CredentialAccessScope = "full" | "project";
|
|
@@ -18,12 +18,23 @@ export interface CredentialAccess {
|
|
|
18
18
|
listMasked(cwd: string | undefined, scope: CredentialAccessScope): CredentialMetadata[];
|
|
19
19
|
resolveMeta(cwd: string | undefined, id: string, scope: CredentialAccessScope): CredentialMetadata | undefined;
|
|
20
20
|
envExposures(cwd: string | undefined, scope: CredentialAccessScope): Record<string, string>;
|
|
21
|
+
/** Subscribe to host credential snapshot changes (desktop worker uses this to cancel in-flight Links). */
|
|
22
|
+
subscribe?(listener: () => void): () => void;
|
|
21
23
|
resolveValue?(req: {
|
|
22
24
|
cwd?: string;
|
|
23
25
|
id: string;
|
|
24
26
|
scope: CredentialAccessScope;
|
|
25
|
-
purpose: "use" | "mcp";
|
|
27
|
+
purpose: "use" | "mcp" | "link";
|
|
26
28
|
}): Promise<string>;
|
|
29
|
+
/** Resolve only the bearer material needed by an MCP request. */
|
|
30
|
+
resolveOAuthAccess?(req: {
|
|
31
|
+
id: string;
|
|
32
|
+
scope: "full";
|
|
33
|
+
forceRefresh?: boolean;
|
|
34
|
+
}): Promise<{
|
|
35
|
+
accessToken: string;
|
|
36
|
+
expiresAt?: string;
|
|
37
|
+
}>;
|
|
27
38
|
materializeCookie?(req: {
|
|
28
39
|
cwd?: string;
|
|
29
40
|
id: string;
|
|
@@ -2,9 +2,11 @@ import { existsSync, readdirSync, rmSync, statSync, writeFileSync } from "node:f
|
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
+
import { credentialAllowsEnvExposure, credentialSecretHint, } from "./types.js";
|
|
5
6
|
import { CredentialStore } from "./store.js";
|
|
6
7
|
import { formatNetscapeCookies, parseCookieJar } from "./cookie-jar.js";
|
|
7
|
-
import { summarizeOAuthCredentialSecret } from "./oauth.js";
|
|
8
|
+
import { parseOAuthCredentialSecret, isBrowserOAuthLinkCredential, resolveLinkCredentialAccessToken, shouldRefreshOAuthCredential, summarizeOAuthCredentialSecret, } from "./oauth.js";
|
|
9
|
+
import { refreshToken } from "../services/oauth.js";
|
|
8
10
|
const COOKIE_FILE_PREFIX = "codeshell-cred-cookie-";
|
|
9
11
|
const COOKIE_FILE_MAX_AGE_MS = 30 * 60 * 1000;
|
|
10
12
|
let defaultCredentialAccess = null;
|
|
@@ -17,6 +19,7 @@ export function getCredentialAccess() {
|
|
|
17
19
|
export function createIpcCredentialAccess(transport) {
|
|
18
20
|
let snapshot = { revision: 0, entries: [] };
|
|
19
21
|
let nextId = 1;
|
|
22
|
+
const subscribers = new Set();
|
|
20
23
|
const pending = new Map();
|
|
21
24
|
transport.onMessage((msg) => {
|
|
22
25
|
if ("method" in msg && msg.method === "desktop/credentialSnapshot") {
|
|
@@ -26,6 +29,14 @@ export function createIpcCredentialAccess(transport) {
|
|
|
26
29
|
revision: params.revision,
|
|
27
30
|
entries: params.entries,
|
|
28
31
|
};
|
|
32
|
+
for (const listener of subscribers) {
|
|
33
|
+
try {
|
|
34
|
+
listener();
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// One consumer must not break the credential snapshot transport.
|
|
38
|
+
}
|
|
39
|
+
}
|
|
29
40
|
}
|
|
30
41
|
return;
|
|
31
42
|
}
|
|
@@ -79,12 +90,26 @@ export function createIpcCredentialAccess(transport) {
|
|
|
79
90
|
return {};
|
|
80
91
|
return { ...(scope === "project" ? entry.envProject : entry.envFull) };
|
|
81
92
|
},
|
|
93
|
+
subscribe(listener) {
|
|
94
|
+
subscribers.add(listener);
|
|
95
|
+
return () => subscribers.delete(listener);
|
|
96
|
+
},
|
|
82
97
|
async resolveValue(req) {
|
|
83
98
|
const result = (await request("desktop/credentialResolve", req));
|
|
84
99
|
if (typeof result?.value !== "string")
|
|
85
100
|
throw new Error(`credential "${req.id}" is unavailable`);
|
|
86
101
|
return result.value;
|
|
87
102
|
},
|
|
103
|
+
async resolveOAuthAccess(req) {
|
|
104
|
+
const result = (await request("desktop/oauthAccessResolve", req));
|
|
105
|
+
if (typeof result?.accessToken !== "string") {
|
|
106
|
+
throw new Error(`oauth credential "${req.id}" requires login`);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
accessToken: result.accessToken,
|
|
110
|
+
expiresAt: typeof result.expiresAt === "string" ? result.expiresAt : undefined,
|
|
111
|
+
};
|
|
112
|
+
},
|
|
88
113
|
async materializeCookie(req) {
|
|
89
114
|
const result = (await request("desktop/credentialMaterializeCookie", req));
|
|
90
115
|
if (typeof result?.cookiesFile !== "string" || typeof result.count !== "number") {
|
|
@@ -106,9 +131,12 @@ function toMetadata(cred) {
|
|
|
106
131
|
const { secret: _secret, ...rest } = cred;
|
|
107
132
|
return {
|
|
108
133
|
...rest,
|
|
134
|
+
...(credentialAllowsEnvExposure(cred.type) ? {} : { exposeAsEnv: undefined }),
|
|
109
135
|
hasSecret: available,
|
|
110
|
-
secretHint: available ? (
|
|
111
|
-
...(cred.type === "oauth"
|
|
136
|
+
secretHint: available ? credentialSecretHint(cred.type, secret) : undefined,
|
|
137
|
+
...(cred.type === "oauth" || isBrowserOAuthLinkCredential(cred)
|
|
138
|
+
? { oauthStatus: summarizeOAuthCredentialSecret(secret) }
|
|
139
|
+
: {}),
|
|
112
140
|
};
|
|
113
141
|
}
|
|
114
142
|
function cloneMetadata(list) {
|
|
@@ -129,6 +157,8 @@ export const localCredentialAccess = {
|
|
|
129
157
|
const out = {};
|
|
130
158
|
const creds = storeFor(cwd).list(scope);
|
|
131
159
|
for (const cred of creds) {
|
|
160
|
+
if (!credentialAllowsEnvExposure(cred.type))
|
|
161
|
+
continue;
|
|
132
162
|
const name = cred.exposeAsEnv?.trim();
|
|
133
163
|
if (name && isCredentialSecretAvailable(cred.secret))
|
|
134
164
|
out[name] = cred.secret;
|
|
@@ -140,7 +170,16 @@ export const localCredentialAccess = {
|
|
|
140
170
|
if (!cred || !isCredentialSecretAvailable(cred.secret)) {
|
|
141
171
|
throw new Error(`credential "${req.id}" is unavailable`);
|
|
142
172
|
}
|
|
143
|
-
|
|
173
|
+
if (req.purpose === "link" &&
|
|
174
|
+
(cred.type !== "link" ||
|
|
175
|
+
cred.meta?.linkExecutionRuntime !== "local" ||
|
|
176
|
+
!cred.meta.linkProvider)) {
|
|
177
|
+
throw new Error(`credential "${req.id}" is not a local Link credential`);
|
|
178
|
+
}
|
|
179
|
+
return req.purpose === "link" ? resolveLinkCredentialAccessToken(cred) : cred.secret;
|
|
180
|
+
},
|
|
181
|
+
async resolveOAuthAccess(req) {
|
|
182
|
+
return resolveLocalOAuthAccess(req.id, Boolean(req.forceRefresh));
|
|
144
183
|
},
|
|
145
184
|
async materializeCookie(req) {
|
|
146
185
|
const cred = storeFor(req.cwd).resolve(req.id, req.scope);
|
|
@@ -150,6 +189,62 @@ export const localCredentialAccess = {
|
|
|
150
189
|
return materializeCookieSecret(cred.id, cred.secret);
|
|
151
190
|
},
|
|
152
191
|
};
|
|
192
|
+
const localOAuthRefreshes = new Map();
|
|
193
|
+
async function resolveLocalOAuthAccess(id, forceRefresh) {
|
|
194
|
+
const store = new CredentialStore(undefined);
|
|
195
|
+
const cred = store.resolve(id, "full");
|
|
196
|
+
if (!cred || cred.type !== "oauth" || !isCredentialSecretAvailable(cred.secret)) {
|
|
197
|
+
throw new Error(`oauth credential "${id}" requires login`);
|
|
198
|
+
}
|
|
199
|
+
const parsed = parseOAuthCredentialSecret(cred.secret);
|
|
200
|
+
const decision = shouldRefreshOAuthCredential(parsed);
|
|
201
|
+
if (!forceRefresh && decision === "no") {
|
|
202
|
+
return { accessToken: parsed.accessToken, expiresAt: parsed.expiresAt };
|
|
203
|
+
}
|
|
204
|
+
if (!parsed.refreshToken || !parsed.tokenEndpoint || !parsed.clientId) {
|
|
205
|
+
throw new Error(`oauth credential "${id}" requires login`);
|
|
206
|
+
}
|
|
207
|
+
const inflight = localOAuthRefreshes.get(id);
|
|
208
|
+
if (inflight)
|
|
209
|
+
return inflight;
|
|
210
|
+
const pending = (async () => {
|
|
211
|
+
const latestCred = store.resolve(id, "full");
|
|
212
|
+
if (!latestCred || latestCred.type !== "oauth" || !latestCred.secret) {
|
|
213
|
+
throw new Error(`oauth credential "${id}" requires login`);
|
|
214
|
+
}
|
|
215
|
+
const latest = parseOAuthCredentialSecret(latestCred.secret);
|
|
216
|
+
if (!forceRefresh && shouldRefreshOAuthCredential(latest) === "no") {
|
|
217
|
+
return { accessToken: latest.accessToken, expiresAt: latest.expiresAt };
|
|
218
|
+
}
|
|
219
|
+
if (!latest.refreshToken || !latest.tokenEndpoint || !latest.clientId) {
|
|
220
|
+
throw new Error(`oauth credential "${id}" requires login`);
|
|
221
|
+
}
|
|
222
|
+
const tokens = await refreshToken({
|
|
223
|
+
clientId: latest.clientId,
|
|
224
|
+
clientSecret: latest.clientSecret,
|
|
225
|
+
tokenEndpoint: latest.tokenEndpoint,
|
|
226
|
+
authorizationEndpoint: "",
|
|
227
|
+
scopes: latest.scopes,
|
|
228
|
+
resource: latest.resource,
|
|
229
|
+
}, latest.refreshToken);
|
|
230
|
+
const next = {
|
|
231
|
+
...latest,
|
|
232
|
+
accessToken: tokens.accessToken,
|
|
233
|
+
refreshToken: tokens.refreshToken ?? latest.refreshToken,
|
|
234
|
+
expiresAt: tokens.expiresAt ? new Date(tokens.expiresAt).toISOString() : undefined,
|
|
235
|
+
tokenType: tokens.tokenType,
|
|
236
|
+
scope: tokens.scope ?? latest.scope,
|
|
237
|
+
};
|
|
238
|
+
store.save("user", {
|
|
239
|
+
...latestCred,
|
|
240
|
+
secret: JSON.stringify(next),
|
|
241
|
+
meta: { ...latestCred.meta, lastRefreshAt: new Date().toISOString() },
|
|
242
|
+
});
|
|
243
|
+
return { accessToken: next.accessToken, expiresAt: next.expiresAt };
|
|
244
|
+
})().finally(() => localOAuthRefreshes.delete(id));
|
|
245
|
+
localOAuthRefreshes.set(id, pending);
|
|
246
|
+
return pending;
|
|
247
|
+
}
|
|
153
248
|
export function materializeCookieSecret(credentialId, secret) {
|
|
154
249
|
const jar = parseCookieJar(secret);
|
|
155
250
|
if (jar.length === 0)
|
|
@@ -2,8 +2,9 @@ export { CredentialStore } from "./store.js";
|
|
|
2
2
|
export type { CredentialScope, MaskedCredential } from "./store.js";
|
|
3
3
|
export { type EncryptionCipher, PlaintextCipher, setDefaultCredentialCipher, getDefaultCredentialCipher, } from "./cipher.js";
|
|
4
4
|
export { getCredentialAccess, setDefaultCredentialAccess, createIpcCredentialAccess, localCredentialAccess, credentialAccessScope, isCredentialSecretAvailable, materializeCookieSecret, type CredentialAccess, type CredentialAccessScope, type CredentialMetadata, type CredentialSnapshot, type CredentialSnapshotEntry, } from "./access.js";
|
|
5
|
-
export type { Credential, CredentialType, CredentialStoreFile, OAuthCredentialPublicStatus, OAuthCredentialSecret, } from "./types.js";
|
|
6
|
-
export {
|
|
5
|
+
export type { Credential, CredentialType, CredentialStoreFile, OAuthCredentialPublicStatus, OAuthCredentialSecret, OAuthTokenResponse, } from "./types.js";
|
|
6
|
+
export { credentialAllowsEnvExposure, credentialSecretHint } from "./types.js";
|
|
7
|
+
export { buildOAuthRefreshRequest, isBrowserOAuthLinkCredential, isOAuthAccessTokenExpired, oauthCredentialStatus, parseOAuthCredentialSecret, resolveLinkCredentialAccessToken, mergeOAuthTokenResponse, shouldRefreshOAuthCredential, summarizeOAuthCredentialSecret, type OAuthClockOptions, type OAuthRefreshHandler, type OAuthRefreshRequest, } from "./oauth.js";
|
|
7
8
|
export { formatNetscapeCookies, parseCookieJar, type CookieLike } from "./cookie-jar.js";
|
|
8
9
|
export { useCredentialToolDef, useCredentialToolDefFor, useCredentialTool, sweepStaleCredentialCookies, } from "./use-credential-tool.js";
|
|
9
10
|
export { credentialUseGate } from "./use-gate.js";
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export { CredentialStore } from "./store.js";
|
|
2
2
|
export { PlaintextCipher, setDefaultCredentialCipher, getDefaultCredentialCipher, } from "./cipher.js";
|
|
3
3
|
export { getCredentialAccess, setDefaultCredentialAccess, createIpcCredentialAccess, localCredentialAccess, credentialAccessScope, isCredentialSecretAvailable, materializeCookieSecret, } from "./access.js";
|
|
4
|
-
export {
|
|
4
|
+
export { credentialAllowsEnvExposure, credentialSecretHint } from "./types.js";
|
|
5
|
+
export { buildOAuthRefreshRequest, isBrowserOAuthLinkCredential, isOAuthAccessTokenExpired, oauthCredentialStatus, parseOAuthCredentialSecret, resolveLinkCredentialAccessToken, mergeOAuthTokenResponse, shouldRefreshOAuthCredential, summarizeOAuthCredentialSecret, } from "./oauth.js";
|
|
5
6
|
export { formatNetscapeCookies, parseCookieJar } from "./cookie-jar.js";
|
|
6
7
|
export { useCredentialToolDef, useCredentialToolDefFor, useCredentialTool, sweepStaleCredentialCookies, } from "./use-credential-tool.js";
|
|
7
8
|
export { credentialUseGate } from "./use-gate.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { OAuthCredentialPublicStatus, OAuthCredentialSecret } from "./types.js";
|
|
1
|
+
import type { Credential, OAuthCredentialPublicStatus, OAuthCredentialSecret, OAuthTokenResponse } from "./types.js";
|
|
2
2
|
export interface OAuthClockOptions {
|
|
3
3
|
now?: number | (() => number);
|
|
4
4
|
skewMs?: number;
|
|
@@ -14,6 +14,14 @@ export interface OAuthRefreshRequest {
|
|
|
14
14
|
}
|
|
15
15
|
export type OAuthRefreshHandler = (req: OAuthRefreshRequest) => Promise<OAuthCredentialSecret>;
|
|
16
16
|
export declare function parseOAuthCredentialSecret(secret: string): OAuthCredentialSecret;
|
|
17
|
+
export declare function isBrowserOAuthLinkCredential(credential: Pick<Credential, "type" | "meta">): boolean;
|
|
18
|
+
/** Return only the bearer token from a Link secret, never its refresh material. */
|
|
19
|
+
export declare function resolveLinkCredentialAccessToken(credential: Pick<Credential, "type" | "secret" | "meta">): string | undefined;
|
|
20
|
+
/** Merge and validate an OAuth token endpoint response without losing rotation state. */
|
|
21
|
+
export declare function mergeOAuthTokenResponse(previous: OAuthCredentialSecret | undefined, response: OAuthTokenResponse, opts?: {
|
|
22
|
+
now?: number;
|
|
23
|
+
}): OAuthCredentialSecret;
|
|
24
|
+
export declare function shouldRefreshOAuthCredential(secret: OAuthCredentialSecret, opts?: OAuthClockOptions): "no" | "refresh" | "login_required";
|
|
17
25
|
export declare function isOAuthAccessTokenExpired(secret: Pick<OAuthCredentialSecret, "accessToken" | "expiresAt">, opts?: OAuthClockOptions): boolean;
|
|
18
26
|
export declare function oauthCredentialStatus(secret: Pick<OAuthCredentialSecret, "accessToken" | "expiresAt">, opts?: OAuthClockOptions): Pick<OAuthCredentialPublicStatus, "state" | "expiresAt" | "expiresInMs">;
|
|
19
27
|
export declare function buildOAuthRefreshRequest(credentialId: string, secret: OAuthCredentialSecret): OAuthRefreshRequest | undefined;
|
|
@@ -15,6 +15,17 @@ function optionalStringArray(value) {
|
|
|
15
15
|
const out = value.filter((x) => typeof x === "string" && x.length > 0);
|
|
16
16
|
return out.length > 0 ? out : undefined;
|
|
17
17
|
}
|
|
18
|
+
function optionalFiniteNumber(value) {
|
|
19
|
+
if (value === undefined)
|
|
20
|
+
return undefined;
|
|
21
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
22
|
+
throw new Error("OAuth token response expires_in must be a finite non-negative number");
|
|
23
|
+
}
|
|
24
|
+
if (value < 0) {
|
|
25
|
+
throw new Error("OAuth token response expires_in must be a finite non-negative number");
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
18
29
|
function parseExpiresAt(value) {
|
|
19
30
|
if (!value)
|
|
20
31
|
return undefined;
|
|
@@ -45,19 +56,87 @@ export function parseOAuthCredentialSecret(secret) {
|
|
|
45
56
|
}
|
|
46
57
|
const expiresAt = optionalString(raw.expiresAt);
|
|
47
58
|
parseExpiresAt(expiresAt);
|
|
59
|
+
const refreshTokenExpiresAt = optionalString(raw.refreshTokenExpiresAt);
|
|
60
|
+
parseExpiresAt(refreshTokenExpiresAt);
|
|
61
|
+
const tokenType = optionalString(raw.tokenType);
|
|
62
|
+
if (tokenType && tokenType.toLowerCase() !== "bearer") {
|
|
63
|
+
throw new Error("OAuth credential tokenType must be Bearer");
|
|
64
|
+
}
|
|
48
65
|
return {
|
|
49
66
|
version: raw.version === 1 ? 1 : undefined,
|
|
50
67
|
accessToken,
|
|
51
68
|
refreshToken: optionalString(raw.refreshToken),
|
|
52
69
|
expiresAt,
|
|
53
|
-
|
|
70
|
+
refreshTokenExpiresAt,
|
|
71
|
+
tokenType,
|
|
54
72
|
scope: optionalString(raw.scope),
|
|
55
73
|
scopes: optionalStringArray(raw.scopes),
|
|
56
74
|
tokenEndpoint: optionalString(raw.tokenEndpoint),
|
|
57
75
|
clientId: optionalString(raw.clientId),
|
|
58
76
|
clientSecret: optionalString(raw.clientSecret),
|
|
77
|
+
issuer: optionalString(raw.issuer),
|
|
78
|
+
resource: optionalString(raw.resource),
|
|
79
|
+
revocationEndpoint: optionalString(raw.revocationEndpoint),
|
|
80
|
+
clientRegistration: raw.clientRegistration &&
|
|
81
|
+
typeof raw.clientRegistration === "object" &&
|
|
82
|
+
!Array.isArray(raw.clientRegistration) &&
|
|
83
|
+
optionalString(raw.clientRegistration.clientId)
|
|
84
|
+
? {
|
|
85
|
+
clientId: optionalString(raw.clientRegistration.clientId),
|
|
86
|
+
clientSecret: optionalString(raw.clientRegistration.clientSecret),
|
|
87
|
+
clientIdIssuedAt: typeof raw.clientRegistration.clientIdIssuedAt ===
|
|
88
|
+
"number"
|
|
89
|
+
? raw.clientRegistration.clientIdIssuedAt
|
|
90
|
+
: undefined,
|
|
91
|
+
clientSecretExpiresAt: typeof raw.clientRegistration.clientSecretExpiresAt ===
|
|
92
|
+
"number"
|
|
93
|
+
? raw.clientRegistration
|
|
94
|
+
.clientSecretExpiresAt
|
|
95
|
+
: undefined,
|
|
96
|
+
}
|
|
97
|
+
: undefined,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function isBrowserOAuthLinkCredential(credential) {
|
|
101
|
+
return credential.type === "link" && credential.meta?.linkAuthSource === "browser-oauth";
|
|
102
|
+
}
|
|
103
|
+
/** Return only the bearer token from a Link secret, never its refresh material. */
|
|
104
|
+
export function resolveLinkCredentialAccessToken(credential) {
|
|
105
|
+
if (!credential.secret)
|
|
106
|
+
return undefined;
|
|
107
|
+
return isBrowserOAuthLinkCredential(credential)
|
|
108
|
+
? parseOAuthCredentialSecret(credential.secret).accessToken
|
|
109
|
+
: credential.secret;
|
|
110
|
+
}
|
|
111
|
+
/** Merge and validate an OAuth token endpoint response without losing rotation state. */
|
|
112
|
+
export function mergeOAuthTokenResponse(previous, response, opts = {}) {
|
|
113
|
+
const accessToken = optionalString(response.access_token);
|
|
114
|
+
if (!accessToken)
|
|
115
|
+
throw new Error("OAuth token response must include access_token");
|
|
116
|
+
const tokenType = optionalString(response.token_type) ?? "Bearer";
|
|
117
|
+
if (tokenType.toLowerCase() !== "bearer") {
|
|
118
|
+
throw new Error(`OAuth token response token_type must be Bearer`);
|
|
119
|
+
}
|
|
120
|
+
const expiresIn = optionalFiniteNumber(response.expires_in);
|
|
121
|
+
const now = opts.now ?? Date.now();
|
|
122
|
+
const responseScope = optionalString(response.scope);
|
|
123
|
+
const refreshToken = optionalString(response.refresh_token) ?? previous?.refreshToken;
|
|
124
|
+
return {
|
|
125
|
+
...previous,
|
|
126
|
+
version: 1,
|
|
127
|
+
accessToken,
|
|
128
|
+
refreshToken,
|
|
129
|
+
expiresAt: expiresIn === undefined ? undefined : new Date(now + expiresIn * 1000).toISOString(),
|
|
130
|
+
tokenType: "Bearer",
|
|
131
|
+
scope: responseScope ?? previous?.scope,
|
|
132
|
+
scopes: responseScope ? responseScope.split(/\s+/).filter(Boolean) : previous?.scopes,
|
|
59
133
|
};
|
|
60
134
|
}
|
|
135
|
+
export function shouldRefreshOAuthCredential(secret, opts = {}) {
|
|
136
|
+
if (!isOAuthAccessTokenExpired(secret, opts))
|
|
137
|
+
return "no";
|
|
138
|
+
return secret.refreshToken && secret.tokenEndpoint ? "refresh" : "login_required";
|
|
139
|
+
}
|
|
61
140
|
export function isOAuthAccessTokenExpired(secret, opts = {}) {
|
|
62
141
|
const expiresAtMs = parseExpiresAt(secret.expiresAt);
|
|
63
142
|
if (expiresAtMs === undefined)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Credential } from "./types.js";
|
|
2
2
|
import { type EncryptionCipher } from "./cipher.js";
|
|
3
3
|
export type CredentialScope = "user" | "project";
|
|
4
4
|
export interface MaskedCredential extends Omit<Credential, "secret"> {
|
|
@@ -13,6 +13,13 @@ export interface MaskedCredential extends Omit<Credential, "secret"> {
|
|
|
13
13
|
*/
|
|
14
14
|
export declare class CredentialStore {
|
|
15
15
|
private readonly cwd?;
|
|
16
|
+
/**
|
|
17
|
+
* Override the user-scope store directory (the `~/.code-shell` layer;
|
|
18
|
+
* `credentials.json` lives directly inside it). Absent → today's
|
|
19
|
+
* behavior: `join(userHome(), ".code-shell")` resolved per call.
|
|
20
|
+
* Injection point for identity-scoped server deployments.
|
|
21
|
+
*/
|
|
22
|
+
private readonly userDirOverride?;
|
|
16
23
|
private readonly cipher;
|
|
17
24
|
/**
|
|
18
25
|
* @param cwd project root for the project-scope store (undefined → user only).
|
|
@@ -22,7 +29,14 @@ export declare class CredentialStore {
|
|
|
22
29
|
* returns PLAINTEXT secrets; encryption is applied only at the
|
|
23
30
|
* disk boundary (read decrypts, write encrypts).
|
|
24
31
|
*/
|
|
25
|
-
constructor(cwd?: string | undefined, cipher?: EncryptionCipher
|
|
32
|
+
constructor(cwd?: string | undefined, cipher?: EncryptionCipher,
|
|
33
|
+
/**
|
|
34
|
+
* Override the user-scope store directory (the `~/.code-shell` layer;
|
|
35
|
+
* `credentials.json` lives directly inside it). Absent → today's
|
|
36
|
+
* behavior: `join(userHome(), ".code-shell")` resolved per call.
|
|
37
|
+
* Injection point for identity-scoped server deployments.
|
|
38
|
+
*/
|
|
39
|
+
userDirOverride?: string | undefined);
|
|
26
40
|
private pathFor;
|
|
27
41
|
/**
|
|
28
42
|
* Decrypt a stored secret to plaintext. A value this cipher can't decrypt
|