@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/services/oauth.js
CHANGED
|
@@ -1,81 +1,212 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Supports browser-based login flow for API authentication.
|
|
5
|
-
*/
|
|
1
|
+
/** OAuth 2.0 authorization-code + PKCE primitives for host applications. */
|
|
2
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
6
3
|
import { createServer } from "node:http";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
import { mergeOAuthTokenResponse } from "../credentials/oauth.js";
|
|
5
|
+
const OAUTH_REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
6
|
+
function normalizedHostname(hostname) {
|
|
7
|
+
return hostname
|
|
8
|
+
.replace(/^\[|\]$/g, "")
|
|
9
|
+
.replace(/\.$/, "")
|
|
10
|
+
.toLowerCase();
|
|
11
|
+
}
|
|
12
|
+
function ipv4Octets(hostname) {
|
|
13
|
+
const parts = normalizedHostname(hostname).split(".");
|
|
14
|
+
if (parts.length !== 4 || parts.some((part) => !/^\d{1,3}$/.test(part)))
|
|
15
|
+
return undefined;
|
|
16
|
+
const octets = parts.map(Number);
|
|
17
|
+
return octets.every((part) => part >= 0 && part <= 255) ? octets : undefined;
|
|
18
|
+
}
|
|
19
|
+
function isLoopbackHostname(hostname) {
|
|
20
|
+
const host = normalizedHostname(hostname);
|
|
21
|
+
const octets = ipv4Octets(host);
|
|
22
|
+
return host === "localhost" || host === "::1" || Boolean(octets && octets[0] === 127);
|
|
23
|
+
}
|
|
24
|
+
function isPrivateNetworkHostname(hostname) {
|
|
25
|
+
const host = normalizedHostname(hostname);
|
|
26
|
+
const octets = ipv4Octets(host);
|
|
27
|
+
if (octets) {
|
|
28
|
+
const [a, b] = octets;
|
|
29
|
+
return (a === 0 ||
|
|
30
|
+
a === 10 ||
|
|
31
|
+
(a === 100 && b >= 64 && b <= 127) ||
|
|
32
|
+
(a === 169 && b === 254) ||
|
|
33
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
34
|
+
(a === 192 && b === 168) ||
|
|
35
|
+
(a === 198 && (b === 18 || b === 19)));
|
|
36
|
+
}
|
|
37
|
+
if (!host.includes(":"))
|
|
38
|
+
return false;
|
|
39
|
+
return host === "::" || host.startsWith("fc") || host.startsWith("fd") || /^fe[89ab]/.test(host);
|
|
40
|
+
}
|
|
41
|
+
function validateOAuthRequestUrl(url) {
|
|
42
|
+
if (url.username || url.password)
|
|
43
|
+
throw new Error("OAuth endpoint must not include credentials");
|
|
44
|
+
const loopback = isLoopbackHostname(url.hostname);
|
|
45
|
+
if (url.protocol !== "https:" && !(url.protocol === "http:" && loopback)) {
|
|
46
|
+
throw new Error("OAuth endpoint must use HTTPS (HTTP is allowed only for localhost)");
|
|
47
|
+
}
|
|
48
|
+
if (!loopback && isPrivateNetworkHostname(url.hostname)) {
|
|
49
|
+
throw new Error("OAuth endpoint must not target a private network address");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
10
52
|
/**
|
|
11
|
-
*
|
|
53
|
+
* Wrap fetch with OAuth-specific redirect handling. Every hop is validated;
|
|
54
|
+
* POST/Authorization requests never cross origins, so authorization codes,
|
|
55
|
+
* verifiers, refresh tokens, client secrets, and revocation tokens cannot be
|
|
56
|
+
* forwarded by an upstream 30x response.
|
|
12
57
|
*/
|
|
13
|
-
function
|
|
58
|
+
export function createHardenedOAuthFetch(baseFetch = fetch, options = {}) {
|
|
59
|
+
const maxRedirects = Math.max(0, Math.min(10, options.maxRedirects ?? 5));
|
|
60
|
+
return (async (input, init) => {
|
|
61
|
+
// Bun and Node's undici declarations currently expose incompatible global
|
|
62
|
+
// Request overloads even though both accept the standard fetch input at
|
|
63
|
+
// runtime. Keep that ambient type conflict contained at this boundary.
|
|
64
|
+
const initial = new Request(input, init);
|
|
65
|
+
let currentUrl = new URL(initial.url);
|
|
66
|
+
const initialLoopback = isLoopbackHostname(currentUrl.hostname);
|
|
67
|
+
let method = initial.method.toUpperCase();
|
|
68
|
+
let headers = new Headers(initial.headers);
|
|
69
|
+
let body = method === "GET" || method === "HEAD"
|
|
70
|
+
? undefined
|
|
71
|
+
: new Uint8Array(await initial.clone().arrayBuffer());
|
|
72
|
+
const secretBearing = (method !== "GET" && method !== "HEAD") || headers.has("authorization");
|
|
73
|
+
for (let redirectCount = 0;; redirectCount++) {
|
|
74
|
+
validateOAuthRequestUrl(currentUrl);
|
|
75
|
+
const request = new Request(currentUrl.toString(), {
|
|
76
|
+
method,
|
|
77
|
+
headers,
|
|
78
|
+
body: body ? body.slice() : undefined,
|
|
79
|
+
redirect: "manual",
|
|
80
|
+
signal: initial.signal,
|
|
81
|
+
});
|
|
82
|
+
const response = await baseFetch(request);
|
|
83
|
+
if (!OAUTH_REDIRECT_STATUSES.has(response.status))
|
|
84
|
+
return response;
|
|
85
|
+
const location = response.headers.get("location");
|
|
86
|
+
if (!location)
|
|
87
|
+
return response;
|
|
88
|
+
if (redirectCount >= maxRedirects)
|
|
89
|
+
throw new Error("OAuth redirect limit exceeded");
|
|
90
|
+
const nextUrl = new URL(location, currentUrl);
|
|
91
|
+
validateOAuthRequestUrl(nextUrl);
|
|
92
|
+
if (!initialLoopback && isLoopbackHostname(nextUrl.hostname)) {
|
|
93
|
+
throw new Error("OAuth redirect to a local network target is not allowed");
|
|
94
|
+
}
|
|
95
|
+
if (secretBearing && nextUrl.origin !== currentUrl.origin) {
|
|
96
|
+
throw new Error("OAuth secret-bearing request refused a cross-origin redirect");
|
|
97
|
+
}
|
|
98
|
+
if (response.status === 303 ||
|
|
99
|
+
((response.status === 301 || response.status === 302) && method === "POST")) {
|
|
100
|
+
method = "GET";
|
|
101
|
+
body = undefined;
|
|
102
|
+
headers = new Headers(headers);
|
|
103
|
+
headers.delete("content-type");
|
|
104
|
+
headers.delete("content-length");
|
|
105
|
+
}
|
|
106
|
+
currentUrl = nextUrl;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
export function generatePKCE() {
|
|
14
111
|
const verifier = randomBytes(32).toString("base64url");
|
|
15
112
|
const challenge = createHash("sha256").update(verifier).digest("base64url");
|
|
16
113
|
return { verifier, challenge };
|
|
17
114
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
115
|
+
function tokensFromSecret(secret) {
|
|
116
|
+
return {
|
|
117
|
+
accessToken: secret.accessToken,
|
|
118
|
+
refreshToken: secret.refreshToken,
|
|
119
|
+
expiresAt: secret.expiresAt ? Date.parse(secret.expiresAt) : undefined,
|
|
120
|
+
tokenType: secret.tokenType ?? "Bearer",
|
|
121
|
+
scope: secret.scope,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function callbackSettings(config, options) {
|
|
125
|
+
const host = options.callbackHost ?? "127.0.0.1";
|
|
126
|
+
if (!config.redirectUri) {
|
|
127
|
+
return { host, port: options.callbackPort ?? 0, path: "/callback" };
|
|
128
|
+
}
|
|
129
|
+
const redirect = new URL(config.redirectUri);
|
|
130
|
+
if (redirect.protocol !== "http:" ||
|
|
131
|
+
(redirect.hostname !== "127.0.0.1" && redirect.hostname !== "localhost")) {
|
|
132
|
+
throw new Error("OAuth redirectUri must be an HTTP loopback URL");
|
|
133
|
+
}
|
|
134
|
+
const port = options.callbackPort ?? Number(redirect.port || "80");
|
|
135
|
+
return {
|
|
136
|
+
host,
|
|
137
|
+
port,
|
|
138
|
+
path: redirect.pathname || "/callback",
|
|
139
|
+
fixedRedirect: options.callbackPort === undefined ? redirect.toString() : undefined,
|
|
140
|
+
};
|
|
25
141
|
}
|
|
26
142
|
/**
|
|
27
|
-
* Run
|
|
28
|
-
*
|
|
143
|
+
* Run an OAuth authorization-code flow. The host owns browser launching and
|
|
144
|
+
* injects `openExternal`; core only listens on an ephemeral loopback port.
|
|
29
145
|
*/
|
|
30
|
-
export async function authorize(config) {
|
|
146
|
+
export async function authorize(config, options = {}) {
|
|
147
|
+
if (options.signal?.aborted)
|
|
148
|
+
throw new Error("OAuth authorization aborted");
|
|
149
|
+
const callback = callbackSettings(config, options);
|
|
31
150
|
const { verifier, challenge } = generatePKCE();
|
|
32
151
|
const state = randomBytes(16).toString("hex");
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
response_type: "code",
|
|
38
|
-
client_id: config.clientId,
|
|
39
|
-
redirect_uri: redirectUri,
|
|
40
|
-
state,
|
|
41
|
-
code_challenge: challenge,
|
|
42
|
-
code_challenge_method: "S256",
|
|
43
|
-
});
|
|
44
|
-
if (config.scopes?.length) {
|
|
45
|
-
params.set("scope", config.scopes.join(" "));
|
|
46
|
-
}
|
|
47
|
-
const authUrl = `${config.authorizationEndpoint}?${params.toString()}`;
|
|
152
|
+
const fetchFn = createHardenedOAuthFetch(options.fetch ?? fetch);
|
|
153
|
+
const openExternal = options.openExternal;
|
|
154
|
+
if (!openExternal)
|
|
155
|
+
throw new Error("OAuth authorize requires an openExternal host callback");
|
|
48
156
|
return new Promise((resolve, reject) => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
157
|
+
let settled = false;
|
|
158
|
+
let timer;
|
|
159
|
+
let redirectUri = "";
|
|
160
|
+
const cleanup = () => {
|
|
161
|
+
if (timer)
|
|
162
|
+
clearTimeout(timer);
|
|
163
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
164
|
+
if (server.listening)
|
|
165
|
+
server.close();
|
|
166
|
+
};
|
|
167
|
+
const fail = (err) => {
|
|
168
|
+
if (settled)
|
|
169
|
+
return;
|
|
170
|
+
settled = true;
|
|
171
|
+
cleanup();
|
|
172
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
173
|
+
};
|
|
174
|
+
const succeed = (tokens) => {
|
|
175
|
+
if (settled)
|
|
176
|
+
return;
|
|
177
|
+
settled = true;
|
|
178
|
+
cleanup();
|
|
179
|
+
resolve(tokens);
|
|
180
|
+
};
|
|
181
|
+
const onAbort = () => fail(new Error("OAuth authorization aborted"));
|
|
53
182
|
const server = createServer(async (req, res) => {
|
|
54
|
-
|
|
183
|
+
const requestUrl = new URL(req.url ?? "/", redirectUri || "http://127.0.0.1");
|
|
184
|
+
if (requestUrl.pathname !== callback.path) {
|
|
55
185
|
res.writeHead(404);
|
|
56
186
|
res.end("Not found");
|
|
57
187
|
return;
|
|
58
188
|
}
|
|
59
|
-
const
|
|
60
|
-
const code =
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
res.end("<html><body><h1>Authorization failed</h1><p>You can close this window.</p></body></html>");
|
|
67
|
-
server.close();
|
|
68
|
-
reject(new Error(`OAuth error: ${error}`));
|
|
189
|
+
const returnedState = requestUrl.searchParams.get("state");
|
|
190
|
+
const code = requestUrl.searchParams.get("code");
|
|
191
|
+
const oauthError = requestUrl.searchParams.get("error");
|
|
192
|
+
if (returnedState !== state) {
|
|
193
|
+
res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" });
|
|
194
|
+
res.end("<h1>Invalid OAuth callback</h1><p>You can close this window.</p>");
|
|
195
|
+
fail(new Error("Invalid OAuth callback: state mismatch"));
|
|
69
196
|
return;
|
|
70
197
|
}
|
|
71
|
-
if (
|
|
72
|
-
res.writeHead(
|
|
73
|
-
res.end("<
|
|
74
|
-
|
|
75
|
-
|
|
198
|
+
if (oauthError) {
|
|
199
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
200
|
+
res.end("<h1>Authorization was not completed</h1><p>You can close this window.</p>");
|
|
201
|
+
fail(new Error(oauthError === "access_denied" ? "OAuth access denied" : "OAuth failed"));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (!code) {
|
|
205
|
+
res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" });
|
|
206
|
+
res.end("<h1>Invalid OAuth callback</h1><p>You can close this window.</p>");
|
|
207
|
+
fail(new Error("Invalid OAuth callback: missing code"));
|
|
76
208
|
return;
|
|
77
209
|
}
|
|
78
|
-
// Exchange code for tokens
|
|
79
210
|
try {
|
|
80
211
|
const tokenParams = new URLSearchParams({
|
|
81
212
|
grant_type: "authorization_code",
|
|
@@ -84,68 +215,75 @@ export async function authorize(config) {
|
|
|
84
215
|
client_id: config.clientId,
|
|
85
216
|
code_verifier: verifier,
|
|
86
217
|
});
|
|
87
|
-
|
|
218
|
+
if (config.clientSecret)
|
|
219
|
+
tokenParams.set("client_secret", config.clientSecret);
|
|
220
|
+
if (config.resource)
|
|
221
|
+
tokenParams.set("resource", config.resource);
|
|
222
|
+
const tokenRes = await fetchFn(config.tokenEndpoint, {
|
|
88
223
|
method: "POST",
|
|
89
224
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
90
225
|
body: tokenParams.toString(),
|
|
226
|
+
signal: options.signal,
|
|
91
227
|
});
|
|
92
228
|
if (!tokenRes.ok) {
|
|
93
|
-
throw new Error(`
|
|
229
|
+
throw new Error(`OAuth token exchange failed (${tokenRes.status})`);
|
|
94
230
|
}
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
expiresAt: data.expires_in
|
|
100
|
-
? Date.now() + data.expires_in * 1000
|
|
101
|
-
: undefined,
|
|
102
|
-
tokenType: data.token_type ?? "Bearer",
|
|
103
|
-
};
|
|
104
|
-
res.writeHead(200, { "Content-Type": "text/html" });
|
|
105
|
-
res.end("<html><body><h1>Authorization successful!</h1><p>You can close this window.</p></body></html>");
|
|
106
|
-
server.close();
|
|
107
|
-
resolve(tokens);
|
|
231
|
+
const secret = mergeOAuthTokenResponse(undefined, (await tokenRes.json()));
|
|
232
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
233
|
+
res.end("<h1>Authorization successful</h1><p>You can close this window.</p>");
|
|
234
|
+
succeed(tokensFromSecret(secret));
|
|
108
235
|
}
|
|
109
236
|
catch (err) {
|
|
110
|
-
res.writeHead(500, { "Content-Type": "text/html" });
|
|
111
|
-
res.end("<
|
|
112
|
-
|
|
113
|
-
reject(err);
|
|
237
|
+
res.writeHead(500, { "Content-Type": "text/html; charset=utf-8" });
|
|
238
|
+
res.end("<h1>Token exchange failed</h1><p>You can close this window.</p>");
|
|
239
|
+
fail(err);
|
|
114
240
|
}
|
|
115
241
|
});
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
242
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
243
|
+
server.once("error", (err) => fail(new Error(`OAuth callback server failed: ${err.message}`)));
|
|
244
|
+
server.listen(callback.port, callback.host, () => {
|
|
245
|
+
const address = server.address();
|
|
246
|
+
if (!address || typeof address === "string") {
|
|
247
|
+
fail(new Error("OAuth callback server did not expose a loopback port"));
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
redirectUri =
|
|
251
|
+
callback.fixedRedirect ?? `http://${callback.host}:${address.port}${callback.path}`;
|
|
252
|
+
const authUrl = new URL(config.authorizationEndpoint);
|
|
253
|
+
authUrl.searchParams.set("response_type", "code");
|
|
254
|
+
authUrl.searchParams.set("client_id", config.clientId);
|
|
255
|
+
authUrl.searchParams.set("redirect_uri", redirectUri);
|
|
256
|
+
authUrl.searchParams.set("state", state);
|
|
257
|
+
authUrl.searchParams.set("code_challenge", challenge);
|
|
258
|
+
authUrl.searchParams.set("code_challenge_method", "S256");
|
|
259
|
+
if (config.scopes?.length)
|
|
260
|
+
authUrl.searchParams.set("scope", config.scopes.join(" "));
|
|
261
|
+
if (config.resource)
|
|
262
|
+
authUrl.searchParams.set("resource", config.resource);
|
|
263
|
+
timer = setTimeout(() => fail(new Error("OAuth authorization timed out")), options.timeoutMs ?? 120_000);
|
|
264
|
+
Promise.resolve(openExternal(authUrl.toString())).catch(fail);
|
|
122
265
|
});
|
|
123
266
|
});
|
|
124
267
|
}
|
|
125
|
-
|
|
126
|
-
* Refresh an access token using a refresh token.
|
|
127
|
-
*/
|
|
128
|
-
export async function refreshToken(config, refreshTokenValue) {
|
|
268
|
+
export async function refreshToken(config, refreshTokenValue, options = {}) {
|
|
129
269
|
const params = new URLSearchParams({
|
|
130
270
|
grant_type: "refresh_token",
|
|
131
271
|
client_id: config.clientId,
|
|
132
272
|
refresh_token: refreshTokenValue,
|
|
133
273
|
});
|
|
134
|
-
|
|
274
|
+
if (config.clientSecret)
|
|
275
|
+
params.set("client_secret", config.clientSecret);
|
|
276
|
+
if (config.scopes?.length)
|
|
277
|
+
params.set("scope", config.scopes.join(" "));
|
|
278
|
+
if (config.resource)
|
|
279
|
+
params.set("resource", config.resource);
|
|
280
|
+
const res = await createHardenedOAuthFetch(options.fetch ?? fetch)(config.tokenEndpoint, {
|
|
135
281
|
method: "POST",
|
|
136
282
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
137
283
|
body: params.toString(),
|
|
138
284
|
});
|
|
139
|
-
if (!res.ok)
|
|
140
|
-
throw new Error(`
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return {
|
|
144
|
-
accessToken: data.access_token,
|
|
145
|
-
refreshToken: data.refresh_token ?? refreshTokenValue,
|
|
146
|
-
expiresAt: data.expires_in
|
|
147
|
-
? Date.now() + data.expires_in * 1000
|
|
148
|
-
: undefined,
|
|
149
|
-
tokenType: data.token_type ?? "Bearer",
|
|
150
|
-
};
|
|
285
|
+
if (!res.ok)
|
|
286
|
+
throw new Error(`OAuth token refresh failed (${res.status})`);
|
|
287
|
+
const secret = mergeOAuthTokenResponse({ accessToken: "replaced", refreshToken: refreshTokenValue }, (await res.json()), { now: options.now });
|
|
288
|
+
return tokensFromSecret(secret);
|
|
151
289
|
}
|
|
@@ -15,19 +15,19 @@ export interface SessionMemoryEntry {
|
|
|
15
15
|
/**
|
|
16
16
|
* Save a session memory entry.
|
|
17
17
|
*/
|
|
18
|
-
export declare function saveSessionMemory(entry: SessionMemoryEntry): void;
|
|
18
|
+
export declare function saveSessionMemory(entry: SessionMemoryEntry, baseDir?: string): void;
|
|
19
19
|
/**
|
|
20
20
|
* Load a session memory by session ID.
|
|
21
21
|
*/
|
|
22
|
-
export declare function loadSessionMemory(sessionId: string): SessionMemoryEntry | null;
|
|
22
|
+
export declare function loadSessionMemory(sessionId: string, baseDir?: string): SessionMemoryEntry | null;
|
|
23
23
|
/**
|
|
24
24
|
* List all session memories, most recent first.
|
|
25
25
|
*/
|
|
26
|
-
export declare function listSessionMemories(limit?: number): SessionMemoryEntry[];
|
|
26
|
+
export declare function listSessionMemories(limit?: number, baseDir?: string): SessionMemoryEntry[];
|
|
27
27
|
/**
|
|
28
28
|
* Search session memories by keyword.
|
|
29
29
|
*/
|
|
30
|
-
export declare function searchSessionMemories(query: string): SessionMemoryEntry[];
|
|
30
|
+
export declare function searchSessionMemories(query: string, baseDir?: string): SessionMemoryEntry[];
|
|
31
31
|
/**
|
|
32
32
|
* Build a prompt for extracting session memory from a conversation.
|
|
33
33
|
*/
|
|
@@ -11,14 +11,17 @@ import { sortSessionMemoriesByRecency } from "./session-memory-sort.js";
|
|
|
11
11
|
// Resolve per-call (NOT a module const): userHome() reads $HOME live, so a
|
|
12
12
|
// relocated/test HOME redirects writes instead of pinning the real ~/.code-shell
|
|
13
13
|
// at import time (bun freezes a module-level homedir() and never re-reads it).
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
// `baseDir` is the explicit injection point (the `~/.code-shell`-equivalent
|
|
15
|
+
// root): when provided it wins over $HOME resolution — identity-scoped server
|
|
16
|
+
// deployments pass their per-user data root here.
|
|
17
|
+
function memoryDir(baseDir) {
|
|
18
|
+
return join(baseDir ?? join(userHome(), ".code-shell"), "session-memories");
|
|
16
19
|
}
|
|
17
20
|
/**
|
|
18
21
|
* Save a session memory entry.
|
|
19
22
|
*/
|
|
20
|
-
export function saveSessionMemory(entry) {
|
|
21
|
-
const dir = memoryDir();
|
|
23
|
+
export function saveSessionMemory(entry, baseDir) {
|
|
24
|
+
const dir = memoryDir(baseDir);
|
|
22
25
|
mkdirSync(dir, { recursive: true });
|
|
23
26
|
const file = join(dir, `${entry.sessionId}.json`);
|
|
24
27
|
writeFileSync(file, JSON.stringify(entry, null, 2), "utf-8");
|
|
@@ -26,8 +29,8 @@ export function saveSessionMemory(entry) {
|
|
|
26
29
|
/**
|
|
27
30
|
* Load a session memory by session ID.
|
|
28
31
|
*/
|
|
29
|
-
export function loadSessionMemory(sessionId) {
|
|
30
|
-
const file = join(memoryDir(), `${sessionId}.json`);
|
|
32
|
+
export function loadSessionMemory(sessionId, baseDir) {
|
|
33
|
+
const file = join(memoryDir(baseDir), `${sessionId}.json`);
|
|
31
34
|
if (!existsSync(file))
|
|
32
35
|
return null;
|
|
33
36
|
try {
|
|
@@ -40,8 +43,8 @@ export function loadSessionMemory(sessionId) {
|
|
|
40
43
|
/**
|
|
41
44
|
* List all session memories, most recent first.
|
|
42
45
|
*/
|
|
43
|
-
export function listSessionMemories(limit = 50) {
|
|
44
|
-
const dir = memoryDir();
|
|
46
|
+
export function listSessionMemories(limit = 50, baseDir) {
|
|
47
|
+
const dir = memoryDir(baseDir);
|
|
45
48
|
if (!existsSync(dir))
|
|
46
49
|
return [];
|
|
47
50
|
// Read all entries, then order by createdAt (not by filename — the filename
|
|
@@ -63,8 +66,8 @@ export function listSessionMemories(limit = 50) {
|
|
|
63
66
|
/**
|
|
64
67
|
* Search session memories by keyword.
|
|
65
68
|
*/
|
|
66
|
-
export function searchSessionMemories(query) {
|
|
67
|
-
const all = listSessionMemories(200);
|
|
69
|
+
export function searchSessionMemories(query, baseDir) {
|
|
70
|
+
const all = listSessionMemories(200, baseDir);
|
|
68
71
|
const q = query.toLowerCase();
|
|
69
72
|
return all.filter((m) => m.summary.toLowerCase().includes(q) ||
|
|
70
73
|
m.keyTopics.some((t) => t.toLowerCase().includes(q)) ||
|
package/dist/session/memory.d.ts
CHANGED
|
@@ -215,20 +215,21 @@ export declare class MemoryManager {
|
|
|
215
215
|
now?: number;
|
|
216
216
|
}): string;
|
|
217
217
|
/**
|
|
218
|
-
*
|
|
219
|
-
* experience) +
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
* recall → drives TTL + UI visibility).
|
|
218
|
+
* Three-layer injection index (用户拍板). Merges GLOBAL (cross-project
|
|
219
|
+
* experience) + DIGITAL-HUMAN (portable profile experience) + PROJECT
|
|
220
|
+
* (this repo's facts) memories into a compact index — one line per entry,
|
|
221
|
+
* name + description only, NO body.
|
|
223
222
|
*
|
|
224
223
|
* This is what fixes "global memory never shows up": global memories are now
|
|
225
224
|
* injected alongside project ones, every session, regardless of cwd.
|
|
226
225
|
*
|
|
227
|
-
* Static because it must construct
|
|
228
|
-
*
|
|
226
|
+
* Static because it must construct the managers for each configured layer.
|
|
227
|
+
* `projectDir` undefined → no project layer; `profileDir` undefined → no
|
|
228
|
+
* digital-human layer.
|
|
229
229
|
*/
|
|
230
230
|
static buildInjectionIndex(opts: {
|
|
231
231
|
projectDir?: string;
|
|
232
|
+
profileDir?: string;
|
|
232
233
|
baseDir?: string;
|
|
233
234
|
maxAgeDays?: number;
|
|
234
235
|
now?: number;
|
|
@@ -253,6 +254,24 @@ export declare class MemoryManager {
|
|
|
253
254
|
* O(N²) re-read of every memory file on every save.
|
|
254
255
|
*/
|
|
255
256
|
private ensureIndexCache;
|
|
257
|
+
/**
|
|
258
|
+
* Rewrite MEMORY.md from the CURRENT set of memory files on disk, under a
|
|
259
|
+
* cross-process lock.
|
|
260
|
+
*
|
|
261
|
+
* The in-memory `indexCache` is a per-instance optimisation, and several
|
|
262
|
+
* managers exist for the same directory (desktop main, agent worker, TUI, a
|
|
263
|
+
* second desktop instance). Writing the cache out verbatim meant a stale
|
|
264
|
+
* snapshot clobbered whatever another writer had added:
|
|
265
|
+
*
|
|
266
|
+
* A saves a → B loads {a}, saves b → A still holds {a}, saves c
|
|
267
|
+
* → files a, b, c all exist, but MEMORY.md lists only a and c.
|
|
268
|
+
*
|
|
269
|
+
* The individual `<name>.md` files are the source of truth; MEMORY.md is a
|
|
270
|
+
* derived index. So rather than trusting any cache, re-derive it from disk
|
|
271
|
+
* inside the lock. `pending` carries this writer's own change, which may not
|
|
272
|
+
* be visible on disk yet (a delete moves the file to trash first, a save
|
|
273
|
+
* writes it first) — it is applied on top of the freshly scanned set.
|
|
274
|
+
*/
|
|
256
275
|
private writeIndex;
|
|
257
276
|
private generateId;
|
|
258
277
|
private availableFileNameForId;
|