@bastani/atomic 0.9.24 → 0.9.25-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/dist/builtin/intercom/index.bundle.mjs +5 -0
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/mcp/CHANGELOG.md +11 -0
- package/dist/builtin/mcp/index.bundle.mjs +219 -71
- package/dist/builtin/mcp/package.json +6 -2
- package/dist/builtin/subagents/package.json +3 -3
- package/dist/builtin/subagents/src/extension/index.bundle.mjs +1 -0
- package/dist/builtin/web-access/index.bundle.mjs +7 -6
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +6 -0
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +1 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/gpt_6_1_sol.md +66 -0
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +1 -0
- package/dist/cli/startup-ui.d.ts +3 -4
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +3 -4
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +5 -0
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-export.d.ts.map +1 -1
- package/dist/core/agent-session-export.js +3 -0
- package/dist/core/agent-session-export.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +4 -0
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +2 -1
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-nested-tools.d.ts +10 -0
- package/dist/core/agent-session-nested-tools.d.ts.map +1 -0
- package/dist/core/agent-session-nested-tools.js +76 -0
- package/dist/core/agent-session-nested-tools.js.map +1 -0
- package/dist/core/agent-session-runtime-auth.js +3 -1
- package/dist/core/agent-session-runtime-auth.js.map +1 -1
- package/dist/core/agent-session-state.d.ts +2 -0
- package/dist/core/agent-session-state.d.ts.map +1 -1
- package/dist/core/agent-session-state.js +11 -11
- package/dist/core/agent-session-state.js.map +1 -1
- package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
- package/dist/core/agent-session-tool-hooks.js +18 -3
- package/dist/core/agent-session-tool-hooks.js.map +1 -1
- package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
- package/dist/core/agent-session-tool-registry.js +15 -3
- package/dist/core/agent-session-tool-registry.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +6 -2
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/builtin-resource-loader.d.ts.map +1 -1
- package/dist/core/builtin-resource-loader.js +13 -1
- package/dist/core/builtin-resource-loader.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +1 -1
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +18 -18
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/execution-model-router.d.ts.map +1 -1
- package/dist/core/execution-model-router.js +24 -8
- package/dist/core/execution-model-router.js.map +1 -1
- package/dist/core/export-html/template.js +12 -0
- package/dist/core/extensions/agent-events.d.ts +3 -0
- package/dist/core/extensions/agent-events.d.ts.map +1 -1
- package/dist/core/extensions/agent-events.js.map +1 -1
- package/dist/core/extensions/api-types.d.ts +2 -0
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/api-types.js.map +1 -1
- package/dist/core/extensions/context-types.d.ts +9 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/event-results.d.ts +3 -0
- package/dist/core/extensions/event-results.d.ts.map +1 -1
- package/dist/core/extensions/event-results.js.map +1 -1
- package/dist/core/extensions/index.d.ts +2 -0
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.js +4 -0
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-core.d.ts.map +1 -1
- package/dist/core/extensions/loader-core.js +3 -5
- package/dist/core/extensions/loader-core.js.map +1 -1
- package/dist/core/extensions/loader-host-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-host-modules.js +7 -1
- package/dist/core/extensions/loader-host-modules.js.map +1 -1
- package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
- package/dist/core/extensions/loader-runtime.js +3 -0
- package/dist/core/extensions/loader-runtime.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +4 -0
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/provider-types.d.ts +2 -0
- package/dist/core/extensions/provider-types.d.ts.map +1 -1
- package/dist/core/extensions/provider-types.js.map +1 -1
- package/dist/core/extensions/runner-events.d.ts.map +1 -1
- package/dist/core/extensions/runner-events.js +16 -1
- package/dist/core/extensions/runner-events.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +5 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +34 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +5 -0
- package/dist/core/extensions/runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/runtime-types.js.map +1 -1
- package/dist/core/extensions/tool-events.d.ts +4 -0
- package/dist/core/extensions/tool-events.d.ts.map +1 -1
- package/dist/core/extensions/tool-events.js.map +1 -1
- package/dist/core/extensions/tool-types.d.ts +34 -3
- package/dist/core/extensions/tool-types.d.ts.map +1 -1
- package/dist/core/extensions/tool-types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +14 -2
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/fast-model-routing-transport.d.ts.map +1 -1
- package/dist/core/fast-model-routing-transport.js +2 -1
- package/dist/core/fast-model-routing-transport.js.map +1 -1
- package/dist/core/fast-model-routing.d.ts +1 -2
- package/dist/core/fast-model-routing.d.ts.map +1 -1
- package/dist/core/fast-model-routing.js +13 -11
- package/dist/core/fast-model-routing.js.map +1 -1
- package/dist/core/fast-model-variants.d.ts +4 -1
- package/dist/core/fast-model-variants.d.ts.map +1 -1
- package/dist/core/fast-model-variants.js +42 -17
- package/dist/core/fast-model-variants.js.map +1 -1
- package/dist/core/mandatory-resource-loader.d.ts.map +1 -1
- package/dist/core/mandatory-resource-loader.js +9 -0
- package/dist/core/mandatory-resource-loader.js.map +1 -1
- package/dist/core/model-registry.d.ts +4 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +9 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver-defaults.js +1 -1
- package/dist/core/model-resolver-defaults.js.map +1 -1
- package/dist/core/model-routing-candidates.d.ts +4 -0
- package/dist/core/model-routing-candidates.d.ts.map +1 -1
- package/dist/core/model-routing-candidates.js +8 -3
- package/dist/core/model-routing-candidates.js.map +1 -1
- package/dist/core/model-routing-evals.d.ts.map +1 -1
- package/dist/core/model-routing-evals.js +4 -5
- package/dist/core/model-routing-evals.js.map +1 -1
- package/dist/core/model-runtime.d.ts +3 -2
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +19 -25
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/nested-tool-calls.d.ts +64 -0
- package/dist/core/nested-tool-calls.d.ts.map +1 -0
- package/dist/core/nested-tool-calls.js +132 -0
- package/dist/core/nested-tool-calls.js.map +1 -0
- package/dist/core/oauth-provider-metadata.js +1 -1
- package/dist/core/oauth-provider-metadata.js.map +1 -1
- package/dist/core/package-manager-resolver.d.ts.map +1 -1
- package/dist/core/package-manager-resolver.js +21 -3
- package/dist/core/package-manager-resolver.js.map +1 -1
- package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -1
- package/dist/core/package-manager-resource-accumulator.js +2 -0
- package/dist/core/package-manager-resource-accumulator.js.map +1 -1
- package/dist/core/package-manager-types.d.ts +2 -0
- package/dist/core/package-manager-types.d.ts.map +1 -1
- package/dist/core/package-manager-types.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +1 -0
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/resource-loader-core.d.ts.map +1 -1
- package/dist/core/resource-loader-core.js +12 -6
- package/dist/core/resource-loader-core.js.map +1 -1
- package/dist/core/resource-loader-extensions.d.ts +1 -0
- package/dist/core/resource-loader-extensions.d.ts.map +1 -1
- package/dist/core/resource-loader-extensions.js +64 -4
- package/dist/core/resource-loader-extensions.js.map +1 -1
- package/dist/core/resource-loader-paths.d.ts.map +1 -1
- package/dist/core/resource-loader-paths.js +2 -1
- package/dist/core/resource-loader-paths.js.map +1 -1
- package/dist/core/resource-loader-reload.d.ts.map +1 -1
- package/dist/core/resource-loader-reload.js +5 -4
- package/dist/core/resource-loader-reload.js.map +1 -1
- package/dist/core/resource-loader-source-info.d.ts.map +1 -1
- package/dist/core/resource-loader-source-info.js +7 -5
- package/dist/core/resource-loader-source-info.js.map +1 -1
- package/dist/core/resource-loader-types.d.ts +4 -0
- package/dist/core/resource-loader-types.d.ts.map +1 -1
- package/dist/core/resource-loader-types.js.map +1 -1
- package/dist/core/sdk-types.d.ts +1 -1
- package/dist/core/sdk-types.js.map +1 -1
- package/dist/core/session-manager-core.d.ts +2 -0
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +5 -1
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-entries.d.ts +1 -1
- package/dist/core/session-manager-entries.d.ts.map +1 -1
- package/dist/core/session-manager-entries.js.map +1 -1
- package/dist/core/settings-manager-basic-accessors.d.ts +4 -0
- package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-basic-accessors.js +27 -1
- package/dist/core/settings-manager-basic-accessors.js.map +1 -1
- package/dist/core/settings-manager-core.d.ts +2 -0
- package/dist/core/settings-manager-core.d.ts.map +1 -1
- package/dist/core/settings-manager-core.js +4 -0
- package/dist/core/settings-manager-core.js.map +1 -1
- package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
- package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-ui-accessors.js +13 -0
- package/dist/core/settings-manager-ui-accessors.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-merge.d.ts +1 -0
- package/dist/core/settings-merge.d.ts.map +1 -1
- package/dist/core/settings-merge.js +30 -1
- package/dist/core/settings-merge.js.map +1 -1
- package/dist/core/settings-types.d.ts +8 -1
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/source-info.d.ts +3 -0
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js +11 -0
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/structured-output/index.d.ts.map +1 -1
- package/dist/core/structured-output/index.js +3 -1
- package/dist/core/structured-output/index.js.map +1 -1
- package/dist/core/tool-loadout.d.ts +6 -0
- package/dist/core/tool-loadout.d.ts.map +1 -0
- package/dist/core/tool-loadout.js +63 -0
- package/dist/core/tool-loadout.js.map +1 -0
- package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
- package/dist/core/tools/ask-user-question/ask-user-question.js +1 -0
- package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +31 -11
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +4 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +32 -0
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/powershell.d.ts +27 -21
- package/dist/core/tools/powershell.d.ts.map +1 -1
- package/dist/core/tools/render-utils.d.ts +4 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +19 -0
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/tool-concurrency.d.ts +1 -1
- package/dist/core/tools/tool-concurrency.d.ts.map +1 -1
- package/dist/core/tools/tool-concurrency.js +28 -3
- package/dist/core/tools/tool-concurrency.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +4 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/usage-totals.d.ts +2 -0
- package/dist/core/usage-totals.d.ts.map +1 -1
- package/dist/core/usage-totals.js +23 -0
- package/dist/core/usage-totals.js.map +1 -1
- package/dist/extensions/codemode/execute.d.ts +10 -0
- package/dist/extensions/codemode/execute.d.ts.map +1 -0
- package/dist/extensions/codemode/execute.js +313 -0
- package/dist/extensions/codemode/execute.js.map +1 -0
- package/dist/extensions/codemode/index.d.ts +11 -0
- package/dist/extensions/codemode/index.d.ts.map +1 -0
- package/dist/extensions/codemode/index.js +14 -0
- package/dist/extensions/codemode/index.js.map +1 -0
- package/dist/extensions/codemode/renderer.d.ts +4 -0
- package/dist/extensions/codemode/renderer.d.ts.map +1 -0
- package/dist/extensions/codemode/renderer.js +78 -0
- package/dist/extensions/codemode/renderer.js.map +1 -0
- package/dist/extensions/codemode/tool.d.ts +51 -0
- package/dist/extensions/codemode/tool.d.ts.map +1 -0
- package/dist/extensions/codemode/tool.js +134 -0
- package/dist/extensions/codemode/tool.js.map +1 -0
- package/dist/extensions/codemode/worker.d.ts +2 -0
- package/dist/extensions/codemode/worker.d.ts.map +1 -0
- package/dist/extensions/codemode/worker.js +2 -0
- package/dist/extensions/codemode/worker.js.map +1 -0
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +5 -1
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +31 -10
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/tool-search/index.d.ts +5 -0
- package/dist/extensions/tool-search/index.d.ts.map +1 -0
- package/dist/extensions/tool-search/index.js +6 -0
- package/dist/extensions/tool-search/index.js.map +1 -0
- package/dist/extensions/tool-search/tool.d.ts +41 -0
- package/dist/extensions/tool-search/tool.d.ts.map +1 -0
- package/dist/extensions/tool-search/tool.js +161 -0
- package/dist/extensions/tool-search/tool.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -0
- package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.js +2 -0
- package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
- package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector-list.js +9 -1
- package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
- package/dist/modes/interactive/components/config-selector-project-scope.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector-project-scope.js +4 -1
- package/dist/modes/interactive/components/config-selector-project-scope.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +2 -2
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +1 -0
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +42 -7
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
- package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +13 -0
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-submenus.js +3 -1
- package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
- package/dist/modes/interactive/components/themed-text.d.ts +8 -0
- package/dist/modes/interactive/components/themed-text.d.ts.map +1 -0
- package/dist/modes/interactive/components/themed-text.js +14 -0
- package/dist/modes/interactive/components/themed-text.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +5 -3
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +2 -0
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +2 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +5 -0
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-resource-rendering.js +7 -10
- package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +5 -0
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +1 -0
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +8 -3
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-tui.d.ts +2 -1
- package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-tui.js +1 -0
- package/dist/modes/interactive/interactive-tui.js.map +1 -1
- package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -1
- package/dist/modes/interactive/theme/color-utils.js +3 -0
- package/dist/modes/interactive/theme/color-utils.js.map +1 -1
- package/dist/modes/interactive/theme/export-colors.d.ts.map +1 -1
- package/dist/modes/interactive/theme/export-colors.js +4 -1
- package/dist/modes/interactive/theme/export-colors.js.map +1 -1
- package/dist/modes/interactive/theme/system-theme.d.ts +23 -0
- package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/system-theme.js +462 -0
- package/dist/modes/interactive/theme/system-theme.js.map +1 -0
- package/dist/modes/interactive/theme/terminal-colors.d.ts +10 -0
- package/dist/modes/interactive/theme/terminal-colors.d.ts.map +1 -0
- package/dist/modes/interactive/theme/terminal-colors.js +36 -0
- package/dist/modes/interactive/theme/terminal-colors.js.map +1 -0
- package/dist/modes/interactive/theme/terminal-detection.d.ts +4 -6
- package/dist/modes/interactive/theme/terminal-detection.d.ts.map +1 -1
- package/dist/modes/interactive/theme/terminal-detection.js +12 -46
- package/dist/modes/interactive/theme/terminal-detection.js.map +1 -1
- package/dist/modes/interactive/theme/theme-class.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-class.js +2 -2
- package/dist/modes/interactive/theme/theme-class.js.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +16 -8
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +106 -64
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-loading.js +23 -2
- package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.js +1 -1
- package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +2 -2
- package/dist/modes/interactive/theme/theme.d.ts +2 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +2 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive-engine/engine-session-stats.d.ts +26 -0
- package/dist/modes/interactive-engine/engine-session-stats.d.ts.map +1 -0
- package/dist/modes/interactive-engine/engine-session-stats.js +71 -0
- package/dist/modes/interactive-engine/engine-session-stats.js.map +1 -0
- package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +2 -0
- package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
- package/dist/modes/interactive-engine/extension-ui-bridge.js +4 -0
- package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.d.ts +3 -0
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.js +27 -5
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
- package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-provider-auth.js +3 -1
- package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +8 -2
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +2 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/shell.d.ts +1 -3
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +3 -30
- package/dist/utils/shell.js.map +1 -1
- package/docs/extensions/api-reference.md +5 -1
- package/docs/extensions/authoring.md +31 -1
- package/docs/extensions/events.md +3 -1
- package/docs/extensions.md +14 -0
- package/docs/models/evals.md +45 -2
- package/docs/models/reference.md +33 -2
- package/docs/models.md +1 -0
- package/docs/packages.md +2 -0
- package/docs/providers.md +34 -7
- package/docs/reference/cli.md +4 -0
- package/docs/rpc/protocol.md +10 -0
- package/docs/sdk/reference.md +11 -1
- package/docs/sdk/structured-decisions.md +4 -2
- package/docs/session-format.md +5 -0
- package/docs/settings.md +19 -5
- package/docs/skills.md +1 -1
- package/docs/themes/reference.md +2 -1
- package/docs/themes.md +4 -2
- package/docs/tools.md +39 -0
- package/npm-shrinkwrap.json +115 -113
- package/package.json +12 -9
|
@@ -6,7 +6,7 @@ import type { Theme } from "../../modes/interactive/theme/theme.js";
|
|
|
6
6
|
import type { SourceInfo } from "../source-info.ts";
|
|
7
7
|
import type { ToolConcurrency } from "../tools/tool-concurrency.ts";
|
|
8
8
|
export type { ToolConcurrency, ToolConcurrencyMode } from "../tools/tool-concurrency.ts";
|
|
9
|
-
import type {
|
|
9
|
+
import type { ExtensionToolContext } from "./context-types.ts";
|
|
10
10
|
/** Rendering options for tool results */
|
|
11
11
|
export interface ToolRenderResultOptions {
|
|
12
12
|
/** Whether the result view is expanded */
|
|
@@ -47,6 +47,29 @@ type ToolRenderCall<TParams extends TSchema, TState> = {
|
|
|
47
47
|
type ToolRenderResult<TParams extends TSchema, TDetails, TState> = {
|
|
48
48
|
bivarianceHack(result: AgentToolResult<TDetails>, options: ToolRenderResultOptions, theme: Theme, context: ToolRenderContext<TState, Static<TParams>>): Component;
|
|
49
49
|
}["bivarianceHack"];
|
|
50
|
+
/** How the model reaches a registered tool. */
|
|
51
|
+
export type ToolExposure = "direct" | "model-only" | "codemode" | "deferred" | "hidden";
|
|
52
|
+
export interface ToolAnnotations {
|
|
53
|
+
readOnlyHint?: boolean;
|
|
54
|
+
destructiveHint?: boolean;
|
|
55
|
+
idempotentHint?: boolean;
|
|
56
|
+
openWorldHint?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface ToolNamespace {
|
|
59
|
+
name: string;
|
|
60
|
+
description?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface ToolLoadout {
|
|
63
|
+
readonly declared: readonly import("@earendil-works/pi-agent-core").AgentTool[];
|
|
64
|
+
readonly callable: readonly import("@earendil-works/pi-agent-core").AgentTool[];
|
|
65
|
+
readonly registered: readonly import("@earendil-works/pi-agent-core").AgentTool[];
|
|
66
|
+
getExposure(name: string): ToolExposure;
|
|
67
|
+
getNamespace(name: string): ToolNamespace | undefined;
|
|
68
|
+
}
|
|
69
|
+
export interface ToolLoadoutChanges {
|
|
70
|
+
descriptions?: Readonly<Record<string, string>>;
|
|
71
|
+
hiddenDeclarations?: readonly string[];
|
|
72
|
+
}
|
|
50
73
|
/**
|
|
51
74
|
* Tool definition for registerTool().
|
|
52
75
|
*/
|
|
@@ -73,6 +96,14 @@ export interface ToolDefinition<TParams extends TSchema = TSchema, TDetails = un
|
|
|
73
96
|
renderShell?: "default" | "self";
|
|
74
97
|
/** Optional compatibility shim to prepare raw tool call arguments before schema validation. Must return an object conforming to TParams. */
|
|
75
98
|
prepareArguments?: (args: unknown) => Static<TParams>;
|
|
99
|
+
/** Schema of successful machine-readable results. */
|
|
100
|
+
outputSchema?: TSchema;
|
|
101
|
+
/** Direct and model-only tools activate by default; other exposures do not. */
|
|
102
|
+
exposure?: ToolExposure;
|
|
103
|
+
namespace?: ToolNamespace;
|
|
104
|
+
annotations?: ToolAnnotations;
|
|
105
|
+
defaultActive?: boolean;
|
|
106
|
+
prepareLoadout?: (loadout: ToolLoadout) => ToolLoadoutChanges | undefined;
|
|
76
107
|
/**
|
|
77
108
|
* Per-tool execution mode override.
|
|
78
109
|
* - "sequential": this tool must execute one at a time with other tool calls.
|
|
@@ -89,7 +120,7 @@ export interface ToolDefinition<TParams extends TSchema = TSchema, TDetails = un
|
|
|
89
120
|
*/
|
|
90
121
|
concurrency?: ToolConcurrency<Static<TParams>>;
|
|
91
122
|
/** Execute the tool. */
|
|
92
|
-
execute(toolCallId: string, params: Static<TParams>, signal: AbortSignal | undefined, onUpdate: AgentToolUpdateCallback<TDetails> | undefined, ctx:
|
|
123
|
+
execute(toolCallId: string, params: Static<TParams>, signal: AbortSignal | undefined, onUpdate: AgentToolUpdateCallback<TDetails> | undefined, ctx: ExtensionToolContext): Promise<AgentToolResult<TDetails>>;
|
|
93
124
|
/** Custom rendering for tool call display */
|
|
94
125
|
renderCall?: ToolRenderCall<TParams, TState>;
|
|
95
126
|
/** Custom rendering for tool result display */
|
|
@@ -107,7 +138,7 @@ export declare function defineTool<TParams extends TSchema, TDetails = unknown,
|
|
|
107
138
|
/** Public constrained-sampling shape inherited from pi-ai. */
|
|
108
139
|
export type { ConstrainedSamplingConfig } from "@bastani/pi-ai/compat";
|
|
109
140
|
/** Tool info with name, description, parameter schema, constraint, and source metadata */
|
|
110
|
-
export type ToolInfo = Pick<ToolDefinition, "name" | "description" | "parameters" | "constrainedSampling" | "promptGuidelines"> & {
|
|
141
|
+
export type ToolInfo = Pick<ToolDefinition, "name" | "description" | "parameters" | "constrainedSampling" | "promptGuidelines" | "exposure" | "namespace" | "annotations"> & {
|
|
111
142
|
sourceInfo: SourceInfo;
|
|
112
143
|
};
|
|
113
144
|
//# sourceMappingURL=tool-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-types.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/tool-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACjH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEzF,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"tool-types.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/tool-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACjH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEzF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,yCAAyC;AACzC,MAAM,WAAW,uBAAuB;IACvC,0CAA0C;IAC1C,QAAQ,EAAE,OAAO,CAAC;IAClB,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB,CAAC,MAAM,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO;IACnE,6FAA6F;IAC7F,IAAI,EAAE,KAAK,CAAC;IACZ,mGAAmG;IACnG,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,kEAAkE;IAClE,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,YAAY,EAAE,OAAO,CAAC;IACtB,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,4DAA4D;IAC5D,UAAU,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,KAAK,cAAc,CAAC,OAAO,SAAS,OAAO,EAAE,MAAM,IAAI;IACtD,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CACpH,CAAC,gBAAgB,CAAC,CAAC;AAEpB,KAAK,gBAAgB,CAAC,OAAO,SAAS,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI;IAClE,cAAc,CACb,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,EACjC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,GACjD,SAAS,CAAC;CACb,CAAC,gBAAgB,CAAC,CAAC;AAEpB,+CAA+C;AAC/C,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AAExF,MAAM,WAAW,eAAe;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,+BAA+B,EAAE,SAAS,EAAE,CAAC;IAChF,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,+BAA+B,EAAE,SAAS,EAAE,CAAC;IAChF,QAAQ,CAAC,UAAU,EAAE,SAAS,OAAO,+BAA+B,EAAE,SAAS,EAAE,CAAC;IAClF,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IACxC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IAClC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO;IACtG,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,oKAAoK;IACpK,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oHAAoH;IACpH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,iCAAiC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,2FAA2F;IAC3F,mBAAmB,CAAC,EAAE,KAAK,GAAG,yBAAyB,CAAC;IACxD,4HAA4H;IAC5H,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4KAA4K;IAC5K,gBAAgB,CAAC,EAAE,IAAI,CAAC;IACxB,sHAAsH;IACtH,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAEjC,4IAA4I;IAC5I,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;IACtD,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,kBAAkB,GAAG,SAAS,CAAC;IAE1E;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAElC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAE/C,wBAAwB;IACxB,OAAO,CACN,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,uBAAuB,CAAC,QAAQ,CAAC,GAAG,SAAS,EACvD,GAAG,EAAE,oBAAoB,GACvB,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEtC,6CAA6C;IAC7C,UAAU,CAAC,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAE7C,+CAA+C;IAC/C,YAAY,CAAC,EAAE,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;CAC3D;AAED,KAAK,iBAAiB,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAEnE;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,SAAS,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,EACvF,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,GAC7C,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAE/D;AAED,8DAA8D;AAC9D,YAAY,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvE,0FAA0F;AAC1F,MAAM,MAAM,QAAQ,GAAG,IAAI,CAC1B,cAAc,EACZ,MAAM,GACN,aAAa,GACb,YAAY,GACZ,qBAAqB,GACrB,kBAAkB,GAClB,UAAU,GACV,WAAW,GACX,aAAa,CACf,GAAG;IACH,UAAU,EAAE,UAAU,CAAC;CACvB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-types.js","sourceRoot":"","sources":["../../../src/core/extensions/tool-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-types.js","sourceRoot":"","sources":["../../../src/core/extensions/tool-types.ts"],"names":[],"mappings":"AAgKA;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACzB,IAA+C;IAE/C,OAAO,IAAqE,CAAC;AAC9E,CAAC","sourcesContent":["import type { ConstrainedSamplingConfig } from \"@bastani/pi-ai/compat\";\nimport type { AgentToolResult, AgentToolUpdateCallback, ToolExecutionMode } from \"@earendil-works/pi-agent-core\";\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport type { Static, TSchema } from \"typebox\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.js\";\nimport type { SourceInfo } from \"../source-info.ts\";\nimport type { ToolConcurrency } from \"../tools/tool-concurrency.ts\";\n\nexport type { ToolConcurrency, ToolConcurrencyMode } from \"../tools/tool-concurrency.ts\";\n\nimport type { ExtensionToolContext } from \"./context-types.ts\";\n\n/** Rendering options for tool results */\nexport interface ToolRenderResultOptions {\n\t/** Whether the result view is expanded */\n\texpanded: boolean;\n\t/** Whether this is a partial/streaming result */\n\tisPartial: boolean;\n}\n\n/** Context passed to tool renderers. */\nexport interface ToolRenderContext<TState = unknown, TArgs = unknown> {\n\t/** Current tool call arguments. Shared across call/result renders for the same tool call. */\n\targs: TArgs;\n\t/** Unique id for this tool execution. Stable across call/result renders for the same tool call. */\n\ttoolCallId: string;\n\t/** Invalidate just this tool execution component for redraw. */\n\tinvalidate: () => void;\n\t/** Previously returned component for this render slot, if any. */\n\tlastComponent: Component | undefined;\n\t/** Shared renderer state for this tool row. Initialized by tool-execution.ts. */\n\tstate: TState;\n\t/** Working directory for this tool execution. */\n\tcwd: string;\n\t/** Whether the tool execution has started. */\n\texecutionStarted: boolean;\n\t/** Whether the tool call arguments are complete. */\n\targsComplete: boolean;\n\t/** Whether the tool result is partial/streaming. */\n\tisPartial: boolean;\n\t/** Whether the result view is expanded. */\n\texpanded: boolean;\n\t/** Whether inline images are currently shown in the TUI. */\n\tshowImages: boolean;\n\t/** Whether the current result is an error. */\n\tisError: boolean;\n}\n\ntype ToolRenderCall<TParams extends TSchema, TState> = {\n\tbivarianceHack(args: Static<TParams>, theme: Theme, context: ToolRenderContext<TState, Static<TParams>>): Component;\n}[\"bivarianceHack\"];\n\ntype ToolRenderResult<TParams extends TSchema, TDetails, TState> = {\n\tbivarianceHack(\n\t\tresult: AgentToolResult<TDetails>,\n\t\toptions: ToolRenderResultOptions,\n\t\ttheme: Theme,\n\t\tcontext: ToolRenderContext<TState, Static<TParams>>,\n\t): Component;\n}[\"bivarianceHack\"];\n\n/** How the model reaches a registered tool. */\nexport type ToolExposure = \"direct\" | \"model-only\" | \"codemode\" | \"deferred\" | \"hidden\";\n\nexport interface ToolAnnotations {\n\treadOnlyHint?: boolean;\n\tdestructiveHint?: boolean;\n\tidempotentHint?: boolean;\n\topenWorldHint?: boolean;\n}\n\nexport interface ToolNamespace {\n\tname: string;\n\tdescription?: string;\n}\n\nexport interface ToolLoadout {\n\treadonly declared: readonly import(\"@earendil-works/pi-agent-core\").AgentTool[];\n\treadonly callable: readonly import(\"@earendil-works/pi-agent-core\").AgentTool[];\n\treadonly registered: readonly import(\"@earendil-works/pi-agent-core\").AgentTool[];\n\tgetExposure(name: string): ToolExposure;\n\tgetNamespace(name: string): ToolNamespace | undefined;\n}\n\nexport interface ToolLoadoutChanges {\n\tdescriptions?: Readonly<Record<string, string>>;\n\thiddenDeclarations?: readonly string[];\n}\n\n/**\n * Tool definition for registerTool().\n */\nexport interface ToolDefinition<TParams extends TSchema = TSchema, TDetails = unknown, TState = unknown> {\n\t/** Tool name (used in LLM tool calls) */\n\tname: string;\n\t/** Human-readable label for UI */\n\tlabel: string;\n\t/** Description for LLM */\n\tdescription: string;\n\t/** Optional one-line snippet for the Available tools section in the default system prompt. Custom tools are omitted from that section when this is not provided. */\n\tpromptSnippet?: string;\n\t/** Optional guideline bullets appended to the default system prompt Guidelines section when this tool is active. */\n\tpromptGuidelines?: string[];\n\t/** Parameter schema (TypeBox) */\n\tparameters: TParams;\n\t/** Optional provider-side constrained sampling request. `false` explicitly disables it. */\n\tconstrainedSampling?: false | ConstrainedSamplingConfig;\n\t/** Optional per-tool character cap for model-visible result persistence. Use Infinity to opt out for self-bounded tools. */\n\tmaxResultSizeChars?: number;\n\t/** Marks a terminating tool created by createStructuredOutputTool() so print mode can emit custom-named final JSON without treating every terminating tool as printable. */\n\tstructuredOutput?: true;\n\t/** Controls whether ToolExecutionComponent renders the standard colored shell or the tool renders its own framing. */\n\trenderShell?: \"default\" | \"self\";\n\n\t/** Optional compatibility shim to prepare raw tool call arguments before schema validation. Must return an object conforming to TParams. */\n\tprepareArguments?: (args: unknown) => Static<TParams>;\n\t/** Schema of successful machine-readable results. */\n\toutputSchema?: TSchema;\n\t/** Direct and model-only tools activate by default; other exposures do not. */\n\texposure?: ToolExposure;\n\tnamespace?: ToolNamespace;\n\tannotations?: ToolAnnotations;\n\tdefaultActive?: boolean;\n\tprepareLoadout?: (loadout: ToolLoadout) => ToolLoadoutChanges | undefined;\n\n\t/**\n\t * Per-tool execution mode override.\n\t * - \"sequential\": this tool must execute one at a time with other tool calls.\n\t * - \"parallel\": this tool can execute concurrently with other tool calls.\n\t *\n\t * If omitted, the default execution mode applies.\n\t */\n\texecutionMode?: ToolExecutionMode;\n\n\t/**\n\t * Ordering against the other calls of the same assistant message.\n\t * - \"shared\": may overlap other shared calls, but starts after the latest earlier exclusive call (default)\n\t * - \"exclusive\": starts after every earlier call finishes; later calls start after it finishes\n\t * - function: resolved per call from its arguments; a throwing resolver means \"exclusive\"\n\t */\n\tconcurrency?: ToolConcurrency<Static<TParams>>;\n\n\t/** Execute the tool. */\n\texecute(\n\t\ttoolCallId: string,\n\t\tparams: Static<TParams>,\n\t\tsignal: AbortSignal | undefined,\n\t\tonUpdate: AgentToolUpdateCallback<TDetails> | undefined,\n\t\tctx: ExtensionToolContext,\n\t): Promise<AgentToolResult<TDetails>>;\n\n\t/** Custom rendering for tool call display */\n\trenderCall?: ToolRenderCall<TParams, TState>;\n\n\t/** Custom rendering for tool result display */\n\trenderResult?: ToolRenderResult<TParams, TDetails, TState>;\n}\n\ntype AnyToolDefinition = ToolDefinition<TSchema, unknown, unknown>;\n\n/**\n * Preserve parameter inference for standalone tool definitions.\n *\n * Use this when assigning a tool to a variable or passing it through arrays such\n * as `customTools`, where contextual typing would otherwise widen params to\n * `unknown`.\n */\nexport function defineTool<TParams extends TSchema, TDetails = unknown, TState = unknown>(\n\ttool: ToolDefinition<TParams, TDetails, TState>,\n): ToolDefinition<TParams, TDetails, TState> & AnyToolDefinition {\n\treturn tool as ToolDefinition<TParams, TDetails, TState> & AnyToolDefinition;\n}\n\n/** Public constrained-sampling shape inherited from pi-ai. */\nexport type { ConstrainedSamplingConfig } from \"@bastani/pi-ai/compat\";\n\n/** Tool info with name, description, parameter schema, constraint, and source metadata */\nexport type ToolInfo = Pick<\n\tToolDefinition,\n\t| \"name\"\n\t| \"description\"\n\t| \"parameters\"\n\t| \"constrainedSampling\"\n\t| \"promptGuidelines\"\n\t| \"exposure\"\n\t| \"namespace\"\n\t| \"annotations\"\n> & {\n\tsourceInfo: SourceInfo;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/wrapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/wrapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAG/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,GAAG,SAAS,CAerG;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,eAAe,GAAG,SAAS,EAAE,CAE3G"}
|
|
@@ -11,8 +11,20 @@ import { wrapToolDefinition } from "../tools/tool-definition-wrapper.js";
|
|
|
11
11
|
* Uses the runner's createContext() for consistent context across tools and event handlers.
|
|
12
12
|
*/
|
|
13
13
|
export function wrapRegisteredTool(registeredTool, runner) {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
return {
|
|
15
|
+
...wrapToolDefinition(registeredTool.definition),
|
|
16
|
+
execute: (id, args, signal, update) => withBuiltinDiagnostics(runner, async () => {
|
|
17
|
+
const lifetime = new AbortController();
|
|
18
|
+
const callSignal = signal ? AbortSignal.any([signal, lifetime.signal]) : lifetime.signal;
|
|
19
|
+
const tool = wrapToolDefinition(registeredTool.definition, () => runner.createToolContext(id, callSignal));
|
|
20
|
+
try {
|
|
21
|
+
return await tool.execute(id, args, callSignal, update);
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
lifetime.abort();
|
|
25
|
+
}
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
16
28
|
}
|
|
17
29
|
/**
|
|
18
30
|
* Wrap all registered tools into AgentTools.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../../src/core/extensions/wrapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAIzE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,cAA8B,EAAE,MAAuB;IACzF,
|
|
1
|
+
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../../src/core/extensions/wrapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAIzE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,cAA8B,EAAE,MAAuB;IACzF,OAAO;QACN,GAAG,kBAAkB,CAAC,cAAc,CAAC,UAAU,CAAC;QAChD,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CACrC,sBAAsB,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzF,MAAM,IAAI,GAAG,kBAAkB,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;YAC3G,IAAI,CAAC;gBACJ,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;YACzD,CAAC;oBAAS,CAAC;gBACV,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;QACF,CAAC,CAAC;KACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,eAAiC,EAAE,MAAuB;IAC7F,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACxE,CAAC","sourcesContent":["/**\n * Tool wrappers for extension-registered tools.\n *\n * These wrappers only adapt tool execution so extension tools receive the runner context.\n * Tool call and tool result interception is handled by AgentSession via agent-core hooks.\n */\n\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { withBuiltinDiagnostics } from \"../builtin-diagnostics.ts\";\nimport { wrapToolDefinition } from \"../tools/tool-definition-wrapper.ts\";\nimport type { ExtensionRunner } from \"./runner.ts\";\nimport type { RegisteredTool } from \"./types.ts\";\n\n/**\n * Wrap a RegisteredTool into an AgentTool.\n * Uses the runner's createContext() for consistent context across tools and event handlers.\n */\nexport function wrapRegisteredTool(registeredTool: RegisteredTool, runner: ExtensionRunner): AgentTool {\n\treturn {\n\t\t...wrapToolDefinition(registeredTool.definition),\n\t\texecute: (id, args, signal, update) =>\n\t\t\twithBuiltinDiagnostics(runner, async () => {\n\t\t\t\tconst lifetime = new AbortController();\n\t\t\t\tconst callSignal = signal ? AbortSignal.any([signal, lifetime.signal]) : lifetime.signal;\n\t\t\t\tconst tool = wrapToolDefinition(registeredTool.definition, () => runner.createToolContext(id, callSignal));\n\t\t\t\ttry {\n\t\t\t\t\treturn await tool.execute(id, args, callSignal, update);\n\t\t\t\t} finally {\n\t\t\t\t\tlifetime.abort();\n\t\t\t\t}\n\t\t\t}),\n\t};\n}\n\n/**\n * Wrap all registered tools into AgentTools.\n * Uses the runner's createContext() for consistent context across tools and event handlers.\n */\nexport function wrapRegisteredTools(registeredTools: RegisteredTool[], runner: ExtensionRunner): AgentTool[] {\n\treturn registeredTools.map((tool) => wrapRegisteredTool(tool, runner));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-model-routing-transport.d.ts","sourceRoot":"","sources":["../../src/core/fast-model-routing-transport.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAC1D,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAkB9D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,CAG5E;AACD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,CAK/E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,CAOhF;
|
|
1
|
+
{"version":3,"file":"fast-model-routing-transport.d.ts","sourceRoot":"","sources":["../../src/core/fast-model-routing-transport.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAC1D,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAkB9D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,CAG5E;AACD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,CAK/E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,CAOhF;AAcD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAIzG;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAI7F;AAED,wBAAgB,6BAA6B,CAC5C,SAAS,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EACjC,WAAW,EAAE,WAAW,GAAG,SAAS,GAClC,OAAO,CAWT;AAED,wBAAgB,uBAAuB,CAAC,mBAAmB,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,OAAO,UAAU,CAAC,KAAK,CAc7G;AAUD,wBAAgB,2BAA2B,CAC1C,uBAAuB,EAAE,OAAO,UAAU,CAAC,SAAS,GAClD,OAAO,UAAU,CAAC,SAAS,CA6B7B;AAED,wBAAgB,sCAAsC,IAAI,IAAI,CAG7D"}
|
|
@@ -34,7 +34,8 @@ export function isFirstPartyCodexEndpoint(input) {
|
|
|
34
34
|
url.pathname.replace(/\/+$/u, "") === "/backend-api/codex/responses");
|
|
35
35
|
}
|
|
36
36
|
function hasCodexPriorityRoutingHint(headers) {
|
|
37
|
-
|
|
37
|
+
const hint = headers.get(CODEX_FAST_ROUTE_HEADER);
|
|
38
|
+
return hint?.endsWith(";tier=priority") === true || hint?.endsWith(";tier=ultrafast") === true;
|
|
38
39
|
}
|
|
39
40
|
function codexFastRouteRequestMarker(headers) {
|
|
40
41
|
const marker = headers.get(CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-model-routing-transport.js","sourceRoot":"","sources":["../../src/core/fast-model-routing-transport.ts"],"names":[],"mappings":"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","sourcesContent":["export const CODEX_FAST_ROUTE_ORIGINATOR = \"codex_cli_rs\";\nexport const CODEX_FAST_ROUTE_HEADER = \"x-codex-routing-hint\";\nconst CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER = \"x-atomic-codex-fast-route\";\nconst CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE = \"priority\";\nconst CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE = \"normal\";\n\nconst CODEX_BACKEND_HOSTS = new Set([\"chatgpt.com\", \"chat.openai.com\"]);\nconst wrappedWebSockets = new WeakMap<typeof globalThis.WebSocket, typeof globalThis.WebSocket>();\nconst installedWebSocketWrappers = new WeakSet<typeof globalThis.WebSocket>();\n\nfunction requestUrl(input: string | URL | Request): URL | undefined {\n\ttry {\n\t\tif (typeof input === \"string\" || input instanceof URL) return new URL(input);\n\t\treturn new URL(input.url);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function isFirstPartyCodexHost(input: string | URL | Request): boolean {\n\tconst url = requestUrl(input);\n\treturn url !== undefined && CODEX_BACKEND_HOSTS.has(url.hostname.toLowerCase());\n}\nexport function isFirstPartyCodexBaseUrl(input: string | URL | Request): boolean {\n\tconst url = requestUrl(input);\n\tif (url === undefined || !isFirstPartyCodexHost(url)) return false;\n\tconst path = url.pathname.replace(/\\/+$/u, \"\");\n\treturn path === \"/backend-api\" || path === \"/backend-api/codex\" || path === \"/backend-api/codex/responses\";\n}\n\nexport function isFirstPartyCodexEndpoint(input: string | URL | Request): boolean {\n\tconst url = requestUrl(input);\n\treturn (\n\t\turl !== undefined &&\n\t\tisFirstPartyCodexHost(url) &&\n\t\turl.pathname.replace(/\\/+$/u, \"\") === \"/backend-api/codex/responses\"\n\t);\n}\n\nfunction hasCodexPriorityRoutingHint(headers: Headers): boolean {\n\treturn headers.get(CODEX_FAST_ROUTE_HEADER)?.endsWith(\";tier=priority\") === true;\n}\n\nfunction codexFastRouteRequestMarker(headers: Headers): \"normal\" | \"priority\" | undefined {\n\tconst marker = headers.get(CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER);\n\treturn marker === CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE || marker === CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE\n\t\t? marker\n\t\t: undefined;\n}\n\nexport function markCodexFastRouteRequest(headers: Record<string, string | null>, priority: boolean): void {\n\theaders[CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER] = priority\n\t\t? CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE\n\t\t: CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE;\n}\n\nexport function clearCodexFastRouteRequestMarker(headers: Record<string, string | null>): void {\n\tfor (const name of Object.keys(headers)) {\n\t\tif (name.toLowerCase() === CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER) delete headers[name];\n\t}\n}\n\nexport function forceCodexFastRouteOriginator(\n\t_endpoint: string | URL | Request,\n\theadersInit: HeadersInit | undefined,\n): Headers {\n\tconst headers = new Headers(headersInit);\n\tconst marker = codexFastRouteRequestMarker(headers);\n\theaders.delete(CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER);\n\tif (marker === \"priority\" && hasCodexPriorityRoutingHint(headers)) {\n\t\theaders.set(\"originator\", CODEX_FAST_ROUTE_ORIGINATOR);\n\t} else if (marker !== undefined) {\n\t\theaders.delete(CODEX_FAST_ROUTE_HEADER);\n\t\tif (headers.get(\"originator\") === CODEX_FAST_ROUTE_ORIGINATOR) headers.set(\"originator\", \"pi\");\n\t}\n\treturn headers;\n}\n\nexport function wrapCodexFastRouteFetch(fetchImplementation: typeof globalThis.fetch): typeof globalThis.fetch {\n\treturn new Proxy(fetchImplementation, {\n\t\tapply(target, thisArg, args: Parameters<typeof globalThis.fetch>) {\n\t\t\tconst [input, init] = args;\n\t\t\tif (!init?.headers) return Reflect.apply(target, thisArg, args);\n\t\t\treturn Reflect.apply(target, thisArg, [\n\t\t\t\tinput,\n\t\t\t\t{\n\t\t\t\t\t...init,\n\t\t\t\t\theaders: forceCodexFastRouteOriginator(input, init.headers),\n\t\t\t\t},\n\t\t\t]);\n\t\t},\n\t});\n}\n\nfunction findWebSocketOptionsIndex(args: readonly unknown[]): number | undefined {\n\tfor (let index = 1; index < args.length; index += 1) {\n\t\tconst value = args[index];\n\t\tif (typeof value === \"object\" && value !== null && \"headers\" in value) return index;\n\t}\n\treturn undefined;\n}\n\nexport function wrapCodexFastRouteWebSocket(\n\tWebSocketImplementation: typeof globalThis.WebSocket,\n): typeof globalThis.WebSocket {\n\tif (installedWebSocketWrappers.has(WebSocketImplementation)) return WebSocketImplementation;\n\tconst existing = wrappedWebSockets.get(WebSocketImplementation);\n\tif (existing !== undefined) return existing;\n\n\tconst wrapped = new Proxy(WebSocketImplementation, {\n\t\tconstruct(target, args, newTarget) {\n\t\t\tconst endpoint = args[0];\n\t\t\tconst optionsIndex = findWebSocketOptionsIndex(args);\n\t\t\tif ((typeof endpoint !== \"string\" && !(endpoint instanceof URL)) || optionsIndex === undefined) {\n\t\t\t\treturn Reflect.construct(target, args, newTarget);\n\t\t\t}\n\t\t\tconst candidateOptions = args[optionsIndex] as { headers?: HeadersInit };\n\t\t\tconst candidateHeaders = new Headers(candidateOptions.headers);\n\t\t\tif (codexFastRouteRequestMarker(candidateHeaders) === undefined) {\n\t\t\t\treturn Reflect.construct(target, args, newTarget);\n\t\t\t}\n\t\t\tconst options = candidateOptions;\n\t\t\tconst nextArgs = [...args];\n\t\t\tnextArgs[optionsIndex] = {\n\t\t\t\t...options,\n\t\t\t\theaders: forceCodexFastRouteOriginator(endpoint, options.headers),\n\t\t\t};\n\t\t\treturn Reflect.construct(target, nextArgs, newTarget);\n\t\t},\n\t}) as typeof globalThis.WebSocket;\n\twrappedWebSockets.set(WebSocketImplementation, wrapped);\n\tinstalledWebSocketWrappers.add(wrapped);\n\treturn wrapped;\n}\n\nexport function installCodexFastRouteWebSocketIdentity(): void {\n\tif (typeof globalThis.WebSocket !== \"function\") return;\n\tglobalThis.WebSocket = wrapCodexFastRouteWebSocket(globalThis.WebSocket);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fast-model-routing-transport.js","sourceRoot":"","sources":["../../src/core/fast-model-routing-transport.ts"],"names":[],"mappings":"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","sourcesContent":["export const CODEX_FAST_ROUTE_ORIGINATOR = \"codex_cli_rs\";\nexport const CODEX_FAST_ROUTE_HEADER = \"x-codex-routing-hint\";\nconst CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER = \"x-atomic-codex-fast-route\";\nconst CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE = \"priority\";\nconst CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE = \"normal\";\n\nconst CODEX_BACKEND_HOSTS = new Set([\"chatgpt.com\", \"chat.openai.com\"]);\nconst wrappedWebSockets = new WeakMap<typeof globalThis.WebSocket, typeof globalThis.WebSocket>();\nconst installedWebSocketWrappers = new WeakSet<typeof globalThis.WebSocket>();\n\nfunction requestUrl(input: string | URL | Request): URL | undefined {\n\ttry {\n\t\tif (typeof input === \"string\" || input instanceof URL) return new URL(input);\n\t\treturn new URL(input.url);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function isFirstPartyCodexHost(input: string | URL | Request): boolean {\n\tconst url = requestUrl(input);\n\treturn url !== undefined && CODEX_BACKEND_HOSTS.has(url.hostname.toLowerCase());\n}\nexport function isFirstPartyCodexBaseUrl(input: string | URL | Request): boolean {\n\tconst url = requestUrl(input);\n\tif (url === undefined || !isFirstPartyCodexHost(url)) return false;\n\tconst path = url.pathname.replace(/\\/+$/u, \"\");\n\treturn path === \"/backend-api\" || path === \"/backend-api/codex\" || path === \"/backend-api/codex/responses\";\n}\n\nexport function isFirstPartyCodexEndpoint(input: string | URL | Request): boolean {\n\tconst url = requestUrl(input);\n\treturn (\n\t\turl !== undefined &&\n\t\tisFirstPartyCodexHost(url) &&\n\t\turl.pathname.replace(/\\/+$/u, \"\") === \"/backend-api/codex/responses\"\n\t);\n}\n\nfunction hasCodexPriorityRoutingHint(headers: Headers): boolean {\n\tconst hint = headers.get(CODEX_FAST_ROUTE_HEADER);\n\treturn hint?.endsWith(\";tier=priority\") === true || hint?.endsWith(\";tier=ultrafast\") === true;\n}\n\nfunction codexFastRouteRequestMarker(headers: Headers): \"normal\" | \"priority\" | undefined {\n\tconst marker = headers.get(CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER);\n\treturn marker === CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE || marker === CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE\n\t\t? marker\n\t\t: undefined;\n}\n\nexport function markCodexFastRouteRequest(headers: Record<string, string | null>, priority: boolean): void {\n\theaders[CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER] = priority\n\t\t? CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE\n\t\t: CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE;\n}\n\nexport function clearCodexFastRouteRequestMarker(headers: Record<string, string | null>): void {\n\tfor (const name of Object.keys(headers)) {\n\t\tif (name.toLowerCase() === CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER) delete headers[name];\n\t}\n}\n\nexport function forceCodexFastRouteOriginator(\n\t_endpoint: string | URL | Request,\n\theadersInit: HeadersInit | undefined,\n): Headers {\n\tconst headers = new Headers(headersInit);\n\tconst marker = codexFastRouteRequestMarker(headers);\n\theaders.delete(CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER);\n\tif (marker === \"priority\" && hasCodexPriorityRoutingHint(headers)) {\n\t\theaders.set(\"originator\", CODEX_FAST_ROUTE_ORIGINATOR);\n\t} else if (marker !== undefined) {\n\t\theaders.delete(CODEX_FAST_ROUTE_HEADER);\n\t\tif (headers.get(\"originator\") === CODEX_FAST_ROUTE_ORIGINATOR) headers.set(\"originator\", \"pi\");\n\t}\n\treturn headers;\n}\n\nexport function wrapCodexFastRouteFetch(fetchImplementation: typeof globalThis.fetch): typeof globalThis.fetch {\n\treturn new Proxy(fetchImplementation, {\n\t\tapply(target, thisArg, args: Parameters<typeof globalThis.fetch>) {\n\t\t\tconst [input, init] = args;\n\t\t\tif (!init?.headers) return Reflect.apply(target, thisArg, args);\n\t\t\treturn Reflect.apply(target, thisArg, [\n\t\t\t\tinput,\n\t\t\t\t{\n\t\t\t\t\t...init,\n\t\t\t\t\theaders: forceCodexFastRouteOriginator(input, init.headers),\n\t\t\t\t},\n\t\t\t]);\n\t\t},\n\t});\n}\n\nfunction findWebSocketOptionsIndex(args: readonly unknown[]): number | undefined {\n\tfor (let index = 1; index < args.length; index += 1) {\n\t\tconst value = args[index];\n\t\tif (typeof value === \"object\" && value !== null && \"headers\" in value) return index;\n\t}\n\treturn undefined;\n}\n\nexport function wrapCodexFastRouteWebSocket(\n\tWebSocketImplementation: typeof globalThis.WebSocket,\n): typeof globalThis.WebSocket {\n\tif (installedWebSocketWrappers.has(WebSocketImplementation)) return WebSocketImplementation;\n\tconst existing = wrappedWebSockets.get(WebSocketImplementation);\n\tif (existing !== undefined) return existing;\n\n\tconst wrapped = new Proxy(WebSocketImplementation, {\n\t\tconstruct(target, args, newTarget) {\n\t\t\tconst endpoint = args[0];\n\t\t\tconst optionsIndex = findWebSocketOptionsIndex(args);\n\t\t\tif ((typeof endpoint !== \"string\" && !(endpoint instanceof URL)) || optionsIndex === undefined) {\n\t\t\t\treturn Reflect.construct(target, args, newTarget);\n\t\t\t}\n\t\t\tconst candidateOptions = args[optionsIndex] as { headers?: HeadersInit };\n\t\t\tconst candidateHeaders = new Headers(candidateOptions.headers);\n\t\t\tif (codexFastRouteRequestMarker(candidateHeaders) === undefined) {\n\t\t\t\treturn Reflect.construct(target, args, newTarget);\n\t\t\t}\n\t\t\tconst options = candidateOptions;\n\t\t\tconst nextArgs = [...args];\n\t\t\tnextArgs[optionsIndex] = {\n\t\t\t\t...options,\n\t\t\t\theaders: forceCodexFastRouteOriginator(endpoint, options.headers),\n\t\t\t};\n\t\t\treturn Reflect.construct(target, nextArgs, newTarget);\n\t\t},\n\t}) as typeof globalThis.WebSocket;\n\twrappedWebSockets.set(WebSocketImplementation, wrapped);\n\tinstalledWebSocketWrappers.add(wrapped);\n\treturn wrapped;\n}\n\nexport function installCodexFastRouteWebSocketIdentity(): void {\n\tif (typeof globalThis.WebSocket !== \"function\") return;\n\tglobalThis.WebSocket = wrapCodexFastRouteWebSocket(globalThis.WebSocket);\n}\n"]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { closeOpenAICodexWebSocketSessions } from "@bastani/pi-ai/api/openai-codex-responses";
|
|
2
2
|
import { type Api, type AssistantMessageEventStream, type Context, type Model, type ModelFastRoute, type OpenAICodexResponsesOptions, type OpenAIResponsesOptions, type ProviderHeaders, type SimpleStreamOptions, type StreamOptions, type ThinkingLevel, type TranscriptContext } from "@bastani/pi-ai/compat";
|
|
3
|
-
import { FAST_MODEL_SERVICE_TIER } from "./fast-model-variants.ts";
|
|
4
3
|
export interface FastRouteStreamOptions extends SimpleStreamOptions {
|
|
5
|
-
serviceTier?:
|
|
4
|
+
serviceTier?: ModelFastRoute["serviceTier"];
|
|
6
5
|
}
|
|
7
6
|
export interface FastRouteStreamers {
|
|
8
7
|
streamSimple: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-model-routing.d.ts","sourceRoot":"","sources":["../../src/core/fast-model-routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,2CAA2C,CAAC;AAC9F,OAAO,EACN,KAAK,GAAG,EACR,KAAK,2BAA2B,EAChC,KAAK,OAAO,EAEZ,KAAK,KAAK,EACV,KAAK,cAAc,EAEnB,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAIlB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"fast-model-routing.d.ts","sourceRoot":"","sources":["../../src/core/fast-model-routing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { closeOpenAICodexWebSocketSessions } from "@bastani/pi-ai/api/openai-codex-responses";
|
|
2
2
|
import { clampThinkingLevel, normalizeContext, streamOpenAICodexResponses, streamOpenAIResponses, streamSimple, } from "@bastani/pi-ai/compat";
|
|
3
3
|
import { CODEX_FAST_ROUTE_HEADER, CODEX_FAST_ROUTE_ORIGINATOR, clearCodexFastRouteRequestMarker, installCodexFastRouteWebSocketIdentity, isFirstPartyCodexBaseUrl, markCodexFastRouteRequest, wrapCodexFastRouteFetch, } from "./fast-model-routing-transport.js";
|
|
4
|
-
import { FAST_MODEL_SERVICE_TIER, isNativeFastRouteApi } from "./fast-model-variants.js";
|
|
4
|
+
import { FAST_MODEL_SERVICE_TIER, isNativeFastRouteApi, ULTRAFAST_MODEL_SERVICE_TIER } from "./fast-model-variants.js";
|
|
5
5
|
const DEFAULT_FAST_ROUTE_STREAMERS = {
|
|
6
6
|
streamSimple,
|
|
7
7
|
streamOpenAIResponses,
|
|
@@ -56,12 +56,13 @@ function setHeader(headers, name, value) {
|
|
|
56
56
|
* flag, so a model without a route can never be granted this identity.
|
|
57
57
|
*/
|
|
58
58
|
export function withCodexFastRouteHeaders(model, headers) {
|
|
59
|
-
|
|
59
|
+
const tier = getModelFastRoute(model)?.serviceTier;
|
|
60
|
+
if (tier === undefined || !usesFirstPartyCodexRouting(model)) {
|
|
60
61
|
return headers;
|
|
61
62
|
}
|
|
62
63
|
const fastHeaders = { ...(headers ?? {}) };
|
|
63
64
|
setHeader(fastHeaders, "originator", CODEX_FAST_ROUTE_ORIGINATOR);
|
|
64
|
-
setHeader(fastHeaders, CODEX_FAST_ROUTE_HEADER, `model=${resolveUpstreamModelId(model)};tier=${
|
|
65
|
+
setHeader(fastHeaders, CODEX_FAST_ROUTE_HEADER, `model=${resolveUpstreamModelId(model)};tier=${tier}`);
|
|
65
66
|
return fastHeaders;
|
|
66
67
|
}
|
|
67
68
|
/** Attach the route's service tier to the outgoing stream options. */
|
|
@@ -72,7 +73,8 @@ export function withFastRouteStreamOptions(fastRoute, options) {
|
|
|
72
73
|
}
|
|
73
74
|
/** A service-tier route needs pi-ai's native adapters; `streamSimple` drops `serviceTier`. */
|
|
74
75
|
export function shouldUseNativeFastRoute(model, options) {
|
|
75
|
-
return isNativeFastRouteApi(model.api) &&
|
|
76
|
+
return (isNativeFastRouteApi(model.api) &&
|
|
77
|
+
(options?.serviceTier === FAST_MODEL_SERVICE_TIER || options?.serviceTier === ULTRAFAST_MODEL_SERVICE_TIER));
|
|
76
78
|
}
|
|
77
79
|
function codexEnvironmentScope(env) {
|
|
78
80
|
if (!env)
|
|
@@ -84,10 +86,10 @@ function codexEnvironmentScope(env) {
|
|
|
84
86
|
}
|
|
85
87
|
return (hash >>> 0).toString(16);
|
|
86
88
|
}
|
|
87
|
-
function updateCodexWebSocketRoutingState(model, routedModel, options,
|
|
89
|
+
function updateCodexWebSocketRoutingState(model, routedModel, options, tier, closeWebSocketSessions) {
|
|
88
90
|
if (options.transport === "sse" || !options.sessionId)
|
|
89
91
|
return;
|
|
90
|
-
const signature = `${model.provider}\0${model.baseUrl}\0${codexEnvironmentScope(options.env)}\0${
|
|
92
|
+
const signature = `${model.provider}\0${model.baseUrl}\0${codexEnvironmentScope(options.env)}\0${tier ? `${tier}:${routedModel}` : "normal"}`;
|
|
91
93
|
const previous = codexWebSocketRoutingState.get(options.sessionId);
|
|
92
94
|
if (previous?.signature !== undefined && previous.signature !== signature) {
|
|
93
95
|
closeWebSocketSessions(options.sessionId);
|
|
@@ -105,7 +107,7 @@ function updateCodexWebSocketRoutingState(model, routedModel, options, priority,
|
|
|
105
107
|
export function withChatGptCodexTransportRouting(model, options, closeWebSocketSessions = closeOpenAICodexWebSocketSessions) {
|
|
106
108
|
const headers = { ...(options.headers ?? {}) };
|
|
107
109
|
const onPayload = options.onPayload;
|
|
108
|
-
const
|
|
110
|
+
const tier = usesFirstPartyCodexRouting(model) ? getModelFastRoute(model)?.serviceTier : undefined;
|
|
109
111
|
const routedModel = resolveUpstreamModelId(model);
|
|
110
112
|
return {
|
|
111
113
|
...options,
|
|
@@ -116,8 +118,8 @@ export function withChatGptCodexTransportRouting(model, options, closeWebSocketS
|
|
|
116
118
|
const finalPayload = replacement === undefined ? payload : replacement;
|
|
117
119
|
deleteHeader(headers, CODEX_FAST_ROUTE_HEADER);
|
|
118
120
|
clearCodexFastRouteRequestMarker(headers);
|
|
119
|
-
if (
|
|
120
|
-
setHeader(headers, CODEX_FAST_ROUTE_HEADER, `model=${routedModel};tier=${
|
|
121
|
+
if (tier) {
|
|
122
|
+
setHeader(headers, CODEX_FAST_ROUTE_HEADER, `model=${routedModel};tier=${tier}`);
|
|
121
123
|
}
|
|
122
124
|
else {
|
|
123
125
|
for (const [name, value] of Object.entries(headers)) {
|
|
@@ -125,8 +127,8 @@ export function withChatGptCodexTransportRouting(model, options, closeWebSocketS
|
|
|
125
127
|
delete headers[name];
|
|
126
128
|
}
|
|
127
129
|
}
|
|
128
|
-
markCodexFastRouteRequest(headers,
|
|
129
|
-
updateCodexWebSocketRoutingState(model, routedModel, options,
|
|
130
|
+
markCodexFastRouteRequest(headers, tier !== undefined);
|
|
131
|
+
updateCodexWebSocketRoutingState(model, routedModel, options, tier, closeWebSocketSessions);
|
|
130
132
|
return finalPayload;
|
|
131
133
|
},
|
|
132
134
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-model-routing.js","sourceRoot":"","sources":["../../src/core/fast-model-routing.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeOpenAICodexWebSocketSessions } from \"@bastani/pi-ai/api/openai-codex-responses\";\nimport {\n\ttype Api,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\tclampThinkingLevel,\n\ttype Model,\n\ttype ModelFastRoute,\n\tnormalizeContext,\n\ttype OpenAICodexResponsesOptions,\n\ttype OpenAIResponsesOptions,\n\ttype ProviderHeaders,\n\ttype SimpleStreamOptions,\n\ttype StreamOptions,\n\tstreamOpenAICodexResponses,\n\tstreamOpenAIResponses,\n\tstreamSimple,\n\ttype ThinkingLevel,\n\ttype TranscriptContext,\n} from \"@bastani/pi-ai/compat\";\nimport {\n\tCODEX_FAST_ROUTE_HEADER,\n\tCODEX_FAST_ROUTE_ORIGINATOR,\n\tclearCodexFastRouteRequestMarker,\n\tinstallCodexFastRouteWebSocketIdentity,\n\tisFirstPartyCodexBaseUrl,\n\tmarkCodexFastRouteRequest,\n\twrapCodexFastRouteFetch,\n} from \"./fast-model-routing-transport.ts\";\nimport { FAST_MODEL_SERVICE_TIER, isNativeFastRouteApi } from \"./fast-model-variants.ts\";\n\nexport interface FastRouteStreamOptions extends SimpleStreamOptions {\n\tserviceTier?: typeof FAST_MODEL_SERVICE_TIER;\n}\n\nexport interface FastRouteStreamers {\n\tstreamSimple: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\tstreamOpenAIResponses: (\n\t\tmodel: Model<\"openai-responses\">,\n\t\tcontext: TranscriptContext,\n\t\toptions?: OpenAIResponsesOptions,\n\t) => AssistantMessageEventStream;\n\tstreamOpenAICodexResponses: (\n\t\tmodel: Model<\"openai-codex-responses\">,\n\t\tcontext: TranscriptContext,\n\t\toptions?: OpenAICodexResponsesOptions,\n\t) => AssistantMessageEventStream;\n}\n\nconst DEFAULT_FAST_ROUTE_STREAMERS: FastRouteStreamers = {\n\tstreamSimple,\n\tstreamOpenAIResponses,\n\tstreamOpenAICodexResponses,\n};\n\nconst CODEX_WEBSOCKET_ROUTING_STATE_IDLE_MS = 6 * 60 * 1000;\nconst codexWebSocketRoutingState = new Map<string, { signature: string; expiry: ReturnType<typeof setTimeout> }>();\n\n/**\n * Explicit route metadata is the only source of fast semantics. A model whose ID merely ends in\n * `-fast` — a provider, `models.json`, or extension model that owns that exact ID — routes normally.\n */\nexport function getModelFastRoute(model: Pick<Model<Api>, \"fastRoute\">): ModelFastRoute | undefined {\n\treturn model.fastRoute;\n}\n\n/**\n * The model ID this request sends upstream. An OpenAI-style fast route sends the base model and\n * carries a priority service tier instead; a provider with real fast siblings sends its own\n * advertised ID, which is already the canonical one. The canonical `-fast` identity always stays on\n * the model object Atomic selected, persisted, and records — only the serialized request differs.\n */\nexport function resolveUpstreamModelId(model: Pick<Model<Api>, \"fastRoute\" | \"id\">): string {\n\treturn model.fastRoute?.upstreamModelId ?? model.id;\n}\n\n/**\n * Whether a model uses the first-party OpenAI Codex provider identity and endpoint.\n * A renamed provider on the same protocol remains non-first-party.\n */\nexport function usesFirstPartyCodexRouting(model: Pick<Model<Api>, \"baseUrl\" | \"provider\">): boolean {\n\treturn model.provider === \"openai-codex\" && isFirstPartyCodexBaseUrl(model.baseUrl);\n}\n\n/** A provider alias or proxy still uses the shared ChatGPT Codex protocol when its API does. */\nexport function usesChatGptCodexTransport(model: Pick<Model<Api>, \"api\">): boolean {\n\treturn model.api === \"openai-codex-responses\";\n}\n\nfunction deleteHeader(headers: ProviderHeaders, name: string): void {\n\tfor (const existingName of Object.keys(headers)) {\n\t\tif (existingName.toLowerCase() === name.toLowerCase()) delete headers[existingName];\n\t}\n}\n\nfunction setHeader(headers: ProviderHeaders, name: string, value: string): void {\n\tdeleteHeader(headers, name);\n\theaders[name] = value;\n}\n\n/**\n * Eager first-party routing headers for a model that carries an OpenAI-style fast route.\n *\n * Derived entirely from the model: the headers are added only when the model's own `fastRoute`\n * declares the priority tier and the model uses first-party Codex routing, and the hint names the\n * route's upstream model ID — the same value the request serializes and\n * `withChatGptCodexTransportRouting` reads from route metadata. There is no caller-supplied enable\n * flag, so a model without a route can never be granted this identity.\n */\nexport function withCodexFastRouteHeaders(\n\tmodel: Pick<Model<Api>, \"baseUrl\" | \"fastRoute\" | \"id\" | \"provider\">,\n\theaders: ProviderHeaders | undefined,\n): ProviderHeaders | undefined {\n\tif (getModelFastRoute(model)?.serviceTier !== FAST_MODEL_SERVICE_TIER || !usesFirstPartyCodexRouting(model)) {\n\t\treturn headers;\n\t}\n\tconst fastHeaders: ProviderHeaders = { ...(headers ?? {}) };\n\tsetHeader(fastHeaders, \"originator\", CODEX_FAST_ROUTE_ORIGINATOR);\n\tsetHeader(\n\t\tfastHeaders,\n\t\tCODEX_FAST_ROUTE_HEADER,\n\t\t`model=${resolveUpstreamModelId(model)};tier=${FAST_MODEL_SERVICE_TIER}`,\n\t);\n\treturn fastHeaders;\n}\n\n/** Attach the route's service tier to the outgoing stream options. */\nexport function withFastRouteStreamOptions(\n\tfastRoute: ModelFastRoute | undefined,\n\toptions: SimpleStreamOptions | undefined,\n): FastRouteStreamOptions | undefined {\n\tif (fastRoute?.serviceTier === undefined) return options;\n\treturn { ...(options ?? {}), headers: options?.headers, serviceTier: fastRoute.serviceTier };\n}\n\n/** A service-tier route needs pi-ai's native adapters; `streamSimple` drops `serviceTier`. */\nexport function shouldUseNativeFastRoute(\n\tmodel: Pick<Model<Api>, \"api\">,\n\toptions: FastRouteStreamOptions | undefined,\n): boolean {\n\treturn isNativeFastRouteApi(model.api) && options?.serviceTier === FAST_MODEL_SERVICE_TIER;\n}\n\nfunction codexEnvironmentScope(env: StreamOptions[\"env\"]): string {\n\tif (!env) return \"none\";\n\tconst serialized = JSON.stringify(Object.entries(env).sort(([left], [right]) => left.localeCompare(right)));\n\tlet hash = 2166136261;\n\tfor (let index = 0; index < serialized.length; index += 1) {\n\t\thash = Math.imul(hash ^ serialized.charCodeAt(index), 16777619);\n\t}\n\treturn (hash >>> 0).toString(16);\n}\n\ntype CloseCodexWebSocketSessions = typeof closeOpenAICodexWebSocketSessions;\nfunction updateCodexWebSocketRoutingState(\n\tmodel: Pick<Model<Api>, \"baseUrl\" | \"provider\">,\n\troutedModel: string,\n\toptions: Pick<StreamOptions, \"env\" | \"sessionId\" | \"transport\">,\n\tpriority: boolean,\n\tcloseWebSocketSessions: CloseCodexWebSocketSessions,\n): void {\n\tif (options.transport === \"sse\" || !options.sessionId) return;\n\tconst signature = `${model.provider}\\0${model.baseUrl}\\0${codexEnvironmentScope(options.env)}\\0${priority ? `priority:${routedModel}` : \"normal\"}`;\n\tconst previous = codexWebSocketRoutingState.get(options.sessionId);\n\tif (previous?.signature !== undefined && previous.signature !== signature) {\n\t\tcloseWebSocketSessions(options.sessionId);\n\t}\n\tif (previous) clearTimeout(previous.expiry);\n\tconst expiry = setTimeout(() => {\n\t\tif (codexWebSocketRoutingState.get(options.sessionId!)?.signature === signature) {\n\t\t\tcodexWebSocketRoutingState.delete(options.sessionId!);\n\t\t}\n\t}, CODEX_WEBSOCKET_ROUTING_STATE_IDLE_MS);\n\texpiry.unref?.();\n\tcodexWebSocketRoutingState.set(options.sessionId, { signature, expiry });\n}\n\nexport function withChatGptCodexTransportRouting<TOptions extends StreamOptions>(\n\tmodel: Model<Api>,\n\toptions: TOptions,\n\tcloseWebSocketSessions: CloseCodexWebSocketSessions = closeOpenAICodexWebSocketSessions,\n): TOptions {\n\tconst headers: ProviderHeaders = { ...(options.headers ?? {}) };\n\tconst onPayload = options.onPayload;\n\tconst priority =\n\t\tgetModelFastRoute(model)?.serviceTier === FAST_MODEL_SERVICE_TIER && usesFirstPartyCodexRouting(model);\n\tconst routedModel = resolveUpstreamModelId(model);\n\treturn {\n\t\t...options,\n\t\theaders,\n\t\tfetch: wrapCodexFastRouteFetch(options.fetch ?? globalThis.fetch),\n\t\tonPayload: async (payload, requestModel) => {\n\t\t\tconst replacement = await onPayload?.(payload, requestModel);\n\t\t\tconst finalPayload = replacement === undefined ? payload : replacement;\n\t\t\tdeleteHeader(headers, CODEX_FAST_ROUTE_HEADER);\n\t\t\tclearCodexFastRouteRequestMarker(headers);\n\t\t\tif (priority) {\n\t\t\t\tsetHeader(headers, CODEX_FAST_ROUTE_HEADER, `model=${routedModel};tier=${FAST_MODEL_SERVICE_TIER}`);\n\t\t\t} else {\n\t\t\t\tfor (const [name, value] of Object.entries(headers)) {\n\t\t\t\t\tif (name.toLowerCase() === \"originator\" && value === CODEX_FAST_ROUTE_ORIGINATOR) delete headers[name];\n\t\t\t\t}\n\t\t\t}\n\t\t\tmarkCodexFastRouteRequest(headers, priority);\n\t\t\tupdateCodexWebSocketRoutingState(model, routedModel, options, priority, closeWebSocketSessions);\n\t\t\treturn finalPayload;\n\t\t},\n\t} as TOptions;\n}\n\nfunction buildFastRouteBaseProviderOptions(\n\tmodel: Model<Api>,\n\toptions: FastRouteStreamOptions | undefined,\n): StreamOptions {\n\t// Native fast-route streams bypass pi-ai's streamSimple base-options merge.\n\tconst samplingParams =\n\t\tmodel.samplingParams || options?.samplingParams\n\t\t\t? { ...model.samplingParams, ...options?.samplingParams }\n\t\t\t: undefined;\n\tconst providerOptions: StreamOptions = {\n\t\tsamplingParams,\n\t\ttemperature: options?.temperature,\n\t\tmaxTokens: options?.maxTokens,\n\t\tsignal: options?.signal,\n\t\tapiKey: options?.apiKey,\n\t\tfetch: options?.fetch,\n\t\tenv: options?.env,\n\t\ttelemetryContext: options?.telemetryContext,\n\t\ttransport: options?.transport,\n\t\tcacheRetention: options?.cacheRetention,\n\t\tsessionId: options?.sessionId,\n\t\tonPayload: options?.onPayload,\n\t\tonResponse: options?.onResponse,\n\t\tonProviderStreamEvent: options?.onProviderStreamEvent,\n\t\theaders: options?.headers,\n\t\ttimeoutMs: options?.timeoutMs,\n\t\twebsocketConnectTimeoutMs: options?.websocketConnectTimeoutMs,\n\t\tstreamDeadlineMs: options?.streamDeadlineMs,\n\t\tmaxRetries: options?.maxRetries,\n\t\tmaxRetryDelayMs: options?.maxRetryDelayMs,\n\t\tmetadata: options?.metadata,\n\t};\n\treturn usesChatGptCodexTransport(model) ? withChatGptCodexTransportRouting(model, providerOptions) : providerOptions;\n}\n\nexport function mapFastRouteReasoningEffort(\n\tmodel: Model<Api>,\n\treasoning: ThinkingLevel | undefined,\n): ThinkingLevel | undefined {\n\tconst clampedReasoning = reasoning ? clampThinkingLevel(model, reasoning) : undefined;\n\treturn clampedReasoning === \"off\" ? undefined : clampedReasoning;\n}\n\nexport function buildOpenAIResponsesFastRouteOptions(\n\tmodel: Model<Api>,\n\toptions: FastRouteStreamOptions | undefined,\n): OpenAIResponsesOptions {\n\treturn {\n\t\t...buildFastRouteBaseProviderOptions(model, options),\n\t\treasoningEffort: mapFastRouteReasoningEffort(model, options?.reasoning),\n\t\tserviceTier: options?.serviceTier,\n\t};\n}\n\nexport function buildOpenAICodexResponsesFastRouteOptions(\n\tmodel: Model<Api>,\n\toptions: FastRouteStreamOptions | undefined,\n): OpenAICodexResponsesOptions {\n\treturn {\n\t\t...buildFastRouteBaseProviderOptions(model, options),\n\t\treasoningEffort: mapFastRouteReasoningEffort(model, options?.reasoning),\n\t\tserviceTier: options?.serviceTier,\n\t};\n}\n\n/**\n * Stream a request whose canonical selected model carries fast-route metadata. The provider adapter\n * translates only the serialized request to the route's upstream ID; the model object keeps its\n * canonical `-fast` identity.\n */\nexport function streamWithFastRoute(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions: FastRouteStreamOptions | undefined,\n\tstreamers: FastRouteStreamers = DEFAULT_FAST_ROUTE_STREAMERS,\n): AssistantMessageEventStream {\n\tif (shouldUseNativeFastRoute(model, options)) {\n\t\tif (model.api === \"openai-responses\") {\n\t\t\treturn streamers.streamOpenAIResponses(\n\t\t\t\tmodel as Model<\"openai-responses\">,\n\t\t\t\tnormalizeContext(context),\n\t\t\t\tbuildOpenAIResponsesFastRouteOptions(model, options),\n\t\t\t);\n\t\t}\n\n\t\t// The WebSocket handshake builds its headers inside pi-ai, and the runtime\n\t\t// constructor can be cached before the first turn, so repair the identity\n\t\t// through the global constructor rather than per-request options.\n\t\tif (options?.transport !== \"sse\" && usesChatGptCodexTransport(model)) {\n\t\t\tinstallCodexFastRouteWebSocketIdentity();\n\t\t}\n\n\t\treturn streamers.streamOpenAICodexResponses(\n\t\t\tmodel as Model<\"openai-codex-responses\">,\n\t\t\tnormalizeContext(context),\n\t\t\tbuildOpenAICodexResponsesFastRouteOptions(model, options),\n\t\t);\n\t}\n\n\treturn streamers.streamSimple(model, context, options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fast-model-routing.js","sourceRoot":"","sources":["../../src/core/fast-model-routing.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeOpenAICodexWebSocketSessions } from \"@bastani/pi-ai/api/openai-codex-responses\";\nimport {\n\ttype Api,\n\ttype AssistantMessageEventStream,\n\ttype Context,\n\tclampThinkingLevel,\n\ttype Model,\n\ttype ModelFastRoute,\n\tnormalizeContext,\n\ttype OpenAICodexResponsesOptions,\n\ttype OpenAIResponsesOptions,\n\ttype ProviderHeaders,\n\ttype SimpleStreamOptions,\n\ttype StreamOptions,\n\tstreamOpenAICodexResponses,\n\tstreamOpenAIResponses,\n\tstreamSimple,\n\ttype ThinkingLevel,\n\ttype TranscriptContext,\n} from \"@bastani/pi-ai/compat\";\nimport {\n\tCODEX_FAST_ROUTE_HEADER,\n\tCODEX_FAST_ROUTE_ORIGINATOR,\n\tclearCodexFastRouteRequestMarker,\n\tinstallCodexFastRouteWebSocketIdentity,\n\tisFirstPartyCodexBaseUrl,\n\tmarkCodexFastRouteRequest,\n\twrapCodexFastRouteFetch,\n} from \"./fast-model-routing-transport.ts\";\nimport { FAST_MODEL_SERVICE_TIER, isNativeFastRouteApi, ULTRAFAST_MODEL_SERVICE_TIER } from \"./fast-model-variants.ts\";\n\nexport interface FastRouteStreamOptions extends SimpleStreamOptions {\n\tserviceTier?: ModelFastRoute[\"serviceTier\"];\n}\n\nexport interface FastRouteStreamers {\n\tstreamSimple: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\tstreamOpenAIResponses: (\n\t\tmodel: Model<\"openai-responses\">,\n\t\tcontext: TranscriptContext,\n\t\toptions?: OpenAIResponsesOptions,\n\t) => AssistantMessageEventStream;\n\tstreamOpenAICodexResponses: (\n\t\tmodel: Model<\"openai-codex-responses\">,\n\t\tcontext: TranscriptContext,\n\t\toptions?: OpenAICodexResponsesOptions,\n\t) => AssistantMessageEventStream;\n}\n\nconst DEFAULT_FAST_ROUTE_STREAMERS: FastRouteStreamers = {\n\tstreamSimple,\n\tstreamOpenAIResponses,\n\tstreamOpenAICodexResponses,\n};\n\nconst CODEX_WEBSOCKET_ROUTING_STATE_IDLE_MS = 6 * 60 * 1000;\nconst codexWebSocketRoutingState = new Map<string, { signature: string; expiry: ReturnType<typeof setTimeout> }>();\n\n/**\n * Explicit route metadata is the only source of fast semantics. A model whose ID merely ends in\n * `-fast` — a provider, `models.json`, or extension model that owns that exact ID — routes normally.\n */\nexport function getModelFastRoute(model: Pick<Model<Api>, \"fastRoute\">): ModelFastRoute | undefined {\n\treturn model.fastRoute;\n}\n\n/**\n * The model ID this request sends upstream. An OpenAI-style fast route sends the base model and\n * carries a priority service tier instead; a provider with real fast siblings sends its own\n * advertised ID, which is already the canonical one. The canonical `-fast` identity always stays on\n * the model object Atomic selected, persisted, and records — only the serialized request differs.\n */\nexport function resolveUpstreamModelId(model: Pick<Model<Api>, \"fastRoute\" | \"id\">): string {\n\treturn model.fastRoute?.upstreamModelId ?? model.id;\n}\n\n/**\n * Whether a model uses the first-party OpenAI Codex provider identity and endpoint.\n * A renamed provider on the same protocol remains non-first-party.\n */\nexport function usesFirstPartyCodexRouting(model: Pick<Model<Api>, \"baseUrl\" | \"provider\">): boolean {\n\treturn model.provider === \"openai-codex\" && isFirstPartyCodexBaseUrl(model.baseUrl);\n}\n\n/** A provider alias or proxy still uses the shared ChatGPT Codex protocol when its API does. */\nexport function usesChatGptCodexTransport(model: Pick<Model<Api>, \"api\">): boolean {\n\treturn model.api === \"openai-codex-responses\";\n}\n\nfunction deleteHeader(headers: ProviderHeaders, name: string): void {\n\tfor (const existingName of Object.keys(headers)) {\n\t\tif (existingName.toLowerCase() === name.toLowerCase()) delete headers[existingName];\n\t}\n}\n\nfunction setHeader(headers: ProviderHeaders, name: string, value: string): void {\n\tdeleteHeader(headers, name);\n\theaders[name] = value;\n}\n\n/**\n * Eager first-party routing headers for a model that carries an OpenAI-style fast route.\n *\n * Derived entirely from the model: the headers are added only when the model's own `fastRoute`\n * declares the priority tier and the model uses first-party Codex routing, and the hint names the\n * route's upstream model ID — the same value the request serializes and\n * `withChatGptCodexTransportRouting` reads from route metadata. There is no caller-supplied enable\n * flag, so a model without a route can never be granted this identity.\n */\nexport function withCodexFastRouteHeaders(\n\tmodel: Pick<Model<Api>, \"baseUrl\" | \"fastRoute\" | \"id\" | \"provider\">,\n\theaders: ProviderHeaders | undefined,\n): ProviderHeaders | undefined {\n\tconst tier = getModelFastRoute(model)?.serviceTier;\n\tif (tier === undefined || !usesFirstPartyCodexRouting(model)) {\n\t\treturn headers;\n\t}\n\tconst fastHeaders: ProviderHeaders = { ...(headers ?? {}) };\n\tsetHeader(fastHeaders, \"originator\", CODEX_FAST_ROUTE_ORIGINATOR);\n\tsetHeader(fastHeaders, CODEX_FAST_ROUTE_HEADER, `model=${resolveUpstreamModelId(model)};tier=${tier}`);\n\treturn fastHeaders;\n}\n\n/** Attach the route's service tier to the outgoing stream options. */\nexport function withFastRouteStreamOptions(\n\tfastRoute: ModelFastRoute | undefined,\n\toptions: SimpleStreamOptions | undefined,\n): FastRouteStreamOptions | undefined {\n\tif (fastRoute?.serviceTier === undefined) return options;\n\treturn { ...(options ?? {}), headers: options?.headers, serviceTier: fastRoute.serviceTier };\n}\n\n/** A service-tier route needs pi-ai's native adapters; `streamSimple` drops `serviceTier`. */\nexport function shouldUseNativeFastRoute(\n\tmodel: Pick<Model<Api>, \"api\">,\n\toptions: FastRouteStreamOptions | undefined,\n): boolean {\n\treturn (\n\t\tisNativeFastRouteApi(model.api) &&\n\t\t(options?.serviceTier === FAST_MODEL_SERVICE_TIER || options?.serviceTier === ULTRAFAST_MODEL_SERVICE_TIER)\n\t);\n}\n\nfunction codexEnvironmentScope(env: StreamOptions[\"env\"]): string {\n\tif (!env) return \"none\";\n\tconst serialized = JSON.stringify(Object.entries(env).sort(([left], [right]) => left.localeCompare(right)));\n\tlet hash = 2166136261;\n\tfor (let index = 0; index < serialized.length; index += 1) {\n\t\thash = Math.imul(hash ^ serialized.charCodeAt(index), 16777619);\n\t}\n\treturn (hash >>> 0).toString(16);\n}\n\ntype CloseCodexWebSocketSessions = typeof closeOpenAICodexWebSocketSessions;\nfunction updateCodexWebSocketRoutingState(\n\tmodel: Pick<Model<Api>, \"baseUrl\" | \"provider\">,\n\troutedModel: string,\n\toptions: Pick<StreamOptions, \"env\" | \"sessionId\" | \"transport\">,\n\ttier: ModelFastRoute[\"serviceTier\"],\n\tcloseWebSocketSessions: CloseCodexWebSocketSessions,\n): void {\n\tif (options.transport === \"sse\" || !options.sessionId) return;\n\tconst signature = `${model.provider}\\0${model.baseUrl}\\0${codexEnvironmentScope(options.env)}\\0${tier ? `${tier}:${routedModel}` : \"normal\"}`;\n\tconst previous = codexWebSocketRoutingState.get(options.sessionId);\n\tif (previous?.signature !== undefined && previous.signature !== signature) {\n\t\tcloseWebSocketSessions(options.sessionId);\n\t}\n\tif (previous) clearTimeout(previous.expiry);\n\tconst expiry = setTimeout(() => {\n\t\tif (codexWebSocketRoutingState.get(options.sessionId!)?.signature === signature) {\n\t\t\tcodexWebSocketRoutingState.delete(options.sessionId!);\n\t\t}\n\t}, CODEX_WEBSOCKET_ROUTING_STATE_IDLE_MS);\n\texpiry.unref?.();\n\tcodexWebSocketRoutingState.set(options.sessionId, { signature, expiry });\n}\n\nexport function withChatGptCodexTransportRouting<TOptions extends StreamOptions>(\n\tmodel: Model<Api>,\n\toptions: TOptions,\n\tcloseWebSocketSessions: CloseCodexWebSocketSessions = closeOpenAICodexWebSocketSessions,\n): TOptions {\n\tconst headers: ProviderHeaders = { ...(options.headers ?? {}) };\n\tconst onPayload = options.onPayload;\n\tconst tier = usesFirstPartyCodexRouting(model) ? getModelFastRoute(model)?.serviceTier : undefined;\n\tconst routedModel = resolveUpstreamModelId(model);\n\treturn {\n\t\t...options,\n\t\theaders,\n\t\tfetch: wrapCodexFastRouteFetch(options.fetch ?? globalThis.fetch),\n\t\tonPayload: async (payload, requestModel) => {\n\t\t\tconst replacement = await onPayload?.(payload, requestModel);\n\t\t\tconst finalPayload = replacement === undefined ? payload : replacement;\n\t\t\tdeleteHeader(headers, CODEX_FAST_ROUTE_HEADER);\n\t\t\tclearCodexFastRouteRequestMarker(headers);\n\t\t\tif (tier) {\n\t\t\t\tsetHeader(headers, CODEX_FAST_ROUTE_HEADER, `model=${routedModel};tier=${tier}`);\n\t\t\t} else {\n\t\t\t\tfor (const [name, value] of Object.entries(headers)) {\n\t\t\t\t\tif (name.toLowerCase() === \"originator\" && value === CODEX_FAST_ROUTE_ORIGINATOR) delete headers[name];\n\t\t\t\t}\n\t\t\t}\n\t\t\tmarkCodexFastRouteRequest(headers, tier !== undefined);\n\t\t\tupdateCodexWebSocketRoutingState(model, routedModel, options, tier, closeWebSocketSessions);\n\t\t\treturn finalPayload;\n\t\t},\n\t} as TOptions;\n}\n\nfunction buildFastRouteBaseProviderOptions(\n\tmodel: Model<Api>,\n\toptions: FastRouteStreamOptions | undefined,\n): StreamOptions {\n\t// Native fast-route streams bypass pi-ai's streamSimple base-options merge.\n\tconst samplingParams =\n\t\tmodel.samplingParams || options?.samplingParams\n\t\t\t? { ...model.samplingParams, ...options?.samplingParams }\n\t\t\t: undefined;\n\tconst providerOptions: StreamOptions = {\n\t\tsamplingParams,\n\t\ttemperature: options?.temperature,\n\t\tmaxTokens: options?.maxTokens,\n\t\tsignal: options?.signal,\n\t\tapiKey: options?.apiKey,\n\t\tfetch: options?.fetch,\n\t\tenv: options?.env,\n\t\ttelemetryContext: options?.telemetryContext,\n\t\ttransport: options?.transport,\n\t\tcacheRetention: options?.cacheRetention,\n\t\tsessionId: options?.sessionId,\n\t\tonPayload: options?.onPayload,\n\t\tonResponse: options?.onResponse,\n\t\tonProviderStreamEvent: options?.onProviderStreamEvent,\n\t\theaders: options?.headers,\n\t\ttimeoutMs: options?.timeoutMs,\n\t\twebsocketConnectTimeoutMs: options?.websocketConnectTimeoutMs,\n\t\tstreamDeadlineMs: options?.streamDeadlineMs,\n\t\tmaxRetries: options?.maxRetries,\n\t\tmaxRetryDelayMs: options?.maxRetryDelayMs,\n\t\tmetadata: options?.metadata,\n\t};\n\treturn usesChatGptCodexTransport(model) ? withChatGptCodexTransportRouting(model, providerOptions) : providerOptions;\n}\n\nexport function mapFastRouteReasoningEffort(\n\tmodel: Model<Api>,\n\treasoning: ThinkingLevel | undefined,\n): ThinkingLevel | undefined {\n\tconst clampedReasoning = reasoning ? clampThinkingLevel(model, reasoning) : undefined;\n\treturn clampedReasoning === \"off\" ? undefined : clampedReasoning;\n}\n\nexport function buildOpenAIResponsesFastRouteOptions(\n\tmodel: Model<Api>,\n\toptions: FastRouteStreamOptions | undefined,\n): OpenAIResponsesOptions {\n\treturn {\n\t\t...buildFastRouteBaseProviderOptions(model, options),\n\t\treasoningEffort: mapFastRouteReasoningEffort(model, options?.reasoning),\n\t\tserviceTier: options?.serviceTier,\n\t};\n}\n\nexport function buildOpenAICodexResponsesFastRouteOptions(\n\tmodel: Model<Api>,\n\toptions: FastRouteStreamOptions | undefined,\n): OpenAICodexResponsesOptions {\n\treturn {\n\t\t...buildFastRouteBaseProviderOptions(model, options),\n\t\treasoningEffort: mapFastRouteReasoningEffort(model, options?.reasoning),\n\t\tserviceTier: options?.serviceTier,\n\t};\n}\n\n/**\n * Stream a request whose canonical selected model carries fast-route metadata. The provider adapter\n * translates only the serialized request to the route's upstream ID; the model object keeps its\n * canonical `-fast` identity.\n */\nexport function streamWithFastRoute(\n\tmodel: Model<Api>,\n\tcontext: Context,\n\toptions: FastRouteStreamOptions | undefined,\n\tstreamers: FastRouteStreamers = DEFAULT_FAST_ROUTE_STREAMERS,\n): AssistantMessageEventStream {\n\tif (shouldUseNativeFastRoute(model, options)) {\n\t\tif (model.api === \"openai-responses\") {\n\t\t\treturn streamers.streamOpenAIResponses(\n\t\t\t\tmodel as Model<\"openai-responses\">,\n\t\t\t\tnormalizeContext(context),\n\t\t\t\tbuildOpenAIResponsesFastRouteOptions(model, options),\n\t\t\t);\n\t\t}\n\n\t\t// The WebSocket handshake builds its headers inside pi-ai, and the runtime\n\t\t// constructor can be cached before the first turn, so repair the identity\n\t\t// through the global constructor rather than per-request options.\n\t\tif (options?.transport !== \"sse\" && usesChatGptCodexTransport(model)) {\n\t\t\tinstallCodexFastRouteWebSocketIdentity();\n\t\t}\n\n\t\treturn streamers.streamOpenAICodexResponses(\n\t\t\tmodel as Model<\"openai-codex-responses\">,\n\t\t\tnormalizeContext(context),\n\t\t\tbuildOpenAICodexResponsesFastRouteOptions(model, options),\n\t\t);\n\t}\n\n\treturn streamers.streamSimple(model, context, options);\n}\n"]}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Api, type Credential, type Model, type Provider } from "@bastani/pi-ai";
|
|
2
2
|
import type { ModelsJsonModelOverride } from "./model-config.ts";
|
|
3
3
|
/** Canonical suffix every selectable fast model variant carries. */
|
|
4
4
|
export declare const FAST_MODEL_ID_SUFFIX = "-fast";
|
|
5
5
|
/** Service tier OpenAI-style providers use to route fast traffic. */
|
|
6
6
|
export declare const FAST_MODEL_SERVICE_TIER: "priority";
|
|
7
|
+
/** Codex's Ultrafast tier, offered only for models that advertise it; access depends on the account. */
|
|
8
|
+
export declare const ULTRAFAST_MODEL_ID_SUFFIX = "-ultrafast";
|
|
9
|
+
export declare const ULTRAFAST_MODEL_SERVICE_TIER: "ultrafast";
|
|
7
10
|
/** Inference speed Anthropic's Messages API uses to route fast traffic. */
|
|
8
11
|
export declare const FAST_MODEL_SPEED: "fast";
|
|
9
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-model-variants.d.ts","sourceRoot":"","sources":["../../src/core/fast-model-variants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"fast-model-variants.d.ts","sourceRoot":"","sources":["../../src/core/fast-model-variants.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { getServiceTierCost, } from "@bastani/pi-ai";
|
|
1
2
|
import { applyModelOverride } from "./provider-composer-internal.js";
|
|
2
3
|
/** Canonical suffix every selectable fast model variant carries. */
|
|
3
4
|
export const FAST_MODEL_ID_SUFFIX = "-fast";
|
|
4
5
|
/** Service tier OpenAI-style providers use to route fast traffic. */
|
|
5
6
|
export const FAST_MODEL_SERVICE_TIER = "priority";
|
|
7
|
+
/** Codex's Ultrafast tier, offered only for models that advertise it; access depends on the account. */
|
|
8
|
+
export const ULTRAFAST_MODEL_ID_SUFFIX = "-ultrafast";
|
|
9
|
+
export const ULTRAFAST_MODEL_SERVICE_TIER = "ultrafast";
|
|
6
10
|
/** Inference speed Anthropic's Messages API uses to route fast traffic. */
|
|
7
11
|
export const FAST_MODEL_SPEED = "fast";
|
|
8
12
|
/**
|
|
@@ -92,8 +96,17 @@ export function copilotAdvertisesModelId(credential, modelId) {
|
|
|
92
96
|
return (advertisedModelIds(credential.availableModelIds)?.includes(modelId) === true ||
|
|
93
97
|
advertisedModelIds(credential.fastModelIds)?.includes(modelId) === true);
|
|
94
98
|
}
|
|
99
|
+
/** A model without tier metadata keeps offering Fast; one that lists its tiers must advertise it, as in Codex. */
|
|
100
|
+
function advertisesFastServiceTier(model) {
|
|
101
|
+
return model.serviceTiers === undefined || getServiceTierCost(model, FAST_MODEL_SERVICE_TIER) !== undefined;
|
|
102
|
+
}
|
|
95
103
|
function fastRouteForBaseModel(model, entitledCopilotFastModelIds) {
|
|
96
|
-
if (usesOpenAIFastServiceTier(model)
|
|
104
|
+
if (usesOpenAIFastServiceTier(model)) {
|
|
105
|
+
return advertisesFastServiceTier(model)
|
|
106
|
+
? { baseModelId: model.id, upstreamModelId: model.id, serviceTier: FAST_MODEL_SERVICE_TIER }
|
|
107
|
+
: undefined;
|
|
108
|
+
}
|
|
109
|
+
if (usesXaiFastServiceTier(model)) {
|
|
97
110
|
return { baseModelId: model.id, upstreamModelId: model.id, serviceTier: FAST_MODEL_SERVICE_TIER };
|
|
98
111
|
}
|
|
99
112
|
if (usesAnthropicFastMode(model)) {
|
|
@@ -133,7 +146,9 @@ export function deriveFastModelVariants(providerId, models, options = {}) {
|
|
|
133
146
|
let changed = false;
|
|
134
147
|
for (const model of models) {
|
|
135
148
|
derived.push(model);
|
|
136
|
-
if (model.fastRoute !== undefined ||
|
|
149
|
+
if (model.fastRoute !== undefined ||
|
|
150
|
+
model.id.endsWith(FAST_MODEL_ID_SUFFIX) ||
|
|
151
|
+
model.id.endsWith(ULTRAFAST_MODEL_ID_SUFFIX))
|
|
137
152
|
continue;
|
|
138
153
|
if (options.customModelIds?.has(model.id))
|
|
139
154
|
continue;
|
|
@@ -143,23 +158,33 @@ export function deriveFastModelVariants(providerId, models, options = {}) {
|
|
|
143
158
|
if (options.extensionOwnedApis?.has(model.api) === true)
|
|
144
159
|
continue;
|
|
145
160
|
const fastRoute = fastRouteForBaseModel(model, entitledCopilotFastModelIds);
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
if (
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
`so Atomic did not derive a fast variant of "${providerId}/${model.id}". ` +
|
|
155
|
-
`That model routes exactly as declared. Rename or remove it to get the derived fast variant instead.`,
|
|
161
|
+
const routes = [];
|
|
162
|
+
if (fastRoute)
|
|
163
|
+
routes.push({ suffix: FAST_MODEL_ID_SUFFIX, label: "fast", route: fastRoute });
|
|
164
|
+
if (usesOpenAIFastServiceTier(model) && getServiceTierCost(model, ULTRAFAST_MODEL_SERVICE_TIER)) {
|
|
165
|
+
routes.push({
|
|
166
|
+
suffix: ULTRAFAST_MODEL_ID_SUFFIX,
|
|
167
|
+
label: "ultrafast",
|
|
168
|
+
route: { baseModelId: model.id, upstreamModelId: model.id, serviceTier: ULTRAFAST_MODEL_SERVICE_TIER },
|
|
156
169
|
});
|
|
157
|
-
continue;
|
|
158
170
|
}
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
171
|
+
for (const { suffix, label, route } of routes) {
|
|
172
|
+
const variantId = `${model.id}${suffix}`;
|
|
173
|
+
if (ownedModelIds.has(variantId)) {
|
|
174
|
+
diagnostics.push({
|
|
175
|
+
provider: providerId,
|
|
176
|
+
modelId: variantId,
|
|
177
|
+
message: `Model "${providerId}/${variantId}" is already defined by the provider, models.json, or an extension, ` +
|
|
178
|
+
`so Atomic did not derive a ${label} variant of "${providerId}/${model.id}". ` +
|
|
179
|
+
`That model routes exactly as declared. Rename or remove it to get the derived ${label} variant instead.`,
|
|
180
|
+
});
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const override = options.modelOverrides?.[variantId];
|
|
184
|
+
const variant = { ...model, id: variantId, name: `${model.name} (${label})`, fastRoute: route };
|
|
185
|
+
derived.push(override ? applyModelOverride(variant, override) : variant);
|
|
186
|
+
changed = true;
|
|
187
|
+
}
|
|
163
188
|
}
|
|
164
189
|
if (!changed && diagnostics.length === 0)
|
|
165
190
|
return { models, diagnostics };
|