@astralyn/pi 1.0.5 → 1.2.0
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 +79 -0
- package/dist/bundle/chunks/anthropic-messages-NVP5OPIM.js +6 -0
- package/dist/bundle/chunks/anthropic.js +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-LDW4FGAQ.js → azure-openai-responses-IBTOZ5MH.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
- package/dist/bundle/chunks/chunk-4XZYHGVN.js +11 -0
- package/dist/bundle/chunks/{chunk-GIG5IHES.js → chunk-5KJH3GGH.js} +1 -1
- package/dist/bundle/chunks/chunk-6VYRLG5F.js +2 -0
- package/dist/bundle/chunks/{chunk-UCXU7KLO.js → chunk-7HJ6CHUB.js} +1 -1
- package/dist/bundle/chunks/chunk-7UBIBLPN.js +2 -0
- package/dist/bundle/chunks/{chunk-IE3Z7ESB.js → chunk-A5HU4TE6.js} +418 -362
- package/dist/bundle/chunks/{chunk-HDHRZ7GT.js → chunk-B2UOWO4A.js} +1 -1
- package/dist/bundle/chunks/chunk-J75WV3FL.js +2 -0
- package/dist/bundle/chunks/{chunk-A6ALEEY5.js → chunk-LHSPN2IO.js} +1 -1
- package/dist/bundle/chunks/chunk-Q74S7ILH.js +2 -0
- package/dist/bundle/chunks/chunk-QDDSFJ35.js +2 -0
- package/dist/bundle/chunks/{chunk-IFELM7MW.js → chunk-UQECUCUH.js} +1 -1
- package/dist/bundle/chunks/cloudflare-workers-ai-system-one-HGOVFZDC.js +2 -0
- package/dist/bundle/chunks/codemode-worker.js +18 -10
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-S5A5IBU4.js → google-generative-ai-M44TSMAN.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-UBRQFDB4.js → google-vertex-3C4OWLFX.js} +1 -1
- package/dist/bundle/chunks/image-resize-worker.js +1 -1
- package/dist/bundle/chunks/{llama-cpp-classify-R7DQLTQN.js → llama-cpp-classify-H3IZDR5O.js} +2 -2
- package/dist/bundle/chunks/mistral-conversations-I5PL4VCZ.js +5 -0
- package/dist/bundle/chunks/openai-chatgpt.js +1 -1
- package/dist/bundle/chunks/openai-codex-responses-O5EUDL54.js +10 -0
- package/dist/bundle/chunks/openai-codex.js +1 -1
- package/dist/bundle/chunks/{openai-completions-H4VMO7AU.js → openai-completions-X3SSG5BQ.js} +1 -1
- package/dist/bundle/chunks/openai-decisions-TVCDIPZX.js +5 -0
- package/dist/bundle/chunks/{openai-responses-G4PGNM2H.js → openai-responses-NYPNKVDV.js} +1 -1
- package/dist/bundle/chunks/{openrouter-images-YP3YVB54.js → openrouter-images-TDLJV5N4.js} +1 -1
- package/dist/bundle/chunks/{pi-messages-HZZ7GEEW.js → pi-messages-ZXNERWJG.js} +1 -1
- package/dist/bundle/chunks/typesafe-system-one-LWPJYTJP.js +2 -0
- package/dist/bundle/chunks/{virtual-modules-46MSJGKO.js → virtual-modules-OZTPKGU7.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +13 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +26 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +190 -183
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +20 -13
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +40 -45
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/bug-report.d.ts +9 -1
- package/dist/core/bug-report.d.ts.map +1 -1
- package/dist/core/compaction/utils.d.ts +6 -0
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +7 -8
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/context-snapshot.d.ts +4 -1
- package/dist/core/context-snapshot.d.ts.map +1 -1
- package/dist/core/context-snapshot.js +45 -0
- package/dist/core/context-snapshot.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +2 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +4 -2
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +2 -3
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +42 -7
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/key-id-schema.d.ts +6 -0
- package/dist/core/key-id-schema.d.ts.map +1 -0
- package/dist/core/key-id-schema.js +16 -0
- package/dist/core/key-id-schema.js.map +1 -0
- package/dist/core/keybinding-registry.d.ts +4 -3
- package/dist/core/keybinding-registry.d.ts.map +1 -1
- package/dist/core/keybinding-registry.js +4 -3
- package/dist/core/keybinding-registry.js.map +1 -1
- package/dist/core/keybindings-schema.d.ts +4 -0
- package/dist/core/keybindings-schema.d.ts.map +1 -0
- package/dist/core/keybindings-schema.js +16 -0
- package/dist/core/keybindings-schema.js.map +1 -0
- package/dist/core/keybindings.d.ts +258 -81
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +27 -24
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +713 -180
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +18 -179
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +13 -7
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/nested-tool-calls.d.ts +1 -0
- package/dist/core/nested-tool-calls.d.ts.map +1 -1
- package/dist/core/nested-tool-calls.js +1 -0
- package/dist/core/nested-tool-calls.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +3 -3
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +2 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +12 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +82 -24
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +7 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +4 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +17 -5
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-defaults.d.ts +65 -0
- package/dist/core/settings-defaults.d.ts.map +1 -0
- package/dist/core/settings-defaults.js +66 -0
- package/dist/core/settings-defaults.js.map +1 -0
- package/dist/core/settings-manager.d.ts +15 -147
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +85 -57
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-schema.d.ts +231 -0
- package/dist/core/settings-schema.d.ts.map +1 -0
- package/dist/core/settings-schema.js +294 -0
- package/dist/core/settings-schema.js.map +1 -0
- package/dist/core/tasks/session.d.ts +9 -0
- package/dist/core/tasks/session.d.ts.map +1 -1
- package/dist/core/tasks/session.js +21 -0
- package/dist/core/tasks/session.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +18 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +46 -0
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +21 -45
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/renderers/edit.js +1 -1
- package/dist/core/tools/renderers/edit.js.map +1 -1
- package/dist/extensions/btw/keybindings.d.ts +2 -2
- package/dist/extensions/btw/keybindings.d.ts.map +1 -1
- package/dist/extensions/btw/keybindings.js.map +1 -1
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +115 -40
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/index.d.ts.map +1 -1
- package/dist/extensions/codemode/index.js +3 -7
- package/dist/extensions/codemode/index.js.map +1 -1
- package/dist/extensions/codemode/renderer.d.ts +2 -2
- package/dist/extensions/codemode/renderer.d.ts.map +1 -1
- package/dist/extensions/codemode/renderer.js +9 -3
- package/dist/extensions/codemode/renderer.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts +6 -12
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +46 -34
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/extensions/index.js +2 -2
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/list-keybindings.d.ts +2 -2
- package/dist/extensions/list-keybindings.d.ts.map +1 -1
- package/dist/extensions/list-keybindings.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +34 -11
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/mcp/cli.js +22 -31
- package/dist/extensions/mcp/cli.js.map +1 -1
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +187 -95
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/oauth.d.ts +5 -3
- package/dist/extensions/mcp/oauth.d.ts.map +1 -1
- package/dist/extensions/mcp/oauth.js +36 -10
- package/dist/extensions/mcp/oauth.js.map +1 -1
- package/dist/extensions/mcp/resources.d.ts +0 -6
- package/dist/extensions/mcp/resources.d.ts.map +1 -1
- package/dist/extensions/mcp/resources.js +1 -1
- package/dist/extensions/mcp/resources.js.map +1 -1
- package/dist/extensions/mcp/runtime.d.ts +3 -6
- package/dist/extensions/mcp/runtime.d.ts.map +1 -1
- package/dist/extensions/mcp/runtime.js +4 -39
- package/dist/extensions/mcp/runtime.js.map +1 -1
- package/dist/extensions/mcp/tools.d.ts +2 -3
- package/dist/extensions/mcp/tools.d.ts.map +1 -1
- package/dist/extensions/mcp/tools.js +62 -6
- package/dist/extensions/mcp/tools.js.map +1 -1
- package/dist/extensions/mcp/ui.d.ts +3 -3
- package/dist/extensions/mcp/ui.d.ts.map +1 -1
- package/dist/extensions/mcp/ui.js +10 -2
- package/dist/extensions/mcp/ui.js.map +1 -1
- package/dist/extensions/provider/keybindings.d.ts +2 -2
- package/dist/extensions/provider/keybindings.d.ts.map +1 -1
- package/dist/extensions/provider/keybindings.js.map +1 -1
- package/dist/extensions/search/code-search.d.ts +27 -0
- package/dist/extensions/search/code-search.d.ts.map +1 -0
- package/dist/extensions/search/code-search.js +120 -0
- package/dist/extensions/search/code-search.js.map +1 -0
- package/dist/extensions/search/command.d.ts +5 -0
- package/dist/extensions/search/command.d.ts.map +1 -0
- package/dist/extensions/search/command.js +69 -0
- package/dist/extensions/search/command.js.map +1 -0
- package/dist/extensions/search/credential.d.ts +25 -0
- package/dist/extensions/search/credential.d.ts.map +1 -0
- package/dist/extensions/search/credential.js +117 -0
- package/dist/extensions/search/credential.js.map +1 -0
- package/dist/extensions/search/devin.d.ts +34 -0
- package/dist/extensions/search/devin.d.ts.map +1 -0
- package/dist/extensions/search/devin.js +210 -0
- package/dist/extensions/search/devin.js.map +1 -0
- package/dist/extensions/search/index.d.ts +5 -0
- package/dist/extensions/search/index.d.ts.map +1 -0
- package/dist/extensions/search/index.js +113 -0
- package/dist/extensions/search/index.js.map +1 -0
- package/dist/extensions/search/panel.d.ts +53 -0
- package/dist/extensions/search/panel.d.ts.map +1 -0
- package/dist/extensions/search/panel.js +157 -0
- package/dist/extensions/search/panel.js.map +1 -0
- package/dist/extensions/search/prompt.d.ts +14 -0
- package/dist/extensions/search/prompt.d.ts.map +1 -0
- package/dist/extensions/search/prompt.js +221 -0
- package/dist/extensions/search/prompt.js.map +1 -0
- package/dist/extensions/search/render.d.ts +28 -0
- package/dist/extensions/search/render.d.ts.map +1 -0
- package/dist/extensions/search/render.js +86 -0
- package/dist/extensions/search/render.js.map +1 -0
- package/dist/extensions/search/workspace.d.ts +39 -0
- package/dist/extensions/search/workspace.d.ts.map +1 -0
- package/dist/extensions/search/workspace.js +363 -0
- package/dist/extensions/search/workspace.js.map +1 -0
- package/dist/extensions/tool-search/index.d.ts.map +1 -1
- package/dist/extensions/tool-search/index.js +1 -6
- package/dist/extensions/tool-search/index.js.map +1 -1
- package/dist/extensions/tool-search/tool.d.ts +0 -2
- package/dist/extensions/tool-search/tool.d.ts.map +1 -1
- package/dist/extensions/tool-search/tool.js +2 -4
- package/dist/extensions/tool-search/tool.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.js +3 -3
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +14 -14
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +5 -2
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +5 -2
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +7 -2
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +4 -3
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +2 -2
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +63 -64
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/program-status-reporter.d.ts +34 -0
- package/dist/modes/interactive/program-status-reporter.d.ts.map +1 -0
- package/dist/modes/interactive/program-status-reporter.js +107 -0
- package/dist/modes/interactive/program-status-reporter.js.map +1 -0
- package/dist/modes/interactive/tasks/host-hooks.d.ts +14 -0
- package/dist/modes/interactive/tasks/host-hooks.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/host-hooks.js +31 -0
- package/dist/modes/interactive/tasks/host-hooks.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +1 -1
- package/dist/modes/interactive/theme/light.json +1 -1
- package/dist/modes/interactive/theme/theme-schema.d.ts +28 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.js +105 -0
- package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/dist/modes/interactive/theme/theme-tokens.d.ts +257 -0
- package/dist/modes/interactive/theme/theme-tokens.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-tokens.js +94 -0
- package/dist/modes/interactive/theme/theme-tokens.js.map +1 -0
- package/dist/modes/interactive/theme/theme.d.ts +13 -16
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +23 -31
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tool-view/tool-execution.d.ts +5 -0
- package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/tool-view/tool-execution.js +7 -0
- package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +4 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +24 -0
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/ansi.d.ts +8 -0
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js +30 -11
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +18 -12
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts +12 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +5 -0
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.js +3 -2
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js +9 -10
- package/dist/utils/image-resize.js.map +1 -1
- package/docs/bundled/README.md +1 -1
- package/docs/bundled/extensions/provider.md +1 -1
- package/docs/bundled/extensions/question.md +1 -1
- package/docs/bundled/extensions/search.md +51 -0
- package/docs/bundled/extensions/statusline.md +15 -41
- package/docs/codemode.md +24 -4
- package/docs/compaction.md +2 -2
- package/docs/docs.json +0 -4
- package/docs/environment-variables.md +3 -1
- package/docs/extensions.md +15 -5
- package/docs/json.md +2 -2
- package/docs/keybindings.md +1 -0
- package/docs/llama-cpp.md +8 -1
- package/docs/mcp.md +1 -1
- package/docs/models.md +5 -1
- package/docs/providers.md +33 -0
- package/docs/rpc.md +6 -3
- package/docs/session-format.md +1 -0
- package/docs/settings.md +5 -5
- package/docs/terminal-setup.md +14 -0
- package/docs/themes.md +4 -2
- package/docs/tui.md +1 -1
- package/docs/usage.md +7 -3
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/dynamic-resources/dynamic.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/overlay-test.ts +2 -2
- package/examples/extensions/plan-mode/index.ts +6 -2
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +54 -102
- package/package.json +10 -20
- package/schemas/keybindings.schema.json +453 -0
- package/schemas/models.schema.json +1157 -0
- package/schemas/settings.schema.json +782 -0
- package/schemas/theme.schema.json +365 -0
- package/dist/bundle/chunks/anthropic-messages-YIOJIMVL.js +0 -6
- package/dist/bundle/chunks/chunk-57XI7YJH.js +0 -2
- package/dist/bundle/chunks/chunk-JI4WGISU.js +0 -2
- package/dist/bundle/chunks/chunk-TCQ4HHQD.js +0 -2
- package/dist/bundle/chunks/chunk-TXJO4AJ7.js +0 -11
- package/dist/bundle/chunks/cloudflare-workers-ai-system-one-OWU5SM6J.js +0 -2
- package/dist/bundle/chunks/mistral-conversations-A2N5FSOV.js +0 -5
- package/dist/bundle/chunks/openai-codex-responses-Q6JHCWLE.js +0 -10
- package/dist/bundle/chunks/typesafe-system-one-KYKKNU3E.js +0 -2
- package/dist/extensions/web-search/auth.d.ts +0 -12
- package/dist/extensions/web-search/auth.d.ts.map +0 -1
- package/dist/extensions/web-search/auth.js +0 -90
- package/dist/extensions/web-search/auth.js.map +0 -1
- package/dist/extensions/web-search/constants.d.ts +0 -13
- package/dist/extensions/web-search/constants.d.ts.map +0 -1
- package/dist/extensions/web-search/constants.js +0 -26
- package/dist/extensions/web-search/constants.js.map +0 -1
- package/dist/extensions/web-search/execute.d.ts +0 -9
- package/dist/extensions/web-search/execute.d.ts.map +0 -1
- package/dist/extensions/web-search/execute.js +0 -96
- package/dist/extensions/web-search/execute.js.map +0 -1
- package/dist/extensions/web-search/format.d.ts +0 -21
- package/dist/extensions/web-search/format.d.ts.map +0 -1
- package/dist/extensions/web-search/format.js +0 -117
- package/dist/extensions/web-search/format.js.map +0 -1
- package/dist/extensions/web-search/index.d.ts +0 -6
- package/dist/extensions/web-search/index.d.ts.map +0 -1
- package/dist/extensions/web-search/index.js +0 -50
- package/dist/extensions/web-search/index.js.map +0 -1
- package/dist/extensions/web-search/providers/deepseek.d.ts +0 -13
- package/dist/extensions/web-search/providers/deepseek.d.ts.map +0 -1
- package/dist/extensions/web-search/providers/deepseek.js +0 -110
- package/dist/extensions/web-search/providers/deepseek.js.map +0 -1
- package/dist/extensions/web-search/providers/http.d.ts +0 -4
- package/dist/extensions/web-search/providers/http.d.ts.map +0 -1
- package/dist/extensions/web-search/providers/http.js +0 -42
- package/dist/extensions/web-search/providers/http.js.map +0 -1
- package/dist/extensions/web-search/providers/minimax.d.ts +0 -12
- package/dist/extensions/web-search/providers/minimax.d.ts.map +0 -1
- package/dist/extensions/web-search/providers/minimax.js +0 -61
- package/dist/extensions/web-search/providers/minimax.js.map +0 -1
- package/dist/extensions/web-search/render.d.ts +0 -15
- package/dist/extensions/web-search/render.d.ts.map +0 -1
- package/dist/extensions/web-search/render.js +0 -142
- package/dist/extensions/web-search/render.js.map +0 -1
- package/dist/extensions/web-search/results.d.ts +0 -35
- package/dist/extensions/web-search/results.d.ts.map +0 -1
- package/dist/extensions/web-search/results.js +0 -167
- package/dist/extensions/web-search/results.js.map +0 -1
- package/dist/extensions/web-search/schema.d.ts +0 -10
- package/dist/extensions/web-search/schema.d.ts.map +0 -1
- package/dist/extensions/web-search/schema.js +0 -36
- package/dist/extensions/web-search/schema.js.map +0 -1
- package/dist/extensions/web-search/types.d.ts +0 -51
- package/dist/extensions/web-search/types.d.ts.map +0 -1
- package/dist/extensions/web-search/types.js +0 -5
- package/dist/extensions/web-search/types.js.map +0 -1
- package/dist/modes/interactive/theme/theme-json.d.ts +0 -85
- package/dist/modes/interactive/theme/theme-json.d.ts.map +0 -1
- package/dist/modes/interactive/theme/theme-json.js +0 -132
- package/dist/modes/interactive/theme/theme-json.js.map +0 -1
- package/dist/modes/interactive/theme/theme-schema.json +0 -361
- package/docs/bundled/extensions/web-search.md +0 -46
- package/examples/plugins/pi-example-plugin/README.md +0 -38
- package/examples/plugins/pi-example-plugin/package.json +0 -10
- package/examples/plugins/pi-example-plugin/src/contract.ts +0 -13
- package/examples/plugins/pi-example-plugin/src/session.ts +0 -24
- package/examples/plugins/pi-example-plugin/src/tui.ts +0 -31
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/extensions/web-search/format.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Model-facing and expanded-TUI Markdown formatting for web_search results.\n */\n\nimport { getEngineLabel, WEB_SEARCH_DISABLED_MESSAGE } from \"./constants.ts\";\nimport {\n\tboundMultilineText,\n\tboundSingleLineText,\n\tMAX_ERROR_MESSAGE_LENGTH,\n\tMAX_HISTORICAL_HIT_SCAN,\n\tMAX_HISTORICAL_RELATED_SCAN,\n\tMAX_HISTORICAL_SOURCE_SCAN,\n\tMAX_OUTPUT_HITS,\n\tMAX_QUERY_LENGTH,\n\tMAX_RELATED_SEARCH_LENGTH,\n\tMAX_RELATED_SEARCHES,\n\tMAX_SNIPPET_LENGTH,\n\tMAX_SYNTHESIS_LENGTH,\n\tMAX_TITLE_LENGTH,\n\tnormalizeUrl,\n} from \"./results.ts\";\nimport type { WebSearchDetails, WebSearchHit } from \"./types.ts\";\n\nfunction escapeMarkdownText(text: string): string {\n\treturn text\n\t\t.replace(/\\\\/g, \"\\\\\\\\\")\n\t\t.replace(/\\[/g, \"\\\\[\")\n\t\t.replace(/\\]/g, \"\\\\]\")\n\t\t.replace(/</g, \"\\\\<\")\n\t\t.replace(/>/g, \"\\\\>\");\n}\n\nfunction canonicalSources(value: unknown): WebSearchHit[\"sources\"] {\n\tif (!Array.isArray(value)) return [];\n\tconst sources: WebSearchHit[\"sources\"] = [];\n\tconst scanLimit = Math.min(value.length, MAX_HISTORICAL_SOURCE_SCAN);\n\tfor (let index = 0; index < scanLimit && sources.length < 2; index++) {\n\t\tconst source = value[index];\n\t\tif ((source === \"MiniMax\" || source === \"DeepSeek\") && !sources.includes(source)) sources.push(source);\n\t}\n\treturn sources;\n}\n\nfunction prepareHit(value: unknown): WebSearchHit | undefined {\n\tif (!value || typeof value !== \"object\") return undefined;\n\tconst hit = value as Record<string, unknown>;\n\tconst url = normalizeUrl(hit.url);\n\tif (!url) return undefined;\n\treturn {\n\t\ttitle: boundSingleLineText(hit.title, MAX_TITLE_LENGTH) ?? url,\n\t\turl,\n\t\tsnippet: boundSingleLineText(hit.snippet, MAX_SNIPPET_LENGTH),\n\t\tsources: canonicalSources(hit.sources),\n\t};\n}\n\nfunction usableHits(details: WebSearchDetails): WebSearchHit[] {\n\tconst hits = Array.isArray(details.hits) ? details.hits : [];\n\tconst prepared: WebSearchHit[] = [];\n\tconst scanLimit = Math.min(hits.length, MAX_HISTORICAL_HIT_SCAN);\n\tfor (let index = 0; index < scanLimit && prepared.length < MAX_OUTPUT_HITS; index++) {\n\t\tconst hit = prepareHit(hits[index]);\n\t\tif (hit) prepared.push(hit);\n\t}\n\treturn prepared;\n}\n\ninterface PreparedResults {\n\tengine: WebSearchDetails[\"engine\"];\n\thits: WebSearchHit[];\n\tsynthesis?: string;\n\trelatedSearches: string[];\n}\n\n/** Historical details enter here; Markdown rendering only consumes bounded content. */\nexport function prepareResults(details: WebSearchDetails): PreparedResults {\n\tconst relatedSearches: string[] = [];\n\tconst historicalRelated = Array.isArray(details.relatedSearches) ? details.relatedSearches : [];\n\tconst relatedScanLimit = Math.min(historicalRelated.length, MAX_HISTORICAL_RELATED_SCAN);\n\tfor (let index = 0; index < relatedScanLimit && relatedSearches.length < MAX_RELATED_SEARCHES; index++) {\n\t\tconst related = boundSingleLineText(historicalRelated[index], MAX_RELATED_SEARCH_LENGTH);\n\t\tif (related) relatedSearches.push(related);\n\t}\n\treturn {\n\t\tengine: details.engine,\n\t\thits: usableHits(details),\n\t\tsynthesis: boundMultilineText(details.deepseekSynthesis, MAX_SYNTHESIS_LENGTH),\n\t\trelatedSearches,\n\t};\n}\n\n/**\n * Sources, synthesis, and related-search sections shared by model output and\n * the expanded TUI. This function adds no model instructions.\n */\nexport function formatResultsMarkdown({ engine, hits, synthesis, relatedSearches }: PreparedResults): string {\n\tconst parts: string[] = [];\n\n\tif (hits.length > 0) {\n\t\tparts.push(`## Web Sources (${hits.length} found via ${getEngineLabel(engine)})\\n`);\n\n\t\thits.forEach((hit, index) => {\n\t\t\tconst sourceTag = hit.sources.length > 1 ? ` — *(found by ${hit.sources.join(\" & \")})*` : \"\";\n\t\t\tparts.push(`${index + 1}. **[${escapeMarkdownText(hit.title)}](<${hit.url}>)**${sourceTag}`);\n\t\t\tif (hit.snippet) parts.push(` - ${escapeMarkdownText(hit.snippet)}`);\n\t\t});\n\t\tparts.push(\"\");\n\t}\n\n\tif (synthesis) {\n\t\tparts.push(\"## DeepSeek Search Synthesis\\n\");\n\t\tparts.push(escapeMarkdownText(synthesis));\n\t\tparts.push(\"\");\n\t}\n\n\tif (relatedSearches.length > 0) {\n\t\tparts.push(\"## Related Searches\\n\");\n\t\tparts.push(relatedSearches.map((related) => `- ${escapeMarkdownText(related)}`).join(\"\\n\"));\n\t\tparts.push(\"\");\n\t}\n\n\treturn parts.join(\"\\n\");\n}\n\n/** Format a structured result payload for the main agent. */\nexport function formatSearchOutput(details: WebSearchDetails): string {\n\tif (details.status === \"disabled\") return WEB_SEARCH_DISABLED_MESSAGE;\n\n\tconst boundedQuery = boundSingleLineText(details.query, MAX_QUERY_LENGTH) ?? \"\";\n\tif (details.status === \"error\") {\n\t\tconst errorMessage =\n\t\t\tboundSingleLineText(details.errorMessage, MAX_ERROR_MESSAGE_LENGTH) ?? \"Unknown search error\";\n\t\treturn `Web search failed for \"${boundedQuery}\": ${errorMessage}`;\n\t}\n\n\tconst prepared = prepareResults(details);\n\tconst hasSources = prepared.hits.length > 0;\n\tconst hasSynthesis = prepared.synthesis !== undefined;\n\tif (!hasSources && !hasSynthesis) {\n\t\treturn `No search results found for \"${boundedQuery}\". Try rephrasing with different keywords.`;\n\t}\n\n\tconst parts = [`# Web Search Results for: \"${boundedQuery}\"\\n`, formatResultsMarkdown(prepared)];\n\tif (hasSources) {\n\t\tparts.push(\n\t\t\t\"---\",\n\t\t\t\"Use these search results to answer the user, and cite the relevant source URLs in your response.\",\n\t\t);\n\t}\n\treturn parts.join(\"\\n\");\n}\n"]}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* web_search — Pi-native Web Search extension combining MiniMax and DeepSeek search engines.
|
|
3
|
-
*/
|
|
4
|
-
import type { ExtensionAPI } from "../../core/extensions/types.ts";
|
|
5
|
-
export default function webSearch(pi: ExtensionAPI): void;
|
|
6
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAenE,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAyCxD"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* web_search — Pi-native Web Search extension combining MiniMax and DeepSeek search engines.
|
|
3
|
-
*/
|
|
4
|
-
import { configuredEngine, resolveSearchCredentials } from "./auth.js";
|
|
5
|
-
import { getWebSearchPromptGuidelines, WEB_SEARCH_DESCRIPTION, WEB_SEARCH_LABEL, WEB_SEARCH_PROMPT_SNIPPET, WEB_SEARCH_TOOL_NAME, } from "./constants.js";
|
|
6
|
-
import { executeWebSearch } from "./execute.js";
|
|
7
|
-
import { formatSearchOutput } from "./format.js";
|
|
8
|
-
import { renderWebSearchCall, renderWebSearchResult } from "./render.js";
|
|
9
|
-
import { normalizeWebSearchParams, WebSearchParamsSchema } from "./schema.js";
|
|
10
|
-
export default function webSearch(pi) {
|
|
11
|
-
pi.registerTool({
|
|
12
|
-
name: WEB_SEARCH_TOOL_NAME,
|
|
13
|
-
label: WEB_SEARCH_LABEL,
|
|
14
|
-
description: WEB_SEARCH_DESCRIPTION,
|
|
15
|
-
promptSnippet: WEB_SEARCH_PROMPT_SNIPPET,
|
|
16
|
-
promptGuidelines: getWebSearchPromptGuidelines(),
|
|
17
|
-
parameters: WebSearchParamsSchema,
|
|
18
|
-
prepareArguments: normalizeWebSearchParams,
|
|
19
|
-
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
20
|
-
const credentials = await resolveSearchCredentials(ctx.modelRuntime);
|
|
21
|
-
const details = await executeWebSearch(params, credentials, signal, onUpdate);
|
|
22
|
-
return {
|
|
23
|
-
content: [{ type: "text", text: formatSearchOutput(details) }],
|
|
24
|
-
details,
|
|
25
|
-
};
|
|
26
|
-
},
|
|
27
|
-
renderCall: renderWebSearchCall,
|
|
28
|
-
renderResult: renderWebSearchResult,
|
|
29
|
-
});
|
|
30
|
-
// Keep the tool out of the model's tool set (and system prompt) when no search
|
|
31
|
-
// credentials are configured. Re-evaluated on every session start (startup,
|
|
32
|
-
// /new, /reload, resume, fork), so /login takes effect from the next session
|
|
33
|
-
// onward; the tool stays registered for /tools and historical rendering.
|
|
34
|
-
pi.on("session_start", async (_event, ctx) => {
|
|
35
|
-
const credentials = await resolveSearchCredentials(ctx.modelRuntime);
|
|
36
|
-
if (configuredEngine(credentials) !== "none")
|
|
37
|
-
return;
|
|
38
|
-
const active = new Set(pi.getActiveTools());
|
|
39
|
-
if (active.delete(WEB_SEARCH_TOOL_NAME))
|
|
40
|
-
pi.setActiveTools([...active]);
|
|
41
|
-
});
|
|
42
|
-
pi.on("tool_result", async (event) => {
|
|
43
|
-
if (event.toolName !== WEB_SEARCH_TOOL_NAME)
|
|
44
|
-
return;
|
|
45
|
-
const details = event.details;
|
|
46
|
-
if (details?.status === "error")
|
|
47
|
-
return { isError: true };
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/web-search/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EACN,4BAA4B,EAC5B,sBAAsB,EACtB,gBAAgB,EAChB,yBAAyB,EACzB,oBAAoB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAA6B,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAG9E,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAgB;IACjD,EAAE,CAAC,YAAY,CAAuE;QACrF,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,sBAAsB;QACnC,aAAa,EAAE,yBAAyB;QACxC,gBAAgB,EAAE,4BAA4B,EAAE;QAChD,UAAU,EAAE,qBAAqB;QACjC,gBAAgB,EAAE,wBAAwB;QAE1C,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG;YACvD,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAE9E,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9D,OAAO;aACP,CAAC;QACH,CAAC;QAED,UAAU,EAAE,mBAAmB;QAE/B,YAAY,EAAE,qBAAqB;KACnC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,4EAA4E;IAC5E,6EAA6E;IAC7E,yEAAyE;IACzE,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACrE,IAAI,gBAAgB,CAAC,WAAW,CAAC,KAAK,MAAM;YAAE,OAAO;QACrD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAAE,EAAE,CAAC,cAAc,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACpC,IAAI,KAAK,CAAC,QAAQ,KAAK,oBAAoB;YAAE,OAAO;QACpD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAuC,CAAC;QAC9D,IAAI,OAAO,EAAE,MAAM,KAAK,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * web_search — Pi-native Web Search extension combining MiniMax and DeepSeek search engines.\n */\n\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { configuredEngine, resolveSearchCredentials } from \"./auth.ts\";\nimport {\n\tgetWebSearchPromptGuidelines,\n\tWEB_SEARCH_DESCRIPTION,\n\tWEB_SEARCH_LABEL,\n\tWEB_SEARCH_PROMPT_SNIPPET,\n\tWEB_SEARCH_TOOL_NAME,\n} from \"./constants.ts\";\nimport { executeWebSearch } from \"./execute.ts\";\nimport { formatSearchOutput } from \"./format.ts\";\nimport { renderWebSearchCall, renderWebSearchResult, type WebSearchRenderState } from \"./render.ts\";\nimport { normalizeWebSearchParams, WebSearchParamsSchema } from \"./schema.ts\";\nimport type { WebSearchDetails } from \"./types.ts\";\n\nexport default function webSearch(pi: ExtensionAPI): void {\n\tpi.registerTool<typeof WebSearchParamsSchema, WebSearchDetails, WebSearchRenderState>({\n\t\tname: WEB_SEARCH_TOOL_NAME,\n\t\tlabel: WEB_SEARCH_LABEL,\n\t\tdescription: WEB_SEARCH_DESCRIPTION,\n\t\tpromptSnippet: WEB_SEARCH_PROMPT_SNIPPET,\n\t\tpromptGuidelines: getWebSearchPromptGuidelines(),\n\t\tparameters: WebSearchParamsSchema,\n\t\tprepareArguments: normalizeWebSearchParams,\n\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tconst credentials = await resolveSearchCredentials(ctx.modelRuntime);\n\t\t\tconst details = await executeWebSearch(params, credentials, signal, onUpdate);\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: formatSearchOutput(details) }],\n\t\t\t\tdetails,\n\t\t\t};\n\t\t},\n\n\t\trenderCall: renderWebSearchCall,\n\n\t\trenderResult: renderWebSearchResult,\n\t});\n\n\t// Keep the tool out of the model's tool set (and system prompt) when no search\n\t// credentials are configured. Re-evaluated on every session start (startup,\n\t// /new, /reload, resume, fork), so /login takes effect from the next session\n\t// onward; the tool stays registered for /tools and historical rendering.\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tconst credentials = await resolveSearchCredentials(ctx.modelRuntime);\n\t\tif (configuredEngine(credentials) !== \"none\") return;\n\t\tconst active = new Set(pi.getActiveTools());\n\t\tif (active.delete(WEB_SEARCH_TOOL_NAME)) pi.setActiveTools([...active]);\n\t});\n\n\tpi.on(\"tool_result\", async (event) => {\n\t\tif (event.toolName !== WEB_SEARCH_TOOL_NAME) return;\n\t\tconst details = event.details as WebSearchDetails | undefined;\n\t\tif (details?.status === \"error\") return { isError: true };\n\t});\n}\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deepseek.ts — DeepSeek Messages API search provider (claude-sonnet-search model with web_search_20250305).
|
|
3
|
-
*/
|
|
4
|
-
import type { ProviderSearchResult } from "../types.ts";
|
|
5
|
-
export interface DeepSeekSearchOptions {
|
|
6
|
-
query: string;
|
|
7
|
-
apiKey: string;
|
|
8
|
-
baseUrl?: string;
|
|
9
|
-
model?: string;
|
|
10
|
-
signal?: AbortSignal;
|
|
11
|
-
}
|
|
12
|
-
export declare function searchDeepSeek(options: DeepSeekSearchOptions): Promise<ProviderSearchResult>;
|
|
13
|
-
//# sourceMappingURL=deepseek.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../../../src/extensions/web-search/providers/deepseek.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAG3E,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAkED,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoDlG"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* deepseek.ts — DeepSeek Messages API search provider (claude-sonnet-search model with web_search_20250305).
|
|
3
|
-
*/
|
|
4
|
-
import { MAX_PROVIDER_HIT_SCAN } from "../results.js";
|
|
5
|
-
import { postJson } from "./http.js";
|
|
6
|
-
const DEFAULT_DEEPSEEK_MESSAGES_ENDPOINT = "https://api.deepseek.com/anthropic/v1/messages";
|
|
7
|
-
const DEFAULT_DEEPSEEK_SEARCH_MODEL = "claude-sonnet-search";
|
|
8
|
-
function isRecord(value) {
|
|
9
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
10
|
-
}
|
|
11
|
-
function stringField(record, key) {
|
|
12
|
-
const value = record[key];
|
|
13
|
-
return typeof value === "string" ? value : undefined;
|
|
14
|
-
}
|
|
15
|
-
function parseSearchHit(value) {
|
|
16
|
-
if (!isRecord(value) || value.type !== "web_search_result")
|
|
17
|
-
return undefined;
|
|
18
|
-
const url = stringField(value, "url")?.trim();
|
|
19
|
-
if (!url)
|
|
20
|
-
return undefined;
|
|
21
|
-
const title = stringField(value, "title")?.trim();
|
|
22
|
-
const pageAge = stringField(value, "page_age")?.trim();
|
|
23
|
-
return {
|
|
24
|
-
title: title || url,
|
|
25
|
-
url,
|
|
26
|
-
date: pageAge || undefined,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
function errorMessage(value) {
|
|
30
|
-
if (!isRecord(value))
|
|
31
|
-
return undefined;
|
|
32
|
-
return stringField(value, "message") || stringField(value, "type") || "Unknown error";
|
|
33
|
-
}
|
|
34
|
-
function searchToolErrorMessage(value) {
|
|
35
|
-
return (stringField(value, "message")?.trim() ||
|
|
36
|
-
stringField(value, "error_code")?.trim() ||
|
|
37
|
-
stringField(value, "type")?.trim() ||
|
|
38
|
-
"Unknown search tool error");
|
|
39
|
-
}
|
|
40
|
-
function parseSearchToolContent(value) {
|
|
41
|
-
if (Array.isArray(value)) {
|
|
42
|
-
const hits = [];
|
|
43
|
-
for (const item of value) {
|
|
44
|
-
const hit = parseSearchHit(item);
|
|
45
|
-
if (!hit)
|
|
46
|
-
throw new Error("DeepSeek returned malformed web_search_tool_result content");
|
|
47
|
-
if (hits.length < MAX_PROVIDER_HIT_SCAN)
|
|
48
|
-
hits.push(hit);
|
|
49
|
-
}
|
|
50
|
-
return hits;
|
|
51
|
-
}
|
|
52
|
-
if (isRecord(value)) {
|
|
53
|
-
if (value.type === "web_search_tool_result_error" ||
|
|
54
|
-
value.error_code !== undefined ||
|
|
55
|
-
value.message !== undefined) {
|
|
56
|
-
throw new Error(`DeepSeek web search failed: ${searchToolErrorMessage(value)}`);
|
|
57
|
-
}
|
|
58
|
-
throw new Error("DeepSeek returned malformed web_search_tool_result content");
|
|
59
|
-
}
|
|
60
|
-
throw new Error("DeepSeek returned malformed web_search_tool_result content");
|
|
61
|
-
}
|
|
62
|
-
export async function searchDeepSeek(options) {
|
|
63
|
-
const endpoint = options.baseUrl || DEFAULT_DEEPSEEK_MESSAGES_ENDPOINT;
|
|
64
|
-
const model = options.model || DEFAULT_DEEPSEEK_SEARCH_MODEL;
|
|
65
|
-
const rawData = await postJson(endpoint, {
|
|
66
|
-
"Content-Type": "application/json",
|
|
67
|
-
"x-api-key": options.apiKey,
|
|
68
|
-
Authorization: `Bearer ${options.apiKey}`,
|
|
69
|
-
"anthropic-version": "2023-06-01",
|
|
70
|
-
}, {
|
|
71
|
-
model,
|
|
72
|
-
max_tokens: 1024,
|
|
73
|
-
messages: [{ role: "user", content: options.query }],
|
|
74
|
-
tools: [{ type: "web_search_20250305", name: "web_search" }],
|
|
75
|
-
}, options.signal, 90_000, "DeepSeek Messages search API");
|
|
76
|
-
const data = isRecord(rawData) ? rawData : {};
|
|
77
|
-
const upstreamError = errorMessage(data.error);
|
|
78
|
-
if (upstreamError)
|
|
79
|
-
throw new Error(`DeepSeek search error: ${upstreamError}`);
|
|
80
|
-
const hits = [];
|
|
81
|
-
const synthesisParts = [];
|
|
82
|
-
let sawStructuredResult = false;
|
|
83
|
-
const content = Array.isArray(data.content) ? data.content : [];
|
|
84
|
-
for (const value of content) {
|
|
85
|
-
if (!isRecord(value))
|
|
86
|
-
continue;
|
|
87
|
-
if (value.type === "web_search_tool_result") {
|
|
88
|
-
sawStructuredResult = true;
|
|
89
|
-
for (const hit of parseSearchToolContent(value.content)) {
|
|
90
|
-
if (hits.length < MAX_PROVIDER_HIT_SCAN)
|
|
91
|
-
hits.push(hit);
|
|
92
|
-
}
|
|
93
|
-
continue;
|
|
94
|
-
}
|
|
95
|
-
if (value.type === "text") {
|
|
96
|
-
const text = stringField(value, "text")?.trim();
|
|
97
|
-
if (text)
|
|
98
|
-
synthesisParts.push(text);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
if (!sawStructuredResult) {
|
|
102
|
-
throw new Error("DeepSeek returned no web_search_tool_result block");
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
source: "DeepSeek",
|
|
106
|
-
hits,
|
|
107
|
-
synthesisText: synthesisParts.length > 0 ? synthesisParts.join("\n\n") : undefined,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=deepseek.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../../../src/extensions/web-search/providers/deepseek.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * deepseek.ts — DeepSeek Messages API search provider (claude-sonnet-search model with web_search_20250305).\n */\n\nimport { MAX_PROVIDER_HIT_SCAN } from \"../results.ts\";\nimport type { ProviderSearchHit, ProviderSearchResult } from \"../types.ts\";\nimport { postJson } from \"./http.ts\";\n\nexport interface DeepSeekSearchOptions {\n\tquery: string;\n\tapiKey: string;\n\tbaseUrl?: string;\n\tmodel?: string;\n\tsignal?: AbortSignal;\n}\n\nconst DEFAULT_DEEPSEEK_MESSAGES_ENDPOINT = \"https://api.deepseek.com/anthropic/v1/messages\";\nconst DEFAULT_DEEPSEEK_SEARCH_MODEL = \"claude-sonnet-search\";\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is JsonRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringField(record: JsonRecord, key: string): string | undefined {\n\tconst value = record[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction parseSearchHit(value: unknown): ProviderSearchHit | undefined {\n\tif (!isRecord(value) || value.type !== \"web_search_result\") return undefined;\n\tconst url = stringField(value, \"url\")?.trim();\n\tif (!url) return undefined;\n\tconst title = stringField(value, \"title\")?.trim();\n\tconst pageAge = stringField(value, \"page_age\")?.trim();\n\treturn {\n\t\ttitle: title || url,\n\t\turl,\n\t\tdate: pageAge || undefined,\n\t};\n}\n\nfunction errorMessage(value: unknown): string | undefined {\n\tif (!isRecord(value)) return undefined;\n\treturn stringField(value, \"message\") || stringField(value, \"type\") || \"Unknown error\";\n}\n\nfunction searchToolErrorMessage(value: JsonRecord): string {\n\treturn (\n\t\tstringField(value, \"message\")?.trim() ||\n\t\tstringField(value, \"error_code\")?.trim() ||\n\t\tstringField(value, \"type\")?.trim() ||\n\t\t\"Unknown search tool error\"\n\t);\n}\n\nfunction parseSearchToolContent(value: unknown): ProviderSearchHit[] {\n\tif (Array.isArray(value)) {\n\t\tconst hits: ProviderSearchHit[] = [];\n\t\tfor (const item of value) {\n\t\t\tconst hit = parseSearchHit(item);\n\t\t\tif (!hit) throw new Error(\"DeepSeek returned malformed web_search_tool_result content\");\n\t\t\tif (hits.length < MAX_PROVIDER_HIT_SCAN) hits.push(hit);\n\t\t}\n\t\treturn hits;\n\t}\n\tif (isRecord(value)) {\n\t\tif (\n\t\t\tvalue.type === \"web_search_tool_result_error\" ||\n\t\t\tvalue.error_code !== undefined ||\n\t\t\tvalue.message !== undefined\n\t\t) {\n\t\t\tthrow new Error(`DeepSeek web search failed: ${searchToolErrorMessage(value)}`);\n\t\t}\n\t\tthrow new Error(\"DeepSeek returned malformed web_search_tool_result content\");\n\t}\n\tthrow new Error(\"DeepSeek returned malformed web_search_tool_result content\");\n}\n\nexport async function searchDeepSeek(options: DeepSeekSearchOptions): Promise<ProviderSearchResult> {\n\tconst endpoint = options.baseUrl || DEFAULT_DEEPSEEK_MESSAGES_ENDPOINT;\n\tconst model = options.model || DEFAULT_DEEPSEEK_SEARCH_MODEL;\n\tconst rawData = await postJson(\n\t\tendpoint,\n\t\t{\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"x-api-key\": options.apiKey,\n\t\t\tAuthorization: `Bearer ${options.apiKey}`,\n\t\t\t\"anthropic-version\": \"2023-06-01\",\n\t\t},\n\t\t{\n\t\t\tmodel,\n\t\t\tmax_tokens: 1024,\n\t\t\tmessages: [{ role: \"user\", content: options.query }],\n\t\t\ttools: [{ type: \"web_search_20250305\", name: \"web_search\" }],\n\t\t},\n\t\toptions.signal,\n\t\t90_000,\n\t\t\"DeepSeek Messages search API\",\n\t);\n\tconst data = isRecord(rawData) ? rawData : {};\n\tconst upstreamError = errorMessage(data.error);\n\tif (upstreamError) throw new Error(`DeepSeek search error: ${upstreamError}`);\n\n\tconst hits: ProviderSearchHit[] = [];\n\tconst synthesisParts: string[] = [];\n\tlet sawStructuredResult = false;\n\tconst content = Array.isArray(data.content) ? data.content : [];\n\tfor (const value of content) {\n\t\tif (!isRecord(value)) continue;\n\t\tif (value.type === \"web_search_tool_result\") {\n\t\t\tsawStructuredResult = true;\n\t\t\tfor (const hit of parseSearchToolContent(value.content)) {\n\t\t\t\tif (hits.length < MAX_PROVIDER_HIT_SCAN) hits.push(hit);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (value.type === \"text\") {\n\t\t\tconst text = stringField(value, \"text\")?.trim();\n\t\t\tif (text) synthesisParts.push(text);\n\t\t}\n\t}\n\tif (!sawStructuredResult) {\n\t\tthrow new Error(\"DeepSeek returned no web_search_tool_result block\");\n\t}\n\n\treturn {\n\t\tsource: \"DeepSeek\",\n\t\thits,\n\t\tsynthesisText: synthesisParts.length > 0 ? synthesisParts.join(\"\\n\\n\") : undefined,\n\t};\n}\n"]}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/** JSON POST plumbing for search providers. */
|
|
2
|
-
/** POST a JSON body and return the parsed response. */
|
|
3
|
-
export declare function postJson(url: string, headers: Record<string, string>, body: unknown, signal: AbortSignal | undefined, timeoutMs: number, errorLabel: string): Promise<unknown>;
|
|
4
|
-
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/extensions/web-search/providers/http.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAU/C,uDAAuD;AACvD,wBAAsB,QAAQ,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAiClB"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/** JSON POST plumbing for search providers. */
|
|
2
|
-
import { readResponseTextBounded } from "../../../utils/http-response.js";
|
|
3
|
-
/** Successful response bodies are model-facing; keep them bounded. */
|
|
4
|
-
const MAX_RESPONSE_BODY_BYTES = 2 * 1024 * 1024;
|
|
5
|
-
/** Error bodies are surfaced to the model; keep them bounded. */
|
|
6
|
-
const MAX_ERROR_BODY_BYTES = 200;
|
|
7
|
-
/** POST a JSON body and return the parsed response. */
|
|
8
|
-
export async function postJson(url, headers, body, signal, timeoutMs, errorLabel) {
|
|
9
|
-
const timeoutSignal = AbortSignal.timeout(timeoutMs);
|
|
10
|
-
const requestSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
|
|
11
|
-
const response = await fetch(url, {
|
|
12
|
-
method: "POST",
|
|
13
|
-
headers,
|
|
14
|
-
body: JSON.stringify(body),
|
|
15
|
-
signal: requestSignal,
|
|
16
|
-
});
|
|
17
|
-
if (!response.ok) {
|
|
18
|
-
let errorText = "";
|
|
19
|
-
try {
|
|
20
|
-
errorText = await readResponseTextBounded(response, {
|
|
21
|
-
maxBytes: MAX_ERROR_BODY_BYTES,
|
|
22
|
-
signal: requestSignal,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
requestSignal.throwIfAborted();
|
|
27
|
-
}
|
|
28
|
-
throw new Error(`${errorLabel} returned HTTP ${response.status} ${response.statusText}: ${errorText}`);
|
|
29
|
-
}
|
|
30
|
-
const responseText = await readResponseTextBounded(response, {
|
|
31
|
-
maxBytes: MAX_RESPONSE_BODY_BYTES,
|
|
32
|
-
overflowMessage: `${errorLabel} response exceeded ${MAX_RESPONSE_BODY_BYTES} bytes`,
|
|
33
|
-
signal: requestSignal,
|
|
34
|
-
});
|
|
35
|
-
try {
|
|
36
|
-
return JSON.parse(responseText);
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
throw new Error(`${errorLabel} returned invalid JSON`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=http.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../../src/extensions/web-search/providers/http.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAE/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,sEAAsE;AACtE,MAAM,uBAAuB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,iEAAiE;AACjE,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,GAAW,EACX,OAA+B,EAC/B,IAAa,EACb,MAA+B,EAC/B,SAAiB,EACjB,UAAkB;IAElB,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACxF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QACjC,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,aAAa;KACrB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC;YACJ,SAAS,GAAG,MAAM,uBAAuB,CAAC,QAAQ,EAAE;gBACnD,QAAQ,EAAE,oBAAoB;gBAC9B,MAAM,EAAE,aAAa;aACrB,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACR,aAAa,CAAC,cAAc,EAAE,CAAC;QAChC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,kBAAkB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,QAAQ,EAAE;QAC5D,QAAQ,EAAE,uBAAuB;QACjC,eAAe,EAAE,GAAG,UAAU,sBAAsB,uBAAuB,QAAQ;QACnF,MAAM,EAAE,aAAa;KACrB,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,wBAAwB,CAAC,CAAC;IACxD,CAAC;AACF,CAAC","sourcesContent":["/** JSON POST plumbing for search providers. */\n\nimport { readResponseTextBounded } from \"../../../utils/http-response.ts\";\n\n/** Successful response bodies are model-facing; keep them bounded. */\nconst MAX_RESPONSE_BODY_BYTES = 2 * 1024 * 1024;\n\n/** Error bodies are surfaced to the model; keep them bounded. */\nconst MAX_ERROR_BODY_BYTES = 200;\n\n/** POST a JSON body and return the parsed response. */\nexport async function postJson(\n\turl: string,\n\theaders: Record<string, string>,\n\tbody: unknown,\n\tsignal: AbortSignal | undefined,\n\ttimeoutMs: number,\n\terrorLabel: string,\n): Promise<unknown> {\n\tconst timeoutSignal = AbortSignal.timeout(timeoutMs);\n\tconst requestSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: JSON.stringify(body),\n\t\tsignal: requestSignal,\n\t});\n\n\tif (!response.ok) {\n\t\tlet errorText = \"\";\n\t\ttry {\n\t\t\terrorText = await readResponseTextBounded(response, {\n\t\t\t\tmaxBytes: MAX_ERROR_BODY_BYTES,\n\t\t\t\tsignal: requestSignal,\n\t\t\t});\n\t\t} catch {\n\t\t\trequestSignal.throwIfAborted();\n\t\t}\n\t\tthrow new Error(`${errorLabel} returned HTTP ${response.status} ${response.statusText}: ${errorText}`);\n\t}\n\n\tconst responseText = await readResponseTextBounded(response, {\n\t\tmaxBytes: MAX_RESPONSE_BODY_BYTES,\n\t\toverflowMessage: `${errorLabel} response exceeded ${MAX_RESPONSE_BODY_BYTES} bytes`,\n\t\tsignal: requestSignal,\n\t});\n\ttry {\n\t\treturn JSON.parse(responseText);\n\t} catch {\n\t\tthrow new Error(`${errorLabel} returned invalid JSON`);\n\t}\n}\n"]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* minimax.ts — MiniMax Coding Plan Search REST API provider.
|
|
3
|
-
*/
|
|
4
|
-
import type { ProviderSearchResult } from "../types.ts";
|
|
5
|
-
export interface MiniMaxSearchOptions {
|
|
6
|
-
query: string;
|
|
7
|
-
apiKey: string;
|
|
8
|
-
apiHost?: string;
|
|
9
|
-
signal?: AbortSignal;
|
|
10
|
-
}
|
|
11
|
-
export declare function searchMiniMax(options: MiniMaxSearchOptions): Promise<ProviderSearchResult>;
|
|
12
|
-
//# sourceMappingURL=minimax.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"minimax.d.ts","sourceRoot":"","sources":["../../../../src/extensions/web-search/providers/minimax.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAG3E,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAyBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA4ChG"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* minimax.ts — MiniMax Coding Plan Search REST API provider.
|
|
3
|
-
*/
|
|
4
|
-
import { MAX_PROVIDER_HIT_SCAN, MAX_PROVIDER_RELATED_SCAN, MAX_RELATED_SEARCHES } from "../results.js";
|
|
5
|
-
import { postJson } from "./http.js";
|
|
6
|
-
function isRecord(value) {
|
|
7
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
8
|
-
}
|
|
9
|
-
function stringField(record, key) {
|
|
10
|
-
const value = record[key];
|
|
11
|
-
return typeof value === "string" ? value : undefined;
|
|
12
|
-
}
|
|
13
|
-
function parseSearchHit(value) {
|
|
14
|
-
if (!isRecord(value))
|
|
15
|
-
return undefined;
|
|
16
|
-
const url = stringField(value, "link")?.trim();
|
|
17
|
-
if (!url)
|
|
18
|
-
return undefined;
|
|
19
|
-
return {
|
|
20
|
-
title: stringField(value, "title")?.trim() || url,
|
|
21
|
-
url,
|
|
22
|
-
snippet: stringField(value, "snippet")?.trim() || undefined,
|
|
23
|
-
date: stringField(value, "date")?.trim() || undefined,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
export async function searchMiniMax(options) {
|
|
27
|
-
const host = options.apiHost?.replace(/\/+$/, "") || "https://api.minimaxi.com";
|
|
28
|
-
const rawData = await postJson(`${host}/v1/coding_plan/search`, {
|
|
29
|
-
"Content-Type": "application/json",
|
|
30
|
-
Authorization: `Bearer ${options.apiKey}`,
|
|
31
|
-
}, { q: options.query.trim() }, options.signal, 60_000, "MiniMax search API");
|
|
32
|
-
const data = isRecord(rawData) ? rawData : {};
|
|
33
|
-
const baseResponse = isRecord(data.base_resp) ? data.base_resp : undefined;
|
|
34
|
-
const statusCode = baseResponse?.status_code;
|
|
35
|
-
if (baseResponse && typeof statusCode === "number" && statusCode !== 0) {
|
|
36
|
-
throw new Error(`MiniMax search failed: [${statusCode}] ${stringField(baseResponse, "status_msg") ?? "Unknown error"}`);
|
|
37
|
-
}
|
|
38
|
-
const hits = [];
|
|
39
|
-
const organic = Array.isArray(data.organic) ? data.organic : [];
|
|
40
|
-
const hitScanLimit = Math.min(organic.length, MAX_PROVIDER_HIT_SCAN);
|
|
41
|
-
for (let index = 0; index < hitScanLimit; index++) {
|
|
42
|
-
const hit = parseSearchHit(organic[index]);
|
|
43
|
-
if (hit)
|
|
44
|
-
hits.push(hit);
|
|
45
|
-
}
|
|
46
|
-
const relatedSearches = [];
|
|
47
|
-
const related = Array.isArray(data.related_searches) ? data.related_searches : [];
|
|
48
|
-
const relatedScanLimit = Math.min(related.length, MAX_PROVIDER_RELATED_SCAN);
|
|
49
|
-
for (let index = 0; index < relatedScanLimit && relatedSearches.length < MAX_RELATED_SEARCHES; index++) {
|
|
50
|
-
const value = related[index];
|
|
51
|
-
const query = isRecord(value) ? stringField(value, "query")?.trim() : undefined;
|
|
52
|
-
if (query)
|
|
53
|
-
relatedSearches.push(query);
|
|
54
|
-
}
|
|
55
|
-
return {
|
|
56
|
-
source: "MiniMax",
|
|
57
|
-
hits,
|
|
58
|
-
relatedSearches: relatedSearches.length > 0 ? relatedSearches : undefined,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=minimax.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"minimax.js","sourceRoot":"","sources":["../../../../src/extensions/web-search/providers/minimax.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * minimax.ts — MiniMax Coding Plan Search REST API provider.\n */\n\nimport { MAX_PROVIDER_HIT_SCAN, MAX_PROVIDER_RELATED_SCAN, MAX_RELATED_SEARCHES } from \"../results.ts\";\nimport type { ProviderSearchHit, ProviderSearchResult } from \"../types.ts\";\nimport { postJson } from \"./http.ts\";\n\nexport interface MiniMaxSearchOptions {\n\tquery: string;\n\tapiKey: string;\n\tapiHost?: string;\n\tsignal?: AbortSignal;\n}\n\ntype JsonRecord = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is JsonRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction stringField(record: JsonRecord, key: string): string | undefined {\n\tconst value = record[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction parseSearchHit(value: unknown): ProviderSearchHit | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst url = stringField(value, \"link\")?.trim();\n\tif (!url) return undefined;\n\treturn {\n\t\ttitle: stringField(value, \"title\")?.trim() || url,\n\t\turl,\n\t\tsnippet: stringField(value, \"snippet\")?.trim() || undefined,\n\t\tdate: stringField(value, \"date\")?.trim() || undefined,\n\t};\n}\n\nexport async function searchMiniMax(options: MiniMaxSearchOptions): Promise<ProviderSearchResult> {\n\tconst host = options.apiHost?.replace(/\\/+$/, \"\") || \"https://api.minimaxi.com\";\n\tconst rawData = await postJson(\n\t\t`${host}/v1/coding_plan/search`,\n\t\t{\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: `Bearer ${options.apiKey}`,\n\t\t},\n\t\t{ q: options.query.trim() },\n\t\toptions.signal,\n\t\t60_000,\n\t\t\"MiniMax search API\",\n\t);\n\tconst data = isRecord(rawData) ? rawData : {};\n\tconst baseResponse = isRecord(data.base_resp) ? data.base_resp : undefined;\n\tconst statusCode = baseResponse?.status_code;\n\tif (baseResponse && typeof statusCode === \"number\" && statusCode !== 0) {\n\t\tthrow new Error(\n\t\t\t`MiniMax search failed: [${statusCode}] ${stringField(baseResponse, \"status_msg\") ?? \"Unknown error\"}`,\n\t\t);\n\t}\n\n\tconst hits: ProviderSearchHit[] = [];\n\tconst organic = Array.isArray(data.organic) ? data.organic : [];\n\tconst hitScanLimit = Math.min(organic.length, MAX_PROVIDER_HIT_SCAN);\n\tfor (let index = 0; index < hitScanLimit; index++) {\n\t\tconst hit = parseSearchHit(organic[index]);\n\t\tif (hit) hits.push(hit);\n\t}\n\n\tconst relatedSearches: string[] = [];\n\tconst related = Array.isArray(data.related_searches) ? data.related_searches : [];\n\tconst relatedScanLimit = Math.min(related.length, MAX_PROVIDER_RELATED_SCAN);\n\tfor (let index = 0; index < relatedScanLimit && relatedSearches.length < MAX_RELATED_SEARCHES; index++) {\n\t\tconst value = related[index];\n\t\tconst query = isRecord(value) ? stringField(value, \"query\")?.trim() : undefined;\n\t\tif (query) relatedSearches.push(query);\n\t}\n\n\treturn {\n\t\tsource: \"MiniMax\",\n\t\thits,\n\t\trelatedSearches: relatedSearches.length > 0 ? relatedSearches : undefined,\n\t};\n}\n"]}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* render.ts — TUI rendering for web_search tool (call, collapsed summary, expanded view).
|
|
3
|
-
*/
|
|
4
|
-
import { type Component } from "@earendil-works/pi-tui";
|
|
5
|
-
import type { AgentToolResult, ToolRenderContext, ToolRenderResultOptions } from "../../core/extensions/types.ts";
|
|
6
|
-
import { type Theme } from "../../modes/interactive/theme/theme.ts";
|
|
7
|
-
import type { WebSearchDetails } from "./types.ts";
|
|
8
|
-
export interface WebSearchRenderState {
|
|
9
|
-
startedAt?: number;
|
|
10
|
-
dispose?: () => void;
|
|
11
|
-
refreshTimer?: ReturnType<typeof setTimeout>;
|
|
12
|
-
}
|
|
13
|
-
export declare function renderWebSearchCall(args: unknown, theme: Theme): Component;
|
|
14
|
-
export declare function renderWebSearchResult(result: AgentToolResult<WebSearchDetails>, options: ToolRenderResultOptions, theme: Theme, context: ToolRenderContext<WebSearchRenderState>): Component;
|
|
15
|
-
//# sourceMappingURL=render.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/web-search/render.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAqC,MAAM,wBAAwB,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAElH,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAItF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;CAC7C;AAwED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAO1E;AASD,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,EACzC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,GAC9C,SAAS,CA+DX"}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* render.ts — TUI rendering for web_search tool (call, collapsed summary, expanded view).
|
|
3
|
-
*/
|
|
4
|
-
import { Container, Markdown, Spacer, Text } from "@earendil-works/pi-tui";
|
|
5
|
-
import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
|
|
6
|
-
import { getMarkdownTheme } from "../../modes/interactive/theme/theme.js";
|
|
7
|
-
import { getEngineLabel, WEB_SEARCH_LABEL } from "./constants.js";
|
|
8
|
-
import { formatResultsMarkdown, prepareResults } from "./format.js";
|
|
9
|
-
import { MAX_HISTORICAL_HIT_SCAN } from "./results.js";
|
|
10
|
-
function trackQueryElapsed(context, isPartial) {
|
|
11
|
-
const state = context.state;
|
|
12
|
-
if (isPartial) {
|
|
13
|
-
if (state.startedAt === undefined) {
|
|
14
|
-
state.startedAt = Date.now();
|
|
15
|
-
const previousDispose = state.dispose;
|
|
16
|
-
state.dispose = () => {
|
|
17
|
-
clearTimeout(state.refreshTimer);
|
|
18
|
-
state.refreshTimer = undefined;
|
|
19
|
-
previousDispose?.();
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
if (state.refreshTimer === undefined) {
|
|
23
|
-
state.refreshTimer = setTimeout(() => {
|
|
24
|
-
state.refreshTimer = undefined;
|
|
25
|
-
context.invalidate();
|
|
26
|
-
}, 1000);
|
|
27
|
-
state.refreshTimer.unref?.();
|
|
28
|
-
}
|
|
29
|
-
return Date.now() - state.startedAt;
|
|
30
|
-
}
|
|
31
|
-
if (state.refreshTimer !== undefined) {
|
|
32
|
-
clearTimeout(state.refreshTimer);
|
|
33
|
-
state.refreshTimer = undefined;
|
|
34
|
-
}
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
/** Matches the bash/deepwiki progress display: sub-2s calls stay quiet. */
|
|
38
|
-
const ELAPSED_DISPLAY_THRESHOLD_MS = 2000;
|
|
39
|
-
function singleLine(text) {
|
|
40
|
-
return typeof text === "string" ? text.replace(/\s+/g, " ").trim() : "";
|
|
41
|
-
}
|
|
42
|
-
function truncateText(text, maxLength) {
|
|
43
|
-
if (text.length <= maxLength)
|
|
44
|
-
return text;
|
|
45
|
-
return `${text.slice(0, maxLength - 3)}...`;
|
|
46
|
-
}
|
|
47
|
-
function firstText(result) {
|
|
48
|
-
for (const part of result.content ?? []) {
|
|
49
|
-
if (part.type === "text" && typeof part.text === "string")
|
|
50
|
-
return part.text;
|
|
51
|
-
}
|
|
52
|
-
return "";
|
|
53
|
-
}
|
|
54
|
-
/** " · github.com, react.dev, +3" from the first-seen unique hit domains. */
|
|
55
|
-
function domainSummary(value) {
|
|
56
|
-
if (!Array.isArray(value))
|
|
57
|
-
return "";
|
|
58
|
-
const seen = new Set();
|
|
59
|
-
const scanLimit = Math.min(value.length, MAX_HISTORICAL_HIT_SCAN);
|
|
60
|
-
for (let index = 0; index < scanLimit; index++) {
|
|
61
|
-
const hit = value[index];
|
|
62
|
-
if (!hit || typeof hit !== "object")
|
|
63
|
-
continue;
|
|
64
|
-
const url = hit.url;
|
|
65
|
-
if (typeof url !== "string")
|
|
66
|
-
continue;
|
|
67
|
-
try {
|
|
68
|
-
const host = new URL(url).hostname.replace(/^www\./, "");
|
|
69
|
-
if (host)
|
|
70
|
-
seen.add(host);
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
// ignore malformed URLs
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (seen.size === 0)
|
|
77
|
-
return "";
|
|
78
|
-
const domains = [...seen];
|
|
79
|
-
const shown = domains.slice(0, 2).join(", ");
|
|
80
|
-
return domains.length > 2 ? ` · ${shown}, +${domains.length - 2}` : ` · ${shown}`;
|
|
81
|
-
}
|
|
82
|
-
export function renderWebSearchCall(args, theme) {
|
|
83
|
-
let line = theme.fg("toolTitle", theme.bold(`${WEB_SEARCH_LABEL} `));
|
|
84
|
-
const query = singleLine(args && typeof args === "object" && !Array.isArray(args) ? args.query : "");
|
|
85
|
-
line += theme.fg("accent", `"${truncateText(query, 60)}"`);
|
|
86
|
-
return new Text(line, 0, 0);
|
|
87
|
-
}
|
|
88
|
-
function markdownBlock(text) {
|
|
89
|
-
const container = new Container();
|
|
90
|
-
container.addChild(new Spacer(1));
|
|
91
|
-
container.addChild(new Markdown(text, 1, 0, getMarkdownTheme()));
|
|
92
|
-
return container;
|
|
93
|
-
}
|
|
94
|
-
export function renderWebSearchResult(result, options, theme, context) {
|
|
95
|
-
const elapsedMs = trackQueryElapsed(context, options.isPartial);
|
|
96
|
-
const details = result.details;
|
|
97
|
-
if (options.isPartial) {
|
|
98
|
-
// The query stays on the call line above; no need to repeat it here.
|
|
99
|
-
const engine = getEngineLabel(details?.engine);
|
|
100
|
-
const label = engine ? `Searching via ${engine}...` : "Searching the web...";
|
|
101
|
-
const suffix = elapsedMs !== undefined && elapsedMs >= ELAPSED_DISPLAY_THRESHOLD_MS
|
|
102
|
-
? theme.fg("muted", ` (${Math.round(elapsedMs / 1000)}s)`)
|
|
103
|
-
: "";
|
|
104
|
-
return new Text(`${theme.fg("warning", label)}${suffix}`, 0, 0);
|
|
105
|
-
}
|
|
106
|
-
const text = firstText(result);
|
|
107
|
-
const errorMessage = details?.errorMessage;
|
|
108
|
-
if (details?.status === "disabled") {
|
|
109
|
-
// Only reachable when the tool was force-enabled without credentials, or in
|
|
110
|
-
// historical sessions: the session_start hook keeps it hidden otherwise.
|
|
111
|
-
return new Text(theme.fg("warning", "disabled · no MiniMax/DeepSeek key — /login minimax-cn or export MINIMAX_API_KEY / DEEPSEEK_API_KEY"), 0, 0);
|
|
112
|
-
}
|
|
113
|
-
if (context.isError || details?.status === "error") {
|
|
114
|
-
const line = truncateText(errorMessage ?? (singleLine(text) || "Search request failed"), 160);
|
|
115
|
-
return new Text(theme.fg("error", `failed · ${line}`), 0, 0);
|
|
116
|
-
}
|
|
117
|
-
if (!options.expanded) {
|
|
118
|
-
const hint = `${theme.fg("muted", " (")}${keyHint("app.tools.expand", "to expand")}${theme.fg("muted", ")")}`;
|
|
119
|
-
if (!details) {
|
|
120
|
-
// Legacy entries without details: show a bounded slice of the payload.
|
|
121
|
-
const line = truncateText(singleLine(text), 100) || "done";
|
|
122
|
-
return new Text(`${theme.fg("toolOutput", line)}${hint}`, 0, 0);
|
|
123
|
-
}
|
|
124
|
-
const historicalHits = Array.isArray(details.hits) ? details.hits : [];
|
|
125
|
-
const hitCount = details.totalHits ?? historicalHits.length;
|
|
126
|
-
const engine = getEngineLabel(details.engine);
|
|
127
|
-
const engineLabel = engine ? ` via ${engine}` : "";
|
|
128
|
-
const duration = details.durationMs ? ` · ${(details.durationMs / 1000).toFixed(1)}s` : "";
|
|
129
|
-
const countText = hitCount === 1 ? "1 result" : hitCount === 0 ? "no results" : `${hitCount} results`;
|
|
130
|
-
const summary = theme.fg("toolOutput", truncateText(`${countText}${engineLabel}${duration}${domainSummary(historicalHits)}`, 100));
|
|
131
|
-
return new Text(`${summary}${hint}`, 0, 0);
|
|
132
|
-
}
|
|
133
|
-
// Expanded: structured sections from details, without the model-facing agent
|
|
134
|
-
// directives; fall back to the raw payload for legacy entries without details.
|
|
135
|
-
if (details) {
|
|
136
|
-
const body = formatResultsMarkdown(prepareResults(details));
|
|
137
|
-
if (body.trim())
|
|
138
|
-
return markdownBlock(body);
|
|
139
|
-
}
|
|
140
|
-
return markdownBlock(text);
|
|
141
|
-
}
|
|
142
|
-
//# sourceMappingURL=render.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/web-search/render.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAkB,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE3F,OAAO,EAAE,OAAO,EAAE,MAAM,wDAAwD,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAc,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AASvD,SAAS,iBAAiB,CAAC,OAAgD,EAAE,SAAkB;IAC9F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,SAAS,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC;YACtC,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE;gBACpB,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACjC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC;gBAC/B,eAAe,EAAE,EAAE,CAAC;YACrB,CAAC,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,KAAK,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;gBACpC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC;gBAC/B,OAAO,CAAC,UAAU,EAAE,CAAC;YACtB,CAAC,EAAE,IAAI,CAAC,CAAC;YACT,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;IACrC,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACjC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,2EAA2E;AAC3E,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAE1C,SAAS,UAAU,CAAC,IAAa;IAChC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,SAAiB;IACpD,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC;AAC7C,CAAC;AAED,SAAS,SAAS,CAAC,MAAyC;IAC3D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC7E,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,6EAA6E;AAC7E,SAAS,aAAa,CAAC,KAAc;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAClE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;QAC9C,MAAM,GAAG,GAAI,GAA+B,CAAC,GAAG,CAAC;QACjD,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;QACtC,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACR,wBAAwB;QACzB,CAAC;IACF,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAa,EAAE,KAAY;IAC9D,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,UAAU,CACvB,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAA4B,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CACnG,CAAC;IACF,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IAClC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,MAAyC,EACzC,OAAgC,EAChC,KAAY,EACZ,OAAgD;IAEhD,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAE/B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,qEAAqE;QACrE,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,MAAM,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC;QAC7E,MAAM,MAAM,GACX,SAAS,KAAK,SAAS,IAAI,SAAS,IAAI,4BAA4B;YACnE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;YAC1D,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;IAE3C,IAAI,OAAO,EAAE,MAAM,KAAK,UAAU,EAAE,CAAC;QACpC,4EAA4E;QAC5E,yEAAyE;QACzE,OAAO,IAAI,IAAI,CACd,KAAK,CAAC,EAAE,CACP,SAAS,EACT,qGAAqG,CACrG,EACD,CAAC,EACD,CAAC,CACD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,EAAE,MAAM,KAAK,OAAO,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9F,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;QAC9G,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,uEAAuE;YACvE,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC;YAC3D,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,IAAI,cAAc,CAAC,MAAM,CAAC;QAC5D,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,MAAM,SAAS,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,QAAQ,UAAU,CAAC;QACtG,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CACvB,YAAY,EACZ,YAAY,CAAC,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAC,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,CAC1F,CAAC;QACF,OAAO,IAAI,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,6EAA6E;IAC7E,+EAA+E;IAC/E,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,qBAAqB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC","sourcesContent":["/**\n * render.ts — TUI rendering for web_search tool (call, collapsed summary, expanded view).\n */\n\nimport { type Component, Container, Markdown, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext, ToolRenderResultOptions } from \"../../core/extensions/types.ts\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { getEngineLabel, WEB_SEARCH_LABEL } from \"./constants.ts\";\nimport { formatResultsMarkdown, prepareResults } from \"./format.ts\";\nimport { MAX_HISTORICAL_HIT_SCAN } from \"./results.ts\";\nimport type { WebSearchDetails } from \"./types.ts\";\n\nexport interface WebSearchRenderState {\n\tstartedAt?: number;\n\tdispose?: () => void;\n\trefreshTimer?: ReturnType<typeof setTimeout>;\n}\n\nfunction trackQueryElapsed(context: ToolRenderContext<WebSearchRenderState>, isPartial: boolean): number | undefined {\n\tconst state = context.state;\n\tif (isPartial) {\n\t\tif (state.startedAt === undefined) {\n\t\t\tstate.startedAt = Date.now();\n\t\t\tconst previousDispose = state.dispose;\n\t\t\tstate.dispose = () => {\n\t\t\t\tclearTimeout(state.refreshTimer);\n\t\t\t\tstate.refreshTimer = undefined;\n\t\t\t\tpreviousDispose?.();\n\t\t\t};\n\t\t}\n\t\tif (state.refreshTimer === undefined) {\n\t\t\tstate.refreshTimer = setTimeout(() => {\n\t\t\t\tstate.refreshTimer = undefined;\n\t\t\t\tcontext.invalidate();\n\t\t\t}, 1000);\n\t\t\tstate.refreshTimer.unref?.();\n\t\t}\n\t\treturn Date.now() - state.startedAt;\n\t}\n\tif (state.refreshTimer !== undefined) {\n\t\tclearTimeout(state.refreshTimer);\n\t\tstate.refreshTimer = undefined;\n\t}\n\treturn undefined;\n}\n\n/** Matches the bash/deepwiki progress display: sub-2s calls stay quiet. */\nconst ELAPSED_DISPLAY_THRESHOLD_MS = 2000;\n\nfunction singleLine(text: unknown): string {\n\treturn typeof text === \"string\" ? text.replace(/\\s+/g, \" \").trim() : \"\";\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n\tif (text.length <= maxLength) return text;\n\treturn `${text.slice(0, maxLength - 3)}...`;\n}\n\nfunction firstText(result: AgentToolResult<WebSearchDetails>): string {\n\tfor (const part of result.content ?? []) {\n\t\tif (part.type === \"text\" && typeof part.text === \"string\") return part.text;\n\t}\n\treturn \"\";\n}\n\n/** \" · github.com, react.dev, +3\" from the first-seen unique hit domains. */\nfunction domainSummary(value: unknown): string {\n\tif (!Array.isArray(value)) return \"\";\n\tconst seen = new Set<string>();\n\tconst scanLimit = Math.min(value.length, MAX_HISTORICAL_HIT_SCAN);\n\tfor (let index = 0; index < scanLimit; index++) {\n\t\tconst hit = value[index];\n\t\tif (!hit || typeof hit !== \"object\") continue;\n\t\tconst url = (hit as Record<string, unknown>).url;\n\t\tif (typeof url !== \"string\") continue;\n\t\ttry {\n\t\t\tconst host = new URL(url).hostname.replace(/^www\\./, \"\");\n\t\t\tif (host) seen.add(host);\n\t\t} catch {\n\t\t\t// ignore malformed URLs\n\t\t}\n\t}\n\tif (seen.size === 0) return \"\";\n\tconst domains = [...seen];\n\tconst shown = domains.slice(0, 2).join(\", \");\n\treturn domains.length > 2 ? ` · ${shown}, +${domains.length - 2}` : ` · ${shown}`;\n}\n\nexport function renderWebSearchCall(args: unknown, theme: Theme): Component {\n\tlet line = theme.fg(\"toolTitle\", theme.bold(`${WEB_SEARCH_LABEL} `));\n\tconst query = singleLine(\n\t\targs && typeof args === \"object\" && !Array.isArray(args) ? (args as { query?: unknown }).query : \"\",\n\t);\n\tline += theme.fg(\"accent\", `\"${truncateText(query, 60)}\"`);\n\treturn new Text(line, 0, 0);\n}\n\nfunction markdownBlock(text: string): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new Spacer(1));\n\tcontainer.addChild(new Markdown(text, 1, 0, getMarkdownTheme()));\n\treturn container;\n}\n\nexport function renderWebSearchResult(\n\tresult: AgentToolResult<WebSearchDetails>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tcontext: ToolRenderContext<WebSearchRenderState>,\n): Component {\n\tconst elapsedMs = trackQueryElapsed(context, options.isPartial);\n\tconst details = result.details;\n\n\tif (options.isPartial) {\n\t\t// The query stays on the call line above; no need to repeat it here.\n\t\tconst engine = getEngineLabel(details?.engine);\n\t\tconst label = engine ? `Searching via ${engine}...` : \"Searching the web...\";\n\t\tconst suffix =\n\t\t\telapsedMs !== undefined && elapsedMs >= ELAPSED_DISPLAY_THRESHOLD_MS\n\t\t\t\t? theme.fg(\"muted\", ` (${Math.round(elapsedMs / 1000)}s)`)\n\t\t\t\t: \"\";\n\t\treturn new Text(`${theme.fg(\"warning\", label)}${suffix}`, 0, 0);\n\t}\n\n\tconst text = firstText(result);\n\tconst errorMessage = details?.errorMessage;\n\n\tif (details?.status === \"disabled\") {\n\t\t// Only reachable when the tool was force-enabled without credentials, or in\n\t\t// historical sessions: the session_start hook keeps it hidden otherwise.\n\t\treturn new Text(\n\t\t\ttheme.fg(\n\t\t\t\t\"warning\",\n\t\t\t\t\"disabled · no MiniMax/DeepSeek key — /login minimax-cn or export MINIMAX_API_KEY / DEEPSEEK_API_KEY\",\n\t\t\t),\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\n\tif (context.isError || details?.status === \"error\") {\n\t\tconst line = truncateText(errorMessage ?? (singleLine(text) || \"Search request failed\"), 160);\n\t\treturn new Text(theme.fg(\"error\", `failed · ${line}`), 0, 0);\n\t}\n\n\tif (!options.expanded) {\n\t\tconst hint = `${theme.fg(\"muted\", \" (\")}${keyHint(\"app.tools.expand\", \"to expand\")}${theme.fg(\"muted\", \")\")}`;\n\t\tif (!details) {\n\t\t\t// Legacy entries without details: show a bounded slice of the payload.\n\t\t\tconst line = truncateText(singleLine(text), 100) || \"done\";\n\t\t\treturn new Text(`${theme.fg(\"toolOutput\", line)}${hint}`, 0, 0);\n\t\t}\n\t\tconst historicalHits = Array.isArray(details.hits) ? details.hits : [];\n\t\tconst hitCount = details.totalHits ?? historicalHits.length;\n\t\tconst engine = getEngineLabel(details.engine);\n\t\tconst engineLabel = engine ? ` via ${engine}` : \"\";\n\t\tconst duration = details.durationMs ? ` · ${(details.durationMs / 1000).toFixed(1)}s` : \"\";\n\t\tconst countText = hitCount === 1 ? \"1 result\" : hitCount === 0 ? \"no results\" : `${hitCount} results`;\n\t\tconst summary = theme.fg(\n\t\t\t\"toolOutput\",\n\t\t\ttruncateText(`${countText}${engineLabel}${duration}${domainSummary(historicalHits)}`, 100),\n\t\t);\n\t\treturn new Text(`${summary}${hint}`, 0, 0);\n\t}\n\n\t// Expanded: structured sections from details, without the model-facing agent\n\t// directives; fall back to the raw payload for legacy entries without details.\n\tif (details) {\n\t\tconst body = formatResultsMarkdown(prepareResults(details));\n\t\tif (body.trim()) return markdownBlock(body);\n\t}\n\treturn markdownBlock(text);\n}\n"]}
|