@humain/terminal 0.0.5 → 0.0.7
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 +62 -0
- package/README.md +10 -4
- package/dist/bundle/chunks/anthropic-messages-GDMGYAZB.js +6 -0
- package/dist/bundle/chunks/anthropic.js +75 -0
- package/dist/bundle/chunks/azure-openai-responses-ZN52D6YC.js +2 -0
- package/dist/bundle/chunks/bedrock-converse-stream.js +77 -0
- package/dist/bundle/chunks/chunk-3D3G2X5U.js +6 -0
- package/dist/bundle/chunks/chunk-3VI4HD7D.js +31 -0
- package/dist/bundle/chunks/chunk-6R7UI4IY.js +2 -0
- package/dist/bundle/chunks/chunk-72KO4OMP.js +2 -0
- package/dist/bundle/chunks/chunk-7DDKXS2Q.js +2 -0
- package/dist/bundle/chunks/chunk-ARF4OE6X.js +105 -0
- package/dist/bundle/chunks/chunk-BOW22LW6.js +42 -0
- package/dist/bundle/chunks/chunk-BZQ53VGE.js +70 -0
- package/dist/bundle/chunks/chunk-CBHC6EL7.js +133 -0
- package/dist/bundle/chunks/chunk-D7XAASZM.js +4 -0
- package/dist/bundle/chunks/chunk-ECWELYBH.js +17 -0
- package/dist/bundle/chunks/chunk-GMWCTUPB.js +2 -0
- package/dist/bundle/chunks/chunk-H2O6VOXT.js +11 -0
- package/dist/bundle/chunks/chunk-HNVPY4LZ.js +5995 -0
- package/dist/bundle/chunks/chunk-JUUC5AZY.js +2 -0
- package/dist/bundle/chunks/chunk-JXWJOIH4.js +2 -0
- package/dist/bundle/chunks/chunk-L2ZPNLYD.js +2 -0
- package/dist/bundle/chunks/chunk-LVVZS2NO.js +12 -0
- package/dist/bundle/chunks/chunk-M2GYSCCG.js +44 -0
- package/dist/bundle/chunks/chunk-MA4UUCYX.js +18 -0
- package/dist/bundle/chunks/chunk-PGXDEOVV.js +2 -0
- package/dist/bundle/chunks/chunk-PJACZCIR.js +2 -0
- package/dist/bundle/chunks/chunk-PRRNXB7S.js +2 -0
- package/dist/bundle/chunks/chunk-SGTGQNNP.js +4 -0
- package/dist/bundle/chunks/chunk-TEPMHNKQ.js +2 -0
- package/dist/bundle/chunks/chunk-TXBQIIIO.js +2 -0
- package/dist/bundle/chunks/chunk-WJZ4KLGL.js +2 -0
- package/dist/bundle/chunks/chunk-XNGRGP62.js +2 -0
- package/dist/bundle/chunks/dist-7DSXV2TY.js +9 -0
- package/dist/bundle/chunks/dist-BXEVYJIO.js +7 -0
- package/dist/bundle/chunks/es-P2KNSZYR.js +9 -0
- package/dist/bundle/chunks/es5-FGTJ7ZFW.js +2 -0
- package/dist/bundle/chunks/event-streams-JOSQQSII.js +2 -0
- package/dist/bundle/chunks/extract-2L7ZVN7F.js +106 -0
- package/dist/bundle/chunks/github-copilot.js +2 -0
- package/dist/bundle/chunks/google-generative-ai-XT7NQJ2E.js +2 -0
- package/dist/bundle/chunks/google-vertex-IDQ6Z53W.js +2 -0
- package/dist/bundle/chunks/image-resize-worker.js +2 -0
- package/dist/bundle/chunks/kimi-coding.js +2 -0
- package/dist/bundle/chunks/mistral-conversations-HHDZ4FHR.js +5 -0
- package/dist/bundle/chunks/multipart-parser-FMGQ7342.js +3 -0
- package/dist/bundle/chunks/node-XY3CBY3C.js +294 -0
- package/dist/bundle/chunks/node-ZHY4LHC7.js +15 -0
- package/dist/bundle/chunks/openai-codex-responses-HRVCDY54.js +8 -0
- package/dist/bundle/chunks/openai-codex.js +75 -0
- package/dist/bundle/chunks/openai-completions-6QBYTBXY.js +7 -0
- package/dist/bundle/chunks/openai-responses-4MWLJHIK.js +2 -0
- package/dist/bundle/chunks/openrouter-images-Y2PCWAQH.js +2 -0
- package/dist/bundle/chunks/openrouter.js +75 -0
- package/dist/bundle/chunks/pdfjs-UKQT3OWY.js +107 -0
- package/dist/bundle/chunks/pi-messages-57K43J6J.js +8 -0
- package/dist/bundle/chunks/promise-J5TGSM32.js +2 -0
- package/dist/bundle/chunks/radius.js +75 -0
- package/dist/bundle/chunks/src-QKGKDFSU.js +4 -0
- package/dist/bundle/chunks/undici-D6ABF53Q.js +2 -0
- package/dist/bundle/chunks/webapi-AFS5FDJJ.js +5 -0
- package/dist/bundle/chunks/xai.js +2 -0
- package/dist/bundle/cli.js +3 -0
- package/dist/bundle/client.js +2 -0
- package/dist/bundle/index.js +2 -0
- package/dist/bundle/rpc-entry.js +3 -0
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +29 -9
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +2 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -11
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +50 -14
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +163 -95
- 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 +6 -7
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +3 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +4 -3
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +41 -32
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/defaults.d.ts +1 -0
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/defaults.js +9 -0
- package/dist/core/defaults.js.map +1 -1
- package/dist/core/extensions/index.d.ts +2 -2
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +115 -48
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +38 -9
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +3 -0
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +1 -1
- package/dist/core/footer-data-provider.js +1 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/keybindings.d.ts +20 -19
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +26 -5
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +5 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +3 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver.d.ts +1 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +18 -8
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js +2 -1
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +22 -14
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts.map +1 -1
- package/dist/core/pi-manifest.js +2 -1
- package/dist/core/pi-manifest.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +2 -1
- 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 +3 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +10 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-export.d.ts +4 -0
- package/dist/core/session-export.d.ts.map +1 -0
- package/dist/core/session-export.js +32 -0
- package/dist/core/session-export.js.map +1 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +2 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-diagnostics.d.ts +9 -0
- package/dist/core/settings-diagnostics.d.ts.map +1 -0
- package/dist/core/settings-diagnostics.js +21 -0
- package/dist/core/settings-diagnostics.js.map +1 -0
- package/dist/core/settings-manager.d.ts +9 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +51 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +51 -33
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +2 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +11 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts +16 -3
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +62 -29
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +0 -5
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +2 -5
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +20 -4
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/index.d.ts +4 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +19 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/powershell.d.ts +16 -0
- package/dist/core/tools/powershell.d.ts.map +1 -0
- package/dist/core/tools/powershell.js +39 -0
- package/dist/core/tools/powershell.js.map +1 -0
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js +21 -28
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +2 -1
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/extensions/llama/index.d.ts.map +1 -1
- package/dist/extensions/llama/index.js +2 -0
- package/dist/extensions/llama/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +6 -2
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/humain/agent-execution-protocol.d.ts +1 -217
- package/dist/humain/agent-execution-protocol.d.ts.map +1 -1
- package/dist/humain/agent-execution-protocol.js +1 -203
- package/dist/humain/agent-execution-protocol.js.map +1 -1
- package/dist/humain/bedrock-provider/vendor/index.bundle.mjs +107 -16
- package/dist/humain/mcp-adapter/vendor/CHANGELOG.md +82 -0
- package/dist/humain/mcp-adapter/vendor/README.md +47 -15
- package/dist/humain/mcp-adapter/vendor/cli.js +4 -4
- package/dist/humain/mcp-adapter/vendor/commands.ts +5 -3
- package/dist/humain/mcp-adapter/vendor/config.ts +46 -5
- package/dist/humain/mcp-adapter/vendor/direct-tools.ts +103 -92
- package/dist/humain/mcp-adapter/vendor/dist/agent-dir.d.ts +10 -0
- package/dist/humain/mcp-adapter/vendor/dist/agent-dir.js +63 -0
- package/dist/humain/mcp-adapter/vendor/dist/agent-dir.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.d.ts +8 -0
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.js +356 -0
- package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/config.d.ts +123 -0
- package/dist/humain/mcp-adapter/vendor/dist/config.js +1088 -0
- package/dist/humain/mcp-adapter/vendor/dist/config.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/mcp-bearer-store.d.ts +24 -0
- package/dist/humain/mcp-adapter/vendor/dist/mcp-bearer-store.js +336 -0
- package/dist/humain/mcp-adapter/vendor/dist/mcp-bearer-store.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.d.ts +19 -0
- package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.js +319 -0
- package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.d.ts +2 -0
- package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.js +156 -0
- package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/resource-tools.d.ts +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/resource-tools.js +15 -0
- package/dist/humain/mcp-adapter/vendor/dist/resource-tools.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/types.d.ts +566 -0
- package/dist/humain/mcp-adapter/vendor/dist/types.js +287 -0
- package/dist/humain/mcp-adapter/vendor/dist/types.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/ui-app-bridge-helpers.d.ts +6 -0
- package/dist/humain/mcp-adapter/vendor/dist/ui-app-bridge-helpers.js +37 -0
- package/dist/humain/mcp-adapter/vendor/dist/ui-app-bridge-helpers.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/ui-stream-types.d.ts +104 -0
- package/dist/humain/mcp-adapter/vendor/dist/ui-stream-types.js +59 -0
- package/dist/humain/mcp-adapter/vendor/dist/ui-stream-types.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/ui-tool-visibility.d.ts +4 -0
- package/dist/humain/mcp-adapter/vendor/dist/ui-tool-visibility.js +27 -0
- package/dist/humain/mcp-adapter/vendor/dist/ui-tool-visibility.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/dist/utils.d.ts +32 -0
- package/dist/humain/mcp-adapter/vendor/dist/utils.js +338 -0
- package/dist/humain/mcp-adapter/vendor/dist/utils.js.map +1 -0
- package/dist/humain/mcp-adapter/vendor/failure-backoff.ts +23 -0
- package/dist/humain/mcp-adapter/vendor/index.bundle.mjs +4870 -3878
- package/dist/humain/mcp-adapter/vendor/index.ts +294 -88
- package/dist/humain/mcp-adapter/vendor/init.ts +41 -30
- package/dist/humain/mcp-adapter/vendor/lifecycle.ts +16 -8
- package/dist/humain/mcp-adapter/vendor/mcp-auth-flow.ts +124 -32
- package/dist/humain/mcp-adapter/vendor/mcp-bearer-store.ts +0 -2
- package/dist/humain/mcp-adapter/vendor/mcp-code.ts +2 -0
- package/dist/humain/mcp-adapter/vendor/mcp-oauth-provider.ts +155 -16
- package/dist/humain/mcp-adapter/vendor/mcp-output-guard.ts +95 -7
- package/dist/humain/mcp-adapter/vendor/mcp-probe.ts +18 -4
- package/dist/humain/mcp-adapter/vendor/mcp-references.ts +376 -0
- package/dist/humain/mcp-adapter/vendor/mcp-status.ts +8 -19
- package/dist/humain/mcp-adapter/vendor/metadata-cache.ts +20 -12
- package/dist/humain/mcp-adapter/vendor/namespace-tools.ts +276 -0
- package/dist/humain/mcp-adapter/vendor/package.json +26 -8
- package/dist/humain/mcp-adapter/vendor/proxy-modes.ts +128 -32
- package/dist/humain/mcp-adapter/vendor/request-headers-command.ts +1 -1
- package/dist/humain/mcp-adapter/vendor/search-ranking.ts +2 -0
- package/dist/humain/mcp-adapter/vendor/server-manager.ts +69 -12
- package/dist/humain/mcp-adapter/vendor/state.ts +1 -3
- package/dist/humain/mcp-adapter/vendor/tool-result-renderer.ts +16 -2
- package/dist/humain/mcp-adapter/vendor/types.ts +51 -2
- package/dist/humain/mcp-adapter/vendor/ui-server.ts +3 -19
- package/dist/humain/mcp-adapter/vendor/ui-session.ts +2 -1
- package/dist/humain/mcp-adapter/vendor/utils.ts +21 -19
- package/dist/humain/mcp-adapter.d.ts.map +1 -1
- package/dist/humain/mcp-adapter.js +4 -0
- package/dist/humain/mcp-adapter.js.map +1 -1
- package/dist/humain/web-access/vendor/chrome-cookies.d.ts +14 -0
- package/dist/humain/web-access/vendor/chrome-cookies.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/chrome-cookies.js +85 -33
- package/dist/humain/web-access/vendor/chrome-cookies.js.map +1 -1
- package/dist/humain/web-access/vendor/credential-source.d.ts +1 -1
- package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/credential-source.js +3 -1
- package/dist/humain/web-access/vendor/credential-source.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-page.d.ts +2 -29
- package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-page.js +10 -1
- package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-server.d.ts +2 -29
- package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-server.js +4 -0
- package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
- package/dist/humain/web-access/vendor/extract.d.ts +11 -0
- package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/extract.js +163 -20
- package/dist/humain/web-access/vendor/extract.js.map +1 -1
- package/dist/humain/web-access/vendor/fetch-params.d.ts +2 -0
- package/dist/humain/web-access/vendor/fetch-params.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/fetch-params.js +11 -0
- package/dist/humain/web-access/vendor/fetch-params.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-adc.d.ts +10 -0
- package/dist/humain/web-access/vendor/gemini-adc.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-adc.js +268 -0
- package/dist/humain/web-access/vendor/gemini-adc.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-api.d.ts +7 -1
- package/dist/humain/web-access/vendor/gemini-api.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-api.js +51 -15
- package/dist/humain/web-access/vendor/gemini-api.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.d.ts +9 -4
- package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.js +63 -21
- package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-url-context.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-url-context.js +3 -2
- package/dist/humain/web-access/vendor/gemini-url-context.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-web-config.d.ts +8 -1
- package/dist/humain/web-access/vendor/gemini-web-config.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-web-config.js +49 -4
- package/dist/humain/web-access/vendor/gemini-web-config.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-web.d.ts +2 -1
- package/dist/humain/web-access/vendor/gemini-web.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-web.js +8 -3
- package/dist/humain/web-access/vendor/gemini-web.js.map +1 -1
- package/dist/humain/web-access/vendor/github-api.d.ts +1 -1
- package/dist/humain/web-access/vendor/github-api.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/github-api.js +6 -4
- package/dist/humain/web-access/vendor/github-api.js.map +1 -1
- package/dist/humain/web-access/vendor/github-extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/github-extract.js +50 -3
- package/dist/humain/web-access/vendor/github-extract.js.map +1 -1
- package/dist/humain/web-access/vendor/github-issue-pr.d.ts +27 -0
- package/dist/humain/web-access/vendor/github-issue-pr.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/github-issue-pr.js +701 -0
- package/dist/humain/web-access/vendor/github-issue-pr.js.map +1 -0
- package/dist/humain/web-access/vendor/index.d.ts +3 -31
- package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/index.js +643 -530
- package/dist/humain/web-access/vendor/index.js.map +1 -1
- package/dist/humain/web-access/vendor/kimi-search.d.ts +5 -0
- package/dist/humain/web-access/vendor/kimi-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/kimi-search.js +228 -0
- package/dist/humain/web-access/vendor/kimi-search.js.map +1 -0
- package/dist/humain/web-access/vendor/openai-search.d.ts +3 -0
- package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/openai-search.js +89 -16
- package/dist/humain/web-access/vendor/openai-search.js.map +1 -1
- package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/page-query.js +56 -8
- package/dist/humain/web-access/vendor/page-query.js.map +1 -1
- package/dist/humain/web-access/vendor/ssrf-protection.js +6 -1
- package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -1
- package/dist/humain/web-access/vendor/utils.d.ts +12 -0
- package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/utils.js +343 -1
- package/dist/humain/web-access/vendor/utils.js.map +1 -1
- package/dist/humain/web-access/vendor/xcrawl.d.ts +4 -0
- package/dist/humain/web-access/vendor/xcrawl.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/xcrawl.js +251 -0
- package/dist/humain/web-access/vendor/xcrawl.js.map +1 -0
- package/dist/humain/web-access/vendor/youtube-extract.js +2 -2
- package/dist/humain/web-access/vendor/youtube-extract.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +17 -14
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +4 -3
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +9 -3
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +53 -10
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +7 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +118 -55
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-submenu.js +151 -0
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +68 -17
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +2 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +11 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +176 -106
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/session-share.d.ts +16 -0
- package/dist/modes/interactive/session-share.d.ts.map +1 -0
- package/dist/modes/interactive/session-share.js +188 -0
- package/dist/modes/interactive/session-share.js.map +1 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +6 -5
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +16 -13
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +20 -6
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +3 -2
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +2 -7
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts +1 -0
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +189 -3
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/changelog.d.ts +1 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js +12 -2
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +2 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/management-http.d.ts +5 -3
- package/dist/utils/management-http.d.ts.map +1 -1
- package/dist/utils/management-http.js +14 -10
- package/dist/utils/management-http.js.map +1 -1
- package/dist/utils/shell.d.ts +3 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +17 -5
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts +1 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +64 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/text.d.ts +8 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +9 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/utils/version-check.js +4 -4
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +15 -0
- package/docs/custom-provider.md +5 -2
- package/docs/environment-variables.md +7 -7
- package/docs/extensions.md +17 -7
- package/docs/json.md +7 -2
- package/docs/keybindings.md +8 -8
- package/docs/llama-cpp.md +2 -0
- package/docs/models.md +8 -2
- package/docs/packages.md +2 -2
- package/docs/rpc.md +9 -3
- package/docs/sdk.md +7 -2
- package/docs/settings.md +11 -3
- package/docs/skills.md +3 -2
- package/docs/terminal-setup.md +8 -0
- package/docs/usage.md +10 -7
- package/docs/windows.md +15 -1
- package/examples/extensions/border-status-editor.ts +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +70 -8
- package/examples/extensions/custom-provider-anthropic/package.json +2 -2
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/git-checkpoint.ts +2 -2
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/notify.ts +3 -1
- package/examples/extensions/sandbox/package-lock.json +14 -40
- package/examples/extensions/sandbox/package.json +2 -2
- package/examples/extensions/titlebar-spinner.ts +1 -1
- package/examples/extensions/with-deps/package-lock.json +4 -4
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/rpc-extension-ui.ts +1 -1
- package/examples/sdk/06-extensions.ts +1 -1
- package/examples/sdk/README.md +1 -1
- package/npm-shrinkwrap.json +293 -221
- package/package.json +21 -18
- package/src/humain/mcp-adapter/UPSTREAM.md +15 -5
- package/src/humain/mcp-adapter/upstream.json +4 -3
- package/src/humain/mcp-adapter/vendor/CHANGELOG.md +82 -0
- package/src/humain/web-access/UPSTREAM.md +1 -1
- package/src/humain/web-access/upstream.json +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult, ExtensionAPI, ExtensionContext } from \"../host.ts\";\nimport { Box, Text, truncateToWidth, type KeyId } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport { StringEnum, type ImageContent, type TextContent } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtractedContent, ExtractOptions } from \"./extract.ts\";\nimport { normalizeFetchContentParams } from \"./fetch-params.ts\";\nimport { resolveAuthFetchProfile, type AuthFetchProfile } from \"./auth-fetch.ts\";\nimport { findContent, type FindMode } from \"./content-find.ts\";\nimport { answerFromPage } from \"./page-query.ts\";\nimport { rewriteSearchQuery } from \"./query-rewrite.ts\";\nimport { clearCloneCache } from \"./github-extract.ts\";\nimport { getConfiguredSearchRouting, normalizeSearchProviderSelection, RESOLVED_SEARCH_PROVIDERS, SEARCH_PROVIDERS, search, type AttributedSearchResponse, type SearchProvider, type SearchProviderSelection, type ResolvedSearchProvider } from \"./gemini-search.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\nimport { formatSeconds, getWebSearchConfigDir, getWebSearchConfigPath, resolveCuratorNetworkConfig } from \"./utils.ts\";\nimport {\n\tclearResults,\n\tdeleteResult,\n\tgenerateId,\n\tgetAllResults,\n\tgetResult,\n\trestoreFromSession,\n\tstoreFetchedContentResult,\n\tstoreResult,\n\ttype QueryResultData,\n\ttype StoredSearchData,\n} from \"./storage.ts\";\nimport { activityMonitor, type ActivityEntry } from \"./activity.ts\";\nimport { startCuratorServer, type CuratorSearchEntry, type CuratorServerHandle, type IndexedCuratorSearchEntry } from \"./curator-server.ts\";\nimport {\n\tbuildDeterministicSummary,\n\tgenerateSummaryDraft,\n\tSUMMARY_GENERATION_DEADLINE_MS,\n\ttype SummaryGenerationContext,\n\ttype SummaryMeta,\n} from \"./summary-review.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { execFileSync, spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { platform } from \"node:os\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isPerplexityAvailable } from \"./perplexity.ts\";\nimport { isExaAvailable } from \"./exa.ts\";\nimport { isGeminiApiAvailable } from \"./gemini-api.ts\";\nimport { getActiveGoogleEmail, getGeminiWebAvailabilityDiagnostic, isGeminiWebAvailable } from \"./gemini-web.ts\";\nimport { isBrowserCookieAccessAllowed } from \"./gemini-web-config.ts\";\nimport { isBraveAvailable } from \"./brave.ts\";\nimport { isOpenAISearchAvailable } from \"./openai-search.ts\";\nimport { isParallelAvailable } from \"./parallel.ts\";\nimport { isParallelMcpAvailable } from \"./parallel-mcp.ts\";\nimport { isTinyFishAvailable } from \"./tinyfish.ts\";\nimport { isSearch1APIAvailable } from \"./search1api.ts\";\nimport { isSearchinfinityAvailable } from \"./searchinfinity.ts\";\nimport { isQueritAvailable } from \"./querit.ts\";\nimport { isTavilyAvailable } from \"./tavily.ts\";\nimport { isFirecrawlAvailable } from \"./firecrawl.ts\";\nimport { isJinaSearchAvailable } from \"./jina-search.ts\";\nimport { isSerpdiveAvailable } from \"./serpdive.ts\";\nimport { isKagiAvailable } from \"./kagi.ts\";\nimport { isBochaAvailable } from \"./bocha.ts\";\nimport { isOllamaAvailable } from \"./ollama.ts\";\nimport { isSearXNGAvailable } from \"./searxng.ts\";\nimport { isDuckDuckGoAvailable } from \"./duckduckgo.ts\";\nimport { isAnySearchAvailable } from \"./anysearch.ts\";\nimport { isXaiSearchAvailable } from \"./xai-search.ts\";\nimport { isBrightDataAvailable } from \"./brightdata.ts\";\nimport { isSerpBaseAvailable } from \"./serpbase.ts\";\nimport { isSerperAvailable } from \"./serper.ts\";\nimport { isValyuAvailable } from \"./valyu.ts\";\nimport { buildSearchErrorPlan, type SearchErrorDetails, type SearchErrorPlan } from \"./render-search-error.ts\";\nimport { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns, splitThinkingSuffix } from \"./summary-model-scope.ts\";\nimport {\n\tbuildResearchArtifact,\n\twithClaimAssessment,\n\tstoreResearchArtifact,\n\tgetResearchArtifact,\n\ttype RecencyFilter,\n\ttype ResearchArtifact,\n} from \"./source-check.ts\";\n\ntype ExtensionTheme = ExtensionContext[\"ui\"][\"theme\"];\n\nconst WEB_SEARCH_CONFIG_PATH = getWebSearchConfigPath();\n\nlet extractModulePromise: Promise<typeof import(\"./extract.ts\")> | undefined;\nasync function fetchAllContent(\n\turls: string[],\n\tsignal?: AbortSignal,\n\toptions?: ExtractOptions,\n): Promise<ExtractedContent[]> {\n\tconst extractModule = await (extractModulePromise ??= import(\"./extract.ts\"));\n\treturn extractModule.fetchAllContent(urls, signal, options);\n}\n\nfunction isAbortError(err: unknown): boolean {\n\treturn (err instanceof Error ? err.message : String(err)).toLowerCase().includes(\"abort\");\n}\n\n/** Shared collapsed/expanded renderer for an error/cancel plan produced by\n * buildSearchErrorPlan(). Used by every tool renderResult's error branch so\n * Ctrl+O (app.tools.expand) reveals diagnostics instead of a dead-end single line. */\nfunction renderSearchErrorPlan(plan: SearchErrorPlan, expanded: boolean, theme: ExtensionTheme) {\n\tif (expanded) {\n\t\treturn new Text(plan.expanded.map((l, i) => i === 0 ? theme.fg(\"error\", l) : theme.fg(\"toolOutput\", l)).join(\"\\n\"), 0, 0);\n\t}\n\tconst box = new Box(1, 0, (t) => theme.bg(\"toolErrorBg\", t));\n\tbox.addChild(new Text(theme.fg(\"error\", plan.expanded[0]), 0, 0));\n\tfor (const line of plan.collapsed) {\n\t\tbox.addChild(new Text(theme.fg(\"dim\", line), 0, 0));\n\t}\n\tif (plan.expandHint) {\n\t\tbox.addChild(new Text(theme.fg(\"muted\", plan.expandHint), 0, 0));\n\t}\n\treturn box;\n}\n\ninterface WebSearchConfig {\n\tanysearchApiKey?: unknown;\n\tbrightdataApiKey?: unknown;\n\tbrightdataSerpZone?: unknown;\n\tkagiApiKey?: unknown;\n\tollamaApiKey?: unknown;\n\tserpbaseApiKey?: unknown;\n\tserperApiKey?: unknown;\n\ttinyfishApiKey?: unknown;\n\tvalyuApiKey?: unknown;\n\txaiApiKey?: unknown;\n\tprovider?: unknown;\n\tsearchProvider?: unknown;\n\tworkflow?: string;\n\tcuratorTimeoutSeconds?: unknown;\n\tautoOpenBrowser?: unknown;\n\tcuratorRemote?: unknown;\n\tsummaryModel?: string;\n\tsummaryGenerationDeadlineMs?: unknown;\n\tmaxInlineContentChars?: unknown;\n\twebSearch?: {\n\t\tenabled?: boolean;\n\t};\n\ttools?: Partial<Record<keyof ToolNames, { enabled?: boolean }>>;\n\tcommands?: Partial<Record<\"websearch\" | \"curator\" | \"search\" | \"google-account\", { enabled?: boolean }>>;\n\ttoolNames?: Partial<ToolNames>;\n\tshortcuts?: {\n\t\tcurate?: KeyId;\n\t\tactivity?: KeyId;\n\t};\n\tssrf?: {\n\t\t/** CIDR ranges exempted from the SSRF guard (e.g. fake-IP proxy ranges). */\n\t\tallowRanges?: string[];\n\t\t/** Skip local hostname DNS preflight when an HTTP(S)_PROXY env var applies. */\n\t\ttrustEnvProxy?: boolean;\n\t};\n}\n\nexport interface ProviderAvailability {\n\tall: boolean;\n\topenai: boolean;\n\tbrave: boolean;\n\tparallel: boolean;\n\t\"parallel-mcp\": boolean;\n\ttinyfish: boolean;\n\tsearch1api: boolean;\n\tsearchinfinity: boolean;\n\tquerit: boolean;\n\ttavily: boolean;\n\tfirecrawl: boolean;\n\tjina: boolean;\n\tserpdive: boolean;\n\tsearxng: boolean;\n\tduckduckgo: boolean;\n\tperplexity: boolean;\n\texa: boolean;\n\tgemini: boolean;\n\tkagi: boolean;\n\tbocha: boolean;\n\tollama: boolean;\n\tanysearch: boolean;\n\txai: boolean;\n\tbrightdata: boolean;\n\tserpbase: boolean;\n\tserper: boolean;\n\tvalyu: boolean;\n}\n\ntype WebSearchWorkflow = \"none\" | \"summary-review\" | \"auto-summary\";\ntype CuratorWorkflow = \"summary-review\";\nexport type CuratorProvider = Exclude<SearchProvider, \"auto\">;\ntype SummaryWorkflow = \"summary-review\" | \"auto-summary\";\n\ninterface CuratorBootstrap {\n\tavailableProviders: ProviderAvailability;\n\tdefaultProvider: CuratorProvider;\n\ttimeoutSeconds: number;\n}\n\nfunction parseConfigRoot(raw: string): Record<string, unknown> {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${WEB_SEARCH_CONFIG_PATH}: ${message}`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid config in ${WEB_SEARCH_CONFIG_PATH}: expected a JSON object`);\n\t}\n\treturn parsed as Record<string, unknown>;\n}\n\nfunction loadConfig(): WebSearchConfig {\n\tif (!existsSync(WEB_SEARCH_CONFIG_PATH)) return {};\n\treturn parseConfigRoot(readFileSync(WEB_SEARCH_CONFIG_PATH, \"utf-8\")) as WebSearchConfig;\n}\n\nfunction saveConfig(updates: Partial<WebSearchConfig>): void {\n\tlet config: Record<string, unknown> = {};\n\tif (existsSync(WEB_SEARCH_CONFIG_PATH)) {\n\t\tconfig = parseConfigRoot(readFileSync(WEB_SEARCH_CONFIG_PATH, \"utf-8\"));\n\t}\n\n\tObject.assign(config, updates);\n\tconst dir = getWebSearchConfigDir();\n\tif (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\twriteFileSync(WEB_SEARCH_CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\");\n}\n\ntype ToolNames = {\n\twebSearch: string;\n\tsourceCheck: string;\n\tfetchContent: string;\n\tgetSearchContent: string;\n};\n\nconst DEFAULT_TOOL_NAMES: ToolNames = {\n\twebSearch: \"web_search\",\n\tsourceCheck: \"source_check\",\n\tfetchContent: \"fetch_content\",\n\tgetSearchContent: \"get_search_content\",\n};\nconst TOOL_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_-]{0,63}$/;\nconst DEFAULT_SHORTCUTS = { curate: \"ctrl+shift+s\", activity: \"ctrl+shift+w\" } satisfies Record<string, KeyId>;\nconst DEFAULT_CURATOR_TIMEOUT_SECONDS = 20;\nconst DEFAULT_REMOTE_CURATOR_TIMEOUT_SECONDS = 60;\nconst MAX_CURATOR_TIMEOUT_SECONDS = 600;\nconst MAX_SUMMARY_GENERATION_DEADLINE_MS = 600_000;\n\nfunction searchProviderSchema(description: string) {\n\treturn Type.Union([\n\t\tStringEnum([...SEARCH_PROVIDERS]),\n\t\tType.Array(StringEnum([...RESOLVED_SEARCH_PROVIDERS]), { minItems: 1 }),\n\t], { description });\n}\n\nfunction isToolEnabled(config: WebSearchConfig, key: keyof ToolNames): boolean {\n\tconst override = config.tools?.[key]?.enabled;\n\tif (typeof override === \"boolean\") return override;\n\treturn key !== \"webSearch\" && key !== \"sourceCheck\" || config.webSearch?.enabled !== false;\n}\n\nfunction isCommandEnabled(config: WebSearchConfig, name: \"websearch\" | \"curator\" | \"search\" | \"google-account\"): boolean {\n\treturn config.commands?.[name]?.enabled !== false;\n}\n\nfunction joinToolNames(names: string[]): string {\n\tif (names.length === 0) return \"stored content\";\n\tif (names.length === 1) return names[0];\n\tif (names.length === 2) return `${names[0]} or ${names[1]}`;\n\treturn `${names.slice(0, -1).join(\", \")}, or ${names[names.length - 1]}`;\n}\n\nfunction resolveToolNames(config: WebSearchConfig): ToolNames {\n\tif (config.toolNames !== undefined && (!config.toolNames || typeof config.toolNames !== \"object\" || Array.isArray(config.toolNames))) {\n\t\tthrow new Error(`toolNames in ${WEB_SEARCH_CONFIG_PATH} must be an object`);\n\t}\n\tconst names = { ...DEFAULT_TOOL_NAMES };\n\tfor (const key of Object.keys(DEFAULT_TOOL_NAMES) as Array<keyof ToolNames>) {\n\t\tconst value = config.toolNames?.[key];\n\t\tif (value === undefined) continue;\n\t\tif (typeof value !== \"string\") throw new Error(`toolNames.${key} in ${WEB_SEARCH_CONFIG_PATH} must be a string`);\n\t\tconst trimmed = value.trim();\n\t\tif (!TOOL_NAME_PATTERN.test(trimmed)) {\n\t\t\tthrow new Error(`toolNames.${key} in ${WEB_SEARCH_CONFIG_PATH} must start with a letter and contain only letters, numbers, underscores, or hyphens`);\n\t\t}\n\t\tnames[key] = trimmed;\n\t}\n\tconst registeredKeys = (Object.keys(DEFAULT_TOOL_NAMES) as Array<keyof ToolNames>)\n\t\t.filter(key => isToolEnabled(config, key));\n\tconst seen = new Map<string, keyof ToolNames>();\n\tfor (const key of registeredKeys) {\n\t\tconst name = names[key];\n\t\tconst previous = seen.get(name);\n\t\tif (previous) throw new Error(`toolNames.${key} duplicates toolNames.${previous} in ${WEB_SEARCH_CONFIG_PATH}`);\n\t\tseen.set(name, key);\n\t}\n\treturn names;\n}\n\nfunction loadConfigForExtensionInit(): WebSearchConfig {\n\ttry {\n\t\treturn loadConfig();\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tconsole.error(`[pi-web-access] ${message}`);\n\t\treturn {};\n\t}\n}\n\nfunction normalizeProviderInput(value: unknown, label = \"provider\"): SearchProviderSelection | undefined {\n\tif (value === undefined) return undefined;\n\treturn normalizeSearchProviderSelection(value, label);\n}\n\nfunction resolveRequestedProvider(requested: unknown): SearchProviderSelection {\n\tconst normalizedRequested = normalizeProviderInput(requested);\n\tif (normalizedRequested && normalizedRequested !== \"auto\") return normalizedRequested;\n\tconst config = loadConfig();\n\treturn normalizeProviderInput(config.searchProvider ?? config.provider, `provider in ${WEB_SEARCH_CONFIG_PATH}`) ?? \"auto\";\n}\n\nfunction toCuratorProvider(provider: SearchProviderSelection): CuratorProvider | undefined {\n\tif (Array.isArray(provider)) return \"all\";\n\treturn provider === \"auto\" ? undefined : provider;\n}\n\nfunction resolveCuratorSearchProvider(requested: unknown, current: SearchProviderSelection): SearchProviderSelection {\n\tconst normalized = normalizeProviderInput(requested);\n\tif (!normalized || normalized === \"auto\") return current;\n\tif (normalized === \"all\" && Array.isArray(current)) return current;\n\treturn normalized;\n}\n\nfunction normalizeRecencyFilter(value: unknown): RecencyFilter | undefined {\n\treturn value === \"day\" || value === \"week\" || value === \"month\" || value === \"year\"\n\t\t? value\n\t\t: undefined;\n}\n\nfunction normalizeCuratorTimeoutSeconds(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n\tconst normalized = Math.floor(value);\n\tif (normalized < 1) return undefined;\n\treturn Math.min(normalized, MAX_CURATOR_TIMEOUT_SECONDS);\n}\n\nfunction resolveWorkflow(input: unknown, hasUI: boolean): WebSearchWorkflow {\n\tconst normalized = typeof input === \"string\" ? input.trim().toLowerCase() : \"\";\n\tif (normalized === \"auto-summary\") return \"auto-summary\";\n\tif (!hasUI) return \"none\";\n\tif (normalized === \"none\") return \"none\";\n\treturn \"summary-review\";\n}\n\nfunction normalizeQueryList(queryList: unknown[]): string[] {\n\tconst normalized: string[] = [];\n\tfor (const query of queryList) {\n\t\tif (typeof query !== \"string\") continue;\n\t\tconst trimmed = query.trim();\n\t\tif (trimmed.length > 0) normalized.push(trimmed);\n\t}\n\treturn normalized;\n}\n\nfunction getCuratorTimeoutSeconds(): number {\n\tconst source = loadConfig();\n\tconst explicit = normalizeCuratorTimeoutSeconds(source.curatorTimeoutSeconds);\n\tif (explicit !== undefined) return explicit;\n\t// Remote users must notice and click a printed link, so allow more idle time.\n\treturn resolveCuratorNetworkConfig().enabled ? DEFAULT_REMOTE_CURATOR_TIMEOUT_SECONDS : DEFAULT_CURATOR_TIMEOUT_SECONDS;\n}\n\nexport function getSummaryGenerationDeadlineMs(): number {\n\tconst value = loadConfig().summaryGenerationDeadlineMs;\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isInteger(value) || value <= 0) {\n\t\treturn SUMMARY_GENERATION_DEADLINE_MS;\n\t}\n\treturn Math.min(value, MAX_SUMMARY_GENERATION_DEADLINE_MS);\n}\n\nfunction shouldAutoOpenCuratorBrowser(config: WebSearchConfig): boolean {\n\tif (config.autoOpenBrowser === false) return false;\n\tif (resolveCuratorNetworkConfig().enabled && config.autoOpenBrowser !== true) return false;\n\treturn true;\n}\n\nasync function getProviderAvailability(ctx: ExtensionContext): Promise<ProviderAvailability> {\n\tconst geminiWebAvail = await isGeminiWebAvailable();\n\tconst geminiApiAvail = isGeminiApiAvailable();\n\tconst providers = {\n\t\topenai: await isOpenAISearchAvailable(ctx),\n\t\tbrave: isBraveAvailable(),\n\t\tparallel: isParallelAvailable(),\n\t\t\"parallel-mcp\": isParallelMcpAvailable(),\n\t\ttinyfish: isTinyFishAvailable(),\n\t\tsearch1api: isSearch1APIAvailable(),\n\t\tsearchinfinity: isSearchinfinityAvailable(),\n\t\tquerit: isQueritAvailable(),\n\t\ttavily: isTavilyAvailable(),\n\t\tfirecrawl: isFirecrawlAvailable(),\n\t\tjina: isJinaSearchAvailable(),\n\t\tserpdive: isSerpdiveAvailable(),\n\t\tkagi: isKagiAvailable(),\n\t\tbocha: isBochaAvailable(),\n\t\tollama: isOllamaAvailable(),\n\t\tsearxng: isSearXNGAvailable(),\n\t\tduckduckgo: isDuckDuckGoAvailable(),\n\t\tperplexity: isPerplexityAvailable(),\n\t\texa: isExaAvailable(),\n\t\tgemini: geminiApiAvail || !!geminiWebAvail,\n\t\tanysearch: isAnySearchAvailable(),\n\t\txai: await isXaiSearchAvailable(ctx),\n\t\tbrightdata: isBrightDataAvailable(),\n\t\tserpbase: isSerpBaseAvailable(),\n\t\tserper: isSerperAvailable(),\n\t\tvalyu: isValyuAvailable(),\n\t};\n\treturn {\n\t\t// Parallel MCP, DuckDuckGo, AnySearch, xAI, Bright Data, SerpBase, Serper, and Valyu are explicit-only, so they never make `all` eligible.\n\t\tall: Object.entries(providers).some(([provider, available]) => provider !== \"parallel-mcp\" && provider !== \"duckduckgo\" && provider !== \"anysearch\" && provider !== \"xai\" && provider !== \"brightdata\" && provider !== \"serpbase\" && provider !== \"serper\" && provider !== \"valyu\" && provider !== \"gemini\" && available) || geminiApiAvail,\n\t\t...providers,\n\t};\n}\n\nfunction shouldUseOpenAICodexDefault(ctx?: Pick<ExtensionContext, \"model\">): boolean {\n\treturn ctx?.model?.provider === \"openai-codex\";\n}\n\nfunction shouldPreferOpenAI(options: Pick<PendingCurate, \"numResults\" | \"recencyFilter\"> | undefined, preferOpenAICodexDefault: boolean): boolean {\n\tif (options?.recencyFilter) return false;\n\tif (typeof options?.numResults === \"number\" && Number.isFinite(options.numResults) && Math.floor(options.numResults) !== 5) {\n\t\treturn false;\n\t}\n\treturn preferOpenAICodexDefault;\n}\n\nasync function loadCuratorBootstrap(\n\trequestedProvider: unknown,\n\tctx: ExtensionContext,\n\toptions?: Pick<PendingCurate, \"numResults\" | \"recencyFilter\">,\n): Promise<CuratorBootstrap> {\n\tconst provider = resolveRequestedProvider(requestedProvider);\n\tconst availableProviders = await getProviderAvailability(ctx);\n\tif (Array.isArray(provider)) availableProviders.all = true;\n\treturn {\n\t\tavailableProviders,\n\t\tdefaultProvider: resolveCuratorDefaultProvider(provider, availableProviders, ctx, options),\n\t\ttimeoutSeconds: getCuratorTimeoutSeconds(),\n\t};\n}\n\nexport function resolveCuratorDefaultProvider(\n\tprovider: SearchProviderSelection,\n\tavailable: ProviderAvailability,\n\tctx?: Pick<ExtensionContext, \"model\">,\n\toptions?: Pick<PendingCurate, \"numResults\" | \"recencyFilter\">,\n): CuratorProvider {\n\treturn resolveProvider(provider, available, options, shouldUseOpenAICodexDefault(ctx));\n}\n\nfunction firstAvailableProvider(available: ProviderAvailability, preferOpenAI: boolean, fallback: ResolvedSearchProvider): ResolvedSearchProvider {\n\tif (available.searxng) return \"searxng\";\n\tif (preferOpenAI && available.openai) return \"openai\";\n\tif (available.exa) return \"exa\";\n\tif (available.openai) return \"openai\";\n\tif (available.brave) return \"brave\";\n\tif (available.parallel) return \"parallel\";\n\tif (available.tinyfish) return \"tinyfish\";\n\tif (available.search1api) return \"search1api\";\n\tif (available.searchinfinity) return \"searchinfinity\";\n\tif (available.querit) return \"querit\";\n\tif (available.tavily) return \"tavily\";\n\tif (available.firecrawl) return \"firecrawl\";\n\tif (available.jina) return \"jina\";\n\tif (available.serpdive) return \"serpdive\";\n\tif (available.kagi) return \"kagi\";\n\tif (available.bocha) return \"bocha\";\n\tif (available.ollama) return \"ollama\";\n\tif (available.perplexity) return \"perplexity\";\n\tif (available.gemini) return \"gemini\";\n\treturn fallback;\n}\n\nfunction resolveProvider(\n\tprovider: SearchProviderSelection,\n\tavailable: ProviderAvailability,\n\toptions?: Pick<PendingCurate, \"numResults\" | \"recencyFilter\">,\n\tpreferOpenAICodexDefault = false,\n): CuratorProvider {\n\tif (Array.isArray(provider)) return \"all\";\n\tconst preferOpenAI = shouldPreferOpenAI(options, preferOpenAICodexDefault);\n\n\tif (provider === \"auto\") {\n\t\tconst routing = getConfiguredSearchRouting();\n\t\tif (routing) {\n\t\t\tfor (const candidate of routing.providers) {\n\t\t\t\tif (available[candidate]) return candidate;\n\t\t\t}\n\t\t\treturn routing.providers[0];\n\t\t}\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"exa\");\n\t}\n\tif (provider === \"all\" && !available.all) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"exa\");\n\t}\n\tif (provider === \"openai\" && !available.openai) {\n\t\treturn firstAvailableProvider(available, false, \"openai\");\n\t}\n\tif (provider === \"brave\" && !available.brave) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"brave\");\n\t}\n\tif (provider === \"parallel\" && !available.parallel) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"parallel\");\n\t}\n\tif (provider === \"tinyfish\" && !available.tinyfish) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"tinyfish\");\n\t}\n\tif (provider === \"search1api\" && !available.search1api) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"search1api\");\n\t}\n\tif (provider === \"searchinfinity\" && !available.searchinfinity) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"searchinfinity\");\n\t}\n\tif (provider === \"querit\" && !available.querit) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"querit\");\n\t}\n\tif (provider === \"tavily\" && !available.tavily) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"tavily\");\n\t}\n\tif (provider === \"firecrawl\" && !available.firecrawl) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"firecrawl\");\n\t}\n\tif (provider === \"jina\" && !available.jina) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"jina\");\n\t}\n\tif (provider === \"serpdive\" && !available.serpdive) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"serpdive\");\n\t}\n\tif (provider === \"kagi\" && !available.kagi) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"kagi\");\n\t}\n\tif (provider === \"bocha\" && !available.bocha) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"bocha\");\n\t}\n\tif (provider === \"ollama\" && !available.ollama) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"ollama\");\n\t}\n\tif (provider === \"searxng\" && !available.searxng) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"searxng\");\n\t}\n\tif (provider === \"exa\" && !available.exa) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"exa\");\n\t}\n\tif (provider === \"perplexity\" && !available.perplexity) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"perplexity\");\n\t}\n\tif (provider === \"gemini\" && !available.gemini) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"gemini\");\n\t}\n\treturn provider;\n}\n\nconst pendingFetches = new Map<string, AbortController>();\nlet sessionActive = false;\nlet widgetVisible = false;\nlet widgetUnsubscribe: (() => void) | null = null;\nconst pendingCurates = new Map<string, PendingCurate>();\nconst activeCurators = new Map<string, CuratorServerHandle>();\nconst glimpseWins = new Map<string, GlimpseWindow>();\n\ninterface PendingCurate {\n\tphase: \"searching\" | \"curating\";\n\tworkflow: CuratorWorkflow;\n\tsummaryContext: SummaryGenerationContext;\n\tsearchResults: Map<number, QueryResultData>;\n\tresultSlots: Map<number, number>;\n\tallInlineContent: ExtractedContent[];\n\tqueryList: string[];\n\tincludeContent: boolean;\n\tnumResults?: number;\n\trecencyFilter?: \"day\" | \"week\" | \"month\" | \"year\";\n\tdomainFilter?: string[];\n\tavailableProviders: ProviderAvailability;\n\tdefaultProvider: CuratorProvider;\n\tsearchProvider: SearchProviderSelection;\n\tsummaryModels: Array<{ value: string; label: string }>;\n\tdefaultSummaryModel: string | null;\n\ttimeoutSeconds: number;\n\tcuratorUrl?: string;\n\tonUpdate: ((update: { content: Array<{ type: string; text: string }>; details?: Record<string, unknown> }) => void) | undefined;\n\tsignal: AbortSignal | undefined;\n\tabortSearches: () => void;\n\tfinish: (value: AgentToolResult<Record<string, unknown>>) => void;\n\tcancel: (reason?: \"user\" | \"stale\") => void;\n\tbrowserPromise?: Promise<void>;\n\tbrowserOpenError?: string;\n}\n\n\nconst DEFAULT_MAX_INLINE_CONTENT_CHARS = 30_000;\nconst MAX_INLINE_CONTENT_CHARS = 200_000;\n\nfunction getMaxInlineContentChars(config = loadConfig()): number {\n\tconst value = config.maxInlineContentChars;\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isInteger(value) || value <= 0) {\n\t\treturn DEFAULT_MAX_INLINE_CONTENT_CHARS;\n\t}\n\treturn Math.min(value, MAX_INLINE_CONTENT_CHARS);\n}\n\nfunction stripThumbnails(results: ExtractedContent[]): ExtractedContent[] {\n\treturn results.map(({ thumbnail, frames, ...rest }) => rest);\n}\n\nfunction storeFetchResult(pi: { appendEntry(type: string, data: unknown): void }, responseId: string, data: StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] }, authProfile?: AuthFetchProfile): boolean {\n\tif (authProfile?.cache === \"off\") return false;\n\tpi.appendEntry(\"web-search-results\", storeFetchedContentResult(responseId, data));\n\treturn true;\n}\n\nfunction initialContentSlice(content: string, maxChars: number): {\n\ttext: string;\n\tendOffset: number;\n\ttotalBytes: number;\n\ttotalLines: number;\n\tshownBytes: number;\n\tshownLines: number;\n} {\n\tlet endOffset = Math.min(content.length, maxChars);\n\tif (endOffset < content.length) {\n\t\tconst lineBreak = content.lastIndexOf(\"\\n\", endOffset);\n\t\tif (lineBreak >= Math.floor(maxChars * 0.8)) endOffset = lineBreak + 1;\n\t}\n\tconst text = content.slice(0, endOffset);\n\treturn {\n\t\ttext,\n\t\tendOffset,\n\t\ttotalBytes: Buffer.byteLength(content),\n\t\ttotalLines: content.length === 0 ? 0 : content.split(\"\\n\").length,\n\t\tshownBytes: Buffer.byteLength(text),\n\t\tshownLines: text.length === 0 ? 0 : text.split(\"\\n\").length,\n\t};\n}\n\nfunction normalizeFindQueries(value: string | string[]): string[] {\n\tconst queries = (Array.isArray(value) ? value : [value]).map(query => query.trim()).filter(Boolean);\n\tif (queries.length === 0) throw new Error(\"findText must contain at least one non-empty string\");\n\treturn queries;\n}\n\nfunction formatInputValue(value: unknown): string {\n\tif (typeof value === \"string\") return JSON.stringify(value);\n\tif (typeof value === \"number\") return Number.isNaN(value) ? \"NaN\" : String(value);\n\ttry {\n\t\tconst serialized = JSON.stringify(value);\n\t\treturn serialized === undefined ? String(value) : serialized;\n\t} catch {\n\t\treturn String(value);\n\t}\n}\n\nfunction formatSearchSummary(results: SearchResult[], answer: string): string {\n\tif (results.length === 0) {\n\t\treturn answer ? `${answer}\\n\\n---\\n\\n**Sources:**\\nNo sources returned.` : \"No results found.\";\n\t}\n\tlet output = answer ? `${answer}\\n\\n---\\n\\n**Sources:**\\n` : \"\";\n\toutput += results.map((r, i) => `${i + 1}. ${r.title}\\n ${r.url}`).join(\"\\n\\n\");\n\treturn output;\n}\n\nfunction formatSourceCheckResult(artifact: ResearchArtifact, getSearchContentTool: string | null = DEFAULT_TOOL_NAMES.getSearchContent): string {\n\tconst assessment = artifact.claims?.[0];\n\tconst lines = [`# Source check: ${artifact.query}`, \"\"];\n\tif (assessment) {\n\t\tlines.push(`**Status:** ${assessment.status} (confidence ${assessment.confidence.toFixed(2)})`);\n\t\tlines.push(`**Rationale:** ${assessment.rationale}`);\n\t\tif (assessment.supporting_passages.length > 0) lines.push(`**Supporting passages:** ${assessment.supporting_passages.join(\", \")}`);\n\t\tif (assessment.contradicting_passages.length > 0) lines.push(`**Contradicting passages:** ${assessment.contradicting_passages.join(\", \")}`);\n\t\tlines.push(\"\");\n\t}\n\tif (artifact.sources.length > 0) {\n\t\tlines.push(\"## Sources\");\n\t\tfor (const source of artifact.sources) lines.push(`${source.rank}. [${source.quality}] ${source.title}\\n ${source.url}`);\n\t\tlines.push(\"\");\n\t}\n\tif (artifact.errors?.length) lines.push(`Search errors: ${artifact.errors.map((entry) => `${entry.query}: ${entry.error}`).join(\"; \")}`);\n\tlines.push(getSearchContentTool\n\t\t? `Artifact responseId: ${artifact.id} (retrievable via ${getSearchContentTool}).`\n\t\t: `Artifact responseId: ${artifact.id}. Content retrieval is not registered.`);\n\treturn lines.join(\"\\n\");\n}\n\nfunction duplicateQuerySet(results: QueryResultData[]): Set<string> {\n\tconst counts = new Map<string, number>();\n\tfor (const result of results) {\n\t\tcounts.set(result.query, (counts.get(result.query) ?? 0) + 1);\n\t}\n\tconst duplicates = new Set<string>();\n\tfor (const [query, count] of counts) {\n\t\tif (count > 1) duplicates.add(query);\n\t}\n\treturn duplicates;\n}\n\nfunction formatQueryHeader(query: string, provider: string | undefined, duplicateQueries: Set<string>): string {\n\tconst suffix = duplicateQueries.has(query) && provider ? ` (${provider})` : \"\";\n\treturn `## Query: \"${query}\"${suffix}\\n\\n`;\n}\n\nfunction hasFullInlineCoverage(urls: string[], inlineContent: ExtractedContent[] | undefined): boolean {\n\tif (!inlineContent || inlineContent.length === 0) return false;\n\tconst coveredUrls = new Set(inlineContent.map(c => c.url));\n\treturn urls.every(url => coveredUrls.has(url));\n}\n\nfunction formatFullResults(queryData: QueryResultData): string {\n\tlet output = `## Results for: \"${queryData.query}\"\\n\\n`;\n\tif (queryData.answer) {\n\t\toutput += `${queryData.answer}\\n\\n---\\n\\n`;\n\t}\n\tfor (const r of queryData.results) {\n\t\toutput += `### ${r.title}\\n${r.url}\\n\\n`;\n\t}\n\treturn output;\n}\n\nfunction abortPendingFetches(): void {\n\tfor (const controller of pendingFetches.values()) {\n\t\tcontroller.abort();\n\t}\n\tpendingFetches.clear();\n}\n\nfunction closeCurator(callId?: string): void {\n\tif (callId !== undefined) {\n\t\tconst win = glimpseWins.get(callId);\n\t\tglimpseWins.delete(callId);\n\t\ttry { win?.close(); } catch {}\n\t\tpendingCurates.get(callId)?.cancel(\"stale\");\n\t\tpendingCurates.delete(callId);\n\t\tconst curator = activeCurators.get(callId);\n\t\tactiveCurators.delete(callId);\n\t\ttry { curator?.close(); } catch {}\n\t\treturn;\n\t}\n\n\tfor (const win of glimpseWins.values()) {\n\t\ttry { win.close(); } catch {}\n\t}\n\tglimpseWins.clear();\n\tfor (const pc of pendingCurates.values()) {\n\t\ttry { pc.cancel(\"stale\"); } catch {}\n\t}\n\tpendingCurates.clear();\n\tfor (const curator of activeCurators.values()) {\n\t\ttry { curator.close(); } catch {}\n\t}\n\tactiveCurators.clear();\n}\n\nasync function openInBrowser(pi: ExtensionAPI, url: string): Promise<void> {\n\tconst plat = platform();\n\tif (plat !== \"darwin\" && plat !== \"win32\") {\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst child = spawn(\"xdg-open\", [url], { detached: true, stdio: \"ignore\" });\n\t\t\tconst timer = setTimeout(resolve, 100);\n\t\t\tchild.once(\"error\", (err) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t\tchild.once(\"exit\", (code) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tif (code === 0) resolve();\n\t\t\t\telse reject(new Error(`Failed to open browser (exit code ${code ?? \"unknown\"})`));\n\t\t\t});\n\t\t\tchild.unref();\n\t\t});\n\t\treturn;\n\t}\n\tconst result = plat === \"darwin\"\n\t\t? await pi.exec(\"open\", [url])\n\t\t: await pi.exec(\"cmd\", [\"/c\", \"start\", \"\", url]);\n\tif (result.code !== 0) {\n\t\tthrow new Error(result.stderr || `Failed to open browser (exit code ${result.code})`);\n\t}\n}\n\ninterface GlimpseWindow {\n\ton(event: \"closed\", handler: () => void): void;\n\ton(event: \"message\", handler: (data: unknown) => void): void;\n\ton(event: \"ready\", handler: (info: { screen?: { visibleHeight?: number } }) => void): void;\n\tclose(): void;\n\t_write(obj: Record<string, unknown>): void;\n}\n\nlet glimpseOpen: ((html: string, opts: Record<string, unknown>) => GlimpseWindow) | null | undefined;\n\nfunction findGlimpseMjs(): string | null {\n\ttry {\n\t\tconst req = createRequire(import.meta.url);\n\t\treturn req.resolve(\"glimpseui\");\n\t} catch {\n\t\t// Optional dependency.\n\t}\n\ttry {\n\t\tconst globalRoot = execFileSync(\"npm\", [\"root\", \"-g\"], { encoding: \"utf-8\" }).trim();\n\t\tconst entry = join(globalRoot, \"glimpseui\", \"src\", \"glimpse.mjs\");\n\t\tif (existsSync(entry)) return entry;\n\t} catch {\n\t\t// npm may be unavailable.\n\t}\n\treturn null;\n}\n\nasync function getGlimpseOpen() {\n\tif (glimpseOpen !== undefined) return glimpseOpen;\n\tconst resolved = findGlimpseMjs();\n\tif (resolved) {\n\t\ttry {\n\t\t\tglimpseOpen = (await import(resolved)).open;\n\t\t\treturn glimpseOpen;\n\t\t} catch {}\n\t}\n\tglimpseOpen = null;\n\treturn glimpseOpen;\n}\n\nfunction openInGlimpse(\n\topen: (html: string, opts: Record<string, unknown>) => GlimpseWindow,\n\turl: string,\n\ttitle: string,\n): GlimpseWindow {\n\tconst shellHTML = `<!DOCTYPE html>\n<html>\n<head><meta charset=\"UTF-8\"><title>${title}</title></head>\n<body style=\"margin:0; background:#1a1a2e;\">\n <script>window.location.replace(${JSON.stringify(url)});</script>\n</body>\n</html>`;\n\tconst win = open(shellHTML, {\n\t\twidth: 800,\n\t\theight: 900,\n\t\ttitle,\n\t});\n\n\tlet maxHeight = 1200;\n\twin.on(\"ready\", (info) => {\n\t\tconst visibleHeight = info?.screen?.visibleHeight;\n\t\tif (typeof visibleHeight === \"number\" && visibleHeight > 0) {\n\t\t\tmaxHeight = Math.floor(visibleHeight * 0.85);\n\t\t}\n\t});\n\twin.on(\"message\", (data) => {\n\t\tif (!data || typeof data !== \"object\") return;\n\t\tconst msg = data as Record<string, unknown>;\n\t\tif (msg.type !== \"resize\" || typeof msg.height !== \"number\") return;\n\t\tconst clamped = Math.max(400, Math.min(Math.round(msg.height), maxHeight));\n\t\twin._write({ type: \"resize\", width: 800, height: clamped });\n\t});\n\n\treturn win;\n}\n\nfunction extractDomain(url: string): string {\n\ttry { return new URL(url).hostname; }\n\tcatch { return url; }\n}\n\nfunction toCuratorSearchEntries(response: AttributedSearchResponse): CuratorSearchEntry[] {\n\tconst providerResponses = response.provider === \"all\" && response.providerResponses?.length\n\t\t? response.providerResponses\n\t\t: [response];\n\tconst entries: CuratorSearchEntry[] = providerResponses.map(result => ({\n\t\tanswer: result.answer,\n\t\tresults: result.results.map(source => ({ ...source, domain: extractDomain(source.url) })),\n\t\tprovider: result.provider,\n\t}));\n\tfor (const failure of response.providerErrors ?? []) {\n\t\tentries.push({\n\t\t\tanswer: \"\",\n\t\t\tresults: [],\n\t\t\tprovider: failure.provider,\n\t\t\terror: failure.error,\n\t\t});\n\t}\n\treturn entries;\n}\n\nfunction indexedCuratorEntryToQueryResult(entry: IndexedCuratorSearchEntry): QueryResultData {\n\treturn {\n\t\tquery: entry.query,\n\t\tanswer: entry.answer,\n\t\tresults: entry.results.map(source => ({\n\t\t\ttitle: source.title,\n\t\t\turl: source.url,\n\t\t\tsnippet: source.snippet ?? \"\",\n\t\t})),\n\t\terror: entry.error ?? null,\n\t\tprovider: entry.provider,\n\t};\n}\n\nfunction updateWidget(ctx: ExtensionContext): void {\n\tconst theme = ctx.ui.theme;\n\tconst entries = activityMonitor.getEntries();\n\tconst lines: string[] = [];\n\n\tlines.push(theme.fg(\"accent\", \"─── Web Search Activity \" + \"─\".repeat(36)));\n\n\tif (entries.length === 0) {\n\t\tlines.push(theme.fg(\"muted\", \" No activity yet\"));\n\t} else {\n\t\tfor (const e of entries) {\n\t\t\tlines.push(\" \" + formatEntryLine(e, theme));\n\t\t}\n\t}\n\n\tlines.push(theme.fg(\"accent\", \"─\".repeat(60)));\n\n\tconst rateInfo = activityMonitor.getRateLimitInfo();\n\tconst resetMs = rateInfo.oldestTimestamp ? Math.max(0, rateInfo.oldestTimestamp + rateInfo.windowMs - Date.now()) : 0;\n\tconst resetSec = Math.ceil(resetMs / 1000);\n\tlines.push(\n\t\ttheme.fg(\"muted\", `Rate: ${rateInfo.used}/${rateInfo.max}`) +\n\t\t\t(resetMs > 0 ? theme.fg(\"dim\", ` (resets in ${resetSec}s)`) : \"\"),\n\t);\n\n\tctx.ui.setWidget(\"web-activity\", lines);\n}\n\nfunction formatEntryLine(\n\tentry: ActivityEntry,\n\ttheme: ExtensionTheme,\n): string {\n\tconst typeStr = entry.type === \"api\" ? \"API\" : \"GET\";\n\tconst target =\n\t\tentry.type === \"api\"\n\t\t\t? `\"${truncateToWidth(entry.query || \"\", 28, \"\")}\"`\n\t\t\t: truncateToWidth(entry.url?.replace(/^https?:\\/\\//, \"\") || \"\", 30, \"\");\n\n\tconst duration = entry.endTime\n\t\t? `${((entry.endTime - entry.startTime) / 1000).toFixed(1)}s`\n\t\t: `${((Date.now() - entry.startTime) / 1000).toFixed(1)}s`;\n\n\tlet statusStr: string;\n\tlet indicator: string;\n\tif (entry.error) {\n\t\tstatusStr = \"err\";\n\t\tindicator = theme.fg(\"error\", \"✗\");\n\t} else if (entry.status === null) {\n\t\tstatusStr = \"...\";\n\t\tindicator = theme.fg(\"warning\", \"⋯\");\n\t} else if (entry.status === 0) {\n\t\tstatusStr = \"abort\";\n\t\tindicator = theme.fg(\"muted\", \"○\");\n\t} else {\n\t\tstatusStr = String(entry.status);\n\t\tindicator = entry.status >= 200 && entry.status < 300 ? theme.fg(\"success\", \"✓\") : theme.fg(\"error\", \"✗\");\n\t}\n\n\treturn `${typeStr.padEnd(4)} ${target.padEnd(32)} ${statusStr.padStart(5)} ${duration.padStart(5)} ${indicator}`;\n}\n\nfunction handleSessionChange(ctx: ExtensionContext): void {\n\tabortPendingFetches();\n\tcloseCurator();\n\tclearCloneCache();\n\tsessionActive = true;\n\trestoreFromSession(ctx);\n\t// Unsubscribe before clear() to avoid callback with stale ctx\n\twidgetUnsubscribe?.();\n\twidgetUnsubscribe = null;\n\tactivityMonitor.clear();\n\tif (widgetVisible) {\n\t\t// Re-subscribe with new ctx\n\t\twidgetUnsubscribe = activityMonitor.onUpdate(() => updateWidget(ctx));\n\t\tupdateWidget(ctx);\n\t}\n}\n\nexport default function (pi: ExtensionAPI) {\n\tconst initConfig = loadConfigForExtensionInit();\n\tconst toolNames = resolveToolNames(initConfig);\n\tconst webSearchEnabled = isToolEnabled(initConfig, \"webSearch\");\n\tconst sourceCheckEnabled = isToolEnabled(initConfig, \"sourceCheck\");\n\tconst fetchContentEnabled = isToolEnabled(initConfig, \"fetchContent\");\n\tconst getSearchContentEnabled = isToolEnabled(initConfig, \"getSearchContent\");\n\tconst storedContentSources = joinToolNames([\n\t\t...(webSearchEnabled ? [toolNames.webSearch] : []),\n\t\t...(sourceCheckEnabled ? [toolNames.sourceCheck] : []),\n\t\t...(fetchContentEnabled ? [toolNames.fetchContent] : []),\n\t]);\n\tconst searchQueryDescription = webSearchEnabled\n\t\t? `Get content for this query (${toolNames.webSearch})`\n\t\t: \"Get content for a stored search query\";\n\tconst fetchContentStorageNote = getSearchContentEnabled\n\t\t? `Full original content is stored for retrieval with ${toolNames.getSearchContent}.`\n\t\t: \"Full original content is stored internally, but the retrieval tool is not registered.\";\n\tconst curateKey = initConfig.shortcuts?.curate || DEFAULT_SHORTCUTS.curate;\n\tconst activityKey = initConfig.shortcuts?.activity || DEFAULT_SHORTCUTS.activity;\n\n\tfunction startBackgroundFetch(urls: string[]): string | null {\n\t\tif (urls.length === 0) return null;\n\t\tconst fetchId = generateId();\n\t\tconst controller = new AbortController();\n\t\tpendingFetches.set(fetchId, controller);\n\t\tfetchAllContent(urls, controller.signal)\n\t\t\t.then((fetched) => {\n\t\t\t\tif (!sessionActive || !pendingFetches.has(fetchId)) return;\n\t\t\t\tconst data = {\n\t\t\t\t\tid: fetchId,\n\t\t\t\t\ttype: \"fetch\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\turls: stripThumbnails(fetched),\n\t\t\t\t} satisfies StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] };\n\t\t\t\tpi.appendEntry(\"web-search-results\", storeFetchedContentResult(fetchId, data));\n\t\t\t\tconst ok = fetched.filter(f => !f.error).length;\n\t\t\t\tconst availability = ok === fetched.length\n\t\t\t\t\t? \"Full page content now available.\"\n\t\t\t\t\t: ok > 0\n\t\t\t\t\t\t? \"Partial page content now available.\"\n\t\t\t\t\t\t: \"No page content was fetched. Stored fetch diagnostics are available.\";\n\t\t\t\tpi.sendMessage(\n\t\t\t\t\t{\n\t\t\t\t\t\tcustomType: \"web-search-content-ready\",\n\t\t\t\t\t\tcontent: `Content fetched for ${ok}/${fetched.length} URLs [${fetchId}]. ${availability}`,\n\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t},\n\t\t\t\t\t{ triggerTurn: true },\n\t\t\t\t);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tif (!sessionActive || !pendingFetches.has(fetchId)) return;\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\tconst isAbort = (err instanceof Error && err.name === \"AbortError\") || message.toLowerCase().includes(\"abort\");\n\t\t\t\tif (!isAbort) {\n\t\t\t\t\tpi.sendMessage(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcustomType: \"web-search-error\",\n\t\t\t\t\t\t\tcontent: `Content fetch failed [${fetchId}]: ${message}`,\n\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ triggerTurn: false },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => { pendingFetches.delete(fetchId); });\n\t\treturn fetchId;\n\t}\n\n\tfunction storeAndPublishSearch(results: QueryResultData[]): string {\n\t\tconst id = generateId();\n\t\tconst data: StoredSearchData = {\n\t\t\tid, type: \"search\", timestamp: Date.now(), queries: results,\n\t\t};\n\t\tstoreResult(id, data);\n\t\tpi.appendEntry(\"web-search-results\", data);\n\t\treturn id;\n\t}\n\n\tinterface SearchReturnOptions {\n\t\tqueryList: string[];\n\t\tresults: QueryResultData[];\n\t\turls: string[];\n\t\tincludeContent: boolean;\n\t\tinlineContent?: ExtractedContent[];\n\t\tcurated?: boolean;\n\t\tcuratedFrom?: number;\n\t\tworkflow?: SummaryWorkflow;\n\t\tapprovedSummary?: string;\n\t\tsummaryMeta?: SummaryMeta;\n\t}\n\n\tfunction normalizeSummaryMeta(meta: SummaryMeta | undefined, summaryText: string): SummaryMeta {\n\t\tconst normalizedText = summaryText.trim();\n\t\tif (!meta) {\n\t\t\treturn {\n\t\t\t\tmodel: null,\n\t\t\t\tdurationMs: 0,\n\t\t\t\ttokenEstimate: normalizedText.length > 0 ? Math.max(1, Math.ceil(normalizedText.length / 4)) : 0,\n\t\t\t\tfallbackUsed: false,\n\t\t\t\tedited: false,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tmodel: meta.model,\n\t\t\tdurationMs: Number.isFinite(meta.durationMs) && meta.durationMs >= 0 ? meta.durationMs : 0,\n\t\t\ttokenEstimate: Number.isFinite(meta.tokenEstimate) && meta.tokenEstimate >= 0\n\t\t\t\t? meta.tokenEstimate\n\t\t\t\t: (normalizedText.length > 0 ? Math.max(1, Math.ceil(normalizedText.length / 4)) : 0),\n\t\t\tfallbackUsed: meta.fallbackUsed === true,\n\t\t\tfallbackReason: meta.fallbackReason,\n\t\t\tphase: meta.phase,\n\t\t\tedited: meta.edited === true,\n\t\t};\n\t}\n\n\tfunction buildCurationCancelledReturn(\n\t\treason: \"user\" | \"stale\",\n\t\tpartial?: {\n\t\t\tqueries?: QueryResultData[];\n\t\t\tqueryCount?: number;\n\t\t\tbrowserConnected?: boolean;\n\t\t\tlastHeartbeatAgeMs?: number | null;\n\t\t\tcuratorUrl?: string;\n\t\t\tbrowserOpenError?: string;\n\t\t},\n\t): AgentToolResult<Record<string, unknown>> {\n\t\tconst message = `Search curation cancelled (${reason}).`;\n\t\tconst cancelledQueries = partial?.queries?.length\n\t\t\t? partial.queries.map(q => ({\n\t\t\t\tquery: q.query,\n\t\t\t\tprovider: q.provider ?? null,\n\t\t\t\terror: q.error,\n\t\t\t\tresultCount: q.results?.length ?? 0,\n\t\t\t}))\n\t\t\t: undefined;\n\t\tconst extraLines: string[] = [];\n\t\tif (partial?.curatorUrl) extraLines.push(`curator: ${partial.curatorUrl}`);\n\t\tif (partial?.browserOpenError) extraLines.push(`browser open error: ${partial.browserOpenError}`);\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: message }],\n\t\t\tdetails: {\n\t\t\t\terror: message,\n\t\t\t\tcancelled: true,\n\t\t\t\tcancelReason: reason,\n\t\t\t\tbrowserConnected: partial?.browserConnected,\n\t\t\t\tlastHeartbeatAgeMs: partial?.lastHeartbeatAgeMs,\n\t\t\t\tqueryCount: partial?.queryCount,\n\t\t\t\tcancelledQueries,\n\t\t\t\textraLines: extraLines.length > 0 ? extraLines : undefined,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync function generateSummaryForSelectedIndices(\n\t\tselectedQueryIndices: number[],\n\t\tresultsByIndex: Map<number, QueryResultData>,\n\t\tsummaryContext: SummaryGenerationContext,\n\t\tsignal?: AbortSignal,\n\t\tmodelOverride?: string,\n\t\tfeedback?: string,\n\t): Promise<{ summary: string; meta: SummaryMeta }> {\n\t\tconst selectedResults: QueryResultData[] = [];\n\t\tfor (const qi of selectedQueryIndices) {\n\t\t\tconst result = resultsByIndex.get(qi);\n\t\t\tif (result) selectedResults.push(result);\n\t\t}\n\t\tif (selectedResults.length === 0) {\n\t\t\tthrow new Error(\"No selected results available for summary generation\");\n\t\t}\n\t\ttry {\n\t\t\treturn await generateSummaryDraft(\n\t\t\t\tselectedResults,\n\t\t\t\tsummaryContext,\n\t\t\t\tsignal,\n\t\t\t\tmodelOverride,\n\t\t\t\tfeedback,\n\t\t\t\tundefined,\n\t\t\t\tgetSummaryGenerationDeadlineMs(),\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tconst isEmptyResponse = err instanceof Error && err.message.includes(\"Summary model returned empty response\");\n\t\t\tif (!isEmptyResponse) throw err;\n\t\t\tconst deterministic = buildDeterministicSummary(selectedResults);\n\t\t\treturn {\n\t\t\t\tsummary: deterministic.summary,\n\t\t\t\tmeta: {\n\t\t\t\t\t...deterministic.meta,\n\t\t\t\t\tfallbackReason: \"summary-model-empty-response\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\tasync function loadSummaryModelChoices(\n\t\tsummaryContext: SummaryGenerationContext,\n\t): Promise<{ summaryModels: Array<{ value: string; label: string }>; defaultSummaryModel: string | null }> {\n\t\tconst summaryModels: Array<{ value: string; label: string }> = [];\n\t\tconst seen = new Set<string>();\n\t\tconst availableValues = new Set<string>();\n\n\t\tconst addModel = (provider: string, id: string) => {\n\t\t\tconst value = `${provider}/${id}`;\n\t\t\tif (seen.has(value)) return;\n\t\t\tseen.add(value);\n\t\t\tsummaryModels.push({ value, label: value });\n\t\t};\n\n\t\tlet enabledModelPatterns: string[] | null = null;\n\t\tlet scopeLoaded = true;\n\t\ttry {\n\t\t\tenabledModelPatterns = loadEnabledModelPatterns(summaryContext);\n\t\t\tconst availableModels = summaryContext.modelRegistry.getAvailable();\n\t\t\tfor (const model of availableModels) {\n\t\t\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) continue;\n\t\t\t\tconst value = `${model.provider}/${model.id}`;\n\t\t\t\tavailableValues.add(value);\n\t\t\t\taddModel(model.provider, model.id);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tscopeLoaded = false;\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tconsole.error(`Failed to load summary models: ${message}`);\n\t\t}\n\n\t\tconst currentModelValue = summaryContext.model\n\t\t\t? `${summaryContext.model.provider}/${summaryContext.model.id}`\n\t\t\t: null;\n\t\tif (scopeLoaded && summaryContext.model && currentModelValue && !seen.has(currentModelValue) && modelMatchesEnabledPatterns(summaryContext.model, enabledModelPatterns)) {\n\t\t\taddModel(summaryContext.model.provider, summaryContext.model.id);\n\t\t}\n\n\t\tconst config = loadConfig();\n\t\tconst configuredSummaryModel = typeof config.summaryModel === \"string\" ? config.summaryModel.trim() : \"\";\n\t\tconst preferredDefaults = [\n\t\t\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t\t\t{ provider: \"openai-codex\", id: \"gpt-5.6-luna\" },\n\t\t\t{ provider: \"openai-codex\", id: \"gpt-5.6-terra\" },\n\t\t\t{ provider: \"google\", id: \"gemini-3.6-flash\" },\n\t\t\t{ provider: \"openai\", id: \"gpt-5-mini\" },\n\t\t\t{ provider: \"deepseek\", id: \"deepseek-v4-flash\" },\n\t\t];\n\n\t\tconst resolveAvailableModelValue = (selector: string): string | null => {\n\t\t\tconst parsed = splitThinkingSuffix(selector);\n\t\t\tconst slashIndex = parsed.value.indexOf(\"/\");\n\t\t\tif (slashIndex <= 0 || slashIndex >= parsed.value.length - 1) return null;\n\t\t\tconst model = findModelWithProviderRouting(\n\t\t\t\tsummaryContext.modelRegistry,\n\t\t\t\tparsed.value.slice(0, slashIndex),\n\t\t\t\tparsed.value.slice(slashIndex + 1),\n\t\t\t);\n\t\t\tif (!model) return null;\n\t\t\tconst value = `${model.provider}/${model.id}`;\n\t\t\tif (!availableValues.has(value)) return null;\n\t\t\tif (selector !== value && !seen.has(selector)) {\n\t\t\t\tseen.add(selector);\n\t\t\t\tsummaryModels.push({ value: selector, label: selector });\n\t\t\t}\n\t\t\treturn selector;\n\t\t};\n\n\t\tlet defaultSummaryModel: string | null = null;\n\t\tif (scopeLoaded && configuredSummaryModel.length > 0) {\n\t\t\tdefaultSummaryModel = availableValues.has(configuredSummaryModel)\n\t\t\t\t? configuredSummaryModel\n\t\t\t\t: resolveAvailableModelValue(configuredSummaryModel);\n\t\t}\n\t\tif (scopeLoaded && !defaultSummaryModel) {\n\t\t\tfor (const preferred of preferredDefaults) {\n\t\t\t\tconst model = findModelWithProviderRouting(summaryContext.modelRegistry, preferred.provider, preferred.id);\n\t\t\t\tconst value = model ? `${model.provider}/${model.id}` : null;\n\t\t\t\tif (value && availableValues.has(value)) {\n\t\t\t\t\tdefaultSummaryModel = value;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { summaryModels, defaultSummaryModel };\n\t}\n\n\tfunction resolveSummaryForSubmit(\n\t\tpayload: { selectedQueryIndices: number[]; summary?: string; summaryMeta?: SummaryMeta },\n\t\tresultsByIndex: Map<number, QueryResultData>,\n\t): { approvedSummary: string; summaryMeta: SummaryMeta } {\n\t\tconst submittedSummary = typeof payload.summary === \"string\" ? payload.summary.trim() : \"\";\n\t\tif (submittedSummary.length > 0) {\n\t\t\treturn {\n\t\t\t\tapprovedSummary: submittedSummary,\n\t\t\t\tsummaryMeta: normalizeSummaryMeta(payload.summaryMeta, submittedSummary),\n\t\t\t};\n\t\t}\n\n\t\tconst selected = filterByQueryIndices(payload.selectedQueryIndices, resultsByIndex).results;\n\t\tconst fallbackResults = selected.length > 0 ? selected : [...resultsByIndex.values()];\n\t\tconst deterministic = buildDeterministicSummary(fallbackResults);\n\t\treturn {\n\t\t\tapprovedSummary: deterministic.summary,\n\t\t\tsummaryMeta: deterministic.meta,\n\t\t};\n\t}\n\n\tfunction buildSearchReturn(opts: SearchReturnOptions): AgentToolResult<Record<string, unknown>> {\n\t\tconst sc = opts.results.filter(r => !r.error).length;\n\t\tconst tr = opts.results.reduce((sum, r) => sum + r.results.length, 0);\n\n\t\tconst hasApprovedSummary = typeof opts.approvedSummary === \"string\" && opts.approvedSummary.trim().length > 0;\n\t\tlet output = \"\";\n\t\tif (hasApprovedSummary) {\n\t\t\toutput = opts.approvedSummary!.trim();\n\t\t} else {\n\t\t\tif (opts.curated) {\n\t\t\t\toutput += \"[These results were manually curated by the user in the browser. Use them as-is — do not re-search or discard.]\\n\\n\";\n\t\t\t}\n\t\t\tconst duplicateQueries = opts.curated ? duplicateQuerySet(opts.results) : new Set<string>();\n\t\t\tfor (const { query, answer, results, error, provider } of opts.results) {\n\t\t\t\tif (opts.queryList.length > 1) {\n\t\t\t\t\toutput += opts.curated\n\t\t\t\t\t\t? formatQueryHeader(query, provider, duplicateQueries)\n\t\t\t\t\t\t: `## Query: \"${query}\"\\n\\n`;\n\t\t\t\t}\n\t\t\t\tif (error) output += `Error: ${error}\\n\\n`;\n\t\t\t\telse output += formatSearchSummary(results, answer) + \"\\n\\n\";\n\t\t\t}\n\t\t}\n\n\t\tconst hasInlineReady = hasFullInlineCoverage(opts.urls, opts.inlineContent);\n\t\tlet fetchId: string | null = null;\n\t\tif (hasInlineReady && opts.inlineContent) {\n\t\t\tfetchId = generateId();\n\t\t\tconst data = {\n\t\t\t\tid: fetchId,\n\t\t\t\ttype: \"fetch\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\turls: opts.inlineContent,\n\t\t\t} satisfies StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] };\n\t\t\tpi.appendEntry(\"web-search-results\", storeFetchedContentResult(fetchId, data));\n\t\t\tif (!hasApprovedSummary) {\n\t\t\t\toutput += `---\\nFull content for ${opts.inlineContent.length} sources available [${fetchId}].`;\n\t\t\t}\n\t\t} else if (opts.includeContent) {\n\t\t\tfetchId = startBackgroundFetch(opts.urls);\n\t\t\tif (fetchId && !hasApprovedSummary) {\n\t\t\t\toutput += `---\\nContent fetching in background [${fetchId}]. Will notify when ready.`;\n\t\t\t}\n\t\t}\n\n\t\tconst searchId = storeAndPublishSearch(opts.results);\n\t\tconst isBackgroundFetch = fetchId !== null && !hasInlineReady;\n\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: output.trim() }],\n\t\t\tdetails: {\n\t\t\t\tqueries: opts.queryList,\n\t\t\t\tqueryCount: opts.queryList.length,\n\t\t\t\tsuccessfulQueries: sc,\n\t\t\t\ttotalResults: tr,\n\t\t\t\tincludeContent: opts.includeContent,\n\t\t\t\tfetchId,\n\t\t\t\tfetchUrls: isBackgroundFetch ? opts.urls : undefined,\n\t\t\t\tsearchId,\n\t\t\t\t...(opts.curated ? {\n\t\t\t\t\tcurated: true,\n\t\t\t\t\tcuratedFrom: opts.curatedFrom,\n\t\t\t\t\tcuratedQueries: opts.results.map(r => ({\n\t\t\t\t\t\tquery: r.query,\n\t\t\t\t\t\tprovider: r.provider || null,\n\t\t\t\t\t\tanswer: r.answer || null,\n\t\t\t\t\t\tsources: r.results.map(s => ({ title: s.title, url: s.url })),\n\t\t\t\t\t\terror: r.error,\n\t\t\t\t\t})),\n\t\t\t\t} : {}),\n\t\t\t\t...((opts.workflow && hasApprovedSummary)\n\t\t\t\t\t? {\n\t\t\t\t\t\tsummary: {\n\t\t\t\t\t\t\ttext: opts.approvedSummary!.trim(),\n\t\t\t\t\t\t\tworkflow: opts.workflow,\n\t\t\t\t\t\t\tmodel: opts.summaryMeta?.model ?? null,\n\t\t\t\t\t\t\tdurationMs: opts.summaryMeta?.durationMs ?? 0,\n\t\t\t\t\t\t\ttokenEstimate: opts.summaryMeta?.tokenEstimate ?? 0,\n\t\t\t\t\t\t\tfallbackUsed: opts.summaryMeta?.fallbackUsed === true,\n\t\t\t\t\t\t\tfallbackReason: opts.summaryMeta?.fallbackReason,\n\t\t\t\t\t\t\tphase: opts.summaryMeta?.phase,\n\t\t\t\t\t\t\tedited: opts.summaryMeta?.edited === true,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t};\n\t}\n\n\tfunction filterByQueryIndices(selectedQueryIndices: number[], results: Map<number, QueryResultData>) {\n\t\tconst filteredResults: QueryResultData[] = [];\n\t\tconst filteredUrls: string[] = [];\n\t\tfor (const qi of selectedQueryIndices) {\n\t\t\tconst r = results.get(qi);\n\t\t\tif (r) {\n\t\t\t\tfilteredResults.push(r);\n\t\t\t\tfor (const res of r.results) {\n\t\t\t\t\tif (!filteredUrls.includes(res.url)) filteredUrls.push(res.url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { results: filteredResults, urls: filteredUrls };\n\t}\n\n\tfunction collectAllResultsAndUrls(resultsByIndex: Map<number, QueryResultData>) {\n\t\tconst results = [...resultsByIndex.values()];\n\t\tconst urls: string[] = [];\n\t\tfor (const result of results) {\n\t\t\tfor (const source of result.results) {\n\t\t\t\tif (!urls.includes(source.url)) urls.push(source.url);\n\t\t\t}\n\t\t}\n\t\treturn { results, urls };\n\t}\n\n\tasync function openCuratorBrowser(callId: string, pc: PendingCurate, ctx: ExtensionContext, searchesComplete = true): Promise<void> {\n\t\tif (pendingCurates.get(callId) !== pc) return;\n\t\tlet handle: CuratorServerHandle | null = null;\n\t\tconst sendCuratorFallbackUpdate = (message: string) => {\n\t\t\tif (!handle) return;\n\t\t\tpc.onUpdate?.({\n\t\t\t\tcontent: [{ type: \"text\", text: `${message}\\nOpen manually: ${handle.url}` }],\n\t\t\t\tdetails: {\n\t\t\t\t\tphase: \"curator-fallback\",\n\t\t\t\t\tprogress: searchesComplete ? 1 : 0.5,\n\t\t\t\t\tcuratorUrl: handle.url,\n\t\t\t\t\ttimeoutSeconds: pc.timeoutSeconds,\n\t\t\t\t\tshortcut: curateKey,\n\t\t\t\t\tbrowserOpenError: pc.browserOpenError,\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\t\ttry {\n\t\t\tpc.phase = \"curating\";\n\n\t\t\tconst searchAbort = new AbortController();\n\t\t\tconst addSearchSignal = pc.signal\n\t\t\t\t? AbortSignal.any([pc.signal, searchAbort.signal])\n\t\t\t\t: searchAbort.signal;\n\n\t\t\tconst sessionToken = randomUUID();\n\t\t\thandle = await startCuratorServer(\n\t\t\t\t{\n\t\t\t\t\tqueries: pc.queryList,\n\t\t\t\t\tsessionToken,\n\t\t\t\t\ttimeout: pc.timeoutSeconds,\n\t\t\t\t\tavailableProviders: pc.availableProviders,\n\t\t\t\t\tdefaultProvider: pc.defaultProvider,\n\t\t\t\t\tsearchProvider: toCuratorProvider(pc.searchProvider) ?? \"auto\",\n\t\t\t\t\tsummaryModels: pc.summaryModels,\n\t\t\t\t\tdefaultSummaryModel: pc.defaultSummaryModel,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tasync onSummarize(selectedQueryIndices, summarizeSignal, model, feedback) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) throw new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\tpc.onUpdate?.({\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Generating summary draft...\" }],\n\t\t\t\t\t\t\tdetails: { phase: \"generating-summary\", progress: 0.9, curatorUrl: pc.curatorUrl, timeoutSeconds: pc.timeoutSeconds, shortcut: curateKey },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst draft = await generateSummaryForSelectedIndices(\n\t\t\t\t\t\t\tselectedQueryIndices,\n\t\t\t\t\t\t\tpc.searchResults,\n\t\t\t\t\t\t\tpc.summaryContext,\n\t\t\t\t\t\t\tsummarizeSignal,\n\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\tfeedback,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) throw new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\tpc.onUpdate?.({\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Summary draft ready — waiting for approval...\" }],\n\t\t\t\t\t\t\tdetails: { phase: \"waiting-for-approval\", progress: 1, curatorUrl: pc.curatorUrl, timeoutSeconds: pc.timeoutSeconds, shortcut: curateKey },\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn draft;\n\t\t\t\t\t},\n\t\t\t\t\tonSubmit(payload) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) return;\n\t\t\t\t\t\tsearchAbort.abort();\n\t\t\t\t\t\tconst filtered = payload.selectedQueryIndices.length > 0\n\t\t\t\t\t\t\t? filterByQueryIndices(payload.selectedQueryIndices, pc.searchResults)\n\t\t\t\t\t\t\t: collectAllResultsAndUrls(pc.searchResults);\n\t\t\t\t\t\tconst filteredInline = pc.allInlineContent.filter(c => filtered.urls.includes(c.url));\n\t\t\t\t\t\tconst base: SearchReturnOptions = {\n\t\t\t\t\t\t\tqueryList: filtered.results.map(r => r.query),\n\t\t\t\t\t\t\tresults: filtered.results,\n\t\t\t\t\t\t\turls: filtered.urls,\n\t\t\t\t\t\t\tincludeContent: pc.includeContent,\n\t\t\t\t\t\t\tinlineContent: filteredInline.length > 0 ? filteredInline : undefined,\n\t\t\t\t\t\t\tcurated: true,\n\t\t\t\t\t\t\tcuratedFrom: pc.searchResults.size,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (!payload.rawResults) {\n\t\t\t\t\t\t\tconst resolvedSummary = resolveSummaryForSubmit(payload, pc.searchResults);\n\t\t\t\t\t\t\tbase.workflow = pc.workflow;\n\t\t\t\t\t\t\tbase.approvedSummary = resolvedSummary.approvedSummary;\n\t\t\t\t\t\t\tbase.summaryMeta = resolvedSummary.summaryMeta;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpc.finish(buildSearchReturn(base));\n\t\t\t\t\t\tcloseCurator(callId);\n\t\t\t\t\t},\n\t\t\t\t\tonCancel(reason) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) return;\n\t\t\t\t\t\tsearchAbort.abort();\n\t\t\t\t\t\tif (reason === \"timeout\") {\n\t\t\t\t\t\t\tconst resolvedSummary = resolveSummaryForSubmit({ selectedQueryIndices: [], summary: undefined, summaryMeta: undefined }, pc.searchResults);\n\t\t\t\t\t\t\tconst all = collectAllResultsAndUrls(pc.searchResults);\n\t\t\t\t\t\t\tconst filteredInline = pc.allInlineContent.filter(c => all.urls.includes(c.url));\n\t\t\t\t\t\t\tpc.finish(buildSearchReturn({\n\t\t\t\t\t\t\t\tqueryList: all.results.map(r => r.query),\n\t\t\t\t\t\t\t\tresults: all.results,\n\t\t\t\t\t\t\t\turls: all.urls,\n\t\t\t\t\t\t\t\tincludeContent: pc.includeContent,\n\t\t\t\t\t\t\t\tinlineContent: filteredInline.length > 0 ? filteredInline : undefined,\n\t\t\t\t\t\t\t\tcurated: true,\n\t\t\t\t\t\t\t\tcuratedFrom: pc.searchResults.size,\n\t\t\t\t\t\t\t\tworkflow: pc.workflow,\n\t\t\t\t\t\t\t\tapprovedSummary: resolvedSummary.approvedSummary,\n\t\t\t\t\t\t\t\tsummaryMeta: resolvedSummary.summaryMeta,\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst conn = activeCurators.get(callId)?.getConnectionState();\n\t\t\t\t\t\t\tpc.finish(buildCurationCancelledReturn(reason, {\n\t\t\t\t\t\t\t\tqueries: Array.from(pc.searchResults.values()),\n\t\t\t\t\t\t\t\tqueryCount: pc.queryList.length,\n\t\t\t\t\t\t\t\tbrowserConnected: conn?.browserConnected,\n\t\t\t\t\t\t\t\tlastHeartbeatAgeMs: conn?.lastHeartbeatAgeMs,\n\t\t\t\t\t\t\t\tcuratorUrl: pc.curatorUrl,\n\t\t\t\t\t\t\t\tbrowserOpenError: pc.browserOpenError,\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcloseCurator(callId);\n\t\t\t\t\t},\n\t\t\t\t\tonProviderChange(provider) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) return;\n\t\t\t\t\t\tconst normalized = normalizeProviderInput(provider);\n\t\t\t\t\t\tif (!normalized || normalized === \"auto\" || Array.isArray(normalized)) return;\n\t\t\t\t\t\tpc.defaultProvider = normalized;\n\t\t\t\t\t\tpc.searchProvider = normalized;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tsaveConfig({ provider: normalized });\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\tconsole.error(`Failed to persist default provider: ${message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tasync onAddSearch(query, provider) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) throw new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\tconst requestedProvider = resolveCuratorSearchProvider(provider, pc.searchProvider);\n\t\t\t\t\t\tconst response = await search(query, {\n\t\t\t\t\t\t\tprovider: requestedProvider,\n\t\t\t\t\t\t\tnumResults: pc.numResults,\n\t\t\t\t\t\t\trecencyFilter: pc.recencyFilter,\n\t\t\t\t\t\t\tdomainFilter: pc.domainFilter,\n\t\t\t\t\t\t\tincludeContent: pc.includeContent,\n\t\t\t\t\t\t\tsignal: addSearchSignal,\n\t\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) throw new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\tif (response.inlineContent) pc.allInlineContent.push(...response.inlineContent);\n\t\t\t\t\t\treturn toCuratorSearchEntries(response);\n\t\t\t\t\t},\n\t\t\t\t\tonAddSearchResults(entries) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) return;\n\t\t\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\t\t\tpc.searchResults.set(entry.queryIndex, indexedCuratorEntryToQueryResult(entry));\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tasync onRewriteQuery(query, rewriteSignal) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) throw new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\treturn rewriteSearchQuery(query, pc.summaryContext, rewriteSignal);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (pendingCurates.get(callId) !== pc) {\n\t\t\t\thandle.close();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tactiveCurators.set(callId, handle);\n\t\t\tpc.curatorUrl = handle.url;\n\n\t\t\tfor (const [qi, data] of pc.searchResults) {\n\t\t\t\tconst slotIndex = pc.resultSlots.get(qi);\n\t\t\t\tif (data.error) {\n\t\t\t\t\thandle.pushError(qi, data.error, data.provider, { query: data.query, slotIndex });\n\t\t\t\t} else {\n\t\t\t\t\thandle.pushResult(qi, {\n\t\t\t\t\t\tanswer: data.answer,\n\t\t\t\t\t\tresults: data.results.map(r => ({ ...r, domain: extractDomain(r.url) })),\n\t\t\t\t\t\tprovider: data.provider || pc.defaultProvider,\n\t\t\t\t\t\tquery: data.query,\n\t\t\t\t\t\tslotIndex,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (searchesComplete) handle.searchesDone();\n\n\t\t\tpc.onUpdate?.({\n\t\t\t\tcontent: [{ type: \"text\", text: searchesComplete ? \"Waiting for summary approval in browser...\" : \"Searches streaming to browser...\" }],\n\t\t\t\tdetails: {\n\t\t\t\t\tphase: \"curating\",\n\t\t\t\t\tprogress: searchesComplete ? 1 : 0.5,\n\t\t\t\t\tcuratorUrl: handle.url,\n\t\t\t\t\ttimeoutSeconds: pc.timeoutSeconds,\n\t\t\t\t\tshortcut: curateKey,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!shouldAutoOpenCuratorBrowser(loadConfig())) {\n\t\t\t\tsendCuratorFallbackUpdate(\"Search curator is running. Open the curator URL manually.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst open = platform() === \"darwin\" ? await getGlimpseOpen() : null;\n\t\t\tif (open) {\n\t\t\t\ttry {\n\t\t\t\t\tconst win = openInGlimpse(open, handle.url, \"Search Curator\");\n\t\t\t\t\tglimpseWins.set(callId, win);\n\t\t\t\t\twin.on(\"closed\", () => {\n\t\t\t\t\t\tif (glimpseWins.get(callId) === win) {\n\t\t\t\t\t\t\tglimpseWins.delete(callId);\n\t\t\t\t\t\t\tcloseCurator(callId);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\tconsole.error(`Failed to open Glimpse curator window: ${message}`);\n\t\t\t\t\tglimpseWins.delete(callId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait openInBrowser(pi, handle.url);\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tconsole.error(`Failed to open curator UI: ${message}`);\n\t\t\tif (handle && activeCurators.get(callId) === handle && pendingCurates.get(callId) === pc) {\n\t\t\t\tpc.browserOpenError = message;\n\t\t\t\tsendCuratorFallbackUpdate(\"Search curator is running, but the browser did not open automatically.\");\n\t\t\t} else if (pendingCurates.get(callId) === pc || (handle && activeCurators.get(callId) === handle)) {\n\t\t\t\tcloseCurator(callId);\n\t\t\t}\n\t\t}\n\t}\n\n\tpi.registerShortcut(curateKey, {\n\t\tdescription: \"Review search results\",\n\t\thandler: async (ctx) => {\n\t\t\tconst entries = [...pendingCurates.entries()];\n\t\t\tif (entries.length === 0) return;\n\t\t\tconst [callId, pc] = entries[entries.length - 1];\n\n\t\t\tif (pc.phase === \"searching\") {\n\t\t\t\tpc.browserPromise = openCuratorBrowser(callId, pc, ctx, false);\n\t\t\t\tctx.ui.notify(\"Opening curator — remaining searches will stream in\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t});\n\n\tpi.registerShortcut(activityKey, {\n\t\tdescription: \"Toggle web search activity\",\n\t\thandler: async (ctx) => {\n\t\t\twidgetVisible = !widgetVisible;\n\t\t\tif (widgetVisible) {\n\t\t\t\twidgetUnsubscribe = activityMonitor.onUpdate(() => updateWidget(ctx));\n\t\t\t\tupdateWidget(ctx);\n\t\t\t} else {\n\t\t\t\twidgetUnsubscribe?.();\n\t\t\t\twidgetUnsubscribe = null;\n\t\t\t\tctx.ui.setWidget(\"web-activity\", undefined);\n\t\t\t}\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => handleSessionChange(ctx));\n\tpi.on(\"session_tree\", async (_event, ctx) => handleSessionChange(ctx));\n\n\tpi.on(\"session_shutdown\", () => {\n\t\tsessionActive = false;\n\t\tabortPendingFetches();\n\t\tcloseCurator();\n\t\tclearCloneCache();\n\t\tclearResults();\n\t\t// Unsubscribe before clear() to avoid callback with stale ctx\n\t\twidgetUnsubscribe?.();\n\t\twidgetUnsubscribe = null;\n\t\tactivityMonitor.clear();\n\t\twidgetVisible = false;\n\t});\n\n\tif (webSearchEnabled) pi.registerTool({\n\t\tname: toolNames.webSearch,\n\t\tlabel: \"Web Search\",\n\t\tdescription:\n\t\t\t`Search the web using OpenAI, Brave, Parallel, Parallel MCP, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Kagi, Bocha, Ollama, SearXNG, DuckDuckGo, Exa, Perplexity, Gemini, AnySearch, Valyu, xAI, Bright Data, SerpBase, or Serper. Pass a provider array to search only those providers simultaneously, or use provider \"all\" to search every eligible provider except Parallel MCP, DuckDuckGo, AnySearch, Valyu, xAI, Bright Data, SerpBase, and Serper. Returns an AI-synthesized answer with source citations. OpenAI search uses a Codex subscription or OpenAI API key; xAI search uses a SuperGrok/X Premium subscription or xAI API key. Parallel MCP, DuckDuckGo, AnySearch, Valyu, xAI, Bright Data, SerpBase, and Serper are available only when explicitly selected. For comprehensive research, prefer queries (plural) with 2-4 varied angles over a single query — each query gets its own synthesized answer, so varying phrasing and scope gives much broader coverage. When includeContent is true, full page content is fetched in the background. Searches auto-open the interactive browser curator and stream results live; set workflow to \"none\" to skip curation or \"auto-summary\" for a model-generated summary without the browser curator. The configured provider is used when provider is omitted or set to auto; omit provider unless explicitly overriding it. Without a configured provider, SearXNG is preferred first for local/private search. When the active Pi model is openai-codex, Codex-backed OpenAI search is preferred next. Otherwise Exa is preferred before OpenAI, then Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Kagi, Bocha, Ollama, Perplexity, Gemini API, or Gemini Web.`,\n\t\tpromptSnippet:\n\t\t\t\"Use for web research questions. Prefer {queries:[...]} with 2-4 varied angles over a single query for broader coverage. Omit provider unless explicitly overriding the configured default.\",\n\t\tparameters: Type.Object({\n\t\t\tquery: Type.Optional(Type.String({ description: \"Single search query. For research tasks, prefer 'queries' with multiple varied angles instead.\" })),\n\t\t\tqueries: Type.Optional(Type.Array(Type.String(), { description: \"Multiple queries searched in sequence, each returning its own synthesized answer. Prefer this for research — vary phrasing, scope, and angle across 2-4 queries to maximize coverage. Good: ['React vs Vue performance benchmarks 2026', 'React vs Vue developer experience comparison', 'React ecosystem size vs Vue ecosystem']. Bad: ['React vs Vue', 'React vs Vue comparison', 'React vs Vue review'] (too similar, redundant results).\" })),\n\t\t\tnumResults: Type.Optional(Type.Integer({ minimum: 1, maximum: 20, description: \"Results per query (default: 5, max: 20)\" })),\n\t\t\tincludeContent: Type.Optional(Type.Boolean({ description: \"Fetch full page content (async)\" })),\n\t\t\trecencyFilter: Type.Optional(\n\t\t\t\tStringEnum([\"day\", \"week\", \"month\", \"year\"], { description: \"Filter by recency\" }),\n\t\t\t),\n\t\t\tdomainFilter: Type.Optional(Type.Array(Type.String(), { description: \"Limit to domains (prefix with - to exclude)\" })),\n\t\t\tprovider: Type.Optional(searchProviderSchema(\"Search provider or non-empty list of providers to search simultaneously; use all to search every eligible provider except Parallel MCP, DuckDuckGo, AnySearch, xAI, Bright Data, SerpBase, Serper, and Valyu, omit this field to use the configured provider, or use auto when none is configured\")),\n\t\t\tworkflow: Type.Optional(\n\t\t\t\tStringEnum([\"none\", \"summary-review\", \"auto-summary\"], {\n\t\t\t\t\tdescription: \"Search workflow mode: none = no curator, summary-review = open curator with auto summary draft (default), auto-summary = generate summary without opening curator\",\n\t\t\t\t}),\n\t\t\t),\n\t\t}),\n\n\t\tasync execute(callId, params, signal, onUpdate, ctx) {\n\t\t\tconst rawQueryList: unknown[] = Array.isArray(params.queries)\n\t\t\t\t? params.queries\n\t\t\t\t: (params.query !== undefined ? [params.query] : []);\n\t\t\tconst queryList = normalizeQueryList(rawQueryList);\n\t\t\tconst configWorkflow = loadConfigForExtensionInit().workflow;\n\t\t\tconst workflow = resolveWorkflow(params.workflow ?? configWorkflow, ctx?.hasUI !== false);\n\t\t\tconst shouldCurate = workflow === \"summary-review\";\n\t\t\tconst recencyFilter = normalizeRecencyFilter(params.recencyFilter);\n\n\t\t\tif (queryList.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: No query provided. Use 'query' or 'queries' parameter.\" }],\n\t\t\t\t\tdetails: { error: \"No query provided\" },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (shouldCurate && !ctx) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: Curation requires an active extension context.\" }],\n\t\t\t\t\tdetails: { error: \"Missing extension context\" },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (shouldCurate) {\n\t\t\t\tcloseCurator(callId);\n\n\t\t\t\tlet resolvePromise: (value: AgentToolResult<Record<string, unknown>>) => void = () => {};\n\t\t\t\tconst promise = new Promise<AgentToolResult<Record<string, unknown>>>((resolve) => {\n\t\t\t\t\tresolvePromise = resolve;\n\t\t\t\t});\n\t\t\t\tconst includeContent = params.includeContent ?? false;\n\t\t\t\tconst searchResults = new Map<number, QueryResultData>();\n\t\t\t\tconst resultSlots = new Map<number, number>();\n\t\t\t\tconst allInlineContent: ExtractedContent[] = [];\n\t\t\t\tlet nextResultIndex = queryList.length;\n\t\t\t\tconst searchAbort = new AbortController();\n\t\t\t\tconst searchSignal = signal\n\t\t\t\t\t? AbortSignal.any([signal, searchAbort.signal])\n\t\t\t\t\t: searchAbort.signal;\n\t\t\t\tlet cancelled = false;\n\n\t\t\t\tconst requestedProvider = resolveRequestedProvider(params.provider);\n\t\t\t\tconst bootstrap = await loadCuratorBootstrap(requestedProvider, ctx, {\n\t\t\t\t\tnumResults: params.numResults,\n\t\t\t\t\trecencyFilter,\n\t\t\t\t});\n\t\t\t\tconst availableProviders = bootstrap.availableProviders;\n\t\t\t\tconst defaultProvider = bootstrap.defaultProvider;\n\t\t\t\tconst searchProvider = requestedProvider;\n\t\t\t\tconst curatorTimeoutSeconds = bootstrap.timeoutSeconds;\n\t\t\t\tconst curatorWorkflow: CuratorWorkflow = \"summary-review\";\n\n\t\t\t\tconst summaryContext: SummaryGenerationContext = {\n\t\t\t\t\tmodel: ctx.model,\n\t\t\t\t\tmodelRegistry: ctx.modelRegistry,\n\t\t\t\t\tcwd: ctx.cwd,\n\t\t\t\t\tisProjectTrusted: () => ctx.isProjectTrusted(),\n\t\t\t\t};\n\t\t\t\tconst summaryModelChoices = await loadSummaryModelChoices(summaryContext);\n\n\t\t\t\tconst pc: PendingCurate = {\n\t\t\t\t\tphase: \"searching\",\n\t\t\t\t\tworkflow: curatorWorkflow,\n\t\t\t\t\tsummaryContext,\n\t\t\t\t\tsearchResults,\n\t\t\t\t\tresultSlots,\n\t\t\t\t\tallInlineContent,\n\t\t\t\t\tqueryList,\n\t\t\t\t\tincludeContent,\n\t\t\t\t\tnumResults: params.numResults,\n\t\t\t\t\trecencyFilter,\n\t\t\t\t\tdomainFilter: params.domainFilter,\n\t\t\t\t\tavailableProviders,\n\t\t\t\t\tdefaultProvider,\n\t\t\t\t\tsearchProvider,\n\t\t\t\t\tsummaryModels: summaryModelChoices.summaryModels,\n\t\t\t\t\tdefaultSummaryModel: summaryModelChoices.defaultSummaryModel,\n\t\t\t\t\ttimeoutSeconds: curatorTimeoutSeconds,\n\t\t\t\t\tonUpdate: onUpdate as PendingCurate[\"onUpdate\"],\n\t\t\t\t\tsignal,\n\t\t\t\t\tabortSearches: () => {\n\t\t\t\t\t\tif (!searchAbort.signal.aborted) searchAbort.abort();\n\t\t\t\t\t},\n\t\t\t\t\tfinish: () => {},\n\t\t\t\t\tcancel: () => {},\n\t\t\t\t};\n\n\t\t\t\tconst finish = (value: AgentToolResult<Record<string, unknown>>) => {\n\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\tcancelled = true;\n\t\t\t\t\tpc.abortSearches();\n\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tpendingCurates.delete(callId);\n\t\t\t\t\tresolvePromise(value);\n\t\t\t\t};\n\n\t\t\t\tconst cancel = (reason: \"user\" | \"stale\" = \"stale\") => {\n\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\tconst conn = activeCurators.get(callId)?.getConnectionState();\n\t\t\t\t\tfinish(buildCurationCancelledReturn(reason, {\n\t\t\t\t\t\tqueries: Array.from(searchResults.values()),\n\t\t\t\t\t\tqueryCount: queryList.length,\n\t\t\t\t\t\tbrowserConnected: conn?.browserConnected,\n\t\t\t\t\t\tlastHeartbeatAgeMs: conn?.lastHeartbeatAgeMs,\n\t\t\t\t\t\tcuratorUrl: pc.curatorUrl,\n\t\t\t\t\t\tbrowserOpenError: pc.browserOpenError,\n\t\t\t\t\t}));\n\t\t\t\t};\n\n\t\t\t\tpc.finish = finish;\n\t\t\t\tpc.cancel = cancel;\n\n\t\t\t\tconst onAbort = () => closeCurator(callId);\n\t\t\t\tpendingCurates.set(callId, pc);\n\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\tpc.browserPromise = openCuratorBrowser(callId, pc, ctx, false);\n\n\t\t\t\tfor (let qi = 0; qi < queryList.length; qi++) {\n\t\t\t\t\tif (signal?.aborted || cancelled || searchAbort.signal.aborted) break;\n\t\t\t\t\tonUpdate?.({\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Searching ${qi + 1}/${queryList.length}: \"${queryList[qi]}\"...` }],\n\t\t\t\t\t\tdetails: { phase: \"searching\", progress: qi / queryList.length, currentQuery: queryList[qi] },\n\t\t\t\t\t});\n\t\t\t\t\tconst requestedProvider = pc.searchProvider;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst response = await search(queryList[qi], {\n\t\t\t\t\t\t\tprovider: requestedProvider,\n\t\t\t\t\t\t\tnumResults: params.numResults,\n\t\t\t\t\t\t\trecencyFilter,\n\t\t\t\t\t\t\tdomainFilter: params.domainFilter,\n\t\t\t\t\t\t\tincludeContent: params.includeContent,\n\t\t\t\t\t\t\tsignal: searchSignal,\n\t\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (signal?.aborted || cancelled || searchAbort.signal.aborted) break;\n\t\t\t\t\t\tif (response.inlineContent) allInlineContent.push(...response.inlineContent);\n\t\t\t\t\t\tconst entries = toCuratorSearchEntries(response);\n\t\t\t\t\t\tconst curator = activeCurators.get(callId);\n\t\t\t\t\t\tfor (let entryIndex = 0; entryIndex < entries.length; entryIndex++) {\n\t\t\t\t\t\t\tconst entry = entries[entryIndex];\n\t\t\t\t\t\t\tconst resultIndex = entryIndex === 0 ? qi : nextResultIndex++;\n\t\t\t\t\t\t\tconst indexedEntry: IndexedCuratorSearchEntry = {\n\t\t\t\t\t\t\t\t...entry,\n\t\t\t\t\t\t\t\tqueryIndex: resultIndex,\n\t\t\t\t\t\t\t\tquery: queryList[qi],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsearchResults.set(resultIndex, indexedCuratorEntryToQueryResult(indexedEntry));\n\t\t\t\t\t\t\tresultSlots.set(resultIndex, qi);\n\t\t\t\t\t\t\tif (curator) {\n\t\t\t\t\t\t\t\tif (entry.error) {\n\t\t\t\t\t\t\t\t\tcurator.pushError(resultIndex, entry.error, entry.provider, { query: queryList[qi], slotIndex: qi });\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcurator.pushResult(resultIndex, { ...entry, query: queryList[qi], slotIndex: qi });\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tif (signal?.aborted || cancelled || searchAbort.signal.aborted) break;\n\t\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\tconst failedProvider = toCuratorProvider(requestedProvider);\n\t\t\t\t\t\tsearchResults.set(qi, { query: queryList[qi], answer: \"\", results: [], error: message, provider: failedProvider });\n\t\t\t\t\t\tresultSlots.set(qi, qi);\n\t\t\t\t\t\tconst curator = activeCurators.get(callId);\n\t\t\t\t\t\tif (curator) {\n\t\t\t\t\t\t\tcurator.pushError(qi, message, failedProvider, { query: queryList[qi], slotIndex: qi });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (signal?.aborted || cancelled || searchAbort.signal.aborted) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treturn promise;\n\t\t\t\t}\n\n\t\t\t\tawait pc.browserPromise;\n\t\t\t\tconst curator = activeCurators.get(callId);\n\t\t\t\tif (curator && !cancelled) {\n\t\t\t\t\tcurator.searchesDone();\n\t\t\t\t\tif (pc.browserOpenError) {\n\t\t\t\t\t\tpc.onUpdate?.({\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `All searches complete. Open the curator manually: ${pc.curatorUrl}` }],\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\tphase: \"curator-fallback\",\n\t\t\t\t\t\t\t\tprogress: 1,\n\t\t\t\t\t\t\t\tcuratorUrl: pc.curatorUrl,\n\t\t\t\t\t\t\t\ttimeoutSeconds: pc.timeoutSeconds,\n\t\t\t\t\t\t\t\tshortcut: curateKey,\n\t\t\t\t\t\t\t\tbrowserOpenError: pc.browserOpenError,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpc.onUpdate?.({\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"All searches complete — waiting for summary approval in browser...\" }],\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\tphase: \"curating\",\n\t\t\t\t\t\t\t\tprogress: 1,\n\t\t\t\t\t\t\t\tcuratorUrl: pc.curatorUrl,\n\t\t\t\t\t\t\t\ttimeoutSeconds: pc.timeoutSeconds,\n\t\t\t\t\t\t\t\tshortcut: curateKey,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn promise;\n\t\t\t}\n\n\t\t\tconst searchResults: QueryResultData[] = [];\n\t\t\tconst allUrls: string[] = [];\n\t\t\tconst allInlineContent: ExtractedContent[] = [];\n\t\t\tconst resolvedProvider = resolveRequestedProvider(params.provider);\n\n\t\t\tfor (let i = 0; i < queryList.length; i++) {\n\t\t\t\tconst query = queryList[i];\n\n\t\t\t\tonUpdate?.({\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Searching ${i + 1}/${queryList.length}: \"${query}\"...` }],\n\t\t\t\t\tdetails: { phase: \"search\", progress: i / queryList.length, currentQuery: query },\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\tconst { answer, results, inlineContent, provider } = await search(query, {\n\t\t\t\t\t\tprovider: resolvedProvider,\n\t\t\t\t\t\tnumResults: params.numResults,\n\t\t\t\t\t\trecencyFilter,\n\t\t\t\t\t\tdomainFilter: params.domainFilter,\n\t\t\t\t\t\tincludeContent: params.includeContent,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t});\n\n\t\t\t\t\tsearchResults.push({ query, answer, results, error: null, provider });\n\t\t\t\t\tfor (const r of results) {\n\t\t\t\t\t\tif (!allUrls.includes(r.url)) {\n\t\t\t\t\t\t\tallUrls.push(r.url);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (inlineContent) allInlineContent.push(...inlineContent);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (signal?.aborted || isAbortError(err)) throw err;\n\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\tconst requestedProvider = toCuratorProvider(resolvedProvider);\n\t\t\t\t\tsearchResults.push({ query, answer: \"\", results: [], error: message, provider: requestedProvider });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet approvedSummary: string | undefined;\n\t\t\tlet summaryMeta: SummaryMeta | undefined;\n\t\t\tif (workflow === \"auto-summary\") {\n\t\t\t\tif (!ctx) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: Auto-summary requires an active extension context.\" }],\n\t\t\t\t\t\tdetails: { error: \"Missing extension context\" },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tonUpdate?.({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Generating summary...\" }],\n\t\t\t\t\tdetails: { phase: \"generating-summary\", progress: 1 },\n\t\t\t\t});\n\t\t\t\tconst summaryContext: SummaryGenerationContext = {\n\t\t\t\t\tmodel: ctx.model,\n\t\t\t\t\tmodelRegistry: ctx.modelRegistry,\n\t\t\t\t\tcwd: ctx.cwd,\n\t\t\t\t\tisProjectTrusted: () => ctx.isProjectTrusted(),\n\t\t\t\t};\n\t\t\t\tconst summaryModelChoices = await loadSummaryModelChoices(summaryContext);\n\t\t\t\tconst generated = await generateSummaryDraft(\n\t\t\t\t\tsearchResults,\n\t\t\t\t\tsummaryContext,\n\t\t\t\t\tsignal,\n\t\t\t\t\tsummaryModelChoices.defaultSummaryModel ?? undefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tgetSummaryGenerationDeadlineMs(),\n\t\t\t\t);\n\t\t\t\tapprovedSummary = generated.summary;\n\t\t\t\tsummaryMeta = generated.meta;\n\t\t\t}\n\n\t\t\treturn buildSearchReturn({\n\t\t\t\tqueryList,\n\t\t\t\tresults: searchResults,\n\t\t\t\turls: allUrls,\n\t\t\t\tincludeContent: params.includeContent ?? false,\n\t\t\t\tinlineContent: allInlineContent.length > 0 ? allInlineContent : undefined,\n\t\t\t\tworkflow: workflow === \"auto-summary\" ? \"auto-summary\" : undefined,\n\t\t\t\tapprovedSummary,\n\t\t\t\tsummaryMeta,\n\t\t\t});\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\tconst input = args as { query?: unknown; queries?: unknown };\n\t\t\tconst rawQueryList: unknown[] = Array.isArray(input.queries)\n\t\t\t\t? input.queries\n\t\t\t\t: (input.query !== undefined ? [input.query] : []);\n\t\t\tconst queryList = normalizeQueryList(rawQueryList);\n\t\t\tif (queryList.length === 0) {\n\t\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"search \")) + theme.fg(\"error\", \"(no query)\"), 0, 0);\n\t\t\t}\n\t\t\tif (queryList.length === 1) {\n\t\t\t\tconst q = queryList[0];\n\t\t\t\tconst display = q.length > 60 ? q.slice(0, 57) + \"...\" : q;\n\t\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"search \")) + theme.fg(\"accent\", `\"${display}\"`), 0, 0);\n\t\t\t}\n\t\t\tconst lines = [theme.fg(\"toolTitle\", theme.bold(\"search \")) + theme.fg(\"accent\", `${queryList.length} queries`)];\n\t\t\tfor (const q of queryList.slice(0, 5)) {\n\t\t\t\tconst display = q.length > 50 ? q.slice(0, 47) + \"...\" : q;\n\t\t\t\tlines.push(theme.fg(\"muted\", ` \"${display}\"`));\n\t\t\t}\n\t\t\tif (queryList.length > 5) {\n\t\t\t\tlines.push(theme.fg(\"muted\", ` ... and ${queryList.length - 5} more`));\n\t\t\t}\n\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t},\n\n\t\trenderResult(result, { expanded, isPartial }, theme) {\n\t\t\ttype QueryDetail = {\n\t\t\t\tquery: string;\n\t\t\t\tprovider: string | null;\n\t\t\t\tanswer: string | null;\n\t\t\t\tsources: Array<{ title: string; url: string }>;\n\t\t\t\terror: string | null;\n\t\t\t};\n\t\t\tconst details = result.details as {\n\t\t\t\tqueryCount?: number;\n\t\t\t\tsuccessfulQueries?: number;\n\t\t\t\ttotalResults?: number;\n\t\t\t\terror?: string;\n\t\t\t\tfetchId?: string;\n\t\t\t\tfetchUrls?: string[];\n\t\t\t\tphase?: string;\n\t\t\t\tprogress?: number;\n\t\t\t\tcurrentQuery?: string;\n\t\t\t\tcurated?: boolean;\n\t\t\t\tcuratedFrom?: number;\n\t\t\t\tcuratedQueries?: QueryDetail[];\n\t\t\t\tcancelled?: boolean;\n\t\t\t\tcancelReason?: string;\n\t\t\t\tbrowserConnected?: boolean;\n\t\t\t\tlastHeartbeatAgeMs?: number | null;\n\t\t\t\tcancelledQueries?: import(\"./render-search-error.ts\").CancelledQueryDetail[];\n\t\t\t\tcuratorUrl?: string;\n\t\t\t\tbrowserOpenError?: string;\n\t\t\t\ttimeoutSeconds?: number;\n\t\t\t\tshortcut?: string;\n\t\t\t\tsummary?: {\n\t\t\t\t\ttext: string;\n\t\t\t\t\tworkflow: SummaryWorkflow;\n\t\t\t\t\tmodel: string | null;\n\t\t\t\t\tdurationMs: number;\n\t\t\t\t\ttokenEstimate: number;\n\t\t\t\t\tfallbackUsed: boolean;\n\t\t\t\t\tfallbackReason?: string;\n\t\t\t\t\tphase?: \"summary-model\" | \"deterministic-fallback\";\n\t\t\t\t\tedited?: boolean;\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tif (isPartial) {\n\t\t\t\tif (details?.phase === \"curator-fallback\") {\n\t\t\t\t\tconst lines = [theme.fg(\"warning\", \"Open the search curator manually:\")];\n\t\t\t\t\tif (details?.curatorUrl) lines.push(theme.fg(\"muted\", ` ${details.curatorUrl}`));\n\t\t\t\t\tif (details?.browserOpenError) lines.push(theme.fg(\"dim\", ` auto-open failed: ${details.browserOpenError}`));\n\t\t\t\t\tconst timeout = typeof details?.timeoutSeconds === \"number\" ? details.timeoutSeconds : undefined;\n\t\t\t\t\tconst shortcut = typeof details?.shortcut === \"string\" ? details.shortcut : curateKey;\n\t\t\t\t\tlines.push(theme.fg(\"dim\", timeout ? ` auto-submits after ${timeout}s idle; ${shortcut} reopens` : ` ${shortcut} reopens`));\n\t\t\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t\t\t}\n\t\t\t\tif (details?.phase === \"curating\" || details?.phase === \"waiting-for-approval\" || details?.phase === \"generating-summary\") {\n\t\t\t\t\tconst phaseText = details?.phase === \"generating-summary\"\n\t\t\t\t\t\t? \"generating summary draft...\"\n\t\t\t\t\t\t: details?.phase === \"waiting-for-approval\"\n\t\t\t\t\t\t\t? \"summary draft ready; approve in browser...\"\n\t\t\t\t\t\t\t: \"waiting for summary approval in browser...\";\n\t\t\t\t\tconst lines = [theme.fg(\"accent\", phaseText)];\n\t\t\t\t\tif (details?.curatorUrl) {\n\t\t\t\t\t\tlines.push(theme.fg(\"muted\", ` ${details.curatorUrl}`));\n\t\t\t\t\t}\n\t\t\t\t\tconst timeout = typeof details?.timeoutSeconds === \"number\" ? details.timeoutSeconds : undefined;\n\t\t\t\t\tconst shortcut = typeof details?.shortcut === \"string\" ? details.shortcut : curateKey;\n\t\t\t\t\tif (timeout) {\n\t\t\t\t\t\tlines.push(theme.fg(\"dim\", ` auto-submits after ${timeout}s idle; ${shortcut} reopens`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlines.push(theme.fg(\"dim\", ` ${shortcut} reopens`));\n\t\t\t\t\t}\n\t\t\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t\t\t}\n\t\t\t\tif (details?.phase === \"searching\") {\n\t\t\t\t\tconst progress = details?.progress ?? 0;\n\t\t\t\t\tconst bar = \"\\u2588\".repeat(Math.floor(progress * 10)) + \"\\u2591\".repeat(10 - Math.floor(progress * 10));\n\t\t\t\t\tconst query = details?.currentQuery || \"\";\n\t\t\t\t\tconst display = query.length > 40 ? query.slice(0, 37) + \"...\" : query;\n\t\t\t\t\treturn new Text(theme.fg(\"accent\", `[${bar}] ${display}`), 0, 0);\n\t\t\t\t}\n\t\t\t\tconst progress = details?.progress ?? 0;\n\t\t\t\tconst bar = \"\\u2588\".repeat(Math.floor(progress * 10)) + \"\\u2591\".repeat(10 - Math.floor(progress * 10));\n\t\t\t\treturn new Text(theme.fg(\"accent\", `[${bar}] ${details?.phase || \"searching\"}`), 0, 0);\n\t\t\t}\n\n\t\t\tif (details?.error) {\n\t\t\t\t// Expandable Ctrl+O diagnostics: which queries completed, per-query errors,\n\t\t\t\t// browser connection state, cancel reason. See render-search-error.ts.\n\t\t\t\tconst plan = buildSearchErrorPlan(details as SearchErrorDetails);\n\t\t\t\tif (plan) return renderSearchErrorPlan(plan, expanded, theme);\n\t\t\t\treturn new Text(theme.fg(\"error\", `Error: ${details.error}`), 0, 0);\n\t\t\t}\n\n\t\t\tlet statusLine: string;\n\t\t\tconst queryInfo = details?.queryCount === 1 ? \"\" : `${details?.successfulQueries}/${details?.queryCount} queries, `;\n\t\t\tstatusLine = theme.fg(\"success\", `${queryInfo}${details?.totalResults ?? 0} sources`);\n\t\t\tif (details?.curated && details?.curatedFrom) {\n\t\t\t\tstatusLine += theme.fg(\"muted\", ` (${details.queryCount}/${details.curatedFrom} queries curated)`);\n\t\t\t}\n\t\t\tif (details?.fetchId && details?.fetchUrls) {\n\t\t\t\tstatusLine += theme.fg(\"muted\", ` (fetching ${details.fetchUrls.length} URLs)`);\n\t\t\t} else if (details?.fetchId) {\n\t\t\t\tstatusLine += theme.fg(\"muted\", \" (content ready)\");\n\t\t\t}\n\n\t\t\t// Build expanded lines first so collapsed view can reference total count\n\t\t\tconst lines = [statusLine];\n\t\t\tif (details?.summary?.text) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\tlines.push(theme.fg(\"accent\", `── Summary (${details.summary.workflow}) ` + \"─\".repeat(32)));\n\t\t\t\tlines.push(\"\");\n\t\t\t\tfor (const line of details.summary.text.split(\"\\n\")) {\n\t\t\t\t\tlines.push(` ${line}`);\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t\tconst metaParts = [\n\t\t\t\t\tdetails.summary.model ? `model=${details.summary.model}` : \"model=deterministic\",\n\t\t\t\t\t`duration=${details.summary.durationMs}ms`,\n\t\t\t\t\t`tokens~${details.summary.tokenEstimate}`,\n\t\t\t\t\tdetails.summary.fallbackUsed ? \"fallback=true\" : \"fallback=false\",\n\t\t\t\t\tdetails.summary.phase ? `phase=${details.summary.phase}` : \"\",\n\t\t\t\t\tdetails.summary.edited ? \"edited=true\" : \"edited=false\",\n\t\t\t\t];\n\t\t\t\tif (details.summary.fallbackReason) {\n\t\t\t\t\tmetaParts.push(`reason=${details.summary.fallbackReason}`);\n\t\t\t\t}\n\t\t\t\tlines.push(theme.fg(\"dim\", \" \" + metaParts.filter(Boolean).join(\" · \")));\n\t\t\t}\n\n\t\t\tconst queryDetails = details?.curatedQueries;\n\t\t\tif (queryDetails?.length) {\n\t\t\t\tconst kept = queryDetails.length;\n\t\t\t\tconst from = details?.curatedFrom ?? kept;\n\t\t\t\tlines.push(\"\");\n\t\t\t\tlines.push(theme.fg(\"accent\", `\\u2500\\u2500 Curated Results (${kept} of ${from} queries kept) ` + \"\\u2500\".repeat(24)));\n\n\t\t\t\tfor (const cq of queryDetails) {\n\t\t\t\t\tlines.push(\"\");\n\t\t\t\t\tconst dq = cq.query.length > 65 ? cq.query.slice(0, 62) + \"...\" : cq.query;\n\t\t\t\t\tconst providerLabel = cq.provider ? ` (${cq.provider})` : \"\";\n\t\t\t\t\tlines.push(theme.fg(\"accent\", ` \"${dq}\"${providerLabel}`));\n\n\t\t\t\t\tif (cq.error) {\n\t\t\t\t\t\tlines.push(theme.fg(\"error\", ` ${cq.error}`));\n\t\t\t\t\t} else if (cq.answer) {\n\t\t\t\t\t\tlines.push(\"\");\n\t\t\t\t\t\tfor (const line of cq.answer.split(\"\\n\")) {\n\t\t\t\t\t\t\tlines.push(` ${line}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (cq.sources.length > 0) {\n\t\t\t\t\t\tlines.push(\"\");\n\t\t\t\t\t\tfor (const s of cq.sources) {\n\t\t\t\t\t\t\tconst domain = s.url.replace(/^https?:\\/\\//, \"\").replace(/\\/.*$/, \"\");\n\t\t\t\t\t\t\tconst title = s.title.length > 50 ? s.title.slice(0, 47) + \"...\" : s.title;\n\t\t\t\t\t\t\tlines.push(theme.fg(\"muted\", ` \\u25b8 ${title}`) + theme.fg(\"dim\", ` \\u00b7 ${domain}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t} else {\n\t\t\t\tconst textContent = result.content.find((c) => c.type === \"text\")?.text || \"\";\n\t\t\t\tconst preview = textContent.length > 500 ? textContent.slice(0, 500) + \"...\" : textContent;\n\t\t\t\tfor (const line of preview.split(\"\\n\")) {\n\t\t\t\t\tlines.push(theme.fg(\"dim\", line));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (details?.fetchUrls && details.fetchUrls.length > 0) {\n\t\t\t\tif (details.curated) {\n\t\t\t\t\tlines.push(theme.fg(\"muted\", `Fetching ${details.fetchUrls.length} URLs in background`));\n\t\t\t\t} else {\n\t\t\t\t\tlines.push(theme.fg(\"muted\", \"Fetching:\"));\n\t\t\t\t\tfor (const u of details.fetchUrls.slice(0, 5)) {\n\t\t\t\t\t\tconst display = u.length > 60 ? u.slice(0, 57) + \"...\" : u;\n\t\t\t\t\t\tlines.push(theme.fg(\"dim\", \" \" + display));\n\t\t\t\t\t}\n\t\t\t\t\tif (details.fetchUrls.length > 5) {\n\t\t\t\t\t\tlines.push(theme.fg(\"dim\", ` ... and ${details.fetchUrls.length - 5} more`));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst totalLines = lines.length;\n\n\t\t\tif (!expanded) {\n\t\t\t\tconst box = new Box(1, 0);\n\t\t\t\tbox.addChild(new Text(statusLine, 0, 0));\n\n\t\t\t\tlet collapsedLines = 1; // statusLine\n\t\t\t\tconst summaryPreview = details?.summary?.text?.trim() || \"\";\n\t\t\t\tif (summaryPreview) {\n\t\t\t\t\tconst preview = summaryPreview.length > 120 ? summaryPreview.slice(0, 117) + \"...\" : summaryPreview;\n\t\t\t\t\tbox.addChild(new Text(theme.fg(\"dim\", preview), 0, 0));\n\t\t\t\t\tcollapsedLines++;\n\t\t\t\t} else if (details?.curatedQueries?.length) {\n\t\t\t\t\tfor (const cq of details.curatedQueries.slice(0, 3)) {\n\t\t\t\t\t\tconst dq = cq.query.length > 55 ? cq.query.slice(0, 52) + \"...\" : cq.query;\n\t\t\t\t\t\tconst srcCount = cq.sources?.length ?? 0;\n\t\t\t\t\t\tconst suffix = cq.error ? theme.fg(\"error\", \" (error)\") : theme.fg(\"dim\", ` · ${srcCount} sources`);\n\t\t\t\t\t\tbox.addChild(new Text(theme.fg(\"accent\", ` \"${dq}\"`) + suffix, 0, 0));\n\t\t\t\t\t\tcollapsedLines++;\n\t\t\t\t\t}\n\t\t\t\t\tif (details.curatedQueries.length > 3) {\n\t\t\t\t\t\tbox.addChild(new Text(theme.fg(\"dim\", ` ... and ${details.curatedQueries.length - 3} more`), 0, 0));\n\t\t\t\t\t\tcollapsedLines++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst textContent = result.content.find((c) => c.type === \"text\")?.text || \"\";\n\t\t\t\t\tconst firstContentLine = textContent.split(\"\\n\").find(l => {\n\t\t\t\t\t\tconst t = l.trim();\n\t\t\t\t\t\treturn t && !t.startsWith(\"[\") && !t.startsWith(\"#\") && !t.startsWith(\"---\");\n\t\t\t\t\t});\n\t\t\t\t\tconst fallbackLine = (firstContentLine?.trim() || \"\").replace(/\\*\\*/g, \"\");\n\t\t\t\t\tif (fallbackLine) {\n\t\t\t\t\t\tconst preview = fallbackLine.length > 120 ? fallbackLine.slice(0, 117) + \"...\" : fallbackLine;\n\t\t\t\t\t\tbox.addChild(new Text(theme.fg(\"dim\", preview), 0, 0));\n\t\t\t\t\t\tcollapsedLines++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst moreLines = Math.max(0, totalLines - collapsedLines);\n\t\t\t\tif (moreLines > 0) {\n\t\t\t\t\tbox.addChild(new Text(theme.fg(\"muted\", `\\n... (${moreLines} more lines, ${totalLines} total, ctrl+o to expand)`), 0, 0));\n\t\t\t\t}\n\t\t\t\treturn box;\n\t\t\t}\n\n\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t},\n\t});\n\n\tif (sourceCheckEnabled) pi.registerTool({\n\t\tname: toolNames.sourceCheck,\n\t\tlabel: \"Source Check\",\n\t\tdescription: \"Check a claim against web sources and return a bounded machine-readable research artifact with exact passage citations.\",\n\t\tpromptSnippet: \"Verify a claim with structured source evidence and passage-level citations.\",\n\t\tparameters: Type.Object({\n\t\t\tclaim: Type.String({ description: \"The assertion to check against web sources.\" }),\n\t\t\tqueries: Type.Optional(Type.Array(Type.String(), { description: \"Search queries (default: the claim).\" })),\n\t\t\tnumResults: Type.Optional(Type.Integer({ minimum: 1, maximum: 20, description: \"Results per query (default: 5, max: 20).\" })),\n\t\t\tfetchContent: Type.Optional(Type.Boolean({ description: \"Fetch up to 5 result pages for exact passage extraction.\" })),\n\t\t\trecencyFilter: Type.Optional(StringEnum([\"day\", \"week\", \"month\", \"year\"], { description: \"Filter by recency.\" })),\n\t\t\tdomainFilter: Type.Optional(Type.Array(Type.String(), { description: \"Limit to domains; prefix with - to exclude.\" })),\n\t\t\tprovider: Type.Optional(searchProviderSchema(\"Search provider or non-empty list of providers to search simultaneously; all searches every eligible provider except DuckDuckGo, AnySearch, xAI, Bright Data, SerpBase, Serper, and Valyu\")),\n\t\t}),\n\t\tasync execute(_callId, params, signal, _onUpdate, ctx) {\n\t\t\tconst claim = typeof params.claim === \"string\" ? params.claim.trim() : \"\";\n\t\t\tif (!claim) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: 'claim' is required.\" }], details: { error: \"Missing claim\" } };\n\t\t\t}\n\n\t\t\tconst requestedQueries = Array.isArray(params.queries)\n\t\t\t\t? params.queries.filter((query): query is string => typeof query === \"string\").map((query) => query.trim()).filter(Boolean)\n\t\t\t\t: [];\n\t\t\tconst queries = (requestedQueries.length > 0 ? requestedQueries : [claim]).slice(0, 8);\n\t\t\tconst numResults = typeof params.numResults === \"number\" && Number.isFinite(params.numResults)\n\t\t\t\t? Math.min(20, Math.max(1, Math.floor(params.numResults)))\n\t\t\t\t: 5;\n\t\t\tconst domainFilter = Array.isArray(params.domainFilter)\n\t\t\t\t? params.domainFilter.filter((domain): domain is string => typeof domain === \"string\")\n\t\t\t\t: undefined;\n\t\t\tconst recencyFilter = normalizeRecencyFilter(params.recencyFilter);\n\t\t\tconst resultsByUrl = new Map<string, SearchResult>();\n\t\t\tconst summaries: string[] = [];\n\t\t\tconst errors: Array<{ query: string; error: string }> = [];\n\t\t\tlet provider: string | undefined;\n\n\t\t\tfor (const query of queries) {\n\t\t\t\tif (signal?.aborted) break;\n\t\t\t\ttry {\n\t\t\t\t\tconst response = await search(query, {\n\t\t\t\t\t\tprovider: resolveRequestedProvider(params.provider),\n\t\t\t\t\t\tnumResults,\n\t\t\t\t\t\trecencyFilter,\n\t\t\t\t\t\tdomainFilter,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t});\n\t\t\t\t\tif (signal?.aborted) break;\n\t\t\t\t\tprovider ??= response.provider;\n\t\t\t\t\tif (response.answer) summaries.push(`${query}: ${response.answer}`);\n\t\t\t\t\tfor (const result of response.results) {\n\t\t\t\t\t\tif (!resultsByUrl.has(result.url)) resultsByUrl.set(result.url, result);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (signal?.aborted || isAbortError(err)) break;\n\t\t\t\t\terrors.push({ query, error: err instanceof Error ? err.message : String(err) });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst results = [...resultsByUrl.values()].slice(0, 20).map((result, index) => ({ ...result, rank: index + 1 }));\n\t\t\tlet fetched: ExtractedContent[] = [];\n\t\t\tif (params.fetchContent && results.length > 0) {\n\t\t\t\tconst urls = results.slice(0, 5).map((result) => result.url);\n\t\t\t\ttry {\n\t\t\t\t\tfetched = await fetchAllContent(urls, signal);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (signal?.aborted || isAbortError(err)) throw err;\n\t\t\t\t\tfetched = urls.map((url) => ({ url, title: \"\", content: \"\", error: err instanceof Error ? err.message : String(err) }));\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst artifact = withClaimAssessment(buildResearchArtifact({\n\t\t\t\tquery: claim,\n\t\t\t\tprovider,\n\t\t\t\tsummary: summaries.length > 0 ? summaries.join(\"\\n\\n\") : undefined,\n\t\t\t\tresults,\n\t\t\t\tfetched,\n\t\t\t\trecency: recencyFilter,\n\t\t\t\tdomainFilter,\n\t\t\t}), [claim]);\n\t\t\tif (errors.length > 0) artifact.errors = errors;\n\t\t\tstoreResearchArtifact(artifact);\n\t\t\tpi.appendEntry(\"web-search-results\", {\n\t\t\t\tid: artifact.id,\n\t\t\t\ttype: \"research\",\n\t\t\t\ttimestamp: artifact.timestamp,\n\t\t\t\tartifact,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: formatSourceCheckResult(artifact, getSearchContentEnabled ? toolNames.getSearchContent : null) }],\n\t\t\t\tdetails: { responseId: artifact.id, artifact, sourceCount: artifact.sources.length, passageCount: artifact.passages.length },\n\t\t\t};\n\t\t},\n\t});\n\n\tif (fetchContentEnabled) pi.registerTool({\n\t\tname: toolNames.fetchContent,\n\t\tlabel: \"Fetch Content\",\n\t\tdescription: `Fetch URL(s) and extract readable content as markdown. Use mode \"raw\" for exact textual HTTP response bodies or mode \"answer\" with prompt to answer using only fetched content. Direct image URLs return resized image content. Supports YouTube transcripts, GitHub repositories, PDFs, and local videos. ${fetchContentStorageNote}`,\n\t\tpromptSnippet:\n\t\t\t\"Use to fetch readable or raw URL content, direct images, GitHub repos, and videos. Mode answer answers a prompt using only the fetched source.\",\n\t\tparameters: Type.Object({\n\t\t\turl: Type.Optional(Type.String({ description: \"Single URL to fetch\" })),\n\t\t\turls: Type.Optional(Type.Array(Type.String(), { description: \"Multiple URLs (parallel)\" })),\n\t\t\tforceClone: Type.Optional(Type.Boolean({\n\t\t\t\tdescription: \"Force cloning large GitHub repositories that exceed the size threshold\",\n\t\t\t})),\n\t\t\tprompt: Type.Optional(Type.String({\n\t\t\t\tdescription: \"Question or instruction for video analysis, or the page-local question required by mode answer.\",\n\t\t\t})),\n\t\t\tmode: Type.Optional(StringEnum([\"readable\", \"raw\", \"answer\"], {\n\t\t\t\tdescription: \"Fetch mode: readable (default extraction), raw (exact textual HTTP body), or answer (answer prompt using only fetched content).\",\n\t\t\t})),\n\t\t\tanswerModel: Type.Optional(Type.String({\n\t\t\t\tdescription: \"Optional provider/model-id override for mode answer. Defaults to the current Pi model.\",\n\t\t\t})),\n\t\t\ttimestamp: Type.Optional(Type.String({\n\t\t\t\tdescription: \"Extract video frame(s) at a timestamp or time range. Single: '1:23:45', '23:45', or '85' (seconds). Range: '23:41-25:00' extracts evenly-spaced frames across that span (default 6). Use frames with ranges to control density; single+frames uses a fixed 5s interval. YouTube requires yt-dlp + ffmpeg; local videos require ffmpeg. Use a range when you know the approximate area but not the exact moment — you'll get a contact sheet to visually identify the right frame.\",\n\t\t\t})),\n\t\t\tframes: Type.Optional(Type.Integer({\n\t\t\t\tminimum: 1,\n\t\t\t\tmaximum: 12,\n\t\t\t\tdescription: \"Number of frames to extract. Use with timestamp range for custom density, with single timestamp to get N frames at 5s intervals, or alone to sample across the entire video. Requires yt-dlp + ffmpeg for YouTube, ffmpeg for local video.\",\n\t\t\t})),\n\t\t\tmodel: Type.Optional(Type.String({\n\t\t\t\tdescription: \"Override the Gemini model for video/YouTube analysis (e.g. 'gemini-3.6-flash'). Defaults to config or gemini-3.6-flash.\",\n\t\t\t})),\n\t\t\tauth: Type.Optional(Type.Union([Type.String(), Type.Boolean()], {\n\t\t\t\tdescription: \"Opt into an authFetch profile for local browser-cookie fetching. Use a profile name, or true only when exactly one profile exists.\",\n\t\t\t})),\n\t\t}),\n\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx): Promise<AgentToolResult<Record<string, unknown>>> {\n\t\t\tlet normalized: ReturnType<typeof normalizeFetchContentParams>;\n\t\t\ttry {\n\t\t\t\tnormalized = normalizeFetchContentParams(params);\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err.message : String(err);\n\t\t\t\treturn { content: [{ type: \"text\", text: `Error: ${error}` }], details: { error } };\n\t\t\t}\n\t\t\tconst { urlList, options } = normalized;\n\t\t\tconst mode = options.mode ?? \"readable\";\n\t\t\tif (mode === \"answer\" && !options.prompt) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: mode answer requires prompt.\" }], details: { error: \"mode answer requires prompt\" } };\n\t\t\t}\n\t\t\tif (mode === \"raw\" && (options.forceClone === true || options.timestamp || options.frames || options.prompt || options.model || options.answerModel)) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: mode raw cannot be combined with forceClone, prompt, timestamp, frames, model, or answerModel.\" }], details: { error: \"Incompatible raw mode options\" } };\n\t\t\t}\n\t\t\tif (mode !== \"answer\" && options.answerModel) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: answerModel requires mode answer.\" }], details: { error: \"answerModel requires mode answer\" } };\n\t\t\t}\n\t\t\tif (mode === \"answer\" && options.model) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: use answerModel, not model, with mode answer.\" }], details: { error: \"model is incompatible with mode answer\" } };\n\t\t\t}\n\t\t\tif (mode === \"answer\" && options.auth !== undefined) {\n\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: auth cannot be combined with mode answer.\" }], details: { error: \"auth cannot be combined with mode answer\" } };\n\t\t\t}\n\t\t\tlet authFetchProfile: AuthFetchProfile | undefined;\n\t\t\tif (options.auth !== undefined) {\n\t\t\t\ttry {\n\t\t\t\t\tauthFetchProfile = resolveAuthFetchProfile(options.auth);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err);\n\t\t\t\t\treturn { content: [{ type: \"text\", text: `Error: ${error}` }], details: { error } };\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (urlList.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: No URL provided.\" }],\n\t\t\t\t\tdetails: { error: \"No URL provided\" },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tonUpdate?.({\n\t\t\t\tcontent: [{ type: \"text\", text: `Fetching ${urlList.length} URL(s)...` }],\n\t\t\t\tdetails: { phase: \"fetch\", progress: 0 },\n\t\t\t});\n\n\t\t\tconst { answerModel: _answerModel, auth: _auth, ...extractionOptions } = options;\n\t\t\tconst fetchOptions = mode === \"answer\"\n\t\t\t\t? (() => {\n\t\t\t\t\tconst { prompt: _prompt, ...rest } = extractionOptions;\n\t\t\t\t\treturn { ...rest, ...(authFetchProfile ? { authFetchProfile } : {}) };\n\t\t\t\t})()\n\t\t\t\t: { ...extractionOptions, ...(authFetchProfile ? { authFetchProfile } : {}) };\n\t\t\tconst fetchResults = await fetchAllContent(urlList, signal, fetchOptions);\n\t\t\tconst presentedResults = mode === \"answer\"\n\t\t\t\t? await Promise.all(fetchResults.map(async result => {\n\t\t\t\t\tif (result.error) return result;\n\t\t\t\t\tif (result.thumbnail || result.mimeType?.startsWith(\"image/\")) {\n\t\t\t\t\t\treturn { ...result, error: \"Page answer requires textual fetched content\" };\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst answer = await answerFromPage({\n\t\t\t\t\t\t\tquestion: options.prompt!,\n\t\t\t\t\t\t\tpageText: result.content,\n\t\t\t\t\t\t\tsourceUrl: result.url,\n\t\t\t\t\t\t\t...(options.answerModel ? { model: options.answerModel } : {}),\n\t\t\t\t\t\t}, ctx, signal);\n\t\t\t\t\t\treturn { ...result, content: answer.text };\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\treturn { ...result, error: `Page answer failed: ${err instanceof Error ? err.message : String(err)}` };\n\t\t\t\t\t}\n\t\t\t\t}))\n\t\t\t\t: fetchResults;\n\t\t\tconst successful = presentedResults.filter((r) => !r.error).length;\n\t\t\tconst totalChars = presentedResults.reduce((sum, r) => sum + r.content.length, 0);\n\n\t\t\tconst responseId = generateId();\n\t\t\tconst data = {\n\t\t\t\tid: responseId,\n\t\t\t\ttype: \"fetch\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\turls: stripThumbnails(fetchResults),\n\t\t\t} satisfies StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] };\n\t\t\tconst storedContent = storeFetchResult(pi, responseId, data, authFetchProfile);\n\n\t\t\t// Single URL: return content directly (possibly truncated) with responseId\n\t\t\tif (urlList.length === 1) {\n\t\t\t\tconst result = presentedResults[0];\n\t\t\t\tif (result.error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Error: ${result.error}` }],\n\t\t\t\t\t\tdetails: { urls: urlList, urlCount: 1, successful: 0, error: result.error, ...(storedContent ? { responseId } : {}), prompt: params.prompt, timestamp: params.timestamp, frames: params.frames },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst fullLength = result.content.length;\n\t\t\t\tconst slice = initialContentSlice(result.content, getMaxInlineContentChars());\n\t\t\t\tconst truncated = slice.endOffset < fullLength;\n\t\t\t\tlet output = slice.text;\n\n\t\t\t\tif (truncated) {\n\t\t\t\t\toutput += `\\n\\n---\\nShowing ${slice.endOffset} of ${fullLength} chars, ${slice.shownBytes} of ${slice.totalBytes} bytes, and ${slice.shownLines} of ${slice.totalLines} lines. `;\n\t\t\t\t\toutput += storedContent\n\t\t\t\t\t\t? getSearchContentEnabled\n\t\t\t\t\t\t\t? `Use ${toolNames.getSearchContent}({ responseId: \"${responseId}\", urlIndex: 0, offset: ${slice.endOffset} }) for the next slice.`\n\t\t\t\t\t\t\t: \"Content retrieval is not registered.\"\n\t\t\t\t\t\t: \"Authenticated fetch cache is off; repeat the fetch to read more.\";\n\t\t\t\t}\n\n\t\t\t\tconst content: Array<TextContent | ImageContent> = [];\n\t\t\t\tif (result.frames?.length) {\n\t\t\t\t\tfor (const frame of result.frames) {\n\t\t\t\t\t\tcontent.push({ type: \"image\", data: frame.data, mimeType: frame.mimeType });\n\t\t\t\t\t\tcontent.push({ type: \"text\", text: `Frame at ${frame.timestamp}` });\n\t\t\t\t\t}\n\t\t\t\t} else if (result.thumbnail) {\n\t\t\t\t\tcontent.push({ type: \"image\", data: result.thumbnail.data, mimeType: result.thumbnail.mimeType });\n\t\t\t\t}\n\t\t\t\tcontent.push({ type: \"text\", text: output });\n\n\t\t\t\tconst imageCount = (result.frames?.length ?? 0) + (result.thumbnail ? 1 : 0);\n\t\t\t\treturn {\n\t\t\t\t\tcontent,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\turls: urlList,\n\t\t\t\t\t\turlCount: 1,\n\t\t\t\t\t\tsuccessful: 1,\n\t\t\t\t\t\ttotalChars: fullLength,\n\t\t\t\t\t\ttitle: result.title,\n\t\t\t\t\t\t...(storedContent ? { responseId } : {}),\n\t\t\t\t\t\ttruncated,\n\t\t\t\t\t\thasImage: imageCount > 0,\n\t\t\t\t\t\timageCount,\n\t\t\t\t\t\tprompt: params.prompt,\n\t\t\t\t\t\ttimestamp: params.timestamp,\n\t\t\t\t\t\tframes: params.frames,\n\t\t\t\t\t\tduration: result.duration,\n\t\t\t\t\t\tmode,\n\t\t\t\t\t\tmimeType: result.mimeType,\n\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\ttotalBytes: slice.totalBytes,\n\t\t\t\t\t\ttotalLines: slice.totalLines,\n\t\t\t\t\t\tshownBytes: slice.shownBytes,\n\t\t\t\t\t\tshownLines: slice.shownLines,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Multi-URL: existing behavior (summary + responseId)\n\t\t\tlet output = \"## Fetched URLs\\n\\n\";\n\t\t\tfor (const { url, title, content, error } of presentedResults) {\n\t\t\t\tif (error) {\n\t\t\t\t\toutput += `- ${url}: Error - ${error}\\n`;\n\t\t\t\t} else {\n\t\t\t\t\toutput += `- ${title || url} (${content.length} chars)\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t\toutput += storedContent\n\t\t\t\t? getSearchContentEnabled\n\t\t\t\t\t? `\\n---\\nUse ${toolNames.getSearchContent}({ responseId: \"${responseId}\", urlIndex: 0 }) to retrieve bounded content slices.`\n\t\t\t\t\t: \"\\n---\\nContent retrieval is not registered.\"\n\t\t\t\t: \"\\n---\\nAuthenticated fetch cache is off; repeat the fetch to read content.\";\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\tdetails: { urls: urlList, urlCount: urlList.length, successful, totalChars, ...(storedContent ? { responseId } : {}) },\n\t\t\t};\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\tconst { urlList, options } = normalizeFetchContentParams(args);\n\t\t\tconst { prompt, timestamp, frames, model, mode, answerModel, auth } = options;\n\t\t\tif (urlList.length === 0) {\n\t\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"fetch \")) + theme.fg(\"error\", \"(no URL)\"), 0, 0);\n\t\t\t}\n\t\t\tconst lines: string[] = [];\n\t\t\tif (urlList.length === 1) {\n\t\t\t\tconst display = urlList[0].length > 60 ? urlList[0].slice(0, 57) + \"...\" : urlList[0];\n\t\t\t\tlines.push(theme.fg(\"toolTitle\", theme.bold(\"fetch \")) + theme.fg(\"accent\", display));\n\t\t\t} else {\n\t\t\t\tlines.push(theme.fg(\"toolTitle\", theme.bold(\"fetch \")) + theme.fg(\"accent\", `${urlList.length} URLs`));\n\t\t\t\tfor (const u of urlList.slice(0, 5)) {\n\t\t\t\t\tconst display = u.length > 60 ? u.slice(0, 57) + \"...\" : u;\n\t\t\t\t\tlines.push(theme.fg(\"muted\", \" \" + display));\n\t\t\t\t}\n\t\t\t\tif (urlList.length > 5) {\n\t\t\t\t\tlines.push(theme.fg(\"muted\", ` ... and ${urlList.length - 5} more`));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (mode && mode !== \"readable\") {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" mode: \") + theme.fg(\"warning\", mode));\n\t\t\t}\n\t\t\tif (timestamp) {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" timestamp: \") + theme.fg(\"warning\", timestamp));\n\t\t\t}\n\t\t\tif (typeof frames === \"number\") {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" frames: \") + theme.fg(\"warning\", String(frames)));\n\t\t\t}\n\t\t\tif (prompt) {\n\t\t\t\tconst display = prompt.length > 250 ? prompt.slice(0, 247) + \"...\" : prompt;\n\t\t\t\tlines.push(theme.fg(\"dim\", \" prompt: \") + theme.fg(\"muted\", `\"${display}\"`));\n\t\t\t}\n\t\t\tif (model) {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" model: \") + theme.fg(\"warning\", model));\n\t\t\t}\n\t\t\tif (answerModel) {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" answer model: \") + theme.fg(\"warning\", answerModel));\n\t\t\t}\n\t\t\tif (auth !== undefined) {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" auth: \") + theme.fg(\"warning\", auth === true ? \"true\" : auth));\n\t\t\t}\n\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t},\n\n\t\trenderResult(result, { expanded, isPartial }, theme) {\n\t\t\tconst details = result.details as {\n\t\t\t\turlCount?: number;\n\t\t\t\tsuccessful?: number;\n\t\t\t\ttotalChars?: number;\n\t\t\t\terror?: string;\n\t\t\t\ttitle?: string;\n\t\t\t\ttruncated?: boolean;\n\t\t\t\tresponseId?: string;\n\t\t\t\tphase?: string;\n\t\t\t\tprogress?: number;\n\t\t\t\thasImage?: boolean;\n\t\t\t\timageCount?: number;\n\t\t\t\tprompt?: string;\n\t\t\t\ttimestamp?: string;\n\t\t\t\tframes?: number;\n\t\t\t\tduration?: number;\n\t\t\t};\n\n\t\t\tif (isPartial) {\n\t\t\t\tconst progress = details?.progress ?? 0;\n\t\t\t\tconst bar = \"\\u2588\".repeat(Math.floor(progress * 10)) + \"\\u2591\".repeat(10 - Math.floor(progress * 10));\n\t\t\t\treturn new Text(theme.fg(\"accent\", `[${bar}] ${details?.phase || \"fetching\"}`), 0, 0);\n\t\t\t}\n\n\t\t\tif (details?.error) {\n\t\t\t\tconst fd = details as typeof details & { urls?: string[] };\n\t\t\t\tconst extras: string[] = [];\n\t\t\t\tif (typeof fd.urlCount === \"number\" || typeof fd.successful === \"number\") {\n\t\t\t\t\textras.push(`urls: ${fd.successful ?? 0}/${fd.urlCount ?? 0} succeeded`);\n\t\t\t\t}\n\t\t\t\tif (fd.responseId) extras.push(`response id: ${fd.responseId}`);\n\t\t\t\tif (fd.urls && fd.urls.length > 0) {\n\t\t\t\t\tfor (const u of fd.urls.slice(0, 8)) extras.push(` \\u25b8 ${u}`);\n\t\t\t\t\tif (fd.urls.length > 8) extras.push(` ... and ${fd.urls.length - 8} more`);\n\t\t\t\t}\n\t\t\t\tconst plan = buildSearchErrorPlan({ error: details.error, extraLines: extras });\n\t\t\t\tif (plan) return renderSearchErrorPlan(plan, expanded, theme);\n\t\t\t\treturn new Text(theme.fg(\"error\", `Error: ${details.error}`), 0, 0);\n\t\t\t}\n\n\t\t\tif (details?.urlCount === 1) {\n\t\t\t\tconst title = details?.title || \"Untitled\";\n\t\t\t\tconst imgCount = details?.imageCount ?? (details?.hasImage ? 1 : 0);\n\t\t\t\tconst imageBadge = imgCount > 1\n\t\t\t\t\t? theme.fg(\"accent\", ` [${imgCount} images]`)\n\t\t\t\t\t: imgCount === 1\n\t\t\t\t\t\t? theme.fg(\"accent\", \" [image]\")\n\t\t\t\t\t\t: \"\";\n\t\t\t\tlet statusLine = theme.fg(\"success\", title) + theme.fg(\"muted\", ` (${details?.totalChars ?? 0} chars)`) + imageBadge;\n\t\t\t\tif (details?.truncated) {\n\t\t\t\t\tstatusLine += theme.fg(\"warning\", \" [truncated]\");\n\t\t\t\t}\n\t\t\t\tif (typeof details?.duration === \"number\") {\n\t\t\t\t\tstatusLine += theme.fg(\"muted\", ` | ${formatSeconds(Math.floor(details.duration))} total`);\n\t\t\t\t}\n\t\t\t\tconst textContent = result.content.find((c) => c.type === \"text\")?.text || \"\";\n\t\t\t\tif (!expanded) {\n\t\t\t\t\tconst brief = textContent.length > 200 ? textContent.slice(0, 200) + \"...\" : textContent;\n\t\t\t\t\treturn new Text(statusLine + \"\\n\" + theme.fg(\"dim\", brief), 0, 0);\n\t\t\t\t}\n\t\t\t\tconst lines = [statusLine];\n\t\t\t\tif (details?.prompt) {\n\t\t\t\t\tconst display = details.prompt.length > 250 ? details.prompt.slice(0, 247) + \"...\" : details.prompt;\n\t\t\t\t\tlines.push(theme.fg(\"dim\", ` prompt: \"${display}\"`));\n\t\t\t\t}\n\t\t\t\tif (details?.timestamp) {\n\t\t\t\t\tlines.push(theme.fg(\"dim\", ` timestamp: ${details.timestamp}`));\n\t\t\t\t}\n\t\t\t\tif (typeof details?.frames === \"number\") {\n\t\t\t\t\tlines.push(theme.fg(\"dim\", ` frames: ${details.frames}`));\n\t\t\t\t}\n\t\t\t\tconst preview = textContent.length > 500 ? textContent.slice(0, 500) + \"...\" : textContent;\n\t\t\t\tlines.push(theme.fg(\"dim\", preview));\n\t\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t\t}\n\n\t\t\tconst countColor = (details?.successful ?? 0) > 0 ? \"success\" : \"error\";\n\t\t\tconst statusLine = theme.fg(countColor, `${details?.successful}/${details?.urlCount} URLs`) + theme.fg(\"muted\", getSearchContentEnabled ? \" (content stored)\" : \" (content fetched)\");\n\t\t\tif (!expanded) {\n\t\t\t\treturn new Text(statusLine, 0, 0);\n\t\t\t}\n\t\t\tconst textContent = result.content.find((c) => c.type === \"text\")?.text || \"\";\n\t\t\tconst preview = textContent.length > 500 ? textContent.slice(0, 500) + \"...\" : textContent;\n\t\t\treturn new Text(statusLine + \"\\n\" + theme.fg(\"dim\", preview), 0, 0);\n\t\t},\n\t});\n\n\tif (getSearchContentEnabled) {\n\t\tconst maxInlineContentChars = getMaxInlineContentChars(initConfig);\n\t\tpi.registerTool({\n\t\tname: toolNames.getSearchContent,\n\t\tlabel: \"Get Search Content\",\n\t\tdescription: `Retrieve bounded content slices or find matching passages in a previous ${storedContentSources} call.`,\n\t\tpromptSnippet:\n\t\t\t`Use after ${storedContentSources} to retrieve stored content via responseId. Use findText to locate passages without paging through the full content.`,\n\t\tparameters: Type.Object({\n\t\t\tresponseId: Type.String({ description: `The responseId from ${storedContentSources}` }),\n\t\t\tquery: Type.Optional(Type.String({ description: searchQueryDescription })),\n\t\t\tqueryIndex: Type.Optional(Type.Integer({ minimum: 0, description: \"Get content for query at index\" })),\n\t\t\turl: Type.Optional(Type.String({ description: \"Get content for this URL\" })),\n\t\t\turlIndex: Type.Optional(Type.Integer({ minimum: 0, description: \"Get content for URL at index\" })),\n\t\t\toffset: Type.Optional(Type.Integer({ minimum: 0, description: \"Character offset for fetched URL content slices (default 0). Cannot be combined with findText.\" })),\n\t\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: maxInlineContentChars, description: \"Maximum characters to return for fetched URL content slices (default and max are set by maxInlineContentChars). Cannot be combined with findText.\" })),\n\t\t\tfindText: Type.Optional(Type.Union([\n\t\t\t\tType.String({ minLength: 1, maxLength: 500 }),\n\t\t\t\tType.Array(Type.String({ minLength: 1, maxLength: 500 }), { minItems: 1, maxItems: 10 }),\n\t\t\t], { description: \"Text or texts to find in the selected stored content. Cannot be combined with offset or limit.\" })),\n\t\t\tfindMode: Type.Optional(StringEnum([\"exact\", \"case-insensitive\", \"fuzzy\"], { description: \"Matching mode for findText (default: case-insensitive). Requires findText.\" })),\n\t\t}),\n\n\t\tasync execute(_toolCallId, params): Promise<AgentToolResult<Record<string, unknown>>> {\n\t\t\tif (params.findText !== undefined && (params.offset !== undefined || params.limit !== undefined)) {\n\t\t\t\tconst offset = formatInputValue(params.offset);\n\t\t\t\tconst limit = formatInputValue(params.limit);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `findText cannot be combined with offset or limit. Received offset=${offset}, limit=${limit}; omit offset and limit when using findText.` }],\n\t\t\t\t\tdetails: { error: \"Incompatible find options\" },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (params.findMode !== undefined && params.findText === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `findMode ${formatInputValue(params.findMode)} requires findText; provide findText or omit findMode.` }],\n\t\t\t\t\tdetails: { error: \"findMode requires findText\" },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst data = getResult(params.responseId);\n\t\t\tif (!data) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Error: No stored results for responseId ${formatInputValue(params.responseId)}. Use a responseId returned by ${storedContentSources}.` }],\n\t\t\t\t\tdetails: { error: \"Not found\", responseId: params.responseId },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (data.type === \"research\") {\n\t\t\t\tconst artifact = getResearchArtifact(params.responseId);\n\t\t\t\tif (!artifact) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Error: stored research artifact for responseId ${formatInputValue(params.responseId)} was not found. Use a responseId returned by ${storedContentSources}.` }],\n\t\t\t\t\t\tdetails: { error: \"Artifact not found\", responseId: params.responseId },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst serialized = JSON.stringify(artifact, null, 2);\n\t\t\t\tconst offset = params.offset ?? 0;\n\t\t\t\tconst limit = params.limit ?? maxInlineContentChars;\n\t\t\t\tif (!Number.isInteger(offset) || offset < 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Invalid offset: received ${formatInputValue(offset)} for responseId ${formatInputValue(params.responseId)}; offset must be a non-negative integer. Use 0 or a larger integer.` }],\n\t\t\t\t\t\tdetails: { error: \"Invalid offset\", offset },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!Number.isInteger(limit) || limit <= 0 || limit > maxInlineContentChars) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Invalid limit: received ${formatInputValue(limit)} for responseId ${formatInputValue(params.responseId)}; limit must be an integer from 1 to ${maxInlineContentChars}. Use a value in that range.` }],\n\t\t\t\t\t\tdetails: { error: \"Invalid limit\", limit, maxLimit: maxInlineContentChars },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (offset > serialized.length) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Offset ${offset} is out of range for responseId ${formatInputValue(params.responseId)}. Received offset ${offset}; valid range is 0-${serialized.length}. Use an offset within that range.` }],\n\t\t\t\t\t\tdetails: { error: \"Offset out of range\", offset, contentLength: serialized.length },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst endOffset = Math.min(offset + limit, serialized.length);\n\t\t\t\tconst artifactSlice = serialized.slice(offset, endOffset);\n\t\t\t\tconst hasMore = endOffset < serialized.length;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: artifactSlice }],\n\t\t\t\t\tdetails: { responseId: artifact.id, type: \"research\", contentLength: serialized.length, offset, limit, returnedChars: artifactSlice.length, nextOffset: hasMore ? endOffset : null, truncated: hasMore },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (data.type === \"search\" && data.queries) {\n\t\t\t\tlet queryData: QueryResultData | undefined;\n\n\t\t\t\tif (params.query !== undefined) {\n\t\t\t\t\tqueryData = data.queries.find((q) => q.query === params.query);\n\t\t\t\t\tif (!queryData) {\n\t\t\t\t\t\tconst available = data.queries.map((q) => `\"${q.query}\"`).join(\", \");\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Query ${formatInputValue(params.query)} was not found for responseId ${formatInputValue(params.responseId)}. Received query=${formatInputValue(params.query)}. Available queries: ${available || \"none\"}. Use one of the available queries or queryIndex.` }],\n\t\t\t\t\t\t\tdetails: { error: \"Query not found\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (params.queryIndex !== undefined) {\n\t\t\t\t\tqueryData = data.queries[params.queryIndex];\n\t\t\t\t\tif (!queryData) {\n\t\t\t\t\t\tconst available = data.queries.map((q, i) => `${i}: \"${q.query}\"`).join(\", \");\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Query index ${formatInputValue(params.queryIndex)} is out of range for responseId ${formatInputValue(params.responseId)}. Received queryIndex=${formatInputValue(params.queryIndex)}; valid indexes are 0-${data.queries.length - 1}. Available queries: ${available || \"none\"}. Use one of the available indexes.` }],\n\t\t\t\t\t\t\tdetails: { error: \"Index out of range\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst available = data.queries.map((q, i) => `${i}: \"${q.query}\"`).join(\", \");\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Specify query or queryIndex for responseId ${formatInputValue(params.responseId)}. Available queries: ${available || \"none\"}.` }],\n\t\t\t\t\t\tdetails: { error: \"No query specified\" },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (queryData.error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Error retrieving query ${formatInputValue(queryData.query)} from responseId ${formatInputValue(params.responseId)}: ${queryData.error}. Check the stored search result and retry with another query or queryIndex if needed.` }],\n\t\t\t\t\t\tdetails: { error: queryData.error, query: queryData.query },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst fullResults = formatFullResults(queryData);\n\t\t\t\tif (params.findText !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst found = findContent(fullResults, normalizeFindQueries(params.findText), (params.findMode ?? \"case-insensitive\") as FindMode);\n\t\t\t\t\t\tconst { text, ...findDetails } = found;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\t\t\tdetails: { query: queryData.query, resultCount: queryData.results.length, findMode: params.findMode ?? \"case-insensitive\", ...findDetails },\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Unable to find ${formatInputValue(params.findText)} in query ${formatInputValue(queryData.query)} for responseId ${formatInputValue(params.responseId)}: ${error}. Check findText and use a supported findMode.` }],\n\t\t\t\t\t\t\tdetails: { error, query: queryData.query },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: fullResults }],\n\t\t\t\t\tdetails: { query: queryData.query, resultCount: queryData.results.length },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (data.type === \"fetch\" && data.urls) {\n\t\t\t\tlet urlData: ExtractedContent | undefined;\n\t\t\t\tlet selectedUrlIndex = -1;\n\n\t\t\t\tif (params.url !== undefined) {\n\t\t\t\t\tselectedUrlIndex = data.urls.findIndex((u) => u.url === params.url);\n\t\t\t\t\turlData = data.urls[selectedUrlIndex];\n\t\t\t\t\tif (!urlData) {\n\t\t\t\t\t\tconst available = data.urls.map((u) => u.url).join(\"\\n \");\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `URL ${formatInputValue(params.url)} was not found for responseId ${formatInputValue(params.responseId)}. Received url=${formatInputValue(params.url)}. Available URLs:\\n ${available || \" none\"}\\nUse one of the available URLs or urlIndex.` }],\n\t\t\t\t\t\t\tdetails: { error: \"URL not found\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (params.urlIndex !== undefined) {\n\t\t\t\t\tselectedUrlIndex = params.urlIndex;\n\t\t\t\t\turlData = data.urls[selectedUrlIndex];\n\t\t\t\t\tif (!urlData) {\n\t\t\t\t\t\tconst available = data.urls.map((u, i) => `${i}: ${u.url}`).join(\"\\n \");\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `URL index ${formatInputValue(params.urlIndex)} is out of range for responseId ${formatInputValue(params.responseId)}. Received urlIndex=${formatInputValue(params.urlIndex)}; valid indexes are 0-${data.urls.length - 1}. Available URLs:\\n ${available || \" none\"}\\nUse one of the available indexes.` }],\n\t\t\t\t\t\t\tdetails: { error: \"Index out of range\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst available = data.urls.map((u, i) => `${i}: ${u.url}`).join(\"\\n \");\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Specify url or urlIndex for responseId ${formatInputValue(params.responseId)}. Available URLs:\\n ${available || \" none\"}` }],\n\t\t\t\t\t\tdetails: { error: \"No URL specified\" },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (urlData.error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Error retrieving URL ${formatInputValue(urlData.url)} from responseId ${formatInputValue(params.responseId)}: ${urlData.error}. Check the stored fetch result and retry with another URL or urlIndex if needed.` }],\n\t\t\t\t\t\tdetails: { error: urlData.error, url: urlData.url },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (params.findText !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst found = findContent(urlData.content, normalizeFindQueries(params.findText), (params.findMode ?? \"case-insensitive\") as FindMode);\n\t\t\t\t\t\tconst { text, ...findDetails } = found;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `# ${urlData.title || urlData.url}\\n\\n${text}` }],\n\t\t\t\t\t\t\tdetails: { url: urlData.url, title: urlData.title, contentLength: urlData.content.length, findMode: params.findMode ?? \"case-insensitive\", ...findDetails },\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Unable to find ${formatInputValue(params.findText)} in URL ${formatInputValue(urlData.url)} for responseId ${formatInputValue(params.responseId)}: ${error}. Check findText and use a supported findMode.` }],\n\t\t\t\t\t\t\tdetails: { error, url: urlData.url },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst offset = params.offset ?? 0;\n\t\t\t\tconst limit = params.limit ?? maxInlineContentChars;\n\t\t\t\tif (!Number.isInteger(offset) || offset < 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Invalid offset: received ${formatInputValue(offset)} for URL ${formatInputValue(urlData.url)}; offset must be a non-negative integer. Use 0 or a larger integer.` }],\n\t\t\t\t\t\tdetails: { error: \"Invalid offset\", offset },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!Number.isInteger(limit) || limit <= 0 || limit > maxInlineContentChars) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Invalid limit: received ${formatInputValue(limit)} for URL ${formatInputValue(urlData.url)}; limit must be an integer from 1 to ${maxInlineContentChars}. Use a value in that range.` }],\n\t\t\t\t\t\tdetails: { error: \"Invalid limit\", limit, maxLimit: maxInlineContentChars },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (offset > urlData.content.length) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Offset ${offset} is out of range for URL ${formatInputValue(urlData.url)} in responseId ${formatInputValue(params.responseId)}. Received offset ${offset}; valid range is 0-${urlData.content.length}. Use an offset within that range.` }],\n\t\t\t\t\t\tdetails: { error: \"Offset out of range\", offset, contentLength: urlData.content.length },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst endOffset = Math.min(offset + limit, urlData.content.length);\n\t\t\t\tconst contentSlice = urlData.content.slice(offset, endOffset);\n\t\t\t\tconst hasMore = endOffset < urlData.content.length;\n\t\t\t\tlet text = `# ${urlData.title || urlData.url}\\n\\n${contentSlice}`;\n\t\t\t\tif (hasMore || offset > 0) {\n\t\t\t\t\ttext += `\\n\\n---\\nShowing chars ${offset}-${endOffset} of ${urlData.content.length}.`;\n\t\t\t\t\tif (hasMore) {\n\t\t\t\t\t\ttext += ` Use ${toolNames.getSearchContent}({ responseId: \"${params.responseId}\", urlIndex: ${selectedUrlIndex}, offset: ${endOffset}, limit: ${limit} }) for the next slice.`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\turl: urlData.url,\n\t\t\t\t\t\ttitle: urlData.title,\n\t\t\t\t\t\tcontentLength: urlData.content.length,\n\t\t\t\t\t\toffset,\n\t\t\t\t\t\tlimit,\n\t\t\t\t\t\treturnedChars: contentSlice.length,\n\t\t\t\t\t\tnextOffset: hasMore ? endOffset : null,\n\t\t\t\t\t\ttruncated: hasMore,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Invalid stored data for responseId ${formatInputValue(params.responseId)}: received type ${formatInputValue(data.type)}. Use a responseId returned by ${storedContentSources}.` }],\n\t\t\t\tdetails: { error: \"Invalid data\" },\n\t\t\t};\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\tconst { responseId, query, queryIndex, url, urlIndex, offset, findText } = args as {\n\t\t\t\tresponseId: string;\n\t\t\t\tquery?: string;\n\t\t\t\tqueryIndex?: number;\n\t\t\t\turl?: string;\n\t\t\t\turlIndex?: number;\n\t\t\t\toffset?: number;\n\t\t\t\tfindText?: string | string[];\n\t\t\t};\n\t\t\tlet target = \"\";\n\t\t\tif (query) target = `query=\"${query}\"`;\n\t\t\telse if (queryIndex !== undefined) target = `queryIndex=${queryIndex}`;\n\t\t\telse if (url) target = url.length > 30 ? url.slice(0, 27) + \"...\" : url;\n\t\t\telse if (urlIndex !== undefined) target = `urlIndex=${urlIndex}`;\n\t\t\tif (offset !== undefined) target += target ? ` @ ${offset}` : `offset=${offset}`;\n\t\t\tif (findText !== undefined) {\n\t\t\t\tconst queries = Array.isArray(findText) ? findText : [findText];\n\t\t\t\ttarget += `${target ? \" · \" : \"\"}find ${queries.length}`;\n\t\t\t}\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"get_content \")) + theme.fg(\"accent\", target || responseId.slice(0, 8)), 0, 0);\n\t\t},\n\n\t\trenderResult(result, { expanded }, theme) {\n\t\t\tconst details = result.details as {\n\t\t\t\terror?: string;\n\t\t\t\tquery?: string;\n\t\t\t\turl?: string;\n\t\t\t\ttitle?: string;\n\t\t\t\tresultCount?: number;\n\t\t\t\tcontentLength?: number;\n\t\t\t\toffset?: number;\n\t\t\t\treturnedChars?: number;\n\t\t\t\tnextOffset?: number | null;\n\t\t\t\tmatchCount?: number;\n\t\t\t\treturnedMatches?: number;\n\t\t\t};\n\n\t\t\tif (details?.error) {\n\t\t\t\tconst extras: string[] = [];\n\t\t\t\tif (details.query) extras.push(`query: ${details.query}`);\n\t\t\t\tif (details.url) extras.push(`url: ${details.url}`);\n\t\t\t\telse if (details.title) extras.push(`resource: ${details.title}`);\n\t\t\t\tconst plan = buildSearchErrorPlan({ error: details.error, extraLines: extras });\n\t\t\t\tif (plan) return renderSearchErrorPlan(plan, expanded, theme);\n\t\t\t\treturn new Text(theme.fg(\"error\", `Error: ${details.error}`), 0, 0);\n\t\t\t}\n\n\t\t\tlet statusLine: string;\n\t\t\tif (typeof details?.matchCount === \"number\") {\n\t\t\t\tstatusLine = theme.fg(\"success\", details?.title || details?.query || \"Content\") + theme.fg(\"muted\", ` (${details.matchCount} matches, ${details.returnedMatches ?? 0} shown)`);\n\t\t\t} else if (details?.query) {\n\t\t\t\tstatusLine = theme.fg(\"success\", `\"${details.query}\"`) + theme.fg(\"muted\", ` (${details.resultCount} results)`);\n\t\t\t} else {\n\t\t\t\tconst start = details?.offset ?? 0;\n\t\t\t\tconst returned = details?.returnedChars ?? details?.contentLength ?? 0;\n\t\t\t\tconst end = start + returned;\n\t\t\t\tconst slice = details?.nextOffset !== undefined || start > 0\n\t\t\t\t\t? `, showing ${start}-${end}`\n\t\t\t\t\t: \"\";\n\t\t\t\tstatusLine = theme.fg(\"success\", details?.title || \"Content\") + theme.fg(\"muted\", ` (${details?.contentLength ?? 0} chars${slice})`);\n\t\t\t}\n\n\t\t\tif (!expanded) {\n\t\t\t\treturn new Text(statusLine, 0, 0);\n\t\t\t}\n\n\t\t\tconst textContent = result.content.find((c) => c.type === \"text\")?.text || \"\";\n\t\t\tconst preview = textContent.length > 500 ? textContent.slice(0, 500) + \"...\" : textContent;\n\t\t\treturn new Text(statusLine + \"\\n\" + theme.fg(\"dim\", preview), 0, 0);\n\t\t},\n\t});\n\t}\n\n\tif (isCommandEnabled(initConfig, \"websearch\")) pi.registerCommand(\"websearch\", {\n\t\tdescription: \"Open web search curator\",\n\t\thandler: async (args, ctx) => {\n\t\t\tconst sessionToken = randomUUID();\n\t\t\tconst commandCallId = `cmd:${sessionToken}`;\n\t\t\tcloseCurator(commandCallId);\n\n\t\t\tconst raw = args.trim();\n\t\t\tconst queries = raw.length > 0\n\t\t\t\t? normalizeQueryList(raw.split(\",\"))\n\t\t\t\t: [];\n\n\t\t\tlet bootstrap: CuratorBootstrap;\n\t\t\ttry {\n\t\t\t\tbootstrap = await loadCuratorBootstrap(undefined, ctx);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\tctx.ui.notify(`Failed to load web search config: ${message}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst availableProviders = bootstrap.availableProviders;\n\t\t\tconst initialProvider = bootstrap.defaultProvider;\n\t\t\tconst curatorTimeoutSeconds = bootstrap.timeoutSeconds;\n\t\t\tlet currentProvider: CuratorProvider = initialProvider;\n\t\t\tconst commandConfig = loadConfig();\n\t\t\tconst rawSearchProvider = normalizeProviderInput(\n\t\t\t\tcommandConfig.searchProvider ?? commandConfig.provider ?? \"auto\",\n\t\t\t\t`provider in ${WEB_SEARCH_CONFIG_PATH}`,\n\t\t\t) ?? \"auto\";\n\t\t\tlet currentSearchProvider: SearchProviderSelection = Array.isArray(rawSearchProvider)\n\t\t\t\t? rawSearchProvider\n\t\t\t\t: rawSearchProvider === \"auto\" ? \"auto\" : initialProvider;\n\t\t\tconst summaryContext: SummaryGenerationContext = {\n\t\t\t\tmodel: ctx.model,\n\t\t\t\tmodelRegistry: ctx.modelRegistry,\n\t\t\t\tcwd: ctx.cwd,\n\t\t\t\tisProjectTrusted: () => ctx.isProjectTrusted(),\n\t\t\t};\n\t\t\tconst summaryModelChoices = await loadSummaryModelChoices(summaryContext);\n\n\t\t\tctx.ui.notify(\"Opening web search curator...\", \"info\");\n\n\t\t\tconst collected = new Map<number, QueryResultData>();\n\t\t\tconst searchAbort = new AbortController();\n\t\t\tlet aborted = false;\n\t\t\tlet commandHandle: CuratorServerHandle | null = null;\n\t\t\tconst isCommandActive = () => commandHandle !== null && activeCurators.get(commandCallId) === commandHandle;\n\n\t\t\tfunction sendFollowUpFromReturn(payload: ReturnType<typeof buildSearchReturn>) {\n\t\t\t\tpi.sendMessage({\n\t\t\t\t\tcustomType: \"web-search-results\",\n\t\t\t\t\tcontent: payload.content,\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: payload.details,\n\t\t\t\t}, { triggerTurn: true, deliverAs: \"followUp\" });\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst handle = await startCuratorServer(\n\t\t\t\t\t{\n\t\t\t\t\t\tqueries,\n\t\t\t\t\t\tsessionToken,\n\t\t\t\t\t\ttimeout: curatorTimeoutSeconds,\n\t\t\t\t\t\tavailableProviders,\n\t\t\t\t\t\tdefaultProvider: initialProvider,\n\t\t\t\t\t\tsearchProvider: toCuratorProvider(currentSearchProvider) ?? \"auto\",\n\t\t\t\t\t\tsummaryModels: summaryModelChoices.summaryModels,\n\t\t\t\t\t\tdefaultSummaryModel: summaryModelChoices.defaultSummaryModel,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tasync onSummarize(selectedQueryIndices, summarizeSignal, model, feedback) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn generateSummaryForSelectedIndices(\n\t\t\t\t\t\t\t\tselectedQueryIndices,\n\t\t\t\t\t\t\t\tcollected,\n\t\t\t\t\t\t\t\tsummaryContext,\n\t\t\t\t\t\t\t\tsummarizeSignal,\n\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\tfeedback,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonSubmit(payload) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) return;\n\t\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\t\tsearchAbort.abort();\n\t\t\t\t\t\t\tconst filtered = payload.selectedQueryIndices.length > 0\n\t\t\t\t\t\t\t\t? filterByQueryIndices(payload.selectedQueryIndices, collected)\n\t\t\t\t\t\t\t\t: collectAllResultsAndUrls(collected);\n\t\t\t\t\t\t\tconst base: SearchReturnOptions = {\n\t\t\t\t\t\t\t\tqueryList: filtered.results.map(r => r.query),\n\t\t\t\t\t\t\t\tresults: filtered.results,\n\t\t\t\t\t\t\t\turls: filtered.urls,\n\t\t\t\t\t\t\t\tincludeContent: false,\n\t\t\t\t\t\t\t\tcurated: true,\n\t\t\t\t\t\t\t\tcuratedFrom: collected.size,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (!payload.rawResults) {\n\t\t\t\t\t\t\t\tconst resolvedSummary = resolveSummaryForSubmit(payload, collected);\n\t\t\t\t\t\t\t\tbase.workflow = \"summary-review\";\n\t\t\t\t\t\t\t\tbase.approvedSummary = resolvedSummary.approvedSummary;\n\t\t\t\t\t\t\t\tbase.summaryMeta = resolvedSummary.summaryMeta;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsendFollowUpFromReturn(buildSearchReturn(base));\n\t\t\t\t\t\t\tcloseCurator(commandCallId);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonCancel(reason) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) return;\n\t\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\t\tsearchAbort.abort();\n\t\t\t\t\t\t\tif (reason === \"timeout\") {\n\t\t\t\t\t\t\t\tconst all = collectAllResultsAndUrls(collected);\n\t\t\t\t\t\t\t\tconst resolvedSummary = resolveSummaryForSubmit({ selectedQueryIndices: [], summary: undefined, summaryMeta: undefined }, collected);\n\t\t\t\t\t\t\t\tsendFollowUpFromReturn(buildSearchReturn({\n\t\t\t\t\t\t\t\t\tqueryList: all.results.map(r => r.query),\n\t\t\t\t\t\t\t\t\tresults: all.results,\n\t\t\t\t\t\t\t\t\turls: all.urls,\n\t\t\t\t\t\t\t\t\tincludeContent: false,\n\t\t\t\t\t\t\t\t\tcurated: true,\n\t\t\t\t\t\t\t\t\tcuratedFrom: collected.size,\n\t\t\t\t\t\t\t\t\tworkflow: \"summary-review\",\n\t\t\t\t\t\t\t\t\tapprovedSummary: resolvedSummary.approvedSummary,\n\t\t\t\t\t\t\t\t\tsummaryMeta: resolvedSummary.summaryMeta,\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcloseCurator(commandCallId);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonProviderChange(provider) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) return;\n\t\t\t\t\t\t\tconst normalized = normalizeProviderInput(provider);\n\t\t\t\t\t\t\tif (!normalized || normalized === \"auto\" || Array.isArray(normalized)) return;\n\t\t\t\t\t\t\tcurrentProvider = normalized;\n\t\t\t\t\t\t\tcurrentSearchProvider = normalized;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tsaveConfig({ provider: normalized });\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\tconsole.error(`Failed to persist default provider: ${message}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tasync onAddSearch(query, provider) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst requestedProvider = resolveCuratorSearchProvider(provider, currentSearchProvider);\n\t\t\t\t\t\t\tconst response = await search(query, {\n\t\t\t\t\t\t\t\tprovider: requestedProvider,\n\t\t\t\t\t\t\t\tsignal: searchAbort.signal,\n\t\t\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn toCuratorSearchEntries(response);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonAddSearchResults(entries) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) return;\n\t\t\t\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\t\t\t\tcollected.set(entry.queryIndex, indexedCuratorEntryToQueryResult(entry));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tasync onRewriteQuery(query, rewriteSignal) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn rewriteSearchQuery(query, summaryContext, rewriteSignal);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tcommandHandle = handle;\n\t\t\t\tactiveCurators.set(commandCallId, handle);\n\t\t\t\tlet browserOpenError: string | null = null;\n\t\t\t\tif (!shouldAutoOpenCuratorBrowser(loadConfig())) {\n\t\t\t\t\tctx.ui.notify(`Search curator is running. Open manually: ${handle.url}`, \"info\");\n\t\t\t\t} else {\n\t\t\t\t\tconst open = platform() === \"darwin\" ? await getGlimpseOpen() : null;\n\t\t\t\t\tif (open) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst win = openInGlimpse(open, handle.url, \"Search Curator\");\n\t\t\t\t\t\t\tglimpseWins.set(commandCallId, win);\n\t\t\t\t\t\t\twin.on(\"closed\", () => {\n\t\t\t\t\t\t\t\tif (glimpseWins.get(commandCallId) === win) {\n\t\t\t\t\t\t\t\t\tglimpseWins.delete(commandCallId);\n\t\t\t\t\t\t\t\t\tcloseCurator(commandCallId);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\tconsole.error(`Failed to open Glimpse curator window: ${message}`);\n\t\t\t\t\t\t\tglimpseWins.delete(commandCallId);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait openInBrowser(pi, handle.url);\n\t\t\t\t\t\t\t} catch (browserErr) {\n\t\t\t\t\t\t\t\tbrowserOpenError = browserErr instanceof Error ? browserErr.message : String(browserErr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait openInBrowser(pi, handle.url);\n\t\t\t\t\t\t} catch (browserErr) {\n\t\t\t\t\t\t\tbrowserOpenError = browserErr instanceof Error ? browserErr.message : String(browserErr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (browserOpenError) {\n\t\t\t\t\t\tconsole.error(`Failed to open curator UI: ${browserOpenError}`);\n\t\t\t\t\t\tctx.ui.notify(`Search curator is running, but the browser did not open automatically. Open manually: ${handle.url}`, \"info\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (queries.length > 0) {\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\tlet nextResultIndex = queries.length;\n\t\t\t\t\t\tfor (let qi = 0; qi < queries.length; qi++) {\n\t\t\t\t\t\t\tif (aborted || !isCommandActive()) break;\n\t\t\t\t\t\t\tconst requestedProvider = currentSearchProvider;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst response = await search(queries[qi], {\n\t\t\t\t\t\t\t\t\tprovider: requestedProvider,\n\t\t\t\t\t\t\t\t\tsignal: searchAbort.signal,\n\t\t\t\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (aborted || !isCommandActive()) break;\n\t\t\t\t\t\t\t\tconst entries = toCuratorSearchEntries(response);\n\t\t\t\t\t\t\t\tfor (let entryIndex = 0; entryIndex < entries.length; entryIndex++) {\n\t\t\t\t\t\t\t\t\tconst entry = entries[entryIndex];\n\t\t\t\t\t\t\t\t\tconst resultIndex = entryIndex === 0 ? qi : nextResultIndex++;\n\t\t\t\t\t\t\t\t\tconst indexedEntry: IndexedCuratorSearchEntry = {\n\t\t\t\t\t\t\t\t\t\t...entry,\n\t\t\t\t\t\t\t\t\t\tqueryIndex: resultIndex,\n\t\t\t\t\t\t\t\t\t\tquery: queries[qi],\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tcollected.set(resultIndex, indexedCuratorEntryToQueryResult(indexedEntry));\n\t\t\t\t\t\t\t\t\tif (entry.error) {\n\t\t\t\t\t\t\t\t\t\thandle.pushError(resultIndex, entry.error, entry.provider, { query: queries[qi], slotIndex: qi });\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\thandle.pushResult(resultIndex, { ...entry, query: queries[qi], slotIndex: qi });\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\tif (aborted || !isCommandActive()) break;\n\t\t\t\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\tconst failedProvider = toCuratorProvider(requestedProvider);\n\t\t\t\t\t\t\t\thandle.pushError(qi, message, failedProvider, { query: queries[qi], slotIndex: qi });\n\t\t\t\t\t\t\t\tcollected.set(qi, { query: queries[qi], answer: \"\", results: [], error: message, provider: failedProvider });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!aborted && isCommandActive()) handle.searchesDone();\n\t\t\t\t\t})();\n\t\t\t\t} else {\n\t\t\t\t\tif (isCommandActive()) handle.searchesDone();\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tcloseCurator(commandCallId);\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\tctx.ui.notify(`Failed to open curator: ${message}`, \"error\");\n\t\t\t}\n\t\t},\n\t});\n\n\tif (isCommandEnabled(initConfig, \"curator\")) pi.registerCommand(\"curator\", {\n\t\tdescription: \"Toggle or configure the search curator workflow\",\n\t\thandler: async (args, ctx) => {\n\t\t\tconst arg = args.trim().toLowerCase();\n\n\t\t\tlet newWorkflow: WebSearchWorkflow;\n\t\t\tif (arg.length === 0) {\n\t\t\t\tconst current = resolveWorkflow(loadConfigForExtensionInit().workflow, true);\n\t\t\t\tnewWorkflow = current === \"none\" ? \"summary-review\" : \"none\";\n\t\t\t} else if (arg === \"on\") {\n\t\t\t\tnewWorkflow = \"summary-review\";\n\t\t\t} else if (arg === \"off\") {\n\t\t\t\tnewWorkflow = \"none\";\n\t\t\t} else if (arg === \"none\" || arg === \"summary-review\" || arg === \"auto-summary\") {\n\t\t\t\tnewWorkflow = arg;\n\t\t\t} else {\n\t\t\t\tctx.ui.notify(`Unknown option: ${arg}. Use on, off, summary-review, or auto-summary.`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tsaveConfig({ workflow: newWorkflow });\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\tctx.ui.notify(`Failed to save config: ${message}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst label = newWorkflow === \"none\"\n\t\t\t\t? `Curator disabled — ${toolNames.webSearch} will return raw results`\n\t\t\t\t: newWorkflow === \"auto-summary\"\n\t\t\t\t\t? `Auto-summary enabled — ${toolNames.webSearch} will generate a summary without opening the curator`\n\t\t\t\t\t: `Curator enabled — ${toolNames.webSearch} will open curator and auto-generate a summary draft`;\n\t\t\tpi.sendMessage({\n\t\t\t\tcustomType: \"curator-config\",\n\t\t\t\tcontent: [{ type: \"text\", text: label }],\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: { workflow: newWorkflow },\n\t\t\t}, { triggerTurn: false, deliverAs: \"followUp\" });\n\t\t},\n\t});\n\n\tif (isCommandEnabled(initConfig, \"google-account\")) pi.registerCommand(\"google-account\", {\n\t\tdescription: \"Show the active Google account for Gemini Web\",\n\t\thandler: async () => {\n\t\t\tif (!isBrowserCookieAccessAllowed()) {\n\t\t\t\tpi.sendMessage({\n\t\t\t\t\tcustomType: \"google-account\",\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Gemini Web browser cookie access is disabled. Set allowBrowserCookies: true in ${WEB_SEARCH_CONFIG_PATH} to enable it.` }],\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: { available: false, cookieAccessAllowed: false },\n\t\t\t\t}, { triggerTurn: true, deliverAs: \"followUp\" });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst cookies = await isGeminiWebAvailable();\n\t\t\tif (!cookies) {\n\t\t\t\tconst diagnostic = getGeminiWebAvailabilityDiagnostic();\n\t\t\t\tconst text = diagnostic\n\t\t\t\t\t? `Gemini Web is unavailable: ${diagnostic}`\n\t\t\t\t\t: \"Gemini Web is unavailable. Sign into gemini.google.com in a supported Chromium-based browser.\";\n\t\t\t\tpi.sendMessage({\n\t\t\t\t\tcustomType: \"google-account\",\n\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: { available: false, cookieAccessAllowed: true, diagnostic },\n\t\t\t\t}, { triggerTurn: true, deliverAs: \"followUp\" });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst email = await getActiveGoogleEmail(cookies);\n\t\t\tconst text = email\n\t\t\t\t? `Active Google account: ${email}`\n\t\t\t\t: \"Gemini Web is available, but the active Google account could not be determined.\";\n\n\t\t\tpi.sendMessage({\n\t\t\t\tcustomType: \"google-account\",\n\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: { available: true, email: email ?? null },\n\t\t\t}, { triggerTurn: true, deliverAs: \"followUp\" });\n\t\t},\n\t});\n\n\tif (isCommandEnabled(initConfig, \"search\")) pi.registerCommand(\"search\", {\n\t\tdescription: \"Browse stored web search results\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tconst results = getAllResults();\n\n\t\t\tif (results.length === 0) {\n\t\t\t\tctx.ui.notify(\"No stored search results\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst options = results.map((r) => {\n\t\t\t\tconst age = Math.floor((Date.now() - r.timestamp) / 60000);\n\t\t\t\tconst ageStr = age < 60 ? `${age}m ago` : `${Math.floor(age / 60)}h ago`;\n\t\t\t\tif (r.type === \"search\" && r.queries) {\n\t\t\t\t\tconst query = r.queries[0]?.query || \"unknown\";\n\t\t\t\t\treturn `[${r.id.slice(0, 6)}] \"${query}\" (${r.queries.length} queries) - ${ageStr}`;\n\t\t\t\t}\n\t\t\t\tif (r.type === \"fetch\" && (r.urls || r.urlMetadata)) {\n\t\t\t\t\treturn `[${r.id.slice(0, 6)}] ${(r.urls ?? r.urlMetadata ?? []).length} URLs fetched - ${ageStr}`;\n\t\t\t\t}\n\t\t\t\treturn `[${r.id.slice(0, 6)}] ${r.type} - ${ageStr}`;\n\t\t\t});\n\n\t\t\tconst choice = await ctx.ui.select(\"Stored Search Results\", options);\n\t\t\tif (!choice) return;\n\n\t\t\tconst match = choice.match(/^\\[([a-z0-9]+)\\]/);\n\t\t\tif (!match) return;\n\n\t\t\tconst selected = results.find((r) => r.id.startsWith(match[1]));\n\t\t\tif (!selected) return;\n\n\t\t\tconst actions = [\"View details\", \"Delete\"];\n\t\t\tconst action = await ctx.ui.select(`Result ${selected.id.slice(0, 6)}`, actions);\n\n\t\t\tif (action === \"Delete\") {\n\t\t\t\tdeleteResult(selected.id);\n\t\t\t\tctx.ui.notify(`Deleted ${selected.id.slice(0, 6)}`, \"info\");\n\t\t\t} else if (action === \"View details\") {\n\t\t\t\tlet info = `ID: ${selected.id}\\nType: ${selected.type}\\nAge: ${Math.floor((Date.now() - selected.timestamp) / 60000)}m\\n\\n`;\n\t\t\t\tif (selected.type === \"search\" && selected.queries) {\n\t\t\t\t\tinfo += \"Queries:\\n\";\n\t\t\t\t\tconst queries = selected.queries.slice(0, 10);\n\t\t\t\t\tfor (const q of queries) {\n\t\t\t\t\t\tinfo += `- \"${q.query}\" (${q.results.length} results)\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tif (selected.queries.length > 10) {\n\t\t\t\t\t\tinfo += `... and ${selected.queries.length - 10} more\\n`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (selected.type === \"fetch\" && (selected.urls || selected.urlMetadata)) {\n\t\t\t\t\tinfo += \"URLs:\\n\";\n\t\t\t\t\tconst urlItems = selected.urls ?? selected.urlMetadata ?? [];\n\t\t\t\t\tconst urls = urlItems.slice(0, 10);\n\t\t\t\t\tfor (const u of urls) {\n\t\t\t\t\t\tconst urlDisplay = u.url.length > 50 ? u.url.slice(0, 47) + \"...\" : u.url;\n\t\t\t\t\t\tconst contentLength = \"content\" in u ? u.content.length : u.contentLength;\n\t\t\t\t\t\tinfo += `- ${urlDisplay} (${u.error || `${contentLength} chars`})\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tif (urlItems.length > 10) {\n\t\t\t\t\t\tinfo += `... and ${urlItems.length - 10} more\\n`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tctx.ui.notify(info, \"info\");\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult, ExtensionAPI, ExtensionContext } from \"../host.ts\";\nimport { Box, Text, truncateToWidth, type KeyId } from \"@earendil-works/pi-tui\";\nimport { Type } from \"typebox\";\nimport { StringEnum, type ImageContent, type TextContent } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtractedContent, ExtractOptions } from \"./extract.ts\";\nimport { normalizeFetchContentParams } from \"./fetch-params.ts\";\nimport { resolveAuthFetchProfile, type AuthFetchProfile } from \"./auth-fetch.ts\";\nimport { findContent, type FindMode } from \"./content-find.ts\";\nimport { answerFromPage } from \"./page-query.ts\";\nimport { rewriteSearchQuery } from \"./query-rewrite.ts\";\nimport { clearCloneCache } from \"./github-extract.ts\";\nimport { ALL_SEARCH_PROVIDERS, getConfiguredSearchRouting, normalizeSearchProviderSelection, RESOLVED_SEARCH_PROVIDERS, SEARCH_PROVIDERS, search, type AttributedSearchResponse, type ProviderAvailability, type SearchProvider, type SearchProviderSelection, type ResolvedSearchProvider } from \"./gemini-search.ts\";\nexport type { ProviderAvailability } from \"./gemini-search.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\nimport { formatSeconds, getWebSearchConfigDir, getWebSearchConfigPath, installGlobalProxyFetch, resolveCuratorNetworkConfig, runWithProxy } from \"./utils.ts\";\nimport {\n\tclearResults,\n\tdeleteResult,\n\tgenerateId,\n\tgetAllResults,\n\tgetResult,\n\trestoreFromSession,\n\tstoreFetchedContentResult,\n\tstoreResult,\n\ttype QueryResultData,\n\ttype StoredSearchData,\n} from \"./storage.ts\";\nimport { activityMonitor, type ActivityEntry } from \"./activity.ts\";\nimport { startCuratorServer, type CuratorSearchEntry, type CuratorServerHandle, type IndexedCuratorSearchEntry } from \"./curator-server.ts\";\nimport {\n\tbuildDeterministicSummary,\n\tgenerateSummaryDraft,\n\tSUMMARY_GENERATION_DEADLINE_MS,\n\ttype SummaryGenerationContext,\n\ttype SummaryMeta,\n} from \"./summary-review.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { execFileSync, spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { platform } from \"node:os\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isPerplexityAvailable } from \"./perplexity.ts\";\nimport { isExaAvailable } from \"./exa.ts\";\nimport { isGeminiApiAvailable } from \"./gemini-api.ts\";\nimport { getActiveGoogleEmail, getGeminiWebAvailabilityDiagnostic, getGeminiWebAvailabilityDiagnosticDetails, isGeminiWebAvailable } from \"./gemini-web.ts\";\nimport { isBrowserCookieAccessAllowed } from \"./gemini-web-config.ts\";\nimport { isBraveAvailable } from \"./brave.ts\";\nimport { isCurrentModelHostedSearchEligible, isOpenAISearchAvailable } from \"./openai-search.ts\";\nimport { isParallelAvailable } from \"./parallel.ts\";\nimport { isParallelMcpAvailable } from \"./parallel-mcp.ts\";\nimport { isTinyFishAvailable } from \"./tinyfish.ts\";\nimport { isSearch1APIAvailable } from \"./search1api.ts\";\nimport { isSearchinfinityAvailable } from \"./searchinfinity.ts\";\nimport { isQueritAvailable } from \"./querit.ts\";\nimport { isTavilyAvailable } from \"./tavily.ts\";\nimport { isFirecrawlAvailable } from \"./firecrawl.ts\";\nimport { isJinaSearchAvailable } from \"./jina-search.ts\";\nimport { isSerpdiveAvailable } from \"./serpdive.ts\";\nimport { isKagiAvailable } from \"./kagi.ts\";\nimport { isBochaAvailable } from \"./bocha.ts\";\nimport { isOllamaAvailable } from \"./ollama.ts\";\nimport { isSearXNGAvailable } from \"./searxng.ts\";\nimport { isDuckDuckGoAvailable } from \"./duckduckgo.ts\";\nimport { isAnySearchAvailable } from \"./anysearch.ts\";\nimport { isXaiSearchAvailable } from \"./xai-search.ts\";\nimport { isKimiSearchAvailable } from \"./kimi-search.ts\";\nimport { isBrightDataAvailable } from \"./brightdata.ts\";\nimport { isSerpBaseAvailable } from \"./serpbase.ts\";\nimport { isSerperAvailable } from \"./serper.ts\";\nimport { isValyuAvailable } from \"./valyu.ts\";\nimport { isXcrawlAvailable } from \"./xcrawl.ts\";\nimport { buildSearchErrorPlan, type SearchErrorDetails, type SearchErrorPlan } from \"./render-search-error.ts\";\nimport { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns, splitThinkingSuffix } from \"./summary-model-scope.ts\";\nimport {\n\tbuildResearchArtifact,\n\twithClaimAssessment,\n\tstoreResearchArtifact,\n\tgetResearchArtifact,\n\ttype RecencyFilter,\n\ttype ResearchArtifact,\n} from \"./source-check.ts\";\n\ntype ExtensionTheme = ExtensionContext[\"ui\"][\"theme\"];\n\nconst WEB_SEARCH_CONFIG_PATH = getWebSearchConfigPath();\n\nlet extractModulePromise: Promise<typeof import(\"./extract.ts\")> | undefined;\nasync function fetchAllContent(\n\turls: string[],\n\tsignal?: AbortSignal,\n\toptions?: ExtractOptions,\n): Promise<ExtractedContent[]> {\n\tconst extractModule = await (extractModulePromise ??= import(\"./extract.ts\"));\n\treturn extractModule.fetchAllContent(urls, signal, options);\n}\n\nfunction withRegisteredFetchOptions(\n\toptions: ExtractOptions | undefined,\n\ttoolNames: ExtractOptions[\"toolNames\"],\n\tproxy?: string,\n): ExtractOptions {\n\treturn {\n\t\t...(options ?? {}),\n\t\ttoolNames,\n\t\t...(proxy !== undefined ? { proxy } : {}),\n\t};\n}\n\nfunction isAbortError(err: unknown): boolean {\n\treturn (err instanceof Error ? err.message : String(err)).toLowerCase().includes(\"abort\");\n}\n\n/** Shared collapsed/expanded renderer for an error/cancel plan produced by\n * buildSearchErrorPlan(). Used by every tool renderResult's error branch so\n * Ctrl+O (app.tools.expand) reveals diagnostics instead of a dead-end single line. */\nfunction renderSearchErrorPlan(plan: SearchErrorPlan, expanded: boolean, theme: ExtensionTheme) {\n\tif (expanded) {\n\t\treturn new Text(plan.expanded.map((l, i) => i === 0 ? theme.fg(\"error\", l) : theme.fg(\"toolOutput\", l)).join(\"\\n\"), 0, 0);\n\t}\n\tconst box = new Box(1, 0, (t) => theme.bg(\"toolErrorBg\", t));\n\tbox.addChild(new Text(theme.fg(\"error\", plan.expanded[0]), 0, 0));\n\tfor (const line of plan.collapsed) {\n\t\tbox.addChild(new Text(theme.fg(\"dim\", line), 0, 0));\n\t}\n\tif (plan.expandHint) {\n\t\tbox.addChild(new Text(theme.fg(\"muted\", plan.expandHint), 0, 0));\n\t}\n\treturn box;\n}\n\ninterface WebSearchConfig {\n\tanysearchApiKey?: unknown;\n\txcrawlApiKey?: unknown;\n\tbrightdataApiKey?: unknown;\n\tbrightdataSerpZone?: unknown;\n\tkagiApiKey?: unknown;\n\tollamaApiKey?: unknown;\n\tserpbaseApiKey?: unknown;\n\tserperApiKey?: unknown;\n\ttinyfishApiKey?: unknown;\n\tvalyuApiKey?: unknown;\n\txaiApiKey?: unknown;\n\tprovider?: unknown;\n\tsearchProvider?: unknown;\n\tworkflow?: string;\n\tcuratorTimeoutSeconds?: unknown;\n\tautoOpenBrowser?: unknown;\n\tcuratorRemote?: unknown;\n\tsummaryModel?: string;\n\tsummaryGenerationDeadlineMs?: unknown;\n\tmaxInlineContentChars?: unknown;\n\twebSearch?: {\n\t\tenabled?: boolean;\n\t};\n\ttools?: Partial<Record<keyof ToolNames, { enabled?: boolean }>>;\n\tcommands?: Partial<Record<\"websearch\" | \"curator\" | \"search\" | \"google-account\", { enabled?: boolean }>>;\n\ttoolNames?: Partial<ToolNames>;\n\tshortcuts?: {\n\t\tcurate?: KeyId;\n\t\tactivity?: KeyId;\n\t};\n\tssrf?: {\n\t\t/** CIDR ranges exempted from the SSRF guard (e.g. fake-IP proxy ranges). */\n\t\tallowRanges?: string[];\n\t\t/** Skip local hostname DNS preflight when an HTTP(S)_PROXY env var applies. */\n\t\ttrustEnvProxy?: boolean;\n\t};\n}\n\ntype WebSearchWorkflow = \"none\" | \"summary-review\" | \"auto-summary\";\ntype CuratorWorkflow = \"summary-review\";\nexport type CuratorProvider = Exclude<SearchProvider, \"auto\">;\ntype SummaryWorkflow = \"summary-review\" | \"auto-summary\";\n\ninterface CuratorBootstrap {\n\tavailableProviders: ProviderAvailability;\n\tdefaultProvider: CuratorProvider;\n\ttimeoutSeconds: number;\n}\n\nfunction parseConfigRoot(raw: string): Record<string, unknown> {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${WEB_SEARCH_CONFIG_PATH}: ${message}`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid config in ${WEB_SEARCH_CONFIG_PATH}: expected a JSON object`);\n\t}\n\treturn parsed as Record<string, unknown>;\n}\n\nfunction loadConfig(): WebSearchConfig {\n\tif (!existsSync(WEB_SEARCH_CONFIG_PATH)) return {};\n\treturn parseConfigRoot(readFileSync(WEB_SEARCH_CONFIG_PATH, \"utf-8\")) as WebSearchConfig;\n}\n\nfunction saveConfig(updates: Partial<WebSearchConfig>): void {\n\tlet config: Record<string, unknown> = {};\n\tif (existsSync(WEB_SEARCH_CONFIG_PATH)) {\n\t\tconfig = parseConfigRoot(readFileSync(WEB_SEARCH_CONFIG_PATH, \"utf-8\"));\n\t}\n\n\tObject.assign(config, updates);\n\tconst dir = getWebSearchConfigDir();\n\tif (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\twriteFileSync(WEB_SEARCH_CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\");\n}\n\ntype ToolNames = {\n\twebSearch: string;\n\tsourceCheck: string;\n\tfetchContent: string;\n\tgetSearchContent: string;\n};\n\nconst DEFAULT_TOOL_NAMES: ToolNames = {\n\twebSearch: \"web_search\",\n\tsourceCheck: \"source_check\",\n\tfetchContent: \"fetch_content\",\n\tgetSearchContent: \"get_search_content\",\n};\nconst TOOL_NAME_PATTERN = /^[A-Za-z][A-Za-z0-9_-]{0,63}$/;\nconst DEFAULT_SHORTCUTS = { curate: \"ctrl+shift+s\", activity: \"ctrl+shift+w\" } satisfies Record<string, KeyId>;\nconst DEFAULT_CURATOR_TIMEOUT_SECONDS = 20;\nconst DEFAULT_REMOTE_CURATOR_TIMEOUT_SECONDS = 60;\nconst MAX_CURATOR_TIMEOUT_SECONDS = 600;\nconst MAX_SUMMARY_GENERATION_DEADLINE_MS = 600_000;\n\nfunction searchProviderSchema(description: string) {\n\treturn Type.Union([\n\t\tStringEnum([...SEARCH_PROVIDERS]),\n\t\tType.Array(StringEnum([...RESOLVED_SEARCH_PROVIDERS]), { minItems: 1 }),\n\t], { description });\n}\n\nfunction isToolEnabled(config: WebSearchConfig, key: keyof ToolNames): boolean {\n\tconst override = config.tools?.[key]?.enabled;\n\tif (typeof override === \"boolean\") return override;\n\treturn key !== \"webSearch\" && key !== \"sourceCheck\" || config.webSearch?.enabled !== false;\n}\n\nfunction isCommandEnabled(config: WebSearchConfig, name: \"websearch\" | \"curator\" | \"search\" | \"google-account\"): boolean {\n\treturn config.commands?.[name]?.enabled !== false;\n}\n\nfunction joinToolNames(names: string[]): string {\n\tif (names.length === 0) return \"stored content\";\n\tif (names.length === 1) return names[0];\n\tif (names.length === 2) return `${names[0]} or ${names[1]}`;\n\treturn `${names.slice(0, -1).join(\", \")}, or ${names[names.length - 1]}`;\n}\n\nfunction resolveToolNames(config: WebSearchConfig): ToolNames {\n\tif (config.toolNames !== undefined && (!config.toolNames || typeof config.toolNames !== \"object\" || Array.isArray(config.toolNames))) {\n\t\tthrow new Error(`toolNames in ${WEB_SEARCH_CONFIG_PATH} must be an object`);\n\t}\n\tconst names = { ...DEFAULT_TOOL_NAMES };\n\tfor (const key of Object.keys(DEFAULT_TOOL_NAMES) as Array<keyof ToolNames>) {\n\t\tconst value = config.toolNames?.[key];\n\t\tif (value === undefined) continue;\n\t\tif (typeof value !== \"string\") throw new Error(`toolNames.${key} in ${WEB_SEARCH_CONFIG_PATH} must be a string`);\n\t\tconst trimmed = value.trim();\n\t\tif (!TOOL_NAME_PATTERN.test(trimmed)) {\n\t\t\tthrow new Error(`toolNames.${key} in ${WEB_SEARCH_CONFIG_PATH} must start with a letter and contain only letters, numbers, underscores, or hyphens`);\n\t\t}\n\t\tnames[key] = trimmed;\n\t}\n\tconst registeredKeys = (Object.keys(DEFAULT_TOOL_NAMES) as Array<keyof ToolNames>)\n\t\t.filter(key => isToolEnabled(config, key));\n\tconst seen = new Map<string, keyof ToolNames>();\n\tfor (const key of registeredKeys) {\n\t\tconst name = names[key];\n\t\tconst previous = seen.get(name);\n\t\tif (previous) throw new Error(`toolNames.${key} duplicates toolNames.${previous} in ${WEB_SEARCH_CONFIG_PATH}`);\n\t\tseen.set(name, key);\n\t}\n\treturn names;\n}\n\nfunction loadConfigForExtensionInit(): WebSearchConfig {\n\ttry {\n\t\treturn loadConfig();\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tconsole.error(`[pi-web-access] ${message}`);\n\t\treturn {};\n\t}\n}\n\nfunction normalizeProviderInput(value: unknown, label = \"provider\"): SearchProviderSelection | undefined {\n\tif (value === undefined) return undefined;\n\treturn normalizeSearchProviderSelection(value, label);\n}\n\nfunction resolveRequestedProvider(requested: unknown): SearchProviderSelection {\n\tconst normalizedRequested = normalizeProviderInput(requested);\n\tif (normalizedRequested && normalizedRequested !== \"auto\") return normalizedRequested;\n\tconst config = loadConfig();\n\treturn normalizeProviderInput(config.searchProvider ?? config.provider, `provider in ${WEB_SEARCH_CONFIG_PATH}`) ?? \"auto\";\n}\n\nfunction toCuratorProvider(provider: SearchProviderSelection): CuratorProvider | undefined {\n\tif (Array.isArray(provider)) return \"all\";\n\treturn provider === \"auto\" ? undefined : provider;\n}\n\nfunction resolveCuratorSearchProvider(requested: unknown, current: SearchProviderSelection): SearchProviderSelection {\n\tconst normalized = normalizeProviderInput(requested);\n\tif (!normalized || normalized === \"auto\") return current;\n\tif (normalized === \"all\" && Array.isArray(current)) return current;\n\treturn normalized;\n}\n\nfunction normalizeRecencyFilter(value: unknown): RecencyFilter | undefined {\n\treturn value === \"day\" || value === \"week\" || value === \"month\" || value === \"year\"\n\t\t? value\n\t\t: undefined;\n}\n\nfunction normalizeCuratorTimeoutSeconds(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n\tconst normalized = Math.floor(value);\n\tif (normalized < 1) return undefined;\n\treturn Math.min(normalized, MAX_CURATOR_TIMEOUT_SECONDS);\n}\n\nfunction resolveWorkflow(input: unknown, hasUI: boolean): WebSearchWorkflow {\n\tconst normalized = typeof input === \"string\" ? input.trim().toLowerCase() : \"\";\n\tif (normalized === \"auto-summary\") return \"auto-summary\";\n\tif (!hasUI) return \"none\";\n\tif (normalized === \"none\") return \"none\";\n\treturn \"summary-review\";\n}\n\nfunction normalizeQueryList(queryList: unknown[]): string[] {\n\tconst normalized: string[] = [];\n\tfor (const query of queryList) {\n\t\tif (typeof query !== \"string\") continue;\n\t\tconst trimmed = query.trim();\n\t\tif (trimmed.length > 0) normalized.push(trimmed);\n\t}\n\treturn normalized;\n}\n\n// Some local models serialize a multi-query list into the single-string `query`\n// field as a JSON array (query: \"[\\\"a\\\", \\\"b\\\"]\") instead of using the\n// `queries` parameter. Forwarding that raw string verbatim makes every backend\n// search for the literal array text and return zero results, with no signal to\n// the model that its argument shape was wrong. Expand a string that parses as a\n// JSON array of strings so each element is searched independently.\nfunction expandQueryString(query: unknown): string[] {\n\tif (typeof query !== \"string\") return [];\n\tconst trimmed = query.trim();\n\tif (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(trimmed);\n\t\t\t// Only expand an unambiguously string-only array. Mixed or non-string\n\t\t\t// arrays are kept as the literal query so we never silently drop\n\t\t\t// members or collapse them into an empty search.\n\t\t\tif (Array.isArray(parsed) && parsed.every((entry): entry is string => typeof entry === \"string\")) {\n\t\t\t\treturn parsed\n\t\t\t\t\t.map((entry) => entry.trim())\n\t\t\t\t\t.filter((entry) => entry.length > 0);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Not JSON — treat as a literal query string.\n\t\t}\n\t}\n\treturn [query];\n}\n\nfunction getCuratorTimeoutSeconds(): number {\n\tconst source = loadConfig();\n\tconst explicit = normalizeCuratorTimeoutSeconds(source.curatorTimeoutSeconds);\n\tif (explicit !== undefined) return explicit;\n\t// Remote users must notice and click a printed link, so allow more idle time.\n\treturn resolveCuratorNetworkConfig().enabled ? DEFAULT_REMOTE_CURATOR_TIMEOUT_SECONDS : DEFAULT_CURATOR_TIMEOUT_SECONDS;\n}\n\nexport function getSummaryGenerationDeadlineMs(): number {\n\tconst value = loadConfig().summaryGenerationDeadlineMs;\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isInteger(value) || value <= 0) {\n\t\treturn SUMMARY_GENERATION_DEADLINE_MS;\n\t}\n\treturn Math.min(value, MAX_SUMMARY_GENERATION_DEADLINE_MS);\n}\n\nfunction shouldAutoOpenCuratorBrowser(config: WebSearchConfig): boolean {\n\tif (config.autoOpenBrowser === false) return false;\n\tif (resolveCuratorNetworkConfig().enabled && config.autoOpenBrowser !== true) return false;\n\treturn true;\n}\n\nasync function getProviderAvailability(ctx: ExtensionContext): Promise<ProviderAvailability> {\n\tconst geminiWebAvail = await getOptionalGeminiWebAvailability();\n\tconst geminiApiAvail = isGeminiApiAvailable();\n\tconst providers = {\n\t\topenai: await isOpenAISearchAvailable(ctx),\n\t\tbrave: isBraveAvailable(),\n\t\tparallel: isParallelAvailable(),\n\t\t\"parallel-mcp\": isParallelMcpAvailable(),\n\t\ttinyfish: isTinyFishAvailable(),\n\t\tsearch1api: isSearch1APIAvailable(),\n\t\tsearchinfinity: isSearchinfinityAvailable(),\n\t\tquerit: isQueritAvailable(),\n\t\ttavily: isTavilyAvailable(),\n\t\tfirecrawl: isFirecrawlAvailable(),\n\t\tjina: isJinaSearchAvailable(),\n\t\tserpdive: isSerpdiveAvailable(),\n\t\tkagi: isKagiAvailable(),\n\t\tbocha: isBochaAvailable(),\n\t\tollama: isOllamaAvailable(),\n\t\tsearxng: isSearXNGAvailable(),\n\t\tduckduckgo: isDuckDuckGoAvailable(),\n\t\tperplexity: isPerplexityAvailable(),\n\t\texa: isExaAvailable(),\n\t\tgemini: geminiApiAvail || !!geminiWebAvail,\n\t\tkimi: await isKimiSearchAvailable(ctx),\n\t\tanysearch: isAnySearchAvailable(),\n\t\txcrawl: isXcrawlAvailable(),\n\t\txai: await isXaiSearchAvailable(ctx),\n\t\tbrightdata: isBrightDataAvailable(),\n\t\tserpbase: isSerpBaseAvailable(),\n\t\tserper: isSerperAvailable(),\n\t\tvalyu: isValyuAvailable(),\n\t};\n\tconst allSearchProviders = new Set<ResolvedSearchProvider>(ALL_SEARCH_PROVIDERS);\n\treturn {\n\t\tall: Object.entries(providers).some(([provider, available]) => provider !== \"gemini\" && allSearchProviders.has(provider as ResolvedSearchProvider) && available) || geminiApiAvail,\n\t\t...providers,\n\t};\n}\n\nasync function getOptionalGeminiWebAvailability() {\n\ttry {\n\t\treturn await isGeminiWebAvailable();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction shouldUseOpenAICodexDefault(ctx?: Pick<ExtensionContext, \"model\">): boolean {\n\treturn ctx?.model?.provider === \"openai-codex\";\n}\n\nfunction shouldPreferOpenAI(options: Pick<PendingCurate, \"numResults\" | \"recencyFilter\"> | undefined, preferOpenAICodexDefault: boolean): boolean {\n\tif (options?.recencyFilter) return false;\n\tif (typeof options?.numResults === \"number\" && Number.isFinite(options.numResults) && Math.floor(options.numResults) !== 5) {\n\t\treturn false;\n\t}\n\treturn preferOpenAICodexDefault;\n}\n\nasync function loadCuratorBootstrap(\n\trequestedProvider: unknown,\n\tctx: ExtensionContext,\n\toptions?: Pick<PendingCurate, \"numResults\" | \"recencyFilter\">,\n): Promise<CuratorBootstrap> {\n\tconst provider = resolveRequestedProvider(requestedProvider);\n\tconst availableProviders = await getProviderAvailability(ctx);\n\tif (Array.isArray(provider)) availableProviders.all = true;\n\treturn {\n\t\tavailableProviders,\n\t\tdefaultProvider: resolveCuratorDefaultProvider(provider, availableProviders, ctx, options),\n\t\ttimeoutSeconds: getCuratorTimeoutSeconds(),\n\t};\n}\n\nexport function resolveCuratorDefaultProvider(\n\tprovider: SearchProviderSelection,\n\tavailable: ProviderAvailability,\n\tctx?: Pick<ExtensionContext, \"model\">,\n\toptions?: Pick<PendingCurate, \"numResults\" | \"recencyFilter\">,\n): CuratorProvider {\n\treturn resolveProvider(provider, available, options, shouldUseOpenAICodexDefault(ctx), ctx);\n}\n\nfunction firstAvailableProvider(available: ProviderAvailability, preferOpenAI: boolean, fallback: ResolvedSearchProvider): ResolvedSearchProvider {\n\tif (available.searxng) return \"searxng\";\n\tif (preferOpenAI && available.openai) return \"openai\";\n\tif (available.exa) return \"exa\";\n\tif (available.openai) return \"openai\";\n\tif (available.brave) return \"brave\";\n\tif (available.parallel) return \"parallel\";\n\tif (available.tinyfish) return \"tinyfish\";\n\tif (available.search1api) return \"search1api\";\n\tif (available.searchinfinity) return \"searchinfinity\";\n\tif (available.querit) return \"querit\";\n\tif (available.tavily) return \"tavily\";\n\tif (available.firecrawl) return \"firecrawl\";\n\tif (available.jina) return \"jina\";\n\tif (available.serpdive) return \"serpdive\";\n\tif (available.kagi) return \"kagi\";\n\tif (available.bocha) return \"bocha\";\n\tif (available.ollama) return \"ollama\";\n\tif (available.perplexity) return \"perplexity\";\n\tif (available.gemini) return \"gemini\";\n\treturn fallback;\n}\n\nfunction resolveProvider(\n\tprovider: SearchProviderSelection,\n\tavailable: ProviderAvailability,\n\toptions?: Pick<PendingCurate, \"numResults\" | \"recencyFilter\">,\n\tpreferOpenAICodexDefault = false,\n\tctx?: Pick<ExtensionContext, \"model\">,\n): CuratorProvider {\n\tif (Array.isArray(provider)) return \"all\";\n\tconst preferOpenAI = shouldPreferOpenAI(options, preferOpenAICodexDefault);\n\n\tif (provider === \"auto\") {\n\t\tconst routing = getConfiguredSearchRouting();\n\t\tif (routing) {\n\t\t\tfor (const candidate of routing.providers) {\n\t\t\t\tif (candidate === \"openai\" && routing.useCurrentModel === true && !isCurrentModelHostedSearchEligible(ctx)) continue;\n\t\t\t\tif (available[candidate]) return candidate;\n\t\t\t}\n\t\t\treturn routing.providers.find(candidate => candidate !== \"openai\" || routing.useCurrentModel !== true || isCurrentModelHostedSearchEligible(ctx)) ?? routing.providers[0];\n\t\t}\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"exa\");\n\t}\n\tif (provider === \"all\" && !available.all) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"exa\");\n\t}\n\tif (provider === \"openai\" && !available.openai) {\n\t\treturn firstAvailableProvider(available, false, \"openai\");\n\t}\n\tif (provider === \"brave\" && !available.brave) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"brave\");\n\t}\n\tif (provider === \"parallel\" && !available.parallel) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"parallel\");\n\t}\n\tif (provider === \"tinyfish\" && !available.tinyfish) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"tinyfish\");\n\t}\n\tif (provider === \"search1api\" && !available.search1api) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"search1api\");\n\t}\n\tif (provider === \"searchinfinity\" && !available.searchinfinity) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"searchinfinity\");\n\t}\n\tif (provider === \"querit\" && !available.querit) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"querit\");\n\t}\n\tif (provider === \"tavily\" && !available.tavily) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"tavily\");\n\t}\n\tif (provider === \"firecrawl\" && !available.firecrawl) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"firecrawl\");\n\t}\n\tif (provider === \"jina\" && !available.jina) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"jina\");\n\t}\n\tif (provider === \"serpdive\" && !available.serpdive) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"serpdive\");\n\t}\n\tif (provider === \"kagi\" && !available.kagi) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"kagi\");\n\t}\n\tif (provider === \"bocha\" && !available.bocha) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"bocha\");\n\t}\n\tif (provider === \"ollama\" && !available.ollama) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"ollama\");\n\t}\n\tif (provider === \"searxng\" && !available.searxng) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"searxng\");\n\t}\n\tif (provider === \"exa\" && !available.exa) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"exa\");\n\t}\n\tif (provider === \"perplexity\" && !available.perplexity) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"perplexity\");\n\t}\n\tif (provider === \"gemini\" && !available.gemini) {\n\t\treturn firstAvailableProvider(available, preferOpenAI, \"gemini\");\n\t}\n\treturn provider;\n}\n\nconst pendingFetches = new Map<string, AbortController>();\nlet sessionActive = false;\nlet widgetVisible = false;\nlet widgetUnsubscribe: (() => void) | null = null;\nconst pendingCurates = new Map<string, PendingCurate>();\nconst activeCurators = new Map<string, CuratorServerHandle>();\nconst glimpseWins = new Map<string, GlimpseWindow>();\n\ninterface PendingCurate {\n\tphase: \"searching\" | \"curating\";\n\tworkflow: CuratorWorkflow;\n\tsummaryContext: SummaryGenerationContext;\n\tsearchResults: Map<number, QueryResultData>;\n\tresultSlots: Map<number, number>;\n\tallInlineContent: ExtractedContent[];\n\tqueryList: string[];\n\tincludeContent: boolean;\n\tnumResults?: number;\n\trecencyFilter?: \"day\" | \"week\" | \"month\" | \"year\";\n\tdomainFilter?: string[];\n\tavailableProviders: ProviderAvailability;\n\tdefaultProvider: CuratorProvider;\n\tsearchProvider: SearchProviderSelection;\n\tsummaryModels: Array<{ value: string; label: string }>;\n\tdefaultSummaryModel: string | null;\n\ttimeoutSeconds: number;\n\tproxy?: string;\n\tcuratorUrl?: string;\n\tonUpdate: ((update: { content: Array<{ type: string; text: string }>; details?: Record<string, unknown> }) => void) | undefined;\n\tsignal: AbortSignal | undefined;\n\tabortSearches: () => void;\n\tfinish: (value: AgentToolResult<Record<string, unknown>>) => void;\n\tcancel: (reason?: \"user\" | \"stale\") => void;\n\tbrowserPromise?: Promise<void>;\n\tbrowserOpenError?: string;\n}\n\n\nconst DEFAULT_MAX_INLINE_CONTENT_CHARS = 30_000;\nconst MAX_INLINE_CONTENT_CHARS = 200_000;\n\nfunction getMaxInlineContentChars(config = loadConfig()): number {\n\tconst value = config.maxInlineContentChars;\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isInteger(value) || value <= 0) {\n\t\treturn DEFAULT_MAX_INLINE_CONTENT_CHARS;\n\t}\n\treturn Math.min(value, MAX_INLINE_CONTENT_CHARS);\n}\n\nfunction stripThumbnails(results: ExtractedContent[]): ExtractedContent[] {\n\treturn results.map(({ thumbnail, frames, ...rest }) => rest);\n}\n\nfunction storeFetchResult(pi: { appendEntry(type: string, data: unknown): void }, responseId: string, data: StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] }, authProfile?: AuthFetchProfile): boolean {\n\tif (authProfile?.cache === \"off\") return false;\n\tpi.appendEntry(\"web-search-results\", storeFetchedContentResult(responseId, data));\n\treturn true;\n}\n\nfunction initialContentSlice(content: string, maxChars: number): {\n\ttext: string;\n\tendOffset: number;\n\ttotalBytes: number;\n\ttotalLines: number;\n\tshownBytes: number;\n\tshownLines: number;\n} {\n\tlet endOffset = Math.min(content.length, maxChars);\n\tif (endOffset < content.length) {\n\t\tconst lineBreak = content.lastIndexOf(\"\\n\", endOffset);\n\t\tif (lineBreak >= Math.floor(maxChars * 0.8)) endOffset = lineBreak + 1;\n\t}\n\tconst text = content.slice(0, endOffset);\n\treturn {\n\t\ttext,\n\t\tendOffset,\n\t\ttotalBytes: Buffer.byteLength(content),\n\t\ttotalLines: content.length === 0 ? 0 : content.split(\"\\n\").length,\n\t\tshownBytes: Buffer.byteLength(text),\n\t\tshownLines: text.length === 0 ? 0 : text.split(\"\\n\").length,\n\t};\n}\n\nfunction normalizeFindQueries(value: string | string[]): string[] {\n\tconst queries = (Array.isArray(value) ? value : [value]).map(query => query.trim()).filter(Boolean);\n\tif (queries.length === 0) throw new Error(\"findText must contain at least one non-empty string\");\n\treturn queries;\n}\n\ninterface GetSearchContentParams {\n\tresponseId: string;\n\tquery?: string;\n\tqueryIndex?: number;\n\turl?: string;\n\turlIndex?: number;\n\toffset?: number;\n\tlimit?: number;\n\tfindText?: string | string[];\n\tfindMode?: FindMode;\n}\n\ntype RawGetSearchContentParams = Omit<GetSearchContentParams, \"findMode\"> & { findMode?: unknown };\n\nfunction normalizeFindMode(value: unknown): FindMode | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === \"exact\" || value === \"case-insensitive\" || value === \"fuzzy\") return value;\n\tthrow new Error('findMode must be \"exact\", \"case-insensitive\", or \"fuzzy\"');\n}\n\nfunction normalizeGetSearchContentParams(params: RawGetSearchContentParams): GetSearchContentParams {\n\tconst normalized: GetSearchContentParams = { ...params, findMode: normalizeFindMode(params.findMode) };\n\n\tif (normalized.query?.trim() === \"\") delete normalized.query;\n\tif (normalized.url?.trim() === \"\") delete normalized.url;\n\n\tif (normalized.findText !== undefined) {\n\t\tdelete normalized.offset;\n\t\tdelete normalized.limit;\n\t}\n\n\treturn normalized;\n}\n\nfunction formatInputValue(value: unknown): string {\n\tif (typeof value === \"string\") return JSON.stringify(value);\n\tif (typeof value === \"number\") return Number.isNaN(value) ? \"NaN\" : String(value);\n\ttry {\n\t\tconst serialized = JSON.stringify(value);\n\t\treturn serialized === undefined ? String(value) : serialized;\n\t} catch {\n\t\treturn String(value);\n\t}\n}\n\nfunction formatSearchSummary(results: SearchResult[], answer: string): string {\n\tif (results.length === 0) {\n\t\treturn answer ? `${answer}\\n\\n---\\n\\n**Sources:**\\nNo sources returned.` : \"No results found.\";\n\t}\n\tlet output = answer ? `${answer}\\n\\n---\\n\\n**Sources:**\\n` : \"\";\n\toutput += results.map((r, i) => `${i + 1}. ${r.title}\\n ${r.url}`).join(\"\\n\\n\");\n\treturn output;\n}\n\nfunction formatSourceCheckResult(artifact: ResearchArtifact, getSearchContentTool: string | null = DEFAULT_TOOL_NAMES.getSearchContent): string {\n\tconst assessment = artifact.claims?.[0];\n\tconst lines = [`# Source check: ${artifact.query}`, \"\"];\n\tif (assessment) {\n\t\tlines.push(`**Status:** ${assessment.status} (confidence ${assessment.confidence.toFixed(2)})`);\n\t\tlines.push(`**Rationale:** ${assessment.rationale}`);\n\t\tif (assessment.supporting_passages.length > 0) lines.push(`**Supporting passages:** ${assessment.supporting_passages.join(\", \")}`);\n\t\tif (assessment.contradicting_passages.length > 0) lines.push(`**Contradicting passages:** ${assessment.contradicting_passages.join(\", \")}`);\n\t\tlines.push(\"\");\n\t}\n\tif (artifact.sources.length > 0) {\n\t\tlines.push(\"## Sources\");\n\t\tfor (const source of artifact.sources) lines.push(`${source.rank}. [${source.quality}] ${source.title}\\n ${source.url}`);\n\t\tlines.push(\"\");\n\t}\n\tif (artifact.errors?.length) lines.push(`Search errors: ${artifact.errors.map((entry) => `${entry.query}: ${entry.error}`).join(\"; \")}`);\n\tlines.push(getSearchContentTool\n\t\t? `Artifact responseId: ${artifact.id} (retrievable via ${getSearchContentTool}).`\n\t\t: `Artifact responseId: ${artifact.id}. Content retrieval is not registered.`);\n\treturn lines.join(\"\\n\");\n}\n\nfunction duplicateQuerySet(results: QueryResultData[]): Set<string> {\n\tconst counts = new Map<string, number>();\n\tfor (const result of results) {\n\t\tcounts.set(result.query, (counts.get(result.query) ?? 0) + 1);\n\t}\n\tconst duplicates = new Set<string>();\n\tfor (const [query, count] of counts) {\n\t\tif (count > 1) duplicates.add(query);\n\t}\n\treturn duplicates;\n}\n\nfunction formatQueryHeader(query: string, provider: string | undefined, duplicateQueries: Set<string>): string {\n\tconst suffix = duplicateQueries.has(query) && provider ? ` (${provider})` : \"\";\n\treturn `## Query: \"${query}\"${suffix}\\n\\n`;\n}\n\nfunction hasFullInlineCoverage(urls: string[], inlineContent: ExtractedContent[] | undefined): boolean {\n\tif (!inlineContent || inlineContent.length === 0) return false;\n\tconst coveredUrls = new Set(inlineContent.map(c => c.url));\n\treturn urls.every(url => coveredUrls.has(url));\n}\n\nfunction formatFullResults(queryData: QueryResultData): string {\n\tlet output = `## Results for: \"${queryData.query}\"\\n\\n`;\n\tif (queryData.answer) {\n\t\toutput += `${queryData.answer}\\n\\n---\\n\\n`;\n\t}\n\tfor (const r of queryData.results) {\n\t\toutput += `### ${r.title}\\n${r.url}\\n\\n`;\n\t}\n\treturn output;\n}\n\nfunction abortPendingFetches(): void {\n\tfor (const controller of pendingFetches.values()) {\n\t\tcontroller.abort();\n\t}\n\tpendingFetches.clear();\n}\n\nfunction closeCurator(callId?: string): void {\n\tif (callId !== undefined) {\n\t\tconst win = glimpseWins.get(callId);\n\t\tglimpseWins.delete(callId);\n\t\ttry { win?.close(); } catch {}\n\t\tpendingCurates.get(callId)?.cancel(\"stale\");\n\t\tpendingCurates.delete(callId);\n\t\tconst curator = activeCurators.get(callId);\n\t\tactiveCurators.delete(callId);\n\t\ttry { curator?.close(); } catch {}\n\t\treturn;\n\t}\n\n\tfor (const win of glimpseWins.values()) {\n\t\ttry { win.close(); } catch {}\n\t}\n\tglimpseWins.clear();\n\tfor (const pc of pendingCurates.values()) {\n\t\ttry { pc.cancel(\"stale\"); } catch {}\n\t}\n\tpendingCurates.clear();\n\tfor (const curator of activeCurators.values()) {\n\t\ttry { curator.close(); } catch {}\n\t}\n\tactiveCurators.clear();\n}\n\nasync function openInBrowser(pi: ExtensionAPI, url: string): Promise<void> {\n\tconst plat = platform();\n\tif (plat !== \"darwin\" && plat !== \"win32\") {\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst child = spawn(\"xdg-open\", [url], { detached: true, stdio: \"ignore\" });\n\t\t\tconst timer = setTimeout(resolve, 100);\n\t\t\tchild.once(\"error\", (err) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t\tchild.once(\"exit\", (code) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tif (code === 0) resolve();\n\t\t\t\telse reject(new Error(`Failed to open browser (exit code ${code ?? \"unknown\"})`));\n\t\t\t});\n\t\t\tchild.unref();\n\t\t});\n\t\treturn;\n\t}\n\tconst result = plat === \"darwin\"\n\t\t? await pi.exec(\"open\", [url])\n\t\t: await pi.exec(\"cmd\", [\"/c\", \"start\", \"\", url]);\n\tif (result.code !== 0) {\n\t\tthrow new Error(result.stderr || `Failed to open browser (exit code ${result.code})`);\n\t}\n}\n\ninterface GlimpseWindow {\n\ton(event: \"closed\", handler: () => void): void;\n\ton(event: \"message\", handler: (data: unknown) => void): void;\n\ton(event: \"ready\", handler: (info: { screen?: { visibleHeight?: number } }) => void): void;\n\tclose(): void;\n\t_write(obj: Record<string, unknown>): void;\n}\n\nlet glimpseOpen: ((html: string, opts: Record<string, unknown>) => GlimpseWindow) | null | undefined;\n\nfunction findGlimpseMjs(): string | null {\n\ttry {\n\t\tconst req = createRequire(import.meta.url);\n\t\treturn req.resolve(\"glimpseui\");\n\t} catch {\n\t\t// Optional dependency.\n\t}\n\ttry {\n\t\tconst globalRoot = execFileSync(\"npm\", [\"root\", \"-g\"], { encoding: \"utf-8\" }).trim();\n\t\tconst entry = join(globalRoot, \"glimpseui\", \"src\", \"glimpse.mjs\");\n\t\tif (existsSync(entry)) return entry;\n\t} catch {\n\t\t// npm may be unavailable.\n\t}\n\treturn null;\n}\n\nasync function getGlimpseOpen() {\n\tif (glimpseOpen !== undefined) return glimpseOpen;\n\tconst resolved = findGlimpseMjs();\n\tif (resolved) {\n\t\ttry {\n\t\t\tglimpseOpen = (await import(resolved)).open;\n\t\t\treturn glimpseOpen;\n\t\t} catch {}\n\t}\n\tglimpseOpen = null;\n\treturn glimpseOpen;\n}\n\nfunction openInGlimpse(\n\topen: (html: string, opts: Record<string, unknown>) => GlimpseWindow,\n\turl: string,\n\ttitle: string,\n): GlimpseWindow {\n\tconst shellHTML = `<!DOCTYPE html>\n<html>\n<head><meta charset=\"UTF-8\"><title>${title}</title></head>\n<body style=\"margin:0; background:#1a1a2e;\">\n <script>window.location.replace(${JSON.stringify(url)});</script>\n</body>\n</html>`;\n\tconst win = open(shellHTML, {\n\t\twidth: 800,\n\t\theight: 900,\n\t\ttitle,\n\t});\n\n\tlet maxHeight = 1200;\n\twin.on(\"ready\", (info) => {\n\t\tconst visibleHeight = info?.screen?.visibleHeight;\n\t\tif (typeof visibleHeight === \"number\" && visibleHeight > 0) {\n\t\t\tmaxHeight = Math.floor(visibleHeight * 0.85);\n\t\t}\n\t});\n\twin.on(\"message\", (data) => {\n\t\tif (!data || typeof data !== \"object\") return;\n\t\tconst msg = data as Record<string, unknown>;\n\t\tif (msg.type !== \"resize\" || typeof msg.height !== \"number\") return;\n\t\tconst clamped = Math.max(400, Math.min(Math.round(msg.height), maxHeight));\n\t\twin._write({ type: \"resize\", width: 800, height: clamped });\n\t});\n\n\treturn win;\n}\n\nfunction extractDomain(url: string): string {\n\ttry { return new URL(url).hostname; }\n\tcatch { return url; }\n}\n\nfunction toCuratorSearchEntries(response: AttributedSearchResponse): CuratorSearchEntry[] {\n\tconst providerResponses = response.provider === \"all\" && response.providerResponses?.length\n\t\t? response.providerResponses\n\t\t: [response];\n\tconst entries: CuratorSearchEntry[] = providerResponses.map(result => ({\n\t\tanswer: result.answer,\n\t\tresults: result.results.map(source => ({ ...source, domain: extractDomain(source.url) })),\n\t\tprovider: result.provider,\n\t}));\n\tfor (const failure of response.providerErrors ?? []) {\n\t\tentries.push({\n\t\t\tanswer: \"\",\n\t\t\tresults: [],\n\t\t\tprovider: failure.provider,\n\t\t\terror: failure.error,\n\t\t});\n\t}\n\treturn entries;\n}\n\nfunction indexedCuratorEntryToQueryResult(entry: IndexedCuratorSearchEntry): QueryResultData {\n\treturn {\n\t\tquery: entry.query,\n\t\tanswer: entry.answer,\n\t\tresults: entry.results.map(source => ({\n\t\t\ttitle: source.title,\n\t\t\turl: source.url,\n\t\t\tsnippet: source.snippet ?? \"\",\n\t\t})),\n\t\terror: entry.error ?? null,\n\t\tprovider: entry.provider,\n\t};\n}\n\nfunction updateWidget(ctx: ExtensionContext): void {\n\tconst theme = ctx.ui.theme;\n\tconst entries = activityMonitor.getEntries();\n\tconst lines: string[] = [];\n\n\tlines.push(theme.fg(\"accent\", \"─── Web Search Activity \" + \"─\".repeat(36)));\n\n\tif (entries.length === 0) {\n\t\tlines.push(theme.fg(\"muted\", \" No activity yet\"));\n\t} else {\n\t\tfor (const e of entries) {\n\t\t\tlines.push(\" \" + formatEntryLine(e, theme));\n\t\t}\n\t}\n\n\tlines.push(theme.fg(\"accent\", \"─\".repeat(60)));\n\n\tconst rateInfo = activityMonitor.getRateLimitInfo();\n\tconst resetMs = rateInfo.oldestTimestamp ? Math.max(0, rateInfo.oldestTimestamp + rateInfo.windowMs - Date.now()) : 0;\n\tconst resetSec = Math.ceil(resetMs / 1000);\n\tlines.push(\n\t\ttheme.fg(\"muted\", `Rate: ${rateInfo.used}/${rateInfo.max}`) +\n\t\t\t(resetMs > 0 ? theme.fg(\"dim\", ` (resets in ${resetSec}s)`) : \"\"),\n\t);\n\n\tctx.ui.setWidget(\"web-activity\", lines);\n}\n\nfunction formatEntryLine(\n\tentry: ActivityEntry,\n\ttheme: ExtensionTheme,\n): string {\n\tconst typeStr = entry.type === \"api\" ? \"API\" : \"GET\";\n\tconst target =\n\t\tentry.type === \"api\"\n\t\t\t? `\"${truncateToWidth(entry.query || \"\", 28, \"\")}\"`\n\t\t\t: truncateToWidth(entry.url?.replace(/^https?:\\/\\//, \"\") || \"\", 30, \"\");\n\n\tconst duration = entry.endTime\n\t\t? `${((entry.endTime - entry.startTime) / 1000).toFixed(1)}s`\n\t\t: `${((Date.now() - entry.startTime) / 1000).toFixed(1)}s`;\n\n\tlet statusStr: string;\n\tlet indicator: string;\n\tif (entry.error) {\n\t\tstatusStr = \"err\";\n\t\tindicator = theme.fg(\"error\", \"✗\");\n\t} else if (entry.status === null) {\n\t\tstatusStr = \"...\";\n\t\tindicator = theme.fg(\"warning\", \"⋯\");\n\t} else if (entry.status === 0) {\n\t\tstatusStr = \"abort\";\n\t\tindicator = theme.fg(\"muted\", \"○\");\n\t} else {\n\t\tstatusStr = String(entry.status);\n\t\tindicator = entry.status >= 200 && entry.status < 300 ? theme.fg(\"success\", \"✓\") : theme.fg(\"error\", \"✗\");\n\t}\n\n\treturn `${typeStr.padEnd(4)} ${target.padEnd(32)} ${statusStr.padStart(5)} ${duration.padStart(5)} ${indicator}`;\n}\n\nfunction handleSessionChange(ctx: ExtensionContext): void {\n\tabortPendingFetches();\n\tcloseCurator();\n\tclearCloneCache();\n\tsessionActive = true;\n\trestoreFromSession(ctx);\n\t// Unsubscribe before clear() to avoid callback with stale ctx\n\twidgetUnsubscribe?.();\n\twidgetUnsubscribe = null;\n\tactivityMonitor.clear();\n\tif (widgetVisible) {\n\t\t// Re-subscribe with new ctx\n\t\twidgetUnsubscribe = activityMonitor.onUpdate(() => updateWidget(ctx));\n\t\tupdateWidget(ctx);\n\t}\n}\n\nexport default function (pi: ExtensionAPI) {\n\tconst initConfig = loadConfigForExtensionInit();\n\tinstallGlobalProxyFetch();\n\tconst toolNames = resolveToolNames(initConfig);\n\tconst webSearchEnabled = isToolEnabled(initConfig, \"webSearch\");\n\tconst sourceCheckEnabled = isToolEnabled(initConfig, \"sourceCheck\");\n\tconst fetchContentEnabled = isToolEnabled(initConfig, \"fetchContent\");\n\tconst getSearchContentEnabled = isToolEnabled(initConfig, \"getSearchContent\");\n\t// Names as registered this session, so fetch failure guidance never points\n\t// at tools that are disabled or were renamed after init.\n\tconst registeredToolNames = {\n\t\t...(webSearchEnabled ? { webSearch: toolNames.webSearch } : {}),\n\t\t...(fetchContentEnabled ? { fetchContent: toolNames.fetchContent } : {}),\n\t};\n\tconst storedContentSources = joinToolNames([\n\t\t...(webSearchEnabled ? [toolNames.webSearch] : []),\n\t\t...(sourceCheckEnabled ? [toolNames.sourceCheck] : []),\n\t\t...(fetchContentEnabled ? [toolNames.fetchContent] : []),\n\t]);\n\tconst searchQueryDescription = webSearchEnabled\n\t\t? `Get content for this query (${toolNames.webSearch})`\n\t\t: \"Get content for a stored search query\";\n\tconst fetchContentStorageNote = getSearchContentEnabled\n\t\t? `Full original content is stored for retrieval with ${toolNames.getSearchContent}.`\n\t\t: \"Full original content is stored internally, but the retrieval tool is not registered.\";\n\tconst curateKey = initConfig.shortcuts?.curate || DEFAULT_SHORTCUTS.curate;\n\tconst activityKey = initConfig.shortcuts?.activity || DEFAULT_SHORTCUTS.activity;\n\n\tfunction startBackgroundFetch(urls: string[], proxy?: string): string | null {\n\t\tif (urls.length === 0) return null;\n\t\tconst fetchId = generateId();\n\t\tconst controller = new AbortController();\n\t\tpendingFetches.set(fetchId, controller);\n\t\trunWithProxy(proxy, () => fetchAllContent(urls, controller.signal, withRegisteredFetchOptions(undefined, registeredToolNames, proxy)))\n\t\t\t.then((fetched) => {\n\t\t\t\tif (!sessionActive || !pendingFetches.has(fetchId)) return;\n\t\t\t\tconst data = {\n\t\t\t\t\tid: fetchId,\n\t\t\t\t\ttype: \"fetch\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\turls: stripThumbnails(fetched),\n\t\t\t\t} satisfies StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] };\n\t\t\t\tpi.appendEntry(\"web-search-results\", storeFetchedContentResult(fetchId, data));\n\t\t\t\tconst ok = fetched.filter(f => !f.error).length;\n\t\t\t\tconst availability = ok === fetched.length\n\t\t\t\t\t? \"Full page content now available.\"\n\t\t\t\t\t: ok > 0\n\t\t\t\t\t\t? \"Partial page content now available.\"\n\t\t\t\t\t\t: \"No page content was fetched. Stored fetch diagnostics are available.\";\n\t\t\t\tpi.sendMessage(\n\t\t\t\t\t{\n\t\t\t\t\t\tcustomType: \"web-search-content-ready\",\n\t\t\t\t\t\tcontent: `Content fetched for ${ok}/${fetched.length} URLs [${fetchId}]. ${availability}`,\n\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t},\n\t\t\t\t\t{ triggerTurn: true },\n\t\t\t\t);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tif (!sessionActive || !pendingFetches.has(fetchId)) return;\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\tconst isAbort = (err instanceof Error && err.name === \"AbortError\") || message.toLowerCase().includes(\"abort\");\n\t\t\t\tif (!isAbort) {\n\t\t\t\t\tpi.sendMessage(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcustomType: \"web-search-error\",\n\t\t\t\t\t\t\tcontent: `Content fetch failed [${fetchId}]: ${message}`,\n\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ triggerTurn: false },\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => { pendingFetches.delete(fetchId); });\n\t\treturn fetchId;\n\t}\n\n\tfunction storeAndPublishSearch(results: QueryResultData[]): string {\n\t\tconst id = generateId();\n\t\tconst data: StoredSearchData = {\n\t\t\tid, type: \"search\", timestamp: Date.now(), queries: results,\n\t\t};\n\t\tstoreResult(id, data);\n\t\tpi.appendEntry(\"web-search-results\", data);\n\t\treturn id;\n\t}\n\n\tinterface SearchReturnOptions {\n\t\tqueryList: string[];\n\t\tresults: QueryResultData[];\n\t\turls: string[];\n\t\tincludeContent: boolean;\n\t\tinlineContent?: ExtractedContent[];\n\t\tcurated?: boolean;\n\t\tcuratedFrom?: number;\n\t\tworkflow?: SummaryWorkflow;\n\t\tapprovedSummary?: string;\n\t\tsummaryMeta?: SummaryMeta;\n\t\tproxy?: string;\n\t}\n\n\tfunction normalizeSummaryMeta(meta: SummaryMeta | undefined, summaryText: string): SummaryMeta {\n\t\tconst normalizedText = summaryText.trim();\n\t\tif (!meta) {\n\t\t\treturn {\n\t\t\t\tmodel: null,\n\t\t\t\tdurationMs: 0,\n\t\t\t\ttokenEstimate: normalizedText.length > 0 ? Math.max(1, Math.ceil(normalizedText.length / 4)) : 0,\n\t\t\t\tfallbackUsed: false,\n\t\t\t\tedited: false,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tmodel: meta.model,\n\t\t\tdurationMs: Number.isFinite(meta.durationMs) && meta.durationMs >= 0 ? meta.durationMs : 0,\n\t\t\ttokenEstimate: Number.isFinite(meta.tokenEstimate) && meta.tokenEstimate >= 0\n\t\t\t\t? meta.tokenEstimate\n\t\t\t\t: (normalizedText.length > 0 ? Math.max(1, Math.ceil(normalizedText.length / 4)) : 0),\n\t\t\tfallbackUsed: meta.fallbackUsed === true,\n\t\t\tfallbackReason: meta.fallbackReason,\n\t\t\tphase: meta.phase,\n\t\t\tedited: meta.edited === true,\n\t\t};\n\t}\n\n\tfunction buildCurationCancelledReturn(\n\t\treason: \"user\" | \"stale\",\n\t\tpartial?: {\n\t\t\tqueries?: QueryResultData[];\n\t\t\tqueryCount?: number;\n\t\t\tbrowserConnected?: boolean;\n\t\t\tlastHeartbeatAgeMs?: number | null;\n\t\t\tcuratorUrl?: string;\n\t\t\tbrowserOpenError?: string;\n\t\t},\n\t): AgentToolResult<Record<string, unknown>> {\n\t\tconst message = `Search curation cancelled (${reason}).`;\n\t\tconst cancelledQueries = partial?.queries?.length\n\t\t\t? partial.queries.map(q => ({\n\t\t\t\tquery: q.query,\n\t\t\t\tprovider: q.provider ?? null,\n\t\t\t\terror: q.error,\n\t\t\t\tresultCount: q.results?.length ?? 0,\n\t\t\t}))\n\t\t\t: undefined;\n\t\tconst extraLines: string[] = [];\n\t\tif (partial?.curatorUrl) extraLines.push(`curator: ${partial.curatorUrl}`);\n\t\tif (partial?.browserOpenError) extraLines.push(`browser open error: ${partial.browserOpenError}`);\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: message }],\n\t\t\tdetails: {\n\t\t\t\terror: message,\n\t\t\t\tcancelled: true,\n\t\t\t\tcancelReason: reason,\n\t\t\t\tbrowserConnected: partial?.browserConnected,\n\t\t\t\tlastHeartbeatAgeMs: partial?.lastHeartbeatAgeMs,\n\t\t\t\tqueryCount: partial?.queryCount,\n\t\t\t\tcancelledQueries,\n\t\t\t\textraLines: extraLines.length > 0 ? extraLines : undefined,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync function generateSummaryForSelectedIndices(\n\t\tselectedQueryIndices: number[],\n\t\tresultsByIndex: Map<number, QueryResultData>,\n\t\tsummaryContext: SummaryGenerationContext,\n\t\tsignal?: AbortSignal,\n\t\tmodelOverride?: string,\n\t\tfeedback?: string,\n\t): Promise<{ summary: string; meta: SummaryMeta }> {\n\t\tconst selectedResults: QueryResultData[] = [];\n\t\tfor (const qi of selectedQueryIndices) {\n\t\t\tconst result = resultsByIndex.get(qi);\n\t\t\tif (result) selectedResults.push(result);\n\t\t}\n\t\tif (selectedResults.length === 0) {\n\t\t\tthrow new Error(\"No selected results available for summary generation\");\n\t\t}\n\t\ttry {\n\t\t\treturn await generateSummaryDraft(\n\t\t\t\tselectedResults,\n\t\t\t\tsummaryContext,\n\t\t\t\tsignal,\n\t\t\t\tmodelOverride,\n\t\t\t\tfeedback,\n\t\t\t\tundefined,\n\t\t\t\tgetSummaryGenerationDeadlineMs(),\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tconst isEmptyResponse = err instanceof Error && err.message.includes(\"Summary model returned empty response\");\n\t\t\tif (!isEmptyResponse) throw err;\n\t\t\tconst deterministic = buildDeterministicSummary(selectedResults);\n\t\t\treturn {\n\t\t\t\tsummary: deterministic.summary,\n\t\t\t\tmeta: {\n\t\t\t\t\t...deterministic.meta,\n\t\t\t\t\tfallbackReason: \"summary-model-empty-response\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\tasync function loadSummaryModelChoices(\n\t\tsummaryContext: SummaryGenerationContext,\n\t): Promise<{ summaryModels: Array<{ value: string; label: string }>; defaultSummaryModel: string | null }> {\n\t\tconst summaryModels: Array<{ value: string; label: string }> = [];\n\t\tconst seen = new Set<string>();\n\t\tconst availableValues = new Set<string>();\n\n\t\tconst addModel = (provider: string, id: string) => {\n\t\t\tconst value = `${provider}/${id}`;\n\t\t\tif (seen.has(value)) return;\n\t\t\tseen.add(value);\n\t\t\tsummaryModels.push({ value, label: value });\n\t\t};\n\n\t\tlet enabledModelPatterns: string[] | null = null;\n\t\tlet scopeLoaded = true;\n\t\ttry {\n\t\t\tenabledModelPatterns = loadEnabledModelPatterns(summaryContext);\n\t\t\tconst availableModels = summaryContext.modelRegistry.getAvailable();\n\t\t\tfor (const model of availableModels) {\n\t\t\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) continue;\n\t\t\t\tconst value = `${model.provider}/${model.id}`;\n\t\t\t\tavailableValues.add(value);\n\t\t\t\taddModel(model.provider, model.id);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tscopeLoaded = false;\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tconsole.error(`Failed to load summary models: ${message}`);\n\t\t}\n\n\t\tconst currentModelValue = summaryContext.model\n\t\t\t? `${summaryContext.model.provider}/${summaryContext.model.id}`\n\t\t\t: null;\n\t\tif (scopeLoaded && summaryContext.model && currentModelValue && !seen.has(currentModelValue) && modelMatchesEnabledPatterns(summaryContext.model, enabledModelPatterns)) {\n\t\t\taddModel(summaryContext.model.provider, summaryContext.model.id);\n\t\t}\n\n\t\tconst config = loadConfig();\n\t\tconst configuredSummaryModel = typeof config.summaryModel === \"string\" ? config.summaryModel.trim() : \"\";\n\t\tconst preferredDefaults = [\n\t\t\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t\t\t{ provider: \"openai-codex\", id: \"gpt-5.6-luna\" },\n\t\t\t{ provider: \"openai-codex\", id: \"gpt-5.6-terra\" },\n\t\t\t{ provider: \"google\", id: \"gemini-3.6-flash\" },\n\t\t\t{ provider: \"openai\", id: \"gpt-5-mini\" },\n\t\t\t{ provider: \"deepseek\", id: \"deepseek-v4-flash\" },\n\t\t];\n\n\t\tconst resolveAvailableModelValue = (selector: string): string | null => {\n\t\t\tconst parsed = splitThinkingSuffix(selector);\n\t\t\tconst slashIndex = parsed.value.indexOf(\"/\");\n\t\t\tif (slashIndex <= 0 || slashIndex >= parsed.value.length - 1) return null;\n\t\t\tconst model = findModelWithProviderRouting(\n\t\t\t\tsummaryContext.modelRegistry,\n\t\t\t\tparsed.value.slice(0, slashIndex),\n\t\t\t\tparsed.value.slice(slashIndex + 1),\n\t\t\t);\n\t\t\tif (!model) return null;\n\t\t\tconst value = `${model.provider}/${model.id}`;\n\t\t\tif (!availableValues.has(value)) return null;\n\t\t\tif (selector !== value && !seen.has(selector)) {\n\t\t\t\tseen.add(selector);\n\t\t\t\tsummaryModels.push({ value: selector, label: selector });\n\t\t\t}\n\t\t\treturn selector;\n\t\t};\n\n\t\tlet defaultSummaryModel: string | null = null;\n\t\tif (scopeLoaded && configuredSummaryModel.length > 0) {\n\t\t\tdefaultSummaryModel = availableValues.has(configuredSummaryModel)\n\t\t\t\t? configuredSummaryModel\n\t\t\t\t: resolveAvailableModelValue(configuredSummaryModel);\n\t\t}\n\t\tif (scopeLoaded && !defaultSummaryModel) {\n\t\t\tfor (const preferred of preferredDefaults) {\n\t\t\t\tconst model = findModelWithProviderRouting(summaryContext.modelRegistry, preferred.provider, preferred.id);\n\t\t\t\tconst value = model ? `${model.provider}/${model.id}` : null;\n\t\t\t\tif (value && availableValues.has(value)) {\n\t\t\t\t\tdefaultSummaryModel = value;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { summaryModels, defaultSummaryModel };\n\t}\n\n\tfunction resolveSummaryForSubmit(\n\t\tpayload: { selectedQueryIndices: number[]; summary?: string; summaryMeta?: SummaryMeta },\n\t\tresultsByIndex: Map<number, QueryResultData>,\n\t): { approvedSummary: string; summaryMeta: SummaryMeta } {\n\t\tconst submittedSummary = typeof payload.summary === \"string\" ? payload.summary.trim() : \"\";\n\t\tif (submittedSummary.length > 0) {\n\t\t\treturn {\n\t\t\t\tapprovedSummary: submittedSummary,\n\t\t\t\tsummaryMeta: normalizeSummaryMeta(payload.summaryMeta, submittedSummary),\n\t\t\t};\n\t\t}\n\n\t\tconst selected = filterByQueryIndices(payload.selectedQueryIndices, resultsByIndex).results;\n\t\tconst fallbackResults = selected.length > 0 ? selected : [...resultsByIndex.values()];\n\t\tconst deterministic = buildDeterministicSummary(fallbackResults);\n\t\treturn {\n\t\t\tapprovedSummary: deterministic.summary,\n\t\t\tsummaryMeta: deterministic.meta,\n\t\t};\n\t}\n\n\tfunction buildSearchReturn(opts: SearchReturnOptions): AgentToolResult<Record<string, unknown>> {\n\t\tconst sc = opts.results.filter(r => !r.error).length;\n\t\tconst tr = opts.results.reduce((sum, r) => sum + r.results.length, 0);\n\n\t\tconst hasApprovedSummary = typeof opts.approvedSummary === \"string\" && opts.approvedSummary.trim().length > 0;\n\t\tlet output = \"\";\n\t\tif (hasApprovedSummary) {\n\t\t\toutput = opts.approvedSummary!.trim();\n\t\t} else {\n\t\t\tif (opts.curated) {\n\t\t\t\toutput += \"[These results were manually curated by the user in the browser. Use them as-is — do not re-search or discard.]\\n\\n\";\n\t\t\t}\n\t\t\tconst duplicateQueries = opts.curated ? duplicateQuerySet(opts.results) : new Set<string>();\n\t\t\tfor (const { query, answer, results, error, provider } of opts.results) {\n\t\t\t\tif (opts.queryList.length > 1) {\n\t\t\t\t\toutput += opts.curated\n\t\t\t\t\t\t? formatQueryHeader(query, provider, duplicateQueries)\n\t\t\t\t\t\t: `## Query: \"${query}\"\\n\\n`;\n\t\t\t\t}\n\t\t\t\tif (error) output += `Error: ${error}\\n\\n`;\n\t\t\t\telse output += formatSearchSummary(results, answer) + \"\\n\\n\";\n\t\t\t}\n\t\t}\n\n\t\tconst hasInlineReady = hasFullInlineCoverage(opts.urls, opts.inlineContent);\n\t\tlet fetchId: string | null = null;\n\t\tif (hasInlineReady && opts.inlineContent) {\n\t\t\tfetchId = generateId();\n\t\t\tconst data = {\n\t\t\t\tid: fetchId,\n\t\t\t\ttype: \"fetch\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\turls: opts.inlineContent,\n\t\t\t} satisfies StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] };\n\t\t\tpi.appendEntry(\"web-search-results\", storeFetchedContentResult(fetchId, data));\n\t\t\tif (!hasApprovedSummary) {\n\t\t\t\toutput += `---\\nFull content for ${opts.inlineContent.length} sources available [${fetchId}].`;\n\t\t\t}\n\t\t} else if (opts.includeContent) {\n\t\t\tfetchId = startBackgroundFetch(opts.urls, opts.proxy);\n\t\t\tif (fetchId && !hasApprovedSummary) {\n\t\t\t\toutput += `---\\nContent fetching in background [${fetchId}]. Will notify when ready.`;\n\t\t\t}\n\t\t}\n\n\t\tconst searchId = storeAndPublishSearch(opts.results);\n\t\tconst isBackgroundFetch = fetchId !== null && !hasInlineReady;\n\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: output.trim() }],\n\t\t\tdetails: {\n\t\t\t\tqueries: opts.queryList,\n\t\t\t\tqueryCount: opts.queryList.length,\n\t\t\t\tsuccessfulQueries: sc,\n\t\t\t\ttotalResults: tr,\n\t\t\t\tincludeContent: opts.includeContent,\n\t\t\t\tfetchId,\n\t\t\t\tfetchUrls: isBackgroundFetch ? opts.urls : undefined,\n\t\t\t\tsearchId,\n\t\t\t\t...(opts.curated ? {\n\t\t\t\t\tcurated: true,\n\t\t\t\t\tcuratedFrom: opts.curatedFrom,\n\t\t\t\t\tcuratedQueries: opts.results.map(r => ({\n\t\t\t\t\t\tquery: r.query,\n\t\t\t\t\t\tprovider: r.provider || null,\n\t\t\t\t\t\tanswer: r.answer || null,\n\t\t\t\t\t\tsources: r.results.map(s => ({ title: s.title, url: s.url })),\n\t\t\t\t\t\terror: r.error,\n\t\t\t\t\t})),\n\t\t\t\t} : {}),\n\t\t\t\t...((opts.workflow && hasApprovedSummary)\n\t\t\t\t\t? {\n\t\t\t\t\t\tsummary: {\n\t\t\t\t\t\t\ttext: opts.approvedSummary!.trim(),\n\t\t\t\t\t\t\tworkflow: opts.workflow,\n\t\t\t\t\t\t\tmodel: opts.summaryMeta?.model ?? null,\n\t\t\t\t\t\t\tdurationMs: opts.summaryMeta?.durationMs ?? 0,\n\t\t\t\t\t\t\ttokenEstimate: opts.summaryMeta?.tokenEstimate ?? 0,\n\t\t\t\t\t\t\tfallbackUsed: opts.summaryMeta?.fallbackUsed === true,\n\t\t\t\t\t\t\tfallbackReason: opts.summaryMeta?.fallbackReason,\n\t\t\t\t\t\t\tphase: opts.summaryMeta?.phase,\n\t\t\t\t\t\t\tedited: opts.summaryMeta?.edited === true,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t};\n\t}\n\n\tfunction filterByQueryIndices(selectedQueryIndices: number[], results: Map<number, QueryResultData>) {\n\t\tconst filteredResults: QueryResultData[] = [];\n\t\tconst filteredUrls: string[] = [];\n\t\tfor (const qi of selectedQueryIndices) {\n\t\t\tconst r = results.get(qi);\n\t\t\tif (r) {\n\t\t\t\tfilteredResults.push(r);\n\t\t\t\tfor (const res of r.results) {\n\t\t\t\t\tif (!filteredUrls.includes(res.url)) filteredUrls.push(res.url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn { results: filteredResults, urls: filteredUrls };\n\t}\n\n\tfunction collectAllResultsAndUrls(resultsByIndex: Map<number, QueryResultData>) {\n\t\tconst results = [...resultsByIndex.values()];\n\t\tconst urls: string[] = [];\n\t\tfor (const result of results) {\n\t\t\tfor (const source of result.results) {\n\t\t\t\tif (!urls.includes(source.url)) urls.push(source.url);\n\t\t\t}\n\t\t}\n\t\treturn { results, urls };\n\t}\n\n\tasync function openCuratorBrowser(callId: string, pc: PendingCurate, ctx: ExtensionContext, searchesComplete = true): Promise<void> {\n\t\tif (pendingCurates.get(callId) !== pc) return;\n\t\tlet handle: CuratorServerHandle | null = null;\n\t\tconst sendCuratorFallbackUpdate = (message: string) => {\n\t\t\tif (!handle) return;\n\t\t\tpc.onUpdate?.({\n\t\t\t\tcontent: [{ type: \"text\", text: `${message}\\nOpen manually: ${handle.url}` }],\n\t\t\t\tdetails: {\n\t\t\t\t\tphase: \"curator-fallback\",\n\t\t\t\t\tprogress: searchesComplete ? 1 : 0.5,\n\t\t\t\t\tcuratorUrl: handle.url,\n\t\t\t\t\ttimeoutSeconds: pc.timeoutSeconds,\n\t\t\t\t\tshortcut: curateKey,\n\t\t\t\t\tbrowserOpenError: pc.browserOpenError,\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\t\ttry {\n\t\t\tpc.phase = \"curating\";\n\n\t\t\tconst searchAbort = new AbortController();\n\t\t\tconst addSearchSignal = pc.signal\n\t\t\t\t? AbortSignal.any([pc.signal, searchAbort.signal])\n\t\t\t\t: searchAbort.signal;\n\n\t\t\tconst sessionToken = randomUUID();\n\t\t\thandle = await startCuratorServer(\n\t\t\t\t{\n\t\t\t\t\tqueries: pc.queryList,\n\t\t\t\t\tsessionToken,\n\t\t\t\t\ttimeout: pc.timeoutSeconds,\n\t\t\t\t\tavailableProviders: pc.availableProviders,\n\t\t\t\t\tdefaultProvider: pc.defaultProvider,\n\t\t\t\t\tsearchProvider: toCuratorProvider(pc.searchProvider) ?? \"auto\",\n\t\t\t\t\tsummaryModels: pc.summaryModels,\n\t\t\t\t\tdefaultSummaryModel: pc.defaultSummaryModel,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tasync onSummarize(selectedQueryIndices, summarizeSignal, model, feedback) {\n\t\t\t\t\t\treturn runWithProxy(pc.proxy, async () => {\n\t\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) throw new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\tpc.onUpdate?.({\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Generating summary draft...\" }],\n\t\t\t\t\t\t\t\tdetails: { phase: \"generating-summary\", progress: 0.9, curatorUrl: pc.curatorUrl, timeoutSeconds: pc.timeoutSeconds, shortcut: curateKey },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst draft = await generateSummaryForSelectedIndices(\n\t\t\t\t\t\t\t\tselectedQueryIndices,\n\t\t\t\t\t\t\t\tpc.searchResults,\n\t\t\t\t\t\t\t\tpc.summaryContext,\n\t\t\t\t\t\t\t\tsummarizeSignal,\n\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\tfeedback,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) throw new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\tpc.onUpdate?.({\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Summary draft ready — waiting for approval...\" }],\n\t\t\t\t\t\t\t\tdetails: { phase: \"waiting-for-approval\", progress: 1, curatorUrl: pc.curatorUrl, timeoutSeconds: pc.timeoutSeconds, shortcut: curateKey },\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn draft;\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tonSubmit(payload) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) return;\n\t\t\t\t\t\tsearchAbort.abort();\n\t\t\t\t\t\tconst filtered = payload.selectedQueryIndices.length > 0\n\t\t\t\t\t\t\t? filterByQueryIndices(payload.selectedQueryIndices, pc.searchResults)\n\t\t\t\t\t\t\t: collectAllResultsAndUrls(pc.searchResults);\n\t\t\t\t\t\tconst filteredInline = pc.allInlineContent.filter(c => filtered.urls.includes(c.url));\n\t\t\t\t\t\tconst base: SearchReturnOptions = {\n\t\t\t\t\t\t\tqueryList: filtered.results.map(r => r.query),\n\t\t\t\t\t\t\tresults: filtered.results,\n\t\t\t\t\t\t\turls: filtered.urls,\n\t\t\t\t\t\t\tincludeContent: pc.includeContent,\n\t\t\t\t\t\t\tinlineContent: filteredInline.length > 0 ? filteredInline : undefined,\n\t\t\t\t\t\t\tcurated: true,\n\t\t\t\t\t\t\tcuratedFrom: pc.searchResults.size,\n\t\t\t\t\t\t\tproxy: pc.proxy,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (!payload.rawResults) {\n\t\t\t\t\t\t\tconst resolvedSummary = resolveSummaryForSubmit(payload, pc.searchResults);\n\t\t\t\t\t\t\tbase.workflow = pc.workflow;\n\t\t\t\t\t\t\tbase.approvedSummary = resolvedSummary.approvedSummary;\n\t\t\t\t\t\t\tbase.summaryMeta = resolvedSummary.summaryMeta;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpc.finish(buildSearchReturn(base));\n\t\t\t\t\t\tcloseCurator(callId);\n\t\t\t\t\t},\n\t\t\t\t\tonCancel(reason) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) return;\n\t\t\t\t\t\tsearchAbort.abort();\n\t\t\t\t\t\tif (reason === \"timeout\") {\n\t\t\t\t\t\t\tconst resolvedSummary = resolveSummaryForSubmit({ selectedQueryIndices: [], summary: undefined, summaryMeta: undefined }, pc.searchResults);\n\t\t\t\t\t\t\tconst all = collectAllResultsAndUrls(pc.searchResults);\n\t\t\t\t\t\t\tconst filteredInline = pc.allInlineContent.filter(c => all.urls.includes(c.url));\n\t\t\t\t\t\t\tpc.finish(buildSearchReturn({\n\t\t\t\t\t\t\t\tqueryList: all.results.map(r => r.query),\n\t\t\t\t\t\t\t\tresults: all.results,\n\t\t\t\t\t\t\t\turls: all.urls,\n\t\t\t\t\t\t\t\tincludeContent: pc.includeContent,\n\t\t\t\t\t\t\t\tinlineContent: filteredInline.length > 0 ? filteredInline : undefined,\n\t\t\t\t\t\t\t\tcurated: true,\n\t\t\t\t\t\t\t\tcuratedFrom: pc.searchResults.size,\n\t\t\t\t\t\t\t\tworkflow: pc.workflow,\n\t\t\t\t\t\t\t\tapprovedSummary: resolvedSummary.approvedSummary,\n\t\t\t\t\t\t\t\tsummaryMeta: resolvedSummary.summaryMeta,\n\t\t\t\t\t\t\t\tproxy: pc.proxy,\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst conn = activeCurators.get(callId)?.getConnectionState();\n\t\t\t\t\t\t\tpc.finish(buildCurationCancelledReturn(reason, {\n\t\t\t\t\t\t\t\tqueries: Array.from(pc.searchResults.values()),\n\t\t\t\t\t\t\t\tqueryCount: pc.queryList.length,\n\t\t\t\t\t\t\t\tbrowserConnected: conn?.browserConnected,\n\t\t\t\t\t\t\t\tlastHeartbeatAgeMs: conn?.lastHeartbeatAgeMs,\n\t\t\t\t\t\t\t\tcuratorUrl: pc.curatorUrl,\n\t\t\t\t\t\t\t\tbrowserOpenError: pc.browserOpenError,\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcloseCurator(callId);\n\t\t\t\t\t},\n\t\t\t\t\tonProviderChange(provider) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) return;\n\t\t\t\t\t\tconst normalized = normalizeProviderInput(provider);\n\t\t\t\t\t\tif (!normalized || normalized === \"auto\" || Array.isArray(normalized)) return;\n\t\t\t\t\t\tpc.defaultProvider = normalized;\n\t\t\t\t\t\tpc.searchProvider = normalized;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tsaveConfig({ provider: normalized });\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\tconsole.error(`Failed to persist default provider: ${message}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tasync onAddSearch(query, provider) {\n\t\t\t\t\t\treturn runWithProxy(pc.proxy, async () => {\n\t\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) throw new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\tconst requestedProvider = resolveCuratorSearchProvider(provider, pc.searchProvider);\n\t\t\t\t\t\t\tconst response = await search(query, {\n\t\t\t\t\t\t\t\tprovider: requestedProvider,\n\t\t\t\t\t\t\t\tnumResults: pc.numResults,\n\t\t\t\t\t\t\t\trecencyFilter: pc.recencyFilter,\n\t\t\t\t\t\t\t\tdomainFilter: pc.domainFilter,\n\t\t\t\t\t\t\t\tincludeContent: pc.includeContent,\n\t\t\t\t\t\t\t\tsignal: addSearchSignal,\n\t\t\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) throw new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\tif (response.inlineContent) pc.allInlineContent.push(...response.inlineContent);\n\t\t\t\t\t\t\treturn toCuratorSearchEntries(response);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tonAddSearchResults(entries) {\n\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) return;\n\t\t\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\t\t\tpc.searchResults.set(entry.queryIndex, indexedCuratorEntryToQueryResult(entry));\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tasync onRewriteQuery(query, rewriteSignal) {\n\t\t\t\t\t\treturn runWithProxy(pc.proxy, async () => {\n\t\t\t\t\t\t\tif (pendingCurates.get(callId) !== pc) throw new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\treturn rewriteSearchQuery(query, pc.summaryContext, rewriteSignal);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tif (pendingCurates.get(callId) !== pc) {\n\t\t\t\thandle.close();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tactiveCurators.set(callId, handle);\n\t\t\tpc.curatorUrl = handle.url;\n\n\t\t\tfor (const [qi, data] of pc.searchResults) {\n\t\t\t\tconst slotIndex = pc.resultSlots.get(qi);\n\t\t\t\tif (data.error) {\n\t\t\t\t\thandle.pushError(qi, data.error, data.provider, { query: data.query, slotIndex });\n\t\t\t\t} else {\n\t\t\t\t\thandle.pushResult(qi, {\n\t\t\t\t\t\tanswer: data.answer,\n\t\t\t\t\t\tresults: data.results.map(r => ({ ...r, domain: extractDomain(r.url) })),\n\t\t\t\t\t\tprovider: data.provider || pc.defaultProvider,\n\t\t\t\t\t\tquery: data.query,\n\t\t\t\t\t\tslotIndex,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (searchesComplete) handle.searchesDone();\n\n\t\t\tpc.onUpdate?.({\n\t\t\t\tcontent: [{ type: \"text\", text: searchesComplete ? \"Waiting for summary approval in browser...\" : \"Searches streaming to browser...\" }],\n\t\t\t\tdetails: {\n\t\t\t\t\tphase: \"curating\",\n\t\t\t\t\tprogress: searchesComplete ? 1 : 0.5,\n\t\t\t\t\tcuratorUrl: handle.url,\n\t\t\t\t\ttimeoutSeconds: pc.timeoutSeconds,\n\t\t\t\t\tshortcut: curateKey,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!shouldAutoOpenCuratorBrowser(loadConfig())) {\n\t\t\t\tsendCuratorFallbackUpdate(\"Search curator is running. Open the curator URL manually.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst open = platform() === \"darwin\" ? await getGlimpseOpen() : null;\n\t\t\tif (open) {\n\t\t\t\ttry {\n\t\t\t\t\tconst win = openInGlimpse(open, handle.url, \"Search Curator\");\n\t\t\t\t\tglimpseWins.set(callId, win);\n\t\t\t\t\twin.on(\"closed\", () => {\n\t\t\t\t\t\tif (glimpseWins.get(callId) === win) {\n\t\t\t\t\t\t\tglimpseWins.delete(callId);\n\t\t\t\t\t\t\tcloseCurator(callId);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\tconsole.error(`Failed to open Glimpse curator window: ${message}`);\n\t\t\t\t\tglimpseWins.delete(callId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait openInBrowser(pi, handle.url);\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tconsole.error(`Failed to open curator UI: ${message}`);\n\t\t\tif (handle && activeCurators.get(callId) === handle && pendingCurates.get(callId) === pc) {\n\t\t\t\tpc.browserOpenError = message;\n\t\t\t\tsendCuratorFallbackUpdate(\"Search curator is running, but the browser did not open automatically.\");\n\t\t\t} else if (pendingCurates.get(callId) === pc || (handle && activeCurators.get(callId) === handle)) {\n\t\t\t\tcloseCurator(callId);\n\t\t\t}\n\t\t}\n\t}\n\n\tpi.registerShortcut(curateKey, {\n\t\tdescription: \"Review search results\",\n\t\thandler: async (ctx) => {\n\t\t\tconst entries = [...pendingCurates.entries()];\n\t\t\tif (entries.length === 0) return;\n\t\t\tconst [callId, pc] = entries[entries.length - 1];\n\n\t\t\tif (pc.phase === \"searching\") {\n\t\t\t\tpc.browserPromise = openCuratorBrowser(callId, pc, ctx, false);\n\t\t\t\tctx.ui.notify(\"Opening curator — remaining searches will stream in\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t});\n\n\tpi.registerShortcut(activityKey, {\n\t\tdescription: \"Toggle web search activity\",\n\t\thandler: async (ctx) => {\n\t\t\twidgetVisible = !widgetVisible;\n\t\t\tif (widgetVisible) {\n\t\t\t\twidgetUnsubscribe = activityMonitor.onUpdate(() => updateWidget(ctx));\n\t\t\t\tupdateWidget(ctx);\n\t\t\t} else {\n\t\t\t\twidgetUnsubscribe?.();\n\t\t\t\twidgetUnsubscribe = null;\n\t\t\t\tctx.ui.setWidget(\"web-activity\", undefined);\n\t\t\t}\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => handleSessionChange(ctx));\n\tpi.on(\"session_tree\", async (_event, ctx) => handleSessionChange(ctx));\n\n\tpi.on(\"session_shutdown\", () => {\n\t\tsessionActive = false;\n\t\tabortPendingFetches();\n\t\tcloseCurator();\n\t\tclearCloneCache();\n\t\tclearResults();\n\t\t// Unsubscribe before clear() to avoid callback with stale ctx\n\t\twidgetUnsubscribe?.();\n\t\twidgetUnsubscribe = null;\n\t\tactivityMonitor.clear();\n\t\twidgetVisible = false;\n\t});\n\n\tif (webSearchEnabled) pi.registerTool({\n\t\tname: toolNames.webSearch,\n\t\tlabel: \"Web Search\",\n\t\tdescription:\n\t\t\t`Search the web using OpenAI, Brave, Parallel, Parallel MCP, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Kagi, Bocha, Ollama, SearXNG, DuckDuckGo, Exa, Perplexity, Gemini, Kimi, AnySearch, XCrawl, Valyu, xAI, Bright Data, SerpBase, or Serper. Pass a provider array to search only those providers simultaneously, or use provider \"all\" to search every eligible provider except Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Bright Data, SerpBase, and Serper. Returns an AI-synthesized answer with source citations. OpenAI search uses a Codex subscription or OpenAI API key; Kimi search uses a Kimi Code Plan authenticated through /login kimi-coding; xAI search uses a SuperGrok/X Premium subscription or xAI API key. Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Bright Data, SerpBase, and Serper are available only when explicitly selected. For comprehensive research, prefer queries (plural) with 2-4 varied angles over a single query — each query gets its own synthesized answer, so varying phrasing and scope gives much broader coverage. When includeContent is true, full page content is fetched in the background. Searches auto-open the interactive browser curator and stream results live; set workflow to \"none\" to skip curation or \"auto-summary\" for a model-generated summary without the browser curator. The configured provider is used when provider is omitted or set to auto; omit provider unless explicitly overriding it. Without a configured provider, SearXNG is preferred first for local/private search. When the active Pi model is openai-codex, Codex-backed OpenAI search is preferred next. Otherwise Exa is preferred before OpenAI, then Brave, Parallel, TinyFish, Search1API, Searchinfinity, Querit, Tavily, Firecrawl, Jina, SERPdive, Kagi, Bocha, Ollama, Perplexity, Gemini API, or Gemini Web.`,\n\t\tpromptSnippet:\n\t\t\t\"Use for web research questions. Prefer {queries:[...]} with 2-4 varied angles over a single query for broader coverage. Omit provider unless explicitly overriding the configured default.\",\n\t\tparameters: Type.Object({\n\t\t\tquery: Type.Optional(Type.String({ description: \"Single search query. For research tasks, prefer 'queries' with multiple varied angles instead.\" })),\n\t\t\tqueries: Type.Optional(Type.Array(Type.String(), { description: \"Multiple queries searched in sequence, each returning its own synthesized answer. Prefer this for research — vary phrasing, scope, and angle across 2-4 queries to maximize coverage. Good: ['React vs Vue performance benchmarks 2026', 'React vs Vue developer experience comparison', 'React ecosystem size vs Vue ecosystem']. Bad: ['React vs Vue', 'React vs Vue comparison', 'React vs Vue review'] (too similar, redundant results).\" })),\n\t\t\tnumResults: Type.Optional(Type.Integer({ minimum: 1, maximum: 20, description: \"Results per query (default: 5, max: 20)\" })),\n\t\t\tincludeContent: Type.Optional(Type.Boolean({ description: \"Fetch full page content (async)\" })),\n\t\t\trecencyFilter: Type.Optional(\n\t\t\t\tStringEnum([\"day\", \"week\", \"month\", \"year\"], { description: \"Filter by recency\" }),\n\t\t\t),\n\t\t\tdomainFilter: Type.Optional(Type.Array(Type.String(), { description: \"Limit to domains (prefix with - to exclude)\" })),\n\t\t\tprovider: Type.Optional(searchProviderSchema(\"Search provider or non-empty list of providers to search simultaneously; use all to search every eligible provider except Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Bright Data, SerpBase, and Serper, omit this field to use the configured provider, or use auto when none is configured\")),\n\t\t\tworkflow: Type.Optional(\n\t\t\t\tStringEnum([\"none\", \"summary-review\", \"auto-summary\"], {\n\t\t\t\t\tdescription: \"Search workflow mode: none = no curator, summary-review = open curator with auto summary draft (default), auto-summary = generate summary without opening curator\",\n\t\t\t\t}),\n\t\t\t),\n\t\t\tproxy: Type.Optional(Type.String({\n\t\t\t\tdescription: \"http(s) proxy URL (e.g. http://host:port) used for every outbound request in this call (search APIs and content fetches). Node fetch ignores HTTP(S)_PROXY env vars, so set this (or `proxy` in web-search.json) when direct access is blocked; empty string forces direct access.\",\n\t\t\t})),\n\t\t}),\n\n\t\tasync execute(callId, params, signal, onUpdate, ctx) {\n\t\t\treturn runWithProxy(typeof params.proxy === \"string\" ? params.proxy : undefined, async () => {\n\t\t\t\tconst rawQueryList: unknown[] = Array.isArray(params.queries)\n\t\t\t\t\t? params.queries\n\t\t\t\t\t: (params.query !== undefined ? expandQueryString(params.query) : []);\n\t\t\t\tconst queryList = normalizeQueryList(rawQueryList);\n\t\t\t\tconst configWorkflow = loadConfigForExtensionInit().workflow;\n\t\t\t\tconst workflow = resolveWorkflow(params.workflow ?? configWorkflow, ctx?.hasUI !== false);\n\t\t\t\tconst shouldCurate = workflow === \"summary-review\";\n\t\t\t\tconst recencyFilter = normalizeRecencyFilter(params.recencyFilter);\n\n\t\t\t\tif (queryList.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: No query provided. Use 'query' or 'queries' parameter.\" }],\n\t\t\t\t\t\tdetails: { error: \"No query provided\" },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (shouldCurate && !ctx) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: Curation requires an active extension context.\" }],\n\t\t\t\t\t\tdetails: { error: \"Missing extension context\" },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (shouldCurate) {\n\t\t\t\tcloseCurator(callId);\n\n\t\t\t\tlet resolvePromise: (value: AgentToolResult<Record<string, unknown>>) => void = () => {};\n\t\t\t\tconst promise = new Promise<AgentToolResult<Record<string, unknown>>>((resolve) => {\n\t\t\t\t\tresolvePromise = resolve;\n\t\t\t\t});\n\t\t\t\tconst includeContent = params.includeContent ?? false;\n\t\t\t\tconst searchResults = new Map<number, QueryResultData>();\n\t\t\t\tconst resultSlots = new Map<number, number>();\n\t\t\t\tconst allInlineContent: ExtractedContent[] = [];\n\t\t\t\tlet nextResultIndex = queryList.length;\n\t\t\t\tconst searchAbort = new AbortController();\n\t\t\t\tconst searchSignal = signal\n\t\t\t\t\t? AbortSignal.any([signal, searchAbort.signal])\n\t\t\t\t\t: searchAbort.signal;\n\t\t\t\tlet cancelled = false;\n\n\t\t\t\tconst requestedProvider = resolveRequestedProvider(params.provider);\n\t\t\t\tconst bootstrap = await loadCuratorBootstrap(requestedProvider, ctx, {\n\t\t\t\t\tnumResults: params.numResults,\n\t\t\t\t\trecencyFilter,\n\t\t\t\t});\n\t\t\t\tconst availableProviders = bootstrap.availableProviders;\n\t\t\t\tconst defaultProvider = bootstrap.defaultProvider;\n\t\t\t\tconst searchProvider = requestedProvider;\n\t\t\t\tconst curatorTimeoutSeconds = bootstrap.timeoutSeconds;\n\t\t\t\tconst curatorWorkflow: CuratorWorkflow = \"summary-review\";\n\n\t\t\t\tconst summaryContext: SummaryGenerationContext = {\n\t\t\t\t\tmodel: ctx.model,\n\t\t\t\t\tmodelRegistry: ctx.modelRegistry,\n\t\t\t\t\tcwd: ctx.cwd,\n\t\t\t\t\tisProjectTrusted: () => ctx.isProjectTrusted(),\n\t\t\t\t};\n\t\t\t\tconst summaryModelChoices = await loadSummaryModelChoices(summaryContext);\n\n\t\t\t\tconst pc: PendingCurate = {\n\t\t\t\t\tphase: \"searching\",\n\t\t\t\t\tworkflow: curatorWorkflow,\n\t\t\t\t\tsummaryContext,\n\t\t\t\t\tsearchResults,\n\t\t\t\t\tresultSlots,\n\t\t\t\t\tallInlineContent,\n\t\t\t\t\tqueryList,\n\t\t\t\t\tincludeContent,\n\t\t\t\t\tnumResults: params.numResults,\n\t\t\t\t\trecencyFilter,\n\t\t\t\t\tdomainFilter: params.domainFilter,\n\t\t\t\t\tavailableProviders,\n\t\t\t\t\tdefaultProvider,\n\t\t\t\t\tsearchProvider,\n\t\t\t\t\tsummaryModels: summaryModelChoices.summaryModels,\n\t\t\t\t\tdefaultSummaryModel: summaryModelChoices.defaultSummaryModel,\n\t\t\t\t\ttimeoutSeconds: curatorTimeoutSeconds,\n\t\t\t\t\tproxy: typeof params.proxy === \"string\" ? params.proxy : undefined,\n\t\t\t\t\tonUpdate: onUpdate as PendingCurate[\"onUpdate\"],\n\t\t\t\t\tsignal,\n\t\t\t\t\tabortSearches: () => {\n\t\t\t\t\t\tif (!searchAbort.signal.aborted) searchAbort.abort();\n\t\t\t\t\t},\n\t\t\t\t\tfinish: () => {},\n\t\t\t\t\tcancel: () => {},\n\t\t\t\t};\n\n\t\t\t\tconst finish = (value: AgentToolResult<Record<string, unknown>>) => {\n\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\tcancelled = true;\n\t\t\t\t\tpc.abortSearches();\n\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tpendingCurates.delete(callId);\n\t\t\t\t\tresolvePromise(value);\n\t\t\t\t};\n\n\t\t\t\tconst cancel = (reason: \"user\" | \"stale\" = \"stale\") => {\n\t\t\t\t\tif (cancelled) return;\n\t\t\t\t\tconst conn = activeCurators.get(callId)?.getConnectionState();\n\t\t\t\t\tfinish(buildCurationCancelledReturn(reason, {\n\t\t\t\t\t\tqueries: Array.from(searchResults.values()),\n\t\t\t\t\t\tqueryCount: queryList.length,\n\t\t\t\t\t\tbrowserConnected: conn?.browserConnected,\n\t\t\t\t\t\tlastHeartbeatAgeMs: conn?.lastHeartbeatAgeMs,\n\t\t\t\t\t\tcuratorUrl: pc.curatorUrl,\n\t\t\t\t\t\tbrowserOpenError: pc.browserOpenError,\n\t\t\t\t\t}));\n\t\t\t\t};\n\n\t\t\t\tpc.finish = finish;\n\t\t\t\tpc.cancel = cancel;\n\n\t\t\t\tconst onAbort = () => closeCurator(callId);\n\t\t\t\tpendingCurates.set(callId, pc);\n\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\tpc.browserPromise = openCuratorBrowser(callId, pc, ctx, false);\n\n\t\t\t\tfor (let qi = 0; qi < queryList.length; qi++) {\n\t\t\t\t\tif (signal?.aborted || cancelled || searchAbort.signal.aborted) break;\n\t\t\t\t\tonUpdate?.({\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Searching ${qi + 1}/${queryList.length}: \"${queryList[qi]}\"...` }],\n\t\t\t\t\t\tdetails: { phase: \"searching\", progress: qi / queryList.length, currentQuery: queryList[qi] },\n\t\t\t\t\t});\n\t\t\t\t\tconst requestedProvider = pc.searchProvider;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst response = await search(queryList[qi], {\n\t\t\t\t\t\t\tprovider: requestedProvider,\n\t\t\t\t\t\t\tnumResults: params.numResults,\n\t\t\t\t\t\t\trecencyFilter,\n\t\t\t\t\t\t\tdomainFilter: params.domainFilter,\n\t\t\t\t\t\t\tincludeContent: params.includeContent,\n\t\t\t\t\t\t\tsignal: searchSignal,\n\t\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (signal?.aborted || cancelled || searchAbort.signal.aborted) break;\n\t\t\t\t\t\tif (response.inlineContent) allInlineContent.push(...response.inlineContent);\n\t\t\t\t\t\tconst entries = toCuratorSearchEntries(response);\n\t\t\t\t\t\tconst curator = activeCurators.get(callId);\n\t\t\t\t\t\tfor (let entryIndex = 0; entryIndex < entries.length; entryIndex++) {\n\t\t\t\t\t\t\tconst entry = entries[entryIndex];\n\t\t\t\t\t\t\tconst resultIndex = entryIndex === 0 ? qi : nextResultIndex++;\n\t\t\t\t\t\t\tconst indexedEntry: IndexedCuratorSearchEntry = {\n\t\t\t\t\t\t\t\t...entry,\n\t\t\t\t\t\t\t\tqueryIndex: resultIndex,\n\t\t\t\t\t\t\t\tquery: queryList[qi],\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsearchResults.set(resultIndex, indexedCuratorEntryToQueryResult(indexedEntry));\n\t\t\t\t\t\t\tresultSlots.set(resultIndex, qi);\n\t\t\t\t\t\t\tif (curator) {\n\t\t\t\t\t\t\t\tif (entry.error) {\n\t\t\t\t\t\t\t\t\tcurator.pushError(resultIndex, entry.error, entry.provider, { query: queryList[qi], slotIndex: qi });\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcurator.pushResult(resultIndex, { ...entry, query: queryList[qi], slotIndex: qi });\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tif (signal?.aborted || cancelled || searchAbort.signal.aborted) break;\n\t\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\tconst failedProvider = toCuratorProvider(requestedProvider);\n\t\t\t\t\t\tsearchResults.set(qi, { query: queryList[qi], answer: \"\", results: [], error: message, provider: failedProvider });\n\t\t\t\t\t\tresultSlots.set(qi, qi);\n\t\t\t\t\t\tconst curator = activeCurators.get(callId);\n\t\t\t\t\t\tif (curator) {\n\t\t\t\t\t\t\tcurator.pushError(qi, message, failedProvider, { query: queryList[qi], slotIndex: qi });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (signal?.aborted || cancelled || searchAbort.signal.aborted) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treturn promise;\n\t\t\t\t}\n\n\t\t\t\tawait pc.browserPromise;\n\t\t\t\tconst curator = activeCurators.get(callId);\n\t\t\t\tif (curator && !cancelled) {\n\t\t\t\t\tcurator.searchesDone();\n\t\t\t\t\tif (pc.browserOpenError) {\n\t\t\t\t\t\tpc.onUpdate?.({\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `All searches complete. Open the curator manually: ${pc.curatorUrl}` }],\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\tphase: \"curator-fallback\",\n\t\t\t\t\t\t\t\tprogress: 1,\n\t\t\t\t\t\t\t\tcuratorUrl: pc.curatorUrl,\n\t\t\t\t\t\t\t\ttimeoutSeconds: pc.timeoutSeconds,\n\t\t\t\t\t\t\t\tshortcut: curateKey,\n\t\t\t\t\t\t\t\tbrowserOpenError: pc.browserOpenError,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpc.onUpdate?.({\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"All searches complete — waiting for summary approval in browser...\" }],\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\tphase: \"curating\",\n\t\t\t\t\t\t\t\tprogress: 1,\n\t\t\t\t\t\t\t\tcuratorUrl: pc.curatorUrl,\n\t\t\t\t\t\t\t\ttimeoutSeconds: pc.timeoutSeconds,\n\t\t\t\t\t\t\t\tshortcut: curateKey,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn promise;\n\t\t\t}\n\n\t\t\tconst searchResults: QueryResultData[] = [];\n\t\t\tconst allUrls: string[] = [];\n\t\t\tconst allInlineContent: ExtractedContent[] = [];\n\t\t\tconst resolvedProvider = resolveRequestedProvider(params.provider);\n\n\t\t\tfor (let i = 0; i < queryList.length; i++) {\n\t\t\t\tconst query = queryList[i];\n\n\t\t\t\tonUpdate?.({\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Searching ${i + 1}/${queryList.length}: \"${query}\"...` }],\n\t\t\t\t\tdetails: { phase: \"search\", progress: i / queryList.length, currentQuery: query },\n\t\t\t\t});\n\n\t\t\t\ttry {\n\t\t\t\t\tconst { answer, results, inlineContent, provider } = await search(query, {\n\t\t\t\t\t\tprovider: resolvedProvider,\n\t\t\t\t\t\tnumResults: params.numResults,\n\t\t\t\t\t\trecencyFilter,\n\t\t\t\t\t\tdomainFilter: params.domainFilter,\n\t\t\t\t\t\tincludeContent: params.includeContent,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t});\n\n\t\t\t\t\tsearchResults.push({ query, answer, results, error: null, provider });\n\t\t\t\t\tfor (const r of results) {\n\t\t\t\t\t\tif (!allUrls.includes(r.url)) {\n\t\t\t\t\t\t\tallUrls.push(r.url);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (inlineContent) allInlineContent.push(...inlineContent);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tif (signal?.aborted || isAbortError(err)) throw err;\n\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\tconst requestedProvider = toCuratorProvider(resolvedProvider);\n\t\t\t\t\tsearchResults.push({ query, answer: \"\", results: [], error: message, provider: requestedProvider });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet approvedSummary: string | undefined;\n\t\t\tlet summaryMeta: SummaryMeta | undefined;\n\t\t\tif (workflow === \"auto-summary\") {\n\t\t\t\tif (!ctx) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: Auto-summary requires an active extension context.\" }],\n\t\t\t\t\t\tdetails: { error: \"Missing extension context\" },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tonUpdate?.({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Generating summary...\" }],\n\t\t\t\t\tdetails: { phase: \"generating-summary\", progress: 1 },\n\t\t\t\t});\n\t\t\t\tconst summaryContext: SummaryGenerationContext = {\n\t\t\t\t\tmodel: ctx.model,\n\t\t\t\t\tmodelRegistry: ctx.modelRegistry,\n\t\t\t\t\tcwd: ctx.cwd,\n\t\t\t\t\tisProjectTrusted: () => ctx.isProjectTrusted(),\n\t\t\t\t};\n\t\t\t\tconst summaryModelChoices = await loadSummaryModelChoices(summaryContext);\n\t\t\t\tconst generated = await generateSummaryDraft(\n\t\t\t\t\tsearchResults,\n\t\t\t\t\tsummaryContext,\n\t\t\t\t\tsignal,\n\t\t\t\t\tsummaryModelChoices.defaultSummaryModel ?? undefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tgetSummaryGenerationDeadlineMs(),\n\t\t\t\t);\n\t\t\t\tapprovedSummary = generated.summary;\n\t\t\t\tsummaryMeta = generated.meta;\n\t\t\t}\n\n\t\t\treturn buildSearchReturn({\n\t\t\t\tqueryList,\n\t\t\t\tresults: searchResults,\n\t\t\t\turls: allUrls,\n\t\t\t\tincludeContent: params.includeContent ?? false,\n\t\t\t\tinlineContent: allInlineContent.length > 0 ? allInlineContent : undefined,\n\t\t\t\tworkflow: workflow === \"auto-summary\" ? \"auto-summary\" : undefined,\n\t\t\t\tapprovedSummary,\n\t\t\t\tsummaryMeta,\n\t\t\t\tproxy: typeof params.proxy === \"string\" ? params.proxy : undefined,\n\t\t\t});\n\t\t\t});\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\tconst input = args as { query?: unknown; queries?: unknown };\n\t\t\tconst rawQueryList: unknown[] = Array.isArray(input.queries)\n\t\t\t\t? input.queries\n\t\t\t\t: (input.query !== undefined ? expandQueryString(input.query) : []);\n\t\t\tconst queryList = normalizeQueryList(rawQueryList);\n\t\t\tif (queryList.length === 0) {\n\t\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"search \")) + theme.fg(\"error\", \"(no query)\"), 0, 0);\n\t\t\t}\n\t\t\tif (queryList.length === 1) {\n\t\t\t\tconst q = queryList[0];\n\t\t\t\tconst display = q.length > 60 ? q.slice(0, 57) + \"...\" : q;\n\t\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"search \")) + theme.fg(\"accent\", `\"${display}\"`), 0, 0);\n\t\t\t}\n\t\t\tconst lines = [theme.fg(\"toolTitle\", theme.bold(\"search \")) + theme.fg(\"accent\", `${queryList.length} queries`)];\n\t\t\tfor (const q of queryList.slice(0, 5)) {\n\t\t\t\tconst display = q.length > 50 ? q.slice(0, 47) + \"...\" : q;\n\t\t\t\tlines.push(theme.fg(\"muted\", ` \"${display}\"`));\n\t\t\t}\n\t\t\tif (queryList.length > 5) {\n\t\t\t\tlines.push(theme.fg(\"muted\", ` ... and ${queryList.length - 5} more`));\n\t\t\t}\n\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t},\n\n\t\trenderResult(result, { expanded, isPartial }, theme) {\n\t\t\ttype QueryDetail = {\n\t\t\t\tquery: string;\n\t\t\t\tprovider: string | null;\n\t\t\t\tanswer: string | null;\n\t\t\t\tsources: Array<{ title: string; url: string }>;\n\t\t\t\terror: string | null;\n\t\t\t};\n\t\t\tconst details = result.details as {\n\t\t\t\tqueryCount?: number;\n\t\t\t\tsuccessfulQueries?: number;\n\t\t\t\ttotalResults?: number;\n\t\t\t\terror?: string;\n\t\t\t\tfetchId?: string;\n\t\t\t\tfetchUrls?: string[];\n\t\t\t\tphase?: string;\n\t\t\t\tprogress?: number;\n\t\t\t\tcurrentQuery?: string;\n\t\t\t\tcurated?: boolean;\n\t\t\t\tcuratedFrom?: number;\n\t\t\t\tcuratedQueries?: QueryDetail[];\n\t\t\t\tcancelled?: boolean;\n\t\t\t\tcancelReason?: string;\n\t\t\t\tbrowserConnected?: boolean;\n\t\t\t\tlastHeartbeatAgeMs?: number | null;\n\t\t\t\tcancelledQueries?: import(\"./render-search-error.ts\").CancelledQueryDetail[];\n\t\t\t\tcuratorUrl?: string;\n\t\t\t\tbrowserOpenError?: string;\n\t\t\t\ttimeoutSeconds?: number;\n\t\t\t\tshortcut?: string;\n\t\t\t\tsummary?: {\n\t\t\t\t\ttext: string;\n\t\t\t\t\tworkflow: SummaryWorkflow;\n\t\t\t\t\tmodel: string | null;\n\t\t\t\t\tdurationMs: number;\n\t\t\t\t\ttokenEstimate: number;\n\t\t\t\t\tfallbackUsed: boolean;\n\t\t\t\t\tfallbackReason?: string;\n\t\t\t\t\tphase?: \"summary-model\" | \"deterministic-fallback\";\n\t\t\t\t\tedited?: boolean;\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tif (isPartial) {\n\t\t\t\tif (details?.phase === \"curator-fallback\") {\n\t\t\t\t\tconst lines = [theme.fg(\"warning\", \"Open the search curator manually:\")];\n\t\t\t\t\tif (details?.curatorUrl) lines.push(theme.fg(\"muted\", ` ${details.curatorUrl}`));\n\t\t\t\t\tif (details?.browserOpenError) lines.push(theme.fg(\"dim\", ` auto-open failed: ${details.browserOpenError}`));\n\t\t\t\t\tconst timeout = typeof details?.timeoutSeconds === \"number\" ? details.timeoutSeconds : undefined;\n\t\t\t\t\tconst shortcut = typeof details?.shortcut === \"string\" ? details.shortcut : curateKey;\n\t\t\t\t\tlines.push(theme.fg(\"dim\", timeout ? ` auto-submits after ${timeout}s idle; ${shortcut} reopens` : ` ${shortcut} reopens`));\n\t\t\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t\t\t}\n\t\t\t\tif (details?.phase === \"curating\" || details?.phase === \"waiting-for-approval\" || details?.phase === \"generating-summary\") {\n\t\t\t\t\tconst phaseText = details?.phase === \"generating-summary\"\n\t\t\t\t\t\t? \"generating summary draft...\"\n\t\t\t\t\t\t: details?.phase === \"waiting-for-approval\"\n\t\t\t\t\t\t\t? \"summary draft ready; approve in browser...\"\n\t\t\t\t\t\t\t: \"waiting for summary approval in browser...\";\n\t\t\t\t\tconst lines = [theme.fg(\"accent\", phaseText)];\n\t\t\t\t\tif (details?.curatorUrl) {\n\t\t\t\t\t\tlines.push(theme.fg(\"muted\", ` ${details.curatorUrl}`));\n\t\t\t\t\t}\n\t\t\t\t\tconst timeout = typeof details?.timeoutSeconds === \"number\" ? details.timeoutSeconds : undefined;\n\t\t\t\t\tconst shortcut = typeof details?.shortcut === \"string\" ? details.shortcut : curateKey;\n\t\t\t\t\tif (timeout) {\n\t\t\t\t\t\tlines.push(theme.fg(\"dim\", ` auto-submits after ${timeout}s idle; ${shortcut} reopens`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlines.push(theme.fg(\"dim\", ` ${shortcut} reopens`));\n\t\t\t\t\t}\n\t\t\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t\t\t}\n\t\t\t\tif (details?.phase === \"searching\") {\n\t\t\t\t\tconst progress = details?.progress ?? 0;\n\t\t\t\t\tconst bar = \"\\u2588\".repeat(Math.floor(progress * 10)) + \"\\u2591\".repeat(10 - Math.floor(progress * 10));\n\t\t\t\t\tconst query = details?.currentQuery || \"\";\n\t\t\t\t\tconst display = query.length > 40 ? query.slice(0, 37) + \"...\" : query;\n\t\t\t\t\treturn new Text(theme.fg(\"accent\", `[${bar}] ${display}`), 0, 0);\n\t\t\t\t}\n\t\t\t\tconst progress = details?.progress ?? 0;\n\t\t\t\tconst bar = \"\\u2588\".repeat(Math.floor(progress * 10)) + \"\\u2591\".repeat(10 - Math.floor(progress * 10));\n\t\t\t\treturn new Text(theme.fg(\"accent\", `[${bar}] ${details?.phase || \"searching\"}`), 0, 0);\n\t\t\t}\n\n\t\t\tif (details?.error) {\n\t\t\t\t// Expandable Ctrl+O diagnostics: which queries completed, per-query errors,\n\t\t\t\t// browser connection state, cancel reason. See render-search-error.ts.\n\t\t\t\tconst plan = buildSearchErrorPlan(details as SearchErrorDetails);\n\t\t\t\tif (plan) return renderSearchErrorPlan(plan, expanded, theme);\n\t\t\t\treturn new Text(theme.fg(\"error\", `Error: ${details.error}`), 0, 0);\n\t\t\t}\n\n\t\t\tlet statusLine: string;\n\t\t\tconst queryInfo = details?.queryCount === 1 ? \"\" : `${details?.successfulQueries}/${details?.queryCount} queries, `;\n\t\t\tstatusLine = theme.fg(\"success\", `${queryInfo}${details?.totalResults ?? 0} sources`);\n\t\t\tif (details?.curated && details?.curatedFrom) {\n\t\t\t\tstatusLine += theme.fg(\"muted\", ` (${details.queryCount}/${details.curatedFrom} queries curated)`);\n\t\t\t}\n\t\t\tif (details?.fetchId && details?.fetchUrls) {\n\t\t\t\tstatusLine += theme.fg(\"muted\", ` (fetching ${details.fetchUrls.length} URLs)`);\n\t\t\t} else if (details?.fetchId) {\n\t\t\t\tstatusLine += theme.fg(\"muted\", \" (content ready)\");\n\t\t\t}\n\n\t\t\t// Build expanded lines first so collapsed view can reference total count\n\t\t\tconst lines = [statusLine];\n\t\t\tif (details?.summary?.text) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\tlines.push(theme.fg(\"accent\", `── Summary (${details.summary.workflow}) ` + \"─\".repeat(32)));\n\t\t\t\tlines.push(\"\");\n\t\t\t\tfor (const line of details.summary.text.split(\"\\n\")) {\n\t\t\t\t\tlines.push(` ${line}`);\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t\tconst metaParts = [\n\t\t\t\t\tdetails.summary.model ? `model=${details.summary.model}` : \"model=deterministic\",\n\t\t\t\t\t`duration=${details.summary.durationMs}ms`,\n\t\t\t\t\t`tokens~${details.summary.tokenEstimate}`,\n\t\t\t\t\tdetails.summary.fallbackUsed ? \"fallback=true\" : \"fallback=false\",\n\t\t\t\t\tdetails.summary.phase ? `phase=${details.summary.phase}` : \"\",\n\t\t\t\t\tdetails.summary.edited ? \"edited=true\" : \"edited=false\",\n\t\t\t\t];\n\t\t\t\tif (details.summary.fallbackReason) {\n\t\t\t\t\tmetaParts.push(`reason=${details.summary.fallbackReason}`);\n\t\t\t\t}\n\t\t\t\tlines.push(theme.fg(\"dim\", \" \" + metaParts.filter(Boolean).join(\" · \")));\n\t\t\t}\n\n\t\t\tconst queryDetails = details?.curatedQueries;\n\t\t\tif (queryDetails?.length) {\n\t\t\t\tconst kept = queryDetails.length;\n\t\t\t\tconst from = details?.curatedFrom ?? kept;\n\t\t\t\tlines.push(\"\");\n\t\t\t\tlines.push(theme.fg(\"accent\", `\\u2500\\u2500 Curated Results (${kept} of ${from} queries kept) ` + \"\\u2500\".repeat(24)));\n\n\t\t\t\tfor (const cq of queryDetails) {\n\t\t\t\t\tlines.push(\"\");\n\t\t\t\t\tconst dq = cq.query.length > 65 ? cq.query.slice(0, 62) + \"...\" : cq.query;\n\t\t\t\t\tconst providerLabel = cq.provider ? ` (${cq.provider})` : \"\";\n\t\t\t\t\tlines.push(theme.fg(\"accent\", ` \"${dq}\"${providerLabel}`));\n\n\t\t\t\t\tif (cq.error) {\n\t\t\t\t\t\tlines.push(theme.fg(\"error\", ` ${cq.error}`));\n\t\t\t\t\t} else if (cq.answer) {\n\t\t\t\t\t\tlines.push(\"\");\n\t\t\t\t\t\tfor (const line of cq.answer.split(\"\\n\")) {\n\t\t\t\t\t\t\tlines.push(` ${line}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (cq.sources.length > 0) {\n\t\t\t\t\t\tlines.push(\"\");\n\t\t\t\t\t\tfor (const s of cq.sources) {\n\t\t\t\t\t\t\tconst domain = s.url.replace(/^https?:\\/\\//, \"\").replace(/\\/.*$/, \"\");\n\t\t\t\t\t\t\tconst title = s.title.length > 50 ? s.title.slice(0, 47) + \"...\" : s.title;\n\t\t\t\t\t\t\tlines.push(theme.fg(\"muted\", ` \\u25b8 ${title}`) + theme.fg(\"dim\", ` \\u00b7 ${domain}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t} else {\n\t\t\t\tconst textContent = result.content.find((c) => c.type === \"text\")?.text || \"\";\n\t\t\t\tconst preview = textContent.length > 500 ? textContent.slice(0, 500) + \"...\" : textContent;\n\t\t\t\tfor (const line of preview.split(\"\\n\")) {\n\t\t\t\t\tlines.push(theme.fg(\"dim\", line));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (details?.fetchUrls && details.fetchUrls.length > 0) {\n\t\t\t\tif (details.curated) {\n\t\t\t\t\tlines.push(theme.fg(\"muted\", `Fetching ${details.fetchUrls.length} URLs in background`));\n\t\t\t\t} else {\n\t\t\t\t\tlines.push(theme.fg(\"muted\", \"Fetching:\"));\n\t\t\t\t\tfor (const u of details.fetchUrls.slice(0, 5)) {\n\t\t\t\t\t\tconst display = u.length > 60 ? u.slice(0, 57) + \"...\" : u;\n\t\t\t\t\t\tlines.push(theme.fg(\"dim\", \" \" + display));\n\t\t\t\t\t}\n\t\t\t\t\tif (details.fetchUrls.length > 5) {\n\t\t\t\t\t\tlines.push(theme.fg(\"dim\", ` ... and ${details.fetchUrls.length - 5} more`));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst totalLines = lines.length;\n\n\t\t\tif (!expanded) {\n\t\t\t\tconst box = new Box(1, 0);\n\t\t\t\tbox.addChild(new Text(statusLine, 0, 0));\n\n\t\t\t\tlet collapsedLines = 1; // statusLine\n\t\t\t\tconst summaryPreview = details?.summary?.text?.trim() || \"\";\n\t\t\t\tif (summaryPreview) {\n\t\t\t\t\tconst preview = summaryPreview.length > 120 ? summaryPreview.slice(0, 117) + \"...\" : summaryPreview;\n\t\t\t\t\tbox.addChild(new Text(theme.fg(\"dim\", preview), 0, 0));\n\t\t\t\t\tcollapsedLines++;\n\t\t\t\t} else if (details?.curatedQueries?.length) {\n\t\t\t\t\tfor (const cq of details.curatedQueries.slice(0, 3)) {\n\t\t\t\t\t\tconst dq = cq.query.length > 55 ? cq.query.slice(0, 52) + \"...\" : cq.query;\n\t\t\t\t\t\tconst srcCount = cq.sources?.length ?? 0;\n\t\t\t\t\t\tconst suffix = cq.error ? theme.fg(\"error\", \" (error)\") : theme.fg(\"dim\", ` · ${srcCount} sources`);\n\t\t\t\t\t\tbox.addChild(new Text(theme.fg(\"accent\", ` \"${dq}\"`) + suffix, 0, 0));\n\t\t\t\t\t\tcollapsedLines++;\n\t\t\t\t\t}\n\t\t\t\t\tif (details.curatedQueries.length > 3) {\n\t\t\t\t\t\tbox.addChild(new Text(theme.fg(\"dim\", ` ... and ${details.curatedQueries.length - 3} more`), 0, 0));\n\t\t\t\t\t\tcollapsedLines++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst textContent = result.content.find((c) => c.type === \"text\")?.text || \"\";\n\t\t\t\t\tconst firstContentLine = textContent.split(\"\\n\").find(l => {\n\t\t\t\t\t\tconst t = l.trim();\n\t\t\t\t\t\treturn t && !t.startsWith(\"[\") && !t.startsWith(\"#\") && !t.startsWith(\"---\");\n\t\t\t\t\t});\n\t\t\t\t\tconst fallbackLine = (firstContentLine?.trim() || \"\").replace(/\\*\\*/g, \"\");\n\t\t\t\t\tif (fallbackLine) {\n\t\t\t\t\t\tconst preview = fallbackLine.length > 120 ? fallbackLine.slice(0, 117) + \"...\" : fallbackLine;\n\t\t\t\t\t\tbox.addChild(new Text(theme.fg(\"dim\", preview), 0, 0));\n\t\t\t\t\t\tcollapsedLines++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst moreLines = Math.max(0, totalLines - collapsedLines);\n\t\t\t\tif (moreLines > 0) {\n\t\t\t\t\tbox.addChild(new Text(theme.fg(\"muted\", `\\n... (${moreLines} more lines, ${totalLines} total, ctrl+o to expand)`), 0, 0));\n\t\t\t\t}\n\t\t\t\treturn box;\n\t\t\t}\n\n\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t},\n\t});\n\n\tif (sourceCheckEnabled) pi.registerTool({\n\t\tname: toolNames.sourceCheck,\n\t\tlabel: \"Source Check\",\n\t\tdescription: \"Check a claim against web sources and return a bounded machine-readable research artifact with exact passage citations.\",\n\t\tpromptSnippet: \"Verify a claim with structured source evidence and passage-level citations.\",\n\t\tparameters: Type.Object({\n\t\t\tclaim: Type.String({ description: \"The assertion to check against web sources.\" }),\n\t\t\tqueries: Type.Optional(Type.Array(Type.String(), { description: \"Search queries (default: the claim).\" })),\n\t\t\tnumResults: Type.Optional(Type.Integer({ minimum: 1, maximum: 20, description: \"Results per query (default: 5, max: 20).\" })),\n\t\t\tfetchContent: Type.Optional(Type.Boolean({ description: \"Fetch up to 5 result pages for exact passage extraction.\" })),\n\t\t\trecencyFilter: Type.Optional(StringEnum([\"day\", \"week\", \"month\", \"year\"], { description: \"Filter by recency.\" })),\n\t\t\tdomainFilter: Type.Optional(Type.Array(Type.String(), { description: \"Limit to domains; prefix with - to exclude.\" })),\n\t\t\tprovider: Type.Optional(searchProviderSchema(\"Search provider or non-empty list of providers to search simultaneously; all searches every eligible provider except Parallel MCP, DuckDuckGo, Kimi, AnySearch, XCrawl, Valyu, xAI, Bright Data, SerpBase, and Serper\")),\n\t\t\tproxy: Type.Optional(Type.String({\n\t\t\t\tdescription: \"http(s) proxy URL (e.g. http://host:port) used for every outbound request in this call (search APIs and result-page fetches). Empty string forces direct access.\",\n\t\t\t})),\n\t\t}),\n\t\tasync execute(_callId, params, signal, _onUpdate, ctx) {\n\t\t\treturn runWithProxy(typeof params.proxy === \"string\" ? params.proxy : undefined, async () => {\n\t\t\t\tconst claim = typeof params.claim === \"string\" ? params.claim.trim() : \"\";\n\t\t\t\tif (!claim) {\n\t\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: 'claim' is required.\" }], details: { error: \"Missing claim\" } };\n\t\t\t\t}\n\n\t\t\t\tconst requestedQueries = Array.isArray(params.queries)\n\t\t\t\t\t? params.queries.filter((query): query is string => typeof query === \"string\").map((query) => query.trim()).filter(Boolean)\n\t\t\t\t\t: [];\n\t\t\t\tconst queries = (requestedQueries.length > 0 ? requestedQueries : [claim]).slice(0, 8);\n\t\t\t\tconst numResults = typeof params.numResults === \"number\" && Number.isFinite(params.numResults)\n\t\t\t\t\t? Math.min(20, Math.max(1, Math.floor(params.numResults)))\n\t\t\t\t\t: 5;\n\t\t\t\tconst domainFilter = Array.isArray(params.domainFilter)\n\t\t\t\t\t? params.domainFilter.filter((domain): domain is string => typeof domain === \"string\")\n\t\t\t\t\t: undefined;\n\t\t\t\tconst recencyFilter = normalizeRecencyFilter(params.recencyFilter);\n\t\t\t\tconst resultsByUrl = new Map<string, SearchResult>();\n\t\t\t\tconst summaries: string[] = [];\n\t\t\t\tconst errors: Array<{ query: string; error: string }> = [];\n\t\t\t\tlet provider: string | undefined;\n\n\t\t\t\tfor (const query of queries) {\n\t\t\t\t\tif (signal?.aborted) break;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst response = await search(query, {\n\t\t\t\t\t\t\tprovider: resolveRequestedProvider(params.provider),\n\t\t\t\t\t\t\tnumResults,\n\t\t\t\t\t\t\trecencyFilter,\n\t\t\t\t\t\t\tdomainFilter,\n\t\t\t\t\t\t\tsignal,\n\t\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (signal?.aborted) break;\n\t\t\t\t\t\tprovider ??= response.provider;\n\t\t\t\t\t\tif (response.answer) summaries.push(`${query}: ${response.answer}`);\n\t\t\t\t\t\tfor (const result of response.results) {\n\t\t\t\t\t\t\tif (!resultsByUrl.has(result.url)) resultsByUrl.set(result.url, result);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tif (signal?.aborted || isAbortError(err)) break;\n\t\t\t\t\t\terrors.push({ query, error: err instanceof Error ? err.message : String(err) });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst results = [...resultsByUrl.values()].slice(0, 20).map((result, index) => ({ ...result, rank: index + 1 }));\n\t\t\t\tlet fetched: ExtractedContent[] = [];\n\t\t\t\tif (params.fetchContent && results.length > 0) {\n\t\t\t\t\tconst urls = results.slice(0, 5).map((result) => result.url);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfetched = await fetchAllContent(urls, signal, withRegisteredFetchOptions(undefined, registeredToolNames, typeof params.proxy === \"string\" ? params.proxy : undefined));\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tif (signal?.aborted || isAbortError(err)) throw err;\n\t\t\t\t\t\tfetched = urls.map((url) => ({ url, title: \"\", content: \"\", error: err instanceof Error ? err.message : String(err) }));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst artifact = withClaimAssessment(buildResearchArtifact({\n\t\t\t\t\tquery: claim,\n\t\t\t\t\tprovider,\n\t\t\t\t\tsummary: summaries.length > 0 ? summaries.join(\"\\n\\n\") : undefined,\n\t\t\t\t\tresults,\n\t\t\t\t\tfetched,\n\t\t\t\t\trecency: recencyFilter,\n\t\t\t\t\tdomainFilter,\n\t\t\t\t}), [claim]);\n\t\t\t\tif (errors.length > 0) artifact.errors = errors;\n\t\t\t\tstoreResearchArtifact(artifact);\n\t\t\t\tpi.appendEntry(\"web-search-results\", {\n\t\t\t\t\tid: artifact.id,\n\t\t\t\t\ttype: \"research\",\n\t\t\t\t\ttimestamp: artifact.timestamp,\n\t\t\t\t\tartifact,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: formatSourceCheckResult(artifact, getSearchContentEnabled ? toolNames.getSearchContent : null) }],\n\t\t\t\t\tdetails: { responseId: artifact.id, artifact, sourceCount: artifact.sources.length, passageCount: artifact.passages.length },\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t});\n\n\tif (fetchContentEnabled) pi.registerTool({\n\t\tname: toolNames.fetchContent,\n\t\tlabel: \"Fetch Content\",\n\t\tdescription: `Fetch URL(s) and extract readable content as markdown. Use mode \"raw\" for exact textual HTTP response bodies or mode \"answer\" with prompt to answer using only fetched content. Direct image URLs return resized image content. Supports YouTube transcripts, GitHub repositories, PDFs, and local videos. ${fetchContentStorageNote}`,\n\t\tpromptSnippet:\n\t\t\t\"Use to fetch readable or raw URL content, direct images, GitHub repos, and videos. Mode answer answers a prompt using only the fetched source.\",\n\t\tparameters: Type.Object({\n\t\t\turl: Type.Optional(Type.String({ description: \"Single URL to fetch\" })),\n\t\t\turls: Type.Optional(Type.Array(Type.String(), { description: \"Multiple URLs (parallel)\" })),\n\t\t\tforceClone: Type.Optional(Type.Boolean({\n\t\t\t\tdescription: \"Force cloning large GitHub repositories that exceed the size threshold\",\n\t\t\t})),\n\t\t\tprompt: Type.Optional(Type.String({\n\t\t\t\tdescription: \"Question or instruction for video analysis, or the page-local question required by mode answer.\",\n\t\t\t})),\n\t\t\tmode: Type.Optional(StringEnum([\"readable\", \"raw\", \"answer\"], {\n\t\t\t\tdescription: \"Fetch mode: readable (default extraction), raw (exact textual HTTP body), or answer (answer prompt using only fetched content).\",\n\t\t\t})),\n\t\t\tanswerModel: Type.Optional(Type.String({\n\t\t\t\tdescription: \"Optional provider/model-id override for mode answer. Defaults to fetch.answerProvider + fetch.answerModel when configured, otherwise the current Pi model.\",\n\t\t\t})),\n\t\t\ttimestamp: Type.Optional(Type.String({\n\t\t\t\tdescription: \"Extract video frame(s) at a timestamp or time range. Single: '1:23:45', '23:45', or '85' (seconds). Range: '23:41-25:00' extracts evenly-spaced frames across that span (default 6). Use frames with ranges to control density; single+frames uses a fixed 5s interval. YouTube requires yt-dlp + ffmpeg; local videos require ffmpeg. Use a range when you know the approximate area but not the exact moment — you'll get a contact sheet to visually identify the right frame.\",\n\t\t\t})),\n\t\t\tframes: Type.Optional(Type.Integer({\n\t\t\t\tminimum: 1,\n\t\t\t\tmaximum: 12,\n\t\t\t\tdescription: \"Number of frames to extract. Use with timestamp range for custom density, with single timestamp to get N frames at 5s intervals, or alone to sample across the entire video. Requires yt-dlp + ffmpeg for YouTube, ffmpeg for local video.\",\n\t\t\t})),\n\t\t\tmodel: Type.Optional(Type.String({\n\t\t\t\tdescription: \"Override the Gemini model for video/YouTube analysis (e.g. 'gemini-3.6-flash'). Defaults to config or gemini-3.6-flash.\",\n\t\t\t})),\n\t\t\tauth: Type.Optional(Type.Union([Type.String(), Type.Boolean()], {\n\t\t\t\tdescription: \"Opt into an authFetch profile for local browser-cookie fetching. Use a profile name, or true only when exactly one profile exists.\",\n\t\t\t})),\n\t\t\tproxy: Type.Optional(Type.String({\n\t\t\t\tdescription: \"http(s) proxy URL (e.g. http://host:port) used for this fetch. Needed when the target is unreachable directly; localhost and NO_PROXY hosts always bypass the proxy. Empty string forces direct access.\",\n\t\t\t})),\n\t\t}),\n\n\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx): Promise<AgentToolResult<Record<string, unknown>>> {\n\t\t\tlet normalized: ReturnType<typeof normalizeFetchContentParams>;\n\t\t\ttry {\n\t\t\t\tnormalized = normalizeFetchContentParams(params);\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err instanceof Error ? err.message : String(err);\n\t\t\t\treturn { content: [{ type: \"text\", text: `Error: ${error}` }], details: { error } };\n\t\t\t}\n\t\t\tconst { urlList, options } = normalized;\n\t\t\treturn runWithProxy(options.proxy, async () => {\n\t\t\t\tconst mode = options.mode ?? \"readable\";\n\t\t\t\tif (mode === \"answer\" && !options.prompt) {\n\t\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: mode answer requires prompt.\" }], details: { error: \"mode answer requires prompt\" } };\n\t\t\t\t}\n\t\t\t\tif (mode === \"raw\" && (options.forceClone === true || options.timestamp || options.frames || options.prompt || options.model || options.answerModel)) {\n\t\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: mode raw cannot be combined with forceClone, prompt, timestamp, frames, model, or answerModel.\" }], details: { error: \"Incompatible raw mode options\" } };\n\t\t\t\t}\n\t\t\t\tif (mode !== \"answer\" && options.answerModel) {\n\t\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: answerModel requires mode answer.\" }], details: { error: \"answerModel requires mode answer\" } };\n\t\t\t\t}\n\t\t\t\tif (mode === \"answer\" && options.model) {\n\t\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: use answerModel, not model, with mode answer.\" }], details: { error: \"model is incompatible with mode answer\" } };\n\t\t\t\t}\n\t\t\t\tif (mode === \"answer\" && options.auth !== undefined) {\n\t\t\t\t\treturn { content: [{ type: \"text\", text: \"Error: auth cannot be combined with mode answer.\" }], details: { error: \"auth cannot be combined with mode answer\" } };\n\t\t\t\t}\n\t\t\t\tlet authFetchProfile: AuthFetchProfile | undefined;\n\t\t\t\tif (options.auth !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tauthFetchProfile = resolveAuthFetchProfile(options.auth);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\treturn { content: [{ type: \"text\", text: `Error: ${error}` }], details: { error } };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (urlList.length === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: No URL provided.\" }],\n\t\t\t\t\t\tdetails: { error: \"No URL provided\" },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tonUpdate?.({\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Fetching ${urlList.length} URL(s)...` }],\n\t\t\t\t\tdetails: { phase: \"fetch\", progress: 0 },\n\t\t\t\t});\n\n\t\t\t\tconst { answerModel: _answerModel, auth: _auth, ...extractionOptions } = options;\n\t\t\t\tconst fetchOptions = mode === \"answer\"\n\t\t\t\t\t? (() => {\n\t\t\t\t\t\tconst { prompt: _prompt, ...rest } = extractionOptions;\n\t\t\t\t\t\treturn { ...rest, ...(authFetchProfile ? { authFetchProfile } : {}) };\n\t\t\t\t\t})()\n\t\t\t\t\t: { ...extractionOptions, ...(authFetchProfile ? { authFetchProfile } : {}) };\n\t\t\t\tconst fetchResults = await fetchAllContent(urlList, signal, withRegisteredFetchOptions(fetchOptions, registeredToolNames, options.proxy));\n\t\t\t\tconst presentedResults = mode === \"answer\"\n\t\t\t\t\t? await Promise.all(fetchResults.map(async result => {\n\t\t\t\t\t\tif (result.error) return result;\n\t\t\t\t\t\tif (result.thumbnail || result.mimeType?.startsWith(\"image/\")) {\n\t\t\t\t\t\t\treturn { ...result, error: \"Page answer requires textual fetched content\" };\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst answer = await answerFromPage({\n\t\t\t\t\t\t\t\tquestion: options.prompt!,\n\t\t\t\t\t\t\t\tpageText: result.content,\n\t\t\t\t\t\t\t\tsourceUrl: result.url,\n\t\t\t\t\t\t\t\t...(options.answerModel ? { model: options.answerModel } : {}),\n\t\t\t\t\t\t\t}, ctx, signal);\n\t\t\t\t\t\t\treturn { ...result, content: answer.text };\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\treturn { ...result, error: `Page answer failed: ${err instanceof Error ? err.message : String(err)}` };\n\t\t\t\t\t\t}\n\t\t\t\t\t}))\n\t\t\t\t\t: fetchResults;\n\t\t\t\tconst successful = presentedResults.filter((r) => !r.error).length;\n\t\t\t\tconst totalChars = presentedResults.reduce((sum, r) => sum + r.content.length, 0);\n\n\t\t\t\tconst responseId = generateId();\n\t\t\t\tconst data = {\n\t\t\t\t\tid: responseId,\n\t\t\t\t\ttype: \"fetch\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\turls: stripThumbnails(fetchResults),\n\t\t\t\t} satisfies StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] };\n\t\t\t\tconst storedContent = storeFetchResult(pi, responseId, data, authFetchProfile);\n\n\t\t\t\tif (urlList.length === 1) {\n\t\t\t\t\tconst result = presentedResults[0];\n\t\t\t\t\tif (result.error) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Error: ${result.error}` }],\n\t\t\t\t\t\t\tdetails: { urls: urlList, urlCount: 1, successful: 0, error: result.error, ...(storedContent ? { responseId } : {}), prompt: params.prompt, timestamp: params.timestamp, frames: params.frames },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tconst fullLength = result.content.length;\n\t\t\t\t\tconst slice = initialContentSlice(result.content, getMaxInlineContentChars());\n\t\t\t\t\tconst truncated = slice.endOffset < fullLength;\n\t\t\t\t\tlet output = slice.text;\n\n\t\t\t\t\tif (truncated) {\n\t\t\t\t\t\toutput += `\\n\\n---\\nShowing ${slice.endOffset} of ${fullLength} chars, ${slice.shownBytes} of ${slice.totalBytes} bytes, and ${slice.shownLines} of ${slice.totalLines} lines. `;\n\t\t\t\t\t\toutput += storedContent\n\t\t\t\t\t\t\t? getSearchContentEnabled\n\t\t\t\t\t\t\t\t? `Use ${toolNames.getSearchContent}({ responseId: \"${responseId}\", urlIndex: 0, offset: ${slice.endOffset} }) for the next slice.`\n\t\t\t\t\t\t\t\t: \"Content retrieval is not registered.\"\n\t\t\t\t\t\t\t: \"Authenticated fetch cache is off; repeat the fetch to read more.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tconst content: Array<TextContent | ImageContent> = [];\n\t\t\t\t\tif (result.frames?.length) {\n\t\t\t\t\t\tfor (const frame of result.frames) {\n\t\t\t\t\t\t\tcontent.push({ type: \"image\", data: frame.data, mimeType: frame.mimeType });\n\t\t\t\t\t\t\tcontent.push({ type: \"text\", text: `Frame at ${frame.timestamp}` });\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (result.thumbnail) {\n\t\t\t\t\t\tcontent.push({ type: \"image\", data: result.thumbnail.data, mimeType: result.thumbnail.mimeType });\n\t\t\t\t\t}\n\t\t\t\t\tcontent.push({ type: \"text\", text: output });\n\n\t\t\t\t\tconst imageCount = (result.frames?.length ?? 0) + (result.thumbnail ? 1 : 0);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\turls: urlList,\n\t\t\t\t\t\t\turlCount: 1,\n\t\t\t\t\t\t\tsuccessful: 1,\n\t\t\t\t\t\t\ttotalChars: fullLength,\n\t\t\t\t\t\t\ttitle: result.title,\n\t\t\t\t\t\t\t...(storedContent ? { responseId } : {}),\n\t\t\t\t\t\t\ttruncated,\n\t\t\t\t\t\t\thasImage: imageCount > 0,\n\t\t\t\t\t\t\timageCount,\n\t\t\t\t\t\t\tprompt: params.prompt,\n\t\t\t\t\t\t\ttimestamp: params.timestamp,\n\t\t\t\t\t\t\tframes: params.frames,\n\t\t\t\t\t\t\tduration: result.duration,\n\t\t\t\t\t\t\tmode,\n\t\t\t\t\t\t\tmimeType: result.mimeType,\n\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\ttotalBytes: slice.totalBytes,\n\t\t\t\t\t\t\ttotalLines: slice.totalLines,\n\t\t\t\t\t\t\tshownBytes: slice.shownBytes,\n\t\t\t\t\t\t\tshownLines: slice.shownLines,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlet output = \"## Fetched URLs\\n\\n\";\n\t\t\t\tfor (const { url, title, content, error } of presentedResults) {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\toutput += `- ${url}: Error - ${error}\\n`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `- ${title || url} (${content.length} chars)\\n`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\toutput += storedContent\n\t\t\t\t\t? getSearchContentEnabled\n\t\t\t\t\t\t? `\\n---\\nUse ${toolNames.getSearchContent}({ responseId: \"${responseId}\", urlIndex: 0 }) to retrieve bounded content slices.`\n\t\t\t\t\t\t: \"\\n---\\nContent retrieval is not registered.\"\n\t\t\t\t\t: \"\\n---\\nAuthenticated fetch cache is off; repeat the fetch to read content.\";\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: output }],\n\t\t\t\t\tdetails: { urls: urlList, urlCount: urlList.length, successful, totalChars, ...(storedContent ? { responseId } : {}) },\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\tconst { urlList, options } = normalizeFetchContentParams(args);\n\t\t\tconst { prompt, timestamp, frames, model, mode, answerModel, auth } = options;\n\t\t\tif (urlList.length === 0) {\n\t\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"fetch \")) + theme.fg(\"error\", \"(no URL)\"), 0, 0);\n\t\t\t}\n\t\t\tconst lines: string[] = [];\n\t\t\tif (urlList.length === 1) {\n\t\t\t\tconst display = urlList[0].length > 60 ? urlList[0].slice(0, 57) + \"...\" : urlList[0];\n\t\t\t\tlines.push(theme.fg(\"toolTitle\", theme.bold(\"fetch \")) + theme.fg(\"accent\", display));\n\t\t\t} else {\n\t\t\t\tlines.push(theme.fg(\"toolTitle\", theme.bold(\"fetch \")) + theme.fg(\"accent\", `${urlList.length} URLs`));\n\t\t\t\tfor (const u of urlList.slice(0, 5)) {\n\t\t\t\t\tconst display = u.length > 60 ? u.slice(0, 57) + \"...\" : u;\n\t\t\t\t\tlines.push(theme.fg(\"muted\", \" \" + display));\n\t\t\t\t}\n\t\t\t\tif (urlList.length > 5) {\n\t\t\t\t\tlines.push(theme.fg(\"muted\", ` ... and ${urlList.length - 5} more`));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (mode && mode !== \"readable\") {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" mode: \") + theme.fg(\"warning\", mode));\n\t\t\t}\n\t\t\tif (timestamp) {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" timestamp: \") + theme.fg(\"warning\", timestamp));\n\t\t\t}\n\t\t\tif (typeof frames === \"number\") {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" frames: \") + theme.fg(\"warning\", String(frames)));\n\t\t\t}\n\t\t\tif (prompt) {\n\t\t\t\tconst display = prompt.length > 250 ? prompt.slice(0, 247) + \"...\" : prompt;\n\t\t\t\tlines.push(theme.fg(\"dim\", \" prompt: \") + theme.fg(\"muted\", `\"${display}\"`));\n\t\t\t}\n\t\t\tif (model) {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" model: \") + theme.fg(\"warning\", model));\n\t\t\t}\n\t\t\tif (answerModel) {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" answer model: \") + theme.fg(\"warning\", answerModel));\n\t\t\t}\n\t\t\tif (auth !== undefined) {\n\t\t\t\tlines.push(theme.fg(\"dim\", \" auth: \") + theme.fg(\"warning\", auth === true ? \"true\" : auth));\n\t\t\t}\n\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t},\n\n\t\trenderResult(result, { expanded, isPartial }, theme) {\n\t\t\tconst details = result.details as {\n\t\t\t\turlCount?: number;\n\t\t\t\tsuccessful?: number;\n\t\t\t\ttotalChars?: number;\n\t\t\t\terror?: string;\n\t\t\t\ttitle?: string;\n\t\t\t\ttruncated?: boolean;\n\t\t\t\tresponseId?: string;\n\t\t\t\tphase?: string;\n\t\t\t\tprogress?: number;\n\t\t\t\thasImage?: boolean;\n\t\t\t\timageCount?: number;\n\t\t\t\tprompt?: string;\n\t\t\t\ttimestamp?: string;\n\t\t\t\tframes?: number;\n\t\t\t\tduration?: number;\n\t\t\t};\n\n\t\t\tif (isPartial) {\n\t\t\t\tconst progress = details?.progress ?? 0;\n\t\t\t\tconst bar = \"\\u2588\".repeat(Math.floor(progress * 10)) + \"\\u2591\".repeat(10 - Math.floor(progress * 10));\n\t\t\t\treturn new Text(theme.fg(\"accent\", `[${bar}] ${details?.phase || \"fetching\"}`), 0, 0);\n\t\t\t}\n\n\t\t\tif (details?.error) {\n\t\t\t\tconst fd = details as typeof details & { urls?: string[] };\n\t\t\t\tconst extras: string[] = [];\n\t\t\t\tif (typeof fd.urlCount === \"number\" || typeof fd.successful === \"number\") {\n\t\t\t\t\textras.push(`urls: ${fd.successful ?? 0}/${fd.urlCount ?? 0} succeeded`);\n\t\t\t\t}\n\t\t\t\tif (fd.responseId) extras.push(`response id: ${fd.responseId}`);\n\t\t\t\tif (fd.urls && fd.urls.length > 0) {\n\t\t\t\t\tfor (const u of fd.urls.slice(0, 8)) extras.push(` \\u25b8 ${u}`);\n\t\t\t\t\tif (fd.urls.length > 8) extras.push(` ... and ${fd.urls.length - 8} more`);\n\t\t\t\t}\n\t\t\t\tconst plan = buildSearchErrorPlan({ error: details.error, extraLines: extras });\n\t\t\t\tif (plan) return renderSearchErrorPlan(plan, expanded, theme);\n\t\t\t\treturn new Text(theme.fg(\"error\", `Error: ${details.error}`), 0, 0);\n\t\t\t}\n\n\t\t\tif (details?.urlCount === 1) {\n\t\t\t\tconst title = details?.title || \"Untitled\";\n\t\t\t\tconst imgCount = details?.imageCount ?? (details?.hasImage ? 1 : 0);\n\t\t\t\tconst imageBadge = imgCount > 1\n\t\t\t\t\t? theme.fg(\"accent\", ` [${imgCount} images]`)\n\t\t\t\t\t: imgCount === 1\n\t\t\t\t\t\t? theme.fg(\"accent\", \" [image]\")\n\t\t\t\t\t\t: \"\";\n\t\t\t\tlet statusLine = theme.fg(\"success\", title) + theme.fg(\"muted\", ` (${details?.totalChars ?? 0} chars)`) + imageBadge;\n\t\t\t\tif (details?.truncated) {\n\t\t\t\t\tstatusLine += theme.fg(\"warning\", \" [truncated]\");\n\t\t\t\t}\n\t\t\t\tif (typeof details?.duration === \"number\") {\n\t\t\t\t\tstatusLine += theme.fg(\"muted\", ` | ${formatSeconds(Math.floor(details.duration))} total`);\n\t\t\t\t}\n\t\t\t\tconst textContent = result.content.find((c) => c.type === \"text\")?.text || \"\";\n\t\t\t\tif (!expanded) {\n\t\t\t\t\tconst brief = textContent.length > 200 ? textContent.slice(0, 200) + \"...\" : textContent;\n\t\t\t\t\treturn new Text(statusLine + \"\\n\" + theme.fg(\"dim\", brief), 0, 0);\n\t\t\t\t}\n\t\t\t\tconst lines = [statusLine];\n\t\t\t\tif (details?.prompt) {\n\t\t\t\t\tconst display = details.prompt.length > 250 ? details.prompt.slice(0, 247) + \"...\" : details.prompt;\n\t\t\t\t\tlines.push(theme.fg(\"dim\", ` prompt: \"${display}\"`));\n\t\t\t\t}\n\t\t\t\tif (details?.timestamp) {\n\t\t\t\t\tlines.push(theme.fg(\"dim\", ` timestamp: ${details.timestamp}`));\n\t\t\t\t}\n\t\t\t\tif (typeof details?.frames === \"number\") {\n\t\t\t\t\tlines.push(theme.fg(\"dim\", ` frames: ${details.frames}`));\n\t\t\t\t}\n\t\t\t\tconst preview = textContent.length > 500 ? textContent.slice(0, 500) + \"...\" : textContent;\n\t\t\t\tlines.push(theme.fg(\"dim\", preview));\n\t\t\t\treturn new Text(lines.join(\"\\n\"), 0, 0);\n\t\t\t}\n\n\t\t\tconst countColor = (details?.successful ?? 0) > 0 ? \"success\" : \"error\";\n\t\t\tconst statusLine = theme.fg(countColor, `${details?.successful}/${details?.urlCount} URLs`) + theme.fg(\"muted\", getSearchContentEnabled ? \" (content stored)\" : \" (content fetched)\");\n\t\t\tif (!expanded) {\n\t\t\t\treturn new Text(statusLine, 0, 0);\n\t\t\t}\n\t\t\tconst textContent = result.content.find((c) => c.type === \"text\")?.text || \"\";\n\t\t\tconst preview = textContent.length > 500 ? textContent.slice(0, 500) + \"...\" : textContent;\n\t\t\treturn new Text(statusLine + \"\\n\" + theme.fg(\"dim\", preview), 0, 0);\n\t\t},\n\t});\n\n\tif (getSearchContentEnabled) {\n\t\tconst maxInlineContentChars = getMaxInlineContentChars(initConfig);\n\t\tpi.registerTool({\n\t\tname: toolNames.getSearchContent,\n\t\tlabel: \"Get Search Content\",\n\t\tdescription: `Retrieve bounded content slices or find matching passages in a previous ${storedContentSources} call.`,\n\t\tpromptSnippet:\n\t\t\t`Use after ${storedContentSources} to retrieve stored content via responseId. Use findText to locate passages without paging through the full content.`,\n\t\tparameters: Type.Object({\n\t\t\tresponseId: Type.String({ description: `The responseId from ${storedContentSources}` }),\n\t\t\tquery: Type.Optional(Type.String({ description: searchQueryDescription })),\n\t\t\tqueryIndex: Type.Optional(Type.Integer({ minimum: 0, description: \"Get content for query at index\" })),\n\t\t\turl: Type.Optional(Type.String({ description: \"Get content for this URL\" })),\n\t\t\turlIndex: Type.Optional(Type.Integer({ minimum: 0, description: \"Get content for URL at index\" })),\n\t\t\toffset: Type.Optional(Type.Integer({ minimum: 0, description: \"Character offset for fetched URL content slices (default 0). Ignored when findText is supplied.\" })),\n\t\t\tlimit: Type.Optional(Type.Integer({ minimum: 1, maximum: maxInlineContentChars, description: \"Maximum characters to return for fetched URL content slices (default and max are set by maxInlineContentChars). Ignored when findText is supplied.\" })),\n\t\t\tfindText: Type.Optional(Type.Union([\n\t\t\t\tType.String({ minLength: 1, maxLength: 500 }),\n\t\t\t\tType.Array(Type.String({ minLength: 1, maxLength: 500 }), { minItems: 1, maxItems: 10 }),\n\t\t\t], { description: \"Text or texts to find in the selected stored content. When supplied, offset and limit are ignored.\" })),\n\t\t\tfindMode: Type.Optional(StringEnum([\"exact\", \"case-insensitive\", \"fuzzy\"], { description: \"Matching mode for findText (default: case-insensitive). Requires findText.\" })),\n\t\t}),\n\n\t\tasync execute(_toolCallId, rawParams): Promise<AgentToolResult<Record<string, unknown>>> {\n\t\t\tconst params = normalizeGetSearchContentParams(rawParams);\n\t\t\tif (params.findMode !== undefined && params.findText === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `findMode ${formatInputValue(params.findMode)} requires findText; provide findText or omit findMode.` }],\n\t\t\t\t\tdetails: { error: \"findMode requires findText\" },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst data = getResult(params.responseId);\n\t\t\tif (!data) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Error: No stored results for responseId ${formatInputValue(params.responseId)}. Use a responseId returned by ${storedContentSources}.` }],\n\t\t\t\t\tdetails: { error: \"Not found\", responseId: params.responseId },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (data.type === \"research\") {\n\t\t\t\tconst artifact = getResearchArtifact(params.responseId);\n\t\t\t\tif (!artifact) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Error: stored research artifact for responseId ${formatInputValue(params.responseId)} was not found. Use a responseId returned by ${storedContentSources}.` }],\n\t\t\t\t\t\tdetails: { error: \"Artifact not found\", responseId: params.responseId },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst serialized = JSON.stringify(artifact, null, 2);\n\t\t\t\tif (params.findText !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst found = findContent(serialized, normalizeFindQueries(params.findText), params.findMode ?? \"case-insensitive\");\n\t\t\t\t\t\tconst { text, ...findDetails } = found;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\t\t\tdetails: { responseId: artifact.id, type: \"research\", contentLength: serialized.length, findMode: params.findMode ?? \"case-insensitive\", ...findDetails },\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Unable to find ${formatInputValue(params.findText)} in research artifact for responseId ${formatInputValue(params.responseId)}: ${error}. Check findText and use a supported findMode.` }],\n\t\t\t\t\t\t\tdetails: { error, responseId: params.responseId, type: \"research\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst offset = params.offset ?? 0;\n\t\t\t\tconst limit = params.limit ?? maxInlineContentChars;\n\t\t\t\tif (!Number.isInteger(offset) || offset < 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Invalid offset: received ${formatInputValue(offset)} for responseId ${formatInputValue(params.responseId)}; offset must be a non-negative integer. Use 0 or a larger integer.` }],\n\t\t\t\t\t\tdetails: { error: \"Invalid offset\", offset },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!Number.isInteger(limit) || limit <= 0 || limit > maxInlineContentChars) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Invalid limit: received ${formatInputValue(limit)} for responseId ${formatInputValue(params.responseId)}; limit must be an integer from 1 to ${maxInlineContentChars}. Use a value in that range.` }],\n\t\t\t\t\t\tdetails: { error: \"Invalid limit\", limit, maxLimit: maxInlineContentChars },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (offset > serialized.length) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Offset ${offset} is out of range for responseId ${formatInputValue(params.responseId)}. Received offset ${offset}; valid range is 0-${serialized.length}. Use an offset within that range.` }],\n\t\t\t\t\t\tdetails: { error: \"Offset out of range\", offset, contentLength: serialized.length },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst endOffset = Math.min(offset + limit, serialized.length);\n\t\t\t\tconst artifactSlice = serialized.slice(offset, endOffset);\n\t\t\t\tconst hasMore = endOffset < serialized.length;\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: artifactSlice }],\n\t\t\t\t\tdetails: { responseId: artifact.id, type: \"research\", contentLength: serialized.length, offset, limit, returnedChars: artifactSlice.length, nextOffset: hasMore ? endOffset : null, truncated: hasMore },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (data.type === \"search\" && data.queries) {\n\t\t\t\tlet queryData: QueryResultData | undefined;\n\n\t\t\t\tif (params.query !== undefined) {\n\t\t\t\t\tqueryData = data.queries.find((q) => q.query === params.query);\n\t\t\t\t\tif (!queryData) {\n\t\t\t\t\t\tconst available = data.queries.map((q) => `\"${q.query}\"`).join(\", \");\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Query ${formatInputValue(params.query)} was not found for responseId ${formatInputValue(params.responseId)}. Received query=${formatInputValue(params.query)}. Available queries: ${available || \"none\"}. Use one of the available queries or queryIndex.` }],\n\t\t\t\t\t\t\tdetails: { error: \"Query not found\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (params.queryIndex !== undefined) {\n\t\t\t\t\tqueryData = data.queries[params.queryIndex];\n\t\t\t\t\tif (!queryData) {\n\t\t\t\t\t\tconst available = data.queries.map((q, i) => `${i}: \"${q.query}\"`).join(\", \");\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Query index ${formatInputValue(params.queryIndex)} is out of range for responseId ${formatInputValue(params.responseId)}. Received queryIndex=${formatInputValue(params.queryIndex)}; valid indexes are 0-${data.queries.length - 1}. Available queries: ${available || \"none\"}. Use one of the available indexes.` }],\n\t\t\t\t\t\t\tdetails: { error: \"Index out of range\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst available = data.queries.map((q, i) => `${i}: \"${q.query}\"`).join(\", \");\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Specify query or queryIndex for responseId ${formatInputValue(params.responseId)}. Available queries: ${available || \"none\"}.` }],\n\t\t\t\t\t\tdetails: { error: \"No query specified\" },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (queryData.error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Error retrieving query ${formatInputValue(queryData.query)} from responseId ${formatInputValue(params.responseId)}: ${queryData.error}. Check the stored search result and retry with another query or queryIndex if needed.` }],\n\t\t\t\t\t\tdetails: { error: queryData.error, query: queryData.query },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst fullResults = formatFullResults(queryData);\n\t\t\t\tif (params.findText !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst found = findContent(fullResults, normalizeFindQueries(params.findText), params.findMode ?? \"case-insensitive\");\n\t\t\t\t\t\tconst { text, ...findDetails } = found;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\t\t\tdetails: { query: queryData.query, resultCount: queryData.results.length, findMode: params.findMode ?? \"case-insensitive\", ...findDetails },\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Unable to find ${formatInputValue(params.findText)} in query ${formatInputValue(queryData.query)} for responseId ${formatInputValue(params.responseId)}: ${error}. Check findText and use a supported findMode.` }],\n\t\t\t\t\t\t\tdetails: { error, query: queryData.query },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: fullResults }],\n\t\t\t\t\tdetails: { query: queryData.query, resultCount: queryData.results.length },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (data.type === \"fetch\" && data.urls) {\n\t\t\t\tlet urlData: ExtractedContent | undefined;\n\t\t\t\tlet selectedUrlIndex = -1;\n\n\t\t\t\tif (params.url !== undefined) {\n\t\t\t\t\tselectedUrlIndex = data.urls.findIndex((u) => u.url === params.url);\n\t\t\t\t\turlData = data.urls[selectedUrlIndex];\n\t\t\t\t\tif (!urlData) {\n\t\t\t\t\t\tconst available = data.urls.map((u) => u.url).join(\"\\n \");\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `URL ${formatInputValue(params.url)} was not found for responseId ${formatInputValue(params.responseId)}. Received url=${formatInputValue(params.url)}. Available URLs:\\n ${available || \" none\"}\\nUse one of the available URLs or urlIndex.` }],\n\t\t\t\t\t\t\tdetails: { error: \"URL not found\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (params.urlIndex !== undefined) {\n\t\t\t\t\tselectedUrlIndex = params.urlIndex;\n\t\t\t\t\turlData = data.urls[selectedUrlIndex];\n\t\t\t\t\tif (!urlData) {\n\t\t\t\t\t\tconst available = data.urls.map((u, i) => `${i}: ${u.url}`).join(\"\\n \");\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `URL index ${formatInputValue(params.urlIndex)} is out of range for responseId ${formatInputValue(params.responseId)}. Received urlIndex=${formatInputValue(params.urlIndex)}; valid indexes are 0-${data.urls.length - 1}. Available URLs:\\n ${available || \" none\"}\\nUse one of the available indexes.` }],\n\t\t\t\t\t\t\tdetails: { error: \"Index out of range\" },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst available = data.urls.map((u, i) => `${i}: ${u.url}`).join(\"\\n \");\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Specify url or urlIndex for responseId ${formatInputValue(params.responseId)}. Available URLs:\\n ${available || \" none\"}` }],\n\t\t\t\t\t\tdetails: { error: \"No URL specified\" },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (urlData.error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Error retrieving URL ${formatInputValue(urlData.url)} from responseId ${formatInputValue(params.responseId)}: ${urlData.error}. Check the stored fetch result and retry with another URL or urlIndex if needed.` }],\n\t\t\t\t\t\tdetails: { error: urlData.error, url: urlData.url },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (params.findText !== undefined) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst found = findContent(urlData.content, normalizeFindQueries(params.findText), params.findMode ?? \"case-insensitive\");\n\t\t\t\t\t\tconst { text, ...findDetails } = found;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `# ${urlData.title || urlData.url}\\n\\n${text}` }],\n\t\t\t\t\t\t\tdetails: { url: urlData.url, title: urlData.title, contentLength: urlData.content.length, findMode: params.findMode ?? \"case-insensitive\", ...findDetails },\n\t\t\t\t\t\t};\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconst error = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Unable to find ${formatInputValue(params.findText)} in URL ${formatInputValue(urlData.url)} for responseId ${formatInputValue(params.responseId)}: ${error}. Check findText and use a supported findMode.` }],\n\t\t\t\t\t\t\tdetails: { error, url: urlData.url },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst offset = params.offset ?? 0;\n\t\t\t\tconst limit = params.limit ?? maxInlineContentChars;\n\t\t\t\tif (!Number.isInteger(offset) || offset < 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Invalid offset: received ${formatInputValue(offset)} for URL ${formatInputValue(urlData.url)}; offset must be a non-negative integer. Use 0 or a larger integer.` }],\n\t\t\t\t\t\tdetails: { error: \"Invalid offset\", offset },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!Number.isInteger(limit) || limit <= 0 || limit > maxInlineContentChars) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Invalid limit: received ${formatInputValue(limit)} for URL ${formatInputValue(urlData.url)}; limit must be an integer from 1 to ${maxInlineContentChars}. Use a value in that range.` }],\n\t\t\t\t\t\tdetails: { error: \"Invalid limit\", limit, maxLimit: maxInlineContentChars },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (offset > urlData.content.length) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Offset ${offset} is out of range for URL ${formatInputValue(urlData.url)} in responseId ${formatInputValue(params.responseId)}. Received offset ${offset}; valid range is 0-${urlData.content.length}. Use an offset within that range.` }],\n\t\t\t\t\t\tdetails: { error: \"Offset out of range\", offset, contentLength: urlData.content.length },\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst endOffset = Math.min(offset + limit, urlData.content.length);\n\t\t\t\tconst contentSlice = urlData.content.slice(offset, endOffset);\n\t\t\t\tconst hasMore = endOffset < urlData.content.length;\n\t\t\t\tlet text = `# ${urlData.title || urlData.url}\\n\\n${contentSlice}`;\n\t\t\t\tif (hasMore || offset > 0) {\n\t\t\t\t\ttext += `\\n\\n---\\nShowing chars ${offset}-${endOffset} of ${urlData.content.length}.`;\n\t\t\t\t\tif (hasMore) {\n\t\t\t\t\t\ttext += ` Use ${toolNames.getSearchContent}({ responseId: \"${params.responseId}\", urlIndex: ${selectedUrlIndex}, offset: ${endOffset}, limit: ${limit} }) for the next slice.`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\turl: urlData.url,\n\t\t\t\t\t\ttitle: urlData.title,\n\t\t\t\t\t\tcontentLength: urlData.content.length,\n\t\t\t\t\t\toffset,\n\t\t\t\t\t\tlimit,\n\t\t\t\t\t\treturnedChars: contentSlice.length,\n\t\t\t\t\t\tnextOffset: hasMore ? endOffset : null,\n\t\t\t\t\t\ttruncated: hasMore,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Invalid stored data for responseId ${formatInputValue(params.responseId)}: received type ${formatInputValue(data.type)}. Use a responseId returned by ${storedContentSources}.` }],\n\t\t\t\tdetails: { error: \"Invalid data\" },\n\t\t\t};\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\tconst { responseId, query, queryIndex, url, urlIndex, offset, findText } = args as {\n\t\t\t\tresponseId: string;\n\t\t\t\tquery?: string;\n\t\t\t\tqueryIndex?: number;\n\t\t\t\turl?: string;\n\t\t\t\turlIndex?: number;\n\t\t\t\toffset?: number;\n\t\t\t\tfindText?: string | string[];\n\t\t\t};\n\t\t\tlet target = \"\";\n\t\t\tif (query) target = `query=\"${query}\"`;\n\t\t\telse if (queryIndex !== undefined) target = `queryIndex=${queryIndex}`;\n\t\t\telse if (url) target = url.length > 30 ? url.slice(0, 27) + \"...\" : url;\n\t\t\telse if (urlIndex !== undefined) target = `urlIndex=${urlIndex}`;\n\t\t\tif (offset !== undefined) target += target ? ` @ ${offset}` : `offset=${offset}`;\n\t\t\tif (findText !== undefined) {\n\t\t\t\tconst queries = Array.isArray(findText) ? findText : [findText];\n\t\t\t\ttarget += `${target ? \" · \" : \"\"}find ${queries.length}`;\n\t\t\t}\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(\"get_content \")) + theme.fg(\"accent\", target || responseId.slice(0, 8)), 0, 0);\n\t\t},\n\n\t\trenderResult(result, { expanded }, theme) {\n\t\t\tconst details = result.details as {\n\t\t\t\terror?: string;\n\t\t\t\tquery?: string;\n\t\t\t\turl?: string;\n\t\t\t\ttitle?: string;\n\t\t\t\tresultCount?: number;\n\t\t\t\tcontentLength?: number;\n\t\t\t\toffset?: number;\n\t\t\t\treturnedChars?: number;\n\t\t\t\tnextOffset?: number | null;\n\t\t\t\tmatchCount?: number;\n\t\t\t\treturnedMatches?: number;\n\t\t\t};\n\n\t\t\tif (details?.error) {\n\t\t\t\tconst extras: string[] = [];\n\t\t\t\tif (details.query) extras.push(`query: ${details.query}`);\n\t\t\t\tif (details.url) extras.push(`url: ${details.url}`);\n\t\t\t\telse if (details.title) extras.push(`resource: ${details.title}`);\n\t\t\t\tconst plan = buildSearchErrorPlan({ error: details.error, extraLines: extras });\n\t\t\t\tif (plan) return renderSearchErrorPlan(plan, expanded, theme);\n\t\t\t\treturn new Text(theme.fg(\"error\", `Error: ${details.error}`), 0, 0);\n\t\t\t}\n\n\t\t\tlet statusLine: string;\n\t\t\tif (typeof details?.matchCount === \"number\") {\n\t\t\t\tstatusLine = theme.fg(\"success\", details?.title || details?.query || \"Content\") + theme.fg(\"muted\", ` (${details.matchCount} matches, ${details.returnedMatches ?? 0} shown)`);\n\t\t\t} else if (details?.query) {\n\t\t\t\tstatusLine = theme.fg(\"success\", `\"${details.query}\"`) + theme.fg(\"muted\", ` (${details.resultCount} results)`);\n\t\t\t} else {\n\t\t\t\tconst start = details?.offset ?? 0;\n\t\t\t\tconst returned = details?.returnedChars ?? details?.contentLength ?? 0;\n\t\t\t\tconst end = start + returned;\n\t\t\t\tconst slice = details?.nextOffset !== undefined || start > 0\n\t\t\t\t\t? `, showing ${start}-${end}`\n\t\t\t\t\t: \"\";\n\t\t\t\tstatusLine = theme.fg(\"success\", details?.title || \"Content\") + theme.fg(\"muted\", ` (${details?.contentLength ?? 0} chars${slice})`);\n\t\t\t}\n\n\t\t\tif (!expanded) {\n\t\t\t\treturn new Text(statusLine, 0, 0);\n\t\t\t}\n\n\t\t\tconst textContent = result.content.find((c) => c.type === \"text\")?.text || \"\";\n\t\t\tconst preview = textContent.length > 500 ? textContent.slice(0, 500) + \"...\" : textContent;\n\t\t\treturn new Text(statusLine + \"\\n\" + theme.fg(\"dim\", preview), 0, 0);\n\t\t},\n\t});\n\t}\n\n\tif (isCommandEnabled(initConfig, \"websearch\")) pi.registerCommand(\"websearch\", {\n\t\tdescription: \"Open web search curator\",\n\t\thandler: async (args, ctx) => {\n\t\t\tconst sessionToken = randomUUID();\n\t\t\tconst commandCallId = `cmd:${sessionToken}`;\n\t\t\tcloseCurator(commandCallId);\n\n\t\t\tconst raw = args.trim();\n\t\t\tconst queries = raw.length > 0\n\t\t\t\t? normalizeQueryList(raw.split(\",\"))\n\t\t\t\t: [];\n\n\t\t\tlet bootstrap: CuratorBootstrap;\n\t\t\ttry {\n\t\t\t\tbootstrap = await loadCuratorBootstrap(undefined, ctx);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\tctx.ui.notify(`Failed to load web search config: ${message}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst availableProviders = bootstrap.availableProviders;\n\t\t\tconst initialProvider = bootstrap.defaultProvider;\n\t\t\tconst curatorTimeoutSeconds = bootstrap.timeoutSeconds;\n\t\t\tlet currentProvider: CuratorProvider = initialProvider;\n\t\t\tconst commandConfig = loadConfig();\n\t\t\tconst rawSearchProvider = normalizeProviderInput(\n\t\t\t\tcommandConfig.searchProvider ?? commandConfig.provider ?? \"auto\",\n\t\t\t\t`provider in ${WEB_SEARCH_CONFIG_PATH}`,\n\t\t\t) ?? \"auto\";\n\t\t\tlet currentSearchProvider: SearchProviderSelection = Array.isArray(rawSearchProvider)\n\t\t\t\t? rawSearchProvider\n\t\t\t\t: rawSearchProvider === \"auto\" ? \"auto\" : initialProvider;\n\t\t\tconst summaryContext: SummaryGenerationContext = {\n\t\t\t\tmodel: ctx.model,\n\t\t\t\tmodelRegistry: ctx.modelRegistry,\n\t\t\t\tcwd: ctx.cwd,\n\t\t\t\tisProjectTrusted: () => ctx.isProjectTrusted(),\n\t\t\t};\n\t\t\tconst summaryModelChoices = await loadSummaryModelChoices(summaryContext);\n\n\t\t\tctx.ui.notify(\"Opening web search curator...\", \"info\");\n\n\t\t\tconst collected = new Map<number, QueryResultData>();\n\t\t\tconst searchAbort = new AbortController();\n\t\t\tlet aborted = false;\n\t\t\tlet commandHandle: CuratorServerHandle | null = null;\n\t\t\tconst isCommandActive = () => commandHandle !== null && activeCurators.get(commandCallId) === commandHandle;\n\n\t\t\tfunction sendFollowUpFromReturn(payload: ReturnType<typeof buildSearchReturn>) {\n\t\t\t\tpi.sendMessage({\n\t\t\t\t\tcustomType: \"web-search-results\",\n\t\t\t\t\tcontent: payload.content,\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: payload.details,\n\t\t\t\t}, { triggerTurn: true, deliverAs: \"followUp\" });\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst handle = await startCuratorServer(\n\t\t\t\t\t{\n\t\t\t\t\t\tqueries,\n\t\t\t\t\t\tsessionToken,\n\t\t\t\t\t\ttimeout: curatorTimeoutSeconds,\n\t\t\t\t\t\tavailableProviders,\n\t\t\t\t\t\tdefaultProvider: initialProvider,\n\t\t\t\t\t\tsearchProvider: toCuratorProvider(currentSearchProvider) ?? \"auto\",\n\t\t\t\t\t\tsummaryModels: summaryModelChoices.summaryModels,\n\t\t\t\t\t\tdefaultSummaryModel: summaryModelChoices.defaultSummaryModel,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tasync onSummarize(selectedQueryIndices, summarizeSignal, model, feedback) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn generateSummaryForSelectedIndices(\n\t\t\t\t\t\t\t\tselectedQueryIndices,\n\t\t\t\t\t\t\t\tcollected,\n\t\t\t\t\t\t\t\tsummaryContext,\n\t\t\t\t\t\t\t\tsummarizeSignal,\n\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\tfeedback,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonSubmit(payload) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) return;\n\t\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\t\tsearchAbort.abort();\n\t\t\t\t\t\t\tconst filtered = payload.selectedQueryIndices.length > 0\n\t\t\t\t\t\t\t\t? filterByQueryIndices(payload.selectedQueryIndices, collected)\n\t\t\t\t\t\t\t\t: collectAllResultsAndUrls(collected);\n\t\t\t\t\t\t\tconst base: SearchReturnOptions = {\n\t\t\t\t\t\t\t\tqueryList: filtered.results.map(r => r.query),\n\t\t\t\t\t\t\t\tresults: filtered.results,\n\t\t\t\t\t\t\t\turls: filtered.urls,\n\t\t\t\t\t\t\t\tincludeContent: false,\n\t\t\t\t\t\t\t\tcurated: true,\n\t\t\t\t\t\t\t\tcuratedFrom: collected.size,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (!payload.rawResults) {\n\t\t\t\t\t\t\t\tconst resolvedSummary = resolveSummaryForSubmit(payload, collected);\n\t\t\t\t\t\t\t\tbase.workflow = \"summary-review\";\n\t\t\t\t\t\t\t\tbase.approvedSummary = resolvedSummary.approvedSummary;\n\t\t\t\t\t\t\t\tbase.summaryMeta = resolvedSummary.summaryMeta;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsendFollowUpFromReturn(buildSearchReturn(base));\n\t\t\t\t\t\t\tcloseCurator(commandCallId);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonCancel(reason) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) return;\n\t\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\t\tsearchAbort.abort();\n\t\t\t\t\t\t\tif (reason === \"timeout\") {\n\t\t\t\t\t\t\t\tconst all = collectAllResultsAndUrls(collected);\n\t\t\t\t\t\t\t\tconst resolvedSummary = resolveSummaryForSubmit({ selectedQueryIndices: [], summary: undefined, summaryMeta: undefined }, collected);\n\t\t\t\t\t\t\t\tsendFollowUpFromReturn(buildSearchReturn({\n\t\t\t\t\t\t\t\t\tqueryList: all.results.map(r => r.query),\n\t\t\t\t\t\t\t\t\tresults: all.results,\n\t\t\t\t\t\t\t\t\turls: all.urls,\n\t\t\t\t\t\t\t\t\tincludeContent: false,\n\t\t\t\t\t\t\t\t\tcurated: true,\n\t\t\t\t\t\t\t\t\tcuratedFrom: collected.size,\n\t\t\t\t\t\t\t\t\tworkflow: \"summary-review\",\n\t\t\t\t\t\t\t\t\tapprovedSummary: resolvedSummary.approvedSummary,\n\t\t\t\t\t\t\t\t\tsummaryMeta: resolvedSummary.summaryMeta,\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcloseCurator(commandCallId);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonProviderChange(provider) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) return;\n\t\t\t\t\t\t\tconst normalized = normalizeProviderInput(provider);\n\t\t\t\t\t\t\tif (!normalized || normalized === \"auto\" || Array.isArray(normalized)) return;\n\t\t\t\t\t\t\tcurrentProvider = normalized;\n\t\t\t\t\t\t\tcurrentSearchProvider = normalized;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tsaveConfig({ provider: normalized });\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\tconsole.error(`Failed to persist default provider: ${message}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tasync onAddSearch(query, provider) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst requestedProvider = resolveCuratorSearchProvider(provider, currentSearchProvider);\n\t\t\t\t\t\t\tconst response = await search(query, {\n\t\t\t\t\t\t\t\tprovider: requestedProvider,\n\t\t\t\t\t\t\t\tsignal: searchAbort.signal,\n\t\t\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn toCuratorSearchEntries(response);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonAddSearchResults(entries) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) return;\n\t\t\t\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\t\t\t\tcollected.set(entry.queryIndex, indexedCuratorEntryToQueryResult(entry));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tasync onRewriteQuery(query, rewriteSignal) {\n\t\t\t\t\t\t\tif (commandHandle && !isCommandActive()) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Curator session is no longer active.\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn rewriteSearchQuery(query, summaryContext, rewriteSignal);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tcommandHandle = handle;\n\t\t\t\tactiveCurators.set(commandCallId, handle);\n\t\t\t\tlet browserOpenError: string | null = null;\n\t\t\t\tif (!shouldAutoOpenCuratorBrowser(loadConfig())) {\n\t\t\t\t\tctx.ui.notify(`Search curator is running. Open manually: ${handle.url}`, \"info\");\n\t\t\t\t} else {\n\t\t\t\t\tconst open = platform() === \"darwin\" ? await getGlimpseOpen() : null;\n\t\t\t\t\tif (open) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst win = openInGlimpse(open, handle.url, \"Search Curator\");\n\t\t\t\t\t\t\tglimpseWins.set(commandCallId, win);\n\t\t\t\t\t\t\twin.on(\"closed\", () => {\n\t\t\t\t\t\t\t\tif (glimpseWins.get(commandCallId) === win) {\n\t\t\t\t\t\t\t\t\tglimpseWins.delete(commandCallId);\n\t\t\t\t\t\t\t\t\tcloseCurator(commandCallId);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\tconsole.error(`Failed to open Glimpse curator window: ${message}`);\n\t\t\t\t\t\t\tglimpseWins.delete(commandCallId);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait openInBrowser(pi, handle.url);\n\t\t\t\t\t\t\t} catch (browserErr) {\n\t\t\t\t\t\t\t\tbrowserOpenError = browserErr instanceof Error ? browserErr.message : String(browserErr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait openInBrowser(pi, handle.url);\n\t\t\t\t\t\t} catch (browserErr) {\n\t\t\t\t\t\t\tbrowserOpenError = browserErr instanceof Error ? browserErr.message : String(browserErr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (browserOpenError) {\n\t\t\t\t\t\tconsole.error(`Failed to open curator UI: ${browserOpenError}`);\n\t\t\t\t\t\tctx.ui.notify(`Search curator is running, but the browser did not open automatically. Open manually: ${handle.url}`, \"info\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (queries.length > 0) {\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\tlet nextResultIndex = queries.length;\n\t\t\t\t\t\tfor (let qi = 0; qi < queries.length; qi++) {\n\t\t\t\t\t\t\tif (aborted || !isCommandActive()) break;\n\t\t\t\t\t\t\tconst requestedProvider = currentSearchProvider;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst response = await search(queries[qi], {\n\t\t\t\t\t\t\t\t\tprovider: requestedProvider,\n\t\t\t\t\t\t\t\t\tsignal: searchAbort.signal,\n\t\t\t\t\t\t\t\t\textensionContext: ctx,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (aborted || !isCommandActive()) break;\n\t\t\t\t\t\t\t\tconst entries = toCuratorSearchEntries(response);\n\t\t\t\t\t\t\t\tfor (let entryIndex = 0; entryIndex < entries.length; entryIndex++) {\n\t\t\t\t\t\t\t\t\tconst entry = entries[entryIndex];\n\t\t\t\t\t\t\t\t\tconst resultIndex = entryIndex === 0 ? qi : nextResultIndex++;\n\t\t\t\t\t\t\t\t\tconst indexedEntry: IndexedCuratorSearchEntry = {\n\t\t\t\t\t\t\t\t\t\t...entry,\n\t\t\t\t\t\t\t\t\t\tqueryIndex: resultIndex,\n\t\t\t\t\t\t\t\t\t\tquery: queries[qi],\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tcollected.set(resultIndex, indexedCuratorEntryToQueryResult(indexedEntry));\n\t\t\t\t\t\t\t\t\tif (entry.error) {\n\t\t\t\t\t\t\t\t\t\thandle.pushError(resultIndex, entry.error, entry.provider, { query: queries[qi], slotIndex: qi });\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\thandle.pushResult(resultIndex, { ...entry, query: queries[qi], slotIndex: qi });\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\tif (aborted || !isCommandActive()) break;\n\t\t\t\t\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\t\t\t\t\tconst failedProvider = toCuratorProvider(requestedProvider);\n\t\t\t\t\t\t\t\thandle.pushError(qi, message, failedProvider, { query: queries[qi], slotIndex: qi });\n\t\t\t\t\t\t\t\tcollected.set(qi, { query: queries[qi], answer: \"\", results: [], error: message, provider: failedProvider });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!aborted && isCommandActive()) handle.searchesDone();\n\t\t\t\t\t})();\n\t\t\t\t} else {\n\t\t\t\t\tif (isCommandActive()) handle.searchesDone();\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tcloseCurator(commandCallId);\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\tctx.ui.notify(`Failed to open curator: ${message}`, \"error\");\n\t\t\t}\n\t\t},\n\t});\n\n\tif (isCommandEnabled(initConfig, \"curator\")) pi.registerCommand(\"curator\", {\n\t\tdescription: \"Toggle or configure the search curator workflow\",\n\t\thandler: async (args, ctx) => {\n\t\t\tconst arg = args.trim().toLowerCase();\n\n\t\t\tlet newWorkflow: WebSearchWorkflow;\n\t\t\tif (arg.length === 0) {\n\t\t\t\tconst current = resolveWorkflow(loadConfigForExtensionInit().workflow, true);\n\t\t\t\tnewWorkflow = current === \"none\" ? \"summary-review\" : \"none\";\n\t\t\t} else if (arg === \"on\") {\n\t\t\t\tnewWorkflow = \"summary-review\";\n\t\t\t} else if (arg === \"off\") {\n\t\t\t\tnewWorkflow = \"none\";\n\t\t\t} else if (arg === \"none\" || arg === \"summary-review\" || arg === \"auto-summary\") {\n\t\t\t\tnewWorkflow = arg;\n\t\t\t} else {\n\t\t\t\tctx.ui.notify(`Unknown option: ${arg}. Use on, off, summary-review, or auto-summary.`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tsaveConfig({ workflow: newWorkflow });\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\t\tctx.ui.notify(`Failed to save config: ${message}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst label = newWorkflow === \"none\"\n\t\t\t\t? `Curator disabled — ${toolNames.webSearch} will return raw results`\n\t\t\t\t: newWorkflow === \"auto-summary\"\n\t\t\t\t\t? `Auto-summary enabled — ${toolNames.webSearch} will generate a summary without opening the curator`\n\t\t\t\t\t: `Curator enabled — ${toolNames.webSearch} will open curator and auto-generate a summary draft`;\n\t\t\tpi.sendMessage({\n\t\t\t\tcustomType: \"curator-config\",\n\t\t\t\tcontent: [{ type: \"text\", text: label }],\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: { workflow: newWorkflow },\n\t\t\t}, { triggerTurn: false, deliverAs: \"followUp\" });\n\t\t},\n\t});\n\n\tif (isCommandEnabled(initConfig, \"google-account\")) pi.registerCommand(\"google-account\", {\n\t\tdescription: \"Show the active Google account for Gemini Web\",\n\t\thandler: async () => {\n\t\t\tif (!isBrowserCookieAccessAllowed()) {\n\t\t\t\tpi.sendMessage({\n\t\t\t\t\tcustomType: \"google-account\",\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Gemini Web browser cookie access is disabled. Set allowBrowserCookies: true in ${WEB_SEARCH_CONFIG_PATH} to enable it.` }],\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: { available: false, cookieAccessAllowed: false },\n\t\t\t\t}, { triggerTurn: true, deliverAs: \"followUp\" });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst cookies = await isGeminiWebAvailable();\n\t\t\tif (!cookies) {\n\t\t\t\tconst diagnostic = getGeminiWebAvailabilityDiagnostic();\n\t\t\t\tconst diagnosticDetails = getGeminiWebAvailabilityDiagnosticDetails();\n\t\t\t\tconst attempted = formatCookieAttempts(diagnosticDetails?.attempts ?? []);\n\t\t\t\tconst text = diagnostic\n\t\t\t\t\t? `Gemini Web is unavailable: ${diagnostic}${attempted ? ` Attempted browser profiles: ${attempted}.` : \"\"}`\n\t\t\t\t\t: \"Gemini Web is unavailable. Sign into gemini.google.com in a supported Chromium-based browser.\";\n\t\t\t\tpi.sendMessage({\n\t\t\t\t\tcustomType: \"google-account\",\n\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tdetails: { available: false, cookieAccessAllowed: true, diagnostic, cookieDiagnostic: diagnosticDetails },\n\t\t\t\t}, { triggerTurn: true, deliverAs: \"followUp\" });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst email = await getActiveGoogleEmail(cookies);\n\t\t\tconst text = email\n\t\t\t\t? `Active Google account: ${email}`\n\t\t\t\t: \"Gemini Web is available, but the active Google account could not be determined.\";\n\n\t\t\tpi.sendMessage({\n\t\t\t\tcustomType: \"google-account\",\n\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: { available: true, email: email ?? null },\n\t\t\t}, { triggerTurn: true, deliverAs: \"followUp\" });\n\t\t},\n\t});\n\n\tfunction formatCookieAttempts(attempts: { browser: string; profile: string; status: string }[]): string {\n\t\treturn attempts.map(({ browser, profile, status }) => `${browser}/${profile} (${status})`).join(\", \");\n\t}\n\n\tif (isCommandEnabled(initConfig, \"search\")) pi.registerCommand(\"search\", {\n\t\tdescription: \"Browse stored web search results\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tconst results = getAllResults();\n\n\t\t\tif (results.length === 0) {\n\t\t\t\tctx.ui.notify(\"No stored search results\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst options = results.map((r) => {\n\t\t\t\tconst age = Math.floor((Date.now() - r.timestamp) / 60000);\n\t\t\t\tconst ageStr = age < 60 ? `${age}m ago` : `${Math.floor(age / 60)}h ago`;\n\t\t\t\tif (r.type === \"search\" && r.queries) {\n\t\t\t\t\tconst query = r.queries[0]?.query || \"unknown\";\n\t\t\t\t\treturn `[${r.id.slice(0, 6)}] \"${query}\" (${r.queries.length} queries) - ${ageStr}`;\n\t\t\t\t}\n\t\t\t\tif (r.type === \"fetch\" && (r.urls || r.urlMetadata)) {\n\t\t\t\t\treturn `[${r.id.slice(0, 6)}] ${(r.urls ?? r.urlMetadata ?? []).length} URLs fetched - ${ageStr}`;\n\t\t\t\t}\n\t\t\t\treturn `[${r.id.slice(0, 6)}] ${r.type} - ${ageStr}`;\n\t\t\t});\n\n\t\t\tconst choice = await ctx.ui.select(\"Stored Search Results\", options);\n\t\t\tif (!choice) return;\n\n\t\t\tconst match = choice.match(/^\\[([a-z0-9]+)\\]/);\n\t\t\tif (!match) return;\n\n\t\t\tconst selected = results.find((r) => r.id.startsWith(match[1]));\n\t\t\tif (!selected) return;\n\n\t\t\tconst actions = [\"View details\", \"Delete\"];\n\t\t\tconst action = await ctx.ui.select(`Result ${selected.id.slice(0, 6)}`, actions);\n\n\t\t\tif (action === \"Delete\") {\n\t\t\t\tdeleteResult(selected.id);\n\t\t\t\tctx.ui.notify(`Deleted ${selected.id.slice(0, 6)}`, \"info\");\n\t\t\t} else if (action === \"View details\") {\n\t\t\t\tlet info = `ID: ${selected.id}\\nType: ${selected.type}\\nAge: ${Math.floor((Date.now() - selected.timestamp) / 60000)}m\\n\\n`;\n\t\t\t\tif (selected.type === \"search\" && selected.queries) {\n\t\t\t\t\tinfo += \"Queries:\\n\";\n\t\t\t\t\tconst queries = selected.queries.slice(0, 10);\n\t\t\t\t\tfor (const q of queries) {\n\t\t\t\t\t\tinfo += `- \"${q.query}\" (${q.results.length} results)\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tif (selected.queries.length > 10) {\n\t\t\t\t\t\tinfo += `... and ${selected.queries.length - 10} more\\n`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (selected.type === \"fetch\" && (selected.urls || selected.urlMetadata)) {\n\t\t\t\t\tinfo += \"URLs:\\n\";\n\t\t\t\t\tconst urlItems = selected.urls ?? selected.urlMetadata ?? [];\n\t\t\t\t\tconst urls = urlItems.slice(0, 10);\n\t\t\t\t\tfor (const u of urls) {\n\t\t\t\t\t\tconst urlDisplay = u.url.length > 50 ? u.url.slice(0, 47) + \"...\" : u.url;\n\t\t\t\t\t\tconst contentLength = \"content\" in u ? u.content.length : u.contentLength;\n\t\t\t\t\t\tinfo += `- ${urlDisplay} (${u.error || `${contentLength} chars`})\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tif (urlItems.length > 10) {\n\t\t\t\t\t\tinfo += `... and ${urlItems.length - 10} more\\n`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tctx.ui.notify(info, \"info\");\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
|