@code-yeongyu/senpi 2026.7.25 → 2026.7.26
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 +81 -0
- package/README.md +1 -1
- package/dist/beta/omo-local-update.d.ts +207 -0
- package/dist/beta/omo-local-update.d.ts.map +1 -0
- package/dist/beta/omo-local-update.js +708 -0
- package/dist/beta/omo-local-update.js.map +1 -0
- package/dist/cli/args.d.ts +4 -16
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -25
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/grok-neo-gate.d.ts +12 -0
- package/dist/cli/grok-neo-gate.d.ts.map +1 -0
- package/dist/cli/grok-neo-gate.js +18 -0
- package/dist/cli/grok-neo-gate.js.map +1 -0
- package/dist/cli-main.js +4 -0
- package/dist/cli-main.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +2 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +33 -8
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +22 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +202 -58
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-providers.d.ts +2 -2
- package/dist/core/auth-providers.js +2 -2
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.js +3 -2
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +30 -2
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +28 -0
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +20 -17
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/log.d.ts +4 -1
- package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/log.js +3 -0
- package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts +15 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.js +102 -0
- package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -0
- package/dist/core/extensions/builtin/goal/command-registration.js +2 -2
- package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/format.d.ts +1 -1
- package/dist/core/extensions/builtin/goal/format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/format.js +9 -2
- package/dist/core/extensions/builtin/goal/format.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +38 -23
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +19 -0
- package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -0
- package/dist/core/extensions/builtin/goal/persistence.d.ts +6 -0
- package/dist/core/extensions/builtin/goal/persistence.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/persistence.js +141 -0
- package/dist/core/extensions/builtin/goal/persistence.js.map +1 -0
- package/dist/core/extensions/builtin/goal/store.d.ts +7 -3
- package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/store.js +66 -181
- package/dist/core/extensions/builtin/goal/store.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +26 -15
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/transitions.d.ts +3 -0
- package/dist/core/extensions/builtin/goal/transitions.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/transitions.js +45 -0
- package/dist/core/extensions/builtin/goal/transitions.js.map +1 -0
- package/dist/core/extensions/builtin/goal/types.d.ts +10 -4
- package/dist/core/extensions/builtin/goal/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/types.js +2 -2
- package/dist/core/extensions/builtin/goal/types.js.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.js +2 -0
- package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
- package/dist/core/extensions/builtin/goal/validation.d.ts +8 -1
- package/dist/core/extensions/builtin/goal/validation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/validation.js +24 -12
- package/dist/core/extensions/builtin/goal/validation.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +0 -2
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.js +8 -5
- package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/permission-system/parsers.js +1 -0
- package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +48 -0
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +88 -64
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/extension.js +32 -0
- package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/index.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/index.js +1 -1
- package/dist/core/extensions/builtin/terminal/index.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts +29 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.js +185 -0
- package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +35 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.js +98 -0
- package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/notify.d.ts +9 -0
- package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/notify.js +30 -14
- package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/prompt.js +13 -5
- package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +3 -12
- package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/runtime-session.js +4 -59
- package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/settings.d.ts +8 -0
- package/dist/core/extensions/builtin/terminal/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/settings.js +16 -2
- package/dist/core/extensions/builtin/terminal/settings.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.d.ts +2 -2
- package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/shared.js +2 -1
- package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts +10 -4
- package/dist/core/extensions/builtin/terminal/tools/bash-output.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js +17 -96
- package/dist/core/extensions/builtin/terminal/tools/bash-output.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts +7 -0
- package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +41 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.js +97 -0
- package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts +3 -0
- package/dist/core/extensions/builtin/terminal/tools/render.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/render.js +5 -2
- package/dist/core/extensions/builtin/terminal/tools/render.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts +19 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.js +70 -0
- package/dist/core/extensions/builtin/todotools/fuzzy-match.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/normalize.d.ts +8 -0
- package/dist/core/extensions/builtin/todotools/normalize.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/normalize.js +174 -0
- package/dist/core/extensions/builtin/todotools/normalize.js.map +1 -0
- package/dist/core/extensions/builtin/todotools/prompt.d.ts +2 -2
- package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/prompt.js +4 -2
- package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.d.ts +9 -8
- package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/state.js +99 -48
- package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/tools/todo.js +65 -38
- package/dist/core/extensions/builtin/todotools/tools/todo.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/index.js +2 -4
- package/dist/core/extensions/builtin/websearch/index.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.js +4 -1
- package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/native.js +2 -4
- package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js +20 -8
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +6 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.js +15 -11
- package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.js +5 -10
- package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -0
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +12 -0
- package/dist/core/extensions/loader.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 +12 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +25 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +0 -5
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +0 -2
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts +32 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +91 -0
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-resolver.d.ts +10 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +13 -3
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +2 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +4 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +19 -1
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts +9 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +13 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/retry-fallback/controller.d.ts +7 -0
- package/dist/core/retry-fallback/controller.d.ts.map +1 -1
- package/dist/core/retry-fallback/controller.js +13 -0
- package/dist/core/retry-fallback/controller.js.map +1 -1
- package/dist/core/retry-fallback/cooldown.d.ts.map +1 -1
- package/dist/core/retry-fallback/cooldown.js +5 -0
- package/dist/core/retry-fallback/cooldown.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +11 -35
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +12 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +10 -13
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/thinking-levels.d.ts.map +1 -1
- package/dist/core/thinking-levels.js +9 -2
- package/dist/core/thinking-levels.js.map +1 -1
- package/dist/core/timings.d.ts +7 -2
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +11 -0
- package/dist/core/timings.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +6 -0
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/inspector-policy.d.ts +22 -0
- package/dist/inspector-policy.d.ts.map +1 -0
- package/dist/inspector-policy.js +84 -0
- package/dist/inspector-policy.js.map +1 -0
- package/dist/main.d.ts +6 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +20 -23
- package/dist/main.js.map +1 -1
- package/dist/modes/app-server/runtime.d.ts.map +1 -1
- package/dist/modes/app-server/runtime.js +1 -0
- package/dist/modes/app-server/runtime.js.map +1 -1
- package/dist/modes/app-server/threads/goal-handlers.js +4 -2
- package/dist/modes/app-server/threads/goal-handlers.js.map +1 -1
- package/dist/modes/app-server/threads/goal-wire.d.ts.map +1 -1
- package/dist/modes/app-server/threads/goal-wire.js +1 -0
- package/dist/modes/app-server/threads/goal-wire.js.map +1 -1
- package/dist/modes/app-server/threads/handlers.d.ts +1 -0
- package/dist/modes/app-server/threads/handlers.d.ts.map +1 -1
- package/dist/modes/app-server/threads/handlers.js +2 -0
- package/dist/modes/app-server/threads/handlers.js.map +1 -1
- package/dist/modes/app-server/threads/turn-runtime.d.ts +1 -0
- package/dist/modes/app-server/threads/turn-runtime.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turn-runtime.js.map +1 -1
- package/dist/modes/app-server/threads/turns.d.ts.map +1 -1
- package/dist/modes/app-server/threads/turns.js +47 -3
- package/dist/modes/app-server/threads/turns.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +3 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +9 -2
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -0
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +29 -4
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +5 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +43 -17
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/grok/chrome-tokens.d.ts +22 -0
- package/dist/modes/interactive/grok/chrome-tokens.d.ts.map +1 -0
- package/dist/modes/interactive/grok/chrome-tokens.js +27 -0
- package/dist/modes/interactive/grok/chrome-tokens.js.map +1 -0
- package/dist/modes/interactive/grok/chrome.d.ts +51 -0
- package/dist/modes/interactive/grok/chrome.d.ts.map +1 -0
- package/dist/modes/interactive/grok/chrome.js +105 -0
- package/dist/modes/interactive/grok/chrome.js.map +1 -0
- package/dist/modes/interactive/grok/footer.d.ts +14 -0
- package/dist/modes/interactive/grok/footer.d.ts.map +1 -0
- package/dist/modes/interactive/grok/footer.js +27 -0
- package/dist/modes/interactive/grok/footer.js.map +1 -0
- package/dist/modes/interactive/grok/input-card.d.ts +9 -0
- package/dist/modes/interactive/grok/input-card.d.ts.map +1 -0
- package/dist/modes/interactive/grok/input-card.js +30 -0
- package/dist/modes/interactive/grok/input-card.js.map +1 -0
- package/dist/modes/interactive/grok/palette.d.ts +145 -0
- package/dist/modes/interactive/grok/palette.d.ts.map +1 -0
- package/dist/modes/interactive/grok/palette.js +92 -0
- package/dist/modes/interactive/grok/palette.js.map +1 -0
- package/dist/modes/interactive/grok/tool-row.d.ts +17 -0
- package/dist/modes/interactive/grok/tool-row.d.ts.map +1 -0
- package/dist/modes/interactive/grok/tool-row.js +26 -0
- package/dist/modes/interactive/grok/tool-row.js.map +1 -0
- package/dist/modes/interactive/grok/welcome-card.d.ts +10 -0
- package/dist/modes/interactive/grok/welcome-card.d.ts.map +1 -0
- package/dist/modes/interactive/grok/welcome-card.js +30 -0
- package/dist/modes/interactive/grok/welcome-card.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +117 -54
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/grok-day.json +77 -0
- package/dist/modes/interactive/theme/grok-night.json +93 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +4 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/rpc/connection-handler.d.ts +3 -3
- package/dist/modes/rpc/connection-handler.js +6 -6
- package/dist/modes/rpc/connection-handler.js.map +1 -1
- package/dist/modes/rpc/custom-capability.d.ts +6 -7
- package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
- package/dist/modes/rpc/custom-capability.js +6 -7
- package/dist/modes/rpc/custom-capability.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +2 -2
- package/dist/modes/rpc/rpc-mode.js +5 -5
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +11 -0
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/senpi +2 -0
- package/docs/docs.json +4 -0
- package/docs/environment-variables.md +1 -0
- package/docs/extensions.md +2 -2
- package/docs/grok-neo.md +77 -0
- package/docs/keybindings.md +0 -1
- package/docs/settings.md +14 -3
- package/docs/terminal-tools.md +6 -3
- package/docs/usage.md +1 -1
- package/examples/extensions/message-renderer.ts +2 -2
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +47 -0
- package/node_modules/@code-yeongyu/senpi-codemode/README.md +39 -19
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +6 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/output-bridge.ts +0 -1
- package/node_modules/@code-yeongyu/senpi-codemode/src/extension/eval-notifier.ts +40 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +46 -66
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +5 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +2 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +19 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +7 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +8 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +23 -5
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +322 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +253 -18
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/interrupt-note.ts +58 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +28 -6
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/status-events.ts +20 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +65 -22
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +4 -41
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +6 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +4 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +10 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +38 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +5 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +210 -26
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +16 -8
- package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +39 -20
- package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +9 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +4 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +12 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +19 -11
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +121 -23
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +67 -31
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +13 -8
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts +3 -2
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js +37 -35
- package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +11 -1
- package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts +5 -0
- package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models-store.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js +5 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js +8 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +10 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts +30 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +70 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +7 -3
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts +9 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js +16 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-call-id.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -0
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +35 -3
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +6 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts +32 -0
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +15 -7
- package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +8 -8
- package/dist/cli/neo/build-argv.d.ts +0 -19
- package/dist/cli/neo/build-argv.d.ts.map +0 -1
- package/dist/cli/neo/build-argv.js +0 -84
- package/dist/cli/neo/build-argv.js.map +0 -1
- package/dist/cli/neo/daemon-launch.d.ts +0 -25
- package/dist/cli/neo/daemon-launch.d.ts.map +0 -1
- package/dist/cli/neo/daemon-launch.js +0 -97
- package/dist/cli/neo/daemon-launch.js.map +0 -1
- package/dist/cli/neo/gate.d.ts +0 -15
- package/dist/cli/neo/gate.d.ts.map +0 -1
- package/dist/cli/neo/gate.js +0 -21
- package/dist/cli/neo/gate.js.map +0 -1
- package/dist/cli/neo/launch.d.ts +0 -24
- package/dist/cli/neo/launch.d.ts.map +0 -1
- package/dist/cli/neo/launch.js +0 -66
- package/dist/cli/neo/launch.js.map +0 -1
- package/dist/cli/neo/platform.d.ts +0 -38
- package/dist/cli/neo/platform.d.ts.map +0 -1
- package/dist/cli/neo/platform.js +0 -54
- package/dist/cli/neo/platform.js.map +0 -1
- package/dist/cli/neo/resolve-binary.d.ts +0 -39
- package/dist/cli/neo/resolve-binary.d.ts.map +0 -1
- package/dist/cli/neo/resolve-binary.js +0 -66
- package/dist/cli/neo/resolve-binary.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/index.d.ts +0 -5
- package/dist/core/extensions/builtin/session-observer/index.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/index.js +0 -36
- package/dist/core/extensions/builtin/session-observer/index.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/loader.d.ts +0 -3
- package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/loader.js +0 -20
- package/dist/core/extensions/builtin/session-observer/loader.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay-format.js +0 -30
- package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay.d.ts +0 -51
- package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/overlay.js +0 -229
- package/dist/core/extensions/builtin/session-observer/overlay.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/scanner.d.ts +0 -10
- package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/scanner.js +0 -142
- package/dist/core/extensions/builtin/session-observer/scanner.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/text.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/text.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/text.js +0 -37
- package/dist/core/extensions/builtin/session-observer/text.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts +0 -7
- package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-entries.js +0 -71
- package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts +0 -11
- package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript-format.js +0 -65
- package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript.d.ts +0 -4
- package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/transcript.js +0 -81
- package/dist/core/extensions/builtin/session-observer/transcript.js.map +0 -1
- package/dist/core/extensions/builtin/session-observer/types.d.ts +0 -33
- package/dist/core/extensions/builtin/session-observer/types.d.ts.map +0 -1
- package/dist/core/extensions/builtin/session-observer/types.js +0 -2
- package/dist/core/extensions/builtin/session-observer/types.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-child-worker.d.ts +0 -29
- package/dist/modes/rpc/neo-daemon-child-worker.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-child-worker.js +0 -95
- package/dist/modes/rpc/neo-daemon-child-worker.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-mode.d.ts +0 -110
- package/dist/modes/rpc/neo-daemon-mode.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-mode.js +0 -267
- package/dist/modes/rpc/neo-daemon-mode.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-protocol.d.ts +0 -50
- package/dist/modes/rpc/neo-daemon-protocol.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-protocol.js +0 -66
- package/dist/modes/rpc/neo-daemon-protocol.js.map +0 -1
- package/dist/modes/rpc/neo-daemon-registry.d.ts +0 -98
- package/dist/modes/rpc/neo-daemon-registry.d.ts.map +0 -1
- package/dist/modes/rpc/neo-daemon-registry.js +0 -209
- package/dist/modes/rpc/neo-daemon-registry.js.map +0 -1
- package/dist/modes/rpc/neo-runtime-options-argv.d.ts +0 -17
- package/dist/modes/rpc/neo-runtime-options-argv.d.ts.map +0 -1
- package/dist/modes/rpc/neo-runtime-options-argv.js +0 -79
- package/dist/modes/rpc/neo-runtime-options-argv.js.map +0 -1
- package/dist/modes/rpc/neo-runtime-options.d.ts +0 -84
- package/dist/modes/rpc/neo-runtime-options.d.ts.map +0 -1
- package/dist/modes/rpc/neo-runtime-options.js +0 -92
- package/dist/modes/rpc/neo-runtime-options.js.map +0 -1
- package/docs/neo.md +0 -111
- package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/runtime.ts +0 -258
- package/node_modules/@code-yeongyu/senpi-codemode/src/codemode/tools.ts +0 -106
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { Text } from "@earendil-works/pi-tui";
|
|
6
6
|
import { Type } from "typebox";
|
|
7
7
|
import { partialStrikethrough, strikeRevealCount } from "../../../../../modes/interactive/components/todo-strike.js";
|
|
8
|
+
import { normalizeTodoParams } from "../normalize.js";
|
|
8
9
|
import { TODO_TOOL_DESCRIPTION } from "../prompt.js";
|
|
9
10
|
import { applyParams, clonePhases, findTaskByContent, formatSummary, getCompletionTransitions, getTodoMarker, nextActionableTask, sanitizeTodoText, TODO_STATE_ENTRY_TYPE, } from "../state.js";
|
|
10
11
|
const TodoOperationSchema = Type.Union([
|
|
@@ -15,7 +16,7 @@ const TodoOperationSchema = Type.Union([
|
|
|
15
16
|
Type.Literal("drop"),
|
|
16
17
|
Type.Literal("append"),
|
|
17
18
|
Type.Literal("view"),
|
|
18
|
-
]);
|
|
19
|
+
], { description: "Operation to perform. Required — always pass it explicitly." });
|
|
19
20
|
const TodoPhaseInputSchema = Type.Object({
|
|
20
21
|
phase: Type.String({ description: "Phase name" }),
|
|
21
22
|
items: Type.Array(Type.String({ description: "Task content" }), {
|
|
@@ -24,13 +25,13 @@ const TodoPhaseInputSchema = Type.Object({
|
|
|
24
25
|
}),
|
|
25
26
|
});
|
|
26
27
|
export const TODO_PARAMS_SCHEMA = Type.Object({
|
|
27
|
-
op: TodoOperationSchema,
|
|
28
|
+
op: Type.Optional(TodoOperationSchema),
|
|
28
29
|
list: Type.Optional(Type.Array(TodoPhaseInputSchema, { description: "Phased task list for init" })),
|
|
29
|
-
task: Type.Optional(Type.String({ description: "
|
|
30
|
-
phase: Type.Optional(Type.String({ description: "
|
|
30
|
+
task: Type.Optional(Type.String({ description: "Exact task text copied from the previous todo result" })),
|
|
31
|
+
phase: Type.Optional(Type.String({ description: "Exact phase name copied from the previous todo result" })),
|
|
31
32
|
// Keep this unconstrained at the schema boundary. init and append return
|
|
32
33
|
// operation-specific errors, while unrelated operations may ignore it.
|
|
33
|
-
items: Type.Optional(Type.Array(Type.String({ description: "Task content" }), { description: "
|
|
34
|
+
items: Type.Optional(Type.Array(Type.String({ description: "Task content" }), { description: "Task texts to append" })),
|
|
34
35
|
});
|
|
35
36
|
function countInitItems(params) {
|
|
36
37
|
if (params.list) {
|
|
@@ -62,6 +63,11 @@ function renderCallLabel(params) {
|
|
|
62
63
|
return `todo rm: ${sanitizeTodoText(params.task ?? params.phase ?? "all") || "all"}`;
|
|
63
64
|
case "view":
|
|
64
65
|
return "todo view";
|
|
66
|
+
// Normalization can rescue a call that omitted `op`; label it generically until
|
|
67
|
+
// execute resolves the effective operation. Listing `undefined` explicitly (instead
|
|
68
|
+
// of `default`) keeps this switch exhaustive, so a new TodoOperation fails typecheck.
|
|
69
|
+
case undefined:
|
|
70
|
+
return "todo";
|
|
65
71
|
}
|
|
66
72
|
}
|
|
67
73
|
export function phaseRomanNumeral(oneBasedIndex) {
|
|
@@ -117,7 +123,7 @@ function formatTaskLine(task, theme, completionKeys, frame) {
|
|
|
117
123
|
return line;
|
|
118
124
|
}
|
|
119
125
|
}
|
|
120
|
-
function computeTouchedPhases(args, phases, completedTasks) {
|
|
126
|
+
function computeTouchedPhases(args, operation, phases, completedTasks) {
|
|
121
127
|
const touched = new Set();
|
|
122
128
|
const activeTask = nextActionableTask(phases);
|
|
123
129
|
if (activeTask) {
|
|
@@ -127,30 +133,47 @@ function computeTouchedPhases(args, phases, completedTasks) {
|
|
|
127
133
|
}
|
|
128
134
|
for (const transition of completedTasks)
|
|
129
135
|
touched.add(transition.phase);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
if (args.phase) {
|
|
136
|
-
const phase = phases.find((candidate) => candidate.name === args.phase);
|
|
137
|
-
if (phase)
|
|
136
|
+
// Exhaustive over TodoOperation | undefined so adding an operation is a typecheck
|
|
137
|
+
// failure here rather than a silent fall-through into target-scoped highlighting.
|
|
138
|
+
switch (operation) {
|
|
139
|
+
case "init":
|
|
140
|
+
for (const phase of phases)
|
|
138
141
|
touched.add(phase.name);
|
|
142
|
+
break;
|
|
143
|
+
case "start":
|
|
144
|
+
case "done":
|
|
145
|
+
case "drop":
|
|
146
|
+
case "rm":
|
|
147
|
+
case "append":
|
|
148
|
+
case "view":
|
|
149
|
+
case undefined: {
|
|
150
|
+
if (args.phase) {
|
|
151
|
+
const phase = phases.find((candidate) => candidate.name === args.phase);
|
|
152
|
+
if (phase)
|
|
153
|
+
touched.add(phase.name);
|
|
154
|
+
}
|
|
155
|
+
if (args.task) {
|
|
156
|
+
const hit = findTaskByContent([...phases], args.task);
|
|
157
|
+
if (hit)
|
|
158
|
+
touched.add(hit.phase.name);
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
139
161
|
}
|
|
140
|
-
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
touched.add(hit.phase.name);
|
|
162
|
+
default: {
|
|
163
|
+
const _exhaustive = operation;
|
|
164
|
+
return touched.size > 0 ? touched : null;
|
|
144
165
|
}
|
|
145
166
|
}
|
|
146
167
|
return touched.size > 0 ? touched : null;
|
|
147
168
|
}
|
|
148
169
|
const EMPTY_SET = new Set();
|
|
149
|
-
function renderTodoPhases(phases, completedTasks, options, args, theme, frame) {
|
|
170
|
+
function renderTodoPhases(phases, completedTasks, options, args, operation, theme, frame) {
|
|
150
171
|
const visiblePhases = phases.filter((phase) => phase.tasks.length > 0);
|
|
151
172
|
if (visiblePhases.length === 0)
|
|
152
173
|
return "";
|
|
153
|
-
const touched = options.expanded || visiblePhases.length === 1
|
|
174
|
+
const touched = options.expanded || visiblePhases.length === 1
|
|
175
|
+
? null
|
|
176
|
+
: computeTouchedPhases(args, operation, visiblePhases, completedTasks);
|
|
154
177
|
const completionKeysByPhase = new Map();
|
|
155
178
|
for (const transition of completedTasks) {
|
|
156
179
|
let completionKeys = completionKeysByPhase.get(transition.phase);
|
|
@@ -196,14 +219,21 @@ export function registerTodoTool(pi, accessors) {
|
|
|
196
219
|
executionMode: "sequential",
|
|
197
220
|
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
198
221
|
const previousPhases = clonePhases(accessors.getCurrentPhases());
|
|
199
|
-
const
|
|
222
|
+
const normalized = normalizeTodoParams(params, previousPhases);
|
|
223
|
+
if (normalized.error || !normalized.entry) {
|
|
224
|
+
const error = normalized.error ?? 'Missing "op". Example: {"op":"init","list":[{"phase":"Setup","items":["..."]}]}';
|
|
225
|
+
throw new Error(`${error}\n\n${formatSummary(previousPhases, [], true)}`);
|
|
226
|
+
}
|
|
227
|
+
const entry = normalized.entry;
|
|
228
|
+
const corrections = normalized.corrections;
|
|
229
|
+
const readOnly = entry.op === "view";
|
|
200
230
|
const applied = readOnly
|
|
201
231
|
? { phases: previousPhases, errors: [] }
|
|
202
|
-
: applyParams(clonePhases(previousPhases),
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const completedTasks = readOnly
|
|
206
|
-
if (!readOnly
|
|
232
|
+
: applyParams(clonePhases(previousPhases), entry, corrections);
|
|
233
|
+
if (applied.errors.length > 0)
|
|
234
|
+
throw new Error(formatSummary(previousPhases, applied.errors, readOnly));
|
|
235
|
+
const completedTasks = readOnly ? [] : getCompletionTransitions(previousPhases, applied.phases);
|
|
236
|
+
if (!readOnly) {
|
|
207
237
|
pi.appendEntry(TODO_STATE_ENTRY_TYPE, {
|
|
208
238
|
schema: "v2",
|
|
209
239
|
phases: clonePhases(applied.phases),
|
|
@@ -212,34 +242,31 @@ export function registerTodoTool(pi, accessors) {
|
|
|
212
242
|
accessors.syncWidget(ctx);
|
|
213
243
|
}
|
|
214
244
|
const details = {
|
|
215
|
-
op:
|
|
216
|
-
phases: clonePhases(
|
|
245
|
+
op: entry.op,
|
|
246
|
+
phases: clonePhases(applied.phases),
|
|
217
247
|
storage: ctx.sessionManager.getSessionFile() ? "session" : "memory",
|
|
218
248
|
};
|
|
249
|
+
if (corrections.length > 0)
|
|
250
|
+
details.corrections = corrections;
|
|
219
251
|
if (completedTasks.length > 0)
|
|
220
252
|
details.completedTasks = completedTasks;
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
isError: failed ? true : undefined,
|
|
225
|
-
};
|
|
253
|
+
const summary = formatSummary(applied.phases, [], readOnly);
|
|
254
|
+
const text = corrections.length > 0 ? `${corrections.join("\n")}\n\n${summary}` : summary;
|
|
255
|
+
return { content: [{ type: "text", text }], details };
|
|
226
256
|
},
|
|
227
257
|
renderCall(args, theme) {
|
|
228
258
|
return new Text(theme.fg("toolTitle", theme.bold(renderCallLabel(args))), 0, 0);
|
|
229
259
|
},
|
|
230
260
|
renderResult(result, options, theme, context) {
|
|
231
|
-
if (
|
|
261
|
+
if (context.isError) {
|
|
232
262
|
return new Text(theme.fg("toolOutput", getTextContent(result)), 0, 0);
|
|
233
263
|
}
|
|
234
264
|
const phases = result.details?.phases ?? [];
|
|
235
|
-
const rendered = renderTodoPhases(phases, result.details?.completedTasks ?? [], options, context.args, theme, context.spinnerFrame);
|
|
265
|
+
const rendered = renderTodoPhases(phases, result.details?.completedTasks ?? [], options, context.args, result.details?.op, theme, context.spinnerFrame);
|
|
236
266
|
const text = rendered || getTextContent(result) || "Todo list is empty.";
|
|
237
267
|
return new Text(text, 0, 0);
|
|
238
268
|
},
|
|
239
269
|
};
|
|
240
270
|
pi.registerTool(tool);
|
|
241
271
|
}
|
|
242
|
-
function isTodoToolError(result) {
|
|
243
|
-
return "isError" in result && result.isError === true;
|
|
244
|
-
}
|
|
245
272
|
//# sourceMappingURL=todo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"todo.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todo.ts"],"names":[],"mappings":"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","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { partialStrikethrough, strikeRevealCount } from \"../../../../../modes/interactive/components/todo-strike.ts\";\nimport type { Theme } from \"../../../../../modes/interactive/theme/theme.ts\";\nimport type {\n\tAgentToolResult,\n\tExtensionAPI,\n\tExtensionContext,\n\tToolDefinition,\n\tToolRenderContext,\n\tToolRenderResultOptions,\n} from \"../../../types.ts\";\nimport { TODO_TOOL_DESCRIPTION } from \"../prompt.ts\";\nimport {\n\tapplyParams,\n\tclonePhases,\n\tfindTaskByContent,\n\tformatSummary,\n\tgetCompletionTransitions,\n\tgetTodoMarker,\n\tnextActionableTask,\n\tsanitizeTodoText,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoCompletionTransition,\n\ttype TodoPhase,\n\ttype TodoStateEntry,\n\ttype TodoToolDetails,\n} from \"../state.ts\";\n\nconst TodoOperationSchema = Type.Union([\n\tType.Literal(\"init\"),\n\tType.Literal(\"start\"),\n\tType.Literal(\"done\"),\n\tType.Literal(\"rm\"),\n\tType.Literal(\"drop\"),\n\tType.Literal(\"append\"),\n\tType.Literal(\"view\"),\n]);\n\nconst TodoPhaseInputSchema = Type.Object({\n\tphase: Type.String({ description: \"Phase name\" }),\n\titems: Type.Array(Type.String({ description: \"Task content\" }), {\n\t\tdescription: \"Tasks for this phase\",\n\t\tminItems: 1,\n\t}),\n});\n\nexport const TODO_PARAMS_SCHEMA = Type.Object({\n\top: TodoOperationSchema,\n\tlist: Type.Optional(Type.Array(TodoPhaseInputSchema, { description: \"Phased task list for init\" })),\n\ttask: Type.Optional(Type.String({ description: \"Task content\" })),\n\tphase: Type.Optional(Type.String({ description: \"Phase name\" })),\n\t// Keep this unconstrained at the schema boundary. init and append return\n\t// operation-specific errors, while unrelated operations may ignore it.\n\titems: Type.Optional(Type.Array(Type.String({ description: \"Task content\" }), { description: \"Tasks to append\" })),\n});\n\ntype TodoParams = Static<typeof TODO_PARAMS_SCHEMA>;\n\ntype TodoAccessors = {\n\tgetCurrentPhases: () => TodoPhase[];\n\tsetCurrentPhases: (phases: TodoPhase[]) => void;\n\tsyncWidget: (ctx: ExtensionContext) => void;\n};\n\ntype TodoToolResult = AgentToolResult<TodoToolDetails> & {\n\tisError?: boolean;\n};\n\nfunction countInitItems(params: TodoParams): { phases: number; tasks: number } {\n\tif (params.list) {\n\t\treturn {\n\t\t\tphases: params.list.length,\n\t\t\ttasks: params.list.reduce((total, phase) => total + phase.items.length, 0),\n\t\t};\n\t}\n\tif (params.items) return { phases: params.items.length > 0 ? 1 : 0, tasks: params.items.length };\n\treturn { phases: 0, tasks: 0 };\n}\n\nfunction countLabel(count: number, singular: string): string {\n\treturn `${count} ${singular}${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction renderCallLabel(params: TodoParams): string {\n\tswitch (params.op) {\n\t\tcase \"init\": {\n\t\t\tconst counts = countInitItems(params);\n\t\t\treturn `todo init (${countLabel(counts.phases, \"phase\")}, ${countLabel(counts.tasks, \"task\")})`;\n\t\t}\n\t\tcase \"append\":\n\t\t\treturn `todo append: ${sanitizeTodoText(params.phase ?? \"\") || \"(missing phase)\"} (${countLabel(\n\t\t\t\tparams.items?.length ?? 0,\n\t\t\t\t\"item\",\n\t\t\t)})`;\n\t\tcase \"start\":\n\t\tcase \"done\":\n\t\tcase \"drop\":\n\t\t\treturn `todo ${params.op}: ${sanitizeTodoText(params.task ?? params.phase ?? \"\") || \"(missing target)\"}`;\n\t\tcase \"rm\":\n\t\t\treturn `todo rm: ${sanitizeTodoText(params.task ?? params.phase ?? \"all\") || \"all\"}`;\n\t\tcase \"view\":\n\t\t\treturn \"todo view\";\n\t}\n}\n\nexport function phaseRomanNumeral(oneBasedIndex: number): string {\n\tif (oneBasedIndex <= 0) return \"\";\n\tconst pairs: ReadonlyArray<readonly [number, string]> = [\n\t\t[1000, \"M\"],\n\t\t[900, \"CM\"],\n\t\t[500, \"D\"],\n\t\t[400, \"CD\"],\n\t\t[100, \"C\"],\n\t\t[90, \"XC\"],\n\t\t[50, \"L\"],\n\t\t[40, \"XL\"],\n\t\t[10, \"X\"],\n\t\t[9, \"IX\"],\n\t\t[5, \"V\"],\n\t\t[4, \"IV\"],\n\t\t[1, \"I\"],\n\t];\n\tlet remaining = oneBasedIndex;\n\tlet output = \"\";\n\tfor (const [value, symbol] of pairs) {\n\t\twhile (remaining >= value) {\n\t\t\toutput += symbol;\n\t\t\tremaining -= value;\n\t\t}\n\t}\n\treturn output;\n}\n\nfunction formatPhaseHeader(name: string, index: number, theme: Theme): string {\n\treturn theme.fg(\"accent\", theme.bold(`${phaseRomanNumeral(index)}. ${sanitizeTodoText(name)}`));\n}\n\nfunction formatPhaseSummary(phase: TodoPhase, index: number, theme: Theme): string {\n\tconst closed = phase.tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\treturn theme.fg(\n\t\t\"dim\",\n\t\t`${phaseRomanNumeral(index)}. ${sanitizeTodoText(phase.name)} — ${closed}/${phase.tasks.length} done`,\n\t);\n}\n\nfunction formatTaskLine(\n\ttask: TodoPhase[\"tasks\"][number],\n\ttheme: Theme,\n\tcompletionKeys: ReadonlySet<string>,\n\tframe: number | undefined,\n): string {\n\tconst content = sanitizeTodoText(task.content);\n\tconst line = `${getTodoMarker(task.status)} ${content}`;\n\tswitch (task.status) {\n\t\tcase \"completed\": {\n\t\t\tconst reveal = completionKeys.has(task.content) ? strikeRevealCount(line, frame) : undefined;\n\t\t\treturn reveal === undefined\n\t\t\t\t? theme.fg(\"dim\", theme.strikethrough(line))\n\t\t\t\t: theme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tpartialStrikethrough(line, reveal, (text) => theme.strikethrough(text)),\n\t\t\t\t\t);\n\t\t}\n\t\tcase \"in_progress\":\n\t\t\treturn theme.fg(\"accent\", theme.bold(line));\n\t\tcase \"abandoned\":\n\t\t\treturn theme.fg(\"dim\", line);\n\t\tcase \"pending\":\n\t\t\treturn line;\n\t}\n}\n\nfunction computeTouchedPhases(\n\targs: TodoParams,\n\tphases: readonly TodoPhase[],\n\tcompletedTasks: readonly TodoCompletionTransition[],\n): Set<string> | null {\n\tconst touched = new Set<string>();\n\tconst activeTask = nextActionableTask(phases);\n\tif (activeTask) {\n\t\tconst activePhase = phases.find((phase) => phase.tasks.includes(activeTask));\n\t\tif (activePhase) touched.add(activePhase.name);\n\t}\n\tfor (const transition of completedTasks) touched.add(transition.phase);\n\tif (args.op === \"init\") {\n\t\tfor (const phase of phases) touched.add(phase.name);\n\t} else {\n\t\tif (args.phase) {\n\t\t\tconst phase = phases.find((candidate) => candidate.name === args.phase);\n\t\t\tif (phase) touched.add(phase.name);\n\t\t}\n\t\tif (args.task) {\n\t\t\tconst hit = findTaskByContent([...phases], args.task);\n\t\t\tif (hit) touched.add(hit.phase.name);\n\t\t}\n\t}\n\treturn touched.size > 0 ? touched : null;\n}\n\nconst EMPTY_SET: ReadonlySet<string> = new Set();\n\nfunction renderTodoPhases(\n\tphases: readonly TodoPhase[],\n\tcompletedTasks: readonly TodoCompletionTransition[],\n\toptions: ToolRenderResultOptions,\n\targs: TodoParams,\n\ttheme: Theme,\n\tframe: number | undefined,\n): string {\n\tconst visiblePhases = phases.filter((phase) => phase.tasks.length > 0);\n\tif (visiblePhases.length === 0) return \"\";\n\n\tconst touched =\n\t\toptions.expanded || visiblePhases.length === 1 ? null : computeTouchedPhases(args, visiblePhases, completedTasks);\n\tconst completionKeysByPhase = new Map<string, Set<string>>();\n\tfor (const transition of completedTasks) {\n\t\tlet completionKeys = completionKeysByPhase.get(transition.phase);\n\t\tif (!completionKeys) {\n\t\t\tcompletionKeys = new Set();\n\t\t\tcompletionKeysByPhase.set(transition.phase, completionKeys);\n\t\t}\n\t\tcompletionKeys.add(transition.content);\n\t}\n\tconst lines: string[] = [];\n\tfor (let index = 0; index < visiblePhases.length; index += 1) {\n\t\tconst phase = visiblePhases[index];\n\t\tconst oneBasedIndex = index + 1;\n\t\tif (touched && !touched.has(phase.name)) {\n\t\t\tlines.push(formatPhaseSummary(phase, oneBasedIndex, theme));\n\t\t\tcontinue;\n\t\t}\n\t\tlines.push(formatPhaseHeader(phase.name, oneBasedIndex, theme));\n\t\tconst completionKeys = completionKeysByPhase.get(phase.name) ?? EMPTY_SET;\n\t\tfor (const task of phase.tasks) lines.push(` ${formatTaskLine(task, theme, completionKeys, frame)}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction getTextContent(result: AgentToolResult<TodoToolDetails>): string {\n\treturn result.content\n\t\t.filter(\n\t\t\t(content): content is { type: \"text\"; text: string } =>\n\t\t\t\tcontent.type === \"text\" && typeof content.text === \"string\",\n\t\t)\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\");\n}\n\nexport function registerTodoTool(pi: ExtensionAPI, accessors: TodoAccessors): void {\n\tconst tool: ToolDefinition<typeof TODO_PARAMS_SCHEMA, TodoToolDetails, unknown> = {\n\t\tname: \"todo\",\n\t\tlabel: \"Todo\",\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: \"Track phased tasks with one op-based todo tool; reference tasks by their exact content.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use one todo operation at a time; batch it with the real work rather than making a solo todo turn.\",\n\t\t\t\"Reference tasks and phases by their exact content/name; use view when the text is uncertain.\",\n\t\t\t\"Mark work done immediately and use drop for tasks that are no longer needed.\",\n\t\t],\n\t\tparameters: TODO_PARAMS_SCHEMA,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx): Promise<TodoToolResult> {\n\t\t\tconst previousPhases = clonePhases(accessors.getCurrentPhases());\n\t\t\tconst readOnly = params.op === \"view\";\n\t\t\tconst applied = readOnly\n\t\t\t\t? { phases: previousPhases, errors: [] as string[] }\n\t\t\t\t: applyParams(clonePhases(previousPhases), params);\n\t\t\tconst failed = applied.errors.length > 0;\n\t\t\tconst effective = failed ? previousPhases : applied.phases;\n\t\t\tconst completedTasks = readOnly || failed ? [] : getCompletionTransitions(previousPhases, applied.phases);\n\t\t\tif (!readOnly && !failed) {\n\t\t\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, {\n\t\t\t\t\tschema: \"v2\",\n\t\t\t\t\tphases: clonePhases(applied.phases),\n\t\t\t\t} satisfies TodoStateEntry);\n\t\t\t\taccessors.setCurrentPhases(clonePhases(applied.phases));\n\t\t\t\taccessors.syncWidget(ctx);\n\t\t\t}\n\n\t\t\tconst details: TodoToolDetails = {\n\t\t\t\top: params.op,\n\t\t\t\tphases: clonePhases(effective),\n\t\t\t\tstorage: ctx.sessionManager.getSessionFile() ? \"session\" : \"memory\",\n\t\t\t};\n\t\t\tif (completedTasks.length > 0) details.completedTasks = completedTasks;\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: formatSummary(effective, applied.errors, readOnly) }],\n\t\t\t\tdetails,\n\t\t\t\tisError: failed ? true : undefined,\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(renderCallLabel(args))), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme, context: ToolRenderContext<unknown, TodoParams>) {\n\t\t\tif (isTodoToolError(result) || context.isError) {\n\t\t\t\treturn new Text(theme.fg(\"toolOutput\", getTextContent(result)), 0, 0);\n\t\t\t}\n\t\t\tconst phases = result.details?.phases ?? [];\n\t\t\tconst rendered = renderTodoPhases(\n\t\t\t\tphases,\n\t\t\t\tresult.details?.completedTasks ?? [],\n\t\t\t\toptions,\n\t\t\t\tcontext.args,\n\t\t\t\ttheme,\n\t\t\t\tcontext.spinnerFrame,\n\t\t\t);\n\t\t\tconst text = rendered || getTextContent(result) || \"Todo list is empty.\";\n\t\t\treturn new Text(text, 0, 0);\n\t\t},\n\t};\n\n\tpi.registerTool(tool);\n}\n\nfunction isTodoToolError(result: AgentToolResult<TodoToolDetails>): result is TodoToolResult {\n\treturn \"isError\" in result && result.isError === true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"todo.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/todotools/tools/todo.ts"],"names":[],"mappings":"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","sourcesContent":["// Ported and adapted from oh-my-pi's todo tool (MIT License).\n// Copyright (c) 2025 Mario Zechner\n// Copyright (c) 2025-2026 Can Bölük\n// https://github.com/can1357/oh-my-pi\n\nimport { Text } from \"@earendil-works/pi-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { partialStrikethrough, strikeRevealCount } from \"../../../../../modes/interactive/components/todo-strike.ts\";\nimport type { Theme } from \"../../../../../modes/interactive/theme/theme.ts\";\nimport type {\n\tAgentToolResult,\n\tExtensionAPI,\n\tExtensionContext,\n\tToolDefinition,\n\tToolRenderContext,\n\tToolRenderResultOptions,\n} from \"../../../types.ts\";\nimport { normalizeTodoParams } from \"../normalize.ts\";\nimport { TODO_TOOL_DESCRIPTION } from \"../prompt.ts\";\nimport {\n\tapplyParams,\n\tclonePhases,\n\tfindTaskByContent,\n\tformatSummary,\n\tgetCompletionTransitions,\n\tgetTodoMarker,\n\tnextActionableTask,\n\tsanitizeTodoText,\n\tTODO_STATE_ENTRY_TYPE,\n\ttype TodoCompletionTransition,\n\ttype TodoOperation,\n\ttype TodoPhase,\n\ttype TodoStateEntry,\n\ttype TodoToolDetails,\n} from \"../state.ts\";\n\nconst TodoOperationSchema = Type.Union(\n\t[\n\t\tType.Literal(\"init\"),\n\t\tType.Literal(\"start\"),\n\t\tType.Literal(\"done\"),\n\t\tType.Literal(\"rm\"),\n\t\tType.Literal(\"drop\"),\n\t\tType.Literal(\"append\"),\n\t\tType.Literal(\"view\"),\n\t],\n\t{ description: \"Operation to perform. Required — always pass it explicitly.\" },\n);\n\nconst TodoPhaseInputSchema = Type.Object({\n\tphase: Type.String({ description: \"Phase name\" }),\n\titems: Type.Array(Type.String({ description: \"Task content\" }), {\n\t\tdescription: \"Tasks for this phase\",\n\t\tminItems: 1,\n\t}),\n});\n\nexport const TODO_PARAMS_SCHEMA = Type.Object({\n\top: Type.Optional(TodoOperationSchema),\n\tlist: Type.Optional(Type.Array(TodoPhaseInputSchema, { description: \"Phased task list for init\" })),\n\ttask: Type.Optional(Type.String({ description: \"Exact task text copied from the previous todo result\" })),\n\tphase: Type.Optional(Type.String({ description: \"Exact phase name copied from the previous todo result\" })),\n\t// Keep this unconstrained at the schema boundary. init and append return\n\t// operation-specific errors, while unrelated operations may ignore it.\n\titems: Type.Optional(\n\t\tType.Array(Type.String({ description: \"Task content\" }), { description: \"Task texts to append\" }),\n\t),\n});\n\ntype TodoParams = Static<typeof TODO_PARAMS_SCHEMA>;\n\ntype TodoAccessors = {\n\tgetCurrentPhases: () => TodoPhase[];\n\tsetCurrentPhases: (phases: TodoPhase[]) => void;\n\tsyncWidget: (ctx: ExtensionContext) => void;\n};\n\nfunction countInitItems(params: TodoParams): { phases: number; tasks: number } {\n\tif (params.list) {\n\t\treturn {\n\t\t\tphases: params.list.length,\n\t\t\ttasks: params.list.reduce((total, phase) => total + phase.items.length, 0),\n\t\t};\n\t}\n\tif (params.items) return { phases: params.items.length > 0 ? 1 : 0, tasks: params.items.length };\n\treturn { phases: 0, tasks: 0 };\n}\n\nfunction countLabel(count: number, singular: string): string {\n\treturn `${count} ${singular}${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction renderCallLabel(params: TodoParams): string {\n\tswitch (params.op) {\n\t\tcase \"init\": {\n\t\t\tconst counts = countInitItems(params);\n\t\t\treturn `todo init (${countLabel(counts.phases, \"phase\")}, ${countLabel(counts.tasks, \"task\")})`;\n\t\t}\n\t\tcase \"append\":\n\t\t\treturn `todo append: ${sanitizeTodoText(params.phase ?? \"\") || \"(missing phase)\"} (${countLabel(\n\t\t\t\tparams.items?.length ?? 0,\n\t\t\t\t\"item\",\n\t\t\t)})`;\n\t\tcase \"start\":\n\t\tcase \"done\":\n\t\tcase \"drop\":\n\t\t\treturn `todo ${params.op}: ${sanitizeTodoText(params.task ?? params.phase ?? \"\") || \"(missing target)\"}`;\n\t\tcase \"rm\":\n\t\t\treturn `todo rm: ${sanitizeTodoText(params.task ?? params.phase ?? \"all\") || \"all\"}`;\n\t\tcase \"view\":\n\t\t\treturn \"todo view\";\n\t\t// Normalization can rescue a call that omitted `op`; label it generically until\n\t\t// execute resolves the effective operation. Listing `undefined` explicitly (instead\n\t\t// of `default`) keeps this switch exhaustive, so a new TodoOperation fails typecheck.\n\t\tcase undefined:\n\t\t\treturn \"todo\";\n\t}\n}\n\nexport function phaseRomanNumeral(oneBasedIndex: number): string {\n\tif (oneBasedIndex <= 0) return \"\";\n\tconst pairs: ReadonlyArray<readonly [number, string]> = [\n\t\t[1000, \"M\"],\n\t\t[900, \"CM\"],\n\t\t[500, \"D\"],\n\t\t[400, \"CD\"],\n\t\t[100, \"C\"],\n\t\t[90, \"XC\"],\n\t\t[50, \"L\"],\n\t\t[40, \"XL\"],\n\t\t[10, \"X\"],\n\t\t[9, \"IX\"],\n\t\t[5, \"V\"],\n\t\t[4, \"IV\"],\n\t\t[1, \"I\"],\n\t];\n\tlet remaining = oneBasedIndex;\n\tlet output = \"\";\n\tfor (const [value, symbol] of pairs) {\n\t\twhile (remaining >= value) {\n\t\t\toutput += symbol;\n\t\t\tremaining -= value;\n\t\t}\n\t}\n\treturn output;\n}\n\nfunction formatPhaseHeader(name: string, index: number, theme: Theme): string {\n\treturn theme.fg(\"accent\", theme.bold(`${phaseRomanNumeral(index)}. ${sanitizeTodoText(name)}`));\n}\n\nfunction formatPhaseSummary(phase: TodoPhase, index: number, theme: Theme): string {\n\tconst closed = phase.tasks.filter((task) => task.status === \"completed\" || task.status === \"abandoned\").length;\n\treturn theme.fg(\n\t\t\"dim\",\n\t\t`${phaseRomanNumeral(index)}. ${sanitizeTodoText(phase.name)} — ${closed}/${phase.tasks.length} done`,\n\t);\n}\n\nfunction formatTaskLine(\n\ttask: TodoPhase[\"tasks\"][number],\n\ttheme: Theme,\n\tcompletionKeys: ReadonlySet<string>,\n\tframe: number | undefined,\n): string {\n\tconst content = sanitizeTodoText(task.content);\n\tconst line = `${getTodoMarker(task.status)} ${content}`;\n\tswitch (task.status) {\n\t\tcase \"completed\": {\n\t\t\tconst reveal = completionKeys.has(task.content) ? strikeRevealCount(line, frame) : undefined;\n\t\t\treturn reveal === undefined\n\t\t\t\t? theme.fg(\"dim\", theme.strikethrough(line))\n\t\t\t\t: theme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tpartialStrikethrough(line, reveal, (text) => theme.strikethrough(text)),\n\t\t\t\t\t);\n\t\t}\n\t\tcase \"in_progress\":\n\t\t\treturn theme.fg(\"accent\", theme.bold(line));\n\t\tcase \"abandoned\":\n\t\t\treturn theme.fg(\"dim\", line);\n\t\tcase \"pending\":\n\t\t\treturn line;\n\t}\n}\n\nfunction computeTouchedPhases(\n\targs: TodoParams,\n\toperation: TodoOperation | undefined,\n\tphases: readonly TodoPhase[],\n\tcompletedTasks: readonly TodoCompletionTransition[],\n): Set<string> | null {\n\tconst touched = new Set<string>();\n\tconst activeTask = nextActionableTask(phases);\n\tif (activeTask) {\n\t\tconst activePhase = phases.find((phase) => phase.tasks.includes(activeTask));\n\t\tif (activePhase) touched.add(activePhase.name);\n\t}\n\tfor (const transition of completedTasks) touched.add(transition.phase);\n\t// Exhaustive over TodoOperation | undefined so adding an operation is a typecheck\n\t// failure here rather than a silent fall-through into target-scoped highlighting.\n\tswitch (operation) {\n\t\tcase \"init\":\n\t\t\tfor (const phase of phases) touched.add(phase.name);\n\t\t\tbreak;\n\t\tcase \"start\":\n\t\tcase \"done\":\n\t\tcase \"drop\":\n\t\tcase \"rm\":\n\t\tcase \"append\":\n\t\tcase \"view\":\n\t\tcase undefined: {\n\t\t\tif (args.phase) {\n\t\t\t\tconst phase = phases.find((candidate) => candidate.name === args.phase);\n\t\t\t\tif (phase) touched.add(phase.name);\n\t\t\t}\n\t\t\tif (args.task) {\n\t\t\t\tconst hit = findTaskByContent([...phases], args.task);\n\t\t\t\tif (hit) touched.add(hit.phase.name);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tconst _exhaustive: never = operation;\n\t\t\treturn touched.size > 0 ? touched : null;\n\t\t}\n\t}\n\treturn touched.size > 0 ? touched : null;\n}\n\nconst EMPTY_SET: ReadonlySet<string> = new Set();\n\nfunction renderTodoPhases(\n\tphases: readonly TodoPhase[],\n\tcompletedTasks: readonly TodoCompletionTransition[],\n\toptions: ToolRenderResultOptions,\n\targs: TodoParams,\n\toperation: TodoOperation | undefined,\n\ttheme: Theme,\n\tframe: number | undefined,\n): string {\n\tconst visiblePhases = phases.filter((phase) => phase.tasks.length > 0);\n\tif (visiblePhases.length === 0) return \"\";\n\n\tconst touched =\n\t\toptions.expanded || visiblePhases.length === 1\n\t\t\t? null\n\t\t\t: computeTouchedPhases(args, operation, visiblePhases, completedTasks);\n\tconst completionKeysByPhase = new Map<string, Set<string>>();\n\tfor (const transition of completedTasks) {\n\t\tlet completionKeys = completionKeysByPhase.get(transition.phase);\n\t\tif (!completionKeys) {\n\t\t\tcompletionKeys = new Set();\n\t\t\tcompletionKeysByPhase.set(transition.phase, completionKeys);\n\t\t}\n\t\tcompletionKeys.add(transition.content);\n\t}\n\tconst lines: string[] = [];\n\tfor (let index = 0; index < visiblePhases.length; index += 1) {\n\t\tconst phase = visiblePhases[index];\n\t\tconst oneBasedIndex = index + 1;\n\t\tif (touched && !touched.has(phase.name)) {\n\t\t\tlines.push(formatPhaseSummary(phase, oneBasedIndex, theme));\n\t\t\tcontinue;\n\t\t}\n\t\tlines.push(formatPhaseHeader(phase.name, oneBasedIndex, theme));\n\t\tconst completionKeys = completionKeysByPhase.get(phase.name) ?? EMPTY_SET;\n\t\tfor (const task of phase.tasks) lines.push(` ${formatTaskLine(task, theme, completionKeys, frame)}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction getTextContent(result: AgentToolResult<TodoToolDetails>): string {\n\treturn result.content\n\t\t.filter(\n\t\t\t(content): content is { type: \"text\"; text: string } =>\n\t\t\t\tcontent.type === \"text\" && typeof content.text === \"string\",\n\t\t)\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\");\n}\n\nexport function registerTodoTool(pi: ExtensionAPI, accessors: TodoAccessors): void {\n\tconst tool: ToolDefinition<typeof TODO_PARAMS_SCHEMA, TodoToolDetails, unknown> = {\n\t\tname: \"todo\",\n\t\tlabel: \"Todo\",\n\t\tdescription: TODO_TOOL_DESCRIPTION,\n\t\tpromptSnippet: \"Track phased tasks with one op-based todo tool; reference tasks by their exact content.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use one todo operation at a time; batch it with the real work rather than making a solo todo turn.\",\n\t\t\t\"Reference tasks and phases by their exact content/name; use view when the text is uncertain.\",\n\t\t\t\"Mark work done immediately and use drop for tasks that are no longer needed.\",\n\t\t],\n\t\tparameters: TODO_PARAMS_SCHEMA,\n\t\texecutionMode: \"sequential\",\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx): Promise<AgentToolResult<TodoToolDetails>> {\n\t\t\tconst previousPhases = clonePhases(accessors.getCurrentPhases());\n\t\t\tconst normalized = normalizeTodoParams(params as Record<string, unknown>, previousPhases);\n\t\t\tif (normalized.error || !normalized.entry) {\n\t\t\t\tconst error =\n\t\t\t\t\tnormalized.error ?? 'Missing \"op\". Example: {\"op\":\"init\",\"list\":[{\"phase\":\"Setup\",\"items\":[\"...\"]}]}';\n\t\t\t\tthrow new Error(`${error}\\n\\n${formatSummary(previousPhases, [], true)}`);\n\t\t\t}\n\t\t\tconst entry = normalized.entry;\n\t\t\tconst corrections = normalized.corrections;\n\t\t\tconst readOnly = entry.op === \"view\";\n\t\t\tconst applied = readOnly\n\t\t\t\t? { phases: previousPhases, errors: [] as string[] }\n\t\t\t\t: applyParams(clonePhases(previousPhases), entry, corrections);\n\t\t\tif (applied.errors.length > 0) throw new Error(formatSummary(previousPhases, applied.errors, readOnly));\n\t\t\tconst completedTasks = readOnly ? [] : getCompletionTransitions(previousPhases, applied.phases);\n\t\t\tif (!readOnly) {\n\t\t\t\tpi.appendEntry(TODO_STATE_ENTRY_TYPE, {\n\t\t\t\t\tschema: \"v2\",\n\t\t\t\t\tphases: clonePhases(applied.phases),\n\t\t\t\t} satisfies TodoStateEntry);\n\t\t\t\taccessors.setCurrentPhases(clonePhases(applied.phases));\n\t\t\t\taccessors.syncWidget(ctx);\n\t\t\t}\n\n\t\t\tconst details: TodoToolDetails = {\n\t\t\t\top: entry.op,\n\t\t\t\tphases: clonePhases(applied.phases),\n\t\t\t\tstorage: ctx.sessionManager.getSessionFile() ? \"session\" : \"memory\",\n\t\t\t};\n\t\t\tif (corrections.length > 0) details.corrections = corrections;\n\t\t\tif (completedTasks.length > 0) details.completedTasks = completedTasks;\n\t\t\tconst summary = formatSummary(applied.phases, [], readOnly);\n\t\t\tconst text = corrections.length > 0 ? `${corrections.join(\"\\n\")}\\n\\n${summary}` : summary;\n\n\t\t\treturn { content: [{ type: \"text\", text }], details };\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(renderCallLabel(args))), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme, context: ToolRenderContext<unknown, TodoParams>) {\n\t\t\tif (context.isError) {\n\t\t\t\treturn new Text(theme.fg(\"toolOutput\", getTextContent(result)), 0, 0);\n\t\t\t}\n\t\t\tconst phases = result.details?.phases ?? [];\n\t\t\tconst rendered = renderTodoPhases(\n\t\t\t\tphases,\n\t\t\t\tresult.details?.completedTasks ?? [],\n\t\t\t\toptions,\n\t\t\t\tcontext.args,\n\t\t\t\tresult.details?.op,\n\t\t\t\ttheme,\n\t\t\t\tcontext.spinnerFrame,\n\t\t\t);\n\t\t\tconst text = rendered || getTextContent(result) || \"Todo list is empty.\";\n\t\t\treturn new Text(text, 0, 0);\n\t\t},\n\t};\n\n\tpi.registerTool(tool);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/websearch/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/websearch/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AA2BrE,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CA2E/C"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isAnthropicWebSearchEnabled, supportsNativeAnthropicWebSearch } from "../anthropic-web-search/index.js";
|
|
2
2
|
import { isOpenaiWebSearchEnabled, supportsNativeOpenAiWebSearch } from "../openai-web-search/index.js";
|
|
3
3
|
import { loadWebsearchConfig } from "./websearch/config.js";
|
|
4
|
+
import { providerEntryLabel } from "./websearch/search.js";
|
|
4
5
|
import { createWebSearchTool } from "./websearch/tool.js";
|
|
5
6
|
const STATUS_KEY = "pi-websearch";
|
|
6
7
|
const WIDGET_KEY = "pi-websearch";
|
|
@@ -23,11 +24,8 @@ export default function (pi) {
|
|
|
23
24
|
reason: "missing_config",
|
|
24
25
|
message: "Missing websearch config. Create .pi/websearch.json or ~/.pi/websearch.json before starting pi.",
|
|
25
26
|
};
|
|
26
|
-
function providerLabel(provider) {
|
|
27
|
-
return provider.id ? `${provider.id}/${provider.provider}` : provider.provider;
|
|
28
|
-
}
|
|
29
27
|
function providerList(config) {
|
|
30
|
-
return config.providers.map(
|
|
28
|
+
return config.providers.map(providerEntryLabel).join(", ");
|
|
31
29
|
}
|
|
32
30
|
function clearUi(ctx) {
|
|
33
31
|
if (ctx.hasUI === false)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/websearch/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,gCAAgC,EAAE,MAAM,kCAAkC,CAAC;AACjH,OAAO,EAAE,wBAAwB,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAExG,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,UAAU,GAAG,cAAc,CAAC;AAClC,MAAM,UAAU,GAAG,cAAc,CAAC;AAClC,MAAM,qBAAqB,GAAG,2EAA2E,CAAC;AAK1G,4EAA4E;AAC5E,6EAA6E;AAC7E,+EAA+E;AAC/E,gFAAgF;AAChF,6EAA6E;AAC7E,SAAS,sBAAsB,CAAC,KAAyB;IACxD,IAAI,gCAAgC,CAAC,KAAK,CAAC;QAAE,OAAO,2BAA2B,EAAE,CAAC;IAClF,IAAI,6BAA6B,CAAC,KAAK,CAAC;QAAE,OAAO,wBAAwB,EAAE,CAAC;IAC5E,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,CAAC,OAAO,WAAW,EAAgB;IACxC,IAAI,KAAK,GAAqB;QAC7B,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,iGAAiG;KAC1G,CAAC;IAEF,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/websearch/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { isAnthropicWebSearchEnabled, supportsNativeAnthropicWebSearch } from \"../anthropic-web-search/index.ts\";\nimport { isOpenaiWebSearchEnabled, supportsNativeOpenAiWebSearch } from \"../openai-web-search/index.ts\";\n\nimport { loadWebsearchConfig } from \"./websearch/config.ts\";\nimport { providerEntryLabel } from \"./websearch/search.ts\";\nimport { createWebSearchTool } from \"./websearch/tool.ts\";\nimport type { ConfigLoadResult, WebsearchConfig } from \"./websearch/types.ts\";\n\nconst STATUS_KEY = \"pi-websearch\";\nconst WIDGET_KEY = \"pi-websearch\";\nconst NATIVE_BYPASS_MESSAGE = \"Native provider web search is handled by the built-in provider extension.\";\n\ntype NativeCapableModel = Parameters<typeof supportsNativeAnthropicWebSearch>[0] &\n\tParameters<typeof supportsNativeOpenAiWebSearch>[0];\n\n// Defer to the provider-native server-side web_search only when the builtin\n// injecting extension will actually add it for this exact model (first-party\n// endpoint or explicit compat opt-in, and not disabled via env). A provider id\n// of \"anthropic\"/\"openai\" alone is not enough: proxied baseUrls (ccapi, quotio,\n// …) never receive the native tool, so bypassing there leaves no web search.\nfunction isProviderNativeBypass(model: NativeCapableModel): boolean {\n\tif (supportsNativeAnthropicWebSearch(model)) return isAnthropicWebSearchEnabled();\n\tif (supportsNativeOpenAiWebSearch(model)) return isOpenaiWebSearchEnabled();\n\treturn false;\n}\n\nexport default function (pi: ExtensionAPI): void {\n\tlet state: ConfigLoadResult = {\n\t\tok: false,\n\t\treason: \"missing_config\",\n\t\tmessage: \"Missing websearch config. Create .pi/websearch.json or ~/.pi/websearch.json before starting pi.\",\n\t};\n\n\tfunction providerList(config: WebsearchConfig): string {\n\t\treturn config.providers.map(providerEntryLabel).join(\", \");\n\t}\n\n\tfunction clearUi(ctx: ExtensionContext): void {\n\t\tif (ctx.hasUI === false) return;\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\tctx.ui.setWidget(WIDGET_KEY, undefined);\n\t}\n\n\tfunction updateUi(ctx: ExtensionContext): void {\n\t\tif (ctx.hasUI === false) return;\n\t\tif (state.ok) {\n\t\t\tclearUi(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (state.reason === \"provider_native_bypass\") {\n\t\t\tclearUi(ctx);\n\t\t\treturn;\n\t\t}\n\t\tclearUi(ctx);\n\t\tctx.ui.notify(state.message, \"error\");\n\t}\n\n\tpi.registerTool(createWebSearchTool(() => state));\n\n\tasync function refreshState(model: NativeCapableModel, ctx: ExtensionContext): Promise<void> {\n\t\tstate = isProviderNativeBypass(model)\n\t\t\t? { ok: false, reason: \"provider_native_bypass\", message: NATIVE_BYPASS_MESSAGE }\n\t\t\t: await loadWebsearchConfig({ cwd: ctx.cwd });\n\t\tupdateUi(ctx);\n\t}\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tawait refreshState(ctx.model, ctx);\n\t});\n\n\tpi.on(\"model_select\", async (event, ctx) => {\n\t\tawait refreshState(event.model, ctx);\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tclearUi(ctx);\n\t});\n\n\tpi.registerCommand(\"websearch\", {\n\t\tdescription: \"Show web search provider status\",\n\t\thandler: async (rawArgs, ctx) => {\n\t\t\tconst args = rawArgs.trim();\n\t\t\tif (args !== \"\" && args !== \"status\") {\n\t\t\t\tctx.ui.notify(\"Usage: /websearch status\", \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (state.ok) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Web search active: strategy=${state.config.strategy}, auto=${state.config.auto ? \"enabled\" : \"disabled\"}, providers=${providerList(state.config)}`,\n\t\t\t\t\t\"info\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tctx.ui.notify(\n\t\t\t\tstate.reason === \"provider_native_bypass\"\n\t\t\t\t\t? `Web search deferred: ${state.message}`\n\t\t\t\t\t: `Web search inactive: ${state.message}`,\n\t\t\t\tstate.reason === \"provider_native_bypass\" ? \"info\" : \"error\",\n\t\t\t);\n\t\t},\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/config.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEX,gBAAgB,EAGhB,wBAAwB,EAKxB,mBAAmB,EAEnB,eAAe,EACf,MAAM,YAAY,CAAC;AA2BpB,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAgID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,wBAAwB,CAmD5F;AAED,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,eAAe,GACrB,wBAAwB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAiBlE;AAWD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0B/F"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { access, readFile } from "node:fs/promises";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
+
import { CONFIG_DIR_NAME } from "../../../../../config.js";
|
|
4
5
|
import { isAllowedProviderBaseUrl } from "./provider-endpoints.js";
|
|
5
6
|
const PROVIDERS = [
|
|
6
7
|
"exa",
|
|
@@ -226,10 +227,12 @@ async function fileExists(path) {
|
|
|
226
227
|
export async function loadWebsearchConfig(options) {
|
|
227
228
|
const home = options.homeDir ?? homedir();
|
|
228
229
|
const paths = [
|
|
230
|
+
join(options.cwd, CONFIG_DIR_NAME, "websearch.json"),
|
|
229
231
|
join(options.cwd, ".pi", "websearch.json"),
|
|
230
232
|
join(home, "websearch.json"),
|
|
233
|
+
join(home, CONFIG_DIR_NAME, "websearch.json"),
|
|
231
234
|
join(home, ".pi", "websearch.json"),
|
|
232
|
-
];
|
|
235
|
+
].filter((path, index, all) => all.indexOf(path) === index);
|
|
233
236
|
for (const path of paths) {
|
|
234
237
|
if (!(await fileExists(path)))
|
|
235
238
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { access, readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { isAllowedProviderBaseUrl } from \"./provider-endpoints.ts\";\nimport type {\n\tCodexSearchMode,\n\tConfigLoadResult,\n\tJsonObject,\n\tJsonValue,\n\tProviderValidationResult,\n\tRoutingStrategy,\n\tSearchContextSize,\n\tSearchProvider,\n\tSearchProviderConfig,\n\tSearchProviderEntry,\n\tSearchUserLocation,\n\tWebsearchConfig,\n} from \"./types.ts\";\n\nconst PROVIDERS: readonly SearchProvider[] = [\n\t\"exa\",\n\t\"tavily\",\n\t\"brave\",\n\t\"duckduckgo-html\",\n\t\"serper\",\n\t\"google-cse\",\n\t\"z-ai\",\n\t\"openai\",\n\t\"codex\",\n\t\"anthropic\",\n\t\"perplexity\",\n\t\"xai\",\n\t\"kimi\",\n];\nconst CONTEXT_SIZES: readonly SearchContextSize[] = [\"low\", \"medium\", \"high\"];\nconst CODEX_MODES: readonly CodexSearchMode[] = [\"cached\", \"live\"];\nconst STRATEGIES: readonly RoutingStrategy[] = [\"priority\", \"round-robin\", \"fill-first\"];\nconst DEFAULT_FREE_CONFIG: WebsearchConfig = {\n\tstrategy: \"priority\",\n\tfallback: true,\n\tauto: true,\n\tproviders: [{ id: \"default\", provider: \"duckduckgo-html\", maxResults: 10 }],\n};\n\nexport interface ConfigLoadOptions {\n\tcwd: string;\n\thomeDir?: string;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction oneOf<TValue extends string>(values: readonly TValue[], value: unknown): value is TValue {\n\treturn typeof value === \"string\" && (values as readonly string[]).includes(value);\n}\n\nfunction isStringArray(value: JsonValue | undefined): value is string[] {\n\treturn Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction optionalString(value: JsonValue | undefined): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction optionalNumber(value: JsonValue | undefined): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction optionalBoolean(value: JsonValue | undefined): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction optionalProvider(value: JsonValue | undefined): SearchProvider | undefined {\n\treturn oneOf(PROVIDERS, value) ? value : undefined;\n}\n\nfunction optionalContextSize(value: JsonValue | undefined): SearchContextSize | undefined {\n\treturn oneOf(CONTEXT_SIZES, value) ? value : undefined;\n}\n\nfunction optionalCodexMode(value: JsonValue | undefined): CodexSearchMode | undefined {\n\treturn oneOf(CODEX_MODES, value) ? value : undefined;\n}\n\nfunction optionalStrategy(value: JsonValue | undefined): RoutingStrategy | undefined {\n\treturn oneOf(STRATEGIES, value) ? value : undefined;\n}\n\nfunction optionalLocation(value: JsonValue | undefined): SearchUserLocation | undefined {\n\tif (!isJsonObject(value)) return undefined;\n\tconst location: SearchUserLocation = {};\n\tconst country = optionalString(value.country);\n\tconst region = optionalString(value.region);\n\tconst city = optionalString(value.city);\n\tconst timezone = optionalString(value.timezone);\n\tif (country) location.country = country;\n\tif (region) location.region = region;\n\tif (city) location.city = city;\n\tif (timezone) location.timezone = timezone;\n\treturn Object.keys(location).length > 0 ? location : undefined;\n}\n\nfunction parseJsonObject(content: string): JsonObject | null {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n\treturn isJsonObject(parsed) ? parsed : null;\n}\n\nfunction providerEntryFromObject(raw: JsonObject): SearchProviderEntry | null {\n\tconst provider = optionalProvider(raw.provider) ?? optionalProvider(raw.backend);\n\tif (!provider) return null;\n\n\tconst config: SearchProviderEntry = { provider };\n\tconst id = optionalString(raw.id);\n\tconst apiKey = optionalString(raw.apiKey);\n\tconst baseUrl = optionalString(raw.baseUrl);\n\tconst searchEngineId = optionalString(raw.searchEngineId);\n\tconst maxResults = optionalNumber(raw.maxResults);\n\tconst model = optionalString(raw.model);\n\tconst codexMode = optionalCodexMode(raw.codexMode);\n\tconst searchContextSize = optionalContextSize(raw.searchContextSize);\n\tconst rawAllowedDomains = raw.allowedDomains;\n\tconst rawBlockedDomains = raw.blockedDomains;\n\tconst allowedDomains = isStringArray(rawAllowedDomains) ? rawAllowedDomains : undefined;\n\tconst blockedDomains = isStringArray(rawBlockedDomains) ? rawBlockedDomains : undefined;\n\tconst userLocation = optionalLocation(raw.userLocation);\n\tconst timeoutMs = optionalNumber(raw.timeoutMs);\n\tconst priority = optionalNumber(raw.priority);\n\tconst weight = optionalNumber(raw.weight);\n\n\tif (id) config.id = id;\n\tif (apiKey) config.apiKey = apiKey;\n\tif (baseUrl) config.baseUrl = baseUrl;\n\tif (searchEngineId) config.searchEngineId = searchEngineId;\n\tif (maxResults) config.maxResults = maxResults;\n\tif (model) config.model = model;\n\tif (codexMode) config.codexMode = codexMode;\n\tif (searchContextSize) config.searchContextSize = searchContextSize;\n\tif (allowedDomains) config.allowedDomains = allowedDomains;\n\tif (blockedDomains) config.blockedDomains = blockedDomains;\n\tif (userLocation) config.userLocation = userLocation;\n\tif (timeoutMs !== undefined) config.timeoutMs = timeoutMs;\n\tif (priority !== undefined) config.priority = priority;\n\tif (weight !== undefined) config.weight = weight;\n\n\treturn config;\n}\n\nfunction configFromObject(raw: JsonObject): WebsearchConfig | null {\n\tconst auto = optionalBoolean(raw.auto) ?? true;\n\tconst providersValue = raw.providers;\n\tconst rawProviders = Array.isArray(providersValue) ? providersValue : undefined;\n\tif (rawProviders) {\n\t\tif (optionalProvider(raw.provider)) return null;\n\t\tconst providers = rawProviders\n\t\t\t.map((value) => (isJsonObject(value) ? providerEntryFromObject(value) : null))\n\t\t\t.filter((entry): entry is SearchProviderEntry => entry !== null);\n\t\tconst strategy = optionalStrategy(raw.strategy) ?? \"priority\";\n\t\tconst fallback = optionalBoolean(raw.fallback) ?? true;\n\t\treturn { strategy, fallback, auto, providers };\n\t}\n\n\tconst provider = providerEntryFromObject(raw);\n\treturn provider ? { strategy: \"priority\", fallback: true, auto, providers: [provider] } : null;\n}\n\nfunction hasApiKey(config: SearchProviderConfig): boolean {\n\treturn typeof config.apiKey === \"string\" && config.apiKey.length > 0;\n}\n\nexport function validateProviderConfig(config: SearchProviderEntry): ProviderValidationResult {\n\tif (!PROVIDERS.includes(config.provider)) {\n\t\treturn { ok: false, reason: \"invalid_config\", message: `Unsupported provider: ${config.provider}` };\n\t}\n\n\tif (config.allowedDomains && config.blockedDomains) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"invalid_config\",\n\t\t\tmessage: \"Provider config cannot specify both allowedDomains and blockedDomains.\",\n\t\t};\n\t}\n\n\tif (config.weight !== undefined && config.weight <= 0) {\n\t\treturn { ok: false, reason: \"invalid_config\", message: \"Provider weight must be greater than 0.\" };\n\t}\n\n\tif (config.timeoutMs !== undefined && config.timeoutMs <= 0) {\n\t\treturn { ok: false, reason: \"invalid_config\", message: \"Provider timeoutMs must be greater than 0.\" };\n\t}\n\n\tif (config.baseUrl && !isAllowedProviderBaseUrl(config.baseUrl)) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"invalid_config\",\n\t\t\tmessage: `Provider ${config.provider} baseUrl must be a public HTTPS URL without credentials.`,\n\t\t};\n\t}\n\n\tif (config.provider === \"google-cse\" && !config.searchEngineId) {\n\t\treturn { ok: false, reason: \"missing_api_key\", message: \"Provider google-cse requires searchEngineId.\" };\n\t}\n\n\tif ((config.provider === \"codex\" || config.provider === \"openai\") && !hasApiKey(config)) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"missing_api_key\",\n\t\t\tmessage: `Provider ${config.provider} requires apiKey for hosted Responses API search.`,\n\t\t};\n\t}\n\n\tif (\n\t\tconfig.provider !== \"codex\" &&\n\t\tconfig.provider !== \"openai\" &&\n\t\tconfig.provider !== \"duckduckgo-html\" &&\n\t\t!hasApiKey(config)\n\t) {\n\t\treturn { ok: false, reason: \"missing_api_key\", message: `Provider ${config.provider} requires apiKey.` };\n\t}\n\n\treturn { ok: true, config };\n}\n\nexport function validateWebsearchConfig(\n\tconfig: WebsearchConfig,\n): ProviderValidationResult | { ok: true; config: WebsearchConfig } {\n\tif (!STRATEGIES.includes(config.strategy)) {\n\t\treturn { ok: false, reason: \"invalid_config\", message: `Unsupported routing strategy: ${config.strategy}` };\n\t}\n\tif (typeof config.auto !== \"boolean\") {\n\t\treturn { ok: false, reason: \"invalid_config\", message: \"Websearch config auto must be a boolean.\" };\n\t}\n\tif (config.providers.length === 0) {\n\t\treturn { ok: false, reason: \"invalid_config\", message: \"Websearch config requires at least one provider.\" };\n\t}\n\n\tfor (const provider of config.providers) {\n\t\tconst validation = validateProviderConfig(provider);\n\t\tif (!validation.ok) return validation;\n\t}\n\n\treturn { ok: true, config };\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport async function loadWebsearchConfig(options: ConfigLoadOptions): Promise<ConfigLoadResult> {\n\tconst home = options.homeDir ?? homedir();\n\tconst paths = [\n\t\tjoin(options.cwd, \".pi\", \"websearch.json\"),\n\t\tjoin(home, \"websearch.json\"),\n\t\tjoin(home, \".pi\", \"websearch.json\"),\n\t];\n\n\tfor (const path of paths) {\n\t\tif (!(await fileExists(path))) continue;\n\t\tconst raw = parseJsonObject(await readFile(path, \"utf8\"));\n\t\tif (!raw) {\n\t\t\treturn { ok: false, reason: \"invalid_config\", message: `Invalid JSON object in ${path}`, source: path };\n\t\t}\n\t\tconst config = configFromObject(raw);\n\t\tif (!config) {\n\t\t\treturn { ok: false, reason: \"invalid_config\", message: `Invalid provider config in ${path}`, source: path };\n\t\t}\n\t\tconst validation = validateWebsearchConfig(config);\n\t\tif (!validation.ok) return { ...validation, source: path };\n\t\treturn { ok: true, config, source: path };\n\t}\n\n\treturn { ok: true, config: DEFAULT_FREE_CONFIG, source: \"default:duckduckgo-html\" };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { access, readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { CONFIG_DIR_NAME } from \"../../../../../config.ts\";\nimport { isAllowedProviderBaseUrl } from \"./provider-endpoints.ts\";\nimport type {\n\tCodexSearchMode,\n\tConfigLoadResult,\n\tJsonObject,\n\tJsonValue,\n\tProviderValidationResult,\n\tRoutingStrategy,\n\tSearchContextSize,\n\tSearchProvider,\n\tSearchProviderConfig,\n\tSearchProviderEntry,\n\tSearchUserLocation,\n\tWebsearchConfig,\n} from \"./types.ts\";\n\nconst PROVIDERS: readonly SearchProvider[] = [\n\t\"exa\",\n\t\"tavily\",\n\t\"brave\",\n\t\"duckduckgo-html\",\n\t\"serper\",\n\t\"google-cse\",\n\t\"z-ai\",\n\t\"openai\",\n\t\"codex\",\n\t\"anthropic\",\n\t\"perplexity\",\n\t\"xai\",\n\t\"kimi\",\n];\nconst CONTEXT_SIZES: readonly SearchContextSize[] = [\"low\", \"medium\", \"high\"];\nconst CODEX_MODES: readonly CodexSearchMode[] = [\"cached\", \"live\"];\nconst STRATEGIES: readonly RoutingStrategy[] = [\"priority\", \"round-robin\", \"fill-first\"];\nconst DEFAULT_FREE_CONFIG: WebsearchConfig = {\n\tstrategy: \"priority\",\n\tfallback: true,\n\tauto: true,\n\tproviders: [{ id: \"default\", provider: \"duckduckgo-html\", maxResults: 10 }],\n};\n\nexport interface ConfigLoadOptions {\n\tcwd: string;\n\thomeDir?: string;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction oneOf<TValue extends string>(values: readonly TValue[], value: unknown): value is TValue {\n\treturn typeof value === \"string\" && (values as readonly string[]).includes(value);\n}\n\nfunction isStringArray(value: JsonValue | undefined): value is string[] {\n\treturn Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction optionalString(value: JsonValue | undefined): string | undefined {\n\treturn typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction optionalNumber(value: JsonValue | undefined): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction optionalBoolean(value: JsonValue | undefined): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction optionalProvider(value: JsonValue | undefined): SearchProvider | undefined {\n\treturn oneOf(PROVIDERS, value) ? value : undefined;\n}\n\nfunction optionalContextSize(value: JsonValue | undefined): SearchContextSize | undefined {\n\treturn oneOf(CONTEXT_SIZES, value) ? value : undefined;\n}\n\nfunction optionalCodexMode(value: JsonValue | undefined): CodexSearchMode | undefined {\n\treturn oneOf(CODEX_MODES, value) ? value : undefined;\n}\n\nfunction optionalStrategy(value: JsonValue | undefined): RoutingStrategy | undefined {\n\treturn oneOf(STRATEGIES, value) ? value : undefined;\n}\n\nfunction optionalLocation(value: JsonValue | undefined): SearchUserLocation | undefined {\n\tif (!isJsonObject(value)) return undefined;\n\tconst location: SearchUserLocation = {};\n\tconst country = optionalString(value.country);\n\tconst region = optionalString(value.region);\n\tconst city = optionalString(value.city);\n\tconst timezone = optionalString(value.timezone);\n\tif (country) location.country = country;\n\tif (region) location.region = region;\n\tif (city) location.city = city;\n\tif (timezone) location.timezone = timezone;\n\treturn Object.keys(location).length > 0 ? location : undefined;\n}\n\nfunction parseJsonObject(content: string): JsonObject | null {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n\treturn isJsonObject(parsed) ? parsed : null;\n}\n\nfunction providerEntryFromObject(raw: JsonObject): SearchProviderEntry | null {\n\tconst provider = optionalProvider(raw.provider) ?? optionalProvider(raw.backend);\n\tif (!provider) return null;\n\n\tconst config: SearchProviderEntry = { provider };\n\tconst id = optionalString(raw.id);\n\tconst apiKey = optionalString(raw.apiKey);\n\tconst baseUrl = optionalString(raw.baseUrl);\n\tconst searchEngineId = optionalString(raw.searchEngineId);\n\tconst maxResults = optionalNumber(raw.maxResults);\n\tconst model = optionalString(raw.model);\n\tconst codexMode = optionalCodexMode(raw.codexMode);\n\tconst searchContextSize = optionalContextSize(raw.searchContextSize);\n\tconst rawAllowedDomains = raw.allowedDomains;\n\tconst rawBlockedDomains = raw.blockedDomains;\n\tconst allowedDomains = isStringArray(rawAllowedDomains) ? rawAllowedDomains : undefined;\n\tconst blockedDomains = isStringArray(rawBlockedDomains) ? rawBlockedDomains : undefined;\n\tconst userLocation = optionalLocation(raw.userLocation);\n\tconst timeoutMs = optionalNumber(raw.timeoutMs);\n\tconst priority = optionalNumber(raw.priority);\n\tconst weight = optionalNumber(raw.weight);\n\n\tif (id) config.id = id;\n\tif (apiKey) config.apiKey = apiKey;\n\tif (baseUrl) config.baseUrl = baseUrl;\n\tif (searchEngineId) config.searchEngineId = searchEngineId;\n\tif (maxResults) config.maxResults = maxResults;\n\tif (model) config.model = model;\n\tif (codexMode) config.codexMode = codexMode;\n\tif (searchContextSize) config.searchContextSize = searchContextSize;\n\tif (allowedDomains) config.allowedDomains = allowedDomains;\n\tif (blockedDomains) config.blockedDomains = blockedDomains;\n\tif (userLocation) config.userLocation = userLocation;\n\tif (timeoutMs !== undefined) config.timeoutMs = timeoutMs;\n\tif (priority !== undefined) config.priority = priority;\n\tif (weight !== undefined) config.weight = weight;\n\n\treturn config;\n}\n\nfunction configFromObject(raw: JsonObject): WebsearchConfig | null {\n\tconst auto = optionalBoolean(raw.auto) ?? true;\n\tconst providersValue = raw.providers;\n\tconst rawProviders = Array.isArray(providersValue) ? providersValue : undefined;\n\tif (rawProviders) {\n\t\tif (optionalProvider(raw.provider)) return null;\n\t\tconst providers = rawProviders\n\t\t\t.map((value) => (isJsonObject(value) ? providerEntryFromObject(value) : null))\n\t\t\t.filter((entry): entry is SearchProviderEntry => entry !== null);\n\t\tconst strategy = optionalStrategy(raw.strategy) ?? \"priority\";\n\t\tconst fallback = optionalBoolean(raw.fallback) ?? true;\n\t\treturn { strategy, fallback, auto, providers };\n\t}\n\n\tconst provider = providerEntryFromObject(raw);\n\treturn provider ? { strategy: \"priority\", fallback: true, auto, providers: [provider] } : null;\n}\n\nfunction hasApiKey(config: SearchProviderConfig): boolean {\n\treturn typeof config.apiKey === \"string\" && config.apiKey.length > 0;\n}\n\nexport function validateProviderConfig(config: SearchProviderEntry): ProviderValidationResult {\n\tif (!PROVIDERS.includes(config.provider)) {\n\t\treturn { ok: false, reason: \"invalid_config\", message: `Unsupported provider: ${config.provider}` };\n\t}\n\n\tif (config.allowedDomains && config.blockedDomains) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"invalid_config\",\n\t\t\tmessage: \"Provider config cannot specify both allowedDomains and blockedDomains.\",\n\t\t};\n\t}\n\n\tif (config.weight !== undefined && config.weight <= 0) {\n\t\treturn { ok: false, reason: \"invalid_config\", message: \"Provider weight must be greater than 0.\" };\n\t}\n\n\tif (config.timeoutMs !== undefined && config.timeoutMs <= 0) {\n\t\treturn { ok: false, reason: \"invalid_config\", message: \"Provider timeoutMs must be greater than 0.\" };\n\t}\n\n\tif (config.baseUrl && !isAllowedProviderBaseUrl(config.baseUrl)) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"invalid_config\",\n\t\t\tmessage: `Provider ${config.provider} baseUrl must be a public HTTPS URL without credentials.`,\n\t\t};\n\t}\n\n\tif (config.provider === \"google-cse\" && !config.searchEngineId) {\n\t\treturn { ok: false, reason: \"missing_api_key\", message: \"Provider google-cse requires searchEngineId.\" };\n\t}\n\n\tif ((config.provider === \"codex\" || config.provider === \"openai\") && !hasApiKey(config)) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"missing_api_key\",\n\t\t\tmessage: `Provider ${config.provider} requires apiKey for hosted Responses API search.`,\n\t\t};\n\t}\n\n\tif (\n\t\tconfig.provider !== \"codex\" &&\n\t\tconfig.provider !== \"openai\" &&\n\t\tconfig.provider !== \"duckduckgo-html\" &&\n\t\t!hasApiKey(config)\n\t) {\n\t\treturn { ok: false, reason: \"missing_api_key\", message: `Provider ${config.provider} requires apiKey.` };\n\t}\n\n\treturn { ok: true, config };\n}\n\nexport function validateWebsearchConfig(\n\tconfig: WebsearchConfig,\n): ProviderValidationResult | { ok: true; config: WebsearchConfig } {\n\tif (!STRATEGIES.includes(config.strategy)) {\n\t\treturn { ok: false, reason: \"invalid_config\", message: `Unsupported routing strategy: ${config.strategy}` };\n\t}\n\tif (typeof config.auto !== \"boolean\") {\n\t\treturn { ok: false, reason: \"invalid_config\", message: \"Websearch config auto must be a boolean.\" };\n\t}\n\tif (config.providers.length === 0) {\n\t\treturn { ok: false, reason: \"invalid_config\", message: \"Websearch config requires at least one provider.\" };\n\t}\n\n\tfor (const provider of config.providers) {\n\t\tconst validation = validateProviderConfig(provider);\n\t\tif (!validation.ok) return validation;\n\t}\n\n\treturn { ok: true, config };\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport async function loadWebsearchConfig(options: ConfigLoadOptions): Promise<ConfigLoadResult> {\n\tconst home = options.homeDir ?? homedir();\n\tconst paths = [\n\t\tjoin(options.cwd, CONFIG_DIR_NAME, \"websearch.json\"),\n\t\tjoin(options.cwd, \".pi\", \"websearch.json\"),\n\t\tjoin(home, \"websearch.json\"),\n\t\tjoin(home, CONFIG_DIR_NAME, \"websearch.json\"),\n\t\tjoin(home, \".pi\", \"websearch.json\"),\n\t].filter((path, index, all) => all.indexOf(path) === index);\n\n\tfor (const path of paths) {\n\t\tif (!(await fileExists(path))) continue;\n\t\tconst raw = parseJsonObject(await readFile(path, \"utf8\"));\n\t\tif (!raw) {\n\t\t\treturn { ok: false, reason: \"invalid_config\", message: `Invalid JSON object in ${path}`, source: path };\n\t\t}\n\t\tconst config = configFromObject(raw);\n\t\tif (!config) {\n\t\t\treturn { ok: false, reason: \"invalid_config\", message: `Invalid provider config in ${path}`, source: path };\n\t\t}\n\t\tconst validation = validateWebsearchConfig(config);\n\t\tif (!validation.ok) return { ...validation, source: path };\n\t\treturn { ok: true, config, source: path };\n\t}\n\n\treturn { ok: true, config: DEFAULT_FREE_CONFIG, source: \"default:duckduckgo-html\" };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/native.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAkB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC/D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhC,MAAM,WAAW,mBAAmB;IACnC,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvE,YAAY,CAAC,IAAI,eAAe,EAAE,CAAC;CACnC;
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/native.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAkB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC/D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhC,MAAM,WAAW,mBAAmB;IACnC,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACvE,YAAY,CAAC,IAAI,eAAe,EAAE,CAAC;CACnC;AA+HD,wBAAsB,kBAAkB,CACvC,KAAK,EAAE,eAAe,GAAG,SAAS,EAClC,aAAa,EAAE,mBAAmB,GAAG,SAAS,EAC9C,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA6BhC;AAED,wBAAsB,gBAAgB,CACrC,KAAK,EAAE,eAAe,GAAG,SAAS,EAClC,aAAa,EAAE,mBAAmB,GAAG,SAAS,EAC9C,EAAE,SAAW,GACX,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAErC"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { isAllowedProviderBaseUrl } from "./provider-endpoints.js";
|
|
3
3
|
function nativeMapping(model) {
|
|
4
|
-
if (model.provider === "openai" &&
|
|
5
|
-
(/^(gpt-5\.5(-fast)?|gpt-4\.1(-mini)?)$/.test(model.id) || /^gpt-4o(-mini)?(-\d{4}-\d{2}-\d{2})?$/.test(model.id))) {
|
|
4
|
+
if (model.provider === "openai" && /^gpt-(4o|4\.1|5)/.test(model.id) && !model.id.includes("codex")) {
|
|
6
5
|
return { provider: "openai", resource: "responses" };
|
|
7
6
|
}
|
|
8
|
-
if (model.provider === "anthropic" &&
|
|
9
|
-
(/^claude-(opus|sonnet)-4(-\d+)?$/.test(model.id) || /^claude-(opus|sonnet)-4-\d+-\d{8}$/.test(model.id))) {
|
|
7
|
+
if (model.provider === "anthropic" && /^claude-/.test(model.id)) {
|
|
10
8
|
return { provider: "anthropic", resource: "messages" };
|
|
11
9
|
}
|
|
12
10
|
if (model.provider === "xai" && /^grok-/.test(model.id)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AA4BnE,SAAS,aAAa,CAAC,KAAsB;IAC5C,IACC,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,uCAAuC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,uCAAuC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EACjH,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACtD,CAAC;IAED,IACC,KAAK,CAAC,QAAQ,KAAK,WAAW;QAC9B,CAAC,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EACxG,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACxD,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACzD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,YAAY,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,UAAU,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,iBAAiB,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,iBAAiB,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC;QACpD,OAAO,aAAa,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,QAAgB;IAC1D,IAAI,UAAe,CAAC;IACpB,IAAI,CAAC;QACJ,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,IAAI,QAAQ,EAAE,CAAC;IACrC,IAAI,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACzC,UAAU,CAAC,QAAQ,GAAG,WAAW,CAAC;IACnC,CAAC;SAAM,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,UAAU,CAAC,QAAQ,GAAG,GAAG,WAAW,GAAG,aAAa,EAAE,CAAC;IACxD,CAAC;SAAM,CAAC;QACP,UAAU,CAAC,QAAQ,GAAG,GAAG,WAAW,MAAM,aAAa,EAAE,CAAC;IAC3D,CAAC;IACD,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;IACrB,OAAO,UAAU,CAAC,IAAI,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,KAAsB;IAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAwB,EAAE,QAAgB;IAC1E,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1F,OAAO,UAAU,QAAQ,IAAI,gBAAgB,EAAE,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,wBAAwB,CACtC,KAAkC,EAClC,aAA8C,EAC9C,OAAO,GAAuB,EAAE;IAEhC,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE1C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,WAAW,GAAG,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,IAAsB,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,GAAG,MAAM,WAAW,CAAC;IAC1B,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,mBAAmB,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;YAC5D,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,mBAAmB,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QACH,IAAI,CAAC;YACJ,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACV,mBAAmB,EAAE,CAAC;QACvB,CAAC;IACF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAE1C,OAAO;QACN,EAAE;QACF,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,QAAQ,EAAE,CAAC,CAAC;KACZ,CAAC;AACH,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,KAAkC,EAClC,aAA8C,EAC9C,MAAoB;IAEpB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAE9B,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,IAAI,cAAc,EAAE,CAAC;QACpB,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACrF,IAAI,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,YAAY;QAAE,OAAO,OAAO,CAAC;IAEhD,KAAK,MAAM,cAAc,IAAI,aAAa,CAAC,YAAY,EAAE,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QACpD,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC,cAAc,EAAE,aAAa,EAAE;YAC3E,EAAE,EAAE,mBAAmB;YACvB,MAAM;SACN,CAAC,CAAC;QACH,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,uBAAuB,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,KAAkC,EAClC,aAA8C,EAC9C,EAAE,GAAG,QAAQ;IAEb,OAAO,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAC/D,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { isAllowedProviderBaseUrl } from \"./provider-endpoints.ts\";\nimport type { SearchProvider, SearchProviderEntry } from \"./types.ts\";\n\nexport interface NativeModelInfo {\n\tprovider: string;\n\tid: string;\n\tbaseUrl: string;\n}\n\nexport type NativeAuthResult =\n\t| { ok: true; apiKey?: string; headers?: Record<string, string> }\n\t| { ok: false; error: string };\n\nexport interface NativeModelRegistry {\n\tgetApiKeyAndHeaders(model: NativeModelInfo): Promise<NativeAuthResult>;\n\tgetAvailable?(): NativeModelInfo[];\n}\n\ninterface NativeProviderMapping {\n\tprovider: SearchProvider;\n\tresource: string;\n}\n\ninterface NativeEntryOptions {\n\tid?: string;\n\tsignal?: AbortSignal;\n}\n\nfunction nativeMapping(model: NativeModelInfo): NativeProviderMapping | null {\n\tif (\n\t\tmodel.provider === \"openai\" &&\n\t\t(/^(gpt-5\\.5(-fast)?|gpt-4\\.1(-mini)?)$/.test(model.id) || /^gpt-4o(-mini)?(-\\d{4}-\\d{2}-\\d{2})?$/.test(model.id))\n\t) {\n\t\treturn { provider: \"openai\", resource: \"responses\" };\n\t}\n\n\tif (\n\t\tmodel.provider === \"anthropic\" &&\n\t\t(/^claude-(opus|sonnet)-4(-\\d+)?$/.test(model.id) || /^claude-(opus|sonnet)-4-\\d+-\\d{8}$/.test(model.id))\n\t) {\n\t\treturn { provider: \"anthropic\", resource: \"messages\" };\n\t}\n\n\tif (model.provider === \"xai\" && /^grok-/.test(model.id)) {\n\t\treturn { provider: \"xai\", resource: \"responses\" };\n\t}\n\n\tif (model.provider === \"perplexity\" && /^sonar/.test(model.id)) {\n\t\treturn { provider: \"perplexity\", resource: \"chat/completions\" };\n\t}\n\n\tif ((model.provider === \"z-ai\" || model.provider === \"zai\") && /^glm-/.test(model.id)) {\n\t\treturn { provider: \"z-ai\", resource: \"chat/completions\" };\n\t}\n\n\tif (model.provider === \"kimi-coding\") {\n\t\treturn { provider: \"kimi\", resource: \"search\" };\n\t}\n\n\tif (model.provider === \"openrouter\") {\n\t\tconst slashIndex = model.id.indexOf(\"/\");\n\t\tif (slashIndex <= 0) return null;\n\t\tconst effectiveProvider = model.id.slice(0, slashIndex);\n\t\tconst effectiveId = model.id.slice(slashIndex + 1);\n\t\tif (effectiveProvider === \"openrouter\") return null;\n\t\treturn nativeMapping({ ...model, provider: effectiveProvider, id: effectiveId });\n\t}\n\n\treturn null;\n}\n\nfunction buildEndpointUrl(baseUrl: string, resource: string): string {\n\tlet configured: URL;\n\ttry {\n\t\tconfigured = new URL(baseUrl);\n\t} catch {\n\t\treturn baseUrl;\n\t}\n\tconst trimmedPath = configured.pathname.replace(/\\/+$/, \"\");\n\tconst resourceSlash = `/${resource}`;\n\tif (trimmedPath.endsWith(resourceSlash)) {\n\t\tconfigured.pathname = trimmedPath;\n\t} else if (/\\/v\\d+$/.test(trimmedPath)) {\n\t\tconfigured.pathname = `${trimmedPath}${resourceSlash}`;\n\t} else {\n\t\tconfigured.pathname = `${trimmedPath}/v1${resourceSlash}`;\n\t}\n\tconfigured.hash = \"\";\n\treturn configured.href;\n}\n\nfunction nativeRouteKey(model: NativeModelInfo): string | null {\n\tconst mapping = nativeMapping(model);\n\tif (!mapping) return null;\n\tconst baseUrl = buildEndpointUrl(model.baseUrl, mapping.resource);\n\tif (!isAllowedProviderBaseUrl(baseUrl)) return null;\n\tconst routeUrl = new URL(baseUrl);\n\trouteUrl.hostname = routeUrl.hostname.replace(/\\.$/, \"\");\n\treturn `${mapping.provider}|${routeUrl.href}`;\n}\n\nfunction discoveredNativeEntryId(provider: SearchProvider, routeKey: string): string {\n\tconst routeFingerprint = createHash(\"sha256\").update(routeKey).digest(\"hex\").slice(0, 16);\n\treturn `native-${provider}-${routeFingerprint}`;\n}\n\nasync function buildNativeEntryForModel(\n\tmodel: NativeModelInfo | undefined,\n\tmodelRegistry: NativeModelRegistry | undefined,\n\toptions: NativeEntryOptions = {},\n): Promise<SearchProviderEntry | null> {\n\tif (!model || !modelRegistry) return null;\n\tconst { id = \"native\", signal } = options;\n\n\tconst mapping = nativeMapping(model);\n\tif (!mapping) return null;\n\tconst baseUrl = buildEndpointUrl(model.baseUrl, mapping.resource);\n\tif (!isAllowedProviderBaseUrl(baseUrl)) return null;\n\n\tsignal?.throwIfAborted();\n\tconst authPromise = modelRegistry.getApiKeyAndHeaders(model);\n\tlet auth: NativeAuthResult;\n\tif (!signal) {\n\t\tauth = await authPromise;\n\t} else {\n\t\tsignal.throwIfAborted();\n\t\tlet removeAbortListener = (): void => {};\n\t\tconst abortPromise = new Promise<never>((_resolve, reject) => {\n\t\t\tconst onAbort = (): void => reject(signal.reason);\n\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tremoveAbortListener = () => signal.removeEventListener(\"abort\", onAbort);\n\t\t});\n\t\ttry {\n\t\t\tauth = await Promise.race([authPromise, abortPromise]);\n\t\t} finally {\n\t\t\tremoveAbortListener();\n\t\t}\n\t}\n\tif (!auth.ok || !auth.apiKey) return null;\n\n\treturn {\n\t\tid,\n\t\tprovider: mapping.provider,\n\t\tapiKey: auth.apiKey,\n\t\tbaseUrl,\n\t\tmodel: model.id,\n\t\tpriority: -1,\n\t};\n}\nexport async function buildNativeEntries(\n\tmodel: NativeModelInfo | undefined,\n\tmodelRegistry: NativeModelRegistry | undefined,\n\tsignal?: AbortSignal,\n): Promise<SearchProviderEntry[]> {\n\tsignal?.throwIfAborted();\n\tif (!modelRegistry) return [];\n\n\tconst entries: SearchProviderEntry[] = [];\n\tconst seenRoutes = new Set<string>();\n\n\tconst activeRouteKey = model ? nativeRouteKey(model) : null;\n\tif (activeRouteKey) {\n\t\tseenRoutes.add(activeRouteKey);\n\t\tconst activeEntry = await buildNativeEntryForModel(model, modelRegistry, { signal });\n\t\tif (activeEntry) entries.push(activeEntry);\n\t}\n\n\tif (!modelRegistry.getAvailable) return entries;\n\n\tfor (const availableModel of modelRegistry.getAvailable()) {\n\t\tconst routeKey = nativeRouteKey(availableModel);\n\t\tif (!routeKey || seenRoutes.has(routeKey)) continue;\n\t\tseenRoutes.add(routeKey);\n\t\tconst entry = await buildNativeEntryForModel(availableModel, modelRegistry, {\n\t\t\tid: \"native-discovered\",\n\t\t\tsignal,\n\t\t});\n\t\tif (!entry) continue;\n\t\tentries.push({ ...entry, id: discoveredNativeEntryId(entry.provider, routeKey) });\n\t}\n\n\treturn entries;\n}\n\nexport async function buildNativeEntry(\n\tmodel: NativeModelInfo | undefined,\n\tmodelRegistry: NativeModelRegistry | undefined,\n\tid = \"native\",\n): Promise<SearchProviderEntry | null> {\n\treturn buildNativeEntryForModel(model, modelRegistry, { id });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/native.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { isAllowedProviderBaseUrl } from \"./provider-endpoints.ts\";\nimport type { SearchProvider, SearchProviderEntry } from \"./types.ts\";\n\nexport interface NativeModelInfo {\n\tprovider: string;\n\tid: string;\n\tbaseUrl: string;\n}\n\nexport type NativeAuthResult =\n\t| { ok: true; apiKey?: string; headers?: Record<string, string> }\n\t| { ok: false; error: string };\n\nexport interface NativeModelRegistry {\n\tgetApiKeyAndHeaders(model: NativeModelInfo): Promise<NativeAuthResult>;\n\tgetAvailable?(): NativeModelInfo[];\n}\n\ninterface NativeProviderMapping {\n\tprovider: SearchProvider;\n\tresource: string;\n}\n\ninterface NativeEntryOptions {\n\tid?: string;\n\tsignal?: AbortSignal;\n}\n\nfunction nativeMapping(model: NativeModelInfo): NativeProviderMapping | null {\n\tif (model.provider === \"openai\" && /^gpt-(4o|4\\.1|5)/.test(model.id) && !model.id.includes(\"codex\")) {\n\t\treturn { provider: \"openai\", resource: \"responses\" };\n\t}\n\n\tif (model.provider === \"anthropic\" && /^claude-/.test(model.id)) {\n\t\treturn { provider: \"anthropic\", resource: \"messages\" };\n\t}\n\n\tif (model.provider === \"xai\" && /^grok-/.test(model.id)) {\n\t\treturn { provider: \"xai\", resource: \"responses\" };\n\t}\n\n\tif (model.provider === \"perplexity\" && /^sonar/.test(model.id)) {\n\t\treturn { provider: \"perplexity\", resource: \"chat/completions\" };\n\t}\n\n\tif ((model.provider === \"z-ai\" || model.provider === \"zai\") && /^glm-/.test(model.id)) {\n\t\treturn { provider: \"z-ai\", resource: \"chat/completions\" };\n\t}\n\n\tif (model.provider === \"kimi-coding\") {\n\t\treturn { provider: \"kimi\", resource: \"search\" };\n\t}\n\n\tif (model.provider === \"openrouter\") {\n\t\tconst slashIndex = model.id.indexOf(\"/\");\n\t\tif (slashIndex <= 0) return null;\n\t\tconst effectiveProvider = model.id.slice(0, slashIndex);\n\t\tconst effectiveId = model.id.slice(slashIndex + 1);\n\t\tif (effectiveProvider === \"openrouter\") return null;\n\t\treturn nativeMapping({ ...model, provider: effectiveProvider, id: effectiveId });\n\t}\n\n\treturn null;\n}\n\nfunction buildEndpointUrl(baseUrl: string, resource: string): string {\n\tlet configured: URL;\n\ttry {\n\t\tconfigured = new URL(baseUrl);\n\t} catch {\n\t\treturn baseUrl;\n\t}\n\tconst trimmedPath = configured.pathname.replace(/\\/+$/, \"\");\n\tconst resourceSlash = `/${resource}`;\n\tif (trimmedPath.endsWith(resourceSlash)) {\n\t\tconfigured.pathname = trimmedPath;\n\t} else if (/\\/v\\d+$/.test(trimmedPath)) {\n\t\tconfigured.pathname = `${trimmedPath}${resourceSlash}`;\n\t} else {\n\t\tconfigured.pathname = `${trimmedPath}/v1${resourceSlash}`;\n\t}\n\tconfigured.hash = \"\";\n\treturn configured.href;\n}\n\nfunction nativeRouteKey(model: NativeModelInfo): string | null {\n\tconst mapping = nativeMapping(model);\n\tif (!mapping) return null;\n\tconst baseUrl = buildEndpointUrl(model.baseUrl, mapping.resource);\n\tif (!isAllowedProviderBaseUrl(baseUrl)) return null;\n\tconst routeUrl = new URL(baseUrl);\n\trouteUrl.hostname = routeUrl.hostname.replace(/\\.$/, \"\");\n\treturn `${mapping.provider}|${routeUrl.href}`;\n}\n\nfunction discoveredNativeEntryId(provider: SearchProvider, routeKey: string): string {\n\tconst routeFingerprint = createHash(\"sha256\").update(routeKey).digest(\"hex\").slice(0, 16);\n\treturn `native-${provider}-${routeFingerprint}`;\n}\n\nasync function buildNativeEntryForModel(\n\tmodel: NativeModelInfo | undefined,\n\tmodelRegistry: NativeModelRegistry | undefined,\n\toptions: NativeEntryOptions = {},\n): Promise<SearchProviderEntry | null> {\n\tif (!model || !modelRegistry) return null;\n\tconst { id = \"native\", signal } = options;\n\n\tconst mapping = nativeMapping(model);\n\tif (!mapping) return null;\n\tconst baseUrl = buildEndpointUrl(model.baseUrl, mapping.resource);\n\tif (!isAllowedProviderBaseUrl(baseUrl)) return null;\n\n\tsignal?.throwIfAborted();\n\tconst authPromise = modelRegistry.getApiKeyAndHeaders(model);\n\tlet auth: NativeAuthResult;\n\tif (!signal) {\n\t\tauth = await authPromise;\n\t} else {\n\t\tsignal.throwIfAborted();\n\t\tlet removeAbortListener = (): void => {};\n\t\tconst abortPromise = new Promise<never>((_resolve, reject) => {\n\t\t\tconst onAbort = (): void => reject(signal.reason);\n\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tremoveAbortListener = () => signal.removeEventListener(\"abort\", onAbort);\n\t\t});\n\t\ttry {\n\t\t\tauth = await Promise.race([authPromise, abortPromise]);\n\t\t} finally {\n\t\t\tremoveAbortListener();\n\t\t}\n\t}\n\tif (!auth.ok || !auth.apiKey) return null;\n\n\treturn {\n\t\tid,\n\t\tprovider: mapping.provider,\n\t\tapiKey: auth.apiKey,\n\t\tbaseUrl,\n\t\tmodel: model.id,\n\t\tpriority: -1,\n\t};\n}\nexport async function buildNativeEntries(\n\tmodel: NativeModelInfo | undefined,\n\tmodelRegistry: NativeModelRegistry | undefined,\n\tsignal?: AbortSignal,\n): Promise<SearchProviderEntry[]> {\n\tsignal?.throwIfAborted();\n\tif (!modelRegistry) return [];\n\n\tconst entries: SearchProviderEntry[] = [];\n\tconst seenRoutes = new Set<string>();\n\n\tconst activeRouteKey = model ? nativeRouteKey(model) : null;\n\tif (activeRouteKey) {\n\t\tseenRoutes.add(activeRouteKey);\n\t\tconst activeEntry = await buildNativeEntryForModel(model, modelRegistry, { signal });\n\t\tif (activeEntry) entries.push(activeEntry);\n\t}\n\n\tif (!modelRegistry.getAvailable) return entries;\n\n\tfor (const availableModel of modelRegistry.getAvailable()) {\n\t\tconst routeKey = nativeRouteKey(availableModel);\n\t\tif (!routeKey || seenRoutes.has(routeKey)) continue;\n\t\tseenRoutes.add(routeKey);\n\t\tconst entry = await buildNativeEntryForModel(availableModel, modelRegistry, {\n\t\t\tid: \"native-discovered\",\n\t\t\tsignal,\n\t\t});\n\t\tif (!entry) continue;\n\t\tentries.push({ ...entry, id: discoveredNativeEntryId(entry.provider, routeKey) });\n\t}\n\n\treturn entries;\n}\n\nexport async function buildNativeEntry(\n\tmodel: NativeModelInfo | undefined,\n\tmodelRegistry: NativeModelRegistry | undefined,\n\tid = \"native\",\n): Promise<SearchProviderEntry | null> {\n\treturn buildNativeEntryForModel(model, modelRegistry, { id });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderers.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/renderers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"renderers.d.ts","sourceRoot":"","sources":["../../../../../../src/core/extensions/builtin/websearch/websearch/renderers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAG9C,OAAO,KAAK,EAA4D,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEhH,UAAU,SAAS;IAClB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC;AAED,UAAU,UAAU;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,UAAU,UAAU,CAAC,QAAQ;IAC5B,OAAO,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,OAAO,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED,UAAU,mBAAmB;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAuCD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAMzE;AAED,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,UAAU,CAAC,mBAAmB,CAAC,EACvC,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,SAAS,GACd,IAAI,CAoDN"}
|