@astralyn/pi 0.81.1-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5113 -0
- package/README.md +677 -0
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +11 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -0
- package/dist/bun/register-bedrock.js +4 -0
- package/dist/bun/register-bedrock.js.map +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +17 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +36 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/cli/args.d.ts +57 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +381 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config-selector.d.ts +16 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +31 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +70 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +98 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/project-trust.d.ts +10 -0
- package/dist/cli/project-trust.d.ts.map +1 -0
- package/dist/cli/project-trust.js +48 -0
- package/dist/cli/project-trust.js.map +1 -0
- package/dist/cli/session-picker.d.ts +10 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +36 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/startup-ui.d.ts +20 -0
- package/dist/cli/startup-ui.d.ts.map +1 -0
- package/dist/cli/startup-ui.js +184 -0
- package/dist/cli/startup-ui.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +96 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +455 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts +119 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -0
- package/dist/core/agent-session-runtime.js +306 -0
- package/dist/core/agent-session-runtime.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +85 -0
- package/dist/core/agent-session-services.d.ts.map +1 -0
- package/dist/core/agent-session-services.js +133 -0
- package/dist/core/agent-session-services.js.map +1 -0
- package/dist/core/agent-session.d.ts +642 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +2679 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-guidance.d.ts +5 -0
- package/dist/core/auth-guidance.d.ts.map +1 -0
- package/dist/core/auth-guidance.js +21 -0
- package/dist/core/auth-guidance.js.map +1 -0
- package/dist/core/auth-storage.d.ts +56 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +229 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +32 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +111 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/cache-stats.d.ts +49 -0
- package/dist/core/cache-stats.d.ts.map +1 -0
- package/dist/core/cache-stats.js +101 -0
- package/dist/core/cache-stats.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +98 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +246 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +137 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +637 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +38 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +142 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +75 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/experimental.d.ts +2 -0
- package/dist/core/experimental.d.ts.map +1 -0
- package/dist/core/experimental.js +4 -0
- package/dist/core/experimental.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +37 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +226 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +1066 -0
- package/dist/core/export-html/template.html +55 -0
- package/dist/core/export-html/template.js +1864 -0
- package/dist/core/export-html/tool-renderer.d.ts +34 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +108 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +78 -0
- package/dist/core/extensions/index.d.ts +12 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +23 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +558 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +171 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +953 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1259 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +45 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +20 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +41 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +54 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +338 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/http-dispatcher.d.ts +22 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +91 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +363 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +300 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +123 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-config.d.ts +512 -0
- package/dist/core/model-config.d.ts.map +1 -0
- package/dist/core/model-config.js +243 -0
- package/dist/core/model-config.js.map +1 -0
- package/dist/core/model-registry.d.ts +43 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +104 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +121 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +534 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/model-runtime.d.ts +82 -0
- package/dist/core/model-runtime.d.ts.map +1 -0
- package/dist/core/model-runtime.js +441 -0
- package/dist/core/model-runtime.js.map +1 -0
- package/dist/core/models-store.d.ts +17 -0
- package/dist/core/models-store.d.ts.map +1 -0
- package/dist/core/models-store.js +45 -0
- package/dist/core/models-store.js.map +1 -0
- package/dist/core/output-guard.d.ts +7 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +89 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +210 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +2135 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/project-trust.d.ts +15 -0
- package/dist/core/project-trust.d.ts.map +1 -0
- package/dist/core/project-trust.js +59 -0
- package/dist/core/project-trust.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +54 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +236 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/provider-attribution.d.ts +4 -0
- package/dist/core/provider-attribution.d.ts.map +1 -0
- package/dist/core/provider-attribution.js +72 -0
- package/dist/core/provider-attribution.js.map +1 -0
- package/dist/core/provider-composer.d.ts +55 -0
- package/dist/core/provider-composer.d.ts.map +1 -0
- package/dist/core/provider-composer.js +375 -0
- package/dist/core/provider-composer.js.map +1 -0
- package/dist/core/radius.d.ts +2 -0
- package/dist/core/radius.d.ts.map +1 -0
- package/dist/core/radius.js +2 -0
- package/dist/core/radius.js.map +1 -0
- package/dist/core/remote-catalog-provider.d.ts +5 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -0
- package/dist/core/remote-catalog-provider.js +102 -0
- package/dist/core/remote-catalog-provider.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +30 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +247 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +206 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +817 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/runtime-credentials.d.ts +15 -0
- package/dist/core/runtime-credentials.d.ts.map +1 -0
- package/dist/core/runtime-credentials.js +36 -0
- package/dist/core/runtime-credentials.js.map +1 -0
- package/dist/core/sdk.d.ts +106 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +267 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +356 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +1338 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +297 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +902 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +60 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +387 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +15 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +26 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/source-info.d.ts +18 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +19 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +28 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +110 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/telemetry.d.ts +3 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +9 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/timings.d.ts +10 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +41 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +68 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +361 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +106 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +424 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +50 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +261 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +52 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +35 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +305 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +37 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +304 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +40 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +112 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +37 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +167 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +52 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +184 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +10 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +99 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +35 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +276 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +24 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +65 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +34 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +215 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +26 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +197 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/core/trust-manager.d.ts +36 -0
- package/dist/core/trust-manager.d.ts.map +1 -0
- package/dist/core/trust-manager.js +202 -0
- package/dist/core/trust-manager.js.map +1 -0
- package/dist/core/usage-totals.d.ts +19 -0
- package/dist/core/usage-totals.d.ts.map +1 -0
- package/dist/core/usage-totals.js +52 -0
- package/dist/core/usage-totals.js.map +1 -0
- package/dist/extensions/deepwiki/client.d.ts +14 -0
- package/dist/extensions/deepwiki/client.d.ts.map +1 -0
- package/dist/extensions/deepwiki/client.js +196 -0
- package/dist/extensions/deepwiki/client.js.map +1 -0
- package/dist/extensions/deepwiki/constants.d.ts +13 -0
- package/dist/extensions/deepwiki/constants.d.ts.map +1 -0
- package/dist/extensions/deepwiki/constants.js +18 -0
- package/dist/extensions/deepwiki/constants.js.map +1 -0
- package/dist/extensions/deepwiki/contents.d.ts +63 -0
- package/dist/extensions/deepwiki/contents.d.ts.map +1 -0
- package/dist/extensions/deepwiki/contents.js +174 -0
- package/dist/extensions/deepwiki/contents.js.map +1 -0
- package/dist/extensions/deepwiki/execute.d.ts +25 -0
- package/dist/extensions/deepwiki/execute.d.ts.map +1 -0
- package/dist/extensions/deepwiki/execute.js +78 -0
- package/dist/extensions/deepwiki/execute.js.map +1 -0
- package/dist/extensions/deepwiki/http.d.ts +12 -0
- package/dist/extensions/deepwiki/http.d.ts.map +1 -0
- package/dist/extensions/deepwiki/http.js +74 -0
- package/dist/extensions/deepwiki/http.js.map +1 -0
- package/dist/extensions/deepwiki/index.d.ts +9 -0
- package/dist/extensions/deepwiki/index.d.ts.map +1 -0
- package/dist/extensions/deepwiki/index.js +25 -0
- package/dist/extensions/deepwiki/index.js.map +1 -0
- package/dist/extensions/deepwiki/render.d.ts +14 -0
- package/dist/extensions/deepwiki/render.d.ts.map +1 -0
- package/dist/extensions/deepwiki/render.js +166 -0
- package/dist/extensions/deepwiki/render.js.map +1 -0
- package/dist/extensions/deepwiki/schema.d.ts +13 -0
- package/dist/extensions/deepwiki/schema.d.ts.map +1 -0
- package/dist/extensions/deepwiki/schema.js +208 -0
- package/dist/extensions/deepwiki/schema.js.map +1 -0
- package/dist/extensions/index.d.ts +3 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +17 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/llama/client.d.ts +61 -0
- package/dist/extensions/llama/client.d.ts.map +1 -0
- package/dist/extensions/llama/client.js +302 -0
- package/dist/extensions/llama/client.js.map +1 -0
- package/dist/extensions/llama/huggingface.d.ts +23 -0
- package/dist/extensions/llama/huggingface.d.ts.map +1 -0
- package/dist/extensions/llama/huggingface.js +141 -0
- package/dist/extensions/llama/huggingface.js.map +1 -0
- package/dist/extensions/llama/index.d.ts +3 -0
- package/dist/extensions/llama/index.d.ts.map +1 -0
- package/dist/extensions/llama/index.js +208 -0
- package/dist/extensions/llama/index.js.map +1 -0
- package/dist/extensions/llama/provider.d.ts +10 -0
- package/dist/extensions/llama/provider.d.ts.map +1 -0
- package/dist/extensions/llama/provider.js +102 -0
- package/dist/extensions/llama/provider.js.map +1 -0
- package/dist/extensions/llama/ui.d.ts +42 -0
- package/dist/extensions/llama/ui.d.ts.map +1 -0
- package/dist/extensions/llama/ui.js +416 -0
- package/dist/extensions/llama/ui.js.map +1 -0
- package/dist/extensions/question/constants.d.ts +13 -0
- package/dist/extensions/question/constants.d.ts.map +1 -0
- package/dist/extensions/question/constants.js +17 -0
- package/dist/extensions/question/constants.js.map +1 -0
- package/dist/extensions/question/dialog-primitives.d.ts +6 -0
- package/dist/extensions/question/dialog-primitives.d.ts.map +1 -0
- package/dist/extensions/question/dialog-primitives.js +20 -0
- package/dist/extensions/question/dialog-primitives.js.map +1 -0
- package/dist/extensions/question/dialog.d.ts +10 -0
- package/dist/extensions/question/dialog.d.ts.map +1 -0
- package/dist/extensions/question/dialog.js +519 -0
- package/dist/extensions/question/dialog.js.map +1 -0
- package/dist/extensions/question/index.d.ts +9 -0
- package/dist/extensions/question/index.d.ts.map +1 -0
- package/dist/extensions/question/index.js +32 -0
- package/dist/extensions/question/index.js.map +1 -0
- package/dist/extensions/question/limits.d.ts +11 -0
- package/dist/extensions/question/limits.d.ts.map +1 -0
- package/dist/extensions/question/limits.js +11 -0
- package/dist/extensions/question/limits.js.map +1 -0
- package/dist/extensions/question/render-cache.d.ts +9 -0
- package/dist/extensions/question/render-cache.d.ts.map +1 -0
- package/dist/extensions/question/render-cache.js +18 -0
- package/dist/extensions/question/render-cache.js.map +1 -0
- package/dist/extensions/question/render.d.ts +17 -0
- package/dist/extensions/question/render.d.ts.map +1 -0
- package/dist/extensions/question/render.js +47 -0
- package/dist/extensions/question/render.js.map +1 -0
- package/dist/extensions/question/results.d.ts +8 -0
- package/dist/extensions/question/results.d.ts.map +1 -0
- package/dist/extensions/question/results.js +68 -0
- package/dist/extensions/question/results.js.map +1 -0
- package/dist/extensions/question/schema.d.ts +22 -0
- package/dist/extensions/question/schema.d.ts.map +1 -0
- package/dist/extensions/question/schema.js +98 -0
- package/dist/extensions/question/schema.js.map +1 -0
- package/dist/extensions/question/state.d.ts +9 -0
- package/dist/extensions/question/state.d.ts.map +1 -0
- package/dist/extensions/question/state.js +76 -0
- package/dist/extensions/question/state.js.map +1 -0
- package/dist/extensions/question/types.d.ts +60 -0
- package/dist/extensions/question/types.d.ts.map +1 -0
- package/dist/extensions/question/types.js +2 -0
- package/dist/extensions/question/types.js.map +1 -0
- package/dist/extensions/rewind/config.d.ts +16 -0
- package/dist/extensions/rewind/config.d.ts.map +1 -0
- package/dist/extensions/rewind/config.js +69 -0
- package/dist/extensions/rewind/config.js.map +1 -0
- package/dist/extensions/rewind/engine.d.ts +97 -0
- package/dist/extensions/rewind/engine.d.ts.map +1 -0
- package/dist/extensions/rewind/engine.js +747 -0
- package/dist/extensions/rewind/engine.js.map +1 -0
- package/dist/extensions/rewind/gc.d.ts +35 -0
- package/dist/extensions/rewind/gc.d.ts.map +1 -0
- package/dist/extensions/rewind/gc.js +169 -0
- package/dist/extensions/rewind/gc.js.map +1 -0
- package/dist/extensions/rewind/index.d.ts +3 -0
- package/dist/extensions/rewind/index.d.ts.map +1 -0
- package/dist/extensions/rewind/index.js +253 -0
- package/dist/extensions/rewind/index.js.map +1 -0
- package/dist/extensions/rewind/menu.d.ts +13 -0
- package/dist/extensions/rewind/menu.d.ts.map +1 -0
- package/dist/extensions/rewind/menu.js +118 -0
- package/dist/extensions/rewind/menu.js.map +1 -0
- package/dist/extensions/rewind/paths.d.ts +4 -0
- package/dist/extensions/rewind/paths.d.ts.map +1 -0
- package/dist/extensions/rewind/paths.js +15 -0
- package/dist/extensions/rewind/paths.js.map +1 -0
- package/dist/extensions/rewind/restore.d.ts +37 -0
- package/dist/extensions/rewind/restore.d.ts.map +1 -0
- package/dist/extensions/rewind/restore.js +52 -0
- package/dist/extensions/rewind/restore.js.map +1 -0
- package/dist/extensions/rewind/snapshot.d.ts +45 -0
- package/dist/extensions/rewind/snapshot.d.ts.map +1 -0
- package/dist/extensions/rewind/snapshot.js +21 -0
- package/dist/extensions/rewind/snapshot.js.map +1 -0
- package/dist/extensions/rewind/storage.d.ts +12 -0
- package/dist/extensions/rewind/storage.d.ts.map +1 -0
- package/dist/extensions/rewind/storage.js +33 -0
- package/dist/extensions/rewind/storage.js.map +1 -0
- package/dist/extensions/rewind/text.d.ts +7 -0
- package/dist/extensions/rewind/text.d.ts.map +1 -0
- package/dist/extensions/rewind/text.js +19 -0
- package/dist/extensions/rewind/text.js.map +1 -0
- package/dist/extensions/rewind/tool-path.d.ts +3 -0
- package/dist/extensions/rewind/tool-path.d.ts.map +1 -0
- package/dist/extensions/rewind/tool-path.js +9 -0
- package/dist/extensions/rewind/tool-path.js.map +1 -0
- package/dist/extensions/router/constants.d.ts +20 -0
- package/dist/extensions/router/constants.d.ts.map +1 -0
- package/dist/extensions/router/constants.js +27 -0
- package/dist/extensions/router/constants.js.map +1 -0
- package/dist/extensions/router/dialog.d.ts +38 -0
- package/dist/extensions/router/dialog.d.ts.map +1 -0
- package/dist/extensions/router/dialog.js +407 -0
- package/dist/extensions/router/dialog.js.map +1 -0
- package/dist/extensions/router/index.d.ts +15 -0
- package/dist/extensions/router/index.d.ts.map +1 -0
- package/dist/extensions/router/index.js +61 -0
- package/dist/extensions/router/index.js.map +1 -0
- package/dist/extensions/router/presets.d.ts +48 -0
- package/dist/extensions/router/presets.d.ts.map +1 -0
- package/dist/extensions/router/presets.js +109 -0
- package/dist/extensions/router/presets.js.map +1 -0
- package/dist/extensions/router/probe.d.ts +20 -0
- package/dist/extensions/router/probe.d.ts.map +1 -0
- package/dist/extensions/router/probe.js +125 -0
- package/dist/extensions/router/probe.js.map +1 -0
- package/dist/extensions/router/register.d.ts +34 -0
- package/dist/extensions/router/register.d.ts.map +1 -0
- package/dist/extensions/router/register.js +81 -0
- package/dist/extensions/router/register.js.map +1 -0
- package/dist/extensions/router/store.d.ts +12 -0
- package/dist/extensions/router/store.d.ts.map +1 -0
- package/dist/extensions/router/store.js +164 -0
- package/dist/extensions/router/store.js.map +1 -0
- package/dist/extensions/router/stream.d.ts +16 -0
- package/dist/extensions/router/stream.d.ts.map +1 -0
- package/dist/extensions/router/stream.js +198 -0
- package/dist/extensions/router/stream.js.map +1 -0
- package/dist/extensions/router/types.d.ts +23 -0
- package/dist/extensions/router/types.d.ts.map +1 -0
- package/dist/extensions/router/types.js +2 -0
- package/dist/extensions/router/types.js.map +1 -0
- package/dist/extensions/router/ui.d.ts +9 -0
- package/dist/extensions/router/ui.d.ts.map +1 -0
- package/dist/extensions/router/ui.js +538 -0
- package/dist/extensions/router/ui.js.map +1 -0
- package/dist/extensions/statusline/index.d.ts +3 -0
- package/dist/extensions/statusline/index.d.ts.map +1 -0
- package/dist/extensions/statusline/index.js +367 -0
- package/dist/extensions/statusline/index.js.map +1 -0
- package/dist/extensions/todo/constants.d.ts +16 -0
- package/dist/extensions/todo/constants.d.ts.map +1 -0
- package/dist/extensions/todo/constants.js +20 -0
- package/dist/extensions/todo/constants.js.map +1 -0
- package/dist/extensions/todo/index.d.ts +17 -0
- package/dist/extensions/todo/index.d.ts.map +1 -0
- package/dist/extensions/todo/index.js +83 -0
- package/dist/extensions/todo/index.js.map +1 -0
- package/dist/extensions/todo/overlay.d.ts +24 -0
- package/dist/extensions/todo/overlay.d.ts.map +1 -0
- package/dist/extensions/todo/overlay.js +139 -0
- package/dist/extensions/todo/overlay.js.map +1 -0
- package/dist/extensions/todo/schema.d.ts +41 -0
- package/dist/extensions/todo/schema.d.ts.map +1 -0
- package/dist/extensions/todo/schema.js +36 -0
- package/dist/extensions/todo/schema.js.map +1 -0
- package/dist/extensions/todo/state.d.ts +57 -0
- package/dist/extensions/todo/state.d.ts.map +1 -0
- package/dist/extensions/todo/state.js +452 -0
- package/dist/extensions/todo/state.js.map +1 -0
- package/dist/extensions/todo/view.d.ts +8 -0
- package/dist/extensions/todo/view.d.ts.map +1 -0
- package/dist/extensions/todo/view.js +119 -0
- package/dist/extensions/todo/view.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +12 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +704 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +281 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +9 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/assets/clankolas.png +0 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +333 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +22 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +141 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +175 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +54 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +44 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +102 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +761 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +70 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-entry.js +52 -0
- package/dist/modes/interactive/components/custom-entry.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +79 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +140 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.js +40 -0
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +128 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +61 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +83 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.js +103 -0
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +32 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +222 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +34 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +35 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +36 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +188 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +54 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +310 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +163 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +293 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +155 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +95 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +867 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +77 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +593 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +39 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/status-indicator.d.ts +28 -0
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
- package/dist/modes/interactive/components/status-indicator.js +60 -0
- package/dist/modes/interactive/components/status-indicator.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +50 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +52 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +62 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +361 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +94 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +1245 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/trust-selector.js +91 -0
- package/dist/modes/interactive/components/trust-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +114 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +14 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +42 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +394 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +5039 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/model-search.d.ts +12 -0
- package/dist/modes/interactive/model-search.d.ts.map +1 -0
- package/dist/modes/interactive/model-search.js +15 -0
- package/dist/modes/interactive/model-search.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +87 -0
- package/dist/modes/interactive/theme/ice-cream-dark.json +101 -0
- package/dist/modes/interactive/theme/ice-cream-light.json +101 -0
- package/dist/modes/interactive/theme/light.json +86 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-controller.js +102 -0
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.json +340 -0
- package/dist/modes/interactive/theme/theme.d.ts +120 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +1063 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +132 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +246 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +488 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +639 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +457 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/package-manager-cli.d.ts +8 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +775 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/rpc-entry.d.ts +3 -0
- package/dist/rpc-entry.d.ts.map +1 -0
- package/dist/rpc-entry.js +10 -0
- package/dist/rpc-entry.js.map +1 -0
- package/dist/utils/ansi.d.ts +2 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +52 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/changelog.d.ts +22 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +165 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/child-process.d.ts +18 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +106 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +245 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +11 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +20 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard.d.ts +4 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +130 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/deprecation.d.ts +4 -0
- package/dist/utils/deprecation.d.ts.map +1 -0
- package/dist/utils/deprecation.js +13 -0
- package/dist/utils/deprecation.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +158 -0
- package/dist/utils/exif-orientation.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +5 -0
- package/dist/utils/fs-watch.d.ts.map +1 -0
- package/dist/utils/fs-watch.js +25 -0
- package/dist/utils/fs-watch.js.map +1 -0
- package/dist/utils/git.d.ts +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +195 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/html.d.ts +7 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +40 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/image-convert.d.ts +10 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +45 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-process.d.ts +18 -0
- package/dist/utils/image-process.d.ts.map +1 -0
- package/dist/utils/image-process.js +83 -0
- package/dist/utils/image-process.js.map +1 -0
- package/dist/utils/image-resize-core.d.ts +30 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -0
- package/dist/utils/image-resize-core.js +124 -0
- package/dist/utils/image-resize-core.js.map +1 -0
- package/dist/utils/image-resize-worker.d.ts +2 -0
- package/dist/utils/image-resize-worker.d.ts.map +1 -0
- package/dist/utils/image-resize-worker.js +31 -0
- package/dist/utils/image-resize-worker.js.map +1 -0
- package/dist/utils/image-resize.d.ts +16 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +97 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +7 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/mime.d.ts +3 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +110 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/open-browser.d.ts +9 -0
- package/dist/utils/open-browser.d.ts.map +1 -0
- package/dist/utils/open-browser.js +22 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/dist/utils/paths.d.ts +31 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +92 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/photon.d.ts +21 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +121 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/pi-user-agent.d.ts +2 -0
- package/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/dist/utils/pi-user-agent.js +5 -0
- package/dist/utils/pi-user-agent.js.map +1 -0
- package/dist/utils/shell.d.ts +31 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +202 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts +12 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +118 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +328 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/version-check.d.ts +15 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +54 -0
- package/dist/utils/version-check.js.map +1 -0
- package/dist/utils/windows-self-update.d.ts +3 -0
- package/dist/utils/windows-self-update.d.ts.map +1 -0
- package/dist/utils/windows-self-update.js +77 -0
- package/dist/utils/windows-self-update.js.map +1 -0
- package/docs/compaction.md +401 -0
- package/docs/containerization.md +111 -0
- package/docs/custom-provider.md +763 -0
- package/docs/development.md +71 -0
- package/docs/docs.json +156 -0
- package/docs/extensions.md +2953 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +77 -0
- package/docs/json.md +86 -0
- package/docs/keybindings.md +198 -0
- package/docs/llama-cpp.md +99 -0
- package/docs/models.md +540 -0
- package/docs/packages.md +228 -0
- package/docs/prompt-templates.md +96 -0
- package/docs/providers.md +301 -0
- package/docs/quickstart.md +165 -0
- package/docs/rpc.md +1559 -0
- package/docs/sdk.md +1186 -0
- package/docs/security.md +59 -0
- package/docs/session-format.md +436 -0
- package/docs/sessions.md +145 -0
- package/docs/settings.md +319 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +231 -0
- package/docs/terminal-setup.md +142 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +301 -0
- package/docs/tmux.md +63 -0
- package/docs/tui.md +942 -0
- package/docs/usage.md +311 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +213 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/border-status-editor.ts +145 -0
- package/examples/extensions/built-in-tool-renderer.ts +249 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +129 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/entry-renderer.ts +41 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/git-merge-and-resolve.ts +115 -0
- package/examples/extensions/github-issue-autocomplete.ts +185 -0
- package/examples/extensions/gondolin/index.ts +531 -0
- package/examples/extensions/gondolin/package-lock.json +185 -0
- package/examples/extensions/gondolin/package.json +19 -0
- package/examples/extensions/handoff.ts +191 -0
- package/examples/extensions/hello.ts +26 -0
- package/examples/extensions/hidden-thinking-label.ts +53 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform-streaming.ts +39 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/kimi-deferred-tools.ts +61 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +1450 -0
- package/examples/extensions/overlay-test.ts +153 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +66 -0
- package/examples/extensions/plan-mode/index.ts +390 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +436 -0
- package/examples/extensions/project-trust.ts +64 -0
- package/examples/extensions/prompt-customizer.ts +97 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/provider-payload.ts +18 -0
- package/examples/extensions/qna.ts +122 -0
- package/examples/extensions/question.ts +286 -0
- package/examples/extensions/questionnaire.ts +448 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +118 -0
- package/examples/extensions/sandbox/index.ts +321 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +32 -0
- package/examples/extensions/structured-output.ts +65 -0
- package/examples/extensions/subagent/README.md +175 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +126 -0
- package/examples/extensions/subagent/index.ts +1009 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +207 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/tic-tac-toe.ts +1008 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +297 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +146 -0
- package/examples/extensions/trigger-compact.ts +50 -0
- package/examples/extensions/truncated-tool.ts +195 -0
- package/examples/extensions/widget-placement.ts +9 -0
- package/examples/extensions/with-deps/index.ts +32 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/extensions/working-indicator.ts +123 -0
- package/examples/extensions/working-message-test.ts +25 -0
- package/examples/rpc-extension-ui.ts +632 -0
- package/examples/sdk/01-minimal.ts +26 -0
- package/examples/sdk/02-custom-model.ts +50 -0
- package/examples/sdk/03-custom-prompt.ts +70 -0
- package/examples/sdk/04-skills.ts +55 -0
- package/examples/sdk/05-tools.ts +48 -0
- package/examples/sdk/06-extensions.ts +94 -0
- package/examples/sdk/07-context-files.ts +42 -0
- package/examples/sdk/08-prompt-templates.ts +51 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +34 -0
- package/examples/sdk/10-settings.ts +53 -0
- package/examples/sdk/11-sessions.ts +52 -0
- package/examples/sdk/12-full-control.ts +72 -0
- package/examples/sdk/13-session-runtime.ts +67 -0
- package/examples/sdk/README.md +140 -0
- package/npm-shrinkwrap.json +1824 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/extensions/router/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Persistence for ~/.pi/agent/router.json\n */\n\nimport { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { getAgentDir } from \"../../config.ts\";\nimport { withFileMutationQueue } from \"../../core/tools/file-mutation-queue.ts\";\nimport { CONFIG_VERSION, isValidRelayId } from \"./constants.ts\";\nimport type { RelayConfig, RelayModelConfig, RouterFile, ThinkingLevelMap } from \"./types.ts\";\n\nexport function getRouterConfigPath(): string {\n\treturn join(getAgentDir(), \"router.json\");\n}\n\nexport function emptyRouterFile(): RouterFile {\n\treturn { version: CONFIG_VERSION, relays: [] };\n}\n\nexport async function loadRouterFile(): Promise<RouterFile> {\n\tconst filePath = getRouterConfigPath();\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(filePath, \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return emptyRouterFile();\n\t\tthrow error;\n\t}\n\treturn parseRouterFile(raw);\n}\n\nexport function parseRouterFile(raw: string): RouterFile {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\tthrow new Error(\"router.json is not valid JSON.\");\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(\"router.json must be a JSON object.\");\n\t}\n\tconst root = parsed as Record<string, unknown>;\n\tconst relaysRaw = root.relays;\n\tif (relaysRaw !== undefined && !Array.isArray(relaysRaw)) {\n\t\tthrow new Error(\"router.json relays must be an array.\");\n\t}\n\tconst relays: RelayConfig[] = [];\n\tfor (const item of relaysRaw ?? []) {\n\t\tconst relay = normalizeRelay(item);\n\t\tif (relay) relays.push(relay);\n\t}\n\treturn { version: CONFIG_VERSION, relays };\n}\n\nfunction normalizeRelay(value: unknown): RelayConfig | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\tconst record = value as Record<string, unknown>;\n\tconst id = typeof record.id === \"string\" ? record.id.trim() : \"\";\n\tconst baseUrl = typeof record.baseUrl === \"string\" ? record.baseUrl.trim() : \"\";\n\tconst apiKey = typeof record.apiKey === \"string\" ? record.apiKey : \"\";\n\tif (!id || !isValidRelayId(id) || !baseUrl) return undefined;\n\tconst models: RelayModelConfig[] = [];\n\tif (Array.isArray(record.models)) {\n\t\tfor (const model of record.models) {\n\t\t\tconst normalized = normalizeModel(model);\n\t\t\tif (normalized) models.push(normalized);\n\t\t}\n\t}\n\treturn { id, baseUrl, apiKey, models };\n}\n\nfunction normalizeModel(value: unknown): RelayModelConfig | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n\tconst record = value as Record<string, unknown>;\n\tconst id = typeof record.id === \"string\" ? record.id.trim() : \"\";\n\tif (!id) return undefined;\n\tconst model: RelayModelConfig = { id };\n\tif (typeof record.name === \"string\" && record.name.trim()) model.name = record.name.trim();\n\tif (typeof record.reasoning === \"boolean\") model.reasoning = record.reasoning;\n\tif (Array.isArray(record.input)) {\n\t\tconst input = record.input.filter((item): item is \"text\" | \"image\" => item === \"text\" || item === \"image\");\n\t\tif (input.includes(\"text\")) model.input = input.includes(\"image\") ? [\"text\", \"image\"] : [\"text\"];\n\t}\n\tif (typeof record.contextWindow === \"number\" && Number.isFinite(record.contextWindow) && record.contextWindow > 0) {\n\t\tmodel.contextWindow = Math.floor(record.contextWindow);\n\t}\n\tif (typeof record.maxTokens === \"number\" && Number.isFinite(record.maxTokens) && record.maxTokens > 0) {\n\t\tmodel.maxTokens = Math.floor(record.maxTokens);\n\t}\n\tif (\n\t\trecord.thinkingLevelMap &&\n\t\ttypeof record.thinkingLevelMap === \"object\" &&\n\t\t!Array.isArray(record.thinkingLevelMap)\n\t) {\n\t\tmodel.thinkingLevelMap = record.thinkingLevelMap as ThinkingLevelMap;\n\t}\n\treturn model;\n}\n\nexport async function saveRouterFile(file: RouterFile): Promise<void> {\n\tconst filePath = getRouterConfigPath();\n\tconst payload: RouterFile = {\n\t\tversion: CONFIG_VERSION,\n\t\trelays: file.relays.map((relay) => ({\n\t\t\tid: relay.id,\n\t\t\tbaseUrl: relay.baseUrl,\n\t\t\tapiKey: relay.apiKey,\n\t\t\tmodels: relay.models.map((model) => serializeModel(model)),\n\t\t})),\n\t};\n\tconst serialized = `${JSON.stringify(payload, null, 2)}\\n`;\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tawait withFileMutationQueue(filePath, async () => {\n\t\tconst tempPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n\t\ttry {\n\t\t\tawait writeFile(tempPath, serialized, { encoding: \"utf8\", mode: 0o600 });\n\t\t\tawait rename(tempPath, filePath);\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\tawait unlink(tempPath);\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t});\n}\n\nfunction serializeModel(model: RelayModelConfig): RelayModelConfig {\n\tconst out: RelayModelConfig = { id: model.id };\n\tif (model.name) out.name = model.name;\n\tif (model.reasoning !== undefined) out.reasoning = model.reasoning;\n\tif (model.input) out.input = model.input;\n\tif (model.contextWindow !== undefined) out.contextWindow = model.contextWindow;\n\tif (model.maxTokens !== undefined) out.maxTokens = model.maxTokens;\n\tif (model.thinkingLevelMap && Object.keys(model.thinkingLevelMap).length > 0) {\n\t\tout.thinkingLevelMap = model.thinkingLevelMap;\n\t}\n\treturn out;\n}\n\nexport async function upsertRelay(relay: RelayConfig): Promise<RouterFile> {\n\tconst file = await loadRouterFile();\n\tconst index = file.relays.findIndex((entry) => entry.id === relay.id);\n\tif (index >= 0) file.relays[index] = relay;\n\telse file.relays.push(relay);\n\tawait saveRouterFile(file);\n\treturn file;\n}\n\nexport async function removeRelay(id: string): Promise<RouterFile> {\n\tconst file = await loadRouterFile();\n\tfile.relays = file.relays.filter((entry) => entry.id !== id);\n\tawait saveRouterFile(file);\n\treturn file;\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex-oriented Responses client for API relays.
|
|
3
|
+
*
|
|
4
|
+
* Follows Pi's documented custom-provider pattern (see coding-agent docs
|
|
5
|
+
* providers.md / custom-provider.md and examples/custom-provider-gitlab-duo):
|
|
6
|
+
* wrap a built-in pi-ai stream API from `@earendil-works/pi-ai/compat` instead of
|
|
7
|
+
* reimplementing SSE or deep-importing internal modules.
|
|
8
|
+
*
|
|
9
|
+
* We use openAIResponsesApi (works with relay sk- keys) and reshape the request
|
|
10
|
+
* payload toward Codex CLI style so transparent gateways receive a friendlier body.
|
|
11
|
+
*/
|
|
12
|
+
import { type Api, type Context, createAssistantMessageEventStream, type Model, type SimpleStreamOptions } from "@earendil-works/pi-ai/compat";
|
|
13
|
+
export declare function streamRouterCodex(model: Model<Api>, context: Context, options?: SimpleStreamOptions): ReturnType<typeof createAssistantMessageEventStream>;
|
|
14
|
+
export declare function resolveResponsesUrl(baseUrl: string): string;
|
|
15
|
+
export declare function isRouterApi(api: string): boolean;
|
|
16
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../src/extensions/router/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACN,KAAK,GAAG,EACR,KAAK,OAAO,EACZ,iCAAiC,EACjC,KAAK,KAAK,EAEV,KAAK,mBAAmB,EACxB,MAAM,8BAA8B,CAAC;AAMtC,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,UAAU,CAAC,OAAO,iCAAiC,CAAC,CA0EtD;AA4HD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhD","sourcesContent":["/**\n * Codex-oriented Responses client for API relays.\n *\n * Follows Pi's documented custom-provider pattern (see coding-agent docs\n * providers.md / custom-provider.md and examples/custom-provider-gitlab-duo):\n * wrap a built-in pi-ai stream API from `@earendil-works/pi-ai/compat` instead of\n * reimplementing SSE or deep-importing internal modules.\n *\n * We use openAIResponsesApi (works with relay sk- keys) and reshape the request\n * payload toward Codex CLI style so transparent gateways receive a friendlier body.\n */\n\nimport {\n\ttype Api,\n\ttype Context,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\topenAIResponsesApi,\n\ttype SimpleStreamOptions,\n} from \"@earendil-works/pi-ai/compat\";\n\nimport { DEFAULTS, formatError, ROUTER_API } from \"./constants.ts\";\n\nconst responsesApi = openAIResponsesApi();\n\nexport function streamRouterCodex(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): ReturnType<typeof createAssistantMessageEventStream> {\n\tconst stream = createAssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (!apiKey) throw new Error(`No API key for provider: ${model.provider}`);\n\n\t\t\t// Built-in Responses stream expects api \"openai-responses\" on the model object.\n\t\t\tconst requestModel = {\n\t\t\t\t...model,\n\t\t\t\tapi: \"openai-responses\" as const,\n\t\t\t\tcompat: {\n\t\t\t\t\tsupportsDeveloperRole: true,\n\t\t\t\t\t// Avoid underscore session_id header that strict proxies reject.\n\t\t\t\t\tsessionAffinityFormat: \"openai-nosession\" as const,\n\t\t\t\t\t// Codex-style upstreams reject prompt_cache_retention: \"24h\".\n\t\t\t\t\tsupportsLongCacheRetention: false,\n\t\t\t\t\t...(model.compat ?? {}),\n\t\t\t\t},\n\t\t\t} as Model<\"openai-responses\">;\n\n\t\t\tconst headers: Record<string, string> = {\n\t\t\t\toriginator: DEFAULTS.originator,\n\t\t\t\t...(options?.headers as Record<string, string> | undefined),\n\t\t\t};\n\n\t\t\t// Prefer hyphenated Codex-style session affinity when we have a session id.\n\t\t\tconst sessionId = clampCacheKey(options?.sessionId);\n\t\t\tif (sessionId) {\n\t\t\t\tif (!headers[\"session-id\"]) headers[\"session-id\"] = sessionId;\n\t\t\t\tif (!headers[\"x-client-request-id\"]) headers[\"x-client-request-id\"] = sessionId;\n\t\t\t}\n\n\t\t\tconst inner = responsesApi.streamSimple(requestModel, context, {\n\t\t\t\t...options,\n\t\t\t\tapiKey,\n\t\t\t\theaders,\n\t\t\t\tonPayload: (payload) => reshapePayloadForRelay(payload, context, options?.onPayload, requestModel),\n\t\t\t});\n\n\t\t\tfor await (const event of inner) {\n\t\t\t\tstream.push(event);\n\t\t\t}\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\t// Match examples/custom-provider-gitlab-duo error event shape.\n\t\t\tstream.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\treason: options?.signal?.aborted ? \"aborted\" : \"error\",\n\t\t\t\terror: {\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tcontent: [],\n\t\t\t\t\tapi: model.api,\n\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\tmodel: model.id,\n\t\t\t\t\tusage: {\n\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t},\n\t\t\t\t\tstopReason: options?.signal?.aborted ? \"aborted\" : \"error\",\n\t\t\t\t\terrorMessage: formatError(error),\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n}\n\n/**\n * Nudge the OpenAI Responses payload toward Codex CLI request shape for\n * transparent relays: instructions + input, store:false, no max_output_tokens /\n * prompt_cache_retention, verbosity + parallel_tool_calls.\n */\nasync function reshapePayloadForRelay(\n\tpayload: unknown,\n\tcontext: Context,\n\tuserOnPayload: SimpleStreamOptions[\"onPayload\"],\n\tmodel: Model<\"openai-responses\">,\n): Promise<unknown> {\n\tconst base =\n\t\tpayload && typeof payload === \"object\" && !Array.isArray(payload)\n\t\t\t? { ...(payload as Record<string, unknown>) }\n\t\t\t: ({} as Record<string, unknown>);\n\n\t// Always safe for ChatGPT/Codex-style backends.\n\tbase.store = false;\n\tbase.stream = true;\n\n\t// Codex CLI sends system prompt as `instructions`, not as a role message in input.\n\tconst { instructions, input } = extractInstructions(base.input, context.systemPrompt);\n\tif (instructions) base.instructions = instructions;\n\tif (input !== undefined) base.input = input;\n\n\t// Fields common on Codex CLI / rejected by many transparent Codex upstreams.\n\tif (!base.text || typeof base.text !== \"object\") {\n\t\tbase.text = { verbosity: \"low\" };\n\t}\n\tif (base.tool_choice === undefined) base.tool_choice = \"auto\";\n\tif (base.parallel_tool_calls === undefined) base.parallel_tool_calls = true;\n\n\t// Prefer encrypted reasoning content for multi-turn store:false sessions.\n\tconst include = Array.isArray(base.include) ? [...(base.include as unknown[])] : [];\n\tif (!include.includes(\"reasoning.encrypted_content\")) {\n\t\tinclude.push(\"reasoning.encrypted_content\");\n\t}\n\tbase.include = include;\n\n\t// Drop Platform-only fields that Codex OAuth endpoints often 400 on.\n\tdelete base.prompt_cache_retention;\n\tdelete base.max_output_tokens;\n\tdelete base.temperature;\n\tdelete base.top_p;\n\tdelete base.user;\n\tdelete base.metadata;\n\tdelete base.service_tier;\n\tdelete base.truncation;\n\tdelete base.context_management;\n\tdelete base.safety_identifier;\n\tdelete base.stream_options;\n\n\tif (userOnPayload) {\n\t\tconst next = await userOnPayload(base, model);\n\t\tif (next !== undefined) return next;\n\t}\n\treturn base;\n}\n\nfunction extractInstructions(\n\tinput: unknown,\n\tsystemPrompt: string | undefined,\n): { instructions?: string; input: unknown } {\n\t// Prefer context.systemPrompt (matches Codex stream path).\n\tif (systemPrompt && systemPrompt.length > 0) {\n\t\tconst stripped = stripLeadingSystemRoles(input);\n\t\treturn { instructions: systemPrompt, input: stripped ?? input };\n\t}\n\n\tif (!Array.isArray(input) || input.length === 0) {\n\t\treturn { input };\n\t}\n\n\tconst first = input[0];\n\tif (\n\t\tfirst &&\n\t\ttypeof first === \"object\" &&\n\t\t!Array.isArray(first) &&\n\t\t\"role\" in first &&\n\t\t((first as { role?: string }).role === \"system\" || (first as { role?: string }).role === \"developer\")\n\t) {\n\t\tconst content = (first as { content?: unknown }).content;\n\t\tconst text =\n\t\t\ttypeof content === \"string\"\n\t\t\t\t? content\n\t\t\t\t: Array.isArray(content)\n\t\t\t\t\t? content\n\t\t\t\t\t\t\t.map((part) =>\n\t\t\t\t\t\t\t\tpart && typeof part === \"object\" && \"text\" in part\n\t\t\t\t\t\t\t\t\t? String((part as { text: unknown }).text)\n\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join(\"\")\n\t\t\t\t\t: \"\";\n\t\treturn {\n\t\t\tinstructions: text || undefined,\n\t\t\tinput: input.slice(1),\n\t\t};\n\t}\n\n\treturn { input };\n}\n\nfunction stripLeadingSystemRoles(input: unknown): unknown {\n\tif (!Array.isArray(input) || input.length === 0) return input;\n\tconst first = input[0];\n\tif (\n\t\tfirst &&\n\t\ttypeof first === \"object\" &&\n\t\t!Array.isArray(first) &&\n\t\t((first as { role?: string }).role === \"system\" || (first as { role?: string }).role === \"developer\")\n\t) {\n\t\treturn input.slice(1);\n\t}\n\treturn input;\n}\n\nfunction clampCacheKey(sessionId: string | undefined): string | undefined {\n\tif (!sessionId) return undefined;\n\treturn sessionId.length <= 64 ? sessionId : sessionId.slice(0, 64);\n}\n\nexport function resolveResponsesUrl(baseUrl: string): string {\n\tconst normalized = baseUrl.trim().replace(/\\/+$/, \"\");\n\tif (!normalized) throw new Error(\"Model baseUrl is empty.\");\n\tif (normalized.endsWith(\"/responses\")) return normalized;\n\treturn `${normalized}/responses`;\n}\n\nexport function isRouterApi(api: string): boolean {\n\treturn api === ROUTER_API;\n}\n"]}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex-oriented Responses client for API relays.
|
|
3
|
+
*
|
|
4
|
+
* Follows Pi's documented custom-provider pattern (see coding-agent docs
|
|
5
|
+
* providers.md / custom-provider.md and examples/custom-provider-gitlab-duo):
|
|
6
|
+
* wrap a built-in pi-ai stream API from `@earendil-works/pi-ai/compat` instead of
|
|
7
|
+
* reimplementing SSE or deep-importing internal modules.
|
|
8
|
+
*
|
|
9
|
+
* We use openAIResponsesApi (works with relay sk- keys) and reshape the request
|
|
10
|
+
* payload toward Codex CLI style so transparent gateways receive a friendlier body.
|
|
11
|
+
*/
|
|
12
|
+
import { createAssistantMessageEventStream, openAIResponsesApi, } from "@earendil-works/pi-ai/compat";
|
|
13
|
+
import { DEFAULTS, formatError, ROUTER_API } from "./constants.js";
|
|
14
|
+
const responsesApi = openAIResponsesApi();
|
|
15
|
+
export function streamRouterCodex(model, context, options) {
|
|
16
|
+
const stream = createAssistantMessageEventStream();
|
|
17
|
+
void (async () => {
|
|
18
|
+
try {
|
|
19
|
+
const apiKey = options?.apiKey;
|
|
20
|
+
if (!apiKey)
|
|
21
|
+
throw new Error(`No API key for provider: ${model.provider}`);
|
|
22
|
+
// Built-in Responses stream expects api "openai-responses" on the model object.
|
|
23
|
+
const requestModel = {
|
|
24
|
+
...model,
|
|
25
|
+
api: "openai-responses",
|
|
26
|
+
compat: {
|
|
27
|
+
supportsDeveloperRole: true,
|
|
28
|
+
// Avoid underscore session_id header that strict proxies reject.
|
|
29
|
+
sessionAffinityFormat: "openai-nosession",
|
|
30
|
+
// Codex-style upstreams reject prompt_cache_retention: "24h".
|
|
31
|
+
supportsLongCacheRetention: false,
|
|
32
|
+
...(model.compat ?? {}),
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
const headers = {
|
|
36
|
+
originator: DEFAULTS.originator,
|
|
37
|
+
...options?.headers,
|
|
38
|
+
};
|
|
39
|
+
// Prefer hyphenated Codex-style session affinity when we have a session id.
|
|
40
|
+
const sessionId = clampCacheKey(options?.sessionId);
|
|
41
|
+
if (sessionId) {
|
|
42
|
+
if (!headers["session-id"])
|
|
43
|
+
headers["session-id"] = sessionId;
|
|
44
|
+
if (!headers["x-client-request-id"])
|
|
45
|
+
headers["x-client-request-id"] = sessionId;
|
|
46
|
+
}
|
|
47
|
+
const inner = responsesApi.streamSimple(requestModel, context, {
|
|
48
|
+
...options,
|
|
49
|
+
apiKey,
|
|
50
|
+
headers,
|
|
51
|
+
onPayload: (payload) => reshapePayloadForRelay(payload, context, options?.onPayload, requestModel),
|
|
52
|
+
});
|
|
53
|
+
for await (const event of inner) {
|
|
54
|
+
stream.push(event);
|
|
55
|
+
}
|
|
56
|
+
stream.end();
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// Match examples/custom-provider-gitlab-duo error event shape.
|
|
60
|
+
stream.push({
|
|
61
|
+
type: "error",
|
|
62
|
+
reason: options?.signal?.aborted ? "aborted" : "error",
|
|
63
|
+
error: {
|
|
64
|
+
role: "assistant",
|
|
65
|
+
content: [],
|
|
66
|
+
api: model.api,
|
|
67
|
+
provider: model.provider,
|
|
68
|
+
model: model.id,
|
|
69
|
+
usage: {
|
|
70
|
+
input: 0,
|
|
71
|
+
output: 0,
|
|
72
|
+
cacheRead: 0,
|
|
73
|
+
cacheWrite: 0,
|
|
74
|
+
totalTokens: 0,
|
|
75
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
76
|
+
},
|
|
77
|
+
stopReason: options?.signal?.aborted ? "aborted" : "error",
|
|
78
|
+
errorMessage: formatError(error),
|
|
79
|
+
timestamp: Date.now(),
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
stream.end();
|
|
83
|
+
}
|
|
84
|
+
})();
|
|
85
|
+
return stream;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Nudge the OpenAI Responses payload toward Codex CLI request shape for
|
|
89
|
+
* transparent relays: instructions + input, store:false, no max_output_tokens /
|
|
90
|
+
* prompt_cache_retention, verbosity + parallel_tool_calls.
|
|
91
|
+
*/
|
|
92
|
+
async function reshapePayloadForRelay(payload, context, userOnPayload, model) {
|
|
93
|
+
const base = payload && typeof payload === "object" && !Array.isArray(payload)
|
|
94
|
+
? { ...payload }
|
|
95
|
+
: {};
|
|
96
|
+
// Always safe for ChatGPT/Codex-style backends.
|
|
97
|
+
base.store = false;
|
|
98
|
+
base.stream = true;
|
|
99
|
+
// Codex CLI sends system prompt as `instructions`, not as a role message in input.
|
|
100
|
+
const { instructions, input } = extractInstructions(base.input, context.systemPrompt);
|
|
101
|
+
if (instructions)
|
|
102
|
+
base.instructions = instructions;
|
|
103
|
+
if (input !== undefined)
|
|
104
|
+
base.input = input;
|
|
105
|
+
// Fields common on Codex CLI / rejected by many transparent Codex upstreams.
|
|
106
|
+
if (!base.text || typeof base.text !== "object") {
|
|
107
|
+
base.text = { verbosity: "low" };
|
|
108
|
+
}
|
|
109
|
+
if (base.tool_choice === undefined)
|
|
110
|
+
base.tool_choice = "auto";
|
|
111
|
+
if (base.parallel_tool_calls === undefined)
|
|
112
|
+
base.parallel_tool_calls = true;
|
|
113
|
+
// Prefer encrypted reasoning content for multi-turn store:false sessions.
|
|
114
|
+
const include = Array.isArray(base.include) ? [...base.include] : [];
|
|
115
|
+
if (!include.includes("reasoning.encrypted_content")) {
|
|
116
|
+
include.push("reasoning.encrypted_content");
|
|
117
|
+
}
|
|
118
|
+
base.include = include;
|
|
119
|
+
// Drop Platform-only fields that Codex OAuth endpoints often 400 on.
|
|
120
|
+
delete base.prompt_cache_retention;
|
|
121
|
+
delete base.max_output_tokens;
|
|
122
|
+
delete base.temperature;
|
|
123
|
+
delete base.top_p;
|
|
124
|
+
delete base.user;
|
|
125
|
+
delete base.metadata;
|
|
126
|
+
delete base.service_tier;
|
|
127
|
+
delete base.truncation;
|
|
128
|
+
delete base.context_management;
|
|
129
|
+
delete base.safety_identifier;
|
|
130
|
+
delete base.stream_options;
|
|
131
|
+
if (userOnPayload) {
|
|
132
|
+
const next = await userOnPayload(base, model);
|
|
133
|
+
if (next !== undefined)
|
|
134
|
+
return next;
|
|
135
|
+
}
|
|
136
|
+
return base;
|
|
137
|
+
}
|
|
138
|
+
function extractInstructions(input, systemPrompt) {
|
|
139
|
+
// Prefer context.systemPrompt (matches Codex stream path).
|
|
140
|
+
if (systemPrompt && systemPrompt.length > 0) {
|
|
141
|
+
const stripped = stripLeadingSystemRoles(input);
|
|
142
|
+
return { instructions: systemPrompt, input: stripped ?? input };
|
|
143
|
+
}
|
|
144
|
+
if (!Array.isArray(input) || input.length === 0) {
|
|
145
|
+
return { input };
|
|
146
|
+
}
|
|
147
|
+
const first = input[0];
|
|
148
|
+
if (first &&
|
|
149
|
+
typeof first === "object" &&
|
|
150
|
+
!Array.isArray(first) &&
|
|
151
|
+
"role" in first &&
|
|
152
|
+
(first.role === "system" || first.role === "developer")) {
|
|
153
|
+
const content = first.content;
|
|
154
|
+
const text = typeof content === "string"
|
|
155
|
+
? content
|
|
156
|
+
: Array.isArray(content)
|
|
157
|
+
? content
|
|
158
|
+
.map((part) => part && typeof part === "object" && "text" in part
|
|
159
|
+
? String(part.text)
|
|
160
|
+
: "")
|
|
161
|
+
.join("")
|
|
162
|
+
: "";
|
|
163
|
+
return {
|
|
164
|
+
instructions: text || undefined,
|
|
165
|
+
input: input.slice(1),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return { input };
|
|
169
|
+
}
|
|
170
|
+
function stripLeadingSystemRoles(input) {
|
|
171
|
+
if (!Array.isArray(input) || input.length === 0)
|
|
172
|
+
return input;
|
|
173
|
+
const first = input[0];
|
|
174
|
+
if (first &&
|
|
175
|
+
typeof first === "object" &&
|
|
176
|
+
!Array.isArray(first) &&
|
|
177
|
+
(first.role === "system" || first.role === "developer")) {
|
|
178
|
+
return input.slice(1);
|
|
179
|
+
}
|
|
180
|
+
return input;
|
|
181
|
+
}
|
|
182
|
+
function clampCacheKey(sessionId) {
|
|
183
|
+
if (!sessionId)
|
|
184
|
+
return undefined;
|
|
185
|
+
return sessionId.length <= 64 ? sessionId : sessionId.slice(0, 64);
|
|
186
|
+
}
|
|
187
|
+
export function resolveResponsesUrl(baseUrl) {
|
|
188
|
+
const normalized = baseUrl.trim().replace(/\/+$/, "");
|
|
189
|
+
if (!normalized)
|
|
190
|
+
throw new Error("Model baseUrl is empty.");
|
|
191
|
+
if (normalized.endsWith("/responses"))
|
|
192
|
+
return normalized;
|
|
193
|
+
return `${normalized}/responses`;
|
|
194
|
+
}
|
|
195
|
+
export function isRouterApi(api) {
|
|
196
|
+
return api === ROUTER_API;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/extensions/router/stream.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Codex-oriented Responses client for API relays.\n *\n * Follows Pi's documented custom-provider pattern (see coding-agent docs\n * providers.md / custom-provider.md and examples/custom-provider-gitlab-duo):\n * wrap a built-in pi-ai stream API from `@earendil-works/pi-ai/compat` instead of\n * reimplementing SSE or deep-importing internal modules.\n *\n * We use openAIResponsesApi (works with relay sk- keys) and reshape the request\n * payload toward Codex CLI style so transparent gateways receive a friendlier body.\n */\n\nimport {\n\ttype Api,\n\ttype Context,\n\tcreateAssistantMessageEventStream,\n\ttype Model,\n\topenAIResponsesApi,\n\ttype SimpleStreamOptions,\n} from \"@earendil-works/pi-ai/compat\";\n\nimport { DEFAULTS, formatError, ROUTER_API } from \"./constants.ts\";\n\nconst responsesApi = openAIResponsesApi();\n\nexport function streamRouterCodex(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions?: SimpleStreamOptions,\n): ReturnType<typeof createAssistantMessageEventStream> {\n\tconst stream = createAssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey;\n\t\t\tif (!apiKey) throw new Error(`No API key for provider: ${model.provider}`);\n\n\t\t\t// Built-in Responses stream expects api \"openai-responses\" on the model object.\n\t\t\tconst requestModel = {\n\t\t\t\t...model,\n\t\t\t\tapi: \"openai-responses\" as const,\n\t\t\t\tcompat: {\n\t\t\t\t\tsupportsDeveloperRole: true,\n\t\t\t\t\t// Avoid underscore session_id header that strict proxies reject.\n\t\t\t\t\tsessionAffinityFormat: \"openai-nosession\" as const,\n\t\t\t\t\t// Codex-style upstreams reject prompt_cache_retention: \"24h\".\n\t\t\t\t\tsupportsLongCacheRetention: false,\n\t\t\t\t\t...(model.compat ?? {}),\n\t\t\t\t},\n\t\t\t} as Model<\"openai-responses\">;\n\n\t\t\tconst headers: Record<string, string> = {\n\t\t\t\toriginator: DEFAULTS.originator,\n\t\t\t\t...(options?.headers as Record<string, string> | undefined),\n\t\t\t};\n\n\t\t\t// Prefer hyphenated Codex-style session affinity when we have a session id.\n\t\t\tconst sessionId = clampCacheKey(options?.sessionId);\n\t\t\tif (sessionId) {\n\t\t\t\tif (!headers[\"session-id\"]) headers[\"session-id\"] = sessionId;\n\t\t\t\tif (!headers[\"x-client-request-id\"]) headers[\"x-client-request-id\"] = sessionId;\n\t\t\t}\n\n\t\t\tconst inner = responsesApi.streamSimple(requestModel, context, {\n\t\t\t\t...options,\n\t\t\t\tapiKey,\n\t\t\t\theaders,\n\t\t\t\tonPayload: (payload) => reshapePayloadForRelay(payload, context, options?.onPayload, requestModel),\n\t\t\t});\n\n\t\t\tfor await (const event of inner) {\n\t\t\t\tstream.push(event);\n\t\t\t}\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\t// Match examples/custom-provider-gitlab-duo error event shape.\n\t\t\tstream.push({\n\t\t\t\ttype: \"error\",\n\t\t\t\treason: options?.signal?.aborted ? \"aborted\" : \"error\",\n\t\t\t\terror: {\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tcontent: [],\n\t\t\t\t\tapi: model.api,\n\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\tmodel: model.id,\n\t\t\t\t\tusage: {\n\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t},\n\t\t\t\t\tstopReason: options?.signal?.aborted ? \"aborted\" : \"error\",\n\t\t\t\t\terrorMessage: formatError(error),\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n}\n\n/**\n * Nudge the OpenAI Responses payload toward Codex CLI request shape for\n * transparent relays: instructions + input, store:false, no max_output_tokens /\n * prompt_cache_retention, verbosity + parallel_tool_calls.\n */\nasync function reshapePayloadForRelay(\n\tpayload: unknown,\n\tcontext: Context,\n\tuserOnPayload: SimpleStreamOptions[\"onPayload\"],\n\tmodel: Model<\"openai-responses\">,\n): Promise<unknown> {\n\tconst base =\n\t\tpayload && typeof payload === \"object\" && !Array.isArray(payload)\n\t\t\t? { ...(payload as Record<string, unknown>) }\n\t\t\t: ({} as Record<string, unknown>);\n\n\t// Always safe for ChatGPT/Codex-style backends.\n\tbase.store = false;\n\tbase.stream = true;\n\n\t// Codex CLI sends system prompt as `instructions`, not as a role message in input.\n\tconst { instructions, input } = extractInstructions(base.input, context.systemPrompt);\n\tif (instructions) base.instructions = instructions;\n\tif (input !== undefined) base.input = input;\n\n\t// Fields common on Codex CLI / rejected by many transparent Codex upstreams.\n\tif (!base.text || typeof base.text !== \"object\") {\n\t\tbase.text = { verbosity: \"low\" };\n\t}\n\tif (base.tool_choice === undefined) base.tool_choice = \"auto\";\n\tif (base.parallel_tool_calls === undefined) base.parallel_tool_calls = true;\n\n\t// Prefer encrypted reasoning content for multi-turn store:false sessions.\n\tconst include = Array.isArray(base.include) ? [...(base.include as unknown[])] : [];\n\tif (!include.includes(\"reasoning.encrypted_content\")) {\n\t\tinclude.push(\"reasoning.encrypted_content\");\n\t}\n\tbase.include = include;\n\n\t// Drop Platform-only fields that Codex OAuth endpoints often 400 on.\n\tdelete base.prompt_cache_retention;\n\tdelete base.max_output_tokens;\n\tdelete base.temperature;\n\tdelete base.top_p;\n\tdelete base.user;\n\tdelete base.metadata;\n\tdelete base.service_tier;\n\tdelete base.truncation;\n\tdelete base.context_management;\n\tdelete base.safety_identifier;\n\tdelete base.stream_options;\n\n\tif (userOnPayload) {\n\t\tconst next = await userOnPayload(base, model);\n\t\tif (next !== undefined) return next;\n\t}\n\treturn base;\n}\n\nfunction extractInstructions(\n\tinput: unknown,\n\tsystemPrompt: string | undefined,\n): { instructions?: string; input: unknown } {\n\t// Prefer context.systemPrompt (matches Codex stream path).\n\tif (systemPrompt && systemPrompt.length > 0) {\n\t\tconst stripped = stripLeadingSystemRoles(input);\n\t\treturn { instructions: systemPrompt, input: stripped ?? input };\n\t}\n\n\tif (!Array.isArray(input) || input.length === 0) {\n\t\treturn { input };\n\t}\n\n\tconst first = input[0];\n\tif (\n\t\tfirst &&\n\t\ttypeof first === \"object\" &&\n\t\t!Array.isArray(first) &&\n\t\t\"role\" in first &&\n\t\t((first as { role?: string }).role === \"system\" || (first as { role?: string }).role === \"developer\")\n\t) {\n\t\tconst content = (first as { content?: unknown }).content;\n\t\tconst text =\n\t\t\ttypeof content === \"string\"\n\t\t\t\t? content\n\t\t\t\t: Array.isArray(content)\n\t\t\t\t\t? content\n\t\t\t\t\t\t\t.map((part) =>\n\t\t\t\t\t\t\t\tpart && typeof part === \"object\" && \"text\" in part\n\t\t\t\t\t\t\t\t\t? String((part as { text: unknown }).text)\n\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join(\"\")\n\t\t\t\t\t: \"\";\n\t\treturn {\n\t\t\tinstructions: text || undefined,\n\t\t\tinput: input.slice(1),\n\t\t};\n\t}\n\n\treturn { input };\n}\n\nfunction stripLeadingSystemRoles(input: unknown): unknown {\n\tif (!Array.isArray(input) || input.length === 0) return input;\n\tconst first = input[0];\n\tif (\n\t\tfirst &&\n\t\ttypeof first === \"object\" &&\n\t\t!Array.isArray(first) &&\n\t\t((first as { role?: string }).role === \"system\" || (first as { role?: string }).role === \"developer\")\n\t) {\n\t\treturn input.slice(1);\n\t}\n\treturn input;\n}\n\nfunction clampCacheKey(sessionId: string | undefined): string | undefined {\n\tif (!sessionId) return undefined;\n\treturn sessionId.length <= 64 ? sessionId : sessionId.slice(0, 64);\n}\n\nexport function resolveResponsesUrl(baseUrl: string): string {\n\tconst normalized = baseUrl.trim().replace(/\\/+$/, \"\");\n\tif (!normalized) throw new Error(\"Model baseUrl is empty.\");\n\tif (normalized.endsWith(\"/responses\")) return normalized;\n\treturn `${normalized}/responses`;\n}\n\nexport function isRouterApi(api: string): boolean {\n\treturn api === ROUTER_API;\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "./constants.ts";
|
|
2
|
+
export type ThinkingLevelMap = Partial<Record<ThinkingLevel, string | null>>;
|
|
3
|
+
export interface RelayModelConfig {
|
|
4
|
+
id: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
reasoning?: boolean;
|
|
7
|
+
input?: Array<"text" | "image">;
|
|
8
|
+
contextWindow?: number;
|
|
9
|
+
maxTokens?: number;
|
|
10
|
+
thinkingLevelMap?: ThinkingLevelMap;
|
|
11
|
+
}
|
|
12
|
+
export interface RelayConfig {
|
|
13
|
+
/** Provider id shown as provider/model (no slashes). */
|
|
14
|
+
id: string;
|
|
15
|
+
baseUrl: string;
|
|
16
|
+
apiKey: string;
|
|
17
|
+
models: RelayModelConfig[];
|
|
18
|
+
}
|
|
19
|
+
export interface RouterFile {
|
|
20
|
+
version: number;
|
|
21
|
+
relays: RelayConfig[];
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extensions/router/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC3B,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,EAAE,CAAC;CACtB","sourcesContent":["import type { ThinkingLevel } from \"./constants.ts\";\n\nexport type ThinkingLevelMap = Partial<Record<ThinkingLevel, string | null>>;\n\nexport interface RelayModelConfig {\n\tid: string;\n\tname?: string;\n\treasoning?: boolean;\n\tinput?: Array<\"text\" | \"image\">;\n\tcontextWindow?: number;\n\tmaxTokens?: number;\n\tthinkingLevelMap?: ThinkingLevelMap;\n}\n\nexport interface RelayConfig {\n\t/** Provider id shown as provider/model (no slashes). */\n\tid: string;\n\tbaseUrl: string;\n\tapiKey: string;\n\tmodels: RelayModelConfig[];\n}\n\nexport interface RouterFile {\n\tversion: number;\n\trelays: RelayConfig[];\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/extensions/router/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ThinkingLevel } from \"./constants.ts\";\n\nexport type ThinkingLevelMap = Partial<Record<ThinkingLevel, string | null>>;\n\nexport interface RelayModelConfig {\n\tid: string;\n\tname?: string;\n\treasoning?: boolean;\n\tinput?: Array<\"text\" | \"image\">;\n\tcontextWindow?: number;\n\tmaxTokens?: number;\n\tthinkingLevelMap?: ThinkingLevelMap;\n}\n\nexport interface RelayConfig {\n\t/** Provider id shown as provider/model (no slashes). */\n\tid: string;\n\tbaseUrl: string;\n\tapiKey: string;\n\tmodels: RelayModelConfig[];\n}\n\nexport interface RouterFile {\n\tversion: number;\n\trelays: RelayConfig[];\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /router interactive flows: list, add, edit, fetch, thinking map.
|
|
3
|
+
*
|
|
4
|
+
* Relay edits auto-save to router.json (no separate Save step). Nested multi-select
|
|
5
|
+
* and thinking editors require Ctrl+S to apply, and warn on Esc when dirty.
|
|
6
|
+
*/
|
|
7
|
+
import type { ExtensionAPI, ExtensionCommandContext } from "../../core/extensions/types.ts";
|
|
8
|
+
export declare function runRouterCommand(args: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../src/extensions/router/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAU5F,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,uBAAuB,EAAE,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BlH","sourcesContent":["/**\n * /router interactive flows: list, add, edit, fetch, thinking map.\n *\n * Relay edits auto-save to router.json (no separate Save step). Nested multi-select\n * and thinking editors require Ctrl+S to apply, and warn on Esc when dirty.\n */\n\nimport type { ExtensionAPI, ExtensionCommandContext } from \"../../core/extensions/types.ts\";\nimport { BorderedLoader } from \"../../modes/interactive/components/bordered-loader.ts\";\nimport { formatError, isValidRelayId, NO_UI_WARNING, truncate } from \"./constants.ts\";\nimport { createModelChecklist, createSearchableSelector, createThinkingMapEditor } from \"./dialog.ts\";\nimport { createDefaultModelConfig, displayModelLabel, resolveModelConfig, summarizeThinkingMap } from \"./presets.ts\";\nimport { probeRelayModels } from \"./probe.ts\";\nimport { applyRouterFile, registerOneRelay, unregisterOneRelay } from \"./register.ts\";\nimport { loadRouterFile, removeRelay, upsertRelay } from \"./store.ts\";\nimport type { RelayConfig, RelayModelConfig } from \"./types.ts\";\n\nexport async function runRouterCommand(args: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(NO_UI_WARNING, \"warning\");\n\t\treturn;\n\t}\n\tconst trimmed = args.trim().toLowerCase();\n\tif (!trimmed || trimmed === \"list\") {\n\t\tawait openMainMenu(ctx, pi);\n\t\treturn;\n\t}\n\tif (trimmed === \"add\") {\n\t\tawait addRelayFlow(ctx, pi);\n\t\treturn;\n\t}\n\tif (trimmed === \"reload\") {\n\t\tconst file = await loadRouterFile();\n\t\tapplyRouterFile(pi, file);\n\t\tawait ctx.modelRegistry.refresh();\n\t\tctx.ui.notify(`Reloaded ${file.relays.length} relay(s).`, \"info\");\n\t\treturn;\n\t}\n\t// Treat as relay id open\n\tconst file = await loadRouterFile();\n\tconst exact = file.relays.find((relay) => relay.id.toLowerCase() === trimmed);\n\tif (exact) {\n\t\tawait editRelayFlow(ctx, pi, exact);\n\t\treturn;\n\t}\n\tawait openMainMenu(ctx, pi, args.trim());\n}\n\nasync function openMainMenu(ctx: ExtensionCommandContext, pi: ExtensionAPI, initialQuery?: string): Promise<void> {\n\tlet cursor: string | undefined;\n\tlet query = initialQuery;\n\twhile (true) {\n\t\tconst file = await loadRouterFile();\n\t\t// Relays first (primary content), actions at the bottom.\n\t\tconst items = [\n\t\t\t...file.relays.map((relay) => ({\n\t\t\t\tvalue: `relay:${relay.id}`,\n\t\t\t\tlabel: relay.id,\n\t\t\t\tdescription: `${relay.models.length} model${relay.models.length === 1 ? \"\" : \"s\"} · ${truncate(relay.baseUrl, 40)}`,\n\t\t\t\tsearchText: `${relay.id} ${relay.baseUrl}`,\n\t\t\t})),\n\t\t\t{\n\t\t\t\tvalue: \"action:add\",\n\t\t\t\tlabel: \"+ Add relay\",\n\t\t\t\tdescription: \"Name · base URL · API key · fetch models\",\n\t\t\t\tsearchText: \"add create new relay gateway\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tvalue: \"action:reload\",\n\t\t\t\tlabel: \"Reload from disk\",\n\t\t\t\tdescription: \"Re-register providers from router.json\",\n\t\t\t\tsearchText: \"reload refresh\",\n\t\t\t},\n\t\t];\n\n\t\tconst selected =\n\t\t\tctx.mode === \"tui\"\n\t\t\t\t? await ctx.ui.custom(\n\t\t\t\t\t\tcreateSearchableSelector({\n\t\t\t\t\t\t\ttitle: \"API relays\",\n\t\t\t\t\t\t\tsubtitle:\n\t\t\t\t\t\t\t\tfile.relays.length === 0\n\t\t\t\t\t\t\t\t\t? \"No relays yet — add a base URL + API key.\"\n\t\t\t\t\t\t\t\t\t: `${file.relays.length} relay${file.relays.length === 1 ? \"\" : \"s\"} · Enter opens · Esc closes`,\n\t\t\t\t\t\t\titems,\n\t\t\t\t\t\t\tinitialValue: cursor,\n\t\t\t\t\t\t\tinitialQuery: query,\n\t\t\t\t\t\t\tmaxVisible: 12,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t: await selectNative(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\"API relays\",\n\t\t\t\t\t\titems.map((item) => ({ value: item.value, label: item.label, description: item.description })),\n\t\t\t\t\t);\n\n\t\tquery = undefined;\n\t\tif (selected === undefined) return;\n\t\tcursor = selected;\n\n\t\tif (selected === \"action:add\") {\n\t\t\tconst id = await addRelayFlow(ctx, pi);\n\t\t\tif (id) cursor = `relay:${id}`;\n\t\t\tcontinue;\n\t\t}\n\t\tif (selected === \"action:reload\") {\n\t\t\tconst latest = await loadRouterFile();\n\t\t\tapplyRouterFile(pi, latest);\n\t\t\tawait ctx.modelRegistry.refresh();\n\t\t\tctx.ui.notify(`Reloaded ${latest.relays.length} relay(s).`, \"info\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (selected.startsWith(\"relay:\")) {\n\t\t\tconst id = selected.slice(\"relay:\".length);\n\t\t\tconst latest = await loadRouterFile();\n\t\t\tconst relay = latest.relays.find((entry) => entry.id === id);\n\t\t\tif (!relay) {\n\t\t\t\tctx.ui.notify(`Relay \"${id}\" not found.`, \"warning\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait editRelayFlow(ctx, pi, relay);\n\t\t}\n\t}\n}\n\nasync function addRelayFlow(ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<string | undefined> {\n\tconst file = await loadRouterFile();\n\tconst existing = new Set(file.relays.map((relay) => relay.id));\n\n\tconst id = await promptText(ctx, \"New relay · name (provider id)\", \"my-relay\", (value) => {\n\t\tconst trimmed = value.trim();\n\t\tif (!trimmed) return \"Name is required.\";\n\t\tif (!isValidRelayId(trimmed)) return \"Name cannot be empty or contain '/'.\";\n\t\tif (existing.has(trimmed)) return `Relay \"${trimmed}\" already exists.`;\n\t\treturn undefined;\n\t});\n\tif (id === undefined) return undefined;\n\n\tconst baseUrl = await promptText(ctx, `New relay · ${id.trim()} · base URL`, \"https://relay.example/v1\", (value) => {\n\t\tconst trimmed = value.trim();\n\t\tif (!trimmed) return \"Base URL is required.\";\n\t\ttry {\n\t\t\tconst url = new URL(trimmed);\n\t\t\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") return \"Use http or https.\";\n\t\t} catch {\n\t\t\treturn \"Invalid URL.\";\n\t\t}\n\t\treturn undefined;\n\t});\n\tif (baseUrl === undefined) return undefined;\n\n\tconst apiKey = await promptText(ctx, `New relay · ${id.trim()} · API key`, \"sk-… or $RELAY_KEY\", (value) => {\n\t\tif (!value.trim()) return \"API key is required.\";\n\t\treturn undefined;\n\t});\n\tif (apiKey === undefined) return undefined;\n\n\tconst relay: RelayConfig = {\n\t\tid: id.trim(),\n\t\tbaseUrl: baseUrl.trim().replace(/\\/+$/, \"\"),\n\t\tapiKey: apiKey.trim(),\n\t\tmodels: [],\n\t};\n\n\tconst models = await fetchAndSelectModels(ctx, relay, new Set());\n\tif (models === undefined) {\n\t\tconst keep = await ctx.ui.confirm(\n\t\t\t\"Save relay without models?\",\n\t\t\t\"You can fetch models later from the relay editor. Changes auto-save after that.\",\n\t\t);\n\t\tif (!keep) return undefined;\n\t} else {\n\t\trelay.models = models;\n\t}\n\n\tawait persistRelay(ctx, pi, relay, {\n\t\tnotify:\n\t\t\trelay.models.length > 0\n\t\t\t\t? `Saved \"${relay.id}\" with ${relay.models.length} model(s).`\n\t\t\t\t: `Saved \"${relay.id}\" (no models yet).`,\n\t});\n\treturn relay.id;\n}\n\n/**\n * Relay editor — flat menu. Every mutation writes router.json immediately.\n * Hierarchy: list → relay → (models list | connection field | fetch | remove).\n */\nasync function editRelayFlow(ctx: ExtensionCommandContext, pi: ExtensionAPI, initial: RelayConfig): Promise<void> {\n\tconst relay = structuredClone(initial);\n\twhile (true) {\n\t\tconst modelSummary =\n\t\t\trelay.models.length === 0\n\t\t\t\t? \"none yet — fetch catalog\"\n\t\t\t\t: relay.models.length <= 3\n\t\t\t\t\t? relay.models.map((m) => displayModelLabel(m)).join(\", \")\n\t\t\t\t\t: `${relay.models.length} models · ${relay.models\n\t\t\t\t\t\t\t.slice(0, 2)\n\t\t\t\t\t\t\t.map((m) => displayModelLabel(m))\n\t\t\t\t\t\t\t.join(\", \")}…`;\n\n\t\tconst choice = await selectNative(ctx, `Relay · ${relay.id}`, [\n\t\t\t{\n\t\t\t\tvalue: \"models\",\n\t\t\t\tlabel: \"Models\",\n\t\t\t\tdescription: modelSummary,\n\t\t\t},\n\t\t\t{ value: \"baseUrl\", label: \"Base URL\", description: relay.baseUrl },\n\t\t\t{ value: \"apiKey\", label: \"API key\", description: maskKey(relay.apiKey) },\n\t\t\t{ value: \"remove\", label: \"Remove relay\", description: \"Delete from router.json\" },\n\t\t\t{ value: \"back\", label: \"Back\", description: \"All edits already saved\" },\n\t\t]);\n\t\tif (choice === undefined || choice === \"back\") return;\n\n\t\tif (choice === \"baseUrl\") {\n\t\t\tconst next = await promptText(ctx, `Relay · ${relay.id} · base URL`, relay.baseUrl, (value) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst url = new URL(value.trim());\n\t\t\t\t\tif (url.protocol !== \"http:\" && url.protocol !== \"https:\") return \"Use http or https.\";\n\t\t\t\t} catch {\n\t\t\t\t\treturn \"Invalid URL.\";\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\tif (next === undefined) continue;\n\t\t\tconst normalized = next.trim().replace(/\\/+$/, \"\");\n\t\t\tif (normalized === relay.baseUrl) continue;\n\t\t\trelay.baseUrl = normalized;\n\t\t\tawait persistRelay(ctx, pi, relay, { notify: `Saved base URL for \"${relay.id}\".` });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (choice === \"apiKey\") {\n\t\t\tconst next = await promptText(ctx, `Relay · ${relay.id} · API key`, relay.apiKey, (value) =>\n\t\t\t\tvalue.trim() ? undefined : \"API key is required.\",\n\t\t\t);\n\t\t\tif (next === undefined) continue;\n\t\t\tconst trimmed = next.trim();\n\t\t\tif (trimmed === relay.apiKey) continue;\n\t\t\trelay.apiKey = trimmed;\n\t\t\tawait persistRelay(ctx, pi, relay, { notify: `Saved API key for \"${relay.id}\".` });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (choice === \"models\") {\n\t\t\t// Always open the models screen (fetch lives only here). Empty list still\n\t\t\t// shows Fetch so the path is Relay → Models → Fetch, not a top-level shortcut.\n\t\t\tawait manageModelsFlow(ctx, pi, relay);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (choice === \"remove\") {\n\t\t\tconst ok = await ctx.ui.confirm(`Remove relay \"${relay.id}\"?`, \"Models will disappear from /model.\");\n\t\t\tif (!ok) continue;\n\t\t\tawait removeRelay(relay.id);\n\t\t\tunregisterOneRelay(pi, relay.id);\n\t\t\tawait ctx.modelRegistry.refresh();\n\t\t\tctx.ui.notify(`Removed relay \"${relay.id}\".`, \"info\");\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/**\n * Models screen: flat list of configured models + fetch. Selecting a model opens\n * its editor (name / thinking). No extra \"customize vs list\" intermediate menu.\n */\nasync function manageModelsFlow(ctx: ExtensionCommandContext, pi: ExtensionAPI, relay: RelayConfig): Promise<void> {\n\twhile (true) {\n\t\tconst empty = relay.models.length === 0;\n\t\tconst items: Array<{ value: string; label: string; description?: string }> = [\n\t\t\t{\n\t\t\t\tvalue: \"action:fetch\",\n\t\t\t\tlabel: \"Fetch catalog\",\n\t\t\t\tdescription: empty\n\t\t\t\t\t? \"GET /models · multi-select · auto-saves\"\n\t\t\t\t\t: \"Refresh from server (keeps name/thinking for kept ids)\",\n\t\t\t},\n\t\t\t...relay.models.map((model) => {\n\t\t\t\tconst resolved = resolveModelConfig(model);\n\t\t\t\tconst label = displayModelLabel(resolved);\n\t\t\t\tconst thinking = summarizeThinkingMap(resolved.thinkingLevelMap);\n\t\t\t\treturn {\n\t\t\t\t\tvalue: `model:${model.id}`,\n\t\t\t\t\tlabel: model.id,\n\t\t\t\t\tdescription: label !== model.id ? `${label} · ${thinking}` : thinking,\n\t\t\t\t};\n\t\t\t}),\n\t\t\t{ value: \"action:back\", label: \"Back\", description: \"Return to relay\" },\n\t\t];\n\n\t\tconst choice = await selectNative(ctx, `Relay · ${relay.id} · models`, items);\n\t\tif (choice === undefined || choice === \"action:back\") return;\n\n\t\tif (choice === \"action:fetch\") {\n\t\t\tconst selected = await fetchAndSelectModels(ctx, relay, new Set(relay.models.map((m) => m.id)));\n\t\t\tif (!selected) continue;\n\t\t\trelay.models = mergeModelSelection(relay.models, selected);\n\t\t\tawait persistRelay(ctx, pi, relay, {\n\t\t\t\tnotify: `Saved \"${relay.id}\" · ${relay.models.length} model(s).`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (choice.startsWith(\"model:\")) {\n\t\t\tconst modelId = choice.slice(\"model:\".length);\n\t\t\tconst model = relay.models.find((entry) => entry.id === modelId);\n\t\t\tif (!model) continue;\n\t\t\tawait editModelFlow(ctx, pi, relay, model);\n\t\t}\n\t}\n}\n\n/** Single-model editor: display name + thinking. Auto-saves each applied change. */\nasync function editModelFlow(\n\tctx: ExtensionCommandContext,\n\tpi: ExtensionAPI,\n\trelay: RelayConfig,\n\tmodel: RelayModelConfig,\n): Promise<void> {\n\twhile (true) {\n\t\tconst resolved = resolveModelConfig(model);\n\t\tconst nameDesc = resolved.name ? resolved.name : \"(empty · /model shows id)\";\n\t\tconst action = await selectNative(ctx, `Relay · ${relay.id} · ${model.id}`, [\n\t\t\t{ value: \"name\", label: \"Display name\", description: nameDesc },\n\t\t\t{\n\t\t\t\tvalue: \"thinking\",\n\t\t\t\tlabel: \"Thinking levels\",\n\t\t\t\tdescription: summarizeThinkingMap(resolved.thinkingLevelMap),\n\t\t\t},\n\t\t\t{ value: \"back\", label: \"Back\", description: \"Edits auto-save when applied\" },\n\t\t]);\n\t\tif (action === undefined || action === \"back\") return;\n\n\t\tif (action === \"name\") {\n\t\t\tconst next = await promptText(ctx, `Display name · ${model.id} (empty = show id)`, resolved.name ?? \"\");\n\t\t\tif (next === undefined) continue;\n\t\t\tconst trimmed = next.trim();\n\t\t\tconst nextName = !trimmed || trimmed === model.id ? undefined : trimmed;\n\t\t\tconst prevName = model.name?.trim() && model.name.trim() !== model.id ? model.name.trim() : undefined;\n\t\t\tif (nextName === prevName) continue;\n\t\t\tif (nextName) model.name = nextName;\n\t\t\telse delete model.name;\n\t\t\tawait persistRelay(ctx, pi, relay, {\n\t\t\t\tnotify: model.name\n\t\t\t\t\t? `Saved display name \"${model.name}\" for ${model.id}.`\n\t\t\t\t\t: `Cleared display name for ${model.id}; /model shows id.`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (action === \"thinking\") {\n\t\t\tconst nextMap =\n\t\t\t\tctx.mode === \"tui\"\n\t\t\t\t\t? await ctx.ui.custom(\n\t\t\t\t\t\t\tcreateThinkingMapEditor({\n\t\t\t\t\t\t\t\ttitle: `Thinking · ${relay.id} / ${model.id}`,\n\t\t\t\t\t\t\t\tmap: resolved.thinkingLevelMap,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t: await editThinkingMapNative(ctx, resolved.thinkingLevelMap);\n\t\t\tif (!nextMap) continue;\n\t\t\tmodel.thinkingLevelMap = nextMap;\n\t\t\tmodel.reasoning = true;\n\t\t\tawait persistRelay(ctx, pi, relay, {\n\t\t\t\tnotify: `Saved thinking levels for ${model.id}.`,\n\t\t\t});\n\t\t}\n\t}\n}\n\nasync function editThinkingMapNative(\n\tctx: ExtensionCommandContext,\n\tmap: RelayModelConfig[\"thinkingLevelMap\"],\n): Promise<RelayModelConfig[\"thinkingLevelMap\"] | undefined> {\n\tconst working = { ...(map ?? {}) };\n\twhile (true) {\n\t\tconst choice = await selectNative(ctx, \"Toggle thinking level\", [\n\t\t\t...([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const).map((level) => ({\n\t\t\t\tvalue: level,\n\t\t\t\tlabel: level,\n\t\t\t\tdescription:\n\t\t\t\t\tworking[level] === null ? \"hidden\" : working[level] === undefined ? \"default\" : String(working[level]),\n\t\t\t})),\n\t\t\t{ value: \"done\", label: \"Apply\" },\n\t\t\t{ value: \"cancel\", label: \"Cancel\" },\n\t\t]);\n\t\tif (choice === undefined || choice === \"cancel\") return undefined;\n\t\tif (choice === \"done\") return working;\n\t\tif (working[choice] === null) working[choice] = choice === \"off\" ? \"none\" : choice;\n\t\telse working[choice] = null;\n\t}\n}\n\nasync function fetchAndSelectModels(\n\tctx: ExtensionCommandContext,\n\trelay: Pick<RelayConfig, \"id\" | \"baseUrl\" | \"apiKey\">,\n\tinitiallySelected: ReadonlySet<string>,\n): Promise<RelayModelConfig[] | undefined> {\n\tconst probeOptions = {\n\t\tbaseUrl: relay.baseUrl,\n\t\tapiKey: literalKey(relay.apiKey),\n\t};\n\n\tlet result: Awaited<ReturnType<typeof probeRelayModels>> | undefined;\n\tif (ctx.mode === \"tui\") {\n\t\tresult = await ctx.ui.custom<Awaited<ReturnType<typeof probeRelayModels>> | undefined>(\n\t\t\t(tui, theme, _kb, done) => {\n\t\t\t\tconst loader = new BorderedLoader(tui, theme, `Fetching models · ${relay.id}`, {\n\t\t\t\t\tcancellable: true,\n\t\t\t\t});\n\t\t\t\tlet settled = false;\n\t\t\t\tconst finish = (value: Awaited<ReturnType<typeof probeRelayModels>> | undefined) => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tloader.dispose();\n\t\t\t\t\tdone(value);\n\t\t\t\t};\n\t\t\t\tloader.onAbort = () => finish(undefined);\n\t\t\t\tvoid probeRelayModels({ ...probeOptions, signal: loader.signal })\n\t\t\t\t\t.then(finish)\n\t\t\t\t\t.catch((error) => finish({ ok: false, error: formatError(error) }));\n\t\t\t\treturn loader;\n\t\t\t},\n\t\t);\n\t} else {\n\t\tctx.ui.notify(`Fetching models from ${relay.baseUrl}…`, \"info\");\n\t\tresult = await probeRelayModels(probeOptions);\n\t}\n\n\tif (result === undefined) return undefined;\n\tif (!result.ok) {\n\t\tctx.ui.notify(`Fetch failed: ${result.error}`, \"error\");\n\t\tconst manual = await ctx.ui.confirm(\"Add model IDs manually?\", \"Comma-separated ids.\");\n\t\tif (!manual) return undefined;\n\t\treturn manualModelEntry(ctx);\n\t}\n\tif (result.models.length === 0) {\n\t\tctx.ui.notify(\"Server returned an empty model list.\", \"warning\");\n\t\treturn manualModelEntry(ctx);\n\t}\n\tif (result.truncated) {\n\t\tctx.ui.notify(\"Catalog truncated to 2,000 models.\", \"warning\");\n\t}\n\n\tlet selectedIds: string[];\n\tif (ctx.mode === \"tui\") {\n\t\tconst choice = await ctx.ui.custom(\n\t\t\tcreateModelChecklist({\n\t\t\t\ttitle: `Select models · ${relay.id}`,\n\t\t\t\tsubtitle: \"Space toggle · Ctrl+S apply · Esc warns if unsaved\",\n\t\t\t\tmodels: result.models,\n\t\t\t\tinitiallySelected,\n\t\t\t}),\n\t\t);\n\t\tif (choice.kind === \"cancel\") return undefined;\n\t\tselectedIds = choice.selectedIds;\n\t} else {\n\t\tconst ok = await ctx.ui.confirm(\n\t\t\t`Import ${result.models.length} models?`,\n\t\t\t\"Non-TUI mode imports the full catalog. Prefer the terminal UI to multi-select.\",\n\t\t);\n\t\tif (!ok) return undefined;\n\t\tselectedIds = result.models.map((model) => model.id);\n\t}\n\n\tif (selectedIds.length === 0) {\n\t\tctx.ui.notify(\"No models selected.\", \"warning\");\n\t\treturn undefined;\n\t}\n\n\t// Do not import remote catalog names — leave name empty so /model shows the id\n\t// unless the user sets a custom display name later.\n\treturn selectedIds.map((id) => createDefaultModelConfig(id));\n}\n\nasync function manualModelEntry(ctx: ExtensionCommandContext): Promise<RelayModelConfig[] | undefined> {\n\tconst value = await ctx.ui.input(\"Model IDs (comma-separated)\", \"gpt-5.6-sol, gpt-5.6-luna\");\n\tif (value === undefined) return undefined;\n\tconst ids = value\n\t\t.split(/[,\\r\\n]+/)\n\t\t.map((id) => id.trim())\n\t\t.filter(Boolean);\n\tif (ids.length === 0) {\n\t\tctx.ui.notify(\"Enter at least one model id.\", \"warning\");\n\t\treturn undefined;\n\t}\n\treturn ids.map((id) => createDefaultModelConfig(id));\n}\n\n/** Keep prior customizations when re-selecting overlapping ids. */\nfunction mergeModelSelection(previous: RelayModelConfig[], selected: RelayModelConfig[]): RelayModelConfig[] {\n\tconst prior = new Map(previous.map((model) => [model.id, model]));\n\treturn selected.map((model) => {\n\t\tconst old = prior.get(model.id);\n\t\tif (!old) return model;\n\t\tconst merged: RelayModelConfig = {\n\t\t\t...model,\n\t\t\treasoning: old.reasoning ?? model.reasoning,\n\t\t\tinput: old.input ?? model.input,\n\t\t\tcontextWindow: old.contextWindow ?? model.contextWindow,\n\t\t\tmaxTokens: old.maxTokens ?? model.maxTokens,\n\t\t\tthinkingLevelMap: old.thinkingLevelMap ?? model.thinkingLevelMap,\n\t\t};\n\t\t// Preserve a user-set display name; never invent one on re-fetch.\n\t\tif (old.name?.trim() && old.name.trim() !== old.id) merged.name = old.name.trim();\n\t\telse delete merged.name;\n\t\treturn merged;\n\t});\n}\n\nasync function persistRelay(\n\tctx: ExtensionCommandContext,\n\tpi: ExtensionAPI,\n\trelay: RelayConfig,\n\topts?: { notify?: string },\n): Promise<void> {\n\tawait upsertRelay(relay);\n\tregisterOneRelay(pi, relay);\n\tawait ctx.modelRegistry.refresh();\n\tif (opts?.notify) ctx.ui.notify(opts.notify, \"info\");\n}\n\nasync function promptText(\n\tctx: ExtensionCommandContext,\n\ttitle: string,\n\tplaceholder: string,\n\tvalidate?: (value: string) => string | undefined,\n): Promise<string | undefined> {\n\twhile (true) {\n\t\tconst value = await ctx.ui.input(title, placeholder);\n\t\tif (value === undefined) return undefined;\n\t\tconst error = validate?.(value);\n\t\tif (error) {\n\t\t\tctx.ui.notify(error, \"warning\");\n\t\t\tcontinue;\n\t\t}\n\t\treturn value;\n\t}\n}\n\nasync function selectNative<T extends string>(\n\tctx: ExtensionCommandContext,\n\ttitle: string,\n\titems: ReadonlyArray<{ value: T; label: string; description?: string }>,\n): Promise<T | undefined> {\n\tif (ctx.mode === \"tui\") {\n\t\treturn ctx.ui.custom(\n\t\t\tcreateSearchableSelector({\n\t\t\t\ttitle,\n\t\t\t\titems,\n\t\t\t\tmaxVisible: Math.min(12, Math.max(1, items.length)),\n\t\t\t}),\n\t\t);\n\t}\n\tconst labels = items.map((item) => (item.description ? `${item.label} — ${item.description}` : item.label));\n\tconst selected = await ctx.ui.select(title, labels);\n\tif (selected === undefined) return undefined;\n\treturn items[labels.indexOf(selected)]?.value;\n}\n\nfunction maskKey(key: string): string {\n\tif (key.startsWith(\"$\") || key.startsWith(\"!\")) return key;\n\tif (key.length <= 8) return \"••••\";\n\treturn `${key.slice(0, 4)}…${key.slice(-4)}`;\n}\n\n/** Best-effort key for catalog fetch (full resolution still goes through Pi at request time). */\nfunction literalKey(apiKey: string): string | undefined {\n\tconst trimmed = apiKey.trim();\n\tif (!trimmed || trimmed.startsWith(\"!\")) return undefined;\n\tconst envOnly = trimmed.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n\tif (envOnly) return process.env[envOnly[1]!];\n\tconst braced = trimmed.match(/^\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}$/);\n\tif (braced) return process.env[braced[1]!];\n\tif (trimmed.includes(\"$\")) return undefined;\n\treturn trimmed;\n}\n"]}
|