@code-yeongyu/senpi 2026.9.10 → 2026.9.12-2
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/CHANGELOG.md +123 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +5 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +70 -9
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +183 -140
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +2 -0
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +49 -17
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/brand.d.ts +5 -0
- package/dist/core/brand.d.ts.map +1 -1
- package/dist/core/brand.js +13 -0
- package/dist/core/brand.js.map +1 -1
- package/dist/core/changelog-source.d.ts +8 -0
- package/dist/core/changelog-source.d.ts.map +1 -0
- package/dist/core/changelog-source.js +19 -0
- package/dist/core/changelog-source.js.map +1 -0
- package/dist/core/credential-accounts.d.ts +3 -0
- package/dist/core/credential-accounts.d.ts.map +1 -1
- package/dist/core/credential-accounts.js +20 -1
- package/dist/core/credential-accounts.js.map +1 -1
- package/dist/core/credential-pool/classify.d.ts.map +1 -1
- package/dist/core/credential-pool/classify.js +8 -0
- package/dist/core/credential-pool/classify.js.map +1 -1
- package/dist/core/cursor-history-admission.d.ts +50 -0
- package/dist/core/cursor-history-admission.d.ts.map +1 -0
- package/dist/core/cursor-history-admission.js +130 -0
- package/dist/core/cursor-history-admission.js.map +1 -0
- package/dist/core/extensions/builtin/account/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/account/index.js +7 -3
- package/dist/core/extensions/builtin/account/index.js.map +1 -1
- package/dist/core/extensions/builtin/account-display-name.d.ts +7 -0
- package/dist/core/extensions/builtin/account-display-name.d.ts.map +1 -0
- package/dist/core/extensions/builtin/account-display-name.js +40 -0
- package/dist/core/extensions/builtin/account-display-name.js.map +1 -0
- package/dist/core/extensions/builtin/ask-user/format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ask-user/format.js +7 -2
- package/dist/core/extensions/builtin/ask-user/format.js.map +1 -1
- package/dist/core/extensions/builtin/ask-user/pending.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ask-user/pending.js +3 -0
- package/dist/core/extensions/builtin/ask-user/pending.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js +21 -9
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.d.ts +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.js +11 -6
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.d.ts +9 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.js +10 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +3 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +19 -10
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js +3 -9
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.js +1 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js +5 -3
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts +1 -0
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/accounts.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +2 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/settings.js +3 -9
- package/dist/core/extensions/builtin/cursor-cli-oauth/settings.js.map +1 -1
- package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/agent-end-continuation.js +13 -1
- package/dist/core/extensions/builtin/goal/agent-end-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/prompt.js +11 -8
- package/dist/core/extensions/builtin/goal/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js +28 -0
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js.map +1 -1
- package/dist/core/extensions/builtin/goal/todo-gate.js +2 -2
- package/dist/core/extensions/builtin/goal/todo-gate.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +2 -2
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.js +19 -8
- package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.js +19 -0
- package/dist/core/extensions/builtin/prompt-preset/deepseek-v4-1-flash.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +6 -6
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +26 -7
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +29 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/high-reasoning-warning.d.ts.map +1 -1
- package/dist/core/high-reasoning-warning.js +5 -1
- package/dist/core/high-reasoning-warning.js.map +1 -1
- package/dist/core/manual-continue.d.ts +14 -0
- package/dist/core/manual-continue.d.ts.map +1 -1
- package/dist/core/manual-continue.js +13 -0
- package/dist/core/manual-continue.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +2 -2
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/remote-catalog-merge.d.ts +16 -0
- package/dist/core/remote-catalog-merge.d.ts.map +1 -0
- package/dist/core/remote-catalog-merge.js +75 -0
- package/dist/core/remote-catalog-merge.js.map +1 -0
- package/dist/core/remote-catalog-provider.d.ts +3 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +12 -40
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/session-entry-materializer.d.ts +12 -0
- package/dist/core/session-entry-materializer.d.ts.map +1 -0
- package/dist/core/session-entry-materializer.js +26 -0
- package/dist/core/session-entry-materializer.js.map +1 -0
- package/dist/core/session-manager.d.ts +38 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +60 -21
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-write-reservation.d.ts +9 -0
- package/dist/core/session-write-reservation.d.ts.map +1 -1
- package/dist/core/session-write-reservation.js +33 -0
- package/dist/core/session-write-reservation.js.map +1 -1
- package/dist/core/settings-manager.d.ts +3 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +10 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/modes/app-server/daemon/process.d.ts +6 -1
- package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
- package/dist/modes/app-server/daemon/process.js +23 -4
- package/dist/modes/app-server/daemon/process.js.map +1 -1
- package/dist/modes/app-server/protocol/account.d.ts +2 -0
- package/dist/modes/app-server/protocol/account.d.ts.map +1 -1
- package/dist/modes/app-server/protocol/account.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-async-widget.d.ts +2 -0
- package/dist/modes/interactive/components/ask-user-async-widget.d.ts.map +1 -1
- package/dist/modes/interactive/components/ask-user-async-widget.js +17 -1
- package/dist/modes/interactive/components/ask-user-async-widget.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-keys.d.ts +1 -1
- package/dist/modes/interactive/components/ask-user-question-keys.d.ts.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-keys.js +65 -17
- package/dist/modes/interactive/components/ask-user-question-keys.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-render.d.ts +2 -1
- package/dist/modes/interactive/components/ask-user-question-render.d.ts.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-render.js +39 -9
- package/dist/modes/interactive/components/ask-user-question-render.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-state.d.ts +14 -4
- package/dist/modes/interactive/components/ask-user-question-state.d.ts.map +1 -1
- package/dist/modes/interactive/components/ask-user-question-state.js +63 -6
- package/dist/modes/interactive/components/ask-user-question-state.js.map +1 -1
- package/dist/modes/interactive/components/ask-user-question.d.ts +2 -0
- package/dist/modes/interactive/components/ask-user-question.d.ts.map +1 -1
- package/dist/modes/interactive/components/ask-user-question.js +27 -14
- package/dist/modes/interactive/components/ask-user-question.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +51 -19
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +11 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +29 -9
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +7 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/help-content.d.ts.map +1 -1
- package/dist/modes/interactive/help-content.js +4 -0
- package/dist/modes/interactive/help-content.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +13 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +46 -17
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/tips/catalog/input-tips.js +1 -1
- package/dist/modes/interactive/tips/catalog/input-tips.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
- package/dist/modes/rpc/connection-handler.js +3 -1
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/connection-question-bridge.js +1 -1
- package/dist/modes/rpc/connection-question-bridge.js.map +1 -1
- package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
- package/dist/modes/rpc/host-ensure.js +33 -11
- package/dist/modes/rpc/host-ensure.js.map +1 -1
- package/dist/modes/rpc/host-lifecycle.d.ts +14 -0
- package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
- package/dist/modes/rpc/host-lifecycle.js +31 -5
- package/dist/modes/rpc/host-lifecycle.js.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-input-validation.js +2 -0
- package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +4 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js +1 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/session-path-reservations.d.ts +30 -0
- package/dist/modes/rpc/session-path-reservations.d.ts.map +1 -0
- package/dist/modes/rpc/session-path-reservations.js +58 -0
- package/dist/modes/rpc/session-path-reservations.js.map +1 -0
- package/dist/modes/rpc/session-registry.d.ts +3 -1
- package/dist/modes/rpc/session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/session-registry.js.map +1 -1
- package/dist/modes/rpc/session-worker-client.d.ts +10 -8
- package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-client.js +14 -23
- package/dist/modes/rpc/session-worker-client.js.map +1 -1
- package/dist/modes/rpc/session-worker-credit.d.ts +17 -0
- package/dist/modes/rpc/session-worker-credit.d.ts.map +1 -0
- package/dist/modes/rpc/session-worker-credit.js +39 -0
- package/dist/modes/rpc/session-worker-credit.js.map +1 -0
- package/dist/modes/rpc/session-worker-protocol.d.ts +10 -0
- package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -1
- package/dist/modes/rpc/session-worker-protocol.js +2 -0
- package/dist/modes/rpc/session-worker-protocol.js.map +1 -1
- package/dist/modes/rpc/session-worker-signals.d.ts +7 -0
- package/dist/modes/rpc/session-worker-signals.d.ts.map +1 -0
- package/dist/modes/rpc/session-worker-signals.js +19 -0
- package/dist/modes/rpc/session-worker-signals.js.map +1 -0
- package/dist/modes/rpc/session-worker.js +12 -16
- package/dist/modes/rpc/session-worker.js.map +1 -1
- package/dist/modes/rpc/worker-session-registry.d.ts +12 -0
- package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/worker-session-registry.js +51 -24
- package/dist/modes/rpc/worker-session-registry.js.map +1 -1
- package/dist/utils/changelog.d.ts +3 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js +89 -23
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/paths.d.ts +5 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +14 -1
- package/dist/utils/paths.js.map +1 -1
- package/docs/app-server.md +6 -0
- package/docs/extensions.md +19 -3
- package/docs/rpc.md +24 -6
- package/docs/settings.md +2 -1
- package/docs/tui.md +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +52 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +5 -4
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/output/streaming-output-buffer.ts +58 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/output/streaming-output.ts +9 -64
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts +11 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js +18 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.d.ts +19 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.js +135 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.d.ts +23 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.js +71 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/frames.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.d.ts +1261 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.js +431 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.d.ts +42 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.js +68 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.d.ts +43 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.js +43 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.d.ts +36 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.js +158 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.d.ts +26 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.js +145 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.d.ts +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.js +69 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.js +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/types.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.d.ts +26 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.js +61 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.d.ts +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.js +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.d.ts +22 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.js +217 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.js +23 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.lazy.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.d.ts +25 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.js +124 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-callback.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.d.ts +18 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.js +101 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin-token.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.d.ts +19 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.js +116 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.d.ts +24 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.js +86 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-identity.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts +51 -4
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js +196 -7
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +8 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +9 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/compat.js +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.d.ts +32 -0
- package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.js +62 -0
- package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +4 -4
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +11 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +14 -5
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/venice.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.js +62 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.js +37 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +3 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.d.ts +12 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.js +93 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.js +55 -16
- package/node_modules/@earendil-works/pi-tui/dist/dollar-invocation-autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -69,17 +69,26 @@ async function awaitInitialization(entry, signal) {
|
|
|
69
69
|
await initialize.call(entry.query);
|
|
70
70
|
return;
|
|
71
71
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
reject(new Error("Claude SDK OAuth reattach aborted"));
|
|
76
|
-
};
|
|
77
|
-
if (signal.aborted)
|
|
78
|
-
onAbort();
|
|
79
|
-
else
|
|
80
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
72
|
+
let rejectAborted = () => { };
|
|
73
|
+
const aborted = new Promise((_, reject) => {
|
|
74
|
+
rejectAborted = reject;
|
|
81
75
|
});
|
|
82
|
-
|
|
76
|
+
const onAbort = () => {
|
|
77
|
+
closeSession(entry.senpiSessionId, "resume_initialization_aborted");
|
|
78
|
+
rejectAborted(new Error("Claude SDK OAuth reattach aborted"));
|
|
79
|
+
};
|
|
80
|
+
if (signal.aborted) {
|
|
81
|
+
onAbort();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
await Promise.race([initialize.call(entry.query), aborted]);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
signal.removeEventListener("abort", onAbort);
|
|
91
|
+
}
|
|
83
92
|
}
|
|
84
93
|
/**
|
|
85
94
|
* A new query is not a new session: `resume` re-attaches to the existing lineage.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-reattach.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-reattach.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClaudeSdkOauthAuthLane } from \"./options.ts\";\nimport type { Options, SessionMessage } from \"./sdk-boundary.ts\";\nimport { getSdkBoundary, loadClaudeAgentSdk } from \"./sdk-boundary.ts\";\nimport { type ClaudeSdkOauthSessionEntry, closeSession, getOrCreateSession } from \"./session-registry.ts\";\nimport { recordSyncedStream } from \"./session-sync.ts\";\n\nexport type ContinuityBinding = {\n\tsenpiSessionId: string;\n\tsdkSessionId: string;\n\tsentCount: number;\n\tsentHashes: readonly string[];\n\tsentPrefixHash?: string;\n\t/**\n\t * False while the SDK has not yet acknowledged this session id (no init and\n\t * no replay echo): continuity must never resume or fork such an id.\n\t */\n\tsdkSessionIdConfirmed?: boolean;\n\tlastAssistantUuid: string | null;\n\taccountName: string;\n\tmodelId: string;\n\tsystemPromptHash: string;\n\ttoolsetHash: string;\n\t/** Assistant boundaries kept as entries so a later fork still has a resume point. */\n\tassistantUuidByIndex?: readonly (readonly [number, string])[];\n\t/**\n\t * Digest of the FULL sent stream an attempt pushed but never got answered\n\t * (stream-start timeout abort/failure). Purely in-memory: it lets the SAME\n\t * turn's retry fork at the pre-turn boundary instead of re-appending its user\n\t * message to a lineage that already carries it. Never persisted — the sidecar\n\t * schema is fixed at schemaVersion 1 and restart retries are out of scope.\n\t */\n\tunansweredTurnDigest?: string;\n};\n\nexport type ReattachInput = {\n\tbinding: ContinuityBinding;\n\toptions: Options;\n\tatUuid?: string;\n\tsignal?: AbortSignal;\n};\n\nconst bindings = new Map<string, ContinuityBinding>();\n\nexport type AbortOutcome = \"keep\" | \"reattach\";\n\nfunction cloneBinding(binding: ContinuityBinding): ContinuityBinding {\n\treturn {\n\t\t...binding,\n\t\tsentHashes: [...binding.sentHashes],\n\t\tassistantUuidByIndex: binding.assistantUuidByIndex?.map(([index, uuid]) => [index, uuid]),\n\t};\n}\n\nexport function evaluateAbortOutcome(receipt: unknown): AbortOutcome {\n\tif (!receipt || typeof receipt !== \"object\") return \"reattach\";\n\tconst queued = (receipt as { still_queued?: unknown }).still_queued;\n\treturn Array.isArray(queued) && queued.length === 0 ? \"keep\" : \"reattach\";\n}\n\nexport function rememberBinding(binding: ContinuityBinding): void {\n\tbindings.set(binding.senpiSessionId, cloneBinding(binding));\n}\n\nexport function getBinding(senpiSessionId: string): ContinuityBinding | undefined {\n\tconst binding = bindings.get(senpiSessionId);\n\treturn binding ? cloneBinding(binding) : undefined;\n}\n\nexport function forgetBinding(senpiSessionId: string): void {\n\tbindings.delete(senpiSessionId);\n}\n\nexport function bindingFromEntry(\n\tentry: Pick<\n\t\tClaudeSdkOauthSessionEntry,\n\t\t| \"senpiSessionId\"\n\t\t| \"sdkSessionId\"\n\t\t| \"sentCount\"\n\t\t| \"accountName\"\n\t\t| \"modelId\"\n\t\t| \"systemPromptHash\"\n\t\t| \"toolsetHash\"\n\t\t| \"assistantUuidByIndex\"\n\t\t| \"sdkSessionIdConfirmed\"\n\t>,\n\tsentHashes: readonly string[],\n): ContinuityBinding {\n\treturn {\n\t\tsenpiSessionId: entry.senpiSessionId,\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\tsdkSessionIdConfirmed: entry.sdkSessionIdConfirmed,\n\t\tsentCount: entry.sentCount,\n\t\tsentHashes: [...sentHashes],\n\t\tlastAssistantUuid: entry.assistantUuidByIndex.get(entry.sentCount) ?? null,\n\t\tassistantUuidByIndex: [...entry.assistantUuidByIndex.entries()],\n\t\taccountName: entry.accountName,\n\t\tmodelId: entry.modelId,\n\t\tsystemPromptHash: entry.systemPromptHash,\n\t\ttoolsetHash: entry.toolsetHash,\n\t};\n}\n\nexport async function verifyRestoredTranscript(\n\tbinding: ContinuityBinding,\n\tcwd: string,\n\tauthLane: ClaudeSdkOauthAuthLane,\n): Promise<boolean> {\n\tif (authLane === \"config-dir\") return false;\n\tlet messages: SessionMessage[];\n\ttry {\n\t\tmessages = await getSdkBoundary().getSessionMessages(binding.sdkSessionId, { dir: cwd });\n\t} catch (error) {\n\t\tif (error instanceof Error) return false;\n\t\tthrow error;\n\t}\n\tif (messages.length === 0 || messages.some((message) => message.session_id !== binding.sdkSessionId)) {\n\t\treturn false;\n\t}\n\tif (binding.lastAssistantUuid === null) return true;\n\treturn messages.some(\n\t\t(message) =>\n\t\t\tmessage.type === \"assistant\" &&\n\t\t\tmessage.uuid === binding.lastAssistantUuid &&\n\t\t\tmessage.parent_tool_use_id === null,\n\t);\n}\n\nasync function awaitInitialization(entry: ClaudeSdkOauthSessionEntry, signal?: AbortSignal): Promise<void> {\n\tconst initialize = entry.query.initializationResult;\n\tif (!initialize) return;\n\tif (!signal) {\n\t\tawait initialize.call(entry.query);\n\t\treturn;\n\t}\n\tconst aborted = new Promise<never>((_resolve, reject) => {\n\t\tconst onAbort = (): void => {\n\t\t\tcloseSession(entry.senpiSessionId, \"resume_initialization_aborted\");\n\t\t\treject(new Error(\"Claude SDK OAuth reattach aborted\"));\n\t\t};\n\t\tif (signal.aborted) onAbort();\n\t\telse signal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n\tawait Promise.race([initialize.call(entry.query), aborted]);\n}\n\n/**\n * A new query is not a new session: `resume` re-attaches to the existing lineage.\n * `sessionId` must stay absent unless forking, because the SDK rejects the pair\n * (sdk.d.ts:1805-1808) and would otherwise silently start an unrelated session.\n */\nexport async function reattachSession(input: ReattachInput): Promise<ClaudeSdkOauthSessionEntry> {\n\t// getOrCreateSession() reaches the synchronous SDK `query` through the\n\t// session-registry boundary - see sdk-boundary.lazy.ts.\n\tawait loadClaudeAgentSdk();\n\tconst { binding, atUuid } = input;\n\tcloseSession(binding.senpiSessionId, \"reattach\");\n\tconst entry = getOrCreateSession({\n\t\tsenpiSessionId: binding.senpiSessionId,\n\t\taccountName: binding.accountName,\n\t\tmodelId: binding.modelId,\n\t\tsystemPromptHash: binding.systemPromptHash,\n\t\ttoolsetHash: binding.toolsetHash,\n\t\toptions: input.options,\n\t\tresume: atUuid ? { sdkSessionId: binding.sdkSessionId, atUuid } : { sdkSessionId: binding.sdkSessionId },\n\t});\n\n\ttry {\n\t\tawait awaitInitialization(entry, input.signal);\n\t} catch (error) {\n\t\tcloseSession(binding.senpiSessionId, \"resume_initialization_failed\");\n\t\tthrow error;\n\t}\n\n\trecordSyncedStream(entry, binding.sentHashes);\n\tfor (const [index, uuid] of binding.assistantUuidByIndex ?? []) entry.assistantUuidByIndex.set(index, uuid);\n\tif (binding.lastAssistantUuid) entry.assistantUuidByIndex.set(binding.sentCount, binding.lastAssistantUuid);\n\trememberBinding({ ...binding, sdkSessionId: entry.sdkSessionId });\n\treturn entry;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-reattach.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/session-reattach.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClaudeSdkOauthAuthLane } from \"./options.ts\";\nimport type { Options, SessionMessage } from \"./sdk-boundary.ts\";\nimport { getSdkBoundary, loadClaudeAgentSdk } from \"./sdk-boundary.ts\";\nimport { type ClaudeSdkOauthSessionEntry, closeSession, getOrCreateSession } from \"./session-registry.ts\";\nimport { recordSyncedStream } from \"./session-sync.ts\";\n\nexport type ContinuityBinding = {\n\tsenpiSessionId: string;\n\tsdkSessionId: string;\n\tsentCount: number;\n\tsentHashes: readonly string[];\n\tsentPrefixHash?: string;\n\t/**\n\t * False while the SDK has not yet acknowledged this session id (no init and\n\t * no replay echo): continuity must never resume or fork such an id.\n\t */\n\tsdkSessionIdConfirmed?: boolean;\n\tlastAssistantUuid: string | null;\n\taccountName: string;\n\tmodelId: string;\n\tsystemPromptHash: string;\n\ttoolsetHash: string;\n\t/** Assistant boundaries kept as entries so a later fork still has a resume point. */\n\tassistantUuidByIndex?: readonly (readonly [number, string])[];\n\t/**\n\t * Digest of the FULL sent stream an attempt pushed but never got answered\n\t * (stream-start timeout abort/failure). Purely in-memory: it lets the SAME\n\t * turn's retry fork at the pre-turn boundary instead of re-appending its user\n\t * message to a lineage that already carries it. Never persisted — the sidecar\n\t * schema is fixed at schemaVersion 1 and restart retries are out of scope.\n\t */\n\tunansweredTurnDigest?: string;\n};\n\nexport type ReattachInput = {\n\tbinding: ContinuityBinding;\n\toptions: Options;\n\tatUuid?: string;\n\tsignal?: AbortSignal;\n};\n\nconst bindings = new Map<string, ContinuityBinding>();\n\nexport type AbortOutcome = \"keep\" | \"reattach\";\n\nfunction cloneBinding(binding: ContinuityBinding): ContinuityBinding {\n\treturn {\n\t\t...binding,\n\t\tsentHashes: [...binding.sentHashes],\n\t\tassistantUuidByIndex: binding.assistantUuidByIndex?.map(([index, uuid]) => [index, uuid]),\n\t};\n}\n\nexport function evaluateAbortOutcome(receipt: unknown): AbortOutcome {\n\tif (!receipt || typeof receipt !== \"object\") return \"reattach\";\n\tconst queued = (receipt as { still_queued?: unknown }).still_queued;\n\treturn Array.isArray(queued) && queued.length === 0 ? \"keep\" : \"reattach\";\n}\n\nexport function rememberBinding(binding: ContinuityBinding): void {\n\tbindings.set(binding.senpiSessionId, cloneBinding(binding));\n}\n\nexport function getBinding(senpiSessionId: string): ContinuityBinding | undefined {\n\tconst binding = bindings.get(senpiSessionId);\n\treturn binding ? cloneBinding(binding) : undefined;\n}\n\nexport function forgetBinding(senpiSessionId: string): void {\n\tbindings.delete(senpiSessionId);\n}\n\nexport function bindingFromEntry(\n\tentry: Pick<\n\t\tClaudeSdkOauthSessionEntry,\n\t\t| \"senpiSessionId\"\n\t\t| \"sdkSessionId\"\n\t\t| \"sentCount\"\n\t\t| \"accountName\"\n\t\t| \"modelId\"\n\t\t| \"systemPromptHash\"\n\t\t| \"toolsetHash\"\n\t\t| \"assistantUuidByIndex\"\n\t\t| \"sdkSessionIdConfirmed\"\n\t>,\n\tsentHashes: readonly string[],\n): ContinuityBinding {\n\treturn {\n\t\tsenpiSessionId: entry.senpiSessionId,\n\t\tsdkSessionId: entry.sdkSessionId,\n\t\tsdkSessionIdConfirmed: entry.sdkSessionIdConfirmed,\n\t\tsentCount: entry.sentCount,\n\t\tsentHashes: [...sentHashes],\n\t\tlastAssistantUuid: entry.assistantUuidByIndex.get(entry.sentCount) ?? null,\n\t\tassistantUuidByIndex: [...entry.assistantUuidByIndex.entries()],\n\t\taccountName: entry.accountName,\n\t\tmodelId: entry.modelId,\n\t\tsystemPromptHash: entry.systemPromptHash,\n\t\ttoolsetHash: entry.toolsetHash,\n\t};\n}\n\nexport async function verifyRestoredTranscript(\n\tbinding: ContinuityBinding,\n\tcwd: string,\n\tauthLane: ClaudeSdkOauthAuthLane,\n): Promise<boolean> {\n\tif (authLane === \"config-dir\") return false;\n\tlet messages: SessionMessage[];\n\ttry {\n\t\tmessages = await getSdkBoundary().getSessionMessages(binding.sdkSessionId, { dir: cwd });\n\t} catch (error) {\n\t\tif (error instanceof Error) return false;\n\t\tthrow error;\n\t}\n\tif (messages.length === 0 || messages.some((message) => message.session_id !== binding.sdkSessionId)) {\n\t\treturn false;\n\t}\n\tif (binding.lastAssistantUuid === null) return true;\n\treturn messages.some(\n\t\t(message) =>\n\t\t\tmessage.type === \"assistant\" &&\n\t\t\tmessage.uuid === binding.lastAssistantUuid &&\n\t\t\tmessage.parent_tool_use_id === null,\n\t);\n}\n\nasync function awaitInitialization(entry: ClaudeSdkOauthSessionEntry, signal?: AbortSignal): Promise<void> {\n\tconst initialize = entry.query.initializationResult;\n\tif (!initialize) return;\n\tif (!signal) {\n\t\tawait initialize.call(entry.query);\n\t\treturn;\n\t}\n\tlet rejectAborted: (reason?: unknown) => void = () => {};\n\tconst aborted = new Promise<never>((_, reject) => {\n\t\trejectAborted = reject;\n\t});\n\tconst onAbort = (): void => {\n\t\tcloseSession(entry.senpiSessionId, \"resume_initialization_aborted\");\n\t\trejectAborted(new Error(\"Claude SDK OAuth reattach aborted\"));\n\t};\n\tif (signal.aborted) {\n\t\tonAbort();\n\t} else {\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t}\n\ttry {\n\t\tawait Promise.race([initialize.call(entry.query), aborted]);\n\t} finally {\n\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t}\n}\n\n/**\n * A new query is not a new session: `resume` re-attaches to the existing lineage.\n * `sessionId` must stay absent unless forking, because the SDK rejects the pair\n * (sdk.d.ts:1805-1808) and would otherwise silently start an unrelated session.\n */\nexport async function reattachSession(input: ReattachInput): Promise<ClaudeSdkOauthSessionEntry> {\n\t// getOrCreateSession() reaches the synchronous SDK `query` through the\n\t// session-registry boundary - see sdk-boundary.lazy.ts.\n\tawait loadClaudeAgentSdk();\n\tconst { binding, atUuid } = input;\n\tcloseSession(binding.senpiSessionId, \"reattach\");\n\tconst entry = getOrCreateSession({\n\t\tsenpiSessionId: binding.senpiSessionId,\n\t\taccountName: binding.accountName,\n\t\tmodelId: binding.modelId,\n\t\tsystemPromptHash: binding.systemPromptHash,\n\t\ttoolsetHash: binding.toolsetHash,\n\t\toptions: input.options,\n\t\tresume: atUuid ? { sdkSessionId: binding.sdkSessionId, atUuid } : { sdkSessionId: binding.sdkSessionId },\n\t});\n\n\ttry {\n\t\tawait awaitInitialization(entry, input.signal);\n\t} catch (error) {\n\t\tcloseSession(binding.senpiSessionId, \"resume_initialization_failed\");\n\t\tthrow error;\n\t}\n\n\trecordSyncedStream(entry, binding.sentHashes);\n\tfor (const [index, uuid] of binding.assistantUuidByIndex ?? []) entry.assistantUuidByIndex.set(index, uuid);\n\tif (binding.lastAssistantUuid) entry.assistantUuidByIndex.set(binding.sentCount, binding.lastAssistantUuid);\n\trememberBinding({ ...binding, sdkSessionId: entry.sdkSessionId });\n\treturn entry;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkC,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,8BAA8B,GAAG,eAAe,GAAG,MAAM,GAAG,UAAU,CAAC;AACnF,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,KAAK,CAAC;AACtD,MAAM,MAAM,4BAA4B,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,8BAA8B;IAC9C;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,8BAA8B,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,wBAAwB,CAAC;IAC/C,QAAQ,CAAC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,4BAA4B,CAAC;CACvD;AAED,MAAM,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,8BAA8B,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CAClB,CAAC;AAMF,KAAK,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AA+FhE,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,8BAA8B,GAAG,wBAAwB,CAgB1G;AAED,gGAAgG;AAChG,wBAAgB,kCAAkC,CACjD,eAAe,EAAE,eAAe,EAChC,WAAW,GAAE,WAAyB,GACpC,8BAA8B,CAWhC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkC,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,8BAA8B,GAAG,eAAe,GAAG,MAAM,GAAG,UAAU,CAAC;AACnF,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,KAAK,CAAC;AACtD,MAAM,MAAM,4BAA4B,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,8BAA8B;IAC9C;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,8BAA8B,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,wBAAwB,CAAC;IAC/C,QAAQ,CAAC,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,4BAA4B,CAAC;CACvD;AAED,MAAM,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,8BAA8B,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CAClB,CAAC;AAMF,KAAK,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AA+FhE,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,8BAA8B,GAAG,wBAAwB,CAgB1G;AAED,gGAAgG;AAChG,wBAAgB,kCAAkC,CACjD,eAAe,EAAE,eAAe,EAChC,WAAW,GAAE,WAAyB,GACpC,8BAA8B,CAWhC;AAQD,oFAAoF;AACpF,wBAAgB,0CAA0C,CAAC,GAAG,EAAE,MAAM,GAAG,8BAA8B,CAgBtG"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { statSync } from "node:fs";
|
|
2
1
|
import { getAgentDir } from "../../../../config.js";
|
|
2
|
+
import { getFileContentRevision } from "../../../../utils/paths.js";
|
|
3
3
|
import { getSettingsPath, SettingsManager } from "../../../settings-manager.js";
|
|
4
4
|
const systemPromptModeSources = new WeakMap();
|
|
5
5
|
function isRecord(value) {
|
|
@@ -120,19 +120,13 @@ export function loadClaudeSdkOauthProviderSettings(settingsManager, environment
|
|
|
120
120
|
return settings;
|
|
121
121
|
}
|
|
122
122
|
function settingsFingerprint(path) {
|
|
123
|
-
|
|
124
|
-
const stat = statSync(path);
|
|
125
|
-
return `${stat.mtimeMs}:${stat.size}`;
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
return "missing";
|
|
129
|
-
}
|
|
123
|
+
return getFileContentRevision(path) ?? "missing";
|
|
130
124
|
}
|
|
131
125
|
let cachedClaudeSdkOauthManager;
|
|
132
126
|
/** Load settings from Senpi's configured global and project settings.json paths. */
|
|
133
127
|
export function loadClaudeSdkOauthProviderSettingsFromDisk(cwd) {
|
|
134
128
|
// fallbackEligible() calls this per candidate probe; cache the manager by
|
|
135
|
-
// (cwd, settings
|
|
129
|
+
// (cwd, settings content revision) and re-apply env live to avoid locked disk reads.
|
|
136
130
|
const agentDir = getAgentDir();
|
|
137
131
|
const key = `${cwd}|${settingsFingerprint(getSettingsPath(cwd, agentDir, "global"))}|${settingsFingerprint(getSettingsPath(cwd, agentDir, "project"))}`;
|
|
138
132
|
let settingsManager = cachedClaudeSdkOauthManager?.cwd === cwd && cachedClaudeSdkOauthManager.key === key
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAiB,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAsC/F,MAAM,uBAAuB,GAAG,IAAI,OAAO,EAAyC,CAAC;AAErF,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,CAAC,EAAE,CAAC;QAC/F,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAyB;IAChE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC5B,OAAO,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC5C,OAAO,KAAK,KAAK,eAAe,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAClG,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACtC,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IAC1C,OAAO,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACrG,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAyB;IACzD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,QAAQ,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,GAAG,CAAC;QACT,KAAK,MAAM;YACV,OAAO,IAAI,CAAC;QACb,KAAK,GAAG,CAAC;QACT,KAAK,OAAO;YACX,OAAO,KAAK,CAAC;QACd;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1E,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC5C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,MAAM,kBAAkB,GAAG,OAAO,KAAK,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;IAChH,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACvE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,OAAO,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;IACvG,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACjE,OAAO;QACN,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,WAAwB;IACzD,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAC;IACpF,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,WAAW,CAAC,yCAAyC,CAAC,CAAC;IACtG,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,WAAW,CAAC,yCAAyC,CAAC,CAAC;IACpG,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC;IAC9E,MAAM,cAAc,GAAG,mBAAmB,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAC/F,MAAM,cAAc,GAAG,8BAA8B,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAC1G,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,CAAC,qCAAqC,CAAC,CAAC;IAC7F,OAAO;QACN,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAwC;IAC/E,IAAI,QAAQ,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO;YACN,IAAI,EAAE,QAAQ,CAAC,gBAAgB;YAC/B,MAAM,EAAE,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS;YAC1D,QAAQ,EAAE,QAAQ,CAAC,kBAAkB,KAAK,SAAS;SACnD,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC/C,OAAO;YACN,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe;YAC5D,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,KAAK;SACf,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7D,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,kCAAkC,CACjD,eAAgC,EAChC,WAAW,GAAgB,OAAO,CAAC,GAAG;IAEtC,MAAM,MAAM,GAAG,eAAe,CAAC,iBAAiB,EAAwC,CAAC;IACzF,MAAM,OAAO,GAAG,eAAe,CAAC,kBAAkB,EAAwC,CAAC;IAC3F,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG;QAChB,GAAG,qBAAqB,CAAC,MAAM,CAAC,sBAAsB,CAAC;QACvD,GAAG,qBAAqB,CAAC,OAAO,CAAC,sBAAsB,CAAC;QACxD,GAAG,mBAAmB;KACtB,CAAC;IACF,IAAI,mBAAmB,CAAC,gBAAgB,KAAK,SAAS;QAAE,uBAAuB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrG,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACxC,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,IAAI,2BAA+F,CAAC;AAEpG,oFAAoF;AACpF,MAAM,UAAU,0CAA0C,CAAC,GAAW;IACrE,0EAA0E;IAC1E,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,mBAAmB,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,mBAAmB,CACzG,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CACzC,EAAE,CAAC;IACJ,IAAI,eAAe,GAClB,2BAA2B,EAAE,GAAG,KAAK,GAAG,IAAI,2BAA2B,CAAC,GAAG,KAAK,GAAG;QAClF,CAAC,CAAC,2BAA2B,CAAC,OAAO;QACrC,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACxD,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,kCAAkC,CAAC,eAAe,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["import { statSync } from \"node:fs\";\nimport { getAgentDir } from \"../../../../config.ts\";\nimport { getSettingsPath, type Settings, SettingsManager } from \"../../../settings-manager.ts\";\nimport type { SettingSource } from \"./sdk-boundary.ts\";\n\nexport type ClaudeSdkOauthSystemPromptMode = \"preset-append\" | \"full\" | \"override\";\nexport type ClaudeSdkOauthResumeMode = \"auto\" | \"off\";\nexport type ClaudeSdkOauthTokenInjection = \"oauth-slots\" | \"config-dir\" | \"ambient\";\n\nexport interface ClaudeSdkOauthProviderSettings {\n\t/**\n\t * Explicit opt-in for the ambient (host Claude CLI) auth lane. Absent means\n\t * false: a logged-in host CLI alone never makes this provider available,\n\t * because that would silently spend the user's Claude subscription. Stored\n\t * accounts and `CLAUDE_CODE_OAUTH_TOKEN*` are themselves explicit opt-ins\n\t * and stay available without this flag.\n\t */\n\treadonly enabled?: boolean;\n\treadonly appendSystemPrompt?: boolean;\n\treadonly systemPromptMode?: ClaudeSdkOauthSystemPromptMode;\n\treadonly systemPromptFile?: string;\n\treadonly resumeMode?: ClaudeSdkOauthResumeMode;\n\treadonly settingSources?: SettingSource[];\n\treadonly strictMcpConfig?: boolean;\n\treadonly pinnedAccount?: string;\n\treadonly tokenInjection?: ClaudeSdkOauthTokenInjection;\n}\n\nexport type ResolvedSystemPromptMode = {\n\tmode: ClaudeSdkOauthSystemPromptMode;\n\tsource: string;\n\tconflict: boolean;\n};\n\ntype SettingsWithClaudeSdkOauthProvider = Settings & {\n\tclaudeSdkOauthProvider?: unknown;\n};\n\ntype Environment = Readonly<Record<string, string | undefined>>;\n\nconst systemPromptModeSources = new WeakMap<ClaudeSdkOauthProviderSettings, \"env\">();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseSettingSources(value: unknown): SettingSource[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tif (!value.every((source) => source === \"user\" || source === \"project\" || source === \"local\")) {\n\t\treturn undefined;\n\t}\n\treturn [...value];\n}\n\nfunction parseEnvironmentSettingSources(value: string | undefined): SettingSource[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === \"\") return [];\n\treturn parseSettingSources(value.split(\",\").map((source) => source.trim()));\n}\n\nfunction parseSystemPromptMode(value: unknown): ClaudeSdkOauthSystemPromptMode | undefined {\n\treturn value === \"preset-append\" || value === \"full\" || value === \"override\" ? value : undefined;\n}\n\nfunction parseResumeMode(value: unknown): ClaudeSdkOauthResumeMode | undefined {\n\treturn value === \"auto\" || value === \"off\" ? value : undefined;\n}\n\nfunction parseTokenInjection(value: unknown): ClaudeSdkOauthTokenInjection | undefined {\n\treturn value === \"oauth-slots\" || value === \"config-dir\" || value === \"ambient\" ? value : undefined;\n}\n\nfunction parseEnvironmentBoolean(value: string | undefined): boolean | undefined {\n\tif (value === undefined) return undefined;\n\tswitch (value.toLowerCase()) {\n\t\tcase \"1\":\n\t\tcase \"true\":\n\t\t\treturn true;\n\t\tcase \"0\":\n\t\tcase \"false\":\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction parseNonEmptyString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction parseProviderSettings(value: unknown): ClaudeSdkOauthProviderSettings {\n\tif (!isRecord(value)) return {};\n\tconst enabled = typeof value.enabled === \"boolean\" ? value.enabled : undefined;\n\tconst appendSystemPrompt = typeof value.appendSystemPrompt === \"boolean\" ? value.appendSystemPrompt : undefined;\n\tconst systemPromptMode = parseSystemPromptMode(value.systemPromptMode);\n\tconst systemPromptFile = parseNonEmptyString(value.systemPromptFile);\n\tconst resumeMode = parseResumeMode(value.resumeMode);\n\tconst settingSources = parseSettingSources(value.settingSources);\n\tconst strictMcpConfig = typeof value.strictMcpConfig === \"boolean\" ? value.strictMcpConfig : undefined;\n\tconst pinnedAccount = parseNonEmptyString(value.pinnedAccount);\n\tconst tokenInjection = parseTokenInjection(value.tokenInjection);\n\treturn {\n\t\t...(enabled !== undefined ? { enabled } : {}),\n\t\t...(appendSystemPrompt !== undefined ? { appendSystemPrompt } : {}),\n\t\t...(systemPromptMode !== undefined ? { systemPromptMode } : {}),\n\t\t...(systemPromptFile !== undefined ? { systemPromptFile } : {}),\n\t\t...(resumeMode !== undefined ? { resumeMode } : {}),\n\t\t...(settingSources !== undefined ? { settingSources } : {}),\n\t\t...(strictMcpConfig !== undefined ? { strictMcpConfig } : {}),\n\t\t...(pinnedAccount !== undefined ? { pinnedAccount } : {}),\n\t\t...(tokenInjection !== undefined ? { tokenInjection } : {}),\n\t};\n}\n\nfunction parseEnvironmentSettings(environment: Environment): ClaudeSdkOauthProviderSettings {\n\tconst enabled = parseEnvironmentBoolean(environment.SENPI_CLAUDE_SDK_OAUTH_ENABLED);\n\tconst systemPromptMode = parseSystemPromptMode(environment.SENPI_CLAUDE_SDK_OAUTH_SYSTEM_PROMPT_MODE);\n\tconst systemPromptFile = parseNonEmptyString(environment.SENPI_CLAUDE_SDK_OAUTH_SYSTEM_PROMPT_FILE);\n\tconst resumeMode = parseResumeMode(environment.SENPI_CLAUDE_SDK_OAUTH_RESUME);\n\tconst tokenInjection = parseTokenInjection(environment.SENPI_CLAUDE_SDK_OAUTH_TOKEN_INJECTION);\n\tconst settingSources = parseEnvironmentSettingSources(environment.SENPI_CLAUDE_SDK_OAUTH_SETTING_SOURCES);\n\tconst pinnedAccount = parseNonEmptyString(environment.SENPI_CLAUDE_SDK_OAUTH_PINNED_ACCOUNT);\n\treturn {\n\t\t...(enabled !== undefined ? { enabled } : {}),\n\t\t...(systemPromptMode !== undefined ? { systemPromptMode } : {}),\n\t\t...(systemPromptFile !== undefined ? { systemPromptFile } : {}),\n\t\t...(resumeMode !== undefined ? { resumeMode } : {}),\n\t\t...(tokenInjection !== undefined ? { tokenInjection } : {}),\n\t\t...(settingSources !== undefined ? { settingSources } : {}),\n\t\t...(pinnedAccount !== undefined ? { pinnedAccount } : {}),\n\t};\n}\n\nexport function resolveSystemPromptMode(settings: ClaudeSdkOauthProviderSettings): ResolvedSystemPromptMode {\n\tif (settings.systemPromptMode !== undefined) {\n\t\treturn {\n\t\t\tmode: settings.systemPromptMode,\n\t\t\tsource: systemPromptModeSources.get(settings) ?? \"setting\",\n\t\t\tconflict: settings.appendSystemPrompt !== undefined,\n\t\t};\n\t}\n\tif (settings.appendSystemPrompt !== undefined) {\n\t\treturn {\n\t\t\tmode: settings.appendSystemPrompt ? \"full\" : \"preset-append\",\n\t\t\tsource: \"legacy\",\n\t\t\tconflict: false,\n\t\t};\n\t}\n\treturn { mode: \"full\", source: \"default\", conflict: false };\n}\n\n/** Load the provider block with env values taking precedence over project and global values. */\nexport function loadClaudeSdkOauthProviderSettings(\n\tsettingsManager: SettingsManager,\n\tenvironment: Environment = process.env,\n): ClaudeSdkOauthProviderSettings {\n\tconst global = settingsManager.getGlobalSettings() as SettingsWithClaudeSdkOauthProvider;\n\tconst project = settingsManager.getProjectSettings() as SettingsWithClaudeSdkOauthProvider;\n\tconst environmentSettings = parseEnvironmentSettings(environment);\n\tconst settings = {\n\t\t...parseProviderSettings(global.claudeSdkOauthProvider),\n\t\t...parseProviderSettings(project.claudeSdkOauthProvider),\n\t\t...environmentSettings,\n\t};\n\tif (environmentSettings.systemPromptMode !== undefined) systemPromptModeSources.set(settings, \"env\");\n\treturn settings;\n}\n\nfunction settingsFingerprint(path: string): string {\n\ttry {\n\t\tconst stat = statSync(path);\n\t\treturn `${stat.mtimeMs}:${stat.size}`;\n\t} catch {\n\t\treturn \"missing\";\n\t}\n}\n\nlet cachedClaudeSdkOauthManager: { cwd: string; key: string; manager: SettingsManager } | undefined;\n\n/** Load settings from Senpi's configured global and project settings.json paths. */\nexport function loadClaudeSdkOauthProviderSettingsFromDisk(cwd: string): ClaudeSdkOauthProviderSettings {\n\t// fallbackEligible() calls this per candidate probe; cache the manager by\n\t// (cwd, settings mtime+size) and re-apply env live to avoid locked disk reads.\n\tconst agentDir = getAgentDir();\n\tconst key = `${cwd}|${settingsFingerprint(getSettingsPath(cwd, agentDir, \"global\"))}|${settingsFingerprint(\n\t\tgetSettingsPath(cwd, agentDir, \"project\"),\n\t)}`;\n\tlet settingsManager =\n\t\tcachedClaudeSdkOauthManager?.cwd === cwd && cachedClaudeSdkOauthManager.key === key\n\t\t\t? cachedClaudeSdkOauthManager.manager\n\t\t\t: undefined;\n\tif (!settingsManager) {\n\t\tsettingsManager = SettingsManager.create(cwd, agentDir);\n\t\tcachedClaudeSdkOauthManager = { cwd, key, manager: settingsManager };\n\t}\n\treturn loadClaudeSdkOauthProviderSettings(settingsManager);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/claude-sdk-oauth/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAgentDir } from \"../../../../config.ts\";\nimport { getFileContentRevision } from \"../../../../utils/paths.ts\";\nimport { getSettingsPath, type Settings, SettingsManager } from \"../../../settings-manager.ts\";\nimport type { SettingSource } from \"./sdk-boundary.ts\";\n\nexport type ClaudeSdkOauthSystemPromptMode = \"preset-append\" | \"full\" | \"override\";\nexport type ClaudeSdkOauthResumeMode = \"auto\" | \"off\";\nexport type ClaudeSdkOauthTokenInjection = \"oauth-slots\" | \"config-dir\" | \"ambient\";\n\nexport interface ClaudeSdkOauthProviderSettings {\n\t/**\n\t * Explicit opt-in for the ambient (host Claude CLI) auth lane. Absent means\n\t * false: a logged-in host CLI alone never makes this provider available,\n\t * because that would silently spend the user's Claude subscription. Stored\n\t * accounts and `CLAUDE_CODE_OAUTH_TOKEN*` are themselves explicit opt-ins\n\t * and stay available without this flag.\n\t */\n\treadonly enabled?: boolean;\n\treadonly appendSystemPrompt?: boolean;\n\treadonly systemPromptMode?: ClaudeSdkOauthSystemPromptMode;\n\treadonly systemPromptFile?: string;\n\treadonly resumeMode?: ClaudeSdkOauthResumeMode;\n\treadonly settingSources?: SettingSource[];\n\treadonly strictMcpConfig?: boolean;\n\treadonly pinnedAccount?: string;\n\treadonly tokenInjection?: ClaudeSdkOauthTokenInjection;\n}\n\nexport type ResolvedSystemPromptMode = {\n\tmode: ClaudeSdkOauthSystemPromptMode;\n\tsource: string;\n\tconflict: boolean;\n};\n\ntype SettingsWithClaudeSdkOauthProvider = Settings & {\n\tclaudeSdkOauthProvider?: unknown;\n};\n\ntype Environment = Readonly<Record<string, string | undefined>>;\n\nconst systemPromptModeSources = new WeakMap<ClaudeSdkOauthProviderSettings, \"env\">();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseSettingSources(value: unknown): SettingSource[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tif (!value.every((source) => source === \"user\" || source === \"project\" || source === \"local\")) {\n\t\treturn undefined;\n\t}\n\treturn [...value];\n}\n\nfunction parseEnvironmentSettingSources(value: string | undefined): SettingSource[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === \"\") return [];\n\treturn parseSettingSources(value.split(\",\").map((source) => source.trim()));\n}\n\nfunction parseSystemPromptMode(value: unknown): ClaudeSdkOauthSystemPromptMode | undefined {\n\treturn value === \"preset-append\" || value === \"full\" || value === \"override\" ? value : undefined;\n}\n\nfunction parseResumeMode(value: unknown): ClaudeSdkOauthResumeMode | undefined {\n\treturn value === \"auto\" || value === \"off\" ? value : undefined;\n}\n\nfunction parseTokenInjection(value: unknown): ClaudeSdkOauthTokenInjection | undefined {\n\treturn value === \"oauth-slots\" || value === \"config-dir\" || value === \"ambient\" ? value : undefined;\n}\n\nfunction parseEnvironmentBoolean(value: string | undefined): boolean | undefined {\n\tif (value === undefined) return undefined;\n\tswitch (value.toLowerCase()) {\n\t\tcase \"1\":\n\t\tcase \"true\":\n\t\t\treturn true;\n\t\tcase \"0\":\n\t\tcase \"false\":\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction parseNonEmptyString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction parseProviderSettings(value: unknown): ClaudeSdkOauthProviderSettings {\n\tif (!isRecord(value)) return {};\n\tconst enabled = typeof value.enabled === \"boolean\" ? value.enabled : undefined;\n\tconst appendSystemPrompt = typeof value.appendSystemPrompt === \"boolean\" ? value.appendSystemPrompt : undefined;\n\tconst systemPromptMode = parseSystemPromptMode(value.systemPromptMode);\n\tconst systemPromptFile = parseNonEmptyString(value.systemPromptFile);\n\tconst resumeMode = parseResumeMode(value.resumeMode);\n\tconst settingSources = parseSettingSources(value.settingSources);\n\tconst strictMcpConfig = typeof value.strictMcpConfig === \"boolean\" ? value.strictMcpConfig : undefined;\n\tconst pinnedAccount = parseNonEmptyString(value.pinnedAccount);\n\tconst tokenInjection = parseTokenInjection(value.tokenInjection);\n\treturn {\n\t\t...(enabled !== undefined ? { enabled } : {}),\n\t\t...(appendSystemPrompt !== undefined ? { appendSystemPrompt } : {}),\n\t\t...(systemPromptMode !== undefined ? { systemPromptMode } : {}),\n\t\t...(systemPromptFile !== undefined ? { systemPromptFile } : {}),\n\t\t...(resumeMode !== undefined ? { resumeMode } : {}),\n\t\t...(settingSources !== undefined ? { settingSources } : {}),\n\t\t...(strictMcpConfig !== undefined ? { strictMcpConfig } : {}),\n\t\t...(pinnedAccount !== undefined ? { pinnedAccount } : {}),\n\t\t...(tokenInjection !== undefined ? { tokenInjection } : {}),\n\t};\n}\n\nfunction parseEnvironmentSettings(environment: Environment): ClaudeSdkOauthProviderSettings {\n\tconst enabled = parseEnvironmentBoolean(environment.SENPI_CLAUDE_SDK_OAUTH_ENABLED);\n\tconst systemPromptMode = parseSystemPromptMode(environment.SENPI_CLAUDE_SDK_OAUTH_SYSTEM_PROMPT_MODE);\n\tconst systemPromptFile = parseNonEmptyString(environment.SENPI_CLAUDE_SDK_OAUTH_SYSTEM_PROMPT_FILE);\n\tconst resumeMode = parseResumeMode(environment.SENPI_CLAUDE_SDK_OAUTH_RESUME);\n\tconst tokenInjection = parseTokenInjection(environment.SENPI_CLAUDE_SDK_OAUTH_TOKEN_INJECTION);\n\tconst settingSources = parseEnvironmentSettingSources(environment.SENPI_CLAUDE_SDK_OAUTH_SETTING_SOURCES);\n\tconst pinnedAccount = parseNonEmptyString(environment.SENPI_CLAUDE_SDK_OAUTH_PINNED_ACCOUNT);\n\treturn {\n\t\t...(enabled !== undefined ? { enabled } : {}),\n\t\t...(systemPromptMode !== undefined ? { systemPromptMode } : {}),\n\t\t...(systemPromptFile !== undefined ? { systemPromptFile } : {}),\n\t\t...(resumeMode !== undefined ? { resumeMode } : {}),\n\t\t...(tokenInjection !== undefined ? { tokenInjection } : {}),\n\t\t...(settingSources !== undefined ? { settingSources } : {}),\n\t\t...(pinnedAccount !== undefined ? { pinnedAccount } : {}),\n\t};\n}\n\nexport function resolveSystemPromptMode(settings: ClaudeSdkOauthProviderSettings): ResolvedSystemPromptMode {\n\tif (settings.systemPromptMode !== undefined) {\n\t\treturn {\n\t\t\tmode: settings.systemPromptMode,\n\t\t\tsource: systemPromptModeSources.get(settings) ?? \"setting\",\n\t\t\tconflict: settings.appendSystemPrompt !== undefined,\n\t\t};\n\t}\n\tif (settings.appendSystemPrompt !== undefined) {\n\t\treturn {\n\t\t\tmode: settings.appendSystemPrompt ? \"full\" : \"preset-append\",\n\t\t\tsource: \"legacy\",\n\t\t\tconflict: false,\n\t\t};\n\t}\n\treturn { mode: \"full\", source: \"default\", conflict: false };\n}\n\n/** Load the provider block with env values taking precedence over project and global values. */\nexport function loadClaudeSdkOauthProviderSettings(\n\tsettingsManager: SettingsManager,\n\tenvironment: Environment = process.env,\n): ClaudeSdkOauthProviderSettings {\n\tconst global = settingsManager.getGlobalSettings() as SettingsWithClaudeSdkOauthProvider;\n\tconst project = settingsManager.getProjectSettings() as SettingsWithClaudeSdkOauthProvider;\n\tconst environmentSettings = parseEnvironmentSettings(environment);\n\tconst settings = {\n\t\t...parseProviderSettings(global.claudeSdkOauthProvider),\n\t\t...parseProviderSettings(project.claudeSdkOauthProvider),\n\t\t...environmentSettings,\n\t};\n\tif (environmentSettings.systemPromptMode !== undefined) systemPromptModeSources.set(settings, \"env\");\n\treturn settings;\n}\n\nfunction settingsFingerprint(path: string): string {\n\treturn getFileContentRevision(path) ?? \"missing\";\n}\n\nlet cachedClaudeSdkOauthManager: { cwd: string; key: string; manager: SettingsManager } | undefined;\n\n/** Load settings from Senpi's configured global and project settings.json paths. */\nexport function loadClaudeSdkOauthProviderSettingsFromDisk(cwd: string): ClaudeSdkOauthProviderSettings {\n\t// fallbackEligible() calls this per candidate probe; cache the manager by\n\t// (cwd, settings content revision) and re-apply env live to avoid locked disk reads.\n\tconst agentDir = getAgentDir();\n\tconst key = `${cwd}|${settingsFingerprint(getSettingsPath(cwd, agentDir, \"global\"))}|${settingsFingerprint(\n\t\tgetSettingsPath(cwd, agentDir, \"project\"),\n\t)}`;\n\tlet settingsManager =\n\t\tcachedClaudeSdkOauthManager?.cwd === cwd && cachedClaudeSdkOauthManager.key === key\n\t\t\t? cachedClaudeSdkOauthManager.manager\n\t\t\t: undefined;\n\tif (!settingsManager) {\n\t\tsettingsManager = SettingsManager.create(cwd, agentDir);\n\t\tcachedClaudeSdkOauthManager = { cwd, key, manager: settingsManager };\n\t}\n\treturn loadClaudeSdkOauthProviderSettings(settingsManager);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routine-settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/routine-settings.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"routine-settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/routine-settings.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAqBnD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAKnF;AAMD,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAO/F;AAED,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAMlH;AA4BD;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAChD,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,kBAAkB,GACxB,MAAM,EAAE,CAeV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routine-settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/routine-settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { CONFIG_DIR_NAME } from \"../../../../config.ts\";\nimport { parseSettingsJson } from \"../../../settings-manager.ts\";\nimport type { ConfigReloadLogger } from \"./log.ts\";\n\n/**\n * Settings keys a running session already applies live (model/thinking picks)\n * or never reads back (changelog bookkeeping). A settings.json change limited\n * to these keys — typically /model or a thinking-level change in another\n * session or a background CLI run — must not hot-reload this session. Any\n * other key change keeps the full validate-and-reload flow.\n */\nconst ROUTINE_SETTINGS_KEYS: ReadonlySet<string> = new Set([\n\t\"defaultModel\",\n\t\"defaultProvider\",\n\t\"defaultThinkingLevel\",\n\t\"modelThinkingLevels\",\n\t\"modelLastOnThinkingLevels\",\n\t\"modelServiceTiers\",\n\t\"lastChangelogVersion\",\n\t\"tipsHistory\",\n]);\n\nexport function joinConfigDir(cwd: string): string {\n\treturn resolve(cwd, CONFIG_DIR_NAME);\n}\n\nexport function isSettingsPath(path: string, agentDir: string, cwd: string): boolean {\n\tconst resolvedPath = resolve(path);\n\treturn [\"settings.jsonc\", \"settings.json\"].some(\n\t\t(name) => resolvedPath === resolve(agentDir, name) || resolvedPath === resolve(joinConfigDir(cwd), name),\n\t);\n}\n\nfunction settingsSnapshotKey(path: string): string {\n\treturn resolve(path);\n}\n\nexport function updateSettingsContentSnapshot(contents: Map<string, string>, path: string): void {\n\tconst key = settingsSnapshotKey(path);\n\ttry {\n\t\tcontents.set(key, readFileSync(path, \"utf-8\"));\n\t} catch {\n\t\tcontents.delete(key);\n\t}\n}\n\nexport function refreshSettingsContentSnapshots(contents: Map<string, string>, agentDir: string, cwd: string): void {\n\tcontents.clear();\n\tfor (const name of [\"settings.jsonc\", \"settings.json\"]) {\n\t\tupdateSettingsContentSnapshot(contents, resolve(agentDir, name));\n\t\tupdateSettingsContentSnapshot(contents, resolve(joinConfigDir(cwd), name));\n\t}\n}\n\nfunction parseSettingsObject(content: string): Record<string, unknown> | undefined {\n\ttry {\n\t\treturn parseSettingsJson(content);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction changedTopLevelKeys(previous: Record<string, unknown>, next: Record<string, unknown>): string[] {\n\tconst keys = new Set([...Object.keys(previous), ...Object.keys(next)]);\n\tconst changed: string[] = [];\n\tfor (const key of keys) {\n\t\tif (JSON.stringify(previous[key]) !== JSON.stringify(next[key])) changed.push(key);\n\t}\n\treturn changed.sort();\n}\n\nfunction isRoutineOnlySettingsChange(previousContent: string | undefined, nextContent: string | undefined): boolean {\n\tif (previousContent === undefined || nextContent === undefined) return false;\n\tconst previous = parseSettingsObject(previousContent);\n\tconst next = parseSettingsObject(nextContent);\n\tif (previous === undefined || next === undefined) return false;\n\tconst changedKeys = changedTopLevelKeys(previous, next);\n\treturn changedKeys.length > 0 && changedKeys.every((key) => ROUTINE_SETTINGS_KEYS.has(key));\n}\n\n/**\n * Drops settings.json changes whose top-level diff is limited to routine keys\n * (ROUTINE_SETTINGS_KEYS). The content diff works across processes, unlike the\n * process-local self-write tracker: /model in one session no longer hot-reloads\n * every other session. The snapshot base advances for every observed settings\n * path, suppressed or not, so each event is classified against the previous\n * event's content. Missing or unparseable content is never suppressed.\n */\nexport function excludeRoutineOnlySettingsChanges(\n\tpaths: readonly string[],\n\tcontents: Map<string, string>,\n\tagentDir: string,\n\tcwd: string,\n\tlogger: ConfigReloadLogger,\n): string[] {\n\treturn paths.filter((path) => {\n\t\tif (!isSettingsPath(path, agentDir, cwd)) return true;\n\t\tconst previousContent = contents.get(settingsSnapshotKey(path));\n\t\tlet nextContent: string | undefined;\n\t\ttry {\n\t\t\tnextContent = readFileSync(path, \"utf-8\");\n\t\t} catch {\n\t\t\tnextContent = undefined;\n\t\t}\n\t\tupdateSettingsContentSnapshot(contents, path);\n\t\tif (!isRoutineOnlySettingsChange(previousContent, nextContent)) return true;\n\t\tlogger.debug(\"routine_settings_change_suppressed\", { path });\n\t\treturn false;\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"routine-settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/routine-settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { CONFIG_DIR_NAME } from \"../../../../config.ts\";\nimport { parseSettingsJson } from \"../../../settings-manager.ts\";\nimport type { ConfigReloadLogger } from \"./log.ts\";\n\n/**\n * Settings keys a running session already applies live (model/thinking picks)\n * or never reads back (changelog bookkeeping). A settings.json change limited\n * to these keys — typically /model or a thinking-level change in another\n * session or a background CLI run — must not hot-reload this session. Any\n * other key change keeps the full validate-and-reload flow.\n */\nconst ROUTINE_SETTINGS_KEYS: ReadonlySet<string> = new Set([\n\t\"defaultModel\",\n\t\"defaultProvider\",\n\t\"defaultThinkingLevel\",\n\t\"modelThinkingLevels\",\n\t\"modelLastOnThinkingLevels\",\n\t\"modelServiceTiers\",\n\t\"lastChangelogVersion\",\n\t\"changelogSeen\",\n\t\"tipsHistory\",\n]);\n\nexport function joinConfigDir(cwd: string): string {\n\treturn resolve(cwd, CONFIG_DIR_NAME);\n}\n\nexport function isSettingsPath(path: string, agentDir: string, cwd: string): boolean {\n\tconst resolvedPath = resolve(path);\n\treturn [\"settings.jsonc\", \"settings.json\"].some(\n\t\t(name) => resolvedPath === resolve(agentDir, name) || resolvedPath === resolve(joinConfigDir(cwd), name),\n\t);\n}\n\nfunction settingsSnapshotKey(path: string): string {\n\treturn resolve(path);\n}\n\nexport function updateSettingsContentSnapshot(contents: Map<string, string>, path: string): void {\n\tconst key = settingsSnapshotKey(path);\n\ttry {\n\t\tcontents.set(key, readFileSync(path, \"utf-8\"));\n\t} catch {\n\t\tcontents.delete(key);\n\t}\n}\n\nexport function refreshSettingsContentSnapshots(contents: Map<string, string>, agentDir: string, cwd: string): void {\n\tcontents.clear();\n\tfor (const name of [\"settings.jsonc\", \"settings.json\"]) {\n\t\tupdateSettingsContentSnapshot(contents, resolve(agentDir, name));\n\t\tupdateSettingsContentSnapshot(contents, resolve(joinConfigDir(cwd), name));\n\t}\n}\n\nfunction parseSettingsObject(content: string): Record<string, unknown> | undefined {\n\ttry {\n\t\treturn parseSettingsJson(content);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction changedTopLevelKeys(previous: Record<string, unknown>, next: Record<string, unknown>): string[] {\n\tconst keys = new Set([...Object.keys(previous), ...Object.keys(next)]);\n\tconst changed: string[] = [];\n\tfor (const key of keys) {\n\t\tif (JSON.stringify(previous[key]) !== JSON.stringify(next[key])) changed.push(key);\n\t}\n\treturn changed.sort();\n}\n\nfunction isRoutineOnlySettingsChange(previousContent: string | undefined, nextContent: string | undefined): boolean {\n\tif (previousContent === undefined || nextContent === undefined) return false;\n\tconst previous = parseSettingsObject(previousContent);\n\tconst next = parseSettingsObject(nextContent);\n\tif (previous === undefined || next === undefined) return false;\n\tconst changedKeys = changedTopLevelKeys(previous, next);\n\treturn changedKeys.length > 0 && changedKeys.every((key) => ROUTINE_SETTINGS_KEYS.has(key));\n}\n\n/**\n * Drops settings.json changes whose top-level diff is limited to routine keys\n * (ROUTINE_SETTINGS_KEYS). The content diff works across processes, unlike the\n * process-local self-write tracker: /model in one session no longer hot-reloads\n * every other session. The snapshot base advances for every observed settings\n * path, suppressed or not, so each event is classified against the previous\n * event's content. Missing or unparseable content is never suppressed.\n */\nexport function excludeRoutineOnlySettingsChanges(\n\tpaths: readonly string[],\n\tcontents: Map<string, string>,\n\tagentDir: string,\n\tcwd: string,\n\tlogger: ConfigReloadLogger,\n): string[] {\n\treturn paths.filter((path) => {\n\t\tif (!isSettingsPath(path, agentDir, cwd)) return true;\n\t\tconst previousContent = contents.get(settingsSnapshotKey(path));\n\t\tlet nextContent: string | undefined;\n\t\ttry {\n\t\t\tnextContent = readFileSync(path, \"utf-8\");\n\t\t} catch {\n\t\t\tnextContent = undefined;\n\t\t}\n\t\tupdateSettingsContentSnapshot(contents, path);\n\t\tif (!isRoutineOnlySettingsChange(previousContent, nextContent)) return true;\n\t\tlogger.debug(\"routine_settings_change_suppressed\", { path });\n\t\treturn false;\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-command.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/account-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"account-command.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/account-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,gBAAgB,CAAC;AAW5E,OAAO,EACN,KAAK,wBAAwB,EAK7B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGN,2BAA2B,EAC3B,4BAA4B,EAC5B,KAAK,qBAAqB,EAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,sBAAsB,EAA0B,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EACN,KAAK,8BAA8B,EAInC,MAAM,eAAe,CAAC;AAEvB,sFAAsF;AACtF,MAAM,MAAM,2BAA2B,GAAG;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,8BAA8B,CAAC;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,8BAA8B,KAAK,MAAM,CAAC;IAClF,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAC/F,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,2BAA2B,CAAC;IAC/D,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,4BAA4B,CAAC;IACtE,QAAQ,CAAC,UAAU,CAAC,EAAE,qBAAqB,CAAC;IAC5C,iGAAiG;IACjG,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IAChF,6FAA6F;IAC7F,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,wBAAwB,CAAC;CAC/C,CAAC;AAiCF;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,GAAE,2BAAgC,GAAG,IAAI,CAyD9G"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { accountLabel } from "@earendil-works/pi-ai/auth/pool/slots";
|
|
1
2
|
import { emitProviderAccountsChanged } from "../claude-sdk-oauth/account-events.js";
|
|
2
3
|
import { emptyCredential, listAccounts, pinAccount, removeAccount, } from "./accounts.js";
|
|
3
4
|
import { selectAccount } from "./affinity.js";
|
|
@@ -119,15 +120,16 @@ function showAccounts(ctx, settings, generation, now) {
|
|
|
119
120
|
if (accounts.length === 0)
|
|
120
121
|
lines.push(" (none)");
|
|
121
122
|
for (const account of accounts) {
|
|
122
|
-
const states = [account
|
|
123
|
+
const states = [accountLabel(account), account.source, slotStatus(account, now())];
|
|
123
124
|
if (account.name === pinned)
|
|
124
125
|
states.push("pinned");
|
|
125
126
|
if (account.name === affinityPick)
|
|
126
127
|
states.push("affinity pick");
|
|
127
128
|
lines.push(` ${states.join(" | ")}`);
|
|
128
129
|
}
|
|
129
|
-
|
|
130
|
-
lines.push(`
|
|
130
|
+
const labelFor = (name) => accountLabel(accounts.find((account) => account.name === name) ?? { name });
|
|
131
|
+
lines.push(`Pinned account: ${pinned === undefined ? "none" : `${labelFor(pinned)} (${pinSource})`}`);
|
|
132
|
+
lines.push(`Affinity pick: ${affinityPick === undefined ? (affinityError ? `unavailable - ${affinityError}` : "none") : labelFor(affinityPick)}`);
|
|
131
133
|
generation.runFencedSync(ctx, () => ctx.ui.notify(lines.join("\n"), "info"));
|
|
132
134
|
}
|
|
133
135
|
async function addAccount(ctx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-command.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/account-command.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Credential } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"../../types.ts\";\nimport { emitProviderAccountsChanged } from \"../claude-sdk-oauth/account-events.ts\";\nimport {\n\ttype CursorCliAccountSlot,\n\ttype CursorCliOauthCredential,\n\temptyCredential,\n\tlistAccounts,\n\tpinAccount,\n\tremoveAccount,\n} from \"./accounts.ts\";\nimport { selectAccount } from \"./affinity.ts\";\nimport {\n\ttype CursorCliGenerationGuard,\n\tcollectCursorCliStatus,\n\tNATIVE_CURSOR_PROVIDER_ID,\n\tregisterCursorCliShutdownSafety,\n\trenderCursorCliStatus,\n} from \"./diagnostics.ts\";\nimport {\n\tCURSOR_CLI_OAUTH_PROVIDER_ID,\n\tconfirmCursorCliNoApprovalAcknowledgement,\n\timportLocalCursorCredential,\n\timportNativeCursorCredential,\n\ttype LocalCursorImportDeps,\n} from \"./oauth-login.ts\";\nimport { type CursorCliSessionRouter, cursorCliSessionRouter } from \"./session-router.ts\";\nimport {\n\ttype CursorCliOauthProviderSettings,\n\tloadCursorCliOauthProviderSettingsFromDisk,\n\tpersistCursorCliNoApprovalAcknowledgement,\n\tpersistCursorCliOauthEnabled,\n} from \"./settings.ts\";\n\n/** Injectable seams; every default resolves real on-disk state at invocation time. */\nexport type CursorCliAccountCommandDeps = {\n\treadonly loadSettings?: (cwd: string) => CursorCliOauthProviderSettings;\n\treadonly router?: CursorCliSessionRouter;\n\treadonly resolveExecutable?: (settings: CursorCliOauthProviderSettings) => string;\n\treadonly probeVersion?: (executable: string) => Promise<string>;\n\treadonly readNativeCredential?: () => Credential | undefined | Promise<Credential | undefined>;\n\treadonly importCredential?: typeof importLocalCursorCredential;\n\treadonly importNativeCredential?: typeof importNativeCursorCredential;\n\treadonly importDeps?: LocalCursorImportDeps;\n\t/** Acknowledgement persistence seam; the default read-modify-writes the global settings file. */\n\treadonly persistAcknowledgement?: (cwd: string, acknowledgedAt: string) => void;\n\t/** Enablement persistence seam; explicit login/import actions activate the fallback lane. */\n\treadonly persistEnabled?: (cwd: string, enabled: boolean) => void;\n\treadonly now?: () => number;\n\treadonly generation?: CursorCliGenerationGuard;\n};\n\nconst USAGE =\n\t\"Usage: /cursor-account [list | add | remove <name> | pin <name> | unpin | import [local | native] | acknowledge | status]\";\n\nfunction asCursorCredential(value: Credential | undefined): CursorCliOauthCredential {\n\treturn value !== undefined && value.type === \"oauth\" ? (value as CursorCliOauthCredential) : emptyCredential();\n}\n\nfunction parseArgs(rawArgs: string): string[] {\n\treturn rawArgs.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction slotStatus(slot: CursorCliAccountSlot, now: number): string {\n\tif (slot.blockReason === \"auth_error\") return \"blocked until re-login\";\n\tif (slot.blockedUntil !== undefined && slot.blockedUntil > now) {\n\t\treturn `blocked until ${new Date(slot.blockedUntil).toISOString()} (${slot.blockReason ?? \"rate_limit\"})`;\n\t}\n\treturn \"available\";\n}\n\nfunction authEventMessage(event: unknown): string {\n\tif (event === null || typeof event !== \"object\") return \"Cursor CLI (OAuth) authentication update.\";\n\tconst value = event as Record<string, unknown>;\n\tif (value.type === \"auth_url\" && typeof value.url === \"string\") {\n\t\treturn `Open this URL to authorize Cursor CLI (OAuth):\\n${value.url}`;\n\t}\n\tif (value.type === \"device_code\" && typeof value.verificationUri === \"string\") {\n\t\treturn `Open this URL to authorize Cursor CLI (OAuth):\\n${value.verificationUri}`;\n\t}\n\treturn typeof value.message === \"string\" ? value.message : \"Cursor CLI (OAuth) authentication update.\";\n}\n\n/**\n * Registers `/cursor-account` plus the reload/shutdown teardown for this\n * extension generation: the command reads account state fresh from the\n * credential store on every invocation, and every deferred continuation is\n * fenced so a retired generation is never touched after a reload.\n */\nexport function registerCursorCliAccountCommand(pi: ExtensionAPI, deps: CursorCliAccountCommandDeps = {}): void {\n\tconst loadSettings = deps.loadSettings ?? ((cwd: string) => loadCursorCliOauthProviderSettingsFromDisk(cwd));\n\tconst now = deps.now ?? Date.now;\n\t// One guard per registration: a reload rebuilds the extension and gets a\n\t// fresh fence, while the child registry stays process-wide.\n\tconst generation = registerCursorCliShutdownSafety(pi, { generation: deps.generation });\n\n\tpi.registerCommand(\"cursor-account\", {\n\t\tdescription: \"List and manage Cursor CLI (OAuth) accounts.\",\n\t\targumentHint: \"[list | add | remove <name> | pin <name> | unpin | import | acknowledge | status]\",\n\t\thandler: async (rawArgs: string, ctx: ExtensionCommandContext): Promise<void> => {\n\t\t\ttry {\n\t\t\t\tconst args = parseArgs(rawArgs);\n\t\t\t\tconst action = args[0] ?? \"list\";\n\t\t\t\tif (action === \"list\") {\n\t\t\t\t\tshowAccounts(ctx, loadSettings(ctx.cwd), generation, now);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"add\") {\n\t\t\t\t\tawait addAccount(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"remove\") {\n\t\t\t\t\tawait removeNamedAccount(ctx, args[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"pin\" && args[1] !== undefined) {\n\t\t\t\t\tawait pinNamedAccount(ctx, args[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"unpin\") {\n\t\t\t\t\tawait unpinAccount(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"import\") {\n\t\t\t\t\tconst source = args[1] ?? \"local\";\n\t\t\t\t\tif (source !== \"local\" && source !== \"native\") {\n\t\t\t\t\t\tctx.ui.notify(USAGE, \"error\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tawait importAccount(ctx, deps, source);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"acknowledge\") {\n\t\t\t\t\tawait acknowledgeNoApproval(ctx, deps, generation);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"status\") {\n\t\t\t\t\tawait showStatus(ctx, deps, { loadSettings, generation, now });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tctx.ui.notify(USAGE, \"error\");\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n\nfunction showAccounts(\n\tctx: ExtensionCommandContext,\n\tsettings: CursorCliOauthProviderSettings,\n\tgeneration: CursorCliGenerationGuard,\n\tnow: () => number,\n): void {\n\tconst credential = asCursorCredential(ctx.modelRegistry.authStorage.get(CURSOR_CLI_OAUTH_PROVIDER_ID));\n\tconst accounts = listAccounts(credential);\n\tconst pinned = settings.pinnedAccount ?? credential.pinned;\n\tconst pinSource = settings.pinnedAccount !== undefined ? \"settings\" : \"stored\";\n\tlet affinityPick: string | undefined;\n\tlet affinityError: string | undefined;\n\tif (accounts.length > 0) {\n\t\ttry {\n\t\t\taffinityPick = selectAccount(accounts, {\n\t\t\t\tsessionId: ctx.sessionManager.getSessionId(),\n\t\t\t\tpinnedAccount: pinned,\n\t\t\t\tnow: now(),\n\t\t\t}).name;\n\t\t} catch (error) {\n\t\t\taffinityError = error instanceof Error ? error.message : String(error);\n\t\t}\n\t}\n\tconst lines = [\"Cursor CLI (OAuth) accounts:\"];\n\tif (accounts.length === 0) lines.push(\" (none)\");\n\tfor (const account of accounts) {\n\t\tconst states = [account.name, account.source, slotStatus(account, now())];\n\t\tif (account.name === pinned) states.push(\"pinned\");\n\t\tif (account.name === affinityPick) states.push(\"affinity pick\");\n\t\tlines.push(` ${states.join(\" | \")}`);\n\t}\n\tlines.push(`Pinned account: ${pinned === undefined ? \"none\" : `${pinned} (${pinSource})`}`);\n\tlines.push(`Affinity pick: ${affinityPick ?? (affinityError ? `unavailable - ${affinityError}` : \"none\")}`);\n\tgeneration.runFencedSync(ctx, () => ctx.ui.notify(lines.join(\"\\n\"), \"info\"));\n}\n\nasync function addAccount(ctx: ExtensionCommandContext): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/cursor-account add requires an interactive UI.\", \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\tawait ctx.modelRegistry.modelRuntime.login(CURSOR_CLI_OAUTH_PROVIDER_ID, \"oauth\", {\n\t\t\tsignal: ctx.signal,\n\t\t\tprompt: async (prompt: { message: string }) => {\n\t\t\t\tconst answer = await ctx.ui.input(prompt.message);\n\t\t\t\tif (answer === undefined) throw new Error(\"Login cancelled\");\n\t\t\t\treturn answer;\n\t\t\t},\n\t\t\tnotify: (event: unknown) => ctx.ui.notify(authEventMessage(event), \"info\"),\n\t\t});\n\t\temitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\t\tctx.ui.notify(\"Cursor CLI (OAuth) account added.\", \"info\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (message !== \"Login cancelled\") {\n\t\t\tctx.ui.notify(`Failed to add Cursor CLI (OAuth) account: ${message}`, \"error\");\n\t\t}\n\t}\n}\n\nasync function removeNamedAccount(ctx: ExtensionCommandContext, name: string | undefined): Promise<void> {\n\tif (!name) {\n\t\tctx.ui.notify(\"Usage: /cursor-account remove <name>\", \"error\");\n\t\treturn;\n\t}\n\tlet removed = false;\n\ttry {\n\t\tawait ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID, async (current) => {\n\t\t\tconst credential = asCursorCredential(current);\n\t\t\tif (!listAccounts(credential).some((account) => account.name === name)) return current;\n\t\t\tremoved = true;\n\t\t\treturn removeAccount(credential, name);\n\t\t});\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn;\n\t}\n\tif (!removed) {\n\t\tctx.ui.notify(`Cursor CLI (OAuth) account '${name}' does not exist.`, \"error\");\n\t\treturn;\n\t}\n\temitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\tctx.ui.notify(`Removed Cursor CLI (OAuth) account: ${name}.`, \"info\");\n}\n\nasync function pinNamedAccount(ctx: ExtensionCommandContext, name: string): Promise<void> {\n\ttry {\n\t\tawait ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID, async (current) => {\n\t\t\tconst credential = asCursorCredential(current);\n\t\t\tif (!listAccounts(credential).some((account) => account.name === name)) {\n\t\t\t\tthrow new Error(`Cursor CLI (OAuth) account '${name}' does not exist.`);\n\t\t\t}\n\t\t\treturn pinAccount(credential, name);\n\t\t});\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn;\n\t}\n\temitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\tctx.ui.notify(`Pinned Cursor CLI (OAuth) account: ${name}.`, \"info\");\n}\n\nasync function unpinAccount(ctx: ExtensionCommandContext): Promise<void> {\n\tlet hadPin = false;\n\ttry {\n\t\tawait ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID, async (current) => {\n\t\t\tconst credential = asCursorCredential(current);\n\t\t\tif (credential.pinned === undefined) return current;\n\t\t\thadPin = true;\n\t\t\tconst { pinned: _pinned, ...unpinned } = credential;\n\t\t\treturn unpinned;\n\t\t});\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn;\n\t}\n\tif (!hadPin) {\n\t\tctx.ui.notify(\"No stored Cursor CLI (OAuth) account pin is set.\", \"info\");\n\t\treturn;\n\t}\n\temitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\tctx.ui.notify(\"Unpinned Cursor CLI (OAuth) account.\", \"info\");\n}\n\nasync function importAccount(\n\tctx: ExtensionCommandContext,\n\tdeps: CursorCliAccountCommandDeps,\n\tsource: \"local\" | \"native\",\n): Promise<void> {\n\tconst importCredential = deps.importCredential ?? importLocalCursorCredential;\n\tconst importNativeCredential = deps.importNativeCredential ?? importNativeCursorCredential;\n\tconst importDeps: LocalCursorImportDeps = { ...deps.importDeps };\n\tif (importDeps.onPrompt === undefined && ctx.hasUI) {\n\t\timportDeps.onPrompt = async (prompt: { message: string }) => {\n\t\t\tconst answer = await ctx.ui.input(prompt.message);\n\t\t\tif (answer === undefined) throw new Error(\"Import cancelled\");\n\t\t\treturn answer;\n\t\t};\n\t}\n\tlet importedName: string | undefined;\n\ttry {\n\t\tawait ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID, async (current) => {\n\t\t\tconst before = asCursorCredential(current);\n\t\t\tconst updated =\n\t\t\t\tsource === \"native\"\n\t\t\t\t\t? await importNativeCredential(\n\t\t\t\t\t\t\tbefore,\n\t\t\t\t\t\t\tdeps.readNativeCredential ?? (() => ctx.modelRegistry.authStorage.get(NATIVE_CURSOR_PROVIDER_ID)),\n\t\t\t\t\t\t)\n\t\t\t\t\t: await importCredential(before, importDeps);\n\t\t\tconst existing = new Set(listAccounts(before).map((account) => account.name));\n\t\t\timportedName = listAccounts(updated).find((account) => !existing.has(account.name))?.name;\n\t\t\treturn updated;\n\t\t});\n\t} catch (error) {\n\t\tctx.ui.notify(\n\t\t\t`Failed to import local Cursor credential: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tconst persistEnabled = deps.persistEnabled ?? persistCursorCliOauthEnabled;\n\ttry {\n\t\tpersistEnabled(ctx.cwd, true);\n\t\tawait ctx.modelRegistry.modelRuntime.refresh({\n\t\t\tallowNetwork: false,\n\t\t\tproviders: [CURSOR_CLI_OAUTH_PROVIDER_ID],\n\t\t});\n\t} catch (error) {\n\t\tctx.ui.notify(\n\t\t\t`Imported ${source === \"native\" ? \"native \" : \"\"}Cursor credential, but provider activation failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\"warning\",\n\t\t);\n\t\treturn;\n\t}\n\temitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\tctx.ui.notify(\n\t\t`Imported ${source === \"native\" ? \"native \" : \"local \"}Cursor credential as '${importedName ?? \"a new account\"}' (copied into this provider's store).`,\n\t\t\"info\",\n\t);\n}\n\nasync function acknowledgeNoApproval(\n\tctx: ExtensionCommandContext,\n\tdeps: CursorCliAccountCommandDeps,\n\tgeneration: CursorCliGenerationGuard,\n): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/cursor-account acknowledge requires an interactive UI.\", \"error\");\n\t\treturn;\n\t}\n\tconst persist = deps.persistAcknowledgement ?? persistCursorCliNoApprovalAcknowledgement;\n\tconst acknowledgedAt = await confirmCursorCliNoApprovalAcknowledgement(\n\t\tasync (ask) => (await ctx.ui.input(ask.message)) ?? \"\",\n\t\t() => new Date((deps.now ?? Date.now)()),\n\t);\n\tif (acknowledgedAt === undefined) {\n\t\tgeneration.runFencedSync(ctx, () =>\n\t\t\tctx.ui.notify(\n\t\t\t\t\"No acknowledgement written: unattended Cursor CLI execution stays off until you acknowledge.\",\n\t\t\t\t\"info\",\n\t\t\t),\n\t\t);\n\t\treturn;\n\t}\n\tpersist(ctx.cwd, acknowledgedAt);\n\tgeneration.runFencedSync(ctx, () =>\n\t\tctx.ui.notify(`Acknowledged unattended Cursor CLI tool execution at ${acknowledgedAt}.`, \"info\"),\n\t);\n}\n\nasync function showStatus(\n\tctx: ExtensionCommandContext,\n\tdeps: CursorCliAccountCommandDeps,\n\tbound: {\n\t\tloadSettings: (cwd: string) => CursorCliOauthProviderSettings;\n\t\tgeneration: CursorCliGenerationGuard;\n\t\tnow: () => number;\n\t},\n): Promise<void> {\n\t// Context reads happen before any await; the render continuation is fenced\n\t// so a reload during the version probe can never touch a retired context.\n\tconst sessionId = ctx.sessionManager.getSessionId();\n\tconst report = await collectCursorCliStatus({\n\t\tsessionId,\n\t\tsettings: bound.loadSettings(ctx.cwd),\n\t\treadCredential: () => ctx.modelRegistry.authStorage.get(CURSOR_CLI_OAUTH_PROVIDER_ID),\n\t\treadNativeCredential:\n\t\t\tdeps.readNativeCredential ?? (() => ctx.modelRegistry.authStorage.get(NATIVE_CURSOR_PROVIDER_ID)),\n\t\trouter: deps.router ?? cursorCliSessionRouter,\n\t\tresolveExecutable: deps.resolveExecutable,\n\t\tprobeVersion: deps.probeVersion,\n\t\tnow: bound.now,\n\t});\n\tbound.generation.runFencedSync(ctx, () => ctx.ui.notify(renderCursorCliStatus(report), \"info\"));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"account-command.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/account-command.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Credential } from \"@earendil-works/pi-ai\";\nimport { accountLabel } from \"@earendil-works/pi-ai/auth/pool/slots\";\nimport type { ExtensionAPI, ExtensionCommandContext } from \"../../types.ts\";\nimport { emitProviderAccountsChanged } from \"../claude-sdk-oauth/account-events.ts\";\nimport {\n\ttype CursorCliAccountSlot,\n\ttype CursorCliOauthCredential,\n\temptyCredential,\n\tlistAccounts,\n\tpinAccount,\n\tremoveAccount,\n} from \"./accounts.ts\";\nimport { selectAccount } from \"./affinity.ts\";\nimport {\n\ttype CursorCliGenerationGuard,\n\tcollectCursorCliStatus,\n\tNATIVE_CURSOR_PROVIDER_ID,\n\tregisterCursorCliShutdownSafety,\n\trenderCursorCliStatus,\n} from \"./diagnostics.ts\";\nimport {\n\tCURSOR_CLI_OAUTH_PROVIDER_ID,\n\tconfirmCursorCliNoApprovalAcknowledgement,\n\timportLocalCursorCredential,\n\timportNativeCursorCredential,\n\ttype LocalCursorImportDeps,\n} from \"./oauth-login.ts\";\nimport { type CursorCliSessionRouter, cursorCliSessionRouter } from \"./session-router.ts\";\nimport {\n\ttype CursorCliOauthProviderSettings,\n\tloadCursorCliOauthProviderSettingsFromDisk,\n\tpersistCursorCliNoApprovalAcknowledgement,\n\tpersistCursorCliOauthEnabled,\n} from \"./settings.ts\";\n\n/** Injectable seams; every default resolves real on-disk state at invocation time. */\nexport type CursorCliAccountCommandDeps = {\n\treadonly loadSettings?: (cwd: string) => CursorCliOauthProviderSettings;\n\treadonly router?: CursorCliSessionRouter;\n\treadonly resolveExecutable?: (settings: CursorCliOauthProviderSettings) => string;\n\treadonly probeVersion?: (executable: string) => Promise<string>;\n\treadonly readNativeCredential?: () => Credential | undefined | Promise<Credential | undefined>;\n\treadonly importCredential?: typeof importLocalCursorCredential;\n\treadonly importNativeCredential?: typeof importNativeCursorCredential;\n\treadonly importDeps?: LocalCursorImportDeps;\n\t/** Acknowledgement persistence seam; the default read-modify-writes the global settings file. */\n\treadonly persistAcknowledgement?: (cwd: string, acknowledgedAt: string) => void;\n\t/** Enablement persistence seam; explicit login/import actions activate the fallback lane. */\n\treadonly persistEnabled?: (cwd: string, enabled: boolean) => void;\n\treadonly now?: () => number;\n\treadonly generation?: CursorCliGenerationGuard;\n};\n\nconst USAGE =\n\t\"Usage: /cursor-account [list | add | remove <name> | pin <name> | unpin | import [local | native] | acknowledge | status]\";\n\nfunction asCursorCredential(value: Credential | undefined): CursorCliOauthCredential {\n\treturn value !== undefined && value.type === \"oauth\" ? (value as CursorCliOauthCredential) : emptyCredential();\n}\n\nfunction parseArgs(rawArgs: string): string[] {\n\treturn rawArgs.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction slotStatus(slot: CursorCliAccountSlot, now: number): string {\n\tif (slot.blockReason === \"auth_error\") return \"blocked until re-login\";\n\tif (slot.blockedUntil !== undefined && slot.blockedUntil > now) {\n\t\treturn `blocked until ${new Date(slot.blockedUntil).toISOString()} (${slot.blockReason ?? \"rate_limit\"})`;\n\t}\n\treturn \"available\";\n}\n\nfunction authEventMessage(event: unknown): string {\n\tif (event === null || typeof event !== \"object\") return \"Cursor CLI (OAuth) authentication update.\";\n\tconst value = event as Record<string, unknown>;\n\tif (value.type === \"auth_url\" && typeof value.url === \"string\") {\n\t\treturn `Open this URL to authorize Cursor CLI (OAuth):\\n${value.url}`;\n\t}\n\tif (value.type === \"device_code\" && typeof value.verificationUri === \"string\") {\n\t\treturn `Open this URL to authorize Cursor CLI (OAuth):\\n${value.verificationUri}`;\n\t}\n\treturn typeof value.message === \"string\" ? value.message : \"Cursor CLI (OAuth) authentication update.\";\n}\n\n/**\n * Registers `/cursor-account` plus the reload/shutdown teardown for this\n * extension generation: the command reads account state fresh from the\n * credential store on every invocation, and every deferred continuation is\n * fenced so a retired generation is never touched after a reload.\n */\nexport function registerCursorCliAccountCommand(pi: ExtensionAPI, deps: CursorCliAccountCommandDeps = {}): void {\n\tconst loadSettings = deps.loadSettings ?? ((cwd: string) => loadCursorCliOauthProviderSettingsFromDisk(cwd));\n\tconst now = deps.now ?? Date.now;\n\t// One guard per registration: a reload rebuilds the extension and gets a\n\t// fresh fence, while the child registry stays process-wide.\n\tconst generation = registerCursorCliShutdownSafety(pi, { generation: deps.generation });\n\n\tpi.registerCommand(\"cursor-account\", {\n\t\tdescription: \"List and manage Cursor CLI (OAuth) accounts.\",\n\t\targumentHint: \"[list | add | remove <name> | pin <name> | unpin | import | acknowledge | status]\",\n\t\thandler: async (rawArgs: string, ctx: ExtensionCommandContext): Promise<void> => {\n\t\t\ttry {\n\t\t\t\tconst args = parseArgs(rawArgs);\n\t\t\t\tconst action = args[0] ?? \"list\";\n\t\t\t\tif (action === \"list\") {\n\t\t\t\t\tshowAccounts(ctx, loadSettings(ctx.cwd), generation, now);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"add\") {\n\t\t\t\t\tawait addAccount(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"remove\") {\n\t\t\t\t\tawait removeNamedAccount(ctx, args[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"pin\" && args[1] !== undefined) {\n\t\t\t\t\tawait pinNamedAccount(ctx, args[1]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"unpin\") {\n\t\t\t\t\tawait unpinAccount(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"import\") {\n\t\t\t\t\tconst source = args[1] ?? \"local\";\n\t\t\t\t\tif (source !== \"local\" && source !== \"native\") {\n\t\t\t\t\t\tctx.ui.notify(USAGE, \"error\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tawait importAccount(ctx, deps, source);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"acknowledge\") {\n\t\t\t\t\tawait acknowledgeNoApproval(ctx, deps, generation);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (action === \"status\") {\n\t\t\t\t\tawait showStatus(ctx, deps, { loadSettings, generation, now });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tctx.ui.notify(USAGE, \"error\");\n\t\t\t} catch (error) {\n\t\t\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n\nfunction showAccounts(\n\tctx: ExtensionCommandContext,\n\tsettings: CursorCliOauthProviderSettings,\n\tgeneration: CursorCliGenerationGuard,\n\tnow: () => number,\n): void {\n\tconst credential = asCursorCredential(ctx.modelRegistry.authStorage.get(CURSOR_CLI_OAUTH_PROVIDER_ID));\n\tconst accounts = listAccounts(credential);\n\tconst pinned = settings.pinnedAccount ?? credential.pinned;\n\tconst pinSource = settings.pinnedAccount !== undefined ? \"settings\" : \"stored\";\n\tlet affinityPick: string | undefined;\n\tlet affinityError: string | undefined;\n\tif (accounts.length > 0) {\n\t\ttry {\n\t\t\taffinityPick = selectAccount(accounts, {\n\t\t\t\tsessionId: ctx.sessionManager.getSessionId(),\n\t\t\t\tpinnedAccount: pinned,\n\t\t\t\tnow: now(),\n\t\t\t}).name;\n\t\t} catch (error) {\n\t\t\taffinityError = error instanceof Error ? error.message : String(error);\n\t\t}\n\t}\n\tconst lines = [\"Cursor CLI (OAuth) accounts:\"];\n\tif (accounts.length === 0) lines.push(\" (none)\");\n\tfor (const account of accounts) {\n\t\tconst states = [accountLabel(account), account.source, slotStatus(account, now())];\n\t\tif (account.name === pinned) states.push(\"pinned\");\n\t\tif (account.name === affinityPick) states.push(\"affinity pick\");\n\t\tlines.push(` ${states.join(\" | \")}`);\n\t}\n\tconst labelFor = (name: string) => accountLabel(accounts.find((account) => account.name === name) ?? { name });\n\tlines.push(`Pinned account: ${pinned === undefined ? \"none\" : `${labelFor(pinned)} (${pinSource})`}`);\n\tlines.push(\n\t\t`Affinity pick: ${affinityPick === undefined ? (affinityError ? `unavailable - ${affinityError}` : \"none\") : labelFor(affinityPick)}`,\n\t);\n\tgeneration.runFencedSync(ctx, () => ctx.ui.notify(lines.join(\"\\n\"), \"info\"));\n}\n\nasync function addAccount(ctx: ExtensionCommandContext): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/cursor-account add requires an interactive UI.\", \"error\");\n\t\treturn;\n\t}\n\ttry {\n\t\tawait ctx.modelRegistry.modelRuntime.login(CURSOR_CLI_OAUTH_PROVIDER_ID, \"oauth\", {\n\t\t\tsignal: ctx.signal,\n\t\t\tprompt: async (prompt: { message: string }) => {\n\t\t\t\tconst answer = await ctx.ui.input(prompt.message);\n\t\t\t\tif (answer === undefined) throw new Error(\"Login cancelled\");\n\t\t\t\treturn answer;\n\t\t\t},\n\t\t\tnotify: (event: unknown) => ctx.ui.notify(authEventMessage(event), \"info\"),\n\t\t});\n\t\temitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\t\tctx.ui.notify(\"Cursor CLI (OAuth) account added.\", \"info\");\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (message !== \"Login cancelled\") {\n\t\t\tctx.ui.notify(`Failed to add Cursor CLI (OAuth) account: ${message}`, \"error\");\n\t\t}\n\t}\n}\n\nasync function removeNamedAccount(ctx: ExtensionCommandContext, name: string | undefined): Promise<void> {\n\tif (!name) {\n\t\tctx.ui.notify(\"Usage: /cursor-account remove <name>\", \"error\");\n\t\treturn;\n\t}\n\tlet removed = false;\n\ttry {\n\t\tawait ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID, async (current) => {\n\t\t\tconst credential = asCursorCredential(current);\n\t\t\tif (!listAccounts(credential).some((account) => account.name === name)) return current;\n\t\t\tremoved = true;\n\t\t\treturn removeAccount(credential, name);\n\t\t});\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn;\n\t}\n\tif (!removed) {\n\t\tctx.ui.notify(`Cursor CLI (OAuth) account '${name}' does not exist.`, \"error\");\n\t\treturn;\n\t}\n\temitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\tctx.ui.notify(`Removed Cursor CLI (OAuth) account: ${name}.`, \"info\");\n}\n\nasync function pinNamedAccount(ctx: ExtensionCommandContext, name: string): Promise<void> {\n\ttry {\n\t\tawait ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID, async (current) => {\n\t\t\tconst credential = asCursorCredential(current);\n\t\t\tif (!listAccounts(credential).some((account) => account.name === name)) {\n\t\t\t\tthrow new Error(`Cursor CLI (OAuth) account '${name}' does not exist.`);\n\t\t\t}\n\t\t\treturn pinAccount(credential, name);\n\t\t});\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn;\n\t}\n\temitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\tctx.ui.notify(`Pinned Cursor CLI (OAuth) account: ${name}.`, \"info\");\n}\n\nasync function unpinAccount(ctx: ExtensionCommandContext): Promise<void> {\n\tlet hadPin = false;\n\ttry {\n\t\tawait ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID, async (current) => {\n\t\t\tconst credential = asCursorCredential(current);\n\t\t\tif (credential.pinned === undefined) return current;\n\t\t\thadPin = true;\n\t\t\tconst { pinned: _pinned, ...unpinned } = credential;\n\t\t\treturn unpinned;\n\t\t});\n\t} catch (error) {\n\t\tctx.ui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\treturn;\n\t}\n\tif (!hadPin) {\n\t\tctx.ui.notify(\"No stored Cursor CLI (OAuth) account pin is set.\", \"info\");\n\t\treturn;\n\t}\n\temitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\tctx.ui.notify(\"Unpinned Cursor CLI (OAuth) account.\", \"info\");\n}\n\nasync function importAccount(\n\tctx: ExtensionCommandContext,\n\tdeps: CursorCliAccountCommandDeps,\n\tsource: \"local\" | \"native\",\n): Promise<void> {\n\tconst importCredential = deps.importCredential ?? importLocalCursorCredential;\n\tconst importNativeCredential = deps.importNativeCredential ?? importNativeCursorCredential;\n\tconst importDeps: LocalCursorImportDeps = { ...deps.importDeps };\n\tif (importDeps.onPrompt === undefined && ctx.hasUI) {\n\t\timportDeps.onPrompt = async (prompt: { message: string }) => {\n\t\t\tconst answer = await ctx.ui.input(prompt.message);\n\t\t\tif (answer === undefined) throw new Error(\"Import cancelled\");\n\t\t\treturn answer;\n\t\t};\n\t}\n\tlet importedName: string | undefined;\n\ttry {\n\t\tawait ctx.modelRegistry.authStorage.modify(CURSOR_CLI_OAUTH_PROVIDER_ID, async (current) => {\n\t\t\tconst before = asCursorCredential(current);\n\t\t\tconst updated =\n\t\t\t\tsource === \"native\"\n\t\t\t\t\t? await importNativeCredential(\n\t\t\t\t\t\t\tbefore,\n\t\t\t\t\t\t\tdeps.readNativeCredential ?? (() => ctx.modelRegistry.authStorage.get(NATIVE_CURSOR_PROVIDER_ID)),\n\t\t\t\t\t\t)\n\t\t\t\t\t: await importCredential(before, importDeps);\n\t\t\tconst existing = new Set(listAccounts(before).map((account) => account.name));\n\t\t\timportedName = listAccounts(updated).find((account) => !existing.has(account.name))?.name;\n\t\t\treturn updated;\n\t\t});\n\t} catch (error) {\n\t\tctx.ui.notify(\n\t\t\t`Failed to import local Cursor credential: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn;\n\t}\n\tconst persistEnabled = deps.persistEnabled ?? persistCursorCliOauthEnabled;\n\ttry {\n\t\tpersistEnabled(ctx.cwd, true);\n\t\tawait ctx.modelRegistry.modelRuntime.refresh({\n\t\t\tallowNetwork: false,\n\t\t\tproviders: [CURSOR_CLI_OAUTH_PROVIDER_ID],\n\t\t});\n\t} catch (error) {\n\t\tctx.ui.notify(\n\t\t\t`Imported ${source === \"native\" ? \"native \" : \"\"}Cursor credential, but provider activation failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\"warning\",\n\t\t);\n\t\treturn;\n\t}\n\temitProviderAccountsChanged(CURSOR_CLI_OAUTH_PROVIDER_ID);\n\tctx.ui.notify(\n\t\t`Imported ${source === \"native\" ? \"native \" : \"local \"}Cursor credential as '${importedName ?? \"a new account\"}' (copied into this provider's store).`,\n\t\t\"info\",\n\t);\n}\n\nasync function acknowledgeNoApproval(\n\tctx: ExtensionCommandContext,\n\tdeps: CursorCliAccountCommandDeps,\n\tgeneration: CursorCliGenerationGuard,\n): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/cursor-account acknowledge requires an interactive UI.\", \"error\");\n\t\treturn;\n\t}\n\tconst persist = deps.persistAcknowledgement ?? persistCursorCliNoApprovalAcknowledgement;\n\tconst acknowledgedAt = await confirmCursorCliNoApprovalAcknowledgement(\n\t\tasync (ask) => (await ctx.ui.input(ask.message)) ?? \"\",\n\t\t() => new Date((deps.now ?? Date.now)()),\n\t);\n\tif (acknowledgedAt === undefined) {\n\t\tgeneration.runFencedSync(ctx, () =>\n\t\t\tctx.ui.notify(\n\t\t\t\t\"No acknowledgement written: unattended Cursor CLI execution stays off until you acknowledge.\",\n\t\t\t\t\"info\",\n\t\t\t),\n\t\t);\n\t\treturn;\n\t}\n\tpersist(ctx.cwd, acknowledgedAt);\n\tgeneration.runFencedSync(ctx, () =>\n\t\tctx.ui.notify(`Acknowledged unattended Cursor CLI tool execution at ${acknowledgedAt}.`, \"info\"),\n\t);\n}\n\nasync function showStatus(\n\tctx: ExtensionCommandContext,\n\tdeps: CursorCliAccountCommandDeps,\n\tbound: {\n\t\tloadSettings: (cwd: string) => CursorCliOauthProviderSettings;\n\t\tgeneration: CursorCliGenerationGuard;\n\t\tnow: () => number;\n\t},\n): Promise<void> {\n\t// Context reads happen before any await; the render continuation is fenced\n\t// so a reload during the version probe can never touch a retired context.\n\tconst sessionId = ctx.sessionManager.getSessionId();\n\tconst report = await collectCursorCliStatus({\n\t\tsessionId,\n\t\tsettings: bound.loadSettings(ctx.cwd),\n\t\treadCredential: () => ctx.modelRegistry.authStorage.get(CURSOR_CLI_OAUTH_PROVIDER_ID),\n\t\treadNativeCredential:\n\t\t\tdeps.readNativeCredential ?? (() => ctx.modelRegistry.authStorage.get(NATIVE_CURSOR_PROVIDER_ID)),\n\t\trouter: deps.router ?? cursorCliSessionRouter,\n\t\tresolveExecutable: deps.resolveExecutable,\n\t\tprobeVersion: deps.probeVersion,\n\t\tnow: bound.now,\n\t});\n\tbound.generation.runFencedSync(ctx, () => ctx.ui.notify(renderCursorCliStatus(report), \"info\"));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE1F,MAAM,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,YAAY,GAAG,YAAY,CAAA;CAAE,CAAC,CAAC;AAEtH,MAAM,MAAM,wBAAwB,GAAG,eAAe,GAAG;IACxD,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,qBAAqB;aACjC,MAAM,EAAE,0BAA0B;aAClC,OAAO,EAAE,0BAA0B;aACnC,OAAO,EAAE,aAAiB;CACjB,CAAC;AAEX,wBAAgB,eAAe,IAAI,wBAAwB,CAE1D;AAMD,wBAAgB,YAAY,CAAC,UAAU,EAAE,wBAAwB,GAAG,oBAAoB,EAAE,CAEzF;AAID,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMzD;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,oBAAoB,GAAG,wBAAwB,CAUrH;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAS1G;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAGvG;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAQlF;AAED,MAAM,MAAM,sBAAsB,GAAG,CACpC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,KACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnE,wBAAsB,WAAW,CAChC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,sBAAsB,EACjC,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAoBjC"}
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE1F,MAAM,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,YAAY,GAAG,YAAY,CAAA;CAAE,CAAC,CAAC;AAEtH,MAAM,MAAM,wBAAwB,GAAG,eAAe,GAAG;IACxD,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,qBAAqB;aACjC,MAAM,EAAE,0BAA0B;aAClC,OAAO,EAAE,0BAA0B;aACnC,OAAO,EAAE,aAAiB;CACjB,CAAC;AAEX,wBAAgB,eAAe,IAAI,wBAAwB,CAE1D;AAMD,wBAAgB,YAAY,CAAC,UAAU,EAAE,wBAAwB,GAAG,oBAAoB,EAAE,CAEzF;AAID,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMzD;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,oBAAoB,GAAG,wBAAwB,CAUrH;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAS1G;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAGvG;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,wBAAwB,GAAG,IAAI,CAQlF;AAED,MAAM,MAAM,sBAAsB,GAAG,CACpC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,KACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnE,wBAAsB,WAAW,CAChC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,sBAAsB,EACjC,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAoBjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/accounts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/accounts.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Credential, CredentialStore, OAuthCredential } from \"@earendil-works/pi-ai\";\n\nexport type CursorCliAccountSlot = {\n\tname: string;\n\tdisplayName?: string;\n\taccess: string;\n\trefresh: string;\n\texpires: number;\n\tsource: \"login\" | \"import\";\n\tblockedUntil?: number;\n\tblockReason?: \"rate_limit\" | \"auth_error\";\n};\n\nexport type CursorCliSlotState = Record<string, { blockedUntil?: number; blockReason?: \"rate_limit\" | \"auth_error\" }>;\n\nexport type CursorCliOauthCredential = OAuthCredential & {\n\taccounts?: CursorCliAccountSlot[];\n\tpinned?: string;\n\tslotState?: CursorCliSlotState;\n};\n\nexport const SENTINEL_OAUTH_FIELDS = {\n\taccess: \"cursor-cli-oauth-managed\",\n\trefresh: \"cursor-cli-oauth-managed\",\n\texpires: 4_102_444_800_000,\n} as const;\n\nexport function emptyCredential(): CursorCliOauthCredential {\n\treturn { type: \"oauth\", ...SENTINEL_OAUTH_FIELDS, accounts: [] };\n}\n\nfunction storedAccounts(credential: CursorCliOauthCredential): CursorCliAccountSlot[] {\n\treturn credential.accounts ?? [];\n}\n\nexport function listAccounts(credential: CursorCliOauthCredential): CursorCliAccountSlot[] {\n\treturn [...storedAccounts(credential)];\n}\n\nconst ACCOUNT_NAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;\n\nexport function assertValidAccountName(name: string): void {\n\tif (!ACCOUNT_NAME_PATTERN.test(name)) {\n\t\tthrow new Error(\n\t\t\t`Invalid account name '${name}': use letters, digits, '-' or '_', starting with a letter or digit`,\n\t\t);\n\t}\n}\n\nexport function addAccount(credential: CursorCliOauthCredential, slot: CursorCliAccountSlot): CursorCliOauthCredential {\n\tassertValidAccountName(slot.name);\n\tif (storedAccounts(credential).some((existing) => existing.name === slot.name)) {\n\t\tthrow new Error(`Account '${slot.name}' already exists`);\n\t}\n\treturn {\n\t\t...credential,\n\t\t...SENTINEL_OAUTH_FIELDS,\n\t\taccounts: [...storedAccounts(credential), slot],\n\t};\n}\n\nexport function removeAccount(credential: CursorCliOauthCredential, name: string): CursorCliOauthCredential {\n\tconst accounts = storedAccounts(credential).filter((slot) => slot.name !== name);\n\tconst next: CursorCliOauthCredential = {\n\t\t...credential,\n\t\t...SENTINEL_OAUTH_FIELDS,\n\t\taccounts,\n\t};\n\tif (credential.pinned === name) delete next.pinned;\n\treturn next;\n}\n\nexport function pinAccount(credential: CursorCliOauthCredential, name: string): CursorCliOauthCredential {\n\tassertValidAccountName(name);\n\treturn { ...credential, ...SENTINEL_OAUTH_FIELDS, pinned: name };\n}\n\nexport function assertSentinelInvariant(credential: CursorCliOauthCredential): void {\n\tif (\n\t\tcredential.access !== SENTINEL_OAUTH_FIELDS.access ||\n\t\tcredential.refresh !== SENTINEL_OAUTH_FIELDS.refresh ||\n\t\tcredential.expires !== SENTINEL_OAUTH_FIELDS.expires\n\t) {\n\t\tthrow new Error(\"top-level OAuth fields must remain sentinel values\");\n\t}\n}\n\nexport type CursorCliSlotRefresher = (\n\trefreshToken: string,\n\tsignal: AbortSignal,\n) => Promise<{ refresh: string; access: string; expires: number }>;\n\nexport async function refreshSlot(\n\tstore: CredentialStore,\n\tproviderId: string,\n\tslotName: string,\n\trefresher: CursorCliSlotRefresher,\n\tsignal: AbortSignal,\n): Promise<Credential | undefined> {\n\treturn store.modify(providerId, async (current) => {\n\t\tif (current?.type !== \"oauth\") return undefined;\n\t\tconst credential = current as CursorCliOauthCredential;\n\t\tassertSentinelInvariant(credential);\n\t\tconst slot = storedAccounts(credential).find((candidate) => candidate.name === slotName);\n\t\tif (!slot || Date.now() < slot.expires) return current;\n\t\tconst refreshed = await refresher(slot.refresh, signal);\n\t\tconst accounts = storedAccounts(credential).map((candidate) =>\n\t\t\tcandidate.name === slotName\n\t\t\t\t? {\n\t\t\t\t\t\t...candidate,\n\t\t\t\t\t\taccess: refreshed.access,\n\t\t\t\t\t\trefresh: refreshed.refresh,\n\t\t\t\t\t\texpires: refreshed.expires,\n\t\t\t\t\t}\n\t\t\t\t: candidate,\n\t\t);\n\t\treturn { ...credential, ...SENTINEL_OAUTH_FIELDS, accounts };\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/models.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/models.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAU1D,MAAM,MAAM,6BAA6B,GAAG;IAC3C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACvC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,sBAAsB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,6BAA6B,CAAC;IAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACnD,CAAC;AA+DF,eAAO,MAAM,wBAAwB,EAAE,SAAS,mBAAmB,EAA+C,CAAC;AAEnH,wFAAwF;AACxF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAiBpF;AA6ID,0FAA0F;AAC1F,wBAAsB,4BAA4B,CACjD,OAAO,EAAE,mCAAmC,GAC1C,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAkCzC"}
|
|
@@ -3,6 +3,7 @@ import { mkdir, mkdtemp, open, readFile, rename, rm, writeFile } from "node:fs/p
|
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { normalizeCursorCatalog } from "@earendil-works/pi-ai";
|
|
6
|
+
import { resolveCursorContextWindow } from "@earendil-works/pi-ai/utils/cursor-context-limit";
|
|
6
7
|
import { defaultCursorAgentExecutableDeps, resolveCursorAgentExecutable } from "./executable.js";
|
|
7
8
|
const MODEL_PROBE_TIMEOUT_MS = 15_000;
|
|
8
9
|
const DEFAULT_MODEL_CATALOG_TTL_HOURS = 24;
|
|
@@ -38,7 +39,7 @@ function normalizeEntries(raw) {
|
|
|
38
39
|
...(entry.thinkingLevelMap ? { thinkingLevelMap: entry.thinkingLevelMap } : {}),
|
|
39
40
|
input: ["text"],
|
|
40
41
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
41
|
-
contextWindow: entry.window,
|
|
42
|
+
contextWindow: resolveCursorContextWindow(entry.id, entry.window),
|
|
42
43
|
maxTokens: 64_000,
|
|
43
44
|
...(entry.representativeVariantId !== undefined && entry.representativeVariantId !== entry.id
|
|
44
45
|
? { upstreamModelId: entry.representativeVariantId }
|