@code-yeongyu/senpi 2026.9.22-2 → 2026.9.22-3
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 +37 -17
- package/dist/bundle/chunks/{anthropic-messages-2P7APOOQ.js → anthropic-messages-V4CUY3UU.js} +1 -1
- package/dist/bundle/chunks/{app-server-command-PRNA6QQU.js → app-server-command-P5WP2YVC.js} +2 -2
- package/dist/bundle/chunks/azure-openai-responses-SBCCU4KI.js +2 -0
- package/dist/bundle/chunks/chatgpt-subscription.js +75 -0
- package/dist/bundle/chunks/chunk-2VZJTDUX.js +2 -0
- package/dist/bundle/chunks/{chunk-BOZ37BOT.js → chunk-3KLWJIXM.js} +3 -4
- package/dist/bundle/chunks/{chunk-M2HSO7MH.js → chunk-3UO3QYMZ.js} +1 -1
- package/dist/bundle/chunks/{chunk-6OD4TT33.js → chunk-5T3V75HH.js} +113 -111
- package/dist/bundle/chunks/chunk-6KXIFAMC.js +11 -0
- package/dist/bundle/chunks/{chunk-UCPWK6TZ.js → chunk-6MIPLTQG.js} +1 -1
- package/dist/bundle/chunks/{chunk-JZ6YQU3A.js → chunk-7ZPFQY76.js} +3 -3
- package/dist/bundle/chunks/{chunk-MUYK27UR.js → chunk-AEJUOQ7U.js} +1 -1
- package/dist/bundle/chunks/{chunk-F3DXL5MX.js → chunk-AJ722VIQ.js} +1 -1
- package/dist/bundle/chunks/{chunk-VYIJQQ5I.js → chunk-DTD3QN3S.js} +1 -1
- package/dist/bundle/chunks/chunk-DY6FUAWH.js +2 -0
- package/dist/bundle/chunks/{chunk-5XC2FNJ5.js → chunk-GLDP7LH2.js} +1 -1
- package/dist/bundle/chunks/{chunk-OPNVT7BU.js → chunk-KB3DR2ZH.js} +1 -1
- package/dist/bundle/chunks/{chunk-JR4X6ECO.js → chunk-M4NQKQUK.js} +1 -1
- package/dist/bundle/chunks/{chunk-GXUYWMN2.js → chunk-PODQ2IEB.js} +1 -1
- package/dist/bundle/chunks/{chunk-ARJJU3MS.js → chunk-PU7UDZ5F.js} +1 -1
- package/dist/bundle/chunks/{chunk-64JQFFHH.js → chunk-SSJ5OP3B.js} +2 -2
- package/dist/bundle/chunks/{chunk-X63BXA24.js → chunk-TAFYWUE4.js} +1 -1
- package/dist/bundle/chunks/{chunk-KICRBRVS.js → chunk-TU37KLCN.js} +2 -2
- package/dist/bundle/chunks/{chunk-R6LVC7SP.js → chunk-TWTHGDQS.js} +4 -4
- package/dist/bundle/chunks/chunk-WS7QGU5H.js +8 -0
- package/dist/bundle/chunks/{chunk-IPRJIKLL.js → chunk-WSQMYWLV.js} +1 -1
- package/dist/bundle/chunks/chunk-ZBHRTH5C.js +2 -0
- package/dist/bundle/chunks/cli-main-O4CFWDWV.js +3 -0
- package/dist/bundle/chunks/{google-generative-ai-Y2IYMUVC.js → google-generative-ai-UJIX64UU.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-TKBBMPHV.js → google-vertex-KJEY5SZY.js} +1 -1
- package/dist/bundle/chunks/help-fast-path-KFMAFECE.js +2 -0
- package/dist/bundle/chunks/host-command-JEBCPKMK.js +2 -0
- package/dist/bundle/chunks/host-lifecycle-FWIB56UI.js +3 -0
- package/dist/bundle/chunks/host-lifecycle.js +2 -2
- package/dist/bundle/chunks/{interactive-host-runtime-F5L4USLR.js → interactive-host-runtime-HBK4XNHJ.js} +1 -1
- package/dist/bundle/chunks/interactive-mode-WKFWOHXN.js +2 -0
- package/dist/bundle/chunks/{mistral-conversations-ZYDVFRYF.js → mistral-conversations-PNYVN6YU.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-EUTEGVLS.js → multi-session-host-DWBOLTS7.js} +2 -2
- package/dist/bundle/chunks/openai-codex-responses-TBF5EMKG.js +10 -0
- package/dist/bundle/chunks/{openai-completions-4V76L5ZJ.js → openai-completions-IJIBZB2G.js} +1 -1
- package/dist/bundle/chunks/{openai-images-4XAZQLDT.js → openai-images-JA5N5DUU.js} +1 -1
- package/dist/bundle/chunks/openai-responses-3XYO7ROE.js +2 -0
- package/dist/bundle/chunks/{openrouter-images-Z3WQ5BDR.js → openrouter-images-T4GY3JYM.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-JPUWMUEJ.js → package-manager-cli-JUKHAT7U.js} +1 -1
- package/dist/bundle/chunks/{rotation-stream-S56Y7WMM.js → rotation-stream-67OZ4U6R.js} +1 -1
- package/dist/bundle/chunks/rpc-mode-746KEL7Z.js +2 -0
- package/dist/bundle/chunks/{session-picker-PFPJVVIC.js → session-picker-TO42QRV2.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +399 -398
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +10 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -1
- package/dist/core/agent-session.js +8 -8
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-provider-key-migration.d.ts +27 -0
- package/dist/core/auth-provider-key-migration.d.ts.map +1 -0
- package/dist/core/auth-provider-key-migration.js +40 -0
- package/dist/core/auth-provider-key-migration.js.map +1 -0
- package/dist/core/auth-storage.d.ts +26 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +93 -20
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/credential-accounts.d.ts +1 -1
- package/dist/core/credential-accounts.d.ts.map +1 -1
- package/dist/core/credential-accounts.js +8 -5
- package/dist/core/credential-accounts.js.map +1 -1
- package/dist/core/credential-pool/env-slots.d.ts.map +1 -1
- package/dist/core/credential-pool/env-slots.js +5 -2
- package/dist/core/credential-pool/env-slots.js.map +1 -1
- package/dist/core/dynamic-prompt/build.js +1 -1
- package/dist/core/dynamic-prompt/build.js.map +1 -1
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/account-command.d.ts +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/account-command.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/account-command.js +24 -24
- package/dist/core/extensions/builtin/anthropic-subscription/account-command.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/account-events.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/account-events.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/account-management.d.ts +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/account-management.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/account-management.js +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/account-management.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/accounts.d.ts +8 -8
- package/dist/core/extensions/builtin/anthropic-subscription/accounts.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/accounts.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/affinity.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/affinity.js +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/affinity.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/api-id.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/api-id.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/auth-attempt.d.ts +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/auth-attempt.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/auth-attempt.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/auth-environment.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/auth-environment.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/auth-lane.d.ts +5 -5
- package/dist/core/extensions/builtin/anthropic-subscription/auth-lane.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/auth-lane.js +10 -10
- package/dist/core/extensions/builtin/anthropic-subscription/auth-lane.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/availability.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/availability.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/bounded-queue.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/bounded-queue.js +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/bounded-queue.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/config-dir-credentials.d.ts +18 -0
- package/dist/core/extensions/builtin/anthropic-subscription/config-dir-credentials.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/config-dir-credentials.js +81 -0
- package/dist/core/extensions/builtin/anthropic-subscription/config-dir-credentials.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/content-blocks.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/content-blocks.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/custom-tools-schema.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/custom-tools-schema.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/custom-tools.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/custom-tools.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/errors.d.ts +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/errors.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/errors.js +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/errors.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable-path-lookup.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable-path-lookup.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/executable.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/failover.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/failover.js +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/failover.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/guidance.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/guidance.js +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/guidance.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/index.d.ts +11 -0
- package/dist/core/extensions/builtin/anthropic-subscription/index.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/index.js +19 -13
- package/dist/core/extensions/builtin/anthropic-subscription/index.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/oauth-login.d.ts +3 -3
- package/dist/core/extensions/builtin/anthropic-subscription/oauth-login.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/oauth-login.js +3 -3
- package/dist/core/extensions/builtin/anthropic-subscription/oauth-login.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/options.d.ts +18 -0
- package/dist/core/extensions/builtin/anthropic-subscription/options.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/options.js +3 -3
- package/dist/core/extensions/builtin/anthropic-subscription/options.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/prompt-bridge.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/prompt-bridge.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/prompt-directive-dedupe.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/prompt-directive-dedupe.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/refusal.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/refusal.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/sdk-boundary.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/sdk-boundary.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/sdk-boundary.lazy.d.ts +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/sdk-boundary.lazy.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/sdk-boundary.lazy.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-binding-store.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-binding-store.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-binding.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-binding.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-commit-boundary.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-commit-boundary.js +4 -3
- package/dist/core/extensions/builtin/anthropic-subscription/session-commit-boundary.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-continuity.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-continuity.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-entry-annotations.d.ts +3 -3
- package/dist/core/extensions/builtin/anthropic-subscription/session-entry-annotations.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-entry-annotations.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-observability.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-observability.js +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-observability.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-reaper.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-reaper.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-reattach.d.ts +5 -5
- package/dist/core/extensions/builtin/anthropic-subscription/session-reattach.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-reattach.js +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-reattach.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-registry-pump.d.ts +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry-pump.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-registry-pump.js +6 -6
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry-pump.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-registry-state.d.ts +3 -3
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry-state.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry-state.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry-wiring.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-registry-wiring.js +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry-wiring.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-registry.d.ts +12 -12
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-registry.js +4 -4
- package/dist/core/extensions/builtin/anthropic-subscription/session-registry.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-restored-admission.d.ts +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/session-restored-admission.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-restored-admission.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-stream.d.ts +2 -2
- package/dist/core/extensions/builtin/anthropic-subscription/session-stream.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-stream.js +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-stream.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-sync.d.ts +5 -5
- package/dist/core/extensions/builtin/anthropic-subscription/session-sync.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-sync.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-attempt.d.ts +11 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-attempt.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-attempt.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-claim.d.ts +14 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-claim.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-turn-claim.js +1 -1
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-claim.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-types.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/session-turn-types.js.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/settings.d.ts +11 -11
- package/dist/core/extensions/builtin/anthropic-subscription/settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/settings.js +9 -9
- package/dist/core/extensions/builtin/anthropic-subscription/settings.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/stream-events.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/stream-events.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/stream-guidance.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/stream-protocol.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/stream-protocol.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/stream.d.ts +3 -0
- package/dist/core/extensions/builtin/anthropic-subscription/stream.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/stream.js +5 -5
- package/dist/core/extensions/builtin/anthropic-subscription/stream.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/system-prompt.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/system-prompt.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/tool-watch.d.ts.map +1 -0
- package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/tool-watch.js +6 -2
- package/dist/core/extensions/builtin/anthropic-subscription/tool-watch.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/tools.d.ts.map +1 -0
- package/dist/core/extensions/builtin/anthropic-subscription/tools.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/index.js +2 -2
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +5 -5
- package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/lane-policy.js +9 -9
- package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote-model.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote-model.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote-model.js +6 -6
- package/dist/core/extensions/builtin/compaction/openai-remote-model.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative-summary.js +2 -2
- package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js +1 -1
- package/dist/core/extensions/builtin/cursor-cli-oauth/account-command.js.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-account.js +18 -18
- package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
- package/dist/core/extensions/builtin/index.js +2 -2
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/oauth-login-interaction.d.ts +2 -2
- package/dist/core/extensions/builtin/oauth-login-interaction.d.ts.map +1 -1
- package/dist/core/extensions/builtin/oauth-login-interaction.js +1 -1
- package/dist/core/extensions/builtin/oauth-login-interaction.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/file-operations.d.ts +9 -1
- package/dist/core/extensions/builtin/prompt-preset/file-operations.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/file-operations.js +60 -17
- package/dist/core/extensions/builtin/prompt-preset/file-operations.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js +7 -3
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js +7 -3
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js +7 -3
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.js +7 -3
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js +2 -2
- package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js.map +1 -1
- package/dist/core/extensions/builtin/rules/rules/constants.d.ts +1 -1
- package/dist/core/extensions/builtin/rules/rules/constants.js +1 -1
- package/dist/core/extensions/builtin/rules/rules/constants.js.map +1 -1
- package/dist/core/extensions/builtin/service-tier.js +3 -3
- package/dist/core/extensions/builtin/service-tier.js.map +1 -1
- package/dist/core/model-config.d.ts +3 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +26 -3
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +10 -2
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +2 -1
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/retry-fallback/expansion.js +1 -1
- package/dist/core/retry-fallback/expansion.js.map +1 -1
- package/dist/core/retry-fallback/settings.d.ts +1 -1
- package/dist/core/retry-fallback/settings.js +1 -1
- package/dist/core/retry-fallback/settings.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +16 -4
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +5 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +68 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/modes/app-server/server/account.d.ts +1 -1
- package/dist/modes/app-server/server/account.d.ts.map +1 -1
- package/dist/modes/app-server/server/account.js +6 -1
- package/dist/modes/app-server/server/account.js.map +1 -1
- package/dist/modes/app-server/server/server-core.js +1 -1
- package/dist/modes/app-server/server/server-core.js.map +1 -1
- package/dist/modes/interactive/components/progressive-transcript-container.d.ts +12 -0
- package/dist/modes/interactive/components/progressive-transcript-container.d.ts.map +1 -1
- package/dist/modes/interactive/components/progressive-transcript-container.js +17 -2
- package/dist/modes/interactive/components/progressive-transcript-container.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +14 -1
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/connection-handler.js +3 -3
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/host-process-metrics.d.ts.map +1 -1
- package/dist/modes/rpc/host-process-metrics.js +24 -31
- package/dist/modes/rpc/host-process-metrics.js.map +1 -1
- package/dist/modes/rpc/host-process-table.d.ts +36 -0
- package/dist/modes/rpc/host-process-table.d.ts.map +1 -0
- package/dist/modes/rpc/host-process-table.js +162 -0
- package/dist/modes/rpc/host-process-table.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +1 -1
- package/dist/modes/rpc/rpc-client.js +1 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -1
- package/dist/modes/rpc/worker-session-registry.js +30 -0
- package/dist/modes/rpc/worker-session-registry.js.map +1 -1
- package/docs/providers.md +9 -9
- package/docs/release-guide.md +1 -1
- package/docs/rpc.md +4 -4
- package/docs/settings.md +5 -5
- package/docs/usage.md +2 -2
- package/examples/extensions/AGENTS.md +1 -1
- package/examples/extensions/README.md +1 -1
- package/examples/extensions/{openai-codex-usage → chatgpt-subscription-usage}/codex-usage.ts +1 -1
- package/examples/extensions/{openai-codex-usage → chatgpt-subscription-usage}/index.ts +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/README.md +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.d.ts +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses/fallback-state.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +5 -5
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +10 -10
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/{openai-codex.d.ts → chatgpt-subscription.d.ts} +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/chatgpt-subscription.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/{openai-codex.js → chatgpt-subscription.js} +35 -35
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/chatgpt-subscription.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +2 -2
- 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 +4 -3
- 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 +7 -0
- 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 +20 -2
- package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +2 -2
- 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/legacy-provider-ids.d.ts +20 -0
- package/node_modules/@earendil-works/pi-ai/dist/legacy-provider-ids.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/legacy-provider-ids.js +56 -0
- package/node_modules/@earendil-works/pi-ai/dist/legacy-provider-ids.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.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 -2
- package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/chatgpt-subscription.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/chatgpt-subscription.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/chatgpt-subscription.js +22 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/chatgpt-subscription.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/chatgpt-subscription.models.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/chatgpt-subscription.models.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/chatgpt-subscription.models.js +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/chatgpt-subscription.models.js.map +1 -0
- 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/anthropic.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/chatgpt-subscription.json +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +1 -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/{openai-codex-auth.d.ts → chatgpt-subscription-auth.d.ts} +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/chatgpt-subscription-auth.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/{openai-codex-auth.js → chatgpt-subscription-auth.js} +4 -4
- package/node_modules/@earendil-works/pi-ai/dist/utils/chatgpt-subscription-auth.js.map +1 -0
- 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/package.json +1 -1
- package/package.json +7 -7
- package/dist/bundle/chunks/azure-openai-responses-3AH7MJWF.js +0 -2
- package/dist/bundle/chunks/chunk-56TWFZ2C.js +0 -2
- package/dist/bundle/chunks/chunk-JEFYJDHP.js +0 -8
- package/dist/bundle/chunks/chunk-K3HEWWSS.js +0 -2
- package/dist/bundle/chunks/chunk-NK2RNX25.js +0 -11
- package/dist/bundle/chunks/chunk-NMB4C6ZZ.js +0 -2
- package/dist/bundle/chunks/cli-main-AFJNXUSL.js +0 -3
- package/dist/bundle/chunks/help-fast-path-4KYBVD2Z.js +0 -2
- package/dist/bundle/chunks/host-command-OVA6GEWC.js +0 -2
- package/dist/bundle/chunks/host-lifecycle-IDQPLYEA.js +0 -3
- package/dist/bundle/chunks/interactive-mode-UFBSCOP7.js +0 -2
- package/dist/bundle/chunks/openai-codex-responses-MEIUNROM.js +0 -10
- package/dist/bundle/chunks/openai-codex.js +0 -75
- package/dist/bundle/chunks/openai-responses-YR7WRBG3.js +0 -2
- package/dist/bundle/chunks/rpc-mode-JDVHUBZY.js +0 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-events.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-events.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/account-management.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/accounts.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/affinity.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/affinity.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/api-id.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/api-id.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-attempt.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/bounded-queue.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/bounded-queue.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.d.ts +0 -3
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.js +0 -27
- package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/content-blocks.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/content-blocks.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools-schema.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools-schema.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/errors.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/errors.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable-path-lookup.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/executable.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/failover.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/failover.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts +0 -11
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts +0 -18
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-directive-dedupe.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-directive-dedupe.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/refusal.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/refusal.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.lazy.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.lazy.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding-store.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding-store.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-entry-annotations.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-entry-annotations.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reaper.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reaper.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-state.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-restored-admission.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-restored-admission.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts +0 -11
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-claim.d.ts +0 -14
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-claim.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-claim.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-types.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-types.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/settings.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-events.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-events.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts +0 -3
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/system-prompt.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tool-watch.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tool-watch.js.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +0 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.d.ts +0 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.js +0 -22
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.js.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +0 -4
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +0 -6
- package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/openai-codex-auth.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/openai-codex-auth.js.map +0 -1
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/account-events.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/account-events.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/accounts.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/affinity.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/api-id.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/api-id.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/auth-attempt.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/auth-environment.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/auth-environment.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/availability.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/availability.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/bounded-queue.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/content-blocks.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/content-blocks.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/custom-tools-schema.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/custom-tools-schema.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/custom-tools.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/custom-tools.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/executable-path-lookup.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/executable-path-lookup.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/executable.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/executable.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/failover.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/guidance.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/prompt-bridge.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/prompt-bridge.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/prompt-directive-dedupe.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/prompt-directive-dedupe.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/refusal.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/refusal.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/sdk-boundary.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/sdk-boundary.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/sdk-boundary.lazy.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-binding-store.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-binding-store.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-binding.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-binding.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-commit-boundary.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-continuity.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-continuity.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-entry-annotations.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-observability.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-reaper.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-reaper.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-registry-state.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-registry-wiring.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-restored-admission.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-sync.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-turn-attempt.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-turn-types.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/session-turn-types.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/stream-events.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/stream-events.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/stream-guidance.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/stream-guidance.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/stream-protocol.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/stream-protocol.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/system-prompt.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/system-prompt.js +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/tool-watch.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/tools.d.ts +0 -0
- /package/dist/core/extensions/builtin/{claude-sdk-oauth → anthropic-subscription}/tools.js +0 -0
- /package/examples/extensions/{openai-codex-usage → chatgpt-subscription-usage}/README.md +0 -0
package/dist/bundle/chunks/{app-server-command-PRNA6QQU.js → app-server-command-P5WP2YVC.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
-
import{import_websocket_server,wrapper_default}from"./chunk-YBZDAABT.js";import{AuthStorage,DefaultResourceLoader,GOAL_STORE_CHANGED_EVENT,ModelRegistry,clearGoal,createAgentSession,createGoal,createPendingQuestion,defaultModelPerProvider,formatProviderNativeBody,formatProviderNativeSummary,getMcpService,goalStoreRef,loadMcpConfig,loadSkills,readGoal,resolveAuthMode,updateGoal}from"./chunk-
|
|
2
|
+
import{import_websocket_server,wrapper_default}from"./chunk-YBZDAABT.js";import{AuthStorage,DefaultResourceLoader,GOAL_STORE_CHANGED_EVENT,ModelRegistry,clearGoal,createAgentSession,createGoal,createPendingQuestion,defaultModelPerProvider,formatProviderNativeBody,formatProviderNativeSummary,getMcpService,goalStoreRef,loadMcpConfig,loadSkills,readGoal,resolveAuthMode,updateGoal}from"./chunk-5T3V75HH.js";import{require_ignore}from"./chunk-GLDP7LH2.js";import"./chunk-47JGOPLB.js";import"./chunk-OLJ7LQJY.js";import{SessionManager,loadEntriesFromFile}from"./chunk-7ZPFQY76.js";import"./chunk-GFUZPFHN.js";import{getCredentialAccounts,getModels,getProviders,getSupportedThinkingLevels,pinCredentialAccount,removeCredentialAccount,subscribeProviderAccountEvents}from"./chunk-WS7QGU5H.js";import{getAvailableThemesWithPaths,getThemeByName,takeOverStdout,theme,waitForRawStdoutBackpressure,writeRawStdout}from"./chunk-PU7UDZ5F.js";import{x}from"./chunk-7EH64T6E.js";import"./chunk-PODQ2IEB.js";import{SettingsManager}from"./chunk-SSJ5OP3B.js";import"./chunk-YU2P3CAR.js";import"./chunk-BMX2U22F.js";import"./chunk-WSQMYWLV.js";import{acquireOwnershipSafeLock}from"./chunk-6MIPLTQG.js";import"./chunk-HH3KJDWA.js";import{parseDaemonPidFile,processMatchesPidFile,readProcessStartTime,stopValidatedPid,waitForGone,waitForStartTime}from"./chunk-3KLWJIXM.js";import{attachJsonlLineReader}from"./chunk-3UO3QYMZ.js";import"./chunk-FIJJKSPL.js";import"./chunk-H4QOEVS5.js";import"./chunk-HB35RBP4.js";import"./chunk-KB3DR2ZH.js";import"./chunk-ZBHRTH5C.js";import"./chunk-FHXKBENX.js";import"./chunk-X3T45623.js";import"./chunk-7X72IACK.js";import"./chunk-KUPQO7MC.js";import"./chunk-TAFYWUE4.js";import"./chunk-SUQDU5KM.js";import"./chunk-TU37KLCN.js";import"./chunk-26UBFF6N.js";import"./chunk-TWTHGDQS.js";import"./chunk-L6JO4M6J.js";import"./chunk-RFB5CBW7.js";import"./chunk-2VZJTDUX.js";import"./chunk-6KXIFAMC.js";import"./chunk-PRC5XIIH.js";import"./chunk-34HMVB33.js";import"./chunk-ZOFZRJSL.js";import"./chunk-2SOVDETB.js";import{APP_NAME,CONFIG_DIR_NAME,ENV_SESSION_DIR,VERSION,getAgentDir,getSessionsDir,resolvePath}from"./chunk-Y65WFI5H.js";import"./chunk-ATQFN5HI.js";import"./chunk-RBCQOIAD.js";import"./chunk-X4Q5YSTE.js";import"./chunk-IXAUDPOK.js";import"./chunk-VJRKO7IM.js";import"./chunk-WVGCQOLJ.js";import"./chunk-BPX6QWPD.js";import{normalizeProviderId}from"./chunk-DY6FUAWH.js";import"./chunk-WDTJ6JKE.js";import"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import"./chunk-DMI55M2N.js";import"./chunk-BQVVQ2LQ.js";import{__toESM}from"./chunk-IKOFCODM.js";import{isIP}from"node:net";var APP_SERVER_LISTEN_USAGE="Invalid --listen value. Use stdio://, unix://, unix:///abs/path, or ws://IP:PORT.";function formatAppServerUsage(){let listenForms="stdio://|unix://|unix:///abs/path|ws://IP:PORT";return[`Usage: ${APP_NAME} app-server [--listen <${listenForms}>] [--ws-auth <token-file|off>] [--json-logs]`,` ${APP_NAME} app-server daemon <start|stop|status|restart> [--listen <${listenForms}>]`].join(`
|
|
3
3
|
`)}function parseListen(value){if(value==="stdio://")return{kind:"stdio",url:"stdio://"};if(value==="unix://")return{kind:"unix",url:"unix://"};if(value.startsWith("unix:///")){let path=value.slice(7);return path.startsWith("/")?{kind:"unix",url:value,path}:void 0}if(!value.startsWith("ws://"))return;let parsed;try{parsed=new URL(value)}catch(error){if(error instanceof TypeError)return;throw error}let port=Number(parsed.port);if(!(parsed.protocol!=="ws:"||parsed.username!==""||parsed.password!==""||parsed.pathname!=="/"||parsed.search!==""||parsed.hash!==""||parsed.port===""||!Number.isInteger(port)||port<1||port>65535||isIP(parsed.hostname)===0))return{kind:"ws",url:value,host:parsed.hostname,port}}function parseDaemonVerb(value){switch(value){case"start":case"stop":case"status":case"restart":return value;default:return}}function parseWsAuth(value){return value==="off"?{kind:"off"}:{kind:"token-file",path:value}}function parseServerArgs(args){let listen3={kind:"stdio",url:"stdio://"},wsAuth,jsonLogs=!1;for(let index=0;index<args.length;index++){let arg=args[index];if(arg==="--listen"){let value=args[index+1];if(value===void 0)return{kind:"usage-error",message:APP_SERVER_LISTEN_USAGE};let parsed=parseListen(value);if(parsed===void 0)return{kind:"usage-error",message:APP_SERVER_LISTEN_USAGE};listen3=parsed,index++;continue}if(arg==="--ws-auth"){let value=args[index+1];if(value===void 0)return{kind:"usage-error",message:"--ws-auth requires <token-file|off>."};wsAuth=parseWsAuth(value),index++;continue}if(arg==="--json-logs"){jsonLogs=!0;continue}return{kind:"usage-error",message:`Unexpected app-server argument: ${arg}`}}return{kind:"server",listen:listen3,wsAuth,jsonLogs}}function parseDaemonArgs(args){let verb=parseDaemonVerb(args[0]);if(verb===void 0)return{kind:"usage-error",message:"Usage: app-server daemon <start|stop|status|restart>."};let listen3={kind:"ws",url:"ws://127.0.0.1:18800",host:"127.0.0.1",port:18800};for(let index=1;index<args.length;index++){let arg=args[index];if(arg==="--listen"){let value=args[index+1];if(value===void 0)return{kind:"usage-error",message:APP_SERVER_LISTEN_USAGE};let parsed=parseListen(value);if(parsed===void 0)return{kind:"usage-error",message:APP_SERVER_LISTEN_USAGE};listen3=parsed,index++;continue}return{kind:"usage-error",message:`Unexpected app-server daemon argument: ${arg}`}}return{kind:"daemon",verb,listen:listen3}}function parseAppServerCliArgs(args){return args[0]==="daemon"?parseDaemonArgs(args.slice(1)):parseServerArgs(args)}var RpcHandlerError=class extends Error{constructor(error){super(error.message),this.name="RpcHandlerError",this.rpcError=error}};function invalidRequestError(){return{code:-32600,message:"Invalid request"}}function methodNotFoundError(method){return{code:-32601,message:`Method not found: ${method}`}}function invalidParamsError(){return{code:-32602,message:"Invalid params"}}function internalError(message="Internal error"){return{code:-32603,message}}function notInitializedError(){return{code:-32600,message:"Not initialized"}}function alreadyInitializedError(){return{code:-32600,message:"Already initialized"}}function experimentalCapabilityError(method){return{code:-32600,message:`${method} requires experimentalApi capability`}}function registerExtensionRequestMethod(registry,getThread){registry.register("extension_request",{scope:"thread",handler:async({request})=>{let params=request.params;if(typeof params!="object"||params===null||Array.isArray(params))throw new RpcHandlerError({code:-32602,message:"Invalid params"});let threadId=Reflect.get(params,"threadId"),name=Reflect.get(params,"name");if(typeof threadId!="string"||threadId.length===0||typeof name!="string"||name.length===0)throw new RpcHandlerError({code:-32602,message:"Invalid params"});try{return await getThread(threadId).extensionRunner.requestRpc(name,Reflect.get(params,"data"))}catch(error){throw new RpcHandlerError(internalError(error instanceof Error?error.message:String(error)))}}})}function createRegistry(){return new InMemoryMethodRegistry}var InMemoryMethodRegistry=class{constructor(){this.methods=new Map}register(method,registration){this.methods.set(method,registration)}async dispatch(connection,request){if(!connection.initialized){let registration2=this.methods.get(request.method);if(request.method!=="initialize"||registration2?.requiresInit!==!1)return{id:request.id,error:notInitializedError()}}if(connection.initialized&&request.method==="initialize")return{id:request.id,error:alreadyInitializedError()};let registration=this.methods.get(request.method);if(!registration)return{id:request.id,error:methodNotFoundError(request.method)};if(registration.experimental===!0&&connection.capabilities?.experimentalApi!==!0)return{id:request.id,error:experimentalCapabilityError(request.method)};try{let result=await registration.handler({connection,request});return{id:request.id,result}}catch(error){return error instanceof RpcHandlerError?{id:request.id,error:error.rpcError}:{id:request.id,error:internalError(error instanceof Error?error.message:String(error))}}}};function registerFuzzyFileSearchMethods(registry,service){registry.register("fuzzyFileSearch",{scope:"global",handler:({request})=>service.search(parseOneShotParams(request.params))}),registry.register("fuzzyFileSearch/sessionStart",{experimental:!0,scope:"global",handler:({request})=>service.startSession(parseSessionStartParams(request.params))}),registry.register("fuzzyFileSearch/sessionUpdate",{experimental:!0,scope:"global",handler:({request})=>service.updateSession(parseSessionUpdateParams(request.params))}),registry.register("fuzzyFileSearch/sessionStop",{experimental:!0,scope:"global",handler:({request})=>service.stopSession(parseSessionStopParams(request.params))})}function parseOneShotParams(value){let params=objectParams(value,"fuzzyFileSearch");return{query:requiredString(params.query,"fuzzyFileSearch query"),roots:requiredStringArray(params.roots,"fuzzyFileSearch roots"),cancellationToken:optionalString(params.cancellationToken,"fuzzyFileSearch cancellationToken")}}function parseSessionStartParams(value){let params=objectParams(value,"fuzzyFileSearch/sessionStart");return{sessionId:requiredString(params.sessionId,"fuzzyFileSearch/sessionStart sessionId"),roots:requiredStringArray(params.roots,"fuzzyFileSearch/sessionStart roots")}}function parseSessionUpdateParams(value){let params=objectParams(value,"fuzzyFileSearch/sessionUpdate");return{sessionId:requiredString(params.sessionId,"fuzzyFileSearch/sessionUpdate sessionId"),query:requiredString(params.query,"fuzzyFileSearch/sessionUpdate query")}}function parseSessionStopParams(value){let params=objectParams(value,"fuzzyFileSearch/sessionStop");return{sessionId:requiredString(params.sessionId,"fuzzyFileSearch/sessionStop sessionId")}}function objectParams(value,method){if(!isRecord(value))throw invalidRequest(`${method} params must be an object`);return value}function requiredString(value,field){if(typeof value!="string")throw invalidRequest(`${field} must be a string`);return value}function requiredStringArray(value,field){if(!Array.isArray(value)||value.some(entry=>typeof entry!="string"))throw invalidRequest(`${field} must be an array of strings`);return value}function optionalString(value,field){if(value==null)return null;if(typeof value!="string")throw invalidRequest(`${field} must be a string or null`);return value}function invalidRequest(message){return new RpcHandlerError({code:-32600,message})}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}import{lstat,readdir}from"node:fs/promises";import{basename,join as join2,relative as relative2,resolve,sep as sep2}from"node:path";var import_ignore=__toESM(require_ignore(),1);import{readFile}from"node:fs/promises";import{join,relative,sep}from"node:path";async function addGitignoreScope(matchers,directory){let gitignore=await readableText(join(directory,".gitignore"));return gitignore===void 0?matchers:[...matchers,{directory,matcher:(0,import_ignore.default)().add(gitignore)}]}function isIgnored(matchers,path,isDirectory){let ignored=!1;for(let scope of matchers){let relativePath=relative(scope.directory,path).split(sep).join("/"),result=scope.matcher.test(isDirectory?`${relativePath}/`:relativePath);result.ignored&&(ignored=!0),result.unignored&&(ignored=!1)}return ignored}async function readableText(path){try{return await readFile(path,"utf8")}catch(error){if(error instanceof Error)return;throw error}}var FUZZY_SEARCH_MAX_DEPTH=12,FUZZY_SEARCH_MAX_VISITED_ENTRIES=5e4,FUZZY_SEARCH_RESULT_LIMIT=50,FILENAME_MATCH_BONUS=1e6,CHARACTER_MATCH_SCORE=10,CONTIGUOUS_MATCH_BONUS=20,BOUNDARY_MATCH_BONUS=5,CANCELLATION_YIELD_INTERVAL=256;async function collectFuzzyFileEntries(roots,options={}){let entries=[],state={visitedEntries:0,stopped:!1},maxDepth=options.maxDepth??FUZZY_SEARCH_MAX_DEPTH,maxVisitedEntries=options.maxVisitedEntries??FUZZY_SEARCH_MAX_VISITED_ENTRIES;for(let root of roots){if(options.signal?.aborted||state.stopped)break;let absoluteRoot=resolve(root),rootStat=await readableStat(absoluteRoot);!rootStat?.isDirectory()||rootStat.isSymbolicLink()||await walkDirectory({wireRoot:root,absoluteRoot,absoluteDirectory:absoluteRoot,depth:0,matchers:[],entries,state,signal:options.signal,maxDepth,maxVisitedEntries})}return entries}function rankFuzzyFileEntries(query,entries){if(query.length===0)return[];let results=[];for(let entry of entries){let filenameMatch=scoreSubsequence(entry.fileName,query),pathMatch=filenameMatch??scoreSubsequence(entry.path,query);if(!pathMatch)continue;let filenameOffset=Array.from(entry.path).length-Array.from(entry.fileName).length,indices=filenameMatch?filenameMatch.indices.map(index=>index+filenameOffset):pathMatch.indices;results.push({root:entry.root,path:entry.path,match_type:entry.matchType,file_name:entry.fileName,score:pathMatch.score+(filenameMatch?FILENAME_MATCH_BONUS:0),indices})}return results.sort(compareResults),results.slice(0,FUZZY_SEARCH_RESULT_LIMIT)}async function walkDirectory(input){let matchers=await addGitignoreScope(input.matchers,input.absoluteDirectory),directoryEntries=await readableDirectory(input.absoluteDirectory);directoryEntries.sort((left,right)=>compareText(left.name,right.name));for(let directoryEntry of directoryEntries){if(input.signal?.aborted||input.state.stopped)return;if(input.state.visitedEntries>=input.maxVisitedEntries){input.state.stopped=!0;return}if(input.state.visitedEntries+=1,directoryEntry.name===".git"||directoryEntry.name==="node_modules"||directoryEntry.isSymbolicLink())continue;let isDirectory=directoryEntry.isDirectory();if(!isDirectory&&!directoryEntry.isFile())continue;let absolutePath=join2(input.absoluteDirectory,directoryEntry.name),relativePath=toPosixPath(relative2(input.absoluteRoot,absolutePath));if(isIgnored(matchers,absolutePath,isDirectory))continue;input.entries.push({root:input.wireRoot,path:relativePath,matchType:isDirectory?"directory":"file",fileName:basename(relativePath)});let entryDepth=input.depth+1;isDirectory&&entryDepth<input.maxDepth&&await walkDirectory({...input,absoluteDirectory:absolutePath,depth:entryDepth,matchers}),input.state.visitedEntries%CANCELLATION_YIELD_INTERVAL===0&&await yieldToEventLoop()}}function scoreSubsequence(candidate,query){let normalizedCandidate=normalizeText(candidate),normalizedQuery=query.toLowerCase(),contiguousStart=normalizedCandidate.value.indexOf(normalizedQuery),normalizedIndices=[];if(contiguousStart>=0){let cursor=contiguousStart;for(let character of normalizedQuery)normalizedIndices.push(cursor),cursor+=character.length}else{let cursor=0;for(let character of normalizedQuery){let matchIndex=normalizedCandidate.value.indexOf(character,cursor);if(matchIndex<0)return;normalizedIndices.push(matchIndex),cursor=matchIndex+character.length}}let indices=[];for(let normalizedIndex of normalizedIndices){let sourceIndex=normalizedCandidate.sourceIndices[normalizedIndex];if(sourceIndex===void 0)return;indices.at(-1)!==sourceIndex&&indices.push(sourceIndex)}let candidateCharacters=Array.from(candidate),score=indices.length*CHARACTER_MATCH_SCORE;for(let index=0;index<indices.length;index++){let current=indices[index];if(current===void 0)continue;let previous=indices[index-1];previous!==void 0&¤t===previous+1&&(score+=CONTIGUOUS_MATCH_BONUS),(current===0||isBoundary(candidateCharacters[current-1]))&&(score+=BOUNDARY_MATCH_BONUS)}return{score,indices}}function normalizeText(value){let sourceIndices=[];for(let[sourceIndex,character]of Array.from(value).entries())for(let index=0;index<character.toLowerCase().length;index++)sourceIndices.push(sourceIndex);return{value:value.toLowerCase(),sourceIndices}}function compareResults(left,right){return left.score!==right.score?right.score-left.score:compareText(left.path,right.path)}function compareText(left,right){return left<right?-1:left>right?1:0}function isBoundary(character){return character==="/"||character==="-"||character==="_"||character==="."||character===" "}async function readableDirectory(path){try{return await readdir(path,{withFileTypes:!0})}catch(error){if(error instanceof Error)return[];throw error}}async function readableStat(path){try{return await lstat(path)}catch(error){if(error instanceof Error)return;throw error}}function toPosixPath(path){return path.split(sep2).join("/")}function yieldToEventLoop(){return new Promise(resolve4=>setImmediate(resolve4))}var FuzzyFileSearchService=class{constructor(options){this.activeSearches=new Set,this.pendingSearches=new Map,this.sessions=new Map,this.disposed=!1,this.broadcast=options.broadcast,this.collectEntries=options.collectEntries??((roots,signal)=>collectFuzzyFileEntries(roots,{signal})),this.rankEntries=options.rankEntries??rankFuzzyFileEntries}async search(params){if(this.disposed)return{files:[]};let controller=new AbortController;this.activeSearches.add(controller);let token=params.cancellationToken;token!==null&&(this.pendingSearches.get(token)?.abort(),this.pendingSearches.set(token,controller));try{if(params.query.length===0)return{files:[]};let entries=await this.collectEntries(params.roots,controller.signal);return controller.signal.aborted||this.disposed?{files:[]}:{files:this.rankEntries(params.query,entries)}}finally{this.activeSearches.delete(controller),token!==null&&this.pendingSearches.get(token)===controller&&this.pendingSearches.delete(token)}}startSession(params){if(params.sessionId.length===0)throw invalidRequest2("sessionId must not be empty");this.cancelSession(params.sessionId);let session={id:params.sessionId,roots:params.roots,controller:new AbortController,query:"",version:0,entries:void 0,active:!this.disposed,completedVersion:void 0};return this.sessions.set(session.id,session),this.runTraversal(session),{}}updateSession(params){let session=this.sessions.get(params.sessionId);if(!session?.active)throw invalidRequest2(`fuzzy file search session not found: ${params.sessionId}`);return session.query=params.query,session.version+=1,session.entries!==void 0&&this.emitVersion(session,session.version),{}}stopSession(params){return this.cancelSession(params.sessionId),{}}dispose(){if(!this.disposed){this.disposed=!0;for(let controller of this.activeSearches)controller.abort();this.activeSearches.clear(),this.pendingSearches.clear();for(let session of this.sessions.values())this.deactivate(session);this.sessions.clear()}}async runTraversal(session){let entries;try{entries=await this.collectEntries(session.roots,session.controller.signal)}catch(error){if(!(error instanceof Error))throw error;entries=[]}if(this.isLive(session))for(session.entries=entries;this.isLive(session);){let version=session.version;if(await this.emitVersion(session,version))break}}async emitVersion(session,version){if(await Promise.resolve(),!this.isLive(session)||session.version!==version||session.entries===void 0)return!1;if(session.completedVersion===version)return!0;let query=session.query,files=query.length===0?[]:this.rankEntries(query,session.entries);return!this.isLive(session)||session.version!==version||(this.broadcast({method:"fuzzyFileSearch/sessionUpdated",params:{sessionId:session.id,query,files}}),!this.isLive(session)||session.version!==version)?!1:(session.completedVersion=version,this.broadcast({method:"fuzzyFileSearch/sessionCompleted",params:{sessionId:session.id}}),!0)}cancelSession(sessionId){let session=this.sessions.get(sessionId);session&&(this.deactivate(session),this.sessions.get(sessionId)===session&&this.sessions.delete(sessionId))}deactivate(session){session.active=!1,session.controller.abort()}isLive(session){return!this.disposed&&session.active&&this.sessions.get(session.id)===session}};function invalidRequest2(message){return new RpcHandlerError({code:-32600,message})}var APPROVAL_DECISIONS=["accept","acceptForSession","decline","cancel"],PERMISSION_OPTIONS=["Allow once","Allow always","Deny","Deny with feedback"],CANCEL_REASON="approval request was cancelled because the turn ended",NO_SUBSCRIBER_REASON="no client connected to approve";var ApprovalBridge=class{constructor(sendToThreadSubscribers){this.nextServerRequestId=0,this.pending=new Map,this.sessionAllows=new Set,this.sendToThreadSubscribers=sendToThreadSubscribers}get pendingCount(){return this.pending.size}requestApproval(threadId,kind,payload){let allowKey=createAllowKey(threadId,kind,payload);if(allowKey&&this.sessionAllows.has(allowKey))return Promise.resolve({allow:!0,decision:"acceptForSession"});let requestId=this.nextServerRequestId;this.nextServerRequestId+=1;let request=buildApprovalRequest(threadId,requestId,kind,payload);return new Promise(resolve4=>{this.pending.set(requestId,{threadId,request,allowKey,resolve:resolve4}),!(this.sendToThreadSubscribers(threadId,request)>0)&&(this.pending.delete(requestId),resolve4({allow:!1,decision:"decline",reason:NO_SUBSCRIBER_REASON}))})}resolveResponse(response){let pending=this.pending.get(response.id);if(!pending)return!1;let decision=readDecision(response);return this.pending.delete(response.id),decision==="acceptForSession"&&pending.allowKey&&this.sessionAllows.add(pending.allowKey),this.emitResolved(pending.threadId,response.id),pending.resolve(decisionToOutcome(decision,readReason(response))),!0}replayPendingForThread(threadId){let replayed=0;for(let pending of this.pending.values())pending.threadId===threadId&&(this.sendToThreadSubscribers(threadId,pending.request),replayed+=1);return replayed}cancelPendingForThread(threadId){let cancelled=0;for(let[requestId,pending]of Array.from(this.pending.entries()))pending.threadId===threadId&&(this.pending.delete(requestId),this.emitResolved(threadId,requestId),pending.resolve({allow:!1,decision:"cancel",reason:CANCEL_REASON}),cancelled+=1);return cancelled}emitResolved(threadId,requestId){this.sendToThreadSubscribers(threadId,{method:"serverRequest/resolved",params:{threadId,requestId}})}};function buildApprovalRequest(threadId,requestId,kind,payload){let base={threadId,turnId:payload.turnId??"turn-approval",itemId:payload.itemId??(kind==="commandExecution"?"approval-command":"approval-file-change"),startedAtMs:Date.now()};return kind==="fileChange"?{id:requestId,method:"item/fileChange/requestApproval",params:{...base,reason:payload.reason??null,grantRoot:payload.grantRoot??null}}:{id:requestId,method:"item/commandExecution/requestApproval",params:{...base,approvalId:payload.approvalId??null,environmentId:payload.environmentId??null,reason:payload.reason??null,command:payload.command??null,cwd:payload.cwd??null,availableDecisions:[...APPROVAL_DECISIONS]}}}function decisionToOutcome(decision,reason){return decision==="accept"||decision==="acceptForSession"?{allow:!0,decision}:reason?{allow:!1,decision,reason}:{allow:!1,decision}}function readDecision(response){let decision=isRecord2(response.result)?response.result.decision:void 0;return isApprovalDecision(decision)?decision:"cancel"}function readReason(response){let resultReason=isRecord2(response.result)?response.result.reason??response.result.message:void 0,errorReason=isRecord2(response.error)?response.error.message:void 0,reason=typeof resultReason=="string"?resultReason:errorReason;return typeof reason=="string"&&reason.length>0?reason:void 0}function createAllowKey(threadId,kind,payload){if(!(!payload.toolName||typeof payload.command!="string"))return`${threadId}\0${kind}\0${payload.toolName}\0${payload.command}`}function isApprovalDecision(value){return value==="accept"||value==="acceptForSession"||value==="decline"||value==="cancel"}function isRecord2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function createAppServerUIContext(bridge,threadId,userInput,getTurnId=()=>"turn-user-input"){let pendingInput,editorText="",editorFactory,toolsExpanded=!1;return{question(request,opts){return userInput?.requestUserInput(threadId,getTurnId(),request.requestId,request,opts)??Promise.resolve({status:"unavailable",answers:{},unanswered:request.questions.map(question=>question.id)})},async select(title,options){let prompt=parsePermissionPrompt(title);if(!prompt||!isPermissionOptions(options))return;let outcome=await bridge.requestApproval(threadId,prompt.kind,{turnId:"turn-approval",itemId:`approval-${prompt.toolName}`,toolName:prompt.toolName,command:prompt.command,reason:prompt.reason});return outcome.decision==="accept"?"Allow once":outcome.decision==="acceptForSession"?"Allow always":outcome.reason&&outcome.reason!==NO_SUBSCRIBER_REASON&&outcome.reason!==CANCEL_REASON?(pendingInput=outcome.reason,"Deny with feedback"):"Deny"},async confirm(title,message){return(await bridge.requestApproval(threadId,"commandExecution",{turnId:"turn-approval",itemId:"approval-confirm",toolName:"confirm",command:title,reason:message})).allow},async input(){let value=pendingInput;return pendingInput=void 0,value},notify(){},onTerminalInput(){return()=>{}},setStatus(){},setWorkingMessage(){},setWorkingVisible(){},setWorkingIndicator(){},setHiddenThinkingLabel(){},setWidget(){},setFooter(){},setHeader(){},setTitle(){},custom(){return Promise.reject(new Error("Custom UI is not available in app-server mode."))},pasteToEditor(text){editorText=text},setEditorText(text){editorText=text},getEditorText(){return editorText},async editor(_title,prefill){return prefill},addAutocompleteProvider(){},setEditorComponent(factory){editorFactory=factory},getEditorComponent(){return editorFactory},theme,getAllThemes:getAvailableThemesWithPaths,getTheme(name){return getThemeByName(name)},setTheme(_nextTheme){return{success:!1,error:"Theme switching is not available in app-server mode."}},getToolsExpanded(){return toolsExpanded},setToolsExpanded(expanded){toolsExpanded=expanded}}}function parsePermissionPrompt(title){let[firstLine="",...rest]=title.split(`
|
|
4
4
|
`),prefix="Permission required: ";if(!firstLine.startsWith(prefix))return;let toolName=firstLine.slice(prefix.length).trim(),reason=rest.join(`
|
|
5
5
|
`).trim();return{kind:permissionKind(toolName),toolName,command:readLineValue(reason,"Command: $ ")??readLineValue(reason,"File: ")??readLineValue(reason,"Path: ")??null,reason}}function permissionKind(toolName){return toolName==="edit"||toolName==="write"||toolName==="apply_patch"||toolName==="multiedit"?"fileChange":"commandExecution"}function readLineValue(text,prefix){return text.split(`
|
|
@@ -12,7 +12,7 @@ import{import_websocket_server,wrapper_default}from"./chunk-YBZDAABT.js";import{
|
|
|
12
12
|
`)?"add":"update"),kind=patchChangeKind(operation,null);return[{path,kind,diff:patch}]}function changesFromPreview(value){return!isRecord9(value)||!Array.isArray(value.files)?[]:value.files.flatMap(file=>{if(!isRecord9(file))return[];let path=readString(file.filePath),operation=readOperation(file.operation),kind=operation?patchChangeKind(operation,readString(file.movePath)??null):void 0,diff=normalizedPatch(file.patch);return path&&kind&&diff?[{path,kind,diff}]:[]})}function normalizedPatch(value){let patch=readString(value);if(patch)return patch.endsWith(`
|
|
13
13
|
`)?patch:`${patch}
|
|
14
14
|
`}function readOperation(value){switch(value){case"add":case"delete":case"update":return value;default:return}}function patchChangeKind(operation,movePath){switch(operation){case"add":return{type:"add"};case"delete":return{type:"delete"};case"update":return{type:"update",move_path:movePath};default:return operation}}function readString(value){return typeof value=="string"&&value.length>0?value:void 0}function isRecord9(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function webSearchItem(id,content){let action=readAction(content);return{type:"webSearch",id,query:actionDetail(action),action,results:readResults(content)}}function readResults(content){return!isRecord10(content.raw)||!Array.isArray(content.raw.results)?null:content.raw.results}function readAction(content){if(!isRecord10(content.raw))return{type:"other"};let rawAction=content.raw.action;if(!isRecord10(rawAction))return{type:"other"};let type2=readString2(rawAction.type);switch(type2){case"search":return{type:type2,query:readNullableString(rawAction.query),queries:readNullableStrings(rawAction.queries)};case"open_page":case"openPage":return{type:"openPage",url:readNullableString(rawAction.url)};case"find_in_page":case"findInPage":return{type:"findInPage",url:readNullableString(rawAction.url),pattern:readNullableString(rawAction.pattern)};default:return{type:"other"}}}function actionDetail(action){switch(action.type){case"search":{if(action.query)return action.query;let first=action.queries?.[0]??"";return action.queries&&action.queries.length>1&&first?`${first} ...`:first}case"openPage":return action.url??"";case"findInPage":return action.pattern&&action.url?`'${action.pattern}' in ${action.url}`:action.pattern?`'${action.pattern}'`:action.url??"";case"other":return"";default:return assertNeverAction(action)}}function readNullableString(value){return typeof value=="string"?value:null}function readNullableStrings(value){return Array.isArray(value)&&value.every(entry=>typeof entry=="string")?value:null}function readString2(value){return typeof value=="string"?value:void 0}function isRecord10(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function assertNeverAction(value){throw new Error(`Unhandled web search action: ${String(value)}`)}var MAX_TOOL_OUTPUT_BYTES=256*1024,MCP_TOOL_NAME_PATTERN=/^[^_]+__/;function classifyTool(name){return name==="bash"?"commandExecution":name==="edit"||name==="write"||name==="apply_patch"?"fileChange":MCP_TOOL_NAME_PATTERN.test(name)?"mcpToolCall":"dynamicToolCall"}function remainingCommandOutputBytes(output){return MAX_TOOL_OUTPUT_BYTES-byteLength(output)}function capCommandOutput(value,maxBytes=MAX_TOOL_OUTPUT_BYTES){return capUtf8(value,maxBytes)}function extractToolText(result){if(!isRecord11(result))return"";let content=result.content;return Array.isArray(content)?content.map(item=>isRecord11(item)&&item.type==="text"?readString3(item,"text")??"":"").join(""):readString3(result,"text")??""}function commandExecutionItem(tool,status,cwd,result){return{type:"commandExecution",id:tool.id,command:commandFromArgs(tool.args),cwd,processId:null,source:"agent",status,commandActions:[],aggregatedOutput:tool.output||null,exitCode:status==="inProgress"?null:exitCodeFromResult(result),durationMs:null}}function mcpToolCallItem(tool,status,result){let[server,toolName]=splitMcpName(tool.name);return{type:"mcpToolCall",id:tool.id,server,tool:toolName,status,arguments:toJsonValue2(tool.args),appContext:null,pluginId:null,result:status==="completed"?{content:toolResultContent(result),structuredContent:null,_meta:null}:null,error:status==="failed"?{message:extractToolText(result)||"Tool execution failed"}:null,durationMs:null}}function dynamicToolCallItem(tool,status,result,isError){return{type:"dynamicToolCall",id:tool.id,namespace:null,tool:tool.name,arguments:toJsonValue2(tool.args),status,contentItems:status==="inProgress"?null:[{type:"inputText",text:extractToolText(result)}],success:status==="inProgress"?null:!isError,durationMs:null}}function toolWireProjection(input){switch(input.tool.itemType){case"commandExecution":return{item:commandExecutionItem(input.tool,input.status,input.cwd,input.result),diff:""};case"fileChange":return fileChangeProjection({id:input.tool.id,name:input.tool.name,args:input.tool.args,status:input.status,result:input.result});case"mcpToolCall":return{item:mcpToolCallItem(input.tool,input.status,input.result),diff:""};case"dynamicToolCall":return{item:dynamicToolCallItem(input.tool,input.status,input.result,input.isError),diff:""};default:return assertNeverToolItem(input.tool.itemType)}}function providerNativeItem(id,message,content){if(content.subtype==="web_search_call")return webSearchItem(id,content);let summary=formatProviderNativeSummary(message,content,!0),body=formatProviderNativeBody(content,!0);return{type:"webSearch",id,query:body?`${summary}
|
|
15
|
-
${body}`:summary,action:null,results:null}}function buildWireItem(item){return{...item}}function commandFromArgs(args){return isRecord11(args)?readString3(args,"command")??readString3(args,"cmd")??stringifyJson(toJsonValue2(args)):""}function splitMcpName(name){let marker=name.indexOf("__");return marker===-1?["",name]:[name.slice(0,marker),name.slice(marker+2)]}function exitCodeFromResult(result){if(!isRecord11(result))return null;let details=isRecord11(result.details)?result.details:void 0,value=details?details.exitCode??details.code:void 0;return typeof value=="number"?value:null}function toolResultContent(result){return!isRecord11(result)||!Array.isArray(result.content)?[]:result.content.map(toJsonValue2)}function capUtf8(value,maxBytes){if(maxBytes<=0)return"";let used=0,result="";for(let char of value){let size=byteLength(char);if(used+size>maxBytes)break;used+=size,result+=char}return result}function byteLength(value){return new TextEncoder().encode(value).byteLength}function isRecord11(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function readString3(record,key){let value=record[key];return typeof value=="string"?value:void 0}function toJsonValue2(value){return value===null||typeof value=="boolean"||typeof value=="number"||typeof value=="string"?value:Array.isArray(value)?value.map(toJsonValue2):isRecord11(value)?Object.fromEntries(Object.entries(value).map(([key,entry])=>[key,toJsonValue2(entry)])):null}function stringifyJson(value){return JSON.stringify(value)??""}function assertNeverToolItem(value){throw new Error(`Unhandled tool item type: ${String(value)}`)}var EventProjector=class{constructor(options){this.toolItems=new Map,this.completedItemIds=new Set,this.turnDiff=new TurnDiffTracker,this.messageCounter=0,this.finalized=!1,this.options=options,this.messageItems=new MessageItemProjector({itemId:contentIndex=>this.itemId(contentIndex),started:item=>this.started(item),completed:item=>this.completed(item),notification:(method,params)=>this.notification(method,params)})}project(event){if(this.finalized)return emptyResult();switch(event.type){case"message_start":return event.message.role==="assistant"&&(this.activeMessageId=messageIdFromMessage(event.message)??this.nextMessageId()),emptyResult();case"message_update":return event.message.role!=="assistant"?emptyResult():(this.activeMessageId=messageIdFromMessage(event.message)??this.activeMessageId??this.nextMessageId(),this.projectAssistantEvent(event.assistantMessageEvent));case"message_end":return event.message.role!=="assistant"?emptyResult():(this.activeMessageId=messageIdFromMessage(event.message)??this.activeMessageId??this.nextMessageId(),{notifications:[...this.messageItems.completeDanglingText(event.message),...this.projectProviderNative(event.message)]});case"tool_execution_start":return this.rememberTool(event.toolCallId,event.toolName,event.args),emptyResult();case"tool_execution_update":return{notifications:this.projectToolUpdate(event.toolCallId,event.partialResult)};case"tool_execution_end":return{notifications:this.completeTool(event.toolCallId,event.isError,event.result)};case"compaction_start":return{notifications:this.startCompaction()};case"compaction_end":return{notifications:this.completeCompaction()};default:return emptyResult()}}projectAssistantEvent(event){switch(event.type){case"start":case"toolcall_delta":return emptyResult();case"text_start":return{notifications:this.messageItems.startText(event.contentIndex)};case"text_delta":return{notifications:this.messageItems.deltaText(event.contentIndex,event.delta)};case"text_end":return{notifications:this.messageItems.completeText(event.contentIndex,event.content)};case"thinking_start":return{notifications:this.messageItems.startReasoning(event.contentIndex)};case"thinking_delta":return{notifications:this.messageItems.deltaReasoning(event.contentIndex,event.delta)};case"thinking_end":return{notifications:this.messageItems.completeReasoning(event.contentIndex,event.content)};case"toolcall_start":return emptyResult();case"toolcall_end":return{notifications:this.startTool(event.toolCall)};case"done":return{notifications:this.messageItems.closeDanglingItems(),turnCompletion:{status:"completed"}};case"error":return{notifications:[],turnCompletion:{status:event.reason==="aborted"?"interrupted":"failed",errorMessage:event.error.errorMessage}};default:return assertNeverProjection(event)}}finalize(){return this.finalized?[]:(this.finalized=!0,this.closeDanglingItems())}nextMessageId(){return this.messageCounter+=1,`message-${this.messageCounter}`}itemId(contentIndex){return`${this.activeMessageId??this.nextMessageId()}:${contentIndex}`}startTool(toolCall){let itemType=classifyTool(toolCall.name),active={id:toolCall.id,name:toolCall.name,itemType,args:toolCall.arguments,output:"",completed:!1};return this.toolItems.set(toolCall.id,active),[this.started(this.projectToolItem(active,!1).item)]}rememberTool(toolCallId,toolName,args){this.toolItems.has(toolCallId)||this.toolItems.set(toolCallId,{id:toolCallId,name:toolName,itemType:classifyTool(toolName),args,output:"",completed:!1})}projectToolUpdate(toolCallId,partialResult){let tool=this.toolItems.get(toolCallId);if(tool?.itemType!=="commandExecution")return[];let delta=capCommandOutput(extractToolText(partialResult),remainingCommandOutputBytes(tool.output));return delta?(tool.output+=delta,[this.notification("item/commandExecution/outputDelta",{itemId:tool.id,delta})]):[]}completeTool(toolCallId,isError,result){let tool=this.toolItems.get(toolCallId);if(!tool||tool.completed)return[];tool.completed=!0;let resultText=extractToolText(result);tool.itemType==="commandExecution"&&resultText&&(tool.output=capCommandOutput(resultText));let projection=this.projectToolItem(tool,!0,isError,result),cumulativeDiff=this.turnDiff.update(tool.id,projection.diff,this.toolItems.keys());return[this.completed(projection.item),...cumulativeDiff===void 0?[]:[this.notification("turn/diff/updated",{diff:cumulativeDiff})]]}projectToolItem(tool,completed,isError=!1,result){return toolWireProjection({tool,status:completed?isError?"failed":"completed":"inProgress",cwd:this.options.cwd??process.cwd(),result,isError})}projectProviderNative(message){return message.content.flatMap((content,contentIndex)=>{if(content.type!=="providerNative")return[];let id=`${this.activeMessageId??this.nextMessageId()}:providerNative:${contentIndex}`,item=providerNativeItem(id,message,content);return[this.started(item),this.completed(item)]})}closeDanglingItems(){return[...this.messageItems.closeDanglingItems(),...Array.from(this.toolItems.values()).flatMap(tool=>tool.completed?[]:this.completeTool(tool.id,!1,void 0))]}startCompaction(){return this.compactionItemId=`context-compaction:${this.messageCounter+1}`,[this.started({type:"contextCompaction",id:this.compactionItemId})]}completeCompaction(){let id=this.compactionItemId??`context-compaction:${this.messageCounter+1}`;return this.compactionItemId=void 0,[this.completed({type:"contextCompaction",id})]}started(item){return this.notification("item/started",{item:buildWireItem(item),startedAtMs:this.nowMs()})}completed(item){let wireItem=buildWireItem(item);return this.completedItemIds.has(String(wireItem.id))||(this.completedItemIds.add(String(wireItem.id)),this.options.turnLog?.appendItem(this.options.threadId,this.options.turnId,wireItem)),this.notification("item/completed",{item:wireItem,completedAtMs:this.nowMs()})}notification(method,params){return{method,params:{threadId:this.options.threadId,turnId:this.options.turnId,...params}}}nowMs(){return this.options.nowMs?.()??Date.now()}};function emitTurnTerminalNotifications(threadId,turn,emitToThread){turn.status==="failed"&&turn.error!==null&&emitToThread(threadId,{method:"error",params:{threadId,turnId:turn.id,error:turn.error,willRetry:!1}}),emitToThread(threadId,{method:"turn/completed",params:{threadId,turn}})}function createTurnEngine(options){return new TurnEngine(options)}var TurnEngine=class{constructor(options){this.pendingByThreadId=new Map,this.subscribedThreadIds=new Set,this.projectorByThreadId=new Map,this.store=options.store,this.turnLog=options.turnLog,this.emitToThread=options.emitToThread,this.broadcast=options.broadcast}observeThread(threadId){this.ensureSessionSubscription(threadId,this.getLoadedThreadOrThrow(threadId))}startTurn(params,deferNotifications){this.getLoadedThreadOrThrow(params.threadId);let didSettle=!1;return new Promise((resolve4,reject)=>{this.store.runThreadTask(params.threadId,async()=>{try{let parsedInput=parseInput(params.input),entry=this.getLoadedThreadOrThrow(params.threadId);this.observeThread(params.threadId);let turnId=createTurnId(),startedAtMs=Date.now(),startedAt=new Date(startedAtMs).toISOString(),turn=buildTurn(turnId,"inProgress",startedAtMs,null,[]),userMessage=buildUserMessage(params.clientUserMessageId??null,parsedInput.content);entry.activeTurn={turnId,startedAt},entry.status="active",entry.updatedAt=startedAt,this.turnLog.recordTurn(params.threadId,{turnId,startedAt,status:"running"});let emitInitialNotifications=()=>{this.broadcast({method:"thread/status/changed",params:{threadId:params.threadId,status:{type:"active",activeFlags:[]}}}),this.emitToThread(params.threadId,{method:"turn/started",params:{threadId:params.threadId,turn}}),this.emitUserMessage(params.threadId,turnId,startedAtMs,userMessage)};deferNotifications?.(emitInitialNotifications)!==!0&&emitInitialNotifications();let pendingTurn,completion=new Promise(complete=>{pendingTurn={turnId,startedAt,startedAtMs,resolve:complete,interrupted:!1,completed:!1,deferTerminalNotifications:void 0},this.pendingByThreadId.set(params.threadId,pendingTurn)});entry.session.prompt(parsedInput.text,{source:"rpc",preflightResult:success=>{if(success){didSettle||(didSettle=!0,resolve4({turn}));return}pendingTurn.completed||this.completeTurn(params.threadId,"failed","Prompt preflight failed")}}).then(()=>{didSettle||(didSettle=!0,reject(toTurnEngineError(new Error("Prompt preflight failed"))))}).catch(error=>{didSettle||(didSettle=!0,reject(toTurnEngineError(error))),this.completeTurn(params.threadId,"failed",error instanceof Error?error.message:String(error))}),await completion}catch(error){didSettle||(didSettle=!0,reject(toTurnEngineError(error instanceof Error?error:new Error(String(error)))))}}).catch(error=>{didSettle||(didSettle=!0,reject(toTurnEngineError(error)))})})}async steerTurn(params){let entry=this.getLoadedThreadOrThrow(params.threadId),activeTurn=entry.activeTurn;if(!activeTurn)throw invalidRequest3(`No active turn for thread ${params.threadId}`);if(activeTurn.turnId!==params.expectedTurnId)throw invalidRequest3(`Turn id mismatch: expected ${params.expectedTurnId} but active turn is ${activeTurn.turnId}`);let parsedInput=parseInput(params.input);return await entry.session.steer(parsedInput.text,{source:"rpc"}),this.emitUserMessage(params.threadId,activeTurn.turnId,Date.now(),buildUserMessage(params.clientUserMessageId??null,parsedInput.content)),{turnId:activeTurn.turnId}}async interruptTurn(params,deferNotifications){let entry=this.getLoadedThreadOrThrow(params.threadId),activeTurn=entry.activeTurn;if(!activeTurn)return{};if(activeTurn.turnId!==params.turnId)throw invalidRequest3(`Turn id mismatch: expected ${params.turnId} but active turn is ${activeTurn.turnId}`);let pending=this.pendingByThreadId.get(params.threadId);return pending?.turnId===params.turnId&&(pending.interrupted=!0,pending.deferTerminalNotifications=deferNotifications),await entry.session.abort(),entry.activeTurn?.turnId===params.turnId&&this.completeTurn(params.threadId,"interrupted"),{}}completeTurn(threadId,status="completed",message){let entry=this.getLoadedThreadOrThrow(threadId),activeTurn=entry.activeTurn,pending=this.pendingByThreadId.get(threadId);if(!activeTurn||!pending||pending.completed||pending.turnId!==activeTurn.turnId)return;pending.completed=!0,this.finalizeProjection(threadId);let completedStatus=pending.interrupted&&status==="completed"?"interrupted":status,completedAtMs=Date.now();this.turnLog.completeTurn(threadId,pending.turnId,{status:completedStatus,completedAt:new Date(completedAtMs).toISOString(),error:message??null});let turn=buildTurn(pending.turnId,completedStatus,pending.startedAtMs,completedAtMs,readLoggedItems(this.turnLog,threadId,pending.turnId),message);entry.activeTurn=null,entry.status="idle",entry.updatedAt=new Date(completedAtMs).toISOString(),this.pendingByThreadId.delete(threadId);let emitTerminalNotifications=()=>{this.broadcast({method:"thread/status/changed",params:{threadId,status:{type:"idle"}}}),emitTurnTerminalNotifications(threadId,turn,this.emitToThread)};pending.deferTerminalNotifications?.(emitTerminalNotifications)!==!0&&emitTerminalNotifications(),pending.resolve()}emitUserMessage(threadId,turnId,startedAtMs,userMessage){let wireUserMessage=wireItemToJson(userMessage);this.emitToThread(threadId,{method:"item/started",params:{threadId,turnId,item:wireUserMessage,startedAtMs}}),this.emitToThread(threadId,{method:"item/completed",params:{threadId,turnId,item:wireUserMessage,completedAtMs:startedAtMs}}),this.turnLog.appendItem(threadId,turnId,userMessage)}ensureSessionSubscription(threadId,entry){this.subscribedThreadIds.has(threadId)||(this.subscribedThreadIds.add(threadId),entry.session.subscribe(event=>{this.projectSessionEvent(threadId,event),event.type==="agent_end"&&this.completeTurn(threadId)}))}projectSessionEvent(threadId,event){let entry;try{entry=this.getLoadedThreadOrThrow(threadId)}catch{return}let activeTurn=entry.activeTurn;if(!activeTurn&&(activeTurn=this.startExtensionTurn(threadId,entry,event),!activeTurn))return;let state=this.projectorByThreadId.get(threadId);(!state||state.turnId!==activeTurn.turnId)&&(state={turnId:activeTurn.turnId,projector:new EventProjector({threadId,turnId:activeTurn.turnId,turnLog:this.turnLog,cwd:entry.cwd})},this.projectorByThreadId.set(threadId,state));let result=state.projector.project(event);this.emitProjected(threadId,result.notifications);let completion=result.turnCompletion;completion&&completion.status!=="completed"&&completion.status!=="running"&&this.completeTurn(threadId,completion.status,completion.errorMessage)}startExtensionTurn(threadId,entry,event){let sessionEvent=event,userMessage=sessionEvent.type==="message_start"&&sessionEvent.message.role==="user"?buildExtensionUserMessage(sessionEvent.message):null,isAgentStart=sessionEvent.type==="agent_start";if(userMessage===null&&!isAgentStart)return null;let turnId=createTurnId(),startedAtMs=Date.now(),startedAt=new Date(startedAtMs).toISOString(),turn=buildTurn(turnId,"inProgress",startedAtMs,null,[]);return entry.activeTurn={turnId,startedAt},entry.status="active",entry.updatedAt=startedAt,this.turnLog.recordTurn(threadId,{turnId,startedAt,status:"running"}),this.pendingByThreadId.set(threadId,{turnId,startedAt,startedAtMs,resolve:()=>{},interrupted:!1,completed:!1,deferTerminalNotifications:void 0}),this.broadcast({method:"thread/status/changed",params:{threadId,status:{type:"active",activeFlags:[]}}}),this.emitToThread(threadId,{method:"turn/started",params:{threadId,turn}}),userMessage&&this.emitUserMessage(threadId,turnId,startedAtMs,userMessage),entry.activeTurn}finalizeProjection(threadId){let state=this.projectorByThreadId.get(threadId);state&&(this.projectorByThreadId.delete(threadId),this.emitProjected(threadId,state.projector.finalize()))}emitProjected(threadId,notifications){for(let notification of notifications)this.emitToThread(threadId,{method:notification.method,params:notification.params})}getLoadedThreadOrThrow(threadId){try{return this.store.getLoadedThread(threadId)}catch{throw invalidRequest3(`Thread not found: ${threadId}`)}}};function buildExtensionUserMessage(message){let content=typeof message.content=="string"?[{type:"text",text:message.content,text_elements:[]}]:message.content.map(part=>part.type==="text"?{type:"text",text:part.text,text_elements:[]}:{type:"image",url:`data:${part.mimeType};base64,${part.data}`});return buildUserMessage(null,content)}import{AsyncLocalStorage}from"node:async_hooks";import{join as join6}from"node:path";var RATE_LIMITS_AUTHENTICATION_MESSAGE="codex account authentication required to read rate limits",TOKEN_USAGE_AUTHENTICATION_MESSAGE="codex account authentication required to read token usage";function registerAppServerAccountMethods(registry,options={}){let agentDir=resolvePath(options.agentDir??getAgentDir());registry.register("account/read",{scope:"global",handler:({request})=>(parseAccountReadParams(request.params),accountReadResponse(agentDir))}),registry.register("account/providerAccounts/read",{scope:"global",handler:({request})=>providerAccountsResponse(agentDir,parseProviderAccountsReadParams(request.params))}),registry.register("account/providerAccounts/pin",{scope:"global",handler:async({request})=>{let params=parseProviderAccountsPinParams(request.params);return await pinCredentialAccount(AuthStorage.create(join6(agentDir,"auth.json")),params.provider,params.name),{}}}),registry.register("account/providerAccounts/remove",{scope:"global",handler:async({request})=>{let params=parseProviderAccountsRemoveParams(request.params);return await removeCredentialAccount(AuthStorage.create(join6(agentDir,"auth.json")),params.provider,params.name),{}}}),registry.register("account/rateLimits/read",{scope:"global",handler:()=>{throw unauthenticatedAccountReadError(RATE_LIMITS_AUTHENTICATION_MESSAGE)}}),registry.register("account/usage/read",{scope:"global",handler:()=>{throw unauthenticatedAccountReadError(TOKEN_USAGE_AUTHENTICATION_MESSAGE)}})}function providerAccountEventNotification(event){return event.type==="accounts_changed"?{method:"account/providerAccounts/updated",params:{provider:event.provider}}:{method:"account/providerAccounts/failover",params:{provider:event.provider,from:event.from,to:event.to,reason:event.reason}}}function accountReadResponse(agentDir){let credentials=AuthStorage.create(join6(agentDir,"auth.json")).getAll();return{account:Object.keys(credentials).length>0?{type:"apiKey"}:null,requiresOpenaiAuth:!1}}async function providerAccountsResponse(agentDir,params){let storage=AuthStorage.create(join6(agentDir,"auth.json"));return{provider:params.provider,accounts:await getCredentialAccounts(storage,params.provider)}}function parseAccountReadParams(value){if(value==null)return{};if(!isRecord12(value))throw new RpcHandlerError({code:-32600,message:"account/read params must be an object"});let refreshToken=value.refreshToken;if(refreshToken!==void 0&&typeof refreshToken!="boolean")throw new RpcHandlerError({code:-32600,message:"account/read refreshToken must be a boolean"});return refreshToken===void 0?{}:{refreshToken}}function parseProviderAccountsReadParams(value){return{provider:providerFrom(value,"account/providerAccounts/read")}}function parseProviderAccountsPinParams(value){let params=requiredRecord(value,"account/providerAccounts/pin");if(typeof params.name!="string"&¶ms.name!==null)throw invalidParams2("account/providerAccounts/pin name must be a string or null");return{provider:requiredProvider(params,"account/providerAccounts/pin"),name:params.name}}function parseProviderAccountsRemoveParams(value){let params=requiredRecord(value,"account/providerAccounts/remove");if(typeof params.name!="string"||params.name.length===0)throw invalidParams2("account/providerAccounts/remove name must be a non-empty string");return{provider:requiredProvider(params,"account/providerAccounts/remove"),name:params.name}}function providerFrom(value,method){return requiredProvider(requiredRecord(value,method),method)}function requiredProvider(params,method){if(typeof params.provider!="string"||params.provider.length===0)throw invalidParams2(`${method} provider must be a non-empty string`);return params.provider}function requiredRecord(value,method){if(!isRecord12(value))throw invalidParams2(`${method} params must be an object`);return value}function invalidParams2(message){return new RpcHandlerError({code:-32600,message})}function unauthenticatedAccountReadError(message){return new RpcHandlerError({code:-32600,message})}function isRecord12(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var PERMISSION_PROFILES=[{id:"dangerFullAccess",description:null,allowed:!0}],EXPERIMENTAL_FEATURES=[];function registerAppServerCatalogMethods(registry,options={}){let serverCwd=resolvePath(options.serverCwd??process.cwd()),agentDir=options.agentDir??getAgentDir(),defaultModelRegistry,getModelRegistry=()=>(defaultModelRegistry??=ModelRegistry.create(AuthStorage.create()),options.modelRegistry??defaultModelRegistry);registry.register("collaborationMode/list",{experimental:!0,scope:"global",handler:({request})=>{parseObjectParams(request.params,"collaborationMode/list");let model=defaultModelId(getModelRegistry().getAvailable());return{data:[buildSenpiCollaborationModePreset(model)]}}}),registry.register("permissionProfile/list",{scope:"global",handler:({request})=>{let params=parsePermissionProfileListParams(request.params),cwd=resolvePath(params.cwd??serverCwd,serverCwd,{trim:!0});return SettingsManager.create(cwd,agentDir).getProjectSettings(),paginateCatalog(PERMISSION_PROFILES,params.cursor,params.limit,"permissionProfile/list")}}),registry.register("experimentalFeature/list",{scope:"global",handler:({request})=>{let params=parseExperimentalFeatureListParams(request.params);return validateThreadId(params.threadId,options.threads,"experimentalFeature/list"),paginateCatalog(EXPERIMENTAL_FEATURES,params.cursor,params.limit,"experimentalFeature/list")}}),registry.register("mcpServerStatus/list",{scope:"global",handler:({request})=>{let params=parseMcpServerStatusListParams(request.params);validateThreadId(params.threadId,options.threads,"mcpServerStatus/list");let adapter=options.threads?.getMcpWireStatusAdapter(params.threadId),detail=params.detail??"full",visibleStatuses=(adapter?.getServerStatuses()??[]).map(status=>applyMcpServerStatusDetail(status,detail));return paginateCatalog(visibleStatuses,params.cursor,params.limit,"mcpServerStatus/list")}})}function defaultModelId(models){return models.find(model=>Object.entries(defaultModelPerProvider).some(([provider,modelId])=>provider===model.provider&&modelId===model.id))?.id??models[0]?.id??"unknown"}function parsePermissionProfileListParams(value){let params=parseObjectParams(value,"permissionProfile/list");return{cursor:optionalString3(params.cursor,"permissionProfile/list","cursor"),limit:optionalNumber2(params.limit,"permissionProfile/list","limit"),cwd:optionalString3(params.cwd,"permissionProfile/list","cwd")}}function parseExperimentalFeatureListParams(value){let params=parseObjectParams(value,"experimentalFeature/list");return{cursor:optionalString3(params.cursor,"experimentalFeature/list","cursor"),limit:optionalNumber2(params.limit,"experimentalFeature/list","limit"),threadId:optionalString3(params.threadId,"experimentalFeature/list","threadId")}}function parseMcpServerStatusListParams(value){let params=parseObjectParams(value,"mcpServerStatus/list");return{cursor:optionalString3(params.cursor,"mcpServerStatus/list","cursor"),limit:optionalNumber2(params.limit,"mcpServerStatus/list","limit"),detail:optionalMcpServerStatusDetail(params.detail),threadId:optionalString3(params.threadId,"mcpServerStatus/list","threadId")}}function optionalMcpServerStatusDetail(value){if(value==null||value==="full"||value==="toolsAndAuthOnly")return value;throw invalidCatalogParams("mcpServerStatus/list detail must be full, toolsAndAuthOnly, or null")}function applyMcpServerStatusDetail(server,detail){switch(detail){case"full":return server;case"toolsAndAuthOnly":return{...server,serverInfo:null,resources:[],resourceTemplates:[]};default:return assertNever2(detail)}}function parseObjectParams(value,method){if(value==null)return{};if(!isRecord13(value))throw invalidCatalogParams(`${method} params must be an object`);return value}function optionalString3(value,method,field){if(value==null)return value;if(typeof value!="string")throw invalidCatalogParams(`${method} ${field} must be a string or null`);return value}function optionalNumber2(value,method,field){if(value==null)return value;if(typeof value!="number"||!Number.isSafeInteger(value)||value<0)throw invalidCatalogParams(`${method} ${field} must be a non-negative integer or null`);return value}function paginateCatalog(items,cursor,limit,method){let start=parseCursor2(cursor,items.length,method),pageSize=Math.max(1,limit??items.length),data=items.slice(start,start+pageSize),nextOffset=start+data.length;return{data,nextCursor:nextOffset<items.length?String(nextOffset):null}}function parseCursor2(cursor,total,method){if(cursor==null)return 0;if(!/^\d+$/u.test(cursor))throw invalidCatalogParams(`${method} received an invalid cursor: ${cursor}`);let offset=Number(cursor);if(!Number.isSafeInteger(offset)||offset>total)throw invalidCatalogParams(`${method} cursor ${cursor} exceeds total records ${total}`);return offset}function validateThreadId(threadId,threads,method){if(threadId!=null){if(!threads)throw invalidCatalogParams(`${method} received an unknown threadId: ${threadId}`);try{threads.getLoadedThread(threadId)}catch(error){throw error instanceof Error&&error.name==="ThreadNotFoundError"?invalidCatalogParams(`${method} received an unknown threadId: ${threadId}`):error}}}function invalidCatalogParams(message){return new RpcHandlerError({code:-32600,message})}function isRecord13(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function assertNever2(value){throw new Error(`Unhandled MCP server status detail: ${JSON.stringify(value)}`)}import{join as join7}from"node:path";var CONFIG_LAYER_VERSION="unversioned",SETTINGS_MAPPINGS=[{settingsKey:"defaultModel",wireKey:"model"},{settingsKey:"defaultProvider",wireKey:"model_provider"},{settingsKey:"defaultThinkingLevel",wireKey:"model_reasoning_effort"}];function registerAppServerConfigMethods(registry,options={}){let serverCwd=resolvePath(options.serverCwd??process.cwd()),agentDir=resolvePath(options.agentDir??getAgentDir());registry.register("config/read",{scope:"global",handler:({request})=>{let params=parseConfigReadParams(request.params),cwd=resolvePath(params.cwd??serverCwd,serverCwd,{trim:!0});return buildConfigReadResponse(SettingsManager.create(cwd,agentDir),agentDir,cwd,params.includeLayers===!0)}}),registry.register("configRequirements/read",{scope:"global",handler:()=>({requirements:null})})}function buildConfigReadResponse(settingsManager,agentDir,cwd,includeLayers){let globalSettings=settingsManager.getGlobalSettings(),projectSettings=settingsManager.getProjectSettings(),userSource={type:"user",file:join7(agentDir,"settings.json"),profile:null},projectSource={type:"project",dotCodexFolder:join7(cwd,CONFIG_DIR_NAME)},userMetadata=buildLayerMetadata(userSource),projectMetadata=buildLayerMetadata(projectSource),origins={};for(let mapping of SETTINGS_MAPPINGS)readMappedSetting(projectSettings,mapping.settingsKey)!==void 0?origins[mapping.wireKey]=projectMetadata:readMappedSetting(globalSettings,mapping.settingsKey)!==void 0&&(origins[mapping.wireKey]=userMetadata);return{config:{model:settingsManager.getDefaultModel()??null,model_provider:settingsManager.getDefaultProvider()??null,approval_policy:"never",sandbox_mode:"danger-full-access",model_reasoning_effort:settingsManager.getDefaultThinkingLevel()??null},origins,layers:includeLayers?[buildLayer(userSource,globalSettings),buildLayer(projectSource,projectSettings)]:null}}function buildLayerMetadata(source){return{name:source,version:CONFIG_LAYER_VERSION}}function buildLayer(source,settings){return{name:source,version:CONFIG_LAYER_VERSION,config:buildMappedSettings(settings),disabledReason:null}}function buildMappedSettings(settings){let config={};for(let mapping of SETTINGS_MAPPINGS){let value=readMappedSetting(settings,mapping.settingsKey);value!==void 0&&(config[mapping.wireKey]=value)}return config}function readMappedSetting(settings,key){let value=settings[key];return typeof value=="string"?value:void 0}function parseConfigReadParams(value){if(value==null)return{};if(!isRecord14(value))throw invalidConfigParams("config/read params must be an object");let includeLayers=value.includeLayers;if(includeLayers!==void 0&&typeof includeLayers!="boolean")throw invalidConfigParams("config/read includeLayers must be a boolean");let cwd=value.cwd;if(cwd!=null&&typeof cwd!="string")throw invalidConfigParams("config/read cwd must be a string or null");return{...includeLayers===void 0?{}:{includeLayers},...cwd===void 0?{}:{cwd}}}function invalidConfigParams(message){return new RpcHandlerError({code:-32600,message})}function isRecord14(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}import{arch,platform,release,type}from"node:os";var DEFAULT_CAPABILITIES={experimentalApi:!1,requestAttestation:!1},SERVER_NOTIFICATIONS=new Set([...SERVER_NOTIFICATION_METHODS,...ADDITIVE_SERVER_NOTIFICATION_METHODS]),EXPERIMENTAL_SERVER_NOTIFICATIONS=new Set(EXPERIMENTAL_SERVER_NOTIFICATION_METHODS),ManagedConnection=class{constructor(input){this.optOutNotificationMethods=new Set,this.state={initialized:!1},this.id=input.id,this.transportKind=input.transportKind,this.sendMessage=input.send,this.closeConnection=input.close}get initialized(){return this.state.initialized}get initializedState(){return this.state.initialized?this.state:void 0}get capabilities(){return this.state.initialized?this.state.capabilities:DEFAULT_CAPABILITIES}initialize(params,serverVersion){if(this.state.initialized)return{kind:"already-initialized"};let capabilities=normalizeCapabilities(params.capabilities);this.optOutNotificationMethods.clear();for(let method of capabilities.optOutNotificationMethods??[])this.optOutNotificationMethods.add(method);let userAgent=buildUserAgent(params.clientInfo.name,serverVersion);return this.state={initialized:!0,clientInfo:params.clientInfo,capabilities,userAgent},{kind:"initialized"}}async send(message){await this.sendMessage(populateOutboundNotificationEnvelope(message))}async close(reason){await this.closeConnection(reason)}};function createConnection(input){return new ManagedConnection(input)}function parseInitializeParams(params){if(!isJsonObject2(params))return null;let clientInfo=parseClientInfo(params.clientInfo);if(!clientInfo)return null;let capabilities=parseCapabilities(params.capabilities);return capabilities==="invalid"?null:{clientInfo,capabilities}}function canDeliverNotification(connection,notification){return!connection.initialized||!SERVER_NOTIFICATIONS.has(notification.method)||connection.optOutNotificationMethods.has(notification.method)?!1:!EXPERIMENTAL_SERVER_NOTIFICATIONS.has(notification.method)||connection.capabilities.experimentalApi}function buildInitializeResponse(connection,codexHome){let state=connection.initializedState;if(!state)throw new Error("Connection is not initialized");return{userAgent:state.userAgent,codexHome,platformFamily:platformFamily(),platformOs:platformOs()}}function parseClientInfo(value){if(!isJsonObject2(value))return null;let name=value.name,version=value.version,title=value.title;return typeof name!="string"||name.length===0||typeof version!="string"||version.length===0||title!=null&&typeof title!="string"?null:{name,title:typeof title=="string"?title:null,version}}function parseCapabilities(value){if(value==null)return null;if(!isJsonObject2(value))return"invalid";let experimentalApi=parseOptionalBoolean(value.experimentalApi),requestAttestation=parseOptionalBoolean(value.requestAttestation),mcpServerOpenaiFormElicitation=parseOptionalBoolean(value.mcpServerOpenaiFormElicitation),optOutNotificationMethods=parseOptionalStringArray(value.optOutNotificationMethods);return experimentalApi==="invalid"||requestAttestation==="invalid"||mcpServerOpenaiFormElicitation==="invalid"||optOutNotificationMethods==="invalid"?"invalid":{experimentalApi:experimentalApi??!1,requestAttestation:requestAttestation??!1,...mcpServerOpenaiFormElicitation===void 0?{}:{mcpServerOpenaiFormElicitation},...optOutNotificationMethods===null?{}:{optOutNotificationMethods}}}function normalizeCapabilities(capabilities){return capabilities??DEFAULT_CAPABILITIES}function parseOptionalBoolean(value){if(value!==void 0)return typeof value=="boolean"?value:"invalid"}function parseOptionalStringArray(value){return value==null?null:!Array.isArray(value)||value.some(entry=>typeof entry!="string")?"invalid":value}function buildUserAgent(clientName,serverVersion){return`${clientName}/${serverVersion} (${type()} ${release()}; ${arch()}) senpi_app_server`}function platformFamily(){return platform()==="win32"?"windows":"unix"}function platformOs(){switch(platform()){case"darwin":return"macos";case"win32":return"windows";default:return"linux"}}function isJsonObject2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}import{randomUUID as randomUUID4}from"node:crypto";import{mkdir as mkdir2,readdir as readdir4,readFile as readFile5,rmdir,stat as stat3,unlink,writeFile as writeFile2}from"node:fs/promises";import{dirname as dirname2,join as join8}from"node:path";import{setTimeout as delay}from"node:timers/promises";var DEFAULT_MODEL_IDS=new Map(Object.entries(defaultModelPerProvider));function buildModelListResponse(models,params){let filteredModels=models.map(model=>buildWireModel(model)).filter(model=>params.includeHidden===!0||!model.hidden),start=parseModelListCursor(params.cursor,filteredModels.length),limit=normalizeModelListLimit(params.limit,filteredModels.length),end=Math.min(start+limit,filteredModels.length);return{data:filteredModels.slice(start,end),nextCursor:end<filteredModels.length?String(end):null}}function buildWireModel(model){return{id:`${model.provider}/${model.id}`,model:model.id,upgrade:null,upgradeInfo:null,availabilityNux:null,displayName:model.name??model.id,description:"",hidden:model.hidden===!0,supportedReasoningEfforts:model.reasoning?getSupportedThinkingLevels(model).filter(level=>level!=="off").map(reasoningEffort=>({reasoningEffort,description:""})):[],defaultReasoningEffort:"medium",inputModalities:["text"],supportsPersonality:!1,additionalSpeedTiers:[],serviceTiers:[],defaultServiceTier:null,isDefault:DEFAULT_MODEL_IDS.get(model.provider)===model.id}}function parseModelListCursor(cursor,total){if(cursor==null)return 0;let start=Number(cursor);if(!Number.isSafeInteger(start)||start<0||!/^\d+$/u.test(cursor))throw invalidModelListParams(`model/list received an invalid cursor: ${cursor}`);if(start>total)throw invalidModelListParams(`model/list cursor ${start} exceeds total models ${total}`);return start}function normalizeModelListLimit(limit,total){return total===0?0:limit==null?total:Math.min(total,Math.max(1,limit))}function invalidModelListParams(message){return new RpcHandlerError({code:-32600,message})}var INSTALLATION_ID_PATH=["app-server","installation-id"],INSTALLATION_ID_LOCK_SUFFIX=".lock",INSTALLATION_ID_LOCK_MARKER_PREFIX="owner-",INSTALLATION_ID_LOCK_MARKER_SUFFIX=".json",INSTALLATION_ID_LOCK_RETRY_ATTEMPTS=100,INSTALLATION_ID_LOCK_RETRY_MS=10,INSTALLATION_ID_INVALID_LOCK_RECLAIM_MS=500,UUID_V4_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu,pendingInstallationIds=new Map;function registerAppServerModelMethods(registry,options={}){let defaultModelRegistry,getModelRegistry=()=>(defaultModelRegistry??=ModelRegistry.create(AuthStorage.create()),options.modelRegistry??defaultModelRegistry);registry.register("model/list",{handler:({request})=>buildModelListResponse(getModelRegistry().getAvailable(),parseModelListParams(request.params))}),registry.register("remoteControl/status/read",{experimental:!0,handler:()=>buildRemoteControlStatusReadResponse(options.agentDir??getAgentDir())}),registry.register("remoteControl/client/list",{experimental:!0,handler:({request})=>{throw parseRemoteControlClientListParams(request.params),new Error("remote control is unavailable for this app-server")}})}async function buildRemoteControlStatusReadResponse(agentDir){return{status:"disabled",serverName:"senpi app-server",installationId:await ensureInstallationId(agentDir),environmentId:null}}async function ensureInstallationId(agentDir){let installationIdPath=join8(agentDir,...INSTALLATION_ID_PATH),pendingInstallationId=pendingInstallationIds.get(installationIdPath);if(pendingInstallationId)return pendingInstallationId;let installationId=loadOrCreateInstallationId(installationIdPath);pendingInstallationIds.set(installationIdPath,installationId);try{return await installationId}finally{pendingInstallationIds.get(installationIdPath)===installationId&&pendingInstallationIds.delete(installationIdPath)}}async function loadOrCreateInstallationId(installationIdPath){for(let attempt=0;attempt<INSTALLATION_ID_LOCK_RETRY_ATTEMPTS;attempt+=1){let existing=await readInstallationId(installationIdPath);if(existing)return existing;let claimed=await tryCreateInstallationIdUnderLock(installationIdPath);if(claimed)return claimed;await delay(INSTALLATION_ID_LOCK_RETRY_MS)}throw new Error(`timed out waiting for installation id lock: ${installationIdPath}`)}async function readInstallationId(installationIdPath){try{let existing=(await readFile5(installationIdPath,"utf8")).trim();return UUID_V4_PATTERN.test(existing)?existing:void 0}catch(error){if(!isNodeErrorCode(error,"ENOENT"))throw error;return}}async function tryCreateInstallationIdUnderLock(installationIdPath){await mkdir2(dirname2(installationIdPath),{recursive:!0});let lockPath=`${installationIdPath}${INSTALLATION_ID_LOCK_SUFFIX}`,ownerToken=randomUUID4();try{await mkdir2(lockPath,{mode:448})}catch(error){if(isNodeErrorCode(error,"EEXIST")){await reclaimAbandonedInstallationIdLock(lockPath);return}throw error}let markerPath=join8(lockPath,`${INSTALLATION_ID_LOCK_MARKER_PREFIX}${ownerToken}${INSTALLATION_ID_LOCK_MARKER_SUFFIX}`),markerCreated=!1;try{await writeFile2(markerPath,`${JSON.stringify({ownerToken,pid:process.pid,createdAtMs:Date.now()})}
|
|
15
|
+
${body}`:summary,action:null,results:null}}function buildWireItem(item){return{...item}}function commandFromArgs(args){return isRecord11(args)?readString3(args,"command")??readString3(args,"cmd")??stringifyJson(toJsonValue2(args)):""}function splitMcpName(name){let marker=name.indexOf("__");return marker===-1?["",name]:[name.slice(0,marker),name.slice(marker+2)]}function exitCodeFromResult(result){if(!isRecord11(result))return null;let details=isRecord11(result.details)?result.details:void 0,value=details?details.exitCode??details.code:void 0;return typeof value=="number"?value:null}function toolResultContent(result){return!isRecord11(result)||!Array.isArray(result.content)?[]:result.content.map(toJsonValue2)}function capUtf8(value,maxBytes){if(maxBytes<=0)return"";let used=0,result="";for(let char of value){let size=byteLength(char);if(used+size>maxBytes)break;used+=size,result+=char}return result}function byteLength(value){return new TextEncoder().encode(value).byteLength}function isRecord11(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function readString3(record,key){let value=record[key];return typeof value=="string"?value:void 0}function toJsonValue2(value){return value===null||typeof value=="boolean"||typeof value=="number"||typeof value=="string"?value:Array.isArray(value)?value.map(toJsonValue2):isRecord11(value)?Object.fromEntries(Object.entries(value).map(([key,entry])=>[key,toJsonValue2(entry)])):null}function stringifyJson(value){return JSON.stringify(value)??""}function assertNeverToolItem(value){throw new Error(`Unhandled tool item type: ${String(value)}`)}var EventProjector=class{constructor(options){this.toolItems=new Map,this.completedItemIds=new Set,this.turnDiff=new TurnDiffTracker,this.messageCounter=0,this.finalized=!1,this.options=options,this.messageItems=new MessageItemProjector({itemId:contentIndex=>this.itemId(contentIndex),started:item=>this.started(item),completed:item=>this.completed(item),notification:(method,params)=>this.notification(method,params)})}project(event){if(this.finalized)return emptyResult();switch(event.type){case"message_start":return event.message.role==="assistant"&&(this.activeMessageId=messageIdFromMessage(event.message)??this.nextMessageId()),emptyResult();case"message_update":return event.message.role!=="assistant"?emptyResult():(this.activeMessageId=messageIdFromMessage(event.message)??this.activeMessageId??this.nextMessageId(),this.projectAssistantEvent(event.assistantMessageEvent));case"message_end":return event.message.role!=="assistant"?emptyResult():(this.activeMessageId=messageIdFromMessage(event.message)??this.activeMessageId??this.nextMessageId(),{notifications:[...this.messageItems.completeDanglingText(event.message),...this.projectProviderNative(event.message)]});case"tool_execution_start":return this.rememberTool(event.toolCallId,event.toolName,event.args),emptyResult();case"tool_execution_update":return{notifications:this.projectToolUpdate(event.toolCallId,event.partialResult)};case"tool_execution_end":return{notifications:this.completeTool(event.toolCallId,event.isError,event.result)};case"compaction_start":return{notifications:this.startCompaction()};case"compaction_end":return{notifications:this.completeCompaction()};default:return emptyResult()}}projectAssistantEvent(event){switch(event.type){case"start":case"toolcall_delta":return emptyResult();case"text_start":return{notifications:this.messageItems.startText(event.contentIndex)};case"text_delta":return{notifications:this.messageItems.deltaText(event.contentIndex,event.delta)};case"text_end":return{notifications:this.messageItems.completeText(event.contentIndex,event.content)};case"thinking_start":return{notifications:this.messageItems.startReasoning(event.contentIndex)};case"thinking_delta":return{notifications:this.messageItems.deltaReasoning(event.contentIndex,event.delta)};case"thinking_end":return{notifications:this.messageItems.completeReasoning(event.contentIndex,event.content)};case"toolcall_start":return emptyResult();case"toolcall_end":return{notifications:this.startTool(event.toolCall)};case"done":return{notifications:this.messageItems.closeDanglingItems(),turnCompletion:{status:"completed"}};case"error":return{notifications:[],turnCompletion:{status:event.reason==="aborted"?"interrupted":"failed",errorMessage:event.error.errorMessage}};default:return assertNeverProjection(event)}}finalize(){return this.finalized?[]:(this.finalized=!0,this.closeDanglingItems())}nextMessageId(){return this.messageCounter+=1,`message-${this.messageCounter}`}itemId(contentIndex){return`${this.activeMessageId??this.nextMessageId()}:${contentIndex}`}startTool(toolCall){let itemType=classifyTool(toolCall.name),active={id:toolCall.id,name:toolCall.name,itemType,args:toolCall.arguments,output:"",completed:!1};return this.toolItems.set(toolCall.id,active),[this.started(this.projectToolItem(active,!1).item)]}rememberTool(toolCallId,toolName,args){this.toolItems.has(toolCallId)||this.toolItems.set(toolCallId,{id:toolCallId,name:toolName,itemType:classifyTool(toolName),args,output:"",completed:!1})}projectToolUpdate(toolCallId,partialResult){let tool=this.toolItems.get(toolCallId);if(tool?.itemType!=="commandExecution")return[];let delta=capCommandOutput(extractToolText(partialResult),remainingCommandOutputBytes(tool.output));return delta?(tool.output+=delta,[this.notification("item/commandExecution/outputDelta",{itemId:tool.id,delta})]):[]}completeTool(toolCallId,isError,result){let tool=this.toolItems.get(toolCallId);if(!tool||tool.completed)return[];tool.completed=!0;let resultText=extractToolText(result);tool.itemType==="commandExecution"&&resultText&&(tool.output=capCommandOutput(resultText));let projection=this.projectToolItem(tool,!0,isError,result),cumulativeDiff=this.turnDiff.update(tool.id,projection.diff,this.toolItems.keys());return[this.completed(projection.item),...cumulativeDiff===void 0?[]:[this.notification("turn/diff/updated",{diff:cumulativeDiff})]]}projectToolItem(tool,completed,isError=!1,result){return toolWireProjection({tool,status:completed?isError?"failed":"completed":"inProgress",cwd:this.options.cwd??process.cwd(),result,isError})}projectProviderNative(message){return message.content.flatMap((content,contentIndex)=>{if(content.type!=="providerNative")return[];let id=`${this.activeMessageId??this.nextMessageId()}:providerNative:${contentIndex}`,item=providerNativeItem(id,message,content);return[this.started(item),this.completed(item)]})}closeDanglingItems(){return[...this.messageItems.closeDanglingItems(),...Array.from(this.toolItems.values()).flatMap(tool=>tool.completed?[]:this.completeTool(tool.id,!1,void 0))]}startCompaction(){return this.compactionItemId=`context-compaction:${this.messageCounter+1}`,[this.started({type:"contextCompaction",id:this.compactionItemId})]}completeCompaction(){let id=this.compactionItemId??`context-compaction:${this.messageCounter+1}`;return this.compactionItemId=void 0,[this.completed({type:"contextCompaction",id})]}started(item){return this.notification("item/started",{item:buildWireItem(item),startedAtMs:this.nowMs()})}completed(item){let wireItem=buildWireItem(item);return this.completedItemIds.has(String(wireItem.id))||(this.completedItemIds.add(String(wireItem.id)),this.options.turnLog?.appendItem(this.options.threadId,this.options.turnId,wireItem)),this.notification("item/completed",{item:wireItem,completedAtMs:this.nowMs()})}notification(method,params){return{method,params:{threadId:this.options.threadId,turnId:this.options.turnId,...params}}}nowMs(){return this.options.nowMs?.()??Date.now()}};function emitTurnTerminalNotifications(threadId,turn,emitToThread){turn.status==="failed"&&turn.error!==null&&emitToThread(threadId,{method:"error",params:{threadId,turnId:turn.id,error:turn.error,willRetry:!1}}),emitToThread(threadId,{method:"turn/completed",params:{threadId,turn}})}function createTurnEngine(options){return new TurnEngine(options)}var TurnEngine=class{constructor(options){this.pendingByThreadId=new Map,this.subscribedThreadIds=new Set,this.projectorByThreadId=new Map,this.store=options.store,this.turnLog=options.turnLog,this.emitToThread=options.emitToThread,this.broadcast=options.broadcast}observeThread(threadId){this.ensureSessionSubscription(threadId,this.getLoadedThreadOrThrow(threadId))}startTurn(params,deferNotifications){this.getLoadedThreadOrThrow(params.threadId);let didSettle=!1;return new Promise((resolve4,reject)=>{this.store.runThreadTask(params.threadId,async()=>{try{let parsedInput=parseInput(params.input),entry=this.getLoadedThreadOrThrow(params.threadId);this.observeThread(params.threadId);let turnId=createTurnId(),startedAtMs=Date.now(),startedAt=new Date(startedAtMs).toISOString(),turn=buildTurn(turnId,"inProgress",startedAtMs,null,[]),userMessage=buildUserMessage(params.clientUserMessageId??null,parsedInput.content);entry.activeTurn={turnId,startedAt},entry.status="active",entry.updatedAt=startedAt,this.turnLog.recordTurn(params.threadId,{turnId,startedAt,status:"running"});let emitInitialNotifications=()=>{this.broadcast({method:"thread/status/changed",params:{threadId:params.threadId,status:{type:"active",activeFlags:[]}}}),this.emitToThread(params.threadId,{method:"turn/started",params:{threadId:params.threadId,turn}}),this.emitUserMessage(params.threadId,turnId,startedAtMs,userMessage)};deferNotifications?.(emitInitialNotifications)!==!0&&emitInitialNotifications();let pendingTurn,completion=new Promise(complete=>{pendingTurn={turnId,startedAt,startedAtMs,resolve:complete,interrupted:!1,completed:!1,deferTerminalNotifications:void 0},this.pendingByThreadId.set(params.threadId,pendingTurn)});entry.session.prompt(parsedInput.text,{source:"rpc",preflightResult:success=>{if(success){didSettle||(didSettle=!0,resolve4({turn}));return}pendingTurn.completed||this.completeTurn(params.threadId,"failed","Prompt preflight failed")}}).then(()=>{didSettle||(didSettle=!0,reject(toTurnEngineError(new Error("Prompt preflight failed"))))}).catch(error=>{didSettle||(didSettle=!0,reject(toTurnEngineError(error))),this.completeTurn(params.threadId,"failed",error instanceof Error?error.message:String(error))}),await completion}catch(error){didSettle||(didSettle=!0,reject(toTurnEngineError(error instanceof Error?error:new Error(String(error)))))}}).catch(error=>{didSettle||(didSettle=!0,reject(toTurnEngineError(error)))})})}async steerTurn(params){let entry=this.getLoadedThreadOrThrow(params.threadId),activeTurn=entry.activeTurn;if(!activeTurn)throw invalidRequest3(`No active turn for thread ${params.threadId}`);if(activeTurn.turnId!==params.expectedTurnId)throw invalidRequest3(`Turn id mismatch: expected ${params.expectedTurnId} but active turn is ${activeTurn.turnId}`);let parsedInput=parseInput(params.input);return await entry.session.steer(parsedInput.text,{source:"rpc"}),this.emitUserMessage(params.threadId,activeTurn.turnId,Date.now(),buildUserMessage(params.clientUserMessageId??null,parsedInput.content)),{turnId:activeTurn.turnId}}async interruptTurn(params,deferNotifications){let entry=this.getLoadedThreadOrThrow(params.threadId),activeTurn=entry.activeTurn;if(!activeTurn)return{};if(activeTurn.turnId!==params.turnId)throw invalidRequest3(`Turn id mismatch: expected ${params.turnId} but active turn is ${activeTurn.turnId}`);let pending=this.pendingByThreadId.get(params.threadId);return pending?.turnId===params.turnId&&(pending.interrupted=!0,pending.deferTerminalNotifications=deferNotifications),await entry.session.abort(),entry.activeTurn?.turnId===params.turnId&&this.completeTurn(params.threadId,"interrupted"),{}}completeTurn(threadId,status="completed",message){let entry=this.getLoadedThreadOrThrow(threadId),activeTurn=entry.activeTurn,pending=this.pendingByThreadId.get(threadId);if(!activeTurn||!pending||pending.completed||pending.turnId!==activeTurn.turnId)return;pending.completed=!0,this.finalizeProjection(threadId);let completedStatus=pending.interrupted&&status==="completed"?"interrupted":status,completedAtMs=Date.now();this.turnLog.completeTurn(threadId,pending.turnId,{status:completedStatus,completedAt:new Date(completedAtMs).toISOString(),error:message??null});let turn=buildTurn(pending.turnId,completedStatus,pending.startedAtMs,completedAtMs,readLoggedItems(this.turnLog,threadId,pending.turnId),message);entry.activeTurn=null,entry.status="idle",entry.updatedAt=new Date(completedAtMs).toISOString(),this.pendingByThreadId.delete(threadId);let emitTerminalNotifications=()=>{this.broadcast({method:"thread/status/changed",params:{threadId,status:{type:"idle"}}}),emitTurnTerminalNotifications(threadId,turn,this.emitToThread)};pending.deferTerminalNotifications?.(emitTerminalNotifications)!==!0&&emitTerminalNotifications(),pending.resolve()}emitUserMessage(threadId,turnId,startedAtMs,userMessage){let wireUserMessage=wireItemToJson(userMessage);this.emitToThread(threadId,{method:"item/started",params:{threadId,turnId,item:wireUserMessage,startedAtMs}}),this.emitToThread(threadId,{method:"item/completed",params:{threadId,turnId,item:wireUserMessage,completedAtMs:startedAtMs}}),this.turnLog.appendItem(threadId,turnId,userMessage)}ensureSessionSubscription(threadId,entry){this.subscribedThreadIds.has(threadId)||(this.subscribedThreadIds.add(threadId),entry.session.subscribe(event=>{this.projectSessionEvent(threadId,event),event.type==="agent_end"&&this.completeTurn(threadId)}))}projectSessionEvent(threadId,event){let entry;try{entry=this.getLoadedThreadOrThrow(threadId)}catch{return}let activeTurn=entry.activeTurn;if(!activeTurn&&(activeTurn=this.startExtensionTurn(threadId,entry,event),!activeTurn))return;let state=this.projectorByThreadId.get(threadId);(!state||state.turnId!==activeTurn.turnId)&&(state={turnId:activeTurn.turnId,projector:new EventProjector({threadId,turnId:activeTurn.turnId,turnLog:this.turnLog,cwd:entry.cwd})},this.projectorByThreadId.set(threadId,state));let result=state.projector.project(event);this.emitProjected(threadId,result.notifications);let completion=result.turnCompletion;completion&&completion.status!=="completed"&&completion.status!=="running"&&this.completeTurn(threadId,completion.status,completion.errorMessage)}startExtensionTurn(threadId,entry,event){let sessionEvent=event,userMessage=sessionEvent.type==="message_start"&&sessionEvent.message.role==="user"?buildExtensionUserMessage(sessionEvent.message):null,isAgentStart=sessionEvent.type==="agent_start";if(userMessage===null&&!isAgentStart)return null;let turnId=createTurnId(),startedAtMs=Date.now(),startedAt=new Date(startedAtMs).toISOString(),turn=buildTurn(turnId,"inProgress",startedAtMs,null,[]);return entry.activeTurn={turnId,startedAt},entry.status="active",entry.updatedAt=startedAt,this.turnLog.recordTurn(threadId,{turnId,startedAt,status:"running"}),this.pendingByThreadId.set(threadId,{turnId,startedAt,startedAtMs,resolve:()=>{},interrupted:!1,completed:!1,deferTerminalNotifications:void 0}),this.broadcast({method:"thread/status/changed",params:{threadId,status:{type:"active",activeFlags:[]}}}),this.emitToThread(threadId,{method:"turn/started",params:{threadId,turn}}),userMessage&&this.emitUserMessage(threadId,turnId,startedAtMs,userMessage),entry.activeTurn}finalizeProjection(threadId){let state=this.projectorByThreadId.get(threadId);state&&(this.projectorByThreadId.delete(threadId),this.emitProjected(threadId,state.projector.finalize()))}emitProjected(threadId,notifications){for(let notification of notifications)this.emitToThread(threadId,{method:notification.method,params:notification.params})}getLoadedThreadOrThrow(threadId){try{return this.store.getLoadedThread(threadId)}catch{throw invalidRequest3(`Thread not found: ${threadId}`)}}};function buildExtensionUserMessage(message){let content=typeof message.content=="string"?[{type:"text",text:message.content,text_elements:[]}]:message.content.map(part=>part.type==="text"?{type:"text",text:part.text,text_elements:[]}:{type:"image",url:`data:${part.mimeType};base64,${part.data}`});return buildUserMessage(null,content)}import{AsyncLocalStorage}from"node:async_hooks";import{join as join6}from"node:path";var RATE_LIMITS_AUTHENTICATION_MESSAGE="codex account authentication required to read rate limits",TOKEN_USAGE_AUTHENTICATION_MESSAGE="codex account authentication required to read token usage";function registerAppServerAccountMethods(registry,options={}){let agentDir=resolvePath(options.agentDir??getAgentDir());registry.register("account/read",{scope:"global",handler:({request})=>(parseAccountReadParams(request.params),accountReadResponse(agentDir))}),registry.register("account/providerAccounts/read",{scope:"global",handler:({request})=>providerAccountsResponse(agentDir,parseProviderAccountsReadParams(request.params))}),registry.register("account/providerAccounts/pin",{scope:"global",handler:async({request})=>{let params=parseProviderAccountsPinParams(request.params);return await pinCredentialAccount(AuthStorage.create(join6(agentDir,"auth.json")),params.provider,params.name),{}}}),registry.register("account/providerAccounts/remove",{scope:"global",handler:async({request})=>{let params=parseProviderAccountsRemoveParams(request.params);return await removeCredentialAccount(AuthStorage.create(join6(agentDir,"auth.json")),params.provider,params.name),{}}}),registry.register("account/rateLimits/read",{scope:"global",handler:()=>{throw unauthenticatedAccountReadError(RATE_LIMITS_AUTHENTICATION_MESSAGE)}}),registry.register("account/usage/read",{scope:"global",handler:()=>{throw unauthenticatedAccountReadError(TOKEN_USAGE_AUTHENTICATION_MESSAGE)}})}function providerAccountEventNotification(event){return event.type==="accounts_changed"?{method:"account/providerAccounts/updated",params:{provider:event.provider}}:{method:"account/providerAccounts/failover",params:{provider:event.provider,from:event.from,to:event.to,reason:event.reason}}}function accountReadResponse(agentDir){let credentials=AuthStorage.create(join6(agentDir,"auth.json")).getAll();return{account:Object.keys(credentials).length>0?{type:"apiKey"}:null,requiresOpenaiAuth:!1}}async function providerAccountsResponse(agentDir,params){let storage=AuthStorage.create(join6(agentDir,"auth.json"));return{provider:params.provider,accounts:await getCredentialAccounts(storage,params.provider)}}function parseAccountReadParams(value){if(value==null)return{};if(!isRecord12(value))throw new RpcHandlerError({code:-32600,message:"account/read params must be an object"});let refreshToken=value.refreshToken;if(refreshToken!==void 0&&typeof refreshToken!="boolean")throw new RpcHandlerError({code:-32600,message:"account/read refreshToken must be a boolean"});return refreshToken===void 0?{}:{refreshToken}}function parseProviderAccountsReadParams(value){return{provider:providerFrom(value,"account/providerAccounts/read")}}function parseProviderAccountsPinParams(value){let params=requiredRecord(value,"account/providerAccounts/pin");if(typeof params.name!="string"&¶ms.name!==null)throw invalidParams2("account/providerAccounts/pin name must be a string or null");return{provider:requiredProvider(params,"account/providerAccounts/pin"),name:params.name}}function parseProviderAccountsRemoveParams(value){let params=requiredRecord(value,"account/providerAccounts/remove");if(typeof params.name!="string"||params.name.length===0)throw invalidParams2("account/providerAccounts/remove name must be a non-empty string");return{provider:requiredProvider(params,"account/providerAccounts/remove"),name:params.name}}function providerFrom(value,method){return requiredProvider(requiredRecord(value,method),method)}function requiredProvider(params,method){if(typeof params.provider!="string"||params.provider.length===0)throw invalidParams2(`${method} provider must be a non-empty string`);return normalizeProviderId(params.provider)}function requiredRecord(value,method){if(!isRecord12(value))throw invalidParams2(`${method} params must be an object`);return value}function invalidParams2(message){return new RpcHandlerError({code:-32600,message})}function unauthenticatedAccountReadError(message){return new RpcHandlerError({code:-32600,message})}function isRecord12(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var PERMISSION_PROFILES=[{id:"dangerFullAccess",description:null,allowed:!0}],EXPERIMENTAL_FEATURES=[];function registerAppServerCatalogMethods(registry,options={}){let serverCwd=resolvePath(options.serverCwd??process.cwd()),agentDir=options.agentDir??getAgentDir(),defaultModelRegistry,getModelRegistry=()=>(defaultModelRegistry??=ModelRegistry.create(AuthStorage.create()),options.modelRegistry??defaultModelRegistry);registry.register("collaborationMode/list",{experimental:!0,scope:"global",handler:({request})=>{parseObjectParams(request.params,"collaborationMode/list");let model=defaultModelId(getModelRegistry().getAvailable());return{data:[buildSenpiCollaborationModePreset(model)]}}}),registry.register("permissionProfile/list",{scope:"global",handler:({request})=>{let params=parsePermissionProfileListParams(request.params),cwd=resolvePath(params.cwd??serverCwd,serverCwd,{trim:!0});return SettingsManager.create(cwd,agentDir).getProjectSettings(),paginateCatalog(PERMISSION_PROFILES,params.cursor,params.limit,"permissionProfile/list")}}),registry.register("experimentalFeature/list",{scope:"global",handler:({request})=>{let params=parseExperimentalFeatureListParams(request.params);return validateThreadId(params.threadId,options.threads,"experimentalFeature/list"),paginateCatalog(EXPERIMENTAL_FEATURES,params.cursor,params.limit,"experimentalFeature/list")}}),registry.register("mcpServerStatus/list",{scope:"global",handler:({request})=>{let params=parseMcpServerStatusListParams(request.params);validateThreadId(params.threadId,options.threads,"mcpServerStatus/list");let adapter=options.threads?.getMcpWireStatusAdapter(params.threadId),detail=params.detail??"full",visibleStatuses=(adapter?.getServerStatuses()??[]).map(status=>applyMcpServerStatusDetail(status,detail));return paginateCatalog(visibleStatuses,params.cursor,params.limit,"mcpServerStatus/list")}})}function defaultModelId(models){return models.find(model=>Object.entries(defaultModelPerProvider).some(([provider,modelId])=>provider===model.provider&&modelId===model.id))?.id??models[0]?.id??"unknown"}function parsePermissionProfileListParams(value){let params=parseObjectParams(value,"permissionProfile/list");return{cursor:optionalString3(params.cursor,"permissionProfile/list","cursor"),limit:optionalNumber2(params.limit,"permissionProfile/list","limit"),cwd:optionalString3(params.cwd,"permissionProfile/list","cwd")}}function parseExperimentalFeatureListParams(value){let params=parseObjectParams(value,"experimentalFeature/list");return{cursor:optionalString3(params.cursor,"experimentalFeature/list","cursor"),limit:optionalNumber2(params.limit,"experimentalFeature/list","limit"),threadId:optionalString3(params.threadId,"experimentalFeature/list","threadId")}}function parseMcpServerStatusListParams(value){let params=parseObjectParams(value,"mcpServerStatus/list");return{cursor:optionalString3(params.cursor,"mcpServerStatus/list","cursor"),limit:optionalNumber2(params.limit,"mcpServerStatus/list","limit"),detail:optionalMcpServerStatusDetail(params.detail),threadId:optionalString3(params.threadId,"mcpServerStatus/list","threadId")}}function optionalMcpServerStatusDetail(value){if(value==null||value==="full"||value==="toolsAndAuthOnly")return value;throw invalidCatalogParams("mcpServerStatus/list detail must be full, toolsAndAuthOnly, or null")}function applyMcpServerStatusDetail(server,detail){switch(detail){case"full":return server;case"toolsAndAuthOnly":return{...server,serverInfo:null,resources:[],resourceTemplates:[]};default:return assertNever2(detail)}}function parseObjectParams(value,method){if(value==null)return{};if(!isRecord13(value))throw invalidCatalogParams(`${method} params must be an object`);return value}function optionalString3(value,method,field){if(value==null)return value;if(typeof value!="string")throw invalidCatalogParams(`${method} ${field} must be a string or null`);return value}function optionalNumber2(value,method,field){if(value==null)return value;if(typeof value!="number"||!Number.isSafeInteger(value)||value<0)throw invalidCatalogParams(`${method} ${field} must be a non-negative integer or null`);return value}function paginateCatalog(items,cursor,limit,method){let start=parseCursor2(cursor,items.length,method),pageSize=Math.max(1,limit??items.length),data=items.slice(start,start+pageSize),nextOffset=start+data.length;return{data,nextCursor:nextOffset<items.length?String(nextOffset):null}}function parseCursor2(cursor,total,method){if(cursor==null)return 0;if(!/^\d+$/u.test(cursor))throw invalidCatalogParams(`${method} received an invalid cursor: ${cursor}`);let offset=Number(cursor);if(!Number.isSafeInteger(offset)||offset>total)throw invalidCatalogParams(`${method} cursor ${cursor} exceeds total records ${total}`);return offset}function validateThreadId(threadId,threads,method){if(threadId!=null){if(!threads)throw invalidCatalogParams(`${method} received an unknown threadId: ${threadId}`);try{threads.getLoadedThread(threadId)}catch(error){throw error instanceof Error&&error.name==="ThreadNotFoundError"?invalidCatalogParams(`${method} received an unknown threadId: ${threadId}`):error}}}function invalidCatalogParams(message){return new RpcHandlerError({code:-32600,message})}function isRecord13(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function assertNever2(value){throw new Error(`Unhandled MCP server status detail: ${JSON.stringify(value)}`)}import{join as join7}from"node:path";var CONFIG_LAYER_VERSION="unversioned",SETTINGS_MAPPINGS=[{settingsKey:"defaultModel",wireKey:"model"},{settingsKey:"defaultProvider",wireKey:"model_provider"},{settingsKey:"defaultThinkingLevel",wireKey:"model_reasoning_effort"}];function registerAppServerConfigMethods(registry,options={}){let serverCwd=resolvePath(options.serverCwd??process.cwd()),agentDir=resolvePath(options.agentDir??getAgentDir());registry.register("config/read",{scope:"global",handler:({request})=>{let params=parseConfigReadParams(request.params),cwd=resolvePath(params.cwd??serverCwd,serverCwd,{trim:!0});return buildConfigReadResponse(SettingsManager.create(cwd,agentDir),agentDir,cwd,params.includeLayers===!0)}}),registry.register("configRequirements/read",{scope:"global",handler:()=>({requirements:null})})}function buildConfigReadResponse(settingsManager,agentDir,cwd,includeLayers){let globalSettings=settingsManager.getGlobalSettings(),projectSettings=settingsManager.getProjectSettings(),userSource={type:"user",file:join7(agentDir,"settings.json"),profile:null},projectSource={type:"project",dotCodexFolder:join7(cwd,CONFIG_DIR_NAME)},userMetadata=buildLayerMetadata(userSource),projectMetadata=buildLayerMetadata(projectSource),origins={};for(let mapping of SETTINGS_MAPPINGS)readMappedSetting(projectSettings,mapping.settingsKey)!==void 0?origins[mapping.wireKey]=projectMetadata:readMappedSetting(globalSettings,mapping.settingsKey)!==void 0&&(origins[mapping.wireKey]=userMetadata);return{config:{model:settingsManager.getDefaultModel()??null,model_provider:settingsManager.getDefaultProvider()??null,approval_policy:"never",sandbox_mode:"danger-full-access",model_reasoning_effort:settingsManager.getDefaultThinkingLevel()??null},origins,layers:includeLayers?[buildLayer(userSource,globalSettings),buildLayer(projectSource,projectSettings)]:null}}function buildLayerMetadata(source){return{name:source,version:CONFIG_LAYER_VERSION}}function buildLayer(source,settings){return{name:source,version:CONFIG_LAYER_VERSION,config:buildMappedSettings(settings),disabledReason:null}}function buildMappedSettings(settings){let config={};for(let mapping of SETTINGS_MAPPINGS){let value=readMappedSetting(settings,mapping.settingsKey);value!==void 0&&(config[mapping.wireKey]=value)}return config}function readMappedSetting(settings,key){let value=settings[key];return typeof value=="string"?value:void 0}function parseConfigReadParams(value){if(value==null)return{};if(!isRecord14(value))throw invalidConfigParams("config/read params must be an object");let includeLayers=value.includeLayers;if(includeLayers!==void 0&&typeof includeLayers!="boolean")throw invalidConfigParams("config/read includeLayers must be a boolean");let cwd=value.cwd;if(cwd!=null&&typeof cwd!="string")throw invalidConfigParams("config/read cwd must be a string or null");return{...includeLayers===void 0?{}:{includeLayers},...cwd===void 0?{}:{cwd}}}function invalidConfigParams(message){return new RpcHandlerError({code:-32600,message})}function isRecord14(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}import{arch,platform,release,type}from"node:os";var DEFAULT_CAPABILITIES={experimentalApi:!1,requestAttestation:!1},SERVER_NOTIFICATIONS=new Set([...SERVER_NOTIFICATION_METHODS,...ADDITIVE_SERVER_NOTIFICATION_METHODS]),EXPERIMENTAL_SERVER_NOTIFICATIONS=new Set(EXPERIMENTAL_SERVER_NOTIFICATION_METHODS),ManagedConnection=class{constructor(input){this.optOutNotificationMethods=new Set,this.state={initialized:!1},this.id=input.id,this.transportKind=input.transportKind,this.sendMessage=input.send,this.closeConnection=input.close}get initialized(){return this.state.initialized}get initializedState(){return this.state.initialized?this.state:void 0}get capabilities(){return this.state.initialized?this.state.capabilities:DEFAULT_CAPABILITIES}initialize(params,serverVersion){if(this.state.initialized)return{kind:"already-initialized"};let capabilities=normalizeCapabilities(params.capabilities);this.optOutNotificationMethods.clear();for(let method of capabilities.optOutNotificationMethods??[])this.optOutNotificationMethods.add(method);let userAgent=buildUserAgent(params.clientInfo.name,serverVersion);return this.state={initialized:!0,clientInfo:params.clientInfo,capabilities,userAgent},{kind:"initialized"}}async send(message){await this.sendMessage(populateOutboundNotificationEnvelope(message))}async close(reason){await this.closeConnection(reason)}};function createConnection(input){return new ManagedConnection(input)}function parseInitializeParams(params){if(!isJsonObject2(params))return null;let clientInfo=parseClientInfo(params.clientInfo);if(!clientInfo)return null;let capabilities=parseCapabilities(params.capabilities);return capabilities==="invalid"?null:{clientInfo,capabilities}}function canDeliverNotification(connection,notification){return!connection.initialized||!SERVER_NOTIFICATIONS.has(notification.method)||connection.optOutNotificationMethods.has(notification.method)?!1:!EXPERIMENTAL_SERVER_NOTIFICATIONS.has(notification.method)||connection.capabilities.experimentalApi}function buildInitializeResponse(connection,codexHome){let state=connection.initializedState;if(!state)throw new Error("Connection is not initialized");return{userAgent:state.userAgent,codexHome,platformFamily:platformFamily(),platformOs:platformOs()}}function parseClientInfo(value){if(!isJsonObject2(value))return null;let name=value.name,version=value.version,title=value.title;return typeof name!="string"||name.length===0||typeof version!="string"||version.length===0||title!=null&&typeof title!="string"?null:{name,title:typeof title=="string"?title:null,version}}function parseCapabilities(value){if(value==null)return null;if(!isJsonObject2(value))return"invalid";let experimentalApi=parseOptionalBoolean(value.experimentalApi),requestAttestation=parseOptionalBoolean(value.requestAttestation),mcpServerOpenaiFormElicitation=parseOptionalBoolean(value.mcpServerOpenaiFormElicitation),optOutNotificationMethods=parseOptionalStringArray(value.optOutNotificationMethods);return experimentalApi==="invalid"||requestAttestation==="invalid"||mcpServerOpenaiFormElicitation==="invalid"||optOutNotificationMethods==="invalid"?"invalid":{experimentalApi:experimentalApi??!1,requestAttestation:requestAttestation??!1,...mcpServerOpenaiFormElicitation===void 0?{}:{mcpServerOpenaiFormElicitation},...optOutNotificationMethods===null?{}:{optOutNotificationMethods}}}function normalizeCapabilities(capabilities){return capabilities??DEFAULT_CAPABILITIES}function parseOptionalBoolean(value){if(value!==void 0)return typeof value=="boolean"?value:"invalid"}function parseOptionalStringArray(value){return value==null?null:!Array.isArray(value)||value.some(entry=>typeof entry!="string")?"invalid":value}function buildUserAgent(clientName,serverVersion){return`${clientName}/${serverVersion} (${type()} ${release()}; ${arch()}) senpi_app_server`}function platformFamily(){return platform()==="win32"?"windows":"unix"}function platformOs(){switch(platform()){case"darwin":return"macos";case"win32":return"windows";default:return"linux"}}function isJsonObject2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}import{randomUUID as randomUUID4}from"node:crypto";import{mkdir as mkdir2,readdir as readdir4,readFile as readFile5,rmdir,stat as stat3,unlink,writeFile as writeFile2}from"node:fs/promises";import{dirname as dirname2,join as join8}from"node:path";import{setTimeout as delay}from"node:timers/promises";var DEFAULT_MODEL_IDS=new Map(Object.entries(defaultModelPerProvider));function buildModelListResponse(models,params){let filteredModels=models.map(model=>buildWireModel(model)).filter(model=>params.includeHidden===!0||!model.hidden),start=parseModelListCursor(params.cursor,filteredModels.length),limit=normalizeModelListLimit(params.limit,filteredModels.length),end=Math.min(start+limit,filteredModels.length);return{data:filteredModels.slice(start,end),nextCursor:end<filteredModels.length?String(end):null}}function buildWireModel(model){return{id:`${model.provider}/${model.id}`,model:model.id,upgrade:null,upgradeInfo:null,availabilityNux:null,displayName:model.name??model.id,description:"",hidden:model.hidden===!0,supportedReasoningEfforts:model.reasoning?getSupportedThinkingLevels(model).filter(level=>level!=="off").map(reasoningEffort=>({reasoningEffort,description:""})):[],defaultReasoningEffort:"medium",inputModalities:["text"],supportsPersonality:!1,additionalSpeedTiers:[],serviceTiers:[],defaultServiceTier:null,isDefault:DEFAULT_MODEL_IDS.get(model.provider)===model.id}}function parseModelListCursor(cursor,total){if(cursor==null)return 0;let start=Number(cursor);if(!Number.isSafeInteger(start)||start<0||!/^\d+$/u.test(cursor))throw invalidModelListParams(`model/list received an invalid cursor: ${cursor}`);if(start>total)throw invalidModelListParams(`model/list cursor ${start} exceeds total models ${total}`);return start}function normalizeModelListLimit(limit,total){return total===0?0:limit==null?total:Math.min(total,Math.max(1,limit))}function invalidModelListParams(message){return new RpcHandlerError({code:-32600,message})}var INSTALLATION_ID_PATH=["app-server","installation-id"],INSTALLATION_ID_LOCK_SUFFIX=".lock",INSTALLATION_ID_LOCK_MARKER_PREFIX="owner-",INSTALLATION_ID_LOCK_MARKER_SUFFIX=".json",INSTALLATION_ID_LOCK_RETRY_ATTEMPTS=100,INSTALLATION_ID_LOCK_RETRY_MS=10,INSTALLATION_ID_INVALID_LOCK_RECLAIM_MS=500,UUID_V4_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu,pendingInstallationIds=new Map;function registerAppServerModelMethods(registry,options={}){let defaultModelRegistry,getModelRegistry=()=>(defaultModelRegistry??=ModelRegistry.create(AuthStorage.create()),options.modelRegistry??defaultModelRegistry);registry.register("model/list",{handler:({request})=>buildModelListResponse(getModelRegistry().getAvailable(),parseModelListParams(request.params))}),registry.register("remoteControl/status/read",{experimental:!0,handler:()=>buildRemoteControlStatusReadResponse(options.agentDir??getAgentDir())}),registry.register("remoteControl/client/list",{experimental:!0,handler:({request})=>{throw parseRemoteControlClientListParams(request.params),new Error("remote control is unavailable for this app-server")}})}async function buildRemoteControlStatusReadResponse(agentDir){return{status:"disabled",serverName:"senpi app-server",installationId:await ensureInstallationId(agentDir),environmentId:null}}async function ensureInstallationId(agentDir){let installationIdPath=join8(agentDir,...INSTALLATION_ID_PATH),pendingInstallationId=pendingInstallationIds.get(installationIdPath);if(pendingInstallationId)return pendingInstallationId;let installationId=loadOrCreateInstallationId(installationIdPath);pendingInstallationIds.set(installationIdPath,installationId);try{return await installationId}finally{pendingInstallationIds.get(installationIdPath)===installationId&&pendingInstallationIds.delete(installationIdPath)}}async function loadOrCreateInstallationId(installationIdPath){for(let attempt=0;attempt<INSTALLATION_ID_LOCK_RETRY_ATTEMPTS;attempt+=1){let existing=await readInstallationId(installationIdPath);if(existing)return existing;let claimed=await tryCreateInstallationIdUnderLock(installationIdPath);if(claimed)return claimed;await delay(INSTALLATION_ID_LOCK_RETRY_MS)}throw new Error(`timed out waiting for installation id lock: ${installationIdPath}`)}async function readInstallationId(installationIdPath){try{let existing=(await readFile5(installationIdPath,"utf8")).trim();return UUID_V4_PATTERN.test(existing)?existing:void 0}catch(error){if(!isNodeErrorCode(error,"ENOENT"))throw error;return}}async function tryCreateInstallationIdUnderLock(installationIdPath){await mkdir2(dirname2(installationIdPath),{recursive:!0});let lockPath=`${installationIdPath}${INSTALLATION_ID_LOCK_SUFFIX}`,ownerToken=randomUUID4();try{await mkdir2(lockPath,{mode:448})}catch(error){if(isNodeErrorCode(error,"EEXIST")){await reclaimAbandonedInstallationIdLock(lockPath);return}throw error}let markerPath=join8(lockPath,`${INSTALLATION_ID_LOCK_MARKER_PREFIX}${ownerToken}${INSTALLATION_ID_LOCK_MARKER_SUFFIX}`),markerCreated=!1;try{await writeFile2(markerPath,`${JSON.stringify({ownerToken,pid:process.pid,createdAtMs:Date.now()})}
|
|
16
16
|
`,{encoding:"utf8",mode:384,flag:"wx"}),markerCreated=!0;let existing=await readInstallationId(installationIdPath);if(existing)return existing;let installationId=randomUUID4();return await writeFile2(installationIdPath,`${installationId}
|
|
17
17
|
`,{encoding:"utf8",mode:384}),installationId}finally{markerCreated&&await releaseInstallationIdLock(lockPath,markerPath)}}async function reclaimAbandonedInstallationIdLock(lockPath){let metadata=await readInstallationIdLockMetadata(lockPath);metadata.kind==="missing"||!isReclaimableInstallationIdLock(metadata)||(metadata.markerPath!==void 0&&await unlinkInstallationIdLock(metadata.markerPath),await removeEmptyInstallationIdLock(lockPath))}async function removeEmptyInstallationIdLock(lockPath){try{await rmdir(lockPath)}catch(error){if(isNodeErrorCode(error,"ENOENT")||isNodeErrorCode(error,"ENOTDIR")||isNodeErrorCode(error,"ENOTEMPTY"))return;throw error}}function isReclaimableInstallationIdLock(metadata){switch(metadata.kind){case"abandoned":return!0;case"invalid":return Date.now()-metadata.mtimeMs>=INSTALLATION_ID_INVALID_LOCK_RECLAIM_MS;case"live":case"missing":return!1;default:return metadata}}async function readInstallationIdLockMetadata(lockPath){let lockStat;try{lockStat=await stat3(lockPath)}catch(error){if(isNodeErrorCode(error,"ENOENT"))return{kind:"missing"};throw error}if(!lockStat.isDirectory())return readLegacyInstallationIdLockMetadata(lockPath,lockStat.mtimeMs);let entries;try{entries=await readdir4(lockPath)}catch(error){if(isNodeErrorCode(error,"ENOENT"))return{kind:"missing"};if(isNodeErrorCode(error,"ENOTDIR"))return readLegacyInstallationIdLockMetadata(lockPath);throw error}let markerNames=entries.filter(entry=>entry.startsWith(INSTALLATION_ID_LOCK_MARKER_PREFIX)&&entry.endsWith(INSTALLATION_ID_LOCK_MARKER_SUFFIX));if(markerNames.length===0)return{kind:"invalid",mtimeMs:lockStat.mtimeMs};let invalidMarkerPath,abandonedMarkerPath;for(let markerName of markerNames){let markerPath=join8(lockPath,markerName),metadataResult=await readLockFile(markerPath);if(metadataResult.kind==="metadata"){if(isProcessAlive(metadataResult.metadata.pid))return{kind:"live",markerPath};abandonedMarkerPath??=markerPath;continue}metadataResult.kind==="invalid"&&(invalidMarkerPath??=markerPath)}return abandonedMarkerPath!==void 0?{kind:"abandoned",markerPath:abandonedMarkerPath}:invalidMarkerPath!==void 0?{kind:"invalid",mtimeMs:lockStat.mtimeMs,markerPath:invalidMarkerPath}:{kind:"missing"}}async function readLegacyInstallationIdLockMetadata(lockPath,knownMtimeMs){let metadataResult=await readLockFile(lockPath);if(metadataResult.kind==="missing")return{kind:"missing"};if(metadataResult.kind==="invalid"){if(knownMtimeMs!==void 0)return{kind:"invalid",mtimeMs:knownMtimeMs};try{return{kind:"invalid",mtimeMs:(await stat3(lockPath)).mtimeMs}}catch(error){if(isNodeErrorCode(error,"ENOENT"))return{kind:"missing"};throw error}}return isProcessAlive(metadataResult.metadata.pid)?{kind:"live"}:{kind:"abandoned"}}async function readLockFile(lockPath){try{let parsed=JSON.parse((await readFile5(lockPath,"utf8")).trim());return parseInstallationIdLockMetadata(parsed)}catch(error){if(isNodeErrorCode(error,"ENOENT"))return{kind:"missing"};if(error instanceof SyntaxError||isNodeErrorCode(error,"EISDIR"))return{kind:"invalid"};throw error}}function parseInstallationIdLockMetadata(value){if(!isRecord15(value))return{kind:"invalid"};let{ownerToken,pid,createdAtMs}=value;return typeof ownerToken!="string"||ownerToken.length===0?{kind:"invalid"}:typeof pid!="number"||!Number.isSafeInteger(pid)||pid<=0?{kind:"invalid"}:typeof createdAtMs!="number"||!Number.isFinite(createdAtMs)||createdAtMs<0?{kind:"invalid"}:{kind:"metadata",metadata:{ownerToken,pid,createdAtMs}}}function isProcessAlive(pid){try{return process.kill(pid,0),!0}catch(error){if(isNodeErrorCode(error,"ESRCH"))return!1;if(isNodeErrorCode(error,"EPERM"))return!0;throw error}}async function releaseInstallationIdLock(lockPath,markerPath){await unlinkInstallationIdLock(markerPath),await removeEmptyInstallationIdLock(lockPath)}async function unlinkInstallationIdLock(lockPath){try{await unlink(lockPath)}catch(error){if(!isNodeErrorCode(error,"ENOENT")&&!isNodeErrorCode(error,"ENOTDIR"))throw error}}function isNodeErrorCode(error,code){return error instanceof Error&&"code"in error&&error.code===code}function parseModelListParams(params){if(!isRecord15(params))return{};let cursor=params.cursor;if(cursor!=null&&typeof cursor!="string")throw new RpcHandlerError({code:-32600,message:"model/list received an invalid cursor"});let limit=params.limit;if(limit!=null&&(typeof limit!="number"||!Number.isInteger(limit)||limit<0||limit>4294967295))throw new RpcHandlerError({code:-32600,message:"model/list received an invalid limit"});let includeHidden=params.includeHidden;if(includeHidden!=null&&typeof includeHidden!="boolean")throw new RpcHandlerError({code:-32600,message:"model/list received an invalid includeHidden"});return{cursor,limit,includeHidden:includeHidden===!0}}function parseRemoteControlClientListParams(params){if(!isRecord15(params))throw invalidRemoteControlParams("remoteControl/client/list requires params");let environmentId=params.environmentId;if(typeof environmentId!="string")throw invalidRemoteControlParams("remoteControl/client/list requires a string environmentId");let cursor=params.cursor;if(cursor!=null&&typeof cursor!="string")throw invalidRemoteControlParams("remoteControl/client/list received an invalid cursor");let limit=params.limit;if(limit!=null&&(typeof limit!="number"||!Number.isInteger(limit)||limit<0||limit>4294967295))throw invalidRemoteControlParams("remoteControl/client/list received an invalid limit");let order=params.order;if(order!=null&&order!=="asc"&&order!=="desc")throw invalidRemoteControlParams("remoteControl/client/list received an invalid order");return{environmentId,cursor,limit,order}}function invalidRemoteControlParams(message){return new RpcHandlerError({code:-32600,message})}function isRecord15(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}var ServerCore=class{constructor(options={}){this.connections=new Map,this.activeDispatch=new AsyncLocalStorage,this.registry=options.registry??createRegistry(),this.codexHome=options.codexHome??getAgentDir(),this.version=options.version??VERSION,this.now=options.now??Date.now,registerAppServerModelMethods(this.registry,{modelRegistry:options.modelRegistry,agentDir:this.codexHome}),registerAppServerCatalogMethods(this.registry,{modelRegistry:options.modelRegistry,agentDir:this.codexHome,serverCwd:options.serverCwd,threads:options.threads}),registerAppServerConfigMethods(this.registry,{agentDir:this.codexHome,serverCwd:options.serverCwd}),registerAppServerAccountMethods(this.registry,{agentDir:this.codexHome}),registerAppServerSkillMethods(this.registry,{agentDir:this.codexHome,serverCwd:options.serverCwd,threads:options.threads})}addConnection(input){let connection=createConnection(input);return this.connections.set(connection.id,connection),this.subscribeToProviderAccountEvents(),connection}removeConnection(id){this.connections.delete(id),this.connections.size===0&&(this.unsubscribeProviderAccountEvents?.(),this.unsubscribeProviderAccountEvents=void 0)}getConnection(id){return this.connections.get(id)}registerMethod(method,registration){this.registry.register(method,registration)}deferUntilResponded(connectionId2,action){let dispatch=this.activeDispatch.getStore();return dispatch?.connectionId!==connectionId2||!this.connections.has(connectionId2)?!1:(dispatch.actions.push(action),!0)}async receive(connectionId2,envelope){let connection=this.connections.get(connectionId2);if(connection)switch(envelope.kind){case"request":await this.respondToRequest(connection,envelope.message);return;case"notification":this.handleNotification(envelope.message);return;case"response":return;case"protocol-invalid":await connection.send({id:null,error:invalidRequestError()});return;default:return assertNever3(envelope)}}async sendNotificationToConnection(connectionId2,notification){let connection=this.connections.get(connectionId2);return!connection||!canDeliverNotification(connection,notification)?!1:(await connection.send(populateNotificationEnvelope(notification,this.now())),!0)}async broadcastNotification(notification){let delivered=0,envelope=populateNotificationEnvelope(notification,this.now());for(let connection of this.connections.values())canDeliverNotification(connection,envelope)&&(await connection.send(envelope),delivered+=1);return delivered}subscribeToProviderAccountEvents(){this.unsubscribeProviderAccountEvents||(this.unsubscribeProviderAccountEvents=subscribeProviderAccountEvents(event=>{let notification=providerAccountEventNotification(event),send=async()=>{await this.broadcastNotification(notification)},dispatch=this.activeDispatch.getStore();dispatch&&this.deferUntilResponded(dispatch.connectionId,send)||send()}))}async respondToRequest(connection,request){let dispatch={connectionId:connection.id,actions:[]},response=await this.activeDispatch.run(dispatch,()=>this.dispatchRequest(connection,request));try{await connection.send(response)}catch(error){throw dispatch.actions.length=0,error}if("error"in response||this.connections.get(connection.id)!==connection){dispatch.actions.length=0;return}let actions=dispatch.actions.splice(0);for(let action of actions)await action()}async dispatchRequest(connection,request){return request.method==="initialize"?this.handleInitialize(connection,request):this.registry.dispatch(connection,request)}handleInitialize(connection,request){if(connection.initialized)return{id:request.id,error:alreadyInitializedError()};let params=parseInitializeParams(request.params);if(!params)return{id:request.id,error:invalidParamsError()};let initialized=connection.initialize(params,this.version);switch(initialized.kind){case"initialized":return{id:request.id,result:buildInitializeResponse(connection,this.codexHome)};case"already-initialized":return{id:request.id,error:alreadyInitializedError()};default:return assertNever3(initialized)}}handleNotification(notification){notification.method}};function assertNever3(value){throw new Error(`Unhandled app-server envelope kind: ${JSON.stringify(value)}`)}function createModeTurnStore(threads){return new ModeTurnStore(threads)}function turnStartParams(request){let params=objectParams2(request);return{threadId:requiredStringParam(params.threadId,"threadId"),clientUserMessageId:optionalNullableStringParam(params.clientUserMessageId,"clientUserMessageId"),input:userInputArrayParam(params.input)}}function turnSteerParams(request){let params=objectParams2(request);return{threadId:requiredStringParam(params.threadId,"threadId"),expectedTurnId:requiredStringParam(params.expectedTurnId,"expectedTurnId"),clientUserMessageId:optionalNullableStringParam(params.clientUserMessageId,"clientUserMessageId"),input:userInputArrayParam(params.input)}}function turnInterruptParams(request){let params=objectParams2(request);return{threadId:requiredStringParam(params.threadId,"threadId"),turnId:requiredStringParam(params.turnId,"turnId")}}function createRoutedServerCore(registry,notifications,approvals,onThreadSubscribersEmpty,options={},userInput){return new RoutedServerCore(registry,notifications,approvals,onThreadSubscribersEmpty,options,userInput)}function registerLoadedThreadObjectListHandler(registry,threads){registry.register("thread/loaded/list",{scope:"thread",handler:context=>{let params=objectValue(context.request.params),cursor=decodeCursor(optionalString2(params.cursor)??null),limit=optionalNumber(params.limit)??Number.POSITIVE_INFINITY,loaded=threads.listLoaded().map(thread=>thread.id),data=loaded.slice(cursor,cursor+limit),nextOffset=cursor+data.length;return{data,nextCursor:nextOffset<loaded.length?encodeCursor(nextOffset):null}}})}var RoutedServerCore=class extends ServerCore{constructor(registry,notifications,approvals,onThreadSubscribersEmpty,options={},userInput){super({...options,registry}),this.notifications=notifications,this.approvals=approvals,this.userInput=userInput,this.onThreadSubscribersEmpty=onThreadSubscribersEmpty}addConnection(input){let connection=super.addConnection(input);return this.notifications.addConnection({id:connection.id,get initialized(){return connection.initialized},get transport(){return routerTransport(connection.transportKind)},get capabilities(){return connection.capabilities},get optOutNotificationMethods(){return[...connection.optOutNotificationMethods]},send:message=>connection.send(message),close:()=>{connection.close("slow-client")}}),connection}removeConnection(id){let emptiedThreadIds=this.notifications.removeConnection(id);super.removeConnection(id);for(let threadId of emptiedThreadIds)this.onThreadSubscribersEmpty?.(threadId)}async receive(connectionId2,envelope){let connection=this.getConnection(connectionId2);if(connection?.initialized&&this.userInput)try{if(envelope.kind==="notification"&&envelope.message.method===ADDITIVE_CLIENT_NOTIFICATION_METHODS[0]){this.userInput.progress(envelope.message.params);return}if(envelope.kind==="response"&&envelope.message.id!==null){let response={...envelope.message,id:envelope.message.id};if(this.userInput.resolveResponse(response)||this.resolveApproval(response))return;await connection.send({id:envelope.message.id,error:{code:-32600,message:"Unknown server request id"}});return}}catch(error){if(!(error instanceof UserInputProtocolError))throw error;await connection.send({id:envelope.kind==="response"?envelope.message.id:null,error:{code:-32602,message:error.message}});return}!this.userInput&&envelope.kind==="response"&&this.resolveApproval(envelope.message)||await super.receive(connectionId2,envelope)}resolveApproval(response){let id=response.id;return id===null?!1:"result"in response?this.approvals.resolveResponse({id,result:response.result}):this.approvals.resolveResponse({id,error:response.error})}},ModeTurnStore=class{constructor(threads){this.threads=threads}getLoadedThread(threadId){return new ModeTurnThreadEntry(this.threads.getLoadedThread(threadId))}runThreadTask(threadId,task){return this.threads.runThreadTask(threadId,task)}},ModeTurnThreadEntry=class{constructor(entry){this.entry=entry,this.sessionAdapter=new ModeTurnSession(entry.session)}get id(){return this.entry.id}get cwd(){return this.entry.cwd}get session(){return this.sessionAdapter}get activeTurn(){return this.entry.activeTurn}set activeTurn(value){this.entry.activeTurn=value}get status(){return this.entry.status}set status(value){this.entry.status=value}get updatedAt(){return this.entry.updatedAt}set updatedAt(value){this.entry.updatedAt=value}},ModeTurnSession=class{constructor(session){this.session=session}prompt(text,options){return this.session.prompt(text,options)}steer(text,options){return this.session.steer(text,void 0,{source:options?.source??"rpc"})}abort(){return this.session.abort()}subscribe(listener){return this.session.subscribe(listener)}};function objectParams2(request){if(typeof request.params=="object"&&request.params!==null&&!Array.isArray(request.params))return Object.fromEntries(Object.entries(request.params));throw new TurnEngineError({code:-32602,message:"Invalid params"})}function requiredStringParam(value,name){if(typeof value!="string"||value.length===0)throw new TurnEngineError({code:-32602,message:`Invalid params: ${name} is required`});return value}function optionalNullableStringParam(value,name){if(value==null)return value;if(typeof value!="string")throw new TurnEngineError({code:-32602,message:`Invalid params: ${name} must be a string`});return value}function userInputArrayParam(value){if(!Array.isArray(value))throw new TurnEngineError({code:-32602,message:"Invalid params: input must be an array"});return value.map(userInputParam)}function userInputParam(value){if(typeof value!="object"||value===null||Array.isArray(value))throw new TurnEngineError({code:-32602,message:"Invalid params: input item must be an object"});let item=Object.fromEntries(Object.entries(value)),type2=item.type;switch(type2){case"text":return{type:type2,text:requiredStringParam(item.text,"input.text"),text_elements:Array.isArray(item.text_elements)?item.text_elements:[]};case"image":return{type:type2,url:requiredStringParam(item.url,"input.url")};case"localImage":return{type:type2,path:requiredStringParam(item.path,"input.path")};case"skill":case"mention":return{type:type2,name:requiredStringParam(item.name,"input.name"),path:requiredStringParam(item.path,"input.path")};default:throw new TurnEngineError({code:-32602,message:"Invalid params: unsupported input item type"})}}function routerTransport(transport){switch(transport){case"stdio":return"stdio";case"websocket":return"ws";case"unix":return"unix"}}function createAppServerRuntime(requestShutdown){let notifications=new NotificationRouter,registry=createRegistry(),fuzzySearch=new FuzzyFileSearchService({broadcast:notification=>notifications.broadcast(notification)});registerFuzzyFileSearchMethods(registry,fuzzySearch);let threads,processMcpWireStatusAdapter=createProcessMcpWireStatusAdapter({agentDir:getAgentDir(),cwd:process.cwd(),env:process.env}),sendToSubscribers=(threadId,message)=>{let subscriberCount=0;try{subscriberCount=threads.getLoadedThread(threadId).subscribers.size}catch(error){if(error instanceof ThreadNotFoundError)return 0;throw error}return notifications.toThread(threadId,message),subscriberCount},approvals=new ApprovalBridge(sendToSubscribers),userInput=new UserInputBridge(sendToSubscribers),lifecycle;threads=new ThreadRegistry({agentDir:getAgentDir(),sessionDir:process.env[ENV_SESSION_DIR],createSession:options=>createBoundAppServerSession(options,approvals,notifications,requestShutdown,userInput,threadId=>{try{return threads.getLoadedThread(threadId).activeTurn?.turnId??"turn-user-input"}catch(error){if(error instanceof ThreadNotFoundError)return"turn-user-input";throw error}}),mcpWireStatusAdapter:processMcpWireStatusAdapter}),registerExtensionRequestMethod(registry,threadId=>threads.getLoadedThread(threadId).session);let core=createRoutedServerCore(registry,notifications,approvals,threadId=>{lifecycle?.scheduleIdleUnloadForThread(threadId)},{codexHome:getAgentDir(),serverCwd:process.cwd(),threads},userInput);registerAppServerSkillMethods(registry,{agentDir:getAgentDir(),serverCwd:process.cwd(),threads,resourceLoaderFactory:async cwd=>{let loader=new DefaultResourceLoader({cwd,agentDir:getAgentDir()});return await loader.reload(),loader}});let turnLog=new TurnLog,turns=createTurnEngine({store:createModeTurnStore(threads),turnLog,emitToThread:(threadId,notification)=>notifications.toThread(threadId,notification),broadcast:notification=>notifications.broadcast(notification)});return registerTurnHandlers(registry,turns,core),lifecycle=registerThreadLifecycleHandlers(registry,{threads,turnLog,notifications,deferUntilResponded:(connectionId2,action)=>core.deferUntilResponded(connectionId2,action),observeThread:threadId=>turns.observeThread(threadId),idleUnloadMinutes:30,replayPendingApprovals:threadId=>{approvals.replayPendingForThread(threadId),userInput.replayPendingForThread(threadId)}}),registerLoadedThreadObjectListHandler(registry,threads),{core,threads,turnLog,turns,dispose:()=>{for(let thread of threads.listLoaded())userInput.cancelPendingForThread(thread.id);fuzzySearch.dispose(),lifecycle?.dispose()}}}async function createBoundAppServerSession(options,approvals,notifications,requestShutdown,userInput,getTurnId){let result=await createAgentSession(options),threadId=result.session.sessionId,initialNotifications=[],bindingExtensions=!0;result.session.extensionRunner.onRpcEvent(({name,data})=>{let notification={method:"extension_event",params:{type:"extension_event",name,data,threadId}};if(bindingExtensions){initialNotifications.push(notification);return}notifications.toThread(threadId,notification)}),await result.session.bindExtensions({uiContext:createAppServerUIContext(approvals,threadId,userInput,()=>getTurnId(threadId)),mode:"app-server",shutdownHandler:()=>requestShutdown("extension shutdown"),onError:error=>{notifications.toThread(threadId,{method:"error",params:error})}}),bindingExtensions=!1;let mcpService=getMcpService(),mcpWireStatusAdapter=createMcpWireStatusAdapter(mcpService.getWireStatusSnapshot(threadId));return mcpWireStatusAdapter.bindLiveUpdates(mcpService.onWireStatusChanged((sessionId,snapshot)=>{sessionId===threadId&&mcpWireStatusAdapter.update(snapshot)})),result.session.subscribe(event=>{event.type==="agent_end"&&(approvals.cancelPendingForThread(threadId),userInput.cancelPendingForThread(threadId))}),{...result,initialNotifications,mcpWireStatusAdapter}}function registerTurnHandlers(registry,turns,core){let deferForResponse=async(connection,run)=>{let actions=[],result=await run(action=>(actions.push(action),!0));for(let action of actions)core.deferUntilResponded(connectionId(connection),action);return result};registry.register("turn/start",{scope:"thread",handler:context=>deferForResponse(context.connection,defer=>turns.startTurn(turnStartParams(context.request),defer))}),registry.register("turn/steer",{scope:"thread",handler:context=>turns.steerTurn(turnSteerParams(context.request))}),registry.register("turn/interrupt",{scope:"thread",handler:context=>deferForResponse(context.connection,defer=>turns.interruptTurn(turnInterruptParams(context.request),defer))})}function messageWithoutJsonrpc(message){return"method"in message?"id"in message?"params"in message?{id:message.id,method:message.method,params:message.params}:{id:message.id,method:message.method}:{method:message.method,..."params"in message?{params:message.params}:{},..."emittedAtMs"in message?{emittedAtMs:message.emittedAtMs}:{}}:"result"in message?{id:message.id,result:message.result}:{id:message.id,error:"data"in message.error?{code:message.error.code,message:message.error.message,data:message.error.data}:{code:message.error.code,message:message.error.message}}}function serializeNdjsonMessage(message){let serialized=JSON.stringify(messageWithoutJsonrpc(message));if(serialized===void 0)throw new Error("JSON-RPC message did not serialize to an object");if(serialized.includes(`
|
|
18
18
|
`))throw new Error("JSON-RPC NDJSON payload must not contain a raw newline");return`${serialized}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
+
import{AzureOpenAI}from"./chunk-CD2HJK4C.js";import{clampOpenAIPromptCacheKey}from"./chunk-AEJUOQ7U.js";import{convertResponsesMessages,convertResponsesTools,processResponsesStream}from"./chunk-6KXIFAMC.js";import{formatProviderError,normalizeProviderError}from"./chunk-PRC5XIIH.js";import{getPiUserAgent}from"./chunk-QTG7MY2X.js";import{retryProviderRequest}from"./chunk-ZTVQY5V6.js";import{buildBaseOptions}from"./chunk-AJ722VIQ.js";import"./chunk-BPX6QWPD.js";import{clampThinkingLevel,createGrammarToolInputProperties,supportsMax}from"./chunk-DY6FUAWH.js";import"./chunk-WDTJ6JKE.js";import{getProviderEnvValue}from"./chunk-5ROMKDLK.js";import"./chunk-3W47LTXQ.js";import{AssistantMessageEventStream}from"./chunk-DMI55M2N.js";import{headersToRecord}from"./chunk-BQVVQ2LQ.js";import"./chunk-IKOFCODM.js";var DEFAULT_AZURE_API_VERSION="v1",AZURE_TOOL_CALL_PROVIDERS=new Set(["openai","chatgpt-subscription","opencode","azure-openai-responses"]),OPENAI_RESPONSES_MIN_OUTPUT_TOKENS=16;function parseDeploymentNameMap(value){let map=new Map;if(!value)return map;for(let entry of value.split(",")){let trimmed=entry.trim();if(!trimmed)continue;let[modelId,deploymentName]=trimmed.split("=",2);!modelId||!deploymentName||map.set(modelId.trim(),deploymentName.trim())}return map}function resolveDeploymentName(model,options){return options?.azureDeploymentName?options.azureDeploymentName:parseDeploymentNameMap(getProviderEnvValue("AZURE_OPENAI_DEPLOYMENT_NAME_MAP",options?.env)).get(model.id)||model.id}function formatAzureOpenAIError(error){return formatProviderError(normalizeProviderError(error),"Azure OpenAI API error")}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream;return(async()=>{let deploymentName=resolveDeploymentName(model,options),output={role:"assistant",content:[],api:"azure-openai-responses",provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};try{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let client=createClient(model,apiKey,options),grammarToolInputProperties=createGrammarToolInputProperties(context.tools,model.compat?.supportsOpenAIGrammarTools??!1),params=buildParams(model,context,options,deploymentName,grammarToolInputProperties),nextParams=await options?.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams);let requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},{data:openaiStream,response}=await retryProviderRequest(()=>client.responses.create(params,requestOptions).withResponse(),{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});if(await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),stream2.push({type:"start",partial:output}),await processResponsesStream(openaiStream,output,stream2,model,{grammarToolInputProperties}),options?.signal?.aborted)throw new Error("Request was aborted");if(output.stopReason==="pending")throw new Error("Azure OpenAI Responses stream ended without a stop reason");if(output.stopReason==="aborted"||output.stopReason==="error")throw new Error(output.errorMessage||"An unknown error occurred");stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)delete block.index,delete block.partialJson,delete block.customInput;output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatAzureOpenAIError(error),stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end()}})(),stream2},streamSimple=(model,context,options)=>{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let base={...buildBaseOptions(model,context,options,apiKey),toolChoice:options?.toolChoice},clampedReasoning=options?.reasoning?clampThinkingLevel(model,options.reasoning):void 0,reasoningEffort=clampedReasoning==="off"?void 0:clampedReasoning==="max"&&supportsMax(model)?"max":clampedReasoning==="max"?"high":clampedReasoning;return stream(model,context,{...base,reasoningEffort})};function normalizeAzureBaseUrl(baseUrl){let trimmed=baseUrl.trim().replace(/\/+$/,""),url;try{url=new URL(trimmed)}catch{throw new Error(`Invalid Azure OpenAI base URL: ${baseUrl}`)}let isAzureHost=url.hostname.endsWith(".openai.azure.com")||url.hostname.endsWith(".cognitiveservices.azure.com")||url.hostname.endsWith(".ai.azure.com"),normalizedPath=url.pathname.replace(/\/+$/,"");return isAzureHost&&(normalizedPath===""||normalizedPath==="/"||normalizedPath==="/openai"||normalizedPath==="/openai/v1/responses")&&(url.pathname="/openai/v1",url.search=""),url.toString().replace(/\/+$/,"")}function buildDefaultBaseUrl(resourceName){return`https://${resourceName}.openai.azure.com/openai/v1`}function resolveAzureConfig(model,options){let apiVersion=options?.azureApiVersion||getProviderEnvValue("AZURE_OPENAI_API_VERSION",options?.env)||DEFAULT_AZURE_API_VERSION,baseUrl=options?.azureBaseUrl?.trim()||getProviderEnvValue("AZURE_OPENAI_BASE_URL",options?.env)?.trim()||void 0,resourceName=options?.azureResourceName||getProviderEnvValue("AZURE_OPENAI_RESOURCE_NAME",options?.env),resolvedBaseUrl=baseUrl;if(!resolvedBaseUrl&&resourceName&&(resolvedBaseUrl=buildDefaultBaseUrl(resourceName)),!resolvedBaseUrl&&model.baseUrl&&(resolvedBaseUrl=model.baseUrl),!resolvedBaseUrl)throw new Error("Azure OpenAI base URL is required. Set AZURE_OPENAI_BASE_URL or AZURE_OPENAI_RESOURCE_NAME, or pass azureBaseUrl, azureResourceName, or model.baseUrl.");return{baseUrl:normalizeAzureBaseUrl(resolvedBaseUrl),apiVersion}}function createClient(model,apiKey,options){let headers={"User-Agent":getPiUserAgent(),...model.headers};options?.headers&&Object.assign(headers,options.headers);let{baseUrl,apiVersion}=resolveAzureConfig(model,options);return new AzureOpenAI({apiKey,apiVersion,dangerouslyAllowBrowser:!0,fetch:options?.fetch,defaultHeaders:headers,baseURL:baseUrl})}function buildParams(model,context,options,deploymentName,grammarToolInputProperties=createGrammarToolInputProperties(context.tools,model.compat?.supportsOpenAIGrammarTools??!1)){let requestedReasoningEffort=options?.reasoningEffort??(options?.reasoningSummary?"medium":void 0),mappedReasoningEffort=requestedReasoningEffort===void 0?void 0:model.thinkingLevelMap?.[requestedReasoningEffort],reasoningEffort=mappedReasoningEffort===void 0?requestedReasoningEffort:mappedReasoningEffort,reasoningRequested=reasoningEffort!=null,reasoningUnavailable=reasoningEffort===null,messages=convertResponsesMessages(model,context,AZURE_TOOL_CALL_PROVIDERS,{grammarToolInputProperties}),params={model:deploymentName,input:messages,stream:!0,...(options?.cacheRetention??model.cacheRetention)==="none"?{}:{prompt_cache_key:clampOpenAIPromptCacheKey(options?.sessionId)},store:!1};return options?.maxTokens&&(params.max_output_tokens=Math.max(options.maxTokens,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS)),options?.temperature!==void 0&&(params.temperature=options?.temperature),context.tools&&context.tools.length>0&&(params.tools=convertResponsesTools(context.tools,{supportsStrictMode:model.compat?.supportsStrictMode??!0,supportsOpenAIGrammarTools:model.compat?.supportsOpenAIGrammarTools??!1})),options?.toolChoice!==void 0&&(params.tool_choice=options.toolChoice),model.reasoning&&(reasoningRequested?(params.reasoning={effort:reasoningEffort,...options?.reasoningSummary===null?{}:{summary:options?.reasoningSummary||"auto"}},params.include=["reasoning.encrypted_content"]):!reasoningUnavailable&&model.thinkingLevelMap?.off!==null&&(params.reasoning={effort:model.thinkingLevelMap?.off??"none"})),options?.samplingParams&&Object.assign(params,options.samplingParams),params}export{stream,streamSimple};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
+
var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var CHATGPT_SUBSCRIPTION_AUTH_CLAIM_PATH="https://api.openai.com/auth";function extractChatGptSubscriptionAccountId(token){try{let parts=token.split("."),encodedPayload=parts.length===3?parts[1]:void 0;if(!encodedPayload)return;let base64=encodedPayload.replaceAll("-","+").replaceAll("_","/"),payload=JSON.parse(atob(base64.padEnd(Math.ceil(base64.length/4)*4,"=")));if(!payload||typeof payload!="object")return;let auth=Reflect.get(payload,CHATGPT_SUBSCRIPTION_AUTH_CLAIM_PATH);if(!auth||typeof auth!="object")return;let accountId=Reflect.get(auth,"chatgpt_account_id");return typeof accountId=="string"&&accountId.length>0?accountId:void 0}catch{return}}var procEnvCache=null;function getBunSandboxEnvValue(name){if(!(typeof process>"u"||!process.versions?.bun||Object.keys(process.env).length>0)){if(procEnvCache===null){procEnvCache=new Map;try{let{readFileSync}=__require("node:fs"),data=readFileSync("/proc/self/environ","utf-8");for(let entry of data.split("\0")){let idx=entry.indexOf("=");idx>0&&procEnvCache.set(entry.slice(0,idx),entry.slice(idx+1))}}catch{}}return procEnvCache.get(name)}}function getProviderEnvValue(name,env){return env?.[name]||(typeof process<"u"?process.env[name]:void 0)||getBunSandboxEnvValue(name)||void 0}var DEFAULT_WIRE_IDENTITY="senpi",wireIdentity=DEFAULT_WIRE_IDENTITY;function getWireIdentity(){return wireIdentity}var CANCEL_MESSAGE="Login cancelled",TIMEOUT_MESSAGE="Device flow timed out",SLOW_DOWN_TIMEOUT_MESSAGE="Device flow timed out after one or more slow_down responses. This is often caused by clock drift in WSL or VM environments. Please sync or restart the VM clock and try again.";function abortableSleep(ms,signal,cancelMessage){return new Promise((resolve,reject)=>{if(signal.aborted){reject(new Error(cancelMessage));return}let onAbort=()=>{clearTimeout(timeout),reject(new Error(cancelMessage))},timeout=setTimeout(()=>{signal.removeEventListener("abort",onAbort),resolve()},ms);signal.addEventListener("abort",onAbort,{once:!0})})}async function pollOAuthDeviceCodeFlow(options){let deadline=typeof options.expiresInSeconds=="number"?Date.now()+options.expiresInSeconds*1e3:Number.POSITIVE_INFINITY,intervalMs=Math.max(1e3,Math.floor((options.intervalSeconds??5)*1e3)),slowDownResponses=0;if(options.waitBeforeFirstPoll){let remainingMs=deadline-Date.now();remainingMs>0&&await abortableSleep(Math.min(intervalMs,remainingMs),options.signal,CANCEL_MESSAGE)}for(;Date.now()<deadline;){if(options.signal.aborted)throw new Error(CANCEL_MESSAGE);let result=await options.poll();if(result.status==="complete")return result.value;if(result.status==="failed")throw new Error(result.message);result.status==="slow_down"&&(slowDownResponses+=1,intervalMs=typeof result.intervalSeconds=="number"&&Number.isFinite(result.intervalSeconds)&&result.intervalSeconds>0?Math.max(1e3,Math.floor(result.intervalSeconds*1e3)):Math.max(1e3,intervalMs+5e3));let remainingMs=deadline-Date.now();if(remainingMs<=0)break;await abortableSleep(Math.min(intervalMs,remainingMs),options.signal,CANCEL_MESSAGE)}throw new Error(slowDownResponses>0?SLOW_DOWN_TIMEOUT_MESSAGE:TIMEOUT_MESSAGE)}var LOGO_SVG='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800" aria-hidden="true"><path fill="#fff" fill-rule="evenodd" d="M165.29 165.29 H517.36 V400 H400 V517.36 H282.65 V634.72 H165.29 Z M282.65 282.65 V400 H400 V282.65 Z"/><path fill="#fff" d="M517.36 400 H634.72 V634.72 H517.36 Z"/></svg>';function escapeHtml(value){return value.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function renderPage(options){let title=escapeHtml(options.title),heading=escapeHtml(options.heading),message=escapeHtml(options.message),details=options.details?escapeHtml(options.details):void 0;return`<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
7
|
+
<title>${title}</title>
|
|
8
|
+
<style>
|
|
9
|
+
:root {
|
|
10
|
+
--text: #fafafa;
|
|
11
|
+
--text-dim: #a1a1aa;
|
|
12
|
+
--page-bg: #09090b;
|
|
13
|
+
--font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
|
14
|
+
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
15
|
+
}
|
|
16
|
+
* { box-sizing: border-box; }
|
|
17
|
+
html { color-scheme: dark; }
|
|
18
|
+
body {
|
|
19
|
+
margin: 0;
|
|
20
|
+
min-height: 100vh;
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
justify-content: center;
|
|
24
|
+
padding: 24px;
|
|
25
|
+
background: var(--page-bg);
|
|
26
|
+
color: var(--text);
|
|
27
|
+
font-family: var(--font-sans);
|
|
28
|
+
text-align: center;
|
|
29
|
+
}
|
|
30
|
+
main {
|
|
31
|
+
width: 100%;
|
|
32
|
+
max-width: 560px;
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
align-items: center;
|
|
36
|
+
justify-content: center;
|
|
37
|
+
}
|
|
38
|
+
.logo {
|
|
39
|
+
width: 72px;
|
|
40
|
+
height: 72px;
|
|
41
|
+
display: block;
|
|
42
|
+
margin-bottom: 24px;
|
|
43
|
+
}
|
|
44
|
+
h1 {
|
|
45
|
+
margin: 0 0 10px;
|
|
46
|
+
font-size: 28px;
|
|
47
|
+
line-height: 1.15;
|
|
48
|
+
font-weight: 650;
|
|
49
|
+
color: var(--text);
|
|
50
|
+
}
|
|
51
|
+
p {
|
|
52
|
+
margin: 0;
|
|
53
|
+
line-height: 1.7;
|
|
54
|
+
color: var(--text-dim);
|
|
55
|
+
font-size: 15px;
|
|
56
|
+
}
|
|
57
|
+
.details {
|
|
58
|
+
margin-top: 16px;
|
|
59
|
+
font-family: var(--font-mono);
|
|
60
|
+
font-size: 13px;
|
|
61
|
+
color: var(--text-dim);
|
|
62
|
+
white-space: pre-wrap;
|
|
63
|
+
word-break: break-word;
|
|
64
|
+
}
|
|
65
|
+
</style>
|
|
66
|
+
</head>
|
|
67
|
+
<body>
|
|
68
|
+
<main>
|
|
69
|
+
<div class="logo">${LOGO_SVG}</div>
|
|
70
|
+
<h1>${heading}</h1>
|
|
71
|
+
<p>${message}</p>
|
|
72
|
+
${details?`<div class="details">${details}</div>`:""}
|
|
73
|
+
</main>
|
|
74
|
+
</body>
|
|
75
|
+
</html>`}function oauthSuccessHtml(message){return renderPage({title:"Authentication successful",heading:"Authentication successful",message})}function oauthErrorHtml(message,details){return renderPage({title:"Authentication failed",heading:"Authentication failed",message,details})}function base64urlEncode(bytes){let binary="";for(let byte of bytes)binary+=String.fromCharCode(byte);return btoa(binary).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function generatePKCE(){let verifierBytes=new Uint8Array(32);crypto.getRandomValues(verifierBytes);let verifier=base64urlEncode(verifierBytes),data=new TextEncoder().encode(verifier),hashBuffer=await crypto.subtle.digest("SHA-256",data),challenge=base64urlEncode(new Uint8Array(hashBuffer));return{verifier,challenge}}var _randomBytes=null,_http=null;typeof process<"u"&&(process.versions?.node||process.versions?.bun)&&(import("node:crypto").then(m=>{_randomBytes=m.randomBytes}),import("node:http").then(m=>{_http=m}));var CLIENT_ID="app_EMoamEEZ73f0CkXaXp7hrann",AUTH_BASE_URL="https://auth.openai.com",AUTHORIZE_URL=`${AUTH_BASE_URL}/oauth/authorize`,TOKEN_URL=`${AUTH_BASE_URL}/oauth/token`,REDIRECT_URI="http://localhost:1455/auth/callback",DEVICE_USER_CODE_URL=`${AUTH_BASE_URL}/api/accounts/deviceauth/usercode`,DEVICE_TOKEN_URL=`${AUTH_BASE_URL}/api/accounts/deviceauth/token`,DEVICE_VERIFICATION_URI=`${AUTH_BASE_URL}/codex/device`,DEVICE_REDIRECT_URI=`${AUTH_BASE_URL}/deviceauth/callback`,DEVICE_CODE_TIMEOUT_SECONDS=900,CHATGPT_SUBSCRIPTION_BROWSER_LOGIN_METHOD="browser",CHATGPT_SUBSCRIPTION_DEVICE_CODE_LOGIN_METHOD="device_code",SCOPE="openid profile email offline_access";function getCallbackHost(){return getProviderEnvValue("PI_OAUTH_CALLBACK_HOST")||"127.0.0.1"}function createState(){if(!_randomBytes)throw new Error("ChatGPT Subscription OAuth is only available in Node.js environments");return _randomBytes(16).toString("hex")}function parseAuthorizationInput(input){let value=input.trim();if(!value)return{};try{let url=new URL(value);return{code:url.searchParams.get("code")??void 0,state:url.searchParams.get("state")??void 0}}catch{}if(value.includes("#")){let[code,state]=value.split("#",2);return{code,state}}if(value.includes("code=")){let params=new URLSearchParams(value);return{code:params.get("code")??void 0,state:params.get("state")??void 0}}return{code:value}}async function fetchWithLoginCancellation(input,init){try{return await fetch(input,init)}catch(error){throw init.signal?.aborted?new Error("Login cancelled"):error}}async function readTokenResponse(response,operation){if(!response.ok){let text=await response.text().catch(()=>"");throw new Error(`ChatGPT Subscription token ${operation} failed (${response.status}): ${text||response.statusText}`)}let json=await response.json();if(!json?.access_token||!json.refresh_token||typeof json.expires_in!="number")throw new Error(`ChatGPT Subscription token ${operation} response missing fields: ${JSON.stringify(json)}`);return{access:json.access_token,refresh:json.refresh_token,expires:Date.now()+json.expires_in*1e3}}async function exchangeAuthorizationCode(code,verifier,redirectUri,signal){let response=await fetchWithLoginCancellation(TOKEN_URL,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:CLIENT_ID,code,code_verifier:verifier,redirect_uri:redirectUri}),signal});return readTokenResponse(response,"exchange")}async function refreshAccessToken(refreshToken,signal){let response;try{response=await fetch(TOKEN_URL,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:refreshToken,client_id:CLIENT_ID}),signal})}catch(error){throw new Error(`ChatGPT Subscription token refresh error: ${error instanceof Error?error.message:String(error)}`)}return readTokenResponse(response,"refresh")}async function startChatGptSubscriptionDeviceAuth(signal){let response=await fetchWithLoginCancellation(DEVICE_USER_CODE_URL,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:CLIENT_ID}),signal});if(!response.ok){if(response.status===404)throw new Error("ChatGPT Subscription device code login is not enabled for this server. Use browser login or verify the server URL.");let responseBody=await response.text().catch(()=>"");throw new Error(`ChatGPT Subscription device code request failed with status ${response.status}${responseBody?`: ${responseBody}`:""}`)}let json=await response.json(),intervalSeconds=typeof json?.interval=="string"?Number(json.interval.trim()):json?.interval;if(!json?.device_auth_id||!json.user_code||typeof intervalSeconds!="number"||!Number.isFinite(intervalSeconds)||intervalSeconds<0)throw new Error(`Invalid ChatGPT Subscription device code response: ${JSON.stringify(json)}`);return{deviceAuthId:json.device_auth_id,userCode:json.user_code,intervalSeconds}}async function pollChatGptSubscriptionDeviceAuth(device,signal){return pollOAuthDeviceCodeFlow({intervalSeconds:device.intervalSeconds,expiresInSeconds:DEVICE_CODE_TIMEOUT_SECONDS,signal,poll:async()=>{let response=await fetchWithLoginCancellation(DEVICE_TOKEN_URL,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({device_auth_id:device.deviceAuthId,user_code:device.userCode}),signal});if(response.ok){let json=await response.json();return!json?.authorization_code||!json.code_verifier?{status:"failed",message:`Invalid ChatGPT Subscription device auth token response: ${JSON.stringify(json)}`}:{status:"complete",value:{authorizationCode:json.authorization_code,codeVerifier:json.code_verifier}}}if(response.status===403||response.status===404)return{status:"pending"};let responseBody=await response.text().catch(()=>""),errorCode;try{let error=JSON.parse(responseBody)?.error;errorCode=typeof error=="object"?error?.code:error}catch{}return errorCode==="deviceauth_authorization_pending"?{status:"pending"}:errorCode==="slow_down"?{status:"slow_down"}:{status:"failed",message:`ChatGPT Subscription device auth failed with status ${response.status}${responseBody?`: ${responseBody}`:""}`}}})}async function createAuthorizationFlow(originator=getWireIdentity()){let{verifier,challenge}=await generatePKCE(),state=createState(),url=new URL(AUTHORIZE_URL);return url.searchParams.set("response_type","code"),url.searchParams.set("client_id",CLIENT_ID),url.searchParams.set("redirect_uri",REDIRECT_URI),url.searchParams.set("scope",SCOPE),url.searchParams.set("code_challenge",challenge),url.searchParams.set("code_challenge_method","S256"),url.searchParams.set("state",state),url.searchParams.set("id_token_add_organizations","true"),url.searchParams.set("codex_cli_simplified_flow","true"),url.searchParams.set("originator",originator),{verifier,state,url:url.toString()}}function startLocalOAuthServer(state){if(!_http)throw new Error("ChatGPT Subscription OAuth is only available in Node.js environments");let settleWait,waitForCodePromise=new Promise(resolve=>{let settled=!1;settleWait=value=>{settled||(settled=!0,resolve(value))}}),server=_http.createServer((req,res)=>{try{let url=new URL(req.url||"","http://localhost");if(url.pathname!=="/auth/callback"){res.statusCode=404,res.setHeader("Content-Type","text/html; charset=utf-8"),res.end(oauthErrorHtml("Callback route not found."));return}if(url.searchParams.get("state")!==state){res.statusCode=400,res.setHeader("Content-Type","text/html; charset=utf-8"),res.end(oauthErrorHtml("State mismatch."));return}let code=url.searchParams.get("code");if(!code){res.statusCode=400,res.setHeader("Content-Type","text/html; charset=utf-8"),res.end(oauthErrorHtml("Missing authorization code."));return}res.statusCode=200,res.setHeader("Content-Type","text/html; charset=utf-8"),res.end(oauthSuccessHtml("OpenAI authentication completed. You can close this window.")),settleWait?.({code})}catch{res.statusCode=500,res.setHeader("Content-Type","text/html; charset=utf-8"),res.end(oauthErrorHtml("Internal error while processing OAuth callback."))}});return new Promise(resolve=>{server.listen(1455,getCallbackHost(),()=>{resolve({close:()=>server.close(),cancelWait:()=>{settleWait?.(null)},waitForCode:()=>waitForCodePromise})}).on("error",_err=>{settleWait?.(null),resolve({close:()=>{try{server.close()}catch{}},cancelWait:()=>{},waitForCode:async()=>null})})})}function getAccountId(accessToken){return extractChatGptSubscriptionAccountId(accessToken)??null}function credentialsFromToken(token){let accountId=getAccountId(token.access);if(!accountId)throw new Error("Failed to extract accountId from token");return{type:"oauth",access:token.access,refresh:token.refresh,expires:token.expires,accountId}}async function exchangeAuthorizationCodeForCredentials(code,verifier,redirectUri,signal){return credentialsFromToken(await exchangeAuthorizationCode(code,verifier,redirectUri,signal))}async function loginChatGptSubscriptionDeviceCode(interaction){let device=await startChatGptSubscriptionDeviceAuth(interaction.signal);interaction.notify({type:"device_code",userCode:device.userCode,verificationUri:DEVICE_VERIFICATION_URI,intervalSeconds:device.intervalSeconds,expiresInSeconds:DEVICE_CODE_TIMEOUT_SECONDS});let code=await pollChatGptSubscriptionDeviceAuth(device,interaction.signal);return exchangeAuthorizationCodeForCredentials(code.authorizationCode,code.codeVerifier,DEVICE_REDIRECT_URI,interaction.signal)}async function loginChatGptSubscription(interaction){let{verifier,state,url}=await createAuthorizationFlow(),server=await startLocalOAuthServer(state),manualAbort=new AbortController,onAbort=()=>server.cancelWait();interaction.signal.addEventListener("abort",onAbort,{once:!0}),interaction.signal.aborted&&onAbort();let code,manualCode,manualError;interaction.notify({type:"auth_url",url,instructions:"A browser window should open. Complete login to finish."});try{let manualPromise=interaction.prompt({type:"manual_code",message:"Complete login in your browser, or paste the authorization code / redirect URL here:",placeholder:REDIRECT_URI,signal:manualAbort.signal}).then(input=>{manualCode=input,server.cancelWait()}).catch(error=>{manualError=error instanceof Error?error:new Error(String(error)),server.cancelWait()}),result=await server.waitForCode();if(manualError)throw manualError;if(result?.code)code=result.code;else if(manualCode){let parsed=parseAuthorizationInput(manualCode);if(parsed.state&&parsed.state!==state)throw new Error("State mismatch");code=parsed.code}if(!code){if(await manualPromise,manualError)throw manualError;if(manualCode){let parsed=parseAuthorizationInput(manualCode);if(parsed.state&&parsed.state!==state)throw new Error("State mismatch");code=parsed.code}}if(!code)throw new Error("Missing authorization code");return exchangeAuthorizationCodeForCredentials(code,verifier,REDIRECT_URI,interaction.signal)}finally{interaction.signal.removeEventListener("abort",onAbort),manualAbort.abort(),server.close()}}async function refreshChatGptSubscriptionToken(refreshToken,signal){return credentialsFromToken(await refreshAccessToken(refreshToken,signal))}var chatgptSubscriptionOAuth={name:"ChatGPT Subscription (Plus/Pro)",isSubscription:!0,async login(interaction){let method=await interaction.prompt({type:"select",message:"Select ChatGPT Subscription login method:",options:[{id:CHATGPT_SUBSCRIPTION_BROWSER_LOGIN_METHOD,label:"Browser login (default)"},{id:CHATGPT_SUBSCRIPTION_DEVICE_CODE_LOGIN_METHOD,label:"Device code login (headless)"}]});if(method===CHATGPT_SUBSCRIPTION_DEVICE_CODE_LOGIN_METHOD)return loginChatGptSubscriptionDeviceCode(interaction);if(method!==CHATGPT_SUBSCRIPTION_BROWSER_LOGIN_METHOD)throw new Error(`Unknown ChatGPT Subscription login method: ${method}`);return loginChatGptSubscription(interaction)},refresh:(credential,signal)=>refreshChatGptSubscriptionToken(credential.refresh,signal),async toAuth(credential){return{apiKey:credential.access}}};export{chatgptSubscriptionOAuth};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
|
|
2
|
+
var CHATGPT_SUBSCRIPTION_AUTH_CLAIM_PATH="https://api.openai.com/auth";function extractChatGptSubscriptionAccountId(token){try{let parts=token.split("."),encodedPayload=parts.length===3?parts[1]:void 0;if(!encodedPayload)return;let base64=encodedPayload.replaceAll("-","+").replaceAll("_","/"),payload=JSON.parse(atob(base64.padEnd(Math.ceil(base64.length/4)*4,"=")));if(!payload||typeof payload!="object")return;let auth=Reflect.get(payload,CHATGPT_SUBSCRIPTION_AUTH_CLAIM_PATH);if(!auth||typeof auth!="object")return;let accountId=Reflect.get(auth,"chatgpt_account_id");return typeof accountId=="string"&&accountId.length>0?accountId:void 0}catch{return}}var MAX_SEQUENCE=(1n<<41n)-1n,lastOrdinaryTimestamp=-1,sequence;function fillRandomBytes(bytes){let crypto=globalThis.crypto;if(crypto?.getRandomValues){crypto.getRandomValues(bytes);return}for(let i=0;i<bytes.length;i++)bytes[i]=Math.floor(Math.random()*256)}function uuidv7(timestampMs){let requestedTimestamp=timestampMs??Date.now();if(!Number.isInteger(requestedTimestamp)||requestedTimestamp<0||requestedTimestamp>0xffffffffffff)throw new RangeError(`UUIDv7 timestamp must be an integer between 0 and ${0xffffffffffff}`);let effectiveTimestamp=timestampMs===void 0?Math.max(requestedTimestamp,lastOrdinaryTimestamp):timestampMs;timestampMs===void 0&&(lastOrdinaryTimestamp=effectiveTimestamp);let bytes=new Uint8Array(16);if(fillRandomBytes(bytes),sequence===void 0)sequence=BigInt(bytes[1])<<32n|BigInt(bytes[2])<<24n|BigInt(bytes[3])<<16n|BigInt(bytes[4])<<8n|BigInt(bytes[5]);else{if(sequence===MAX_SEQUENCE)throw new RangeError("UUIDv7 generator sequence exhausted");sequence++}let timestamp=BigInt(effectiveTimestamp);for(let index=5;index>=0;index--)bytes[index]=Number(timestamp>>BigInt((5-index)*8))&255;return bytes[6]=112|Number(sequence>>37n&0x0fn),bytes[7]=Number(sequence>>29n&0xffn),bytes[8]=128|Number(sequence>>23n&0x3fn),bytes[9]=Number(sequence>>15n&0xffn),bytes[10]=Number(sequence>>7n&0xffn),bytes[11]=Number((sequence&0x7fn)<<1n)|bytes[11]&1,formatUuid(bytes)}function formatUuid(bytes){let hex=Array.from(bytes,byte=>byte.toString(16).padStart(2,"0"));return`${hex.slice(0,4).join("")}-${hex.slice(4,6).join("")}-${hex.slice(6,8).join("")}-${hex.slice(8,10).join("")}-${hex.slice(10).join("")}`}var DEFAULT_WIRE_IDENTITY="senpi",wireIdentity=DEFAULT_WIRE_IDENTITY;function setWireIdentity(identity){identity?.trim()&&(wireIdentity=identity.trim())}function getWireIdentity(){return wireIdentity}export{extractChatGptSubscriptionAccountId,uuidv7,setWireIdentity,getWireIdentity};
|