@herbertgao/pi-extensions 2026.8.2 → 2026.8.3
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/README.md +9 -2
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +6 -8
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +5 -7
- package/node_modules/@herbertgao/pi-cc-extensions/assets/readme/hero.en.svg +101 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +1 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +5 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/{utils/agent-summary.ts → feature/agent-summary/core.ts} +37 -35
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-summary.ts → agent-summary/index.ts} +2 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference.ts → reference/index.ts} +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{agent-autocomplete.ts → reference/subagent.ts} +19 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-startup-header.ts → shell/startup-header.ts} +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{working-message.ts → shell/working-message.ts} +5 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/index.ts +32 -28
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +379 -85
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/default-mode.ts +727 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/index.ts +65 -775
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/{feature → renderer}/markdown-enhance.ts +35 -31
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-hover.ts → mouse/hover.ts} +5 -5
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-interaction.ts → mouse/interaction.ts} +34 -35
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-layout.ts → mouse/layout.ts} +5 -21
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-packets.ts → mouse/packets.ts} +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{mouse-scroll.ts → mouse/scroll.ts} +48 -37
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ansi-utils.ts +56 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-renderer.ts +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/line-width-safety.ts +1 -1
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/write-display-utils.ts +12 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/write-execution.ts +1 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-grouping.ts → tool/grouping.ts} +18 -8
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-result.ts → tool/result.ts} +4 -13
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/utils/fullscreen-detect.ts +0 -27
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
- package/node_modules/@herbertgao/pi-subagents/package.json +2 -2
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +1 -0
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +3 -1
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +33 -35
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +26 -35
- package/node_modules/@herbertgao/pi-subagents/src/prompts.ts +15 -1
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +19 -0
- package/node_modules/pi-mcp-adapter/README.md +19 -4
- package/node_modules/pi-mcp-adapter/agent-dir.ts +40 -0
- package/node_modules/pi-mcp-adapter/commands.ts +12 -2
- package/node_modules/pi-mcp-adapter/direct-tools.ts +6 -8
- package/node_modules/pi-mcp-adapter/index.ts +15 -3
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +87 -4
- package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +138 -61
- package/node_modules/pi-mcp-adapter/mcp-oauth-provider.ts +43 -4
- package/node_modules/pi-mcp-adapter/oauth.ts +48 -0
- package/node_modules/pi-mcp-adapter/package.json +8 -2
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +8 -10
- package/node_modules/pi-mcp-adapter/tool-registrar.ts +187 -3
- package/node_modules/pi-mcp-adapter/types.ts +2 -0
- package/node_modules/pi-web-access/CHANGELOG.md +45 -0
- package/node_modules/pi-web-access/README.md +104 -29
- package/node_modules/pi-web-access/bocha.ts +221 -0
- package/node_modules/pi-web-access/curator-page.ts +113 -12
- package/node_modules/pi-web-access/curator-server.ts +56 -20
- package/node_modules/pi-web-access/datalab-pdf-extract.ts +568 -0
- package/node_modules/pi-web-access/duckduckgo.ts +123 -0
- package/node_modules/pi-web-access/extract.ts +288 -143
- package/node_modules/pi-web-access/feature-config.ts +29 -0
- package/node_modules/pi-web-access/gemini-api.ts +4 -0
- package/node_modules/pi-web-access/gemini-search.ts +45 -12
- package/node_modules/pi-web-access/gemini-web.ts +68 -3
- package/node_modules/pi-web-access/index.ts +160 -71
- package/node_modules/pi-web-access/jina-search.ts +284 -0
- package/node_modules/pi-web-access/kagi.ts +12 -12
- package/node_modules/pi-web-access/openai-search.ts +12 -2
- package/node_modules/pi-web-access/package.json +4 -3
- package/node_modules/pi-web-access/pdf-extract.ts +327 -228
- package/node_modules/pi-web-access/storage.ts +440 -2
- package/node_modules/pi-web-access/summary-model-scope.ts +1 -1
- package/node_modules/pi-web-access/summary-review.ts +4 -2
- package/node_modules/pi-web-access/video-extract.ts +10 -8
- package/node_modules/pi-web-access/xai-search.ts +12 -2
- package/node_modules/pi-web-access/youtube-extract.ts +2 -1
- package/node_modules/remote-pi/LICENSE +21 -0
- package/node_modules/remote-pi/README.md +675 -0
- package/node_modules/remote-pi/dist/actions/handlers.d.ts +122 -0
- package/node_modules/remote-pi/dist/actions/handlers.js +160 -0
- package/node_modules/remote-pi/dist/actions/handlers.js.map +1 -0
- package/node_modules/remote-pi/dist/actions/registry.d.ts +39 -0
- package/node_modules/remote-pi/dist/actions/registry.js +58 -0
- package/node_modules/remote-pi/dist/actions/registry.js.map +1 -0
- package/node_modules/remote-pi/dist/bin/supervisord.d.ts +2 -0
- package/node_modules/remote-pi/dist/bin/supervisord.js +86 -0
- package/node_modules/remote-pi/dist/bin/supervisord.js.map +1 -0
- package/node_modules/remote-pi/dist/commands/builtin_mirror.d.ts +58 -0
- package/node_modules/remote-pi/dist/commands/builtin_mirror.js +71 -0
- package/node_modules/remote-pi/dist/commands/builtin_mirror.js.map +1 -0
- package/node_modules/remote-pi/dist/commands/list_commands.d.ts +60 -0
- package/node_modules/remote-pi/dist/commands/list_commands.js +73 -0
- package/node_modules/remote-pi/dist/commands/list_commands.js.map +1 -0
- package/node_modules/remote-pi/dist/config.d.ts +62 -0
- package/node_modules/remote-pi/dist/config.js +115 -0
- package/node_modules/remote-pi/dist/config.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/client.d.ts +20 -0
- package/node_modules/remote-pi/dist/daemon/client.js +131 -0
- package/node_modules/remote-pi/dist/daemon/client.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/control_protocol.d.ts +176 -0
- package/node_modules/remote-pi/dist/daemon/control_protocol.js +63 -0
- package/node_modules/remote-pi/dist/daemon/control_protocol.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/cron_log.d.ts +45 -0
- package/node_modules/remote-pi/dist/daemon/cron_log.js +72 -0
- package/node_modules/remote-pi/dist/daemon/cron_log.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/cron_registry.d.ts +80 -0
- package/node_modules/remote-pi/dist/daemon/cron_registry.js +194 -0
- package/node_modules/remote-pi/dist/daemon/cron_registry.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/id.d.ts +24 -0
- package/node_modules/remote-pi/dist/daemon/id.js +36 -0
- package/node_modules/remote-pi/dist/daemon/id.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/install.d.ts +170 -0
- package/node_modules/remote-pi/dist/daemon/install.js +547 -0
- package/node_modules/remote-pi/dist/daemon/install.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/registry.d.ts +63 -0
- package/node_modules/remote-pi/dist/daemon/registry.js +153 -0
- package/node_modules/remote-pi/dist/daemon/registry.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/rpc_child.d.ts +194 -0
- package/node_modules/remote-pi/dist/daemon/rpc_child.js +389 -0
- package/node_modules/remote-pi/dist/daemon/rpc_child.js.map +1 -0
- package/node_modules/remote-pi/dist/daemon/supervisor.d.ts +93 -0
- package/node_modules/remote-pi/dist/daemon/supervisor.js +596 -0
- package/node_modules/remote-pi/dist/daemon/supervisor.js.map +1 -0
- package/node_modules/remote-pi/dist/extension_ui_bridge.d.ts +26 -0
- package/node_modules/remote-pi/dist/extension_ui_bridge.js +341 -0
- package/node_modules/remote-pi/dist/extension_ui_bridge.js.map +1 -0
- package/node_modules/remote-pi/dist/index.d.ts +213 -0
- package/node_modules/remote-pi/dist/index.js +4996 -0
- package/node_modules/remote-pi/dist/index.js.map +1 -0
- package/node_modules/remote-pi/dist/mcp/mesh_result.d.ts +10 -0
- package/node_modules/remote-pi/dist/mcp/mesh_result.js +42 -0
- package/node_modules/remote-pi/dist/mcp/mesh_result.js.map +1 -0
- package/node_modules/remote-pi/dist/mcp/mesh_server.d.ts +16 -0
- package/node_modules/remote-pi/dist/mcp/mesh_server.js +327 -0
- package/node_modules/remote-pi/dist/mcp/mesh_server.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/canonical.d.ts +30 -0
- package/node_modules/remote-pi/dist/mesh/canonical.js +61 -0
- package/node_modules/remote-pi/dist/mesh/canonical.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/client.d.ts +18 -0
- package/node_modules/remote-pi/dist/mesh/client.js +125 -0
- package/node_modules/remote-pi/dist/mesh/client.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/encoding.d.ts +38 -0
- package/node_modules/remote-pi/dist/mesh/encoding.js +216 -0
- package/node_modules/remote-pi/dist/mesh/encoding.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/self_revoke.d.ts +73 -0
- package/node_modules/remote-pi/dist/mesh/self_revoke.js +401 -0
- package/node_modules/remote-pi/dist/mesh/self_revoke.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/siblings.d.ts +49 -0
- package/node_modules/remote-pi/dist/mesh/siblings.js +159 -0
- package/node_modules/remote-pi/dist/mesh/siblings.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/types.d.ts +34 -0
- package/node_modules/remote-pi/dist/mesh/types.js +11 -0
- package/node_modules/remote-pi/dist/mesh/types.js.map +1 -0
- package/node_modules/remote-pi/dist/mesh/verify.d.ts +17 -0
- package/node_modules/remote-pi/dist/mesh/verify.js +86 -0
- package/node_modules/remote-pi/dist/mesh/verify.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/crypto.d.ts +8 -0
- package/node_modules/remote-pi/dist/pairing/crypto.js +22 -0
- package/node_modules/remote-pi/dist/pairing/crypto.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/handshake.d.ts +28 -0
- package/node_modules/remote-pi/dist/pairing/handshake.js +113 -0
- package/node_modules/remote-pi/dist/pairing/handshake.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/noise-sha256.d.ts +16 -0
- package/node_modules/remote-pi/dist/pairing/noise-sha256.js +103 -0
- package/node_modules/remote-pi/dist/pairing/noise-sha256.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/qr.d.ts +59 -0
- package/node_modules/remote-pi/dist/pairing/qr.js +125 -0
- package/node_modules/remote-pi/dist/pairing/qr.js.map +1 -0
- package/node_modules/remote-pi/dist/pairing/storage.d.ts +120 -0
- package/node_modules/remote-pi/dist/pairing/storage.js +604 -0
- package/node_modules/remote-pi/dist/pairing/storage.js.map +1 -0
- package/node_modules/remote-pi/dist/protocol/codec.d.ts +7 -0
- package/node_modules/remote-pi/dist/protocol/codec.js +49 -0
- package/node_modules/remote-pi/dist/protocol/codec.js.map +1 -0
- package/node_modules/remote-pi/dist/protocol/types.d.ts +393 -0
- package/node_modules/remote-pi/dist/protocol/types.js +2 -0
- package/node_modules/remote-pi/dist/protocol/types.js.map +1 -0
- package/node_modules/remote-pi/dist/rooms.d.ts +29 -0
- package/node_modules/remote-pi/dist/rooms.js +57 -0
- package/node_modules/remote-pi/dist/rooms.js.map +1 -0
- package/node_modules/remote-pi/dist/session/address.d.ts +49 -0
- package/node_modules/remote-pi/dist/session/address.js +58 -0
- package/node_modules/remote-pi/dist/session/address.js.map +1 -0
- package/node_modules/remote-pi/dist/session/agent_bridge.d.ts +55 -0
- package/node_modules/remote-pi/dist/session/agent_bridge.js +146 -0
- package/node_modules/remote-pi/dist/session/agent_bridge.js.map +1 -0
- package/node_modules/remote-pi/dist/session/bridge.d.ts +37 -0
- package/node_modules/remote-pi/dist/session/bridge.js +130 -0
- package/node_modules/remote-pi/dist/session/bridge.js.map +1 -0
- package/node_modules/remote-pi/dist/session/broker.d.ts +189 -0
- package/node_modules/remote-pi/dist/session/broker.js +507 -0
- package/node_modules/remote-pi/dist/session/broker.js.map +1 -0
- package/node_modules/remote-pi/dist/session/broker_remote.d.ts +74 -0
- package/node_modules/remote-pi/dist/session/broker_remote.js +583 -0
- package/node_modules/remote-pi/dist/session/broker_remote.js.map +1 -0
- package/node_modules/remote-pi/dist/session/cwd_lock.d.ts +33 -0
- package/node_modules/remote-pi/dist/session/cwd_lock.js +126 -0
- package/node_modules/remote-pi/dist/session/cwd_lock.js.map +1 -0
- package/node_modules/remote-pi/dist/session/envelope.d.ts +33 -0
- package/node_modules/remote-pi/dist/session/envelope.js +117 -0
- package/node_modules/remote-pi/dist/session/envelope.js.map +1 -0
- package/node_modules/remote-pi/dist/session/global_config.d.ts +33 -0
- package/node_modules/remote-pi/dist/session/global_config.js +73 -0
- package/node_modules/remote-pi/dist/session/global_config.js.map +1 -0
- package/node_modules/remote-pi/dist/session/ipc.d.ts +27 -0
- package/node_modules/remote-pi/dist/session/ipc.js +22 -0
- package/node_modules/remote-pi/dist/session/ipc.js.map +1 -0
- package/node_modules/remote-pi/dist/session/leader_election.d.ts +32 -0
- package/node_modules/remote-pi/dist/session/leader_election.js +106 -0
- package/node_modules/remote-pi/dist/session/leader_election.js.map +1 -0
- package/node_modules/remote-pi/dist/session/local_config.d.ts +55 -0
- package/node_modules/remote-pi/dist/session/local_config.js +157 -0
- package/node_modules/remote-pi/dist/session/local_config.js.map +1 -0
- package/node_modules/remote-pi/dist/session/mesh_message.d.ts +20 -0
- package/node_modules/remote-pi/dist/session/mesh_message.js +28 -0
- package/node_modules/remote-pi/dist/session/mesh_message.js.map +1 -0
- package/node_modules/remote-pi/dist/session/mesh_node.d.ts +116 -0
- package/node_modules/remote-pi/dist/session/mesh_node.js +573 -0
- package/node_modules/remote-pi/dist/session/mesh_node.js.map +1 -0
- package/node_modules/remote-pi/dist/session/peer.d.ts +139 -0
- package/node_modules/remote-pi/dist/session/peer.js +451 -0
- package/node_modules/remote-pi/dist/session/peer.js.map +1 -0
- package/node_modules/remote-pi/dist/session/peer_inventory.d.ts +13 -0
- package/node_modules/remote-pi/dist/session/peer_inventory.js +48 -0
- package/node_modules/remote-pi/dist/session/peer_inventory.js.map +1 -0
- package/node_modules/remote-pi/dist/session/peer_limits.d.ts +9 -0
- package/node_modules/remote-pi/dist/session/peer_limits.js +21 -0
- package/node_modules/remote-pi/dist/session/peer_limits.js.map +1 -0
- package/node_modules/remote-pi/dist/session/setup_wizard.d.ts +39 -0
- package/node_modules/remote-pi/dist/session/setup_wizard.js +63 -0
- package/node_modules/remote-pi/dist/session/setup_wizard.js.map +1 -0
- package/node_modules/remote-pi/dist/session/tool_gate.d.ts +5 -0
- package/node_modules/remote-pi/dist/session/tool_gate.js +11 -0
- package/node_modules/remote-pi/dist/session/tool_gate.js.map +1 -0
- package/node_modules/remote-pi/dist/session/tools.d.ts +24 -0
- package/node_modules/remote-pi/dist/session/tools.js +252 -0
- package/node_modules/remote-pi/dist/session/tools.js.map +1 -0
- package/node_modules/remote-pi/dist/session/wizard.d.ts +13 -0
- package/node_modules/remote-pi/dist/session/wizard.js +20 -0
- package/node_modules/remote-pi/dist/session/wizard.js.map +1 -0
- package/node_modules/remote-pi/dist/settings.d.ts +15 -0
- package/node_modules/remote-pi/dist/settings.js +52 -0
- package/node_modules/remote-pi/dist/settings.js.map +1 -0
- package/node_modules/remote-pi/dist/transport/peer_channel.d.ts +37 -0
- package/node_modules/remote-pi/dist/transport/peer_channel.js +98 -0
- package/node_modules/remote-pi/dist/transport/peer_channel.js.map +1 -0
- package/node_modules/remote-pi/dist/transport/pi_forward_client.d.ts +29 -0
- package/node_modules/remote-pi/dist/transport/pi_forward_client.js +62 -0
- package/node_modules/remote-pi/dist/transport/pi_forward_client.js.map +1 -0
- package/node_modules/remote-pi/dist/transport/relay_client.d.ts +91 -0
- package/node_modules/remote-pi/dist/transport/relay_client.js +206 -0
- package/node_modules/remote-pi/dist/transport/relay_client.js.map +1 -0
- package/node_modules/remote-pi/dist/ui/footer.d.ts +32 -0
- package/node_modules/remote-pi/dist/ui/footer.js +34 -0
- package/node_modules/remote-pi/dist/ui/footer.js.map +1 -0
- package/node_modules/remote-pi/docs/daemon.md +289 -0
- package/node_modules/remote-pi/package.json +88 -0
- package/node_modules/remote-pi/service-templates/launchd.plist.template +35 -0
- package/node_modules/remote-pi/service-templates/systemd.service.template +19 -0
- package/node_modules/remote-pi/service-templates/task-launcher.vbs.template +10 -0
- package/node_modules/remote-pi/service-templates/task-scheduler.xml.template +38 -0
- package/node_modules/remote-pi/skills/agent-network/SKILL.md +310 -0
- package/package.json +19 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool-diff/write-display-utils.ts +0 -29
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{session-reference-core.ts → reference/session.ts} +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/{pi-aliases.ts → shell/aliases.ts} +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/ATTRIBUTION.md +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/diff-presentation.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/index.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/render-utils.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/shiki-highlight.ts +0 -0
- /package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/{tool-diff → tool/diff}/types.ts +0 -0
|
@@ -8,7 +8,7 @@ function safeInlineJSON(data: unknown): string {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
function buildProviderButtons(
|
|
11
|
-
available: { all: boolean; openai: boolean; brave: boolean; parallel: boolean; tinyfish: boolean; search1api: boolean; searchinfinity: boolean; querit: boolean; tavily: boolean; serpdive: boolean; kagi: boolean; ollama: boolean; searxng: boolean; perplexity: boolean; exa: boolean; gemini: boolean; anysearch: boolean; xai: boolean; brightdata: boolean; serpbase: boolean },
|
|
11
|
+
available: { all: boolean; openai: boolean; brave: boolean; parallel: boolean; tinyfish: boolean; search1api: boolean; searchinfinity: boolean; querit: boolean; tavily: boolean; jina: boolean; serpdive: boolean; kagi: boolean; bocha: boolean; ollama: boolean; searxng: boolean; duckduckgo: boolean; perplexity: boolean; exa: boolean; gemini: boolean; anysearch: boolean; xai: boolean; brightdata: boolean; serpbase: boolean },
|
|
12
12
|
selected: string,
|
|
13
13
|
hasInitialQueries: boolean,
|
|
14
14
|
): string {
|
|
@@ -23,10 +23,13 @@ function buildProviderButtons(
|
|
|
23
23
|
{ value: "searchinfinity", label: "Searchinfinity", available: available.searchinfinity },
|
|
24
24
|
{ value: "querit", label: "Querit", available: available.querit },
|
|
25
25
|
{ value: "tavily", label: "Tavily", available: available.tavily },
|
|
26
|
+
{ value: "jina", label: "Jina", available: available.jina },
|
|
26
27
|
{ value: "serpdive", label: "SERPdive", available: available.serpdive },
|
|
27
28
|
{ value: "kagi", label: "Kagi", available: available.kagi },
|
|
29
|
+
{ value: "bocha", label: "Bocha", available: available.bocha },
|
|
28
30
|
{ value: "ollama", label: "Ollama", available: available.ollama },
|
|
29
31
|
{ value: "searxng", label: "SearXNG", available: available.searxng },
|
|
32
|
+
{ value: "duckduckgo", label: "DuckDuckGo", available: available.duckduckgo },
|
|
30
33
|
{ value: "perplexity", label: "Perplexity", available: available.perplexity },
|
|
31
34
|
{ value: "gemini", label: "Gemini", available: available.gemini },
|
|
32
35
|
{ value: "anysearch", label: "AnySearch", available: available.anysearch },
|
|
@@ -51,7 +54,7 @@ export function generateCuratorPage(
|
|
|
51
54
|
queries: string[],
|
|
52
55
|
sessionToken: string,
|
|
53
56
|
timeout: number,
|
|
54
|
-
availableProviders: { all: boolean; openai: boolean; brave: boolean; parallel: boolean; tinyfish: boolean; search1api: boolean; searchinfinity: boolean; querit: boolean; tavily: boolean; serpdive: boolean; kagi: boolean; ollama: boolean; searxng: boolean; perplexity: boolean; exa: boolean; gemini: boolean; anysearch: boolean; xai: boolean; brightdata: boolean; serpbase: boolean },
|
|
57
|
+
availableProviders: { all: boolean; openai: boolean; brave: boolean; parallel: boolean; tinyfish: boolean; search1api: boolean; searchinfinity: boolean; querit: boolean; tavily: boolean; jina: boolean; serpdive: boolean; kagi: boolean; bocha: boolean; ollama: boolean; searxng: boolean; duckduckgo: boolean; perplexity: boolean; exa: boolean; gemini: boolean; anysearch: boolean; xai: boolean; brightdata: boolean; serpbase: boolean },
|
|
55
58
|
defaultProvider: string,
|
|
56
59
|
searchProvider: string,
|
|
57
60
|
summaryModels: Array<{ value: string; label: string }>,
|
|
@@ -714,6 +717,11 @@ main {
|
|
|
714
717
|
background: rgba(166, 227, 161, 0.14);
|
|
715
718
|
border-color: rgba(166, 227, 161, 0.3);
|
|
716
719
|
}
|
|
720
|
+
.provider-tag.provider-jina {
|
|
721
|
+
color: #f9e2af;
|
|
722
|
+
background: rgba(249, 226, 175, 0.14);
|
|
723
|
+
border-color: rgba(249, 226, 175, 0.3);
|
|
724
|
+
}
|
|
717
725
|
.provider-tag.provider-serpdive {
|
|
718
726
|
color: #94e2d5;
|
|
719
727
|
background: rgba(148, 226, 213, 0.14);
|
|
@@ -1447,7 +1455,7 @@ const SCRIPT = `(function() {
|
|
|
1447
1455
|
var token = DATA.sessionToken;
|
|
1448
1456
|
var timeoutSec = DATA.timeout;
|
|
1449
1457
|
var queries = Array.isArray(DATA.queries) ? DATA.queries : [];
|
|
1450
|
-
var providers = ["all", "openai", "exa", "brave", "parallel", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "serpdive", "kagi", "ollama", "searxng", "perplexity", "gemini", "anysearch", "xai", "brightdata", "serpbase"];
|
|
1458
|
+
var providers = ["all", "openai", "exa", "brave", "parallel", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "jina", "serpdive", "kagi", "bocha", "ollama", "searxng", "duckduckgo", "perplexity", "gemini", "anysearch", "xai", "brightdata", "serpbase"];
|
|
1451
1459
|
var availProviders = DATA.availableProviders && typeof DATA.availableProviders === "object" ? DATA.availableProviders : {};
|
|
1452
1460
|
var workflow = "summary-review";
|
|
1453
1461
|
var initialDefaultProvider = typeof DATA.defaultProvider === "string" ? DATA.defaultProvider : "exa";
|
|
@@ -1475,6 +1483,9 @@ const SCRIPT = `(function() {
|
|
|
1475
1483
|
var lastInteraction = Date.now();
|
|
1476
1484
|
var completedCount = 0;
|
|
1477
1485
|
var es = null;
|
|
1486
|
+
var lastLiveEventAt = Date.now();
|
|
1487
|
+
var stateSyncInFlight = false;
|
|
1488
|
+
var liveUpdateWarning = false;
|
|
1478
1489
|
|
|
1479
1490
|
var allQueries = queries.map(function(query, slotId) { return { slotId: slotId, query: query }; });
|
|
1480
1491
|
var nextSlotId = queries.length;
|
|
@@ -1656,10 +1667,13 @@ const SCRIPT = `(function() {
|
|
|
1656
1667
|
if (provider === "searchinfinity") return "Searchinfinity";
|
|
1657
1668
|
if (provider === "querit") return "Querit";
|
|
1658
1669
|
if (provider === "tavily") return "Tavily";
|
|
1670
|
+
if (provider === "jina") return "Jina";
|
|
1659
1671
|
if (provider === "serpdive") return "SERPdive";
|
|
1660
1672
|
if (provider === "kagi") return "Kagi";
|
|
1673
|
+
if (provider === "bocha") return "Bocha";
|
|
1661
1674
|
if (provider === "ollama") return "Ollama";
|
|
1662
1675
|
if (provider === "searxng") return "SearXNG";
|
|
1676
|
+
if (provider === "duckduckgo") return "DuckDuckGo";
|
|
1663
1677
|
if (provider === "perplexity") return "Perplexity";
|
|
1664
1678
|
if (provider === "exa") return "Exa";
|
|
1665
1679
|
if (provider === "gemini") return "Gemini";
|
|
@@ -1942,17 +1956,30 @@ const SCRIPT = `(function() {
|
|
|
1942
1956
|
}
|
|
1943
1957
|
|
|
1944
1958
|
function clearError() {
|
|
1959
|
+
liveUpdateWarning = false;
|
|
1945
1960
|
if (!errorBanner) return;
|
|
1946
1961
|
errorBanner.hidden = true;
|
|
1947
1962
|
errorBanner.textContent = "";
|
|
1948
1963
|
}
|
|
1949
1964
|
|
|
1950
1965
|
function setError(text) {
|
|
1966
|
+
liveUpdateWarning = false;
|
|
1967
|
+
if (!errorBanner) return;
|
|
1968
|
+
errorBanner.textContent = text;
|
|
1969
|
+
errorBanner.hidden = false;
|
|
1970
|
+
}
|
|
1971
|
+
|
|
1972
|
+
function setLiveUpdateWarning(text) {
|
|
1973
|
+
liveUpdateWarning = true;
|
|
1951
1974
|
if (!errorBanner) return;
|
|
1952
1975
|
errorBanner.textContent = text;
|
|
1953
1976
|
errorBanner.hidden = false;
|
|
1954
1977
|
}
|
|
1955
1978
|
|
|
1979
|
+
function clearLiveUpdateWarning() {
|
|
1980
|
+
if (liveUpdateWarning) clearError();
|
|
1981
|
+
}
|
|
1982
|
+
|
|
1956
1983
|
function updateSummaryGeneratingIndicator() {
|
|
1957
1984
|
if (!summaryGeneratingCopy) return;
|
|
1958
1985
|
|
|
@@ -2749,9 +2776,10 @@ const SCRIPT = `(function() {
|
|
|
2749
2776
|
}
|
|
2750
2777
|
}
|
|
2751
2778
|
|
|
2752
|
-
|
|
2753
|
-
var data = parseSseEventData("result", e);
|
|
2779
|
+
function applyResultEvent(data) {
|
|
2754
2780
|
if (!data) return;
|
|
2781
|
+
lastLiveEventAt = Date.now();
|
|
2782
|
+
clearLiveUpdateWarning();
|
|
2755
2783
|
|
|
2756
2784
|
var queryText = data.query || queries[data.queryIndex] || "";
|
|
2757
2785
|
var slotId = typeof data.slotIndex === "number" ? data.slotIndex : queryIndexToSlot.get(data.queryIndex);
|
|
@@ -2761,13 +2789,16 @@ const SCRIPT = `(function() {
|
|
|
2761
2789
|
card = createSearchingCard(queryText, data.provider);
|
|
2762
2790
|
card.dataset.qi = data.queryIndex;
|
|
2763
2791
|
insertResultCard(card, slotId, null);
|
|
2792
|
+
} else if (card.dataset.completed === "true") {
|
|
2793
|
+
return;
|
|
2764
2794
|
}
|
|
2765
2795
|
applyResponseToCard(card, data, queryText, data.provider, slotId);
|
|
2766
|
-
}
|
|
2796
|
+
}
|
|
2767
2797
|
|
|
2768
|
-
|
|
2769
|
-
var data = parseSseEventData("search-error", e);
|
|
2798
|
+
function applySearchErrorEvent(data) {
|
|
2770
2799
|
if (!data) return;
|
|
2800
|
+
lastLiveEventAt = Date.now();
|
|
2801
|
+
clearLiveUpdateWarning();
|
|
2771
2802
|
|
|
2772
2803
|
var queryText = data.query || queries[data.queryIndex] || "";
|
|
2773
2804
|
var slotId = typeof data.slotIndex === "number" ? data.slotIndex : queryIndexToSlot.get(data.queryIndex);
|
|
@@ -2777,6 +2808,8 @@ const SCRIPT = `(function() {
|
|
|
2777
2808
|
card = createSearchingCard(queryText, data.provider);
|
|
2778
2809
|
card.dataset.qi = data.queryIndex;
|
|
2779
2810
|
insertResultCard(card, slotId, null);
|
|
2811
|
+
} else if (card.dataset.completed === "true") {
|
|
2812
|
+
return;
|
|
2780
2813
|
}
|
|
2781
2814
|
applyResponseToCard(card, {
|
|
2782
2815
|
queryIndex: data.queryIndex,
|
|
@@ -2785,9 +2818,12 @@ const SCRIPT = `(function() {
|
|
|
2785
2818
|
error: data.error || "Search failed",
|
|
2786
2819
|
provider: data.provider,
|
|
2787
2820
|
}, queryText, data.provider, slotId);
|
|
2788
|
-
}
|
|
2821
|
+
}
|
|
2789
2822
|
|
|
2790
|
-
|
|
2823
|
+
function applyDoneEvent() {
|
|
2824
|
+
var wasSearchesDone = searchesDone;
|
|
2825
|
+
lastLiveEventAt = Date.now();
|
|
2826
|
+
clearLiveUpdateWarning();
|
|
2791
2827
|
searchesDone = true;
|
|
2792
2828
|
initialStreamDone = true;
|
|
2793
2829
|
if (completedCount > 0) {
|
|
@@ -2797,13 +2833,78 @@ const SCRIPT = `(function() {
|
|
|
2797
2833
|
recomputeProviderStates();
|
|
2798
2834
|
updateStageUI();
|
|
2799
2835
|
maybeAutoGenerateSummary();
|
|
2800
|
-
resetTimer();
|
|
2836
|
+
if (!wasSearchesDone) resetTimer();
|
|
2837
|
+
}
|
|
2838
|
+
|
|
2839
|
+
function applyStoredLiveEvent(item) {
|
|
2840
|
+
if (!item || typeof item !== "object") return;
|
|
2841
|
+
if (item.event === "result") applyResultEvent(item.data);
|
|
2842
|
+
if (item.event === "search-error") applySearchErrorEvent(item.data);
|
|
2843
|
+
}
|
|
2844
|
+
|
|
2845
|
+
function syncStateFromServer(showWarning) {
|
|
2846
|
+
if (stateSyncInFlight || submitted || timerExpired || searchesDone) return;
|
|
2847
|
+
stateSyncInFlight = true;
|
|
2848
|
+
fetch("/state?session=" + encodeURIComponent(token), { cache: "no-store" })
|
|
2849
|
+
.then(function(res) {
|
|
2850
|
+
return res.text().then(function(raw) {
|
|
2851
|
+
var data = raw ? JSON.parse(raw) : null;
|
|
2852
|
+
if (!res.ok || !data || data.ok === false) {
|
|
2853
|
+
throw new Error(extractServerError(data) || ("HTTP " + res.status));
|
|
2854
|
+
}
|
|
2855
|
+
return data;
|
|
2856
|
+
});
|
|
2857
|
+
})
|
|
2858
|
+
.then(function(data) {
|
|
2859
|
+
if (Array.isArray(data.events)) {
|
|
2860
|
+
data.events.forEach(applyStoredLiveEvent);
|
|
2861
|
+
}
|
|
2862
|
+
if (data.done) applyDoneEvent();
|
|
2863
|
+
if (showWarning && !searchesDone) {
|
|
2864
|
+
setLiveUpdateWarning("Live search updates disconnected. Reconnecting and polling for results.");
|
|
2865
|
+
}
|
|
2866
|
+
})
|
|
2867
|
+
.catch(function(err) {
|
|
2868
|
+
if (!showWarning || submitted || timerExpired) return;
|
|
2869
|
+
var message = err instanceof Error ? err.message : String(err);
|
|
2870
|
+
setLiveUpdateWarning("Live search updates disconnected. Retrying: " + (message || "unknown error"));
|
|
2871
|
+
})
|
|
2872
|
+
.finally(function() {
|
|
2873
|
+
stateSyncInFlight = false;
|
|
2874
|
+
});
|
|
2875
|
+
}
|
|
2876
|
+
|
|
2877
|
+
es.addEventListener("open", function() {
|
|
2878
|
+
lastLiveEventAt = Date.now();
|
|
2879
|
+
clearLiveUpdateWarning();
|
|
2880
|
+
syncStateFromServer(false);
|
|
2881
|
+
});
|
|
2882
|
+
|
|
2883
|
+
es.addEventListener("result", function(e) {
|
|
2884
|
+
var data = parseSseEventData("result", e);
|
|
2885
|
+
applyResultEvent(data);
|
|
2886
|
+
});
|
|
2887
|
+
|
|
2888
|
+
es.addEventListener("search-error", function(e) {
|
|
2889
|
+
var data = parseSseEventData("search-error", e);
|
|
2890
|
+
applySearchErrorEvent(data);
|
|
2891
|
+
});
|
|
2892
|
+
|
|
2893
|
+
es.addEventListener("done", function() {
|
|
2894
|
+
applyDoneEvent();
|
|
2801
2895
|
});
|
|
2802
2896
|
|
|
2803
2897
|
es.onerror = function() {
|
|
2804
|
-
|
|
2898
|
+
if (submitted || timerExpired || searchesDone) return;
|
|
2899
|
+
syncStateFromServer(true);
|
|
2805
2900
|
};
|
|
2806
2901
|
|
|
2902
|
+
setInterval(function() {
|
|
2903
|
+
if (submitted || timerExpired || searchesDone || initialStreamDone) return;
|
|
2904
|
+
if (Date.now() - lastLiveEventAt <= 5000) return;
|
|
2905
|
+
syncStateFromServer(false);
|
|
2906
|
+
}, 5000);
|
|
2907
|
+
|
|
2807
2908
|
function setupCardInteraction(card) {
|
|
2808
2909
|
var header = card.querySelector(".result-card-header");
|
|
2809
2910
|
var body = card.querySelector(".result-card-body");
|
|
@@ -8,12 +8,17 @@ const WATCHDOG_INTERVAL_MS = 1000;
|
|
|
8
8
|
const MAX_BODY_SIZE = 64 * 1024;
|
|
9
9
|
|
|
10
10
|
type ServerState = "SEARCHING" | "RESULT_SELECTION" | "COMPLETED";
|
|
11
|
+
type CuratorResultEventData = IndexedCuratorSearchEntry & { slotIndex?: number };
|
|
12
|
+
type CuratorSearchErrorEventData = { queryIndex: number; query: string; error: string; provider?: string; slotIndex?: number };
|
|
13
|
+
type CuratorStoredEvent =
|
|
14
|
+
| { event: "result"; data: CuratorResultEventData }
|
|
15
|
+
| { event: "search-error"; data: CuratorSearchErrorEventData };
|
|
11
16
|
|
|
12
17
|
export interface CuratorServerOptions {
|
|
13
18
|
queries: string[];
|
|
14
19
|
sessionToken: string;
|
|
15
20
|
timeout: number;
|
|
16
|
-
availableProviders: { all: boolean; openai: boolean; brave: boolean; parallel: boolean; tinyfish: boolean; search1api: boolean; searchinfinity: boolean; querit: boolean; tavily: boolean; serpdive: boolean; kagi: boolean; ollama: boolean; searxng: boolean; perplexity: boolean; exa: boolean; gemini: boolean; anysearch: boolean; xai: boolean; brightdata: boolean; serpbase: boolean };
|
|
21
|
+
availableProviders: { all: boolean; openai: boolean; brave: boolean; parallel: boolean; tinyfish: boolean; search1api: boolean; searchinfinity: boolean; querit: boolean; tavily: boolean; jina: boolean; serpdive: boolean; kagi: boolean; bocha: boolean; ollama: boolean; searxng: boolean; duckduckgo: boolean; perplexity: boolean; exa: boolean; gemini: boolean; anysearch: boolean; xai: boolean; brightdata: boolean; serpbase: boolean };
|
|
17
22
|
defaultProvider: string;
|
|
18
23
|
searchProvider: string;
|
|
19
24
|
summaryModels: Array<{ value: string; label: string }>;
|
|
@@ -205,7 +210,8 @@ export function startCuratorServer(
|
|
|
205
210
|
let watchdog: NodeJS.Timeout | null = null;
|
|
206
211
|
let state: ServerState = "SEARCHING";
|
|
207
212
|
let sseResponse: ServerResponse | null = null;
|
|
208
|
-
const
|
|
213
|
+
const streamedEventsByResultIndex = new Map<number, CuratorStoredEvent>();
|
|
214
|
+
let searchStreamDone = queries.length === 0;
|
|
209
215
|
let nextQueryIndex = queries.length;
|
|
210
216
|
let summarizeAbortController: AbortController | null = null;
|
|
211
217
|
let summarizeRequestSeq = 0;
|
|
@@ -274,10 +280,13 @@ export function startCuratorServer(
|
|
|
274
280
|
if (provider === "searchinfinity") return availableProviders.searchinfinity;
|
|
275
281
|
if (provider === "querit") return availableProviders.querit;
|
|
276
282
|
if (provider === "tavily") return availableProviders.tavily;
|
|
283
|
+
if (provider === "jina") return availableProviders.jina;
|
|
277
284
|
if (provider === "serpdive") return availableProviders.serpdive;
|
|
278
285
|
if (provider === "kagi") return availableProviders.kagi;
|
|
286
|
+
if (provider === "bocha") return availableProviders.bocha;
|
|
279
287
|
if (provider === "ollama") return availableProviders.ollama;
|
|
280
288
|
if (provider === "searxng") return availableProviders.searxng;
|
|
289
|
+
if (provider === "duckduckgo") return availableProviders.duckduckgo;
|
|
281
290
|
if (provider === "perplexity") return availableProviders.perplexity;
|
|
282
291
|
if (provider === "exa") return availableProviders.exa;
|
|
283
292
|
if (provider === "gemini") return availableProviders.gemini;
|
|
@@ -288,13 +297,35 @@ export function startCuratorServer(
|
|
|
288
297
|
return false;
|
|
289
298
|
}
|
|
290
299
|
|
|
291
|
-
function
|
|
300
|
+
function writeSSE(res: ServerResponse, event: string, data: unknown): boolean {
|
|
292
301
|
const payload = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
|
|
302
|
+
try {
|
|
303
|
+
res.write(payload);
|
|
304
|
+
return true;
|
|
305
|
+
} catch {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function sendSSE(event: string, data: unknown): void {
|
|
293
311
|
const res = sseResponse;
|
|
294
|
-
if (res && !res.writableEnded && res.socket && !res.socket.destroyed)
|
|
295
|
-
|
|
312
|
+
if (res && !res.writableEnded && res.socket && !res.socket.destroyed && writeSSE(res, event, data)) return;
|
|
313
|
+
if (sseResponse === res) sseResponse = null;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
function retainStreamedEvent(event: CuratorStoredEvent): void {
|
|
317
|
+
streamedEventsByResultIndex.set(event.data.queryIndex, event);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function getStreamedEvents(): CuratorStoredEvent[] {
|
|
321
|
+
return [...streamedEventsByResultIndex.values()];
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function replaySSE(res: ServerResponse): void {
|
|
325
|
+
for (const item of getStreamedEvents()) {
|
|
326
|
+
if (!writeSSE(res, item.event, item.data)) return;
|
|
296
327
|
}
|
|
297
|
-
|
|
328
|
+
if (searchStreamDone) writeSSE(res, "done", {});
|
|
298
329
|
}
|
|
299
330
|
|
|
300
331
|
const pageHtml = generateCuratorPage(
|
|
@@ -352,18 +383,7 @@ export function startCuratorServer(
|
|
|
352
383
|
res.flushHeaders();
|
|
353
384
|
if (res.socket) res.socket.setNoDelay(true);
|
|
354
385
|
sseResponse = res;
|
|
355
|
-
|
|
356
|
-
const pending = sseBuffer.splice(0, sseBuffer.length);
|
|
357
|
-
for (let i = 0; i < pending.length; i++) {
|
|
358
|
-
const msg = pending[i];
|
|
359
|
-
try {
|
|
360
|
-
res.write(msg);
|
|
361
|
-
} catch {
|
|
362
|
-
sseBuffer.unshift(...pending.slice(i));
|
|
363
|
-
break;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
386
|
+
replaySSE(res);
|
|
367
387
|
if (sseKeepalive) clearInterval(sseKeepalive);
|
|
368
388
|
sseKeepalive = setInterval(() => {
|
|
369
389
|
if (sseResponse) {
|
|
@@ -376,6 +396,17 @@ export function startCuratorServer(
|
|
|
376
396
|
return;
|
|
377
397
|
}
|
|
378
398
|
|
|
399
|
+
if (method === "GET" && url.pathname === "/state") {
|
|
400
|
+
const token = url.searchParams.get("session");
|
|
401
|
+
if (token !== sessionToken) {
|
|
402
|
+
sendJson(res, 403, { ok: false, error: "Invalid session" });
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
touchHeartbeat();
|
|
406
|
+
sendJson(res, 200, { ok: true, events: getStreamedEvents(), done: searchStreamDone });
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
|
|
379
410
|
if (method === "POST" && url.pathname === "/heartbeat") {
|
|
380
411
|
const body = await parseBodyOrSend(req, res);
|
|
381
412
|
if (!body) return;
|
|
@@ -684,15 +715,20 @@ export function startCuratorServer(
|
|
|
684
715
|
pushResult: (queryIndex, data) => {
|
|
685
716
|
if (completed) return;
|
|
686
717
|
nextQueryIndex = Math.max(nextQueryIndex, queryIndex + 1);
|
|
687
|
-
|
|
718
|
+
const eventData: CuratorResultEventData = { ...data, queryIndex, query: data.query ?? queries[queryIndex] ?? "" };
|
|
719
|
+
retainStreamedEvent({ event: "result", data: eventData });
|
|
720
|
+
sendSSE("result", eventData);
|
|
688
721
|
},
|
|
689
722
|
pushError: (queryIndex, error, provider, meta) => {
|
|
690
723
|
if (completed) return;
|
|
691
724
|
nextQueryIndex = Math.max(nextQueryIndex, queryIndex + 1);
|
|
692
|
-
|
|
725
|
+
const eventData: CuratorSearchErrorEventData = { queryIndex, query: meta?.query ?? queries[queryIndex] ?? "", error, provider, slotIndex: meta?.slotIndex };
|
|
726
|
+
retainStreamedEvent({ event: "search-error", data: eventData });
|
|
727
|
+
sendSSE("search-error", eventData);
|
|
693
728
|
},
|
|
694
729
|
searchesDone: () => {
|
|
695
730
|
if (completed) return;
|
|
731
|
+
searchStreamDone = true;
|
|
696
732
|
sendSSE("done", {});
|
|
697
733
|
state = "RESULT_SELECTION";
|
|
698
734
|
stateChangedAt = Date.now();
|