@humain/terminal 0.0.18 → 0.1.1
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 +47 -0
- package/dist/bun/cli.d.ts +3 -1
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +3 -8
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/runtime-setup.d.ts +2 -0
- package/dist/bun/runtime-setup.d.ts.map +1 -0
- package/dist/bun/runtime-setup.js +9 -0
- package/dist/bun/runtime-setup.js.map +1 -0
- package/dist/bun/sandbox-env-setup.d.ts +2 -0
- package/dist/bun/sandbox-env-setup.d.ts.map +1 -0
- package/dist/bun/sandbox-env-setup.js +4 -0
- package/dist/bun/sandbox-env-setup.js.map +1 -0
- package/dist/bundle/chunks/anthropic-messages-XULXUBIG.js +6 -0
- package/dist/bundle/chunks/{azure-openai-responses-ZN52D6YC.js → azure-openai-responses-JEG2XOYC.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +6 -6
- package/dist/bundle/chunks/{chunk-ARF4OE6X.js → chunk-2LC3S3VV.js} +8 -8
- package/dist/bundle/chunks/chunk-43O5DDAH.js +31 -0
- package/dist/bundle/chunks/{chunk-H2O6VOXT.js → chunk-46DC2JD6.js} +2 -2
- package/dist/bundle/chunks/chunk-7ZC4UXSL.js +2 -0
- package/dist/bundle/chunks/{chunk-WJZ4KLGL.js → chunk-E6KP6V7F.js} +1 -1
- package/dist/bundle/chunks/{chunk-PSKDLDLZ.js → chunk-HPPQHK3J.js} +3 -3
- package/dist/bundle/chunks/chunk-JUPSJTFQ.js +42 -0
- package/dist/bundle/chunks/{chunk-QLVZGOBY.js → chunk-LYAMSPR2.js} +360 -352
- package/dist/bundle/chunks/chunk-PL7O7J4J.js +133 -0
- package/dist/bundle/chunks/chunk-USJZMAIR.js +2 -0
- package/dist/bundle/chunks/{extract-2L7ZVN7F.js → extract-TRW5FBY6.js} +2 -2
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-FF7M7XHT.js → google-generative-ai-OX6VSCA6.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-YMUBFRBA.js → google-vertex-GW76GSS2.js} +1 -1
- package/dist/bundle/chunks/image-resize-worker.js +1 -1
- package/dist/bundle/chunks/{mistral-conversations-O4M7IQML.js → mistral-conversations-WXGXZOFJ.js} +1 -1
- package/dist/bundle/chunks/node-AUOGOBCN.js +2 -0
- package/dist/bundle/chunks/node-KOIP55YZ.js +16 -0
- package/dist/bundle/chunks/openai-codex-responses-NPLWP6ZC.js +10 -0
- package/dist/bundle/chunks/{openai-completions-L4AHDQ5D.js → openai-completions-OT2GTJKC.js} +3 -3
- package/dist/bundle/chunks/openai-responses-5A6CR7GI.js +2 -0
- package/dist/bundle/chunks/{openrouter-images-Y2PCWAQH.js → openrouter-images-YLQ4RJ2F.js} +1 -1
- package/dist/bundle/chunks/{pi-messages-57K43J6J.js → pi-messages-OJF77SY3.js} +1 -1
- package/dist/bundle/chunks/{undici-D6ABF53Q.js → undici-KA2LJNVT.js} +1 -1
- package/dist/bundle/chunks/webapi-RFAXLI2D.js +5 -0
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +2 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/setup.d.ts +2 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +13 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli.js +1 -17
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +15 -7
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +16 -8
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +2 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +1 -2
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +8 -2
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +2 -0
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/keybindings.d.ts +5 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +4 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts +15 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +3 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-runtime.d.ts +1 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +5 -2
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +8 -2
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +40 -13
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +4 -2
- package/dist/core/skills.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +8 -9
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +3 -120
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +1 -12
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +5 -163
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +4 -55
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +4 -60
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +4 -49
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +4 -120
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts +12 -0
- package/dist/core/tools/renderers/bash.d.ts.map +1 -0
- package/dist/core/tools/renderers/bash.js +133 -0
- package/dist/core/tools/renderers/bash.js.map +1 -0
- package/dist/core/tools/renderers/edit.d.ts +23 -0
- package/dist/core/tools/renderers/edit.d.ts.map +1 -0
- package/dist/core/tools/renderers/edit.js +167 -0
- package/dist/core/tools/renderers/edit.js.map +1 -0
- package/dist/core/tools/renderers/find.d.ts +10 -0
- package/dist/core/tools/renderers/find.d.ts.map +1 -0
- package/dist/core/tools/renderers/find.js +64 -0
- package/dist/core/tools/renderers/find.js.map +1 -0
- package/dist/core/tools/renderers/grep.d.ts +10 -0
- package/dist/core/tools/renderers/grep.d.ts.map +1 -0
- package/dist/core/tools/renderers/grep.js +69 -0
- package/dist/core/tools/renderers/grep.js.map +1 -0
- package/dist/core/tools/renderers/index.d.ts +22 -0
- package/dist/core/tools/renderers/index.d.ts.map +1 -0
- package/dist/core/tools/renderers/index.js +48 -0
- package/dist/core/tools/renderers/index.js.map +1 -0
- package/dist/core/tools/renderers/ls.d.ts +10 -0
- package/dist/core/tools/renderers/ls.d.ts.map +1 -0
- package/dist/core/tools/renderers/ls.js +58 -0
- package/dist/core/tools/renderers/ls.js.map +1 -0
- package/dist/core/tools/renderers/read.d.ts +11 -0
- package/dist/core/tools/renderers/read.d.ts.map +1 -0
- package/dist/core/tools/renderers/read.js +129 -0
- package/dist/core/tools/renderers/read.js.map +1 -0
- package/dist/core/tools/renderers/write.d.ts +10 -0
- package/dist/core/tools/renderers/write.d.ts.map +1 -0
- package/dist/core/tools/renderers/write.js +152 -0
- package/dist/core/tools/renderers/write.js.map +1 -0
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +5 -145
- package/dist/core/tools/write.js.map +1 -1
- package/dist/humain/bedrock-provider/vendor/index.bundle.mjs +51 -12
- package/dist/humain/index.d.ts.map +1 -1
- package/dist/humain/index.js +2 -0
- package/dist/humain/index.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/package.json +2 -2
- package/dist/humain/node-http.d.ts +3 -0
- package/dist/humain/node-http.d.ts.map +1 -0
- package/dist/humain/node-http.js +119 -0
- package/dist/humain/node-http.js.map +1 -0
- package/dist/humain/node-provider.d.ts +4 -0
- package/dist/humain/node-provider.d.ts.map +1 -0
- package/dist/humain/node-provider.js +359 -0
- package/dist/humain/node-provider.js.map +1 -0
- package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-page.js +3 -1
- package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-server.d.ts +2 -0
- package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-server.js +4 -2
- package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.d.ts +2 -2
- package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.js +11 -4
- package/dist/humain/web-access/vendor/gemini-search.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 +238 -1
- package/dist/humain/web-access/vendor/github-extract.js.map +1 -1
- package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/index.js +118 -64
- package/dist/humain/web-access/vendor/index.js.map +1 -1
- package/dist/humain/web-access/vendor/mistral-search.d.ts +4 -0
- package/dist/humain/web-access/vendor/mistral-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/mistral-search.js +274 -0
- package/dist/humain/web-access/vendor/mistral-search.js.map +1 -0
- package/dist/humain/web-access/vendor/perplexity.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/perplexity.js +12 -1
- package/dist/humain/web-access/vendor/perplexity.js.map +1 -1
- package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/utils.js +1 -2
- package/dist/humain/web-access/vendor/utils.js.map +1 -1
- package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/xai-search.js +92 -35
- package/dist/humain/web-access/vendor/xai-search.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -51
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +20 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/chat-viewport.d.ts +20 -0
- package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
- package/dist/modes/interactive/chat-viewport.js +28 -0
- package/dist/modes/interactive/chat-viewport.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +18 -10
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +37 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +7 -2
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +46 -21
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +8 -17
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +14 -10
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +10 -3
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +4 -4
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +34 -32
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +2 -2
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +8 -15
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +106 -94
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/session-share.d.ts.map +1 -1
- package/dist/modes/interactive/session-share.js +8 -12
- package/dist/modes/interactive/session-share.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +2 -1
- package/dist/modes/interactive/theme/light.json +2 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +5 -0
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-json.d.ts +84 -0
- package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-json.js +130 -0
- package/dist/modes/interactive/theme/theme-json.js.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.json +6 -2
- package/dist/modes/interactive/theme/theme.d.ts +14 -5
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +18 -119
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tui-renderer.d.ts +21 -0
- package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
- package/dist/modes/interactive/tui-renderer.js +66 -0
- package/dist/modes/interactive/tui-renderer.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js +2 -3
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +41 -19
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/containerization.md +45 -0
- package/docs/development.md +19 -0
- package/docs/environment-variables.md +2 -0
- package/docs/extensions.md +5 -2
- package/docs/humain-terminal.md +6 -0
- package/docs/keybindings.md +5 -2
- package/docs/models.md +4 -1
- package/docs/providers.md +19 -1
- package/docs/rpc.md +1 -1
- package/docs/sdk.md +5 -0
- package/docs/settings.md +3 -3
- package/docs/skills.md +1 -1
- package/docs/terminal-setup.md +15 -0
- package/docs/themes.md +8 -6
- package/docs/tui.md +19 -0
- package/examples/README.md +3 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +84 -84
- package/examples/extensions/custom-provider-anthropic/package.json +17 -17
- package/examples/extensions/custom-provider-gitlab-duo/package.json +14 -14
- package/examples/extensions/dynamic-resources/dynamic.json +2 -0
- package/examples/extensions/gondolin/package-lock.json +8 -8
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +6 -6
- package/examples/extensions/sandbox/package.json +2 -2
- package/examples/extensions/with-deps/package-lock.json +29 -29
- package/examples/extensions/with-deps/package.json +20 -20
- package/examples/plugins/pi-example-plugin/README.md +38 -0
- package/examples/plugins/pi-example-plugin/package.json +10 -0
- package/examples/plugins/pi-example-plugin/src/contract.ts +13 -0
- package/examples/plugins/pi-example-plugin/src/session.ts +23 -0
- package/examples/plugins/pi-example-plugin/src/tui.ts +31 -0
- package/npm-shrinkwrap.json +772 -205
- package/package.json +31 -24
- package/src/humain/web-access/UPSTREAM.md +12 -1
- package/src/humain/web-access/upstream.json +4 -4
- package/dist/bundle/chunks/anthropic-messages-M4LCS3KH.js +0 -6
- package/dist/bundle/chunks/chunk-3VI4HD7D.js +0 -31
- package/dist/bundle/chunks/chunk-BOW22LW6.js +0 -42
- package/dist/bundle/chunks/chunk-CBHC6EL7.js +0 -133
- package/dist/bundle/chunks/chunk-JUUC5AZY.js +0 -2
- package/dist/bundle/chunks/node-ZHY4LHC7.js +0 -15
- package/dist/bundle/chunks/openai-codex-responses-HRVCDY54.js +0 -8
- package/dist/bundle/chunks/openai-responses-4MWLJHIK.js +0 -2
- package/dist/bundle/chunks/webapi-AFS5FDJJ.js +0 -5
- package/dist/bundle/client.js +0 -2
- package/dist/cli/experimental/auth.d.ts +0 -16
- package/dist/cli/experimental/auth.d.ts.map +0 -1
- package/dist/cli/experimental/auth.js +0 -13
- package/dist/cli/experimental/auth.js.map +0 -1
- package/dist/cli/experimental/cli.d.ts +0 -6
- package/dist/cli/experimental/cli.d.ts.map +0 -1
- package/dist/cli/experimental/cli.js +0 -5
- package/dist/cli/experimental/cli.js.map +0 -1
- package/dist/cli/experimental/command-options.d.ts +0 -17
- package/dist/cli/experimental/command-options.d.ts.map +0 -1
- package/dist/cli/experimental/command-options.js +0 -35
- package/dist/cli/experimental/command-options.js.map +0 -1
- package/dist/cli/experimental/command.d.ts +0 -63
- package/dist/cli/experimental/command.d.ts.map +0 -1
- package/dist/cli/experimental/command.js +0 -127
- package/dist/cli/experimental/command.js.map +0 -1
- package/dist/cli/experimental/commands/client.d.ts +0 -13
- package/dist/cli/experimental/commands/client.d.ts.map +0 -1
- package/dist/cli/experimental/commands/client.js +0 -25
- package/dist/cli/experimental/commands/client.js.map +0 -1
- package/dist/cli/experimental/commands/pi.d.ts +0 -15
- package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
- package/dist/cli/experimental/commands/pi.js +0 -28
- package/dist/cli/experimental/commands/pi.js.map +0 -1
- package/dist/cli/experimental/commands/server.d.ts +0 -13
- package/dist/cli/experimental/commands/server.d.ts.map +0 -1
- package/dist/cli/experimental/commands/server.js +0 -25
- package/dist/cli/experimental/commands/server.js.map +0 -1
- package/dist/cli/experimental/transport-address.d.ts +0 -10
- package/dist/cli/experimental/transport-address.d.ts.map +0 -1
- package/dist/cli/experimental/transport-address.js +0 -38
- package/dist/cli/experimental/transport-address.js.map +0 -1
- package/dist/client/index.d.ts +0 -3
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -3
- package/dist/client/index.js.map +0 -1
- package/dist/client/remote-session.d.ts +0 -53
- package/dist/client/remote-session.d.ts.map +0 -1
- package/dist/client/remote-session.js +0 -340
- package/dist/client/remote-session.js.map +0 -1
- package/dist/client/transcript.d.ts +0 -12
- package/dist/client/transcript.d.ts.map +0 -1
- package/dist/client/transcript.js +0 -98
- package/dist/client/transcript.js.map +0 -1
- package/dist/server/create-harness.d.ts +0 -26
- package/dist/server/create-harness.d.ts.map +0 -1
- package/dist/server/create-harness.js +0 -106
- package/dist/server/create-harness.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { hostname, tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../host.ts\";\n\nexport function getWebSearchConfigDir(): string {\n\treturn getAgentDir();\n}\n\nexport function getWebSearchConfigPath(): string {\n\treturn join(getWebSearchConfigDir(), \"web-search.json\");\n}\n\ninterface ApiBaseUrlOptions {\n\tconfigKey: string;\n\tconfiguredValue: unknown;\n\tdefaultValue: string;\n\tenvironmentKey: string;\n\tenvironmentValue: string | undefined;\n}\n\nexport function resolveApiBaseUrl(options: ApiBaseUrlOptions): string {\n\tconst fromEnvironment = options.environmentValue !== undefined;\n\tconst value = fromEnvironment ? options.environmentValue : options.configuredValue;\n\tif (value === undefined) return options.defaultValue;\n\n\tconst source = fromEnvironment\n\t\t? options.environmentKey\n\t\t: `${options.configKey} in ${getWebSearchConfigPath()}`;\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(value.trim());\n\t} catch {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\tif (url.protocol !== \"https:\") {\n\t\tthrow new Error(`${source} must be an absolute HTTPS URL`);\n\t}\n\tif (url.username || url.password) {\n\t\tthrow new Error(`${source} must not include credentials`);\n\t}\n\tif (url.search || url.hash) {\n\t\tthrow new Error(`${source} must not include query parameters or fragments`);\n\t}\n\n\turl.search = \"\";\n\turl.hash = \"\";\n\turl.pathname = url.pathname.replace(/\\/+$/, \"\");\n\treturn url.toString().replace(/\\/+$/, \"\");\n}\n\nconst API_REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\nconst API_REQUEST_BODY_HEADERS = [\"Content-Encoding\", \"Content-Language\", \"Content-Location\", \"Content-Type\"];\nconst MAX_API_REDIRECTS = 5;\n\nexport async function fetchWithCredentialRedirects(\n\turl: string,\n\tinit: RequestInit,\n\tcredentialHeaders: readonly string[],\n): Promise<Response> {\n\tlet current = new URL(url);\n\tlet requestInit = init;\n\n\tfor (let redirects = 0; ; redirects++) {\n\t\tconst response = await fetch(current, { ...requestInit, redirect: \"manual\" });\n\t\tif (!API_REDIRECT_STATUSES.has(response.status)) return response;\n\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location) return response;\n\t\tif (redirects === MAX_API_REDIRECTS) {\n\t\t\tthrow new Error(`Too many API redirects from ${url}`);\n\t\t}\n\n\t\tconst next = new URL(location, current);\n\t\tif (next.protocol !== \"http:\" && next.protocol !== \"https:\") {\n\t\t\tthrow new Error(`API redirect from ${current.origin} must use HTTP(S)`);\n\t\t}\n\t\tconst method = requestInit.method?.toUpperCase() ?? \"GET\";\n\t\tif (\n\t\t\t((response.status === 301 || response.status === 302) && method === \"POST\")\n\t\t\t|| (response.status === 303 && method !== \"GET\" && method !== \"HEAD\")\n\t\t) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of API_REQUEST_BODY_HEADERS) headers.delete(name);\n\t\t\tconst { body: _body, ...withoutBody } = requestInit;\n\t\t\trequestInit = { ...withoutBody, method: \"GET\", headers };\n\t\t}\n\t\tif (next.origin !== current.origin) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of credentialHeaders) headers.delete(name);\n\t\t\trequestInit = { ...requestInit, headers };\n\t\t}\n\t\tcurrent = next;\n\t}\n}\n\nexport interface CuratorNetworkConfig {\n\t/** Whether remote access was opted into via curatorRemote. */\n\tenabled: boolean;\n\thost: string;\n\tbind: string;\n}\n\nconst LOCAL_CURATOR_NETWORK_DEFAULTS: CuratorNetworkConfig = { enabled: false, host: \"localhost\", bind: \"127.0.0.1\" };\n\nfunction trimmedString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\n/** Resolves the curator server bind address and URL host from `curatorRemote`. */\nexport function resolveCuratorNetworkConfig(): CuratorNetworkConfig {\n\tconst configPath = getWebSearchConfigPath();\n\tif (!existsSync(configPath)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tlet raw: unknown;\n\ttry {\n\t\traw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n\t} catch {\n\t\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n\t}\n\tif (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tconst curatorRemote = (raw as Record<string, unknown>).curatorRemote;\n\tif (curatorRemote === true) return { enabled: true, host: hostname(), bind: \"0.0.0.0\" };\n\n\tif (curatorRemote && typeof curatorRemote === \"object\" && !Array.isArray(curatorRemote)) {\n\t\tconst obj = curatorRemote as Record<string, unknown>;\n\t\treturn {\n\t\t\tenabled: true,\n\t\t\thost: trimmedString(obj.host) ?? hostname(),\n\t\t\tbind: trimmedString(obj.bind) ?? \"0.0.0.0\",\n\t\t};\n\t}\n\n\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n}\n\nexport function formatSeconds(s: number): string {\n\tconst h = Math.floor(s / 3600);\n\tconst m = Math.floor((s % 3600) / 60);\n\tconst sec = s % 60;\n\tif (h > 0) return `${h}:${String(m).padStart(2, \"0\")}:${String(sec).padStart(2, \"0\")}`;\n\treturn `${m}:${String(sec).padStart(2, \"0\")}`;\n}\n\nexport function readExecError(err: unknown): { code?: string; stderr: string; message: string } {\n\tif (!err || typeof err !== \"object\") {\n\t\treturn { stderr: \"\", message: String(err) };\n\t}\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\tconst stderrRaw = (err as { stderr?: Buffer | string }).stderr;\n\tconst stderr = Buffer.isBuffer(stderrRaw)\n\t\t? stderrRaw.toString(\"utf-8\")\n\t\t: typeof stderrRaw === \"string\"\n\t\t\t? stderrRaw\n\t\t\t: \"\";\n\treturn { code, stderr, message };\n}\n\nexport function isTimeoutError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tif ((err as { killed?: boolean }).killed) return true;\n\tconst name = (err as { name?: string }).name;\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\treturn name === \"AbortError\" || code === \"ETIMEDOUT\" || message.toLowerCase().includes(\"timed out\");\n}\n\nexport function trimErrorText(text: string): string {\n\treturn text.replace(/\\s+/g, \" \").trim().slice(0, 200);\n}\n\nexport function mapFfmpegError(err: unknown): string {\n\tconst { code, stderr, message } = readExecError(err);\n\tif (code === \"ENOENT\") return \"ffmpeg is not installed. Install with: brew install ffmpeg\";\n\tif (isTimeoutError(err)) return \"ffmpeg timed out extracting frame\";\n\tif (stderr.includes(\"403\")) return \"Stream URL returned 403 — may have expired, try again\";\n\tconst snippet = trimErrorText(stderr || message);\n\treturn snippet ? `ffmpeg failed: ${snippet}` : \"ffmpeg failed\";\n}\n\nconst proxyStorage = new AsyncLocalStorage<string | null>();\n\nexport function normalizeProxyUrl(value: unknown, source: string): string | null {\n\tif (value === undefined || value === null) return null;\n\tif (typeof value !== \"string\") throw new Error(`${source} must be an http(s) proxy URL string`);\n\tconst trimmed = value.trim();\n\tif (!trimmed) return null;\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(trimmed);\n\t} catch {\n\t\tthrow new Error(`${source} must be a valid proxy URL: ${JSON.stringify(trimmed)}`);\n\t}\n\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\tthrow new Error(`${source} must use the http:// or https:// scheme: ${trimmed}`);\n\t}\n\tif (!parsed.hostname) throw new Error(`${source} must include a proxy host: ${trimmed}`);\n\tparsed.hash = \"\";\n\tparsed.search = \"\";\n\treturn parsed.toString();\n}\n\nfunction redactProxyUrl(value: string): string {\n\tconst parsed = new URL(value);\n\tif (parsed.username) parsed.username = \"redacted\";\n\tif (parsed.password) parsed.password = \"redacted\";\n\treturn parsed.toString();\n}\n\nfunction loadConfiguredProxy(): string | null {\n\tlet configured: unknown;\n\tconst path = getWebSearchConfigPath();\n\tif (existsSync(path)) {\n\t\tlet raw: unknown;\n\t\ttry {\n\t\t\traw = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(`Failed to load proxy config from ${path}: ${message}`);\n\t\t}\n\t\tif (raw && typeof raw === \"object\" && !Array.isArray(raw)) configured = (raw as { proxy?: unknown }).proxy;\n\t}\n\tif (configured === undefined) return null;\n\treturn normalizeProxyUrl(configured, `proxy in ${getWebSearchConfigPath()}`);\n}\n\nexport function runWithProxy<T>(proxy: string | undefined, fn: () => T): T {\n\tconst normalized = proxy === undefined\n\t\t? loadConfiguredProxy()\n\t\t: normalizeProxyUrl(proxy, \"proxy\");\n\treturn proxyStorage.run(normalized, fn);\n}\n\nexport function getActiveProxy(): string | null {\n\tconst scoped = proxyStorage.getStore();\n\treturn scoped !== undefined ? scoped : loadConfiguredProxy();\n}\n\nexport function hasScopedProxyDecision(): boolean {\n\treturn proxyStorage.getStore() !== undefined;\n}\n\nfunction noProxyEntryMatches(hostname: string, entry: string): boolean {\n\tif (!entry) return false;\n\tif (entry === \"*\") return true;\n\tlet host = entry;\n\tif (host.startsWith(\"[\")) {\n\t\tconst close = host.indexOf(\"]\");\n\t\tif (close > 0) host = host.slice(0, close + 1);\n\t} else {\n\t\tconst colon = host.lastIndexOf(\":\");\n\t\tif (colon > -1 && /^\\d+$/.test(host.slice(colon + 1))) host = host.slice(0, colon);\n\t}\n\thost = host.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\tif (!host) return false;\n\treturn hostname === host || hostname.endsWith(host.startsWith(\".\") ? host : `.${host}`);\n}\n\n/** True when a URL must NOT be sent through the active proxy. */\nexport function isProxyBypassedUrl(url: URL): boolean {\n\tconst hostname = url.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\tif (hostname === \"localhost\" || hostname.endsWith(\".localhost\") || hostname === \"127.0.0.1\" || hostname === \"::1\") return true;\n\tconst noProxy = process.env.NO_PROXY || process.env.no_proxy;\n\tif (noProxy && noProxy.split(\",\").some((entry) => noProxyEntryMatches(hostname, entry.trim()))) return true;\n\treturn false;\n}\n\nexport interface ProxiedRequestInit extends RequestInit {\n\t/** Caller-supplied proxy; bypasses AsyncLocalStorage for pLimit-safe contexts. */\n\t__proxy?: string;\n}\n\ninterface ProxiedFetch {\n\t(input: RequestInfo | URL, init?: ProxiedRequestInit): Promise<Response>;\n\t__piWebAccessProxyFetch?: boolean;\n}\n\n/** Wraps globalThis.fetch so every http(s) call routes through curl while a proxy is active. Idempotent. */\nexport function installGlobalProxyFetch(): void {\n\tconst current = globalThis.fetch as ProxiedFetch;\n\tif (typeof current !== \"function\" || current.__piWebAccessProxyFetch === true) return;\n\tconst nativeFetch = current;\n\tconst wrapped: ProxiedFetch = ((input: RequestInfo | URL, init?: ProxiedRequestInit) => {\n\t\t// Explicitly attached proxies survive pLimit context loss. Otherwise only\n\t\t// web-access calls inside runWithProxy may use the configured proxy.\n\t\tconst proxy = init?.__proxy ?? (hasScopedProxyDecision() ? getActiveProxy() : null);\n\t\tif (!proxy) return nativeFetch(input, init);\n\t\tlet url: URL | null = null;\n\t\ttry {\n\t\t\turl = new URL(typeof input === \"string\" || input instanceof URL ? input : input.url);\n\t\t} catch {\n\t\t\turl = null;\n\t\t}\n\t\tif (!url || (url.protocol !== \"http:\" && url.protocol !== \"https:\") || isProxyBypassedUrl(url)) {\n\t\t\treturn nativeFetch(input, init);\n\t\t}\n\t\treturn fetchViaCurl(url, init ?? {}, proxy);\n\t});\n\twrapped.__piWebAccessProxyFetch = true;\n\tglobalThis.fetch = wrapped;\n}\n\nfunction parseHeaderDump(dump: string): { status: number; statusText: string; headers: Array<[string, string]> } {\n\tconst blocks = dump.split(/\\r?\\n\\r?\\n/).filter((block) => /^HTTP\\/[\\d.]+\\s+\\d{3}/.test(block.trim()));\n\tconst block = (blocks.length > 0 ? blocks[blocks.length - 1] : \"\").trim();\n\tconst lines = block.split(/\\r?\\n/);\n\tlet status = 0;\n\tlet statusText = \"\";\n\tconst headers: Array<[string, string]> = [];\n\tfor (const line of lines) {\n\t\tconst match = /^HTTP\\/[\\d.]+\\s+(\\d{3})(?:\\s+(.*))?$/.exec(line.trim());\n\t\tif (match) {\n\t\t\tstatus = Number(match[1]);\n\t\t\tstatusText = match[2] ?? \"\";\n\t\t\theaders.length = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst separator = line.indexOf(\":\");\n\t\tif (separator > 0) {\n\t\t\tconst name = line.slice(0, separator).trim();\n\t\t\tif (name.toLowerCase() === \"content-encoding\" || name.toLowerCase() === \"content-length\") continue;\n\t\t\theaders.push([name, line.slice(separator + 1).trim()]);\n\t\t}\n\t}\n\treturn { status, statusText, headers };\n}\n\nclass CurlTransportError extends Error {}\n\nfunction quoteCurlConfigValue(value: string, label: string): string {\n\tif (/[\\0-\\x08\\x0c\\x0e-\\x1f\\x7f]/.test(value)) {\n\t\tthrow new Error(`${label} contains unsupported control characters`);\n\t}\n\treturn `\"${value\n\t\t.replace(/\\\\/g, \"\\\\\\\\\")\n\t\t.replace(/\"/g, '\\\\\"')\n\t\t.replace(/\\t/g, \"\\\\t\")\n\t\t.replace(/\\n/g, \"\\\\n\")\n\t\t.replace(/\\r/g, \"\\\\r\")\n\t\t.replace(/\\v/g, \"\\\\v\")}\"`;\n}\n\nfunction curlConfigOption(name: string, value?: string, label = name): string {\n\treturn value === undefined ? name : `${name} = ${quoteCurlConfigValue(value, label)}`;\n}\n\nasync function fetchViaCurl(url: URL, init: RequestInit, proxyUrl: string): Promise<Response> {\n\tlet current = url;\n\tlet currentInit = init;\n\tfor (let redirects = 0; ; redirects++) {\n\t\tconst response = await fetchViaCurlOnce(current, currentInit, proxyUrl);\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location || ![301, 302, 303, 307, 308].includes(response.status)) {\n\t\t\tif (redirects > 0) Object.defineProperty(response, \"redirected\", { value: true, configurable: true });\n\t\t\treturn response;\n\t\t}\n\t\tif (currentInit.redirect === \"manual\") return response;\n\t\tif (currentInit.redirect === \"error\") throw new TypeError(`Proxy fetch redirect blocked from ${current.toString()}`);\n\t\tif (redirects === 20) throw new Error(`Too many proxy redirects from ${url.toString()}`);\n\n\t\tconst next = new URL(location, current);\n\t\tif (next.protocol !== \"http:\" && next.protocol !== \"https:\") throw new Error(`Proxy redirect from ${current.origin} must use HTTP(S)`);\n\n\t\tlet headers = new Headers(currentInit.headers);\n\t\tlet nextInit: RequestInit;\n\t\tconst method = currentInit.method?.toUpperCase() ?? \"GET\";\n\t\tif (((response.status === 301 || response.status === 302) && method === \"POST\") || (response.status === 303 && method !== \"GET\" && method !== \"HEAD\")) {\n\t\t\tfor (const name of [\"Content-Encoding\", \"Content-Language\", \"Content-Location\", \"Content-Type\"]) headers.delete(name);\n\t\t\tconst { body: _body, ...withoutBody } = currentInit;\n\t\t\tnextInit = { ...withoutBody, method: \"GET\", headers };\n\t\t} else {\n\t\t\tnextInit = { ...currentInit, headers };\n\t\t}\n\n\t\tif (next.origin !== current.origin) {\n\t\t\theaders = new Headers();\n\t\t\tnextInit = { ...nextInit, headers };\n\t\t}\n\t\tcurrent = next;\n\t\tcurrentInit = nextInit;\n\t}\n}\n\nasync function fetchViaCurlOnce(url: URL, init: RequestInit, proxyUrl: string): Promise<Response> {\n\tconst method = (init.method ?? \"GET\").toUpperCase();\n\tconst headers = new Headers(init.headers);\n\n\tconst dir = await mkdtemp(join(tmpdir(), \"pi-web-access-proxy-\"));\n\tconst headerFile = join(dir, \"headers\");\n\tconst bodyFile = join(dir, \"body\");\n\tconst requestBodyFile = join(dir, \"request-body\");\n\n\tconst config: string[] = [\n\t\tcurlConfigOption(\"silent\"),\n\t\tcurlConfigOption(\"show-error\"),\n\t\tcurlConfigOption(\"compressed\"),\n\t\tcurlConfigOption(\"connect-timeout\", \"20\"),\n\t\tcurlConfigOption(\"proxy\", proxyUrl, \"proxy URL\"),\n\t\tcurlConfigOption(\"dump-header\", headerFile),\n\t\tcurlConfigOption(\"output\", bodyFile),\n\t\tcurlConfigOption(\"write-out\", \"%{json}\"),\n\t];\n\n\tif (method !== \"GET\" && method !== \"HEAD\") config.push(curlConfigOption(\"request\", method));\n\n\tfor (const [name, value] of headers.entries()) {\n\t\tif (value === \"\") continue;\n\t\tconfig.push(curlConfigOption(\"header\", `${name}: ${value}`, `header ${name}`));\n\t}\n\n\tconst body = init.body;\n\tif (body !== undefined && body !== null) {\n\t\tlet buffer: Buffer;\n\t\tif (typeof body === \"string\") buffer = Buffer.from(body, \"utf-8\");\n\t\telse if (body instanceof URLSearchParams) buffer = Buffer.from(body.toString(), \"utf-8\");\n\t\telse if (body instanceof ArrayBuffer) buffer = Buffer.from(body);\n\t\telse if (ArrayBuffer.isView(body)) buffer = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n\t\telse throw new Error(`Unsupported request body type for proxy fetch: ${typeof body}`);\n\t\tawait writeFile(requestBodyFile, buffer, { mode: 0o600 });\n\t\tconfig.push(curlConfigOption(\"data-binary\", `@${requestBodyFile}`));\n\t\tif (method === \"GET\") config.push(curlConfigOption(\"request\", \"GET\"));\n\t}\n\n\tconfig.push(curlConfigOption(\"url\", url.toString(), \"request URL\"));\n\tconst configInput = `${config.join(\"\\n\")}\\n`;\n\n\tconst signal = init.signal ?? null;\n\tlet stdout: string;\n\ttry {\n\t\tstdout = await new Promise<string>((resolve, reject) => {\n\t\t\tif (signal?.aborted) {\n\t\t\t\treject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst child = spawn(\"curl\", [\"--config\", \"-\"], { windowsHide: true, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\t\tlet out = \"\";\n\t\t\tlet stderr = \"\";\n\t\t\tconst onAbort = () => { try { child.kill(); } catch {} };\n\t\t\tif (signal) {\n\t\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t}\n\t\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => { out += chunk.toString(\"utf-8\"); });\n\t\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => { if (stderr.length < 4096) stderr += chunk.toString(\"utf-8\"); });\n\t\t\tchild.once(\"error\", (err: NodeJS.ErrnoException) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treject(new CurlTransportError(err.code === \"ENOENT\"\n\t\t\t\t\t? \"curl executable not found on PATH; proxy transport requires curl\"\n\t\t\t\t\t: `curl failed to start: ${err.message}`));\n\t\t\t});\n\t\t\tchild.once(\"close\", (code) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tif (signal?.aborted) return reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n\t\t\t\tif (code !== 0 && !out.trim()) {\n\t\t\t\t\treturn reject(new CurlTransportError(`curl exited with code ${code ?? \"unknown\"} via ${redactProxyUrl(proxyUrl)}${stderr.trim() ? `: ${stderr.trim()}` : \"\"}`));\n\t\t\t\t}\n\t\t\t\tresolve(out);\n\t\t\t});\n\t\t\tif (!child.stdin) {\n\t\t\t\tchild.kill();\n\t\t\t\treject(new CurlTransportError(\"curl stdin unavailable for protected proxy configuration\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tchild.stdin.on(\"error\", (err) => reject(new CurlTransportError(`curl stdin failed: ${err.message}`)));\n\t\t\tchild.stdin.end(configInput);\n\t\t});\n\t} catch (err) {\n\t\tawait rm(dir, { recursive: true, force: true }).catch(() => {});\n\t\tif (err instanceof CurlTransportError) throw new Error(err.message);\n\t\tthrow err;\n\t}\n\n\tlet bodyBuffer = Buffer.alloc(0);\n\tlet dump = \"\";\n\ttry {\n\t\t[dump, bodyBuffer] = await Promise.all([readFile(headerFile, \"utf-8\"), readFile(bodyFile)]);\n\t} catch {\n\t\t// HEAD or empty responses may not produce output files.\n\t} finally {\n\t\tawait rm(dir, { recursive: true, force: true }).catch(() => {});\n\t}\n\n\tconst { status, statusText, headers: responseHeaders } = parseHeaderDump(dump);\n\tif (status === 0) {\n\t\tthrow new Error(`Proxy fetch to ${url.toString()} via ${redactProxyUrl(proxyUrl)} returned no HTTP status`);\n\t}\n\n\tlet finalUrl = url.toString();\n\tlet redirected = false;\n\ttry {\n\t\tconst trimmed = stdout.trim();\n\t\tif (trimmed.startsWith(\"{\")) {\n\t\t\tconst writeOut = JSON.parse(trimmed) as { url_effective?: string; num_redirects?: number };\n\t\t\tif (writeOut.url_effective) finalUrl = writeOut.url_effective;\n\t\t\tredirected = (writeOut.num_redirects ?? 0) > 0;\n\t\t}\n\t} catch {\n\t\t// Older curl without %{json}; the header dump already provided the status.\n\t}\n\n\tconst nullBody = status === 204 || status === 205 || status === 304;\n\tconst response = new Response(nullBody ? null : new Uint8Array(bodyBuffer), {\n\t\tstatus,\n\t\tstatusText: statusText || undefined,\n\t\theaders: new Headers(responseHeaders),\n\t});\n\tObject.defineProperty(response, \"url\", { value: finalUrl, configurable: true });\n\tObject.defineProperty(response, \"redirected\", { value: redirected, configurable: true });\n\treturn response;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,UAAU,qBAAqB;IACpC,OAAO,WAAW,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,OAAO,IAAI,CAAC,qBAAqB,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACzD,CAAC;AAUD,MAAM,UAAU,iBAAiB,CAAC,OAA0B;IAC3D,MAAM,eAAe,GAAG,OAAO,CAAC,gBAAgB,KAAK,SAAS,CAAC;IAC/D,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IACnF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,YAAY,CAAC;IAErD,MAAM,MAAM,GAAG,eAAe;QAC7B,CAAC,CAAC,OAAO,CAAC,cAAc;QACxB,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,OAAO,sBAAsB,EAAE,EAAE,CAAC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,kCAAkC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,kCAAkC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,gCAAgC,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,+BAA+B,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,iDAAiD,CAAC,CAAC;IAC7E,CAAC;IAED,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAChB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACd,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACjE,MAAM,wBAAwB,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC;AAC9G,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,4BAA4B,CACjD,GAAW,EACX,IAAiB,EACjB,iBAAoC;IAEpC,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,KAAK,IAAI,SAAS,GAAG,CAAC,GAAI,SAAS,EAAE,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,QAAQ,CAAC;QAEjE,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC/B,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,qBAAqB,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC;QAC1D,IACC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC;eACxE,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EACpE,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACjD,KAAK,MAAM,IAAI,IAAI,wBAAwB;gBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC;YACpD,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACjD,KAAK,MAAM,IAAI,IAAI,iBAAiB;gBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3D,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;IAChB,CAAC;AACF,CAAC;AASD,MAAM,8BAA8B,GAAyB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAEtH,SAAS,aAAa,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,2BAA2B;IAC1C,MAAM,UAAU,GAAG,sBAAsB,EAAE,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,8BAA8B,CAAC;IAEnE,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,8BAA8B,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,8BAA8B,CAAC;IAEjG,MAAM,aAAa,GAAI,GAA+B,CAAC,aAAa,CAAC;IACrE,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAExF,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACzF,MAAM,GAAG,GAAG,aAAwC,CAAC;QACrD,OAAO;YACN,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;YAC3C,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS;SAC1C,CAAC;IACH,CAAC;IAED,OAAO,8BAA8B,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAS;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;IACnB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACvF,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAY;IACzC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,CAAC;IAC7C,MAAM,OAAO,GAAI,GAA4B,CAAC,OAAO,IAAI,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAI,GAAoC,CAAC,MAAM,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QACxC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC7B,CAAC,CAAC,OAAO,SAAS,KAAK,QAAQ;YAC9B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAY;IAC1C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,IAAK,GAA4B,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,CAAC;IAC7C,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,CAAC;IAC7C,MAAM,OAAO,GAAI,GAA4B,CAAC,OAAO,IAAI,EAAE,CAAC;IAC5D,OAAO,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAY;IAC1C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,4DAA4D,CAAC;IAC3F,IAAI,cAAc,CAAC,GAAG,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACpE,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,uDAAuD,CAAC;IAC3F,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,CAAC,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;AAChE,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAiB,CAAC;AAE5D,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,MAAc;IAC/D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,sCAAsC,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,+BAA+B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,6CAA6C,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,+BAA+B,OAAO,EAAE,CAAC,CAAC;IACzF,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,MAAM,CAAC,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC;IAClD,IAAI,MAAM,CAAC,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,UAAU,CAAC;IAClD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,mBAAmB;IAC3B,IAAI,UAAmB,CAAC;IACxB,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;IACtC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACJ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,UAAU,GAAI,GAA2B,CAAC,KAAK,CAAC;IAC5G,CAAC;IACD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,iBAAiB,CAAC,UAAU,EAAE,YAAY,sBAAsB,EAAE,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,KAAyB,EAAE,EAAW;IACrE,MAAM,UAAU,GAAG,KAAK,KAAK,SAAS;QACrC,CAAC,CAAC,mBAAmB,EAAE;QACvB,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,OAAO,YAAY,CAAC,QAAQ,EAAE,KAAK,SAAS,CAAC;AAC9C,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB,EAAE,KAAa;IAC3D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,GAAQ;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACpE,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC/H,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC7D,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5G,OAAO,KAAK,CAAC;AACd,CAAC;AAYD,4GAA4G;AAC5G,MAAM,UAAU,uBAAuB;IACtC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAqB,CAAC;IACjD,IAAI,OAAO,OAAO,KAAK,UAAU,IAAI,OAAO,CAAC,uBAAuB,KAAK,IAAI;QAAE,OAAO;IACtF,MAAM,WAAW,GAAG,OAAO,CAAC;IAC5B,MAAM,OAAO,GAAiB,CAAC,CAAC,KAAwB,EAAE,IAAyB,EAAE,EAAE;QACtF,0EAA0E;QAC1E,qEAAqE;QACrE,MAAM,KAAK,GAAG,IAAI,EAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK;YAAE,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,GAAG,GAAe,IAAI,CAAC;QAC3B,IAAI,CAAC;YACJ,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACR,GAAG,GAAG,IAAI,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YAChG,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,YAAY,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IACvC,UAAU,CAAC,KAAK,GAAG,OAAO,CAAC;AAC5B,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtG,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACnB,SAAS;QACV,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,kBAAkB,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,gBAAgB;gBAAE,SAAS;YACnG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,kBAAmB,SAAQ,KAAK;CAAG;AAEzC,SAAS,oBAAoB,CAAC,KAAa,EAAE,KAAa;IACzD,IAAI,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0CAA0C,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,IAAI,KAAK;SACd,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;AAC5B,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAc,EAAE,KAAK,GAAG,IAAI;IACnE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAQ,EAAE,IAAiB,EAAE,QAAgB;IACxE,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,KAAK,IAAI,SAAS,GAAG,CAAC,GAAI,SAAS,EAAE,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvE,IAAI,SAAS,GAAG,CAAC;gBAAE,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACtG,OAAO,QAAQ,CAAC;QACjB,CAAC;QACD,IAAI,WAAW,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QACvD,IAAI,WAAW,CAAC,QAAQ,KAAK,OAAO;YAAE,MAAM,IAAI,SAAS,CAAC,qCAAqC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrH,IAAI,SAAS,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEzF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;QAEvI,IAAI,OAAO,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,QAAqB,CAAC;QAC1B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC;QAC1D,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;YACvJ,KAAK,MAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC;YACpD,QAAQ,GAAG,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACvD,CAAC;aAAM,CAAC;YACP,QAAQ,GAAG,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,CAAC;QACxC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;YACxB,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,WAAW,GAAG,QAAQ,CAAC;IACxB,CAAC;AACF,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAQ,EAAE,IAAiB,EAAE,QAAgB;IAC5E,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE1C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAElD,MAAM,MAAM,GAAa;QACxB,gBAAgB,CAAC,QAAQ,CAAC;QAC1B,gBAAgB,CAAC,YAAY,CAAC;QAC9B,gBAAgB,CAAC,YAAY,CAAC;QAC9B,gBAAgB,CAAC,iBAAiB,EAAE,IAAI,CAAC;QACzC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC;QAChD,gBAAgB,CAAC,aAAa,EAAE,UAAU,CAAC;QAC3C,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACpC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC;KACxC,CAAC;IAEF,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAE5F,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QAC3B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,IAAI,KAAK,KAAK,EAAE,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACzC,IAAI,MAAc,CAAC;QACnB,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;aAC7D,IAAI,IAAI,YAAY,eAAe;YAAE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;aACpF,IAAI,IAAI,YAAY,WAAW;YAAE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC5D,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;;YAClG,MAAM,IAAI,KAAK,CAAC,kDAAkD,OAAO,IAAI,EAAE,CAAC,CAAC;QACtF,MAAM,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,MAAM,KAAK,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAE7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;IACnC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACJ,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,YAAY,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC,CAAC;gBACrE,OAAO;YACR,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACvG,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;gBAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9G,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;gBAClD,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9C,MAAM,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ;oBAClD,CAAC,CAAC,kEAAkE;oBACpE,CAAC,CAAC,yBAAyB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC5B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9C,IAAI,MAAM,EAAE,OAAO;oBAAE,OAAO,MAAM,CAAC,IAAI,YAAY,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC,CAAC;gBACjG,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC/B,OAAO,MAAM,CAAC,IAAI,kBAAkB,CAAC,yBAAyB,IAAI,IAAI,SAAS,QAAQ,cAAc,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACjK,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,kBAAkB,CAAC,0DAA0D,CAAC,CAAC,CAAC;gBAC3F,OAAO;YACR,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACtG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChE,IAAI,GAAG,YAAY,kBAAkB;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpE,MAAM,GAAG,CAAC;IACX,CAAC;IAED,IAAI,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,CAAC;QACJ,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IAAC,MAAM,CAAC;QACR,wDAAwD;IACzD,CAAC;YAAS,CAAC;QACV,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/E,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,QAAQ,EAAE,QAAQ,cAAc,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;IAC7G,CAAC;IAED,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC9B,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuD,CAAC;YAC3F,IAAI,QAAQ,CAAC,aAAa;gBAAE,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC;YAC9D,UAAU,GAAG,CAAC,QAAQ,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,2EAA2E;IAC5E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE;QAC3E,MAAM;QACN,UAAU,EAAE,UAAU,IAAI,SAAS;QACnC,OAAO,EAAE,IAAI,OAAO,CAAC,eAAe,CAAC;KACrC,CAAC,CAAC;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,OAAO,QAAQ,CAAC;AACjB,CAAC","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { hostname, tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../host.ts\";\n\nexport function getWebSearchConfigDir(): string {\n\treturn getAgentDir();\n}\n\nexport function getWebSearchConfigPath(): string {\n\treturn join(getWebSearchConfigDir(), \"web-search.json\");\n}\n\ninterface ApiBaseUrlOptions {\n\tconfigKey: string;\n\tconfiguredValue: unknown;\n\tdefaultValue: string;\n\tenvironmentKey: string;\n\tenvironmentValue: string | undefined;\n}\n\nexport function resolveApiBaseUrl(options: ApiBaseUrlOptions): string {\n\tconst fromEnvironment = options.environmentValue !== undefined;\n\tconst value = fromEnvironment ? options.environmentValue : options.configuredValue;\n\tif (value === undefined) return options.defaultValue;\n\n\tconst source = fromEnvironment\n\t\t? options.environmentKey\n\t\t: `${options.configKey} in ${getWebSearchConfigPath()}`;\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(value.trim());\n\t} catch {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\tif (url.protocol !== \"https:\") {\n\t\tthrow new Error(`${source} must be an absolute HTTPS URL`);\n\t}\n\tif (url.username || url.password) {\n\t\tthrow new Error(`${source} must not include credentials`);\n\t}\n\tif (url.search || url.hash) {\n\t\tthrow new Error(`${source} must not include query parameters or fragments`);\n\t}\n\n\turl.search = \"\";\n\turl.hash = \"\";\n\turl.pathname = url.pathname.replace(/\\/+$/, \"\");\n\treturn url.toString().replace(/\\/+$/, \"\");\n}\n\nconst API_REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\nconst API_REQUEST_BODY_HEADERS = [\"Content-Encoding\", \"Content-Language\", \"Content-Location\", \"Content-Type\"];\nconst MAX_API_REDIRECTS = 5;\n\nexport async function fetchWithCredentialRedirects(\n\turl: string,\n\tinit: RequestInit,\n\tcredentialHeaders: readonly string[],\n): Promise<Response> {\n\tlet current = new URL(url);\n\tlet requestInit = init;\n\n\tfor (let redirects = 0; ; redirects++) {\n\t\tconst response = await fetch(current, { ...requestInit, redirect: \"manual\" });\n\t\tif (!API_REDIRECT_STATUSES.has(response.status)) return response;\n\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location) return response;\n\t\tif (redirects === MAX_API_REDIRECTS) {\n\t\t\tthrow new Error(`Too many API redirects from ${url}`);\n\t\t}\n\n\t\tconst next = new URL(location, current);\n\t\tif (next.protocol !== \"http:\" && next.protocol !== \"https:\") {\n\t\t\tthrow new Error(`API redirect from ${current.origin} must use HTTP(S)`);\n\t\t}\n\t\tconst method = requestInit.method?.toUpperCase() ?? \"GET\";\n\t\tif (\n\t\t\t((response.status === 301 || response.status === 302) && method === \"POST\")\n\t\t\t|| (response.status === 303 && method !== \"GET\" && method !== \"HEAD\")\n\t\t) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of API_REQUEST_BODY_HEADERS) headers.delete(name);\n\t\t\tconst { body: _body, ...withoutBody } = requestInit;\n\t\t\trequestInit = { ...withoutBody, method: \"GET\", headers };\n\t\t}\n\t\tif (next.origin !== current.origin) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of credentialHeaders) headers.delete(name);\n\t\t\trequestInit = { ...requestInit, headers };\n\t\t}\n\t\tcurrent = next;\n\t}\n}\n\nexport interface CuratorNetworkConfig {\n\t/** Whether remote access was opted into via curatorRemote. */\n\tenabled: boolean;\n\thost: string;\n\tbind: string;\n}\n\nconst LOCAL_CURATOR_NETWORK_DEFAULTS: CuratorNetworkConfig = { enabled: false, host: \"localhost\", bind: \"127.0.0.1\" };\n\nfunction trimmedString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\n/** Resolves the curator server bind address and URL host from `curatorRemote`. */\nexport function resolveCuratorNetworkConfig(): CuratorNetworkConfig {\n\tconst configPath = getWebSearchConfigPath();\n\tif (!existsSync(configPath)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tlet raw: unknown;\n\ttry {\n\t\traw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n\t} catch {\n\t\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n\t}\n\tif (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tconst curatorRemote = (raw as Record<string, unknown>).curatorRemote;\n\tif (curatorRemote === true) return { enabled: true, host: hostname(), bind: \"0.0.0.0\" };\n\n\tif (curatorRemote && typeof curatorRemote === \"object\" && !Array.isArray(curatorRemote)) {\n\t\tconst obj = curatorRemote as Record<string, unknown>;\n\t\treturn {\n\t\t\tenabled: true,\n\t\t\thost: trimmedString(obj.host) ?? hostname(),\n\t\t\tbind: trimmedString(obj.bind) ?? \"0.0.0.0\",\n\t\t};\n\t}\n\n\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n}\n\nexport function formatSeconds(s: number): string {\n\tconst h = Math.floor(s / 3600);\n\tconst m = Math.floor((s % 3600) / 60);\n\tconst sec = s % 60;\n\tif (h > 0) return `${h}:${String(m).padStart(2, \"0\")}:${String(sec).padStart(2, \"0\")}`;\n\treturn `${m}:${String(sec).padStart(2, \"0\")}`;\n}\n\nexport function readExecError(err: unknown): { code?: string; stderr: string; message: string } {\n\tif (!err || typeof err !== \"object\") {\n\t\treturn { stderr: \"\", message: String(err) };\n\t}\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\tconst stderrRaw = (err as { stderr?: Buffer | string }).stderr;\n\tconst stderr = Buffer.isBuffer(stderrRaw)\n\t\t? stderrRaw.toString(\"utf-8\")\n\t\t: typeof stderrRaw === \"string\"\n\t\t\t? stderrRaw\n\t\t\t: \"\";\n\treturn { code, stderr, message };\n}\n\nexport function isTimeoutError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tif ((err as { killed?: boolean }).killed) return true;\n\tconst name = (err as { name?: string }).name;\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\treturn name === \"AbortError\" || code === \"ETIMEDOUT\" || message.toLowerCase().includes(\"timed out\");\n}\n\nexport function trimErrorText(text: string): string {\n\treturn text.replace(/\\s+/g, \" \").trim().slice(0, 200);\n}\n\nexport function mapFfmpegError(err: unknown): string {\n\tconst { code, stderr, message } = readExecError(err);\n\tif (code === \"ENOENT\") return \"ffmpeg is not installed. Install with: brew install ffmpeg\";\n\tif (isTimeoutError(err)) return \"ffmpeg timed out extracting frame\";\n\tif (stderr.includes(\"403\")) return \"Stream URL returned 403 — may have expired, try again\";\n\tconst snippet = trimErrorText(stderr || message);\n\treturn snippet ? `ffmpeg failed: ${snippet}` : \"ffmpeg failed\";\n}\n\nconst proxyStorage = new AsyncLocalStorage<string | null>();\n\nexport function normalizeProxyUrl(value: unknown, source: string): string | null {\n\tif (value === undefined || value === null) return null;\n\tif (typeof value !== \"string\") throw new Error(`${source} must be an http(s) proxy URL string`);\n\tconst trimmed = value.trim();\n\tif (!trimmed) return null;\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(trimmed);\n\t} catch {\n\t\tthrow new Error(`${source} must be a valid proxy URL: ${JSON.stringify(trimmed)}`);\n\t}\n\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\tthrow new Error(`${source} must use the http:// or https:// scheme: ${trimmed}`);\n\t}\n\tif (!parsed.hostname) throw new Error(`${source} must include a proxy host: ${trimmed}`);\n\tparsed.hash = \"\";\n\tparsed.search = \"\";\n\treturn parsed.toString();\n}\n\nfunction redactProxyUrl(value: string): string {\n\tconst parsed = new URL(value);\n\tif (parsed.username) parsed.username = \"redacted\";\n\tif (parsed.password) parsed.password = \"redacted\";\n\treturn parsed.toString();\n}\n\nfunction loadConfiguredProxy(): string | null {\n\tlet configured: unknown;\n\tconst path = getWebSearchConfigPath();\n\tif (existsSync(path)) {\n\t\tlet raw: unknown;\n\t\ttry {\n\t\t\traw = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(`Failed to load proxy config from ${path}: ${message}`);\n\t\t}\n\t\tif (raw && typeof raw === \"object\" && !Array.isArray(raw)) configured = (raw as { proxy?: unknown }).proxy;\n\t}\n\tif (configured === undefined) return null;\n\treturn normalizeProxyUrl(configured, `proxy in ${getWebSearchConfigPath()}`);\n}\n\nexport function runWithProxy<T>(proxy: string | undefined, fn: () => T): T {\n\tconst normalized = proxy === undefined\n\t\t? loadConfiguredProxy()\n\t\t: normalizeProxyUrl(proxy, \"proxy\");\n\treturn proxyStorage.run(normalized, fn);\n}\n\nexport function getActiveProxy(): string | null {\n\treturn proxyStorage.getStore() ?? null;\n}\n\nexport function hasScopedProxyDecision(): boolean {\n\treturn proxyStorage.getStore() !== undefined;\n}\n\nfunction noProxyEntryMatches(hostname: string, entry: string): boolean {\n\tif (!entry) return false;\n\tif (entry === \"*\") return true;\n\tlet host = entry;\n\tif (host.startsWith(\"[\")) {\n\t\tconst close = host.indexOf(\"]\");\n\t\tif (close > 0) host = host.slice(0, close + 1);\n\t} else {\n\t\tconst colon = host.lastIndexOf(\":\");\n\t\tif (colon > -1 && /^\\d+$/.test(host.slice(colon + 1))) host = host.slice(0, colon);\n\t}\n\thost = host.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\tif (!host) return false;\n\treturn hostname === host || hostname.endsWith(host.startsWith(\".\") ? host : `.${host}`);\n}\n\n/** True when a URL must NOT be sent through the active proxy. */\nexport function isProxyBypassedUrl(url: URL): boolean {\n\tconst hostname = url.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\tif (hostname === \"localhost\" || hostname.endsWith(\".localhost\") || hostname === \"127.0.0.1\" || hostname === \"::1\") return true;\n\tconst noProxy = process.env.NO_PROXY || process.env.no_proxy;\n\tif (noProxy && noProxy.split(\",\").some((entry) => noProxyEntryMatches(hostname, entry.trim()))) return true;\n\treturn false;\n}\n\nexport interface ProxiedRequestInit extends RequestInit {\n\t/** Caller-supplied proxy; bypasses AsyncLocalStorage for pLimit-safe contexts. */\n\t__proxy?: string;\n}\n\ninterface ProxiedFetch {\n\t(input: RequestInfo | URL, init?: ProxiedRequestInit): Promise<Response>;\n\t__piWebAccessProxyFetch?: boolean;\n}\n\n/** Wraps globalThis.fetch so every http(s) call routes through curl while a proxy is active. Idempotent. */\nexport function installGlobalProxyFetch(): void {\n\tconst current = globalThis.fetch as ProxiedFetch;\n\tif (typeof current !== \"function\" || current.__piWebAccessProxyFetch === true) return;\n\tconst nativeFetch = current;\n\tconst wrapped: ProxiedFetch = ((input: RequestInfo | URL, init?: ProxiedRequestInit) => {\n\t\t// Explicitly attached proxies survive pLimit context loss. Otherwise only\n\t\t// web-access calls inside runWithProxy may use the configured proxy.\n\t\tconst proxy = init?.__proxy ?? (hasScopedProxyDecision() ? getActiveProxy() : null);\n\t\tif (!proxy) return nativeFetch(input, init);\n\t\tlet url: URL | null = null;\n\t\ttry {\n\t\t\turl = new URL(typeof input === \"string\" || input instanceof URL ? input : input.url);\n\t\t} catch {\n\t\t\turl = null;\n\t\t}\n\t\tif (!url || (url.protocol !== \"http:\" && url.protocol !== \"https:\") || isProxyBypassedUrl(url)) {\n\t\t\treturn nativeFetch(input, init);\n\t\t}\n\t\treturn fetchViaCurl(url, init ?? {}, proxy);\n\t});\n\twrapped.__piWebAccessProxyFetch = true;\n\tglobalThis.fetch = wrapped;\n}\n\nfunction parseHeaderDump(dump: string): { status: number; statusText: string; headers: Array<[string, string]> } {\n\tconst blocks = dump.split(/\\r?\\n\\r?\\n/).filter((block) => /^HTTP\\/[\\d.]+\\s+\\d{3}/.test(block.trim()));\n\tconst block = (blocks.length > 0 ? blocks[blocks.length - 1] : \"\").trim();\n\tconst lines = block.split(/\\r?\\n/);\n\tlet status = 0;\n\tlet statusText = \"\";\n\tconst headers: Array<[string, string]> = [];\n\tfor (const line of lines) {\n\t\tconst match = /^HTTP\\/[\\d.]+\\s+(\\d{3})(?:\\s+(.*))?$/.exec(line.trim());\n\t\tif (match) {\n\t\t\tstatus = Number(match[1]);\n\t\t\tstatusText = match[2] ?? \"\";\n\t\t\theaders.length = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst separator = line.indexOf(\":\");\n\t\tif (separator > 0) {\n\t\t\tconst name = line.slice(0, separator).trim();\n\t\t\tif (name.toLowerCase() === \"content-encoding\" || name.toLowerCase() === \"content-length\") continue;\n\t\t\theaders.push([name, line.slice(separator + 1).trim()]);\n\t\t}\n\t}\n\treturn { status, statusText, headers };\n}\n\nclass CurlTransportError extends Error {}\n\nfunction quoteCurlConfigValue(value: string, label: string): string {\n\tif (/[\\0-\\x08\\x0c\\x0e-\\x1f\\x7f]/.test(value)) {\n\t\tthrow new Error(`${label} contains unsupported control characters`);\n\t}\n\treturn `\"${value\n\t\t.replace(/\\\\/g, \"\\\\\\\\\")\n\t\t.replace(/\"/g, '\\\\\"')\n\t\t.replace(/\\t/g, \"\\\\t\")\n\t\t.replace(/\\n/g, \"\\\\n\")\n\t\t.replace(/\\r/g, \"\\\\r\")\n\t\t.replace(/\\v/g, \"\\\\v\")}\"`;\n}\n\nfunction curlConfigOption(name: string, value?: string, label = name): string {\n\treturn value === undefined ? name : `${name} = ${quoteCurlConfigValue(value, label)}`;\n}\n\nasync function fetchViaCurl(url: URL, init: RequestInit, proxyUrl: string): Promise<Response> {\n\tlet current = url;\n\tlet currentInit = init;\n\tfor (let redirects = 0; ; redirects++) {\n\t\tconst response = await fetchViaCurlOnce(current, currentInit, proxyUrl);\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location || ![301, 302, 303, 307, 308].includes(response.status)) {\n\t\t\tif (redirects > 0) Object.defineProperty(response, \"redirected\", { value: true, configurable: true });\n\t\t\treturn response;\n\t\t}\n\t\tif (currentInit.redirect === \"manual\") return response;\n\t\tif (currentInit.redirect === \"error\") throw new TypeError(`Proxy fetch redirect blocked from ${current.toString()}`);\n\t\tif (redirects === 20) throw new Error(`Too many proxy redirects from ${url.toString()}`);\n\n\t\tconst next = new URL(location, current);\n\t\tif (next.protocol !== \"http:\" && next.protocol !== \"https:\") throw new Error(`Proxy redirect from ${current.origin} must use HTTP(S)`);\n\n\t\tlet headers = new Headers(currentInit.headers);\n\t\tlet nextInit: RequestInit;\n\t\tconst method = currentInit.method?.toUpperCase() ?? \"GET\";\n\t\tif (((response.status === 301 || response.status === 302) && method === \"POST\") || (response.status === 303 && method !== \"GET\" && method !== \"HEAD\")) {\n\t\t\tfor (const name of [\"Content-Encoding\", \"Content-Language\", \"Content-Location\", \"Content-Type\"]) headers.delete(name);\n\t\t\tconst { body: _body, ...withoutBody } = currentInit;\n\t\t\tnextInit = { ...withoutBody, method: \"GET\", headers };\n\t\t} else {\n\t\t\tnextInit = { ...currentInit, headers };\n\t\t}\n\n\t\tif (next.origin !== current.origin) {\n\t\t\theaders = new Headers();\n\t\t\tnextInit = { ...nextInit, headers };\n\t\t}\n\t\tcurrent = next;\n\t\tcurrentInit = nextInit;\n\t}\n}\n\nasync function fetchViaCurlOnce(url: URL, init: RequestInit, proxyUrl: string): Promise<Response> {\n\tconst method = (init.method ?? \"GET\").toUpperCase();\n\tconst headers = new Headers(init.headers);\n\n\tconst dir = await mkdtemp(join(tmpdir(), \"pi-web-access-proxy-\"));\n\tconst headerFile = join(dir, \"headers\");\n\tconst bodyFile = join(dir, \"body\");\n\tconst requestBodyFile = join(dir, \"request-body\");\n\n\tconst config: string[] = [\n\t\tcurlConfigOption(\"silent\"),\n\t\tcurlConfigOption(\"show-error\"),\n\t\tcurlConfigOption(\"compressed\"),\n\t\tcurlConfigOption(\"connect-timeout\", \"20\"),\n\t\tcurlConfigOption(\"proxy\", proxyUrl, \"proxy URL\"),\n\t\tcurlConfigOption(\"dump-header\", headerFile),\n\t\tcurlConfigOption(\"output\", bodyFile),\n\t\tcurlConfigOption(\"write-out\", \"%{json}\"),\n\t];\n\n\tif (method !== \"GET\" && method !== \"HEAD\") config.push(curlConfigOption(\"request\", method));\n\n\tfor (const [name, value] of headers.entries()) {\n\t\tif (value === \"\") continue;\n\t\tconfig.push(curlConfigOption(\"header\", `${name}: ${value}`, `header ${name}`));\n\t}\n\n\tconst body = init.body;\n\tif (body !== undefined && body !== null) {\n\t\tlet buffer: Buffer;\n\t\tif (typeof body === \"string\") buffer = Buffer.from(body, \"utf-8\");\n\t\telse if (body instanceof URLSearchParams) buffer = Buffer.from(body.toString(), \"utf-8\");\n\t\telse if (body instanceof ArrayBuffer) buffer = Buffer.from(body);\n\t\telse if (ArrayBuffer.isView(body)) buffer = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n\t\telse throw new Error(`Unsupported request body type for proxy fetch: ${typeof body}`);\n\t\tawait writeFile(requestBodyFile, buffer, { mode: 0o600 });\n\t\tconfig.push(curlConfigOption(\"data-binary\", `@${requestBodyFile}`));\n\t\tif (method === \"GET\") config.push(curlConfigOption(\"request\", \"GET\"));\n\t}\n\n\tconfig.push(curlConfigOption(\"url\", url.toString(), \"request URL\"));\n\tconst configInput = `${config.join(\"\\n\")}\\n`;\n\n\tconst signal = init.signal ?? null;\n\tlet stdout: string;\n\ttry {\n\t\tstdout = await new Promise<string>((resolve, reject) => {\n\t\t\tif (signal?.aborted) {\n\t\t\t\treject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst child = spawn(\"curl\", [\"--config\", \"-\"], { windowsHide: true, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\t\tlet out = \"\";\n\t\t\tlet stderr = \"\";\n\t\t\tconst onAbort = () => { try { child.kill(); } catch {} };\n\t\t\tif (signal) {\n\t\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t}\n\t\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => { out += chunk.toString(\"utf-8\"); });\n\t\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => { if (stderr.length < 4096) stderr += chunk.toString(\"utf-8\"); });\n\t\t\tchild.once(\"error\", (err: NodeJS.ErrnoException) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treject(new CurlTransportError(err.code === \"ENOENT\"\n\t\t\t\t\t? \"curl executable not found on PATH; proxy transport requires curl\"\n\t\t\t\t\t: `curl failed to start: ${err.message}`));\n\t\t\t});\n\t\t\tchild.once(\"close\", (code) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tif (signal?.aborted) return reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n\t\t\t\tif (code !== 0 && !out.trim()) {\n\t\t\t\t\treturn reject(new CurlTransportError(`curl exited with code ${code ?? \"unknown\"} via ${redactProxyUrl(proxyUrl)}${stderr.trim() ? `: ${stderr.trim()}` : \"\"}`));\n\t\t\t\t}\n\t\t\t\tresolve(out);\n\t\t\t});\n\t\t\tif (!child.stdin) {\n\t\t\t\tchild.kill();\n\t\t\t\treject(new CurlTransportError(\"curl stdin unavailable for protected proxy configuration\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tchild.stdin.on(\"error\", (err) => reject(new CurlTransportError(`curl stdin failed: ${err.message}`)));\n\t\t\tchild.stdin.end(configInput);\n\t\t});\n\t} catch (err) {\n\t\tawait rm(dir, { recursive: true, force: true }).catch(() => {});\n\t\tif (err instanceof CurlTransportError) throw new Error(err.message);\n\t\tthrow err;\n\t}\n\n\tlet bodyBuffer = Buffer.alloc(0);\n\tlet dump = \"\";\n\ttry {\n\t\t[dump, bodyBuffer] = await Promise.all([readFile(headerFile, \"utf-8\"), readFile(bodyFile)]);\n\t} catch {\n\t\t// HEAD or empty responses may not produce output files.\n\t} finally {\n\t\tawait rm(dir, { recursive: true, force: true }).catch(() => {});\n\t}\n\n\tconst { status, statusText, headers: responseHeaders } = parseHeaderDump(dump);\n\tif (status === 0) {\n\t\tthrow new Error(`Proxy fetch to ${url.toString()} via ${redactProxyUrl(proxyUrl)} returned no HTTP status`);\n\t}\n\n\tlet finalUrl = url.toString();\n\tlet redirected = false;\n\ttry {\n\t\tconst trimmed = stdout.trim();\n\t\tif (trimmed.startsWith(\"{\")) {\n\t\t\tconst writeOut = JSON.parse(trimmed) as { url_effective?: string; num_redirects?: number };\n\t\t\tif (writeOut.url_effective) finalUrl = writeOut.url_effective;\n\t\t\tredirected = (writeOut.num_redirects ?? 0) > 0;\n\t\t}\n\t} catch {\n\t\t// Older curl without %{json}; the header dump already provided the status.\n\t}\n\n\tconst nullBody = status === 204 || status === 205 || status === 304;\n\tconst response = new Response(nullBody ? null : new Uint8Array(bodyBuffer), {\n\t\tstatus,\n\t\tstatusText: statusText || undefined,\n\t\theaders: new Headers(responseHeaders),\n\t});\n\tObject.defineProperty(response, \"url\", { value: finalUrl, configurable: true });\n\tObject.defineProperty(response, \"redirected\", { value: redirected, configurable: true });\n\treturn response;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xai-search.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/xai-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAgB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"xai-search.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/xai-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAgB,MAAM,iBAAiB,CAAC;AA0CnF,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAErD,UAAU,OAAO;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,eAAe,CAAC;CACzB;AAoFD,wBAAsB,cAAc,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAsB/G;AAED,wBAAsB,oBAAoB,CAAC,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAenF;AAuKD,wBAAsB,aAAa,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,EAC3B,GAAG,CAAC,EAAE,gBAAgB,GACpB,OAAO,CAAC,cAAc,CAAC,CAmEzB"}
|
|
@@ -2,8 +2,8 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
2
2
|
import { activityMonitor } from "./activity.js";
|
|
3
3
|
import { hasCredentialSource, redactCredential, resolveCredential } from "./credential-source.js";
|
|
4
4
|
import { getWebSearchConfigPath } from "./utils.js";
|
|
5
|
-
// xAI's Agent Tools API:
|
|
6
|
-
// Responses endpoint. The search runs inside xAI's own inference, so — unlike
|
|
5
|
+
// xAI's Agent Tools API: hosted `web_search` and opt-in `x_search` tools on an
|
|
6
|
+
// OpenAI-compatible Responses endpoint. The search runs inside xAI's own inference, so — unlike
|
|
7
7
|
// every keyed backend here — it is paid for by whatever credential answers for
|
|
8
8
|
// the model, including a SuperGrok / X Premium subscription resolved through
|
|
9
9
|
// pi's model registry.
|
|
@@ -16,15 +16,19 @@ import { getWebSearchConfigPath } from "./utils.js";
|
|
|
16
16
|
// is the shape verified against a live subscription account. `stream`,
|
|
17
17
|
// `include`, `tool_choice` and `parallel_tool_calls` are all sent by the OpenAI
|
|
18
18
|
// backend but were NOT verified here, and a 400 from an unsupported field would
|
|
19
|
-
// cost the user their search.
|
|
20
|
-
//
|
|
19
|
+
// cost the user their search. Responses API inline citations are enabled by
|
|
20
|
+
// default; sources may also come back in a search call's `action.sources`.
|
|
21
21
|
const XAI_RESPONSES_URL = "https://api.x.ai/v1/responses";
|
|
22
22
|
const CONFIG_PATH = getWebSearchConfigPath();
|
|
23
23
|
const SEARCH_TIMEOUT_MS = 60_000;
|
|
24
24
|
// Ordered best-first. pi's builtin xai catalog is small and xAI retires models
|
|
25
25
|
// briskly, so this is a preference list, not an assumption: the first one the
|
|
26
26
|
// registry actually knows wins, and an unknown id is skipped rather than sent.
|
|
27
|
-
|
|
27
|
+
// xAI's current X Search docs use grok-4.6. Keep the existing web-only default
|
|
28
|
+
// unchanged, while preferring the documented model when X Search is opted in.
|
|
29
|
+
const WEB_SEARCH_AUTH_MODEL_CANDIDATES = ["grok-4.5", "grok-4.3", "grok-build-0.1"];
|
|
30
|
+
const X_SEARCH_AUTH_MODEL_CANDIDATES = ["grok-4.6", ...WEB_SEARCH_AUTH_MODEL_CANDIDATES];
|
|
31
|
+
const DEFAULT_XAI_SEARCH_TOOLS = ["web_search"];
|
|
28
32
|
let cachedConfig = null;
|
|
29
33
|
function loadConfig() {
|
|
30
34
|
if (cachedConfig)
|
|
@@ -51,6 +55,27 @@ function resolveConfiguredSearchModel(value) {
|
|
|
51
55
|
}
|
|
52
56
|
return value.trim();
|
|
53
57
|
}
|
|
58
|
+
function resolveConfiguredSearchTools(value) {
|
|
59
|
+
if (value === undefined)
|
|
60
|
+
return [...DEFAULT_XAI_SEARCH_TOOLS];
|
|
61
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
62
|
+
throw new Error(`xaiSearchTools in ${CONFIG_PATH} must be a non-empty array containing only web_search or x_search`);
|
|
63
|
+
}
|
|
64
|
+
const tools = [];
|
|
65
|
+
for (const tool of value) {
|
|
66
|
+
if (tool !== "web_search" && tool !== "x_search") {
|
|
67
|
+
throw new Error(`xaiSearchTools in ${CONFIG_PATH} may only contain web_search or x_search`);
|
|
68
|
+
}
|
|
69
|
+
if (tools.includes(tool)) {
|
|
70
|
+
throw new Error(`xaiSearchTools in ${CONFIG_PATH} must not contain duplicates: ${tool}`);
|
|
71
|
+
}
|
|
72
|
+
tools.push(tool);
|
|
73
|
+
}
|
|
74
|
+
return tools;
|
|
75
|
+
}
|
|
76
|
+
function modelCandidatesForTools(tools) {
|
|
77
|
+
return tools.includes("x_search") ? X_SEARCH_AUTH_MODEL_CANDIDATES : WEB_SEARCH_AUTH_MODEL_CANDIDATES;
|
|
78
|
+
}
|
|
54
79
|
function toRequestHeaders(headers) {
|
|
55
80
|
const requestHeaders = {};
|
|
56
81
|
for (const [name, value] of Object.entries(headers)) {
|
|
@@ -64,8 +89,8 @@ function toRequestHeaders(headers) {
|
|
|
64
89
|
* its own searches and no api key has to be configured at all. Mirrors how the
|
|
65
90
|
* OpenAI backend picks up a Codex sign-in.
|
|
66
91
|
*/
|
|
67
|
-
async function resolvePiAuth(ctx, modelOverride) {
|
|
68
|
-
for (const modelId of
|
|
92
|
+
async function resolvePiAuth(ctx, modelOverride, tools) {
|
|
93
|
+
for (const modelId of modelCandidatesForTools(tools)) {
|
|
69
94
|
try {
|
|
70
95
|
const model = ctx.modelRegistry.find("xai", modelId);
|
|
71
96
|
if (!model)
|
|
@@ -83,8 +108,9 @@ async function resolvePiAuth(ctx, modelOverride) {
|
|
|
83
108
|
export async function resolveXaiAuth(ctx, signal) {
|
|
84
109
|
const config = loadConfig();
|
|
85
110
|
const modelOverride = resolveConfiguredSearchModel(config.xaiSearchModel);
|
|
111
|
+
const tools = resolveConfiguredSearchTools(config.xaiSearchTools);
|
|
86
112
|
if (ctx) {
|
|
87
|
-
const auth = await resolvePiAuth(ctx, modelOverride);
|
|
113
|
+
const auth = await resolvePiAuth(ctx, modelOverride, tools);
|
|
88
114
|
if (auth)
|
|
89
115
|
return auth;
|
|
90
116
|
}
|
|
@@ -101,12 +127,20 @@ export async function resolveXaiAuth(ctx, signal) {
|
|
|
101
127
|
environmentValue: process.env.XAI_API_KEY,
|
|
102
128
|
signal,
|
|
103
129
|
});
|
|
104
|
-
return apiKey ? { apiKey, model: modelOverride ??
|
|
130
|
+
return apiKey ? { apiKey, model: modelOverride ?? modelCandidatesForTools(tools)[0], headers: {} } : undefined;
|
|
105
131
|
}
|
|
106
132
|
export async function isXaiSearchAvailable(ctx) {
|
|
107
|
-
|
|
133
|
+
let config;
|
|
134
|
+
let tools;
|
|
135
|
+
try {
|
|
136
|
+
config = loadConfig();
|
|
137
|
+
tools = resolveConfiguredSearchTools(config.xaiSearchTools);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
if (ctx && await resolvePiAuth(ctx, undefined, tools))
|
|
108
143
|
return true;
|
|
109
|
-
const config = loadConfig();
|
|
110
144
|
return hasCredentialSource({
|
|
111
145
|
provider: "xAI",
|
|
112
146
|
configuredValue: config.xaiApiKey,
|
|
@@ -137,9 +171,19 @@ function normalizeDomain(value) {
|
|
|
137
171
|
* an unknown field risks a 400 that costs the whole search; steering through
|
|
138
172
|
* the instruction text degrades to "the model ignored it" instead.
|
|
139
173
|
*/
|
|
140
|
-
function buildInput(query, options) {
|
|
174
|
+
function buildInput(query, options, tools) {
|
|
175
|
+
let searchInstruction;
|
|
176
|
+
if (tools.includes("x_search") && tools.includes("web_search")) {
|
|
177
|
+
searchInstruction = "Search the web and X and answer using only what the search results say.";
|
|
178
|
+
}
|
|
179
|
+
else if (tools.includes("x_search")) {
|
|
180
|
+
searchInstruction = "Search X and answer using only what the X results say.";
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
searchInstruction = "Search the web and answer using only what the web results say.";
|
|
184
|
+
}
|
|
141
185
|
const lines = [
|
|
142
|
-
|
|
186
|
+
searchInstruction,
|
|
143
187
|
"Cite your sources inline.",
|
|
144
188
|
];
|
|
145
189
|
if (options.recencyFilter) {
|
|
@@ -182,6 +226,22 @@ function addResult(results, seen, url, title, snippet = "") {
|
|
|
182
226
|
snippet,
|
|
183
227
|
});
|
|
184
228
|
}
|
|
229
|
+
function addSource(results, seen, source) {
|
|
230
|
+
if (typeof source === "string") {
|
|
231
|
+
addResult(results, seen, source, undefined);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (!source || typeof source !== "object")
|
|
235
|
+
return;
|
|
236
|
+
const record = source;
|
|
237
|
+
addResult(results, seen, record.url ?? record.source_website_url, record.title ?? record.caption);
|
|
238
|
+
}
|
|
239
|
+
function addSources(results, seen, sources) {
|
|
240
|
+
if (!Array.isArray(sources))
|
|
241
|
+
return;
|
|
242
|
+
for (const source of sources)
|
|
243
|
+
addSource(results, seen, source);
|
|
244
|
+
}
|
|
185
245
|
function extractSnippetAround(text, start, end) {
|
|
186
246
|
if (typeof start !== "number" || typeof end !== "number" || !text)
|
|
187
247
|
return "";
|
|
@@ -209,13 +269,13 @@ function extractAnswer(output) {
|
|
|
209
269
|
return parts.join("\n").trim();
|
|
210
270
|
}
|
|
211
271
|
/**
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
216
|
-
*
|
|
272
|
+
* Keep annotation sources first because they carry titles and offsets and must
|
|
273
|
+
* win URL deduplication. Raw source lists from web/X search calls are next,
|
|
274
|
+
* followed by xAI's response-level `citations` URL list. The latter is usually
|
|
275
|
+
* strings, but object entries are tolerated when a compatible gateway adds
|
|
276
|
+
* metadata.
|
|
217
277
|
*/
|
|
218
|
-
function extractSearchResults(output, numResults) {
|
|
278
|
+
function extractSearchResults(output, citations, numResults) {
|
|
219
279
|
const results = [];
|
|
220
280
|
const seenUrls = new Set();
|
|
221
281
|
for (const item of output) {
|
|
@@ -241,32 +301,29 @@ function extractSearchResults(output, numResults) {
|
|
|
241
301
|
}
|
|
242
302
|
}
|
|
243
303
|
for (const item of output) {
|
|
244
|
-
if (!item || typeof item !== "object"
|
|
304
|
+
if (!item || typeof item !== "object")
|
|
305
|
+
continue;
|
|
306
|
+
const type = item.type;
|
|
307
|
+
if (type !== "web_search_call" && type !== "x_search_call")
|
|
245
308
|
continue;
|
|
246
309
|
const value = item;
|
|
247
310
|
const actionSources = value.action && typeof value.action === "object"
|
|
248
311
|
? value.action.sources
|
|
249
312
|
: undefined;
|
|
250
|
-
for (const group of [actionSources, value.sources, value.results])
|
|
251
|
-
|
|
252
|
-
continue;
|
|
253
|
-
for (const source of group) {
|
|
254
|
-
if (!source || typeof source !== "object")
|
|
255
|
-
continue;
|
|
256
|
-
const record = source;
|
|
257
|
-
addResult(results, seenUrls, record.url ?? record.source_website_url, record.title ?? record.caption);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
313
|
+
for (const group of [actionSources, value.sources, value.results])
|
|
314
|
+
addSources(results, seenUrls, group);
|
|
260
315
|
}
|
|
316
|
+
addSources(results, seenUrls, citations);
|
|
261
317
|
if (typeof numResults === "number" && Number.isFinite(numResults) && numResults > 0) {
|
|
262
318
|
return results.slice(0, Math.min(Math.floor(numResults), 20));
|
|
263
319
|
}
|
|
264
320
|
return results;
|
|
265
321
|
}
|
|
266
322
|
export async function searchWithXai(query, options = {}, ctx) {
|
|
323
|
+
const tools = resolveConfiguredSearchTools(loadConfig().xaiSearchTools);
|
|
267
324
|
const auth = await resolveXaiAuth(ctx, options.signal);
|
|
268
325
|
if (!auth) {
|
|
269
|
-
throw new Error("xAI
|
|
326
|
+
throw new Error("xAI search unavailable. Either:\n" +
|
|
270
327
|
" 1. Use /login to sign in with a SuperGrok or X Premium subscription\n" +
|
|
271
328
|
` 2. Create ${CONFIG_PATH} with { "xaiApiKey": "your-key" }\n` +
|
|
272
329
|
" 3. Set XAI_API_KEY environment variable");
|
|
@@ -282,8 +339,8 @@ export async function searchWithXai(query, options = {}, ctx) {
|
|
|
282
339
|
},
|
|
283
340
|
body: JSON.stringify({
|
|
284
341
|
model: auth.model,
|
|
285
|
-
input: buildInput(query, options),
|
|
286
|
-
tools:
|
|
342
|
+
input: buildInput(query, options, tools),
|
|
343
|
+
tools: tools.map((type) => ({ type })),
|
|
287
344
|
}),
|
|
288
345
|
signal: options.signal
|
|
289
346
|
? AbortSignal.any([AbortSignal.timeout(SEARCH_TIMEOUT_MS), options.signal])
|
|
@@ -304,9 +361,9 @@ export async function searchWithXai(query, options = {}, ctx) {
|
|
|
304
361
|
}
|
|
305
362
|
const output = Array.isArray(parsed.output) ? parsed.output : [];
|
|
306
363
|
const answer = extractAnswer(output);
|
|
307
|
-
const results = extractSearchResults(output, options.numResults);
|
|
364
|
+
const results = extractSearchResults(output, parsed.citations, options.numResults);
|
|
308
365
|
if (!answer && results.length === 0) {
|
|
309
|
-
throw new Error(
|
|
366
|
+
throw new Error(`xAI ${tools.join("+")} returned no answer or sources`);
|
|
310
367
|
}
|
|
311
368
|
activityMonitor.logComplete(activityId, response.status);
|
|
312
369
|
return { answer, results };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xai-search.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/xai-search.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { SearchOptions, SearchResponse, SearchResult } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\n// xAI's Agent Tools API: a hosted `web_search` tool on an OpenAI-compatible\n// Responses endpoint. The search runs inside xAI's own inference, so — unlike\n// every keyed backend here — it is paid for by whatever credential answers for\n// the model, including a SuperGrok / X Premium subscription resolved through\n// pi's model registry.\n//\n// Note for anyone extending this: xAI's older Live Search (`search_parameters`\n// on /v1/chat/completions) is GONE. It now answers 410 with \"Live search is\n// deprecated. Please switch to the Agent Tools API\". Do not add it back.\n//\n// The request body is deliberately minimal — model, input, tools — because that\n// is the shape verified against a live subscription account. `stream`,\n// `include`, `tool_choice` and `parallel_tool_calls` are all sent by the OpenAI\n// backend but were NOT verified here, and a 400 from an unsupported field would\n// cost the user their search. Sources come back in `web_search_call.action.sources`\n// without asking for them via `include`.\n\nconst XAI_RESPONSES_URL = \"https://api.x.ai/v1/responses\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\n// Ordered best-first. pi's builtin xai catalog is small and xAI retires models\n// briskly, so this is a preference list, not an assumption: the first one the\n// registry actually knows wins, and an unknown id is skipped rather than sent.\nconst AUTH_MODEL_CANDIDATES = [\"grok-4.5\", \"grok-4.3\", \"grok-build-0.1\"] as const;\n\ninterface WebSearchConfig {\n\txaiApiKey?: unknown;\n\txaiSearchModel?: unknown;\n}\n\ntype ProviderHeaders = Record<string, string | null>;\n\ninterface XaiAuth {\n\tapiKey: string;\n\tmodel: string;\n\theaders: ProviderHeaders;\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nfunction resolveConfiguredSearchModel(value: unknown): string | undefined {\n\tif (value == null) return undefined;\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\tthrow new Error(`xaiSearchModel in ${CONFIG_PATH} must be a non-empty string`);\n\t}\n\treturn value.trim();\n}\n\nfunction toRequestHeaders(headers: ProviderHeaders): Record<string, string> {\n\tconst requestHeaders: Record<string, string> = {};\n\tfor (const [name, value] of Object.entries(headers)) {\n\t\tif (value !== null) requestHeaders[name] = value;\n\t}\n\treturn requestHeaders;\n}\n\n/**\n * Resolve auth from pi's model registry first, so a Grok subscription pays for\n * its own searches and no api key has to be configured at all. Mirrors how the\n * OpenAI backend picks up a Codex sign-in.\n */\nasync function resolvePiAuth(ctx: ExtensionContext, modelOverride?: string): Promise<XaiAuth | undefined> {\n\tfor (const modelId of AUTH_MODEL_CANDIDATES) {\n\t\ttry {\n\t\t\tconst model = ctx.modelRegistry.find(\"xai\", modelId);\n\t\t\tif (!model) continue;\n\t\t\tconst resolved = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\tif (resolved.ok && resolved.apiKey) {\n\t\t\t\treturn { apiKey: resolved.apiKey, model: modelOverride ?? modelId, headers: resolved.headers ?? {} };\n\t\t\t}\n\t\t} catch {\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport async function resolveXaiAuth(ctx?: ExtensionContext, signal?: AbortSignal): Promise<XaiAuth | undefined> {\n\tconst config = loadConfig();\n\tconst modelOverride = resolveConfiguredSearchModel(config.xaiSearchModel);\n\tif (ctx) {\n\t\tconst auth = await resolvePiAuth(ctx, modelOverride);\n\t\tif (auth) return auth;\n\t}\n\n\tconst hasSource = hasCredentialSource({\n\t\tprovider: \"xAI\",\n\t\tconfiguredValue: config.xaiApiKey,\n\t\tenvironmentValue: process.env.XAI_API_KEY,\n\t});\n\tif (!hasSource) return undefined;\n\tconst apiKey = await resolveCredential({\n\t\tprovider: \"xAI\",\n\t\tconfiguredValue: config.xaiApiKey,\n\t\tenvironmentValue: process.env.XAI_API_KEY,\n\t\tsignal,\n\t});\n\treturn apiKey ? { apiKey, model: modelOverride ?? AUTH_MODEL_CANDIDATES[0], headers: {} } : undefined;\n}\n\nexport async function isXaiSearchAvailable(ctx?: ExtensionContext): Promise<boolean> {\n\tif (ctx && await resolvePiAuth(ctx)) return true;\n\tconst config = loadConfig();\n\treturn hasCredentialSource({\n\t\tprovider: \"xAI\",\n\t\tconfiguredValue: config.xaiApiKey,\n\t\tenvironmentValue: process.env.XAI_API_KEY,\n\t});\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\n/**\n * Recency, result count and domain filters are folded into the prompt rather\n * than sent as tool parameters. xAI's filter field names are not verified, and\n * an unknown field risks a 400 that costs the whole search; steering through\n * the instruction text degrades to \"the model ignored it\" instead.\n */\nfunction buildInput(query: string, options: SearchOptions): string {\n\tconst lines = [\n\t\t\"Search the web and answer using only what the web results say.\",\n\t\t\"Cite your sources inline.\",\n\t];\n\n\tif (options.recencyFilter) {\n\t\tconst labels: Record<string, string> = {\n\t\t\tday: \"past 24 hours\",\n\t\t\tweek: \"past week\",\n\t\t\tmonth: \"past month\",\n\t\t\tyear: \"past year\",\n\t\t};\n\t\tlines.push(`Prefer sources from the ${labels[options.recencyFilter]}.`);\n\t}\n\n\tif (typeof options.numResults === \"number\" && Number.isFinite(options.numResults) && options.numResults > 0) {\n\t\tlines.push(`Prefer around ${Math.min(Math.floor(options.numResults), 20)} distinct sources.`);\n\t}\n\n\tconst allowed: string[] = [];\n\tconst blocked: string[] = [];\n\tfor (const raw of options.domainFilter ?? []) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? blocked : allowed;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\tif (allowed.length > 0) lines.push(`Only use sources from: ${allowed.slice(0, 100).join(\", \")}.`);\n\tif (blocked.length > 0) lines.push(`Do not use sources from: ${blocked.slice(0, 100).join(\", \")}.`);\n\n\treturn `${lines.join(\" \")}\\n\\n${query}`;\n}\n\nfunction addResult(results: SearchResult[], seen: Set<string>, url: unknown, title: unknown, snippet = \"\"): void {\n\tif (typeof url !== \"string\" || url.trim().length === 0) return;\n\tif (seen.has(url)) return;\n\tseen.add(url);\n\tresults.push({\n\t\ttitle: typeof title === \"string\" && title.trim().length > 0 ? title : url,\n\t\turl,\n\t\tsnippet,\n\t});\n}\n\nfunction extractSnippetAround(text: string, start: unknown, end: unknown): string {\n\tif (typeof start !== \"number\" || typeof end !== \"number\" || !text) return \"\";\n\tconst before = Math.max(0, start - 100);\n\tconst after = Math.min(text.length, end + 100);\n\tconst snippet = text.slice(before, after).replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\").trim();\n\treturn snippet.length > 300 ? `${snippet.slice(0, 297)}...` : snippet;\n}\n\nfunction extractAnswer(output: unknown[]): string {\n\tconst parts: string[] = [];\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = (part as { text?: unknown }).text;\n\t\t\tif (typeof text === \"string\" && text.trim().length > 0) parts.push(text);\n\t\t}\n\t}\n\treturn parts.join(\"\\n\").trim();\n}\n\n/**\n * Sources live in two places and neither is a top-level `citations` array:\n * `url_citation` annotations on the answer text (these carry titles and offsets,\n * so they go first and win the dedupe), and the raw `sources` each\n * `web_search_call` visited. A third-party extension that reads `data.citations`\n * silently returns answers with no sources at all — hence both paths here.\n */\nfunction extractSearchResults(output: unknown[], numResults: number | undefined): SearchResult[] {\n\tconst results: SearchResult[] = [];\n\tconst seenUrls = new Set<string>();\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = typeof (part as { text?: unknown }).text === \"string\" ? (part as { text: string }).text : \"\";\n\t\t\tconst annotations = (part as { annotations?: unknown }).annotations;\n\t\t\tif (!Array.isArray(annotations)) continue;\n\t\t\tfor (const annotation of annotations) {\n\t\t\t\tif (!annotation || typeof annotation !== \"object\") continue;\n\t\t\t\tif ((annotation as { type?: unknown }).type !== \"url_citation\") continue;\n\t\t\t\taddResult(\n\t\t\t\t\tresults,\n\t\t\t\t\tseenUrls,\n\t\t\t\t\t(annotation as { url?: unknown }).url,\n\t\t\t\t\t(annotation as { title?: unknown }).title,\n\t\t\t\t\textractSnippetAround(text, (annotation as { start_index?: unknown }).start_index, (annotation as { end_index?: unknown }).end_index),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"web_search_call\") continue;\n\t\tconst value = item as { action?: unknown; sources?: unknown; results?: unknown };\n\t\tconst actionSources = value.action && typeof value.action === \"object\"\n\t\t\t? (value.action as { sources?: unknown }).sources\n\t\t\t: undefined;\n\t\tfor (const group of [actionSources, value.sources, value.results]) {\n\t\t\tif (!Array.isArray(group)) continue;\n\t\t\tfor (const source of group) {\n\t\t\t\tif (!source || typeof source !== \"object\") continue;\n\t\t\t\tconst record = source as Record<string, unknown>;\n\t\t\t\taddResult(results, seenUrls, record.url ?? record.source_website_url, record.title ?? record.caption);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (typeof numResults === \"number\" && Number.isFinite(numResults) && numResults > 0) {\n\t\treturn results.slice(0, Math.min(Math.floor(numResults), 20));\n\t}\n\treturn results;\n}\n\nexport async function searchWithXai(\n\tquery: string,\n\toptions: SearchOptions = {},\n\tctx?: ExtensionContext,\n): Promise<SearchResponse> {\n\tconst auth = await resolveXaiAuth(ctx, options.signal);\n\tif (!auth) {\n\t\tthrow new Error(\n\t\t\t\"xAI web search unavailable. Either:\\n\" +\n\t\t\t\" 1. Use /login to sign in with a SuperGrok or X Premium subscription\\n\" +\n\t\t\t` 2. Create ${CONFIG_PATH} with { \"xaiApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 3. Set XAI_API_KEY environment variable\",\n\t\t);\n\t}\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\ttry {\n\t\tconst response = await fetch(XAI_RESPONSES_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t...toRequestHeaders(auth.headers),\n\t\t\t\tAuthorization: `Bearer ${auth.apiKey}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmodel: auth.model,\n\t\t\t\tinput: buildInput(query, options),\n\t\t\t\ttools: [{ type: \"web_search\" }],\n\t\t\t}),\n\t\t\tsignal: options.signal\n\t\t\t\t? AbortSignal.any([AbortSignal.timeout(SEARCH_TIMEOUT_MS), options.signal])\n\t\t\t\t: AbortSignal.timeout(SEARCH_TIMEOUT_MS),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tactivityMonitor.logError(activityId, `HTTP ${response.status}`);\n\t\t\tconst errorText = redactCredential(await response.text(), auth.apiKey);\n\t\t\tthrow new Error(`xAI API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t\t}\n\n\t\tlet parsed: Record<string, unknown>;\n\t\ttry {\n\t\t\tparsed = await response.json() as Record<string, unknown>;\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(`xAI API returned invalid JSON: ${message}`);\n\t\t}\n\t\tconst output = Array.isArray(parsed.output) ? parsed.output : [];\n\t\tconst answer = extractAnswer(output);\n\t\tconst results = extractSearchResults(output, options.numResults);\n\n\t\tif (!answer && results.length === 0) {\n\t\t\tthrow new Error(\"xAI web_search returned no answer or sources\");\n\t\t}\n\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\treturn { answer, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tconst redactedMessage = redactCredential(message, auth.apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, redactedMessage);\n\t\t}\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"xai-search.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/xai-search.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { SearchOptions, SearchResponse, SearchResult } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\n// xAI's Agent Tools API: hosted `web_search` and opt-in `x_search` tools on an\n// OpenAI-compatible Responses endpoint. The search runs inside xAI's own inference, so — unlike\n// every keyed backend here — it is paid for by whatever credential answers for\n// the model, including a SuperGrok / X Premium subscription resolved through\n// pi's model registry.\n//\n// Note for anyone extending this: xAI's older Live Search (`search_parameters`\n// on /v1/chat/completions) is GONE. It now answers 410 with \"Live search is\n// deprecated. Please switch to the Agent Tools API\". Do not add it back.\n//\n// The request body is deliberately minimal — model, input, tools — because that\n// is the shape verified against a live subscription account. `stream`,\n// `include`, `tool_choice` and `parallel_tool_calls` are all sent by the OpenAI\n// backend but were NOT verified here, and a 400 from an unsupported field would\n// cost the user their search. Responses API inline citations are enabled by\n// default; sources may also come back in a search call's `action.sources`.\n\nconst XAI_RESPONSES_URL = \"https://api.x.ai/v1/responses\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\n// Ordered best-first. pi's builtin xai catalog is small and xAI retires models\n// briskly, so this is a preference list, not an assumption: the first one the\n// registry actually knows wins, and an unknown id is skipped rather than sent.\n// xAI's current X Search docs use grok-4.6. Keep the existing web-only default\n// unchanged, while preferring the documented model when X Search is opted in.\nconst WEB_SEARCH_AUTH_MODEL_CANDIDATES = [\"grok-4.5\", \"grok-4.3\", \"grok-build-0.1\"] as const;\nconst X_SEARCH_AUTH_MODEL_CANDIDATES = [\"grok-4.6\", ...WEB_SEARCH_AUTH_MODEL_CANDIDATES] as const;\n\ntype XaiSearchTool = \"web_search\" | \"x_search\";\nconst DEFAULT_XAI_SEARCH_TOOLS = [\"web_search\"] as const satisfies readonly XaiSearchTool[];\n\ninterface WebSearchConfig {\n\txaiApiKey?: unknown;\n\txaiSearchModel?: unknown;\n\txaiSearchTools?: unknown;\n}\n\ntype ProviderHeaders = Record<string, string | null>;\n\ninterface XaiAuth {\n\tapiKey: string;\n\tmodel: string;\n\theaders: ProviderHeaders;\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nfunction resolveConfiguredSearchModel(value: unknown): string | undefined {\n\tif (value == null) return undefined;\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\tthrow new Error(`xaiSearchModel in ${CONFIG_PATH} must be a non-empty string`);\n\t}\n\treturn value.trim();\n}\n\nfunction resolveConfiguredSearchTools(value: unknown): XaiSearchTool[] {\n\tif (value === undefined) return [...DEFAULT_XAI_SEARCH_TOOLS];\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\tthrow new Error(`xaiSearchTools in ${CONFIG_PATH} must be a non-empty array containing only web_search or x_search`);\n\t}\n\n\tconst tools: XaiSearchTool[] = [];\n\tfor (const tool of value) {\n\t\tif (tool !== \"web_search\" && tool !== \"x_search\") {\n\t\t\tthrow new Error(`xaiSearchTools in ${CONFIG_PATH} may only contain web_search or x_search`);\n\t\t}\n\t\tif (tools.includes(tool)) {\n\t\t\tthrow new Error(`xaiSearchTools in ${CONFIG_PATH} must not contain duplicates: ${tool}`);\n\t\t}\n\t\ttools.push(tool);\n\t}\n\treturn tools;\n}\n\nfunction modelCandidatesForTools(tools: readonly XaiSearchTool[]): readonly string[] {\n\treturn tools.includes(\"x_search\") ? X_SEARCH_AUTH_MODEL_CANDIDATES : WEB_SEARCH_AUTH_MODEL_CANDIDATES;\n}\n\nfunction toRequestHeaders(headers: ProviderHeaders): Record<string, string> {\n\tconst requestHeaders: Record<string, string> = {};\n\tfor (const [name, value] of Object.entries(headers)) {\n\t\tif (value !== null) requestHeaders[name] = value;\n\t}\n\treturn requestHeaders;\n}\n\n/**\n * Resolve auth from pi's model registry first, so a Grok subscription pays for\n * its own searches and no api key has to be configured at all. Mirrors how the\n * OpenAI backend picks up a Codex sign-in.\n */\nasync function resolvePiAuth(\n\tctx: ExtensionContext,\n\tmodelOverride: string | undefined,\n\ttools: readonly XaiSearchTool[],\n): Promise<XaiAuth | undefined> {\n\tfor (const modelId of modelCandidatesForTools(tools)) {\n\t\ttry {\n\t\t\tconst model = ctx.modelRegistry.find(\"xai\", modelId);\n\t\t\tif (!model) continue;\n\t\t\tconst resolved = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\tif (resolved.ok && resolved.apiKey) {\n\t\t\t\treturn { apiKey: resolved.apiKey, model: modelOverride ?? modelId, headers: resolved.headers ?? {} };\n\t\t\t}\n\t\t} catch {\n\t\t}\n\t}\n\treturn undefined;\n}\n\nexport async function resolveXaiAuth(ctx?: ExtensionContext, signal?: AbortSignal): Promise<XaiAuth | undefined> {\n\tconst config = loadConfig();\n\tconst modelOverride = resolveConfiguredSearchModel(config.xaiSearchModel);\n\tconst tools = resolveConfiguredSearchTools(config.xaiSearchTools);\n\tif (ctx) {\n\t\tconst auth = await resolvePiAuth(ctx, modelOverride, tools);\n\t\tif (auth) return auth;\n\t}\n\n\tconst hasSource = hasCredentialSource({\n\t\tprovider: \"xAI\",\n\t\tconfiguredValue: config.xaiApiKey,\n\t\tenvironmentValue: process.env.XAI_API_KEY,\n\t});\n\tif (!hasSource) return undefined;\n\tconst apiKey = await resolveCredential({\n\t\tprovider: \"xAI\",\n\t\tconfiguredValue: config.xaiApiKey,\n\t\tenvironmentValue: process.env.XAI_API_KEY,\n\t\tsignal,\n\t});\n\treturn apiKey ? { apiKey, model: modelOverride ?? modelCandidatesForTools(tools)[0], headers: {} } : undefined;\n}\n\nexport async function isXaiSearchAvailable(ctx?: ExtensionContext): Promise<boolean> {\n\tlet config: WebSearchConfig;\n\tlet tools: XaiSearchTool[];\n\ttry {\n\t\tconfig = loadConfig();\n\t\ttools = resolveConfiguredSearchTools(config.xaiSearchTools);\n\t} catch {\n\t\treturn false;\n\t}\n\tif (ctx && await resolvePiAuth(ctx, undefined, tools)) return true;\n\treturn hasCredentialSource({\n\t\tprovider: \"xAI\",\n\t\tconfiguredValue: config.xaiApiKey,\n\t\tenvironmentValue: process.env.XAI_API_KEY,\n\t});\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\n/**\n * Recency, result count and domain filters are folded into the prompt rather\n * than sent as tool parameters. xAI's filter field names are not verified, and\n * an unknown field risks a 400 that costs the whole search; steering through\n * the instruction text degrades to \"the model ignored it\" instead.\n */\nfunction buildInput(query: string, options: SearchOptions, tools: readonly XaiSearchTool[]): string {\n\tlet searchInstruction: string;\n\tif (tools.includes(\"x_search\") && tools.includes(\"web_search\")) {\n\t\tsearchInstruction = \"Search the web and X and answer using only what the search results say.\";\n\t} else if (tools.includes(\"x_search\")) {\n\t\tsearchInstruction = \"Search X and answer using only what the X results say.\";\n\t} else {\n\t\tsearchInstruction = \"Search the web and answer using only what the web results say.\";\n\t}\n\tconst lines = [\n\t\tsearchInstruction,\n\t\t\"Cite your sources inline.\",\n\t];\n\n\tif (options.recencyFilter) {\n\t\tconst labels: Record<string, string> = {\n\t\t\tday: \"past 24 hours\",\n\t\t\tweek: \"past week\",\n\t\t\tmonth: \"past month\",\n\t\t\tyear: \"past year\",\n\t\t};\n\t\tlines.push(`Prefer sources from the ${labels[options.recencyFilter]}.`);\n\t}\n\n\tif (typeof options.numResults === \"number\" && Number.isFinite(options.numResults) && options.numResults > 0) {\n\t\tlines.push(`Prefer around ${Math.min(Math.floor(options.numResults), 20)} distinct sources.`);\n\t}\n\n\tconst allowed: string[] = [];\n\tconst blocked: string[] = [];\n\tfor (const raw of options.domainFilter ?? []) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? blocked : allowed;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\tif (allowed.length > 0) lines.push(`Only use sources from: ${allowed.slice(0, 100).join(\", \")}.`);\n\tif (blocked.length > 0) lines.push(`Do not use sources from: ${blocked.slice(0, 100).join(\", \")}.`);\n\n\treturn `${lines.join(\" \")}\\n\\n${query}`;\n}\n\nfunction addResult(results: SearchResult[], seen: Set<string>, url: unknown, title: unknown, snippet = \"\"): void {\n\tif (typeof url !== \"string\" || url.trim().length === 0) return;\n\tif (seen.has(url)) return;\n\tseen.add(url);\n\tresults.push({\n\t\ttitle: typeof title === \"string\" && title.trim().length > 0 ? title : url,\n\t\turl,\n\t\tsnippet,\n\t});\n}\n\nfunction addSource(results: SearchResult[], seen: Set<string>, source: unknown): void {\n\tif (typeof source === \"string\") {\n\t\taddResult(results, seen, source, undefined);\n\t\treturn;\n\t}\n\tif (!source || typeof source !== \"object\") return;\n\tconst record = source as Record<string, unknown>;\n\taddResult(results, seen, record.url ?? record.source_website_url, record.title ?? record.caption);\n}\n\nfunction addSources(results: SearchResult[], seen: Set<string>, sources: unknown): void {\n\tif (!Array.isArray(sources)) return;\n\tfor (const source of sources) addSource(results, seen, source);\n}\n\nfunction extractSnippetAround(text: string, start: unknown, end: unknown): string {\n\tif (typeof start !== \"number\" || typeof end !== \"number\" || !text) return \"\";\n\tconst before = Math.max(0, start - 100);\n\tconst after = Math.min(text.length, end + 100);\n\tconst snippet = text.slice(before, after).replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\").trim();\n\treturn snippet.length > 300 ? `${snippet.slice(0, 297)}...` : snippet;\n}\n\nfunction extractAnswer(output: unknown[]): string {\n\tconst parts: string[] = [];\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = (part as { text?: unknown }).text;\n\t\t\tif (typeof text === \"string\" && text.trim().length > 0) parts.push(text);\n\t\t}\n\t}\n\treturn parts.join(\"\\n\").trim();\n}\n\n/**\n * Keep annotation sources first because they carry titles and offsets and must\n * win URL deduplication. Raw source lists from web/X search calls are next,\n * followed by xAI's response-level `citations` URL list. The latter is usually\n * strings, but object entries are tolerated when a compatible gateway adds\n * metadata.\n */\nfunction extractSearchResults(output: unknown[], citations: unknown, numResults: number | undefined): SearchResult[] {\n\tconst results: SearchResult[] = [];\n\tconst seenUrls = new Set<string>();\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\" || (item as { type?: unknown }).type !== \"message\") continue;\n\t\tconst content = (item as { content?: unknown }).content;\n\t\tif (!Array.isArray(content)) continue;\n\t\tfor (const part of content) {\n\t\t\tif (!part || typeof part !== \"object\") continue;\n\t\t\tconst text = typeof (part as { text?: unknown }).text === \"string\" ? (part as { text: string }).text : \"\";\n\t\t\tconst annotations = (part as { annotations?: unknown }).annotations;\n\t\t\tif (!Array.isArray(annotations)) continue;\n\t\t\tfor (const annotation of annotations) {\n\t\t\t\tif (!annotation || typeof annotation !== \"object\") continue;\n\t\t\t\tif ((annotation as { type?: unknown }).type !== \"url_citation\") continue;\n\t\t\t\taddResult(\n\t\t\t\t\tresults,\n\t\t\t\t\tseenUrls,\n\t\t\t\t\t(annotation as { url?: unknown }).url,\n\t\t\t\t\t(annotation as { title?: unknown }).title,\n\t\t\t\t\textractSnippetAround(text, (annotation as { start_index?: unknown }).start_index, (annotation as { end_index?: unknown }).end_index),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const item of output) {\n\t\tif (!item || typeof item !== \"object\") continue;\n\t\tconst type = (item as { type?: unknown }).type;\n\t\tif (type !== \"web_search_call\" && type !== \"x_search_call\") continue;\n\t\tconst value = item as { action?: unknown; sources?: unknown; results?: unknown };\n\t\tconst actionSources = value.action && typeof value.action === \"object\"\n\t\t\t? (value.action as { sources?: unknown }).sources\n\t\t\t: undefined;\n\t\tfor (const group of [actionSources, value.sources, value.results]) addSources(results, seenUrls, group);\n\t}\n\n\taddSources(results, seenUrls, citations);\n\n\tif (typeof numResults === \"number\" && Number.isFinite(numResults) && numResults > 0) {\n\t\treturn results.slice(0, Math.min(Math.floor(numResults), 20));\n\t}\n\treturn results;\n}\n\nexport async function searchWithXai(\n\tquery: string,\n\toptions: SearchOptions = {},\n\tctx?: ExtensionContext,\n): Promise<SearchResponse> {\n\tconst tools = resolveConfiguredSearchTools(loadConfig().xaiSearchTools);\n\tconst auth = await resolveXaiAuth(ctx, options.signal);\n\tif (!auth) {\n\t\tthrow new Error(\n\t\t\t\"xAI search unavailable. Either:\\n\" +\n\t\t\t\" 1. Use /login to sign in with a SuperGrok or X Premium subscription\\n\" +\n\t\t\t` 2. Create ${CONFIG_PATH} with { \"xaiApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 3. Set XAI_API_KEY environment variable\",\n\t\t);\n\t}\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\ttry {\n\t\tconst response = await fetch(XAI_RESPONSES_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t...toRequestHeaders(auth.headers),\n\t\t\t\tAuthorization: `Bearer ${auth.apiKey}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmodel: auth.model,\n\t\t\t\tinput: buildInput(query, options, tools),\n\t\t\t\ttools: tools.map((type) => ({ type })),\n\t\t\t}),\n\t\t\tsignal: options.signal\n\t\t\t\t? AbortSignal.any([AbortSignal.timeout(SEARCH_TIMEOUT_MS), options.signal])\n\t\t\t\t: AbortSignal.timeout(SEARCH_TIMEOUT_MS),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tactivityMonitor.logError(activityId, `HTTP ${response.status}`);\n\t\t\tconst errorText = redactCredential(await response.text(), auth.apiKey);\n\t\t\tthrow new Error(`xAI API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t\t}\n\n\t\tlet parsed: Record<string, unknown>;\n\t\ttry {\n\t\t\tparsed = await response.json() as Record<string, unknown>;\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(`xAI API returned invalid JSON: ${message}`);\n\t\t}\n\t\tconst output = Array.isArray(parsed.output) ? parsed.output : [];\n\t\tconst answer = extractAnswer(output);\n\t\tconst results = extractSearchResults(output, parsed.citations, options.numResults);\n\n\t\tif (!answer && results.length === 0) {\n\t\t\tthrow new Error(`xAI ${tools.join(\"+\")} returned no answer or sources`);\n\t\t}\n\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\treturn { answer, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tconst redactedMessage = redactCredential(message, auth.apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, redactedMessage);\n\t\t}\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ export { executeHumainAgentRequest, type HumainAgentExecutionHandle, type Humain
|
|
|
28
28
|
export { type CreatePiAgentExecutionHostOptions, createPiAgentExecutionHost, } from "./humain/pi-agent-execution-host.ts";
|
|
29
29
|
export { type MainOptions, main } from "./main.ts";
|
|
30
30
|
export { AgentExecInputError, type AgentExecModeOptions, InteractiveMode, type InteractiveModeOptions, type JsonAgentSessionEvent, type ModelInfo, type PrintModeOptions, RpcClient, type RpcClientOptions, type RpcCommand, type RpcEvent, type RpcEventListener, type RpcExtensionUIRequest, type RpcExtensionUIResponse, type RpcReadyEvent, type RpcResponse, type RpcSessionState, runAgentExecMode, runPrintMode, runRpcMode, } from "./modes/index.ts";
|
|
31
|
-
export { ArminComponent, AssistantMessageComponent, BashExecutionComponent, BorderedLoader, BranchSummaryMessageComponent, CompactionSummaryMessageComponent, CustomEditor, CustomMessageComponent, DynamicBorder, ExtensionEditorComponent, ExtensionInputComponent, ExtensionSelectorComponent, FooterComponent, keyHint, keyText, LoginDialogComponent, ModelSelectorComponent, OAuthSelectorComponent, type RenderDiffOptions, rawKeyHint, renderDiff, SessionSelectorComponent, type SettingsCallbacks, type SettingsConfig, SettingsSelectorComponent, ShowImagesSelectorComponent, SkillInvocationMessageComponent, ThemeSelectorComponent, ThinkingSelectorComponent, ToolExecutionComponent, type ToolExecutionOptions, TreeSelectorComponent, truncateToVisualLines, UserMessageComponent, UserMessageSelectorComponent, type VisualTruncateResult, } from "./modes/interactive/components/index.ts";
|
|
31
|
+
export { ArminComponent, AssistantMessageComponent, BashExecutionComponent, BorderedLoader, BranchSummaryMessageComponent, CompactionSummaryMessageComponent, CustomEditor, type CustomEditorOptions, CustomMessageComponent, DynamicBorder, ExtensionEditorComponent, ExtensionInputComponent, ExtensionSelectorComponent, FooterComponent, keyHint, keyText, LoginDialogComponent, ModelSelectorComponent, OAuthSelectorComponent, type RenderDiffOptions, rawKeyHint, renderDiff, SessionSelectorComponent, type SettingsCallbacks, type SettingsConfig, SettingsSelectorComponent, ShowImagesSelectorComponent, SkillInvocationMessageComponent, ThemeSelectorComponent, ThinkingSelectorComponent, ToolExecutionComponent, type ToolExecutionOptions, TreeSelectorComponent, truncateToVisualLines, UserMessageComponent, UserMessageSelectorComponent, type VisualTruncateResult, } from "./modes/interactive/components/index.ts";
|
|
32
32
|
export { getLanguageFromPath, getMarkdownTheme, getSelectListTheme, getSettingsListTheme, highlightCode, initTheme, Theme, type ThemeColor, } from "./modes/interactive/theme/theme.ts";
|
|
33
33
|
export { copyToClipboard } from "./utils/clipboard.ts";
|
|
34
34
|
export { parseFrontmatter, stripFrontmatter } from "./utils/frontmatter.ts";
|