@humain/terminal 0.0.3-beta.3 → 0.0.4-beta.2

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.
Files changed (737) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +1 -0
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  6. package/dist/bun/restore-sandbox-env.js.map +1 -1
  7. package/dist/cli/args.d.ts +1 -0
  8. package/dist/cli/args.d.ts.map +1 -1
  9. package/dist/cli/args.js +11 -0
  10. package/dist/cli/args.js.map +1 -1
  11. package/dist/cli/auth-check.d.ts.map +1 -1
  12. package/dist/cli/auth-check.js.map +1 -1
  13. package/dist/cli/auth-command.d.ts.map +1 -1
  14. package/dist/cli/auth-command.js.map +1 -1
  15. package/dist/cli/config-selector.d.ts.map +1 -1
  16. package/dist/cli/config-selector.js.map +1 -1
  17. package/dist/cli/credential-print.d.ts.map +1 -1
  18. package/dist/cli/credential-print.js.map +1 -1
  19. package/dist/cli/experimental/auth.d.ts.map +1 -1
  20. package/dist/cli/experimental/auth.js.map +1 -1
  21. package/dist/cli/experimental/cli.d.ts.map +1 -1
  22. package/dist/cli/experimental/command-options.d.ts.map +1 -1
  23. package/dist/cli/experimental/command-options.js.map +1 -1
  24. package/dist/cli/experimental/command.d.ts.map +1 -1
  25. package/dist/cli/experimental/command.js +2 -5
  26. package/dist/cli/experimental/command.js.map +1 -1
  27. package/dist/cli/experimental/commands/client.d.ts.map +1 -1
  28. package/dist/cli/experimental/commands/client.js.map +1 -1
  29. package/dist/cli/experimental/commands/pi.d.ts.map +1 -1
  30. package/dist/cli/experimental/commands/pi.js.map +1 -1
  31. package/dist/cli/experimental/commands/server.d.ts.map +1 -1
  32. package/dist/cli/experimental/commands/server.js.map +1 -1
  33. package/dist/cli/experimental/transport-address.d.ts.map +1 -1
  34. package/dist/cli/experimental/transport-address.js.map +1 -1
  35. package/dist/cli/file-processor.d.ts.map +1 -1
  36. package/dist/cli/file-processor.js.map +1 -1
  37. package/dist/cli/initial-message.d.ts +1 -1
  38. package/dist/cli/initial-message.d.ts.map +1 -1
  39. package/dist/cli/initial-message.js.map +1 -1
  40. package/dist/cli/list-models.d.ts.map +1 -1
  41. package/dist/cli/list-models.js.map +1 -1
  42. package/dist/cli/project-trust.d.ts.map +1 -1
  43. package/dist/cli/project-trust.js.map +1 -1
  44. package/dist/cli/session-picker.d.ts.map +1 -1
  45. package/dist/cli/session-picker.js.map +1 -1
  46. package/dist/cli/startup-ui.d.ts.map +1 -1
  47. package/dist/cli/startup-ui.js.map +1 -1
  48. package/dist/cli.d.ts.map +1 -1
  49. package/dist/cli.js.map +1 -1
  50. package/dist/client/index.d.ts.map +1 -1
  51. package/dist/client/remote-session.d.ts.map +1 -1
  52. package/dist/client/remote-session.js.map +1 -1
  53. package/dist/client/transcript.d.ts.map +1 -1
  54. package/dist/client/transcript.js +1 -1
  55. package/dist/client/transcript.js.map +1 -1
  56. package/dist/config.d.ts.map +1 -1
  57. package/dist/config.js.map +1 -1
  58. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  59. package/dist/core/agent-session-runtime.js +0 -8
  60. package/dist/core/agent-session-runtime.js.map +1 -1
  61. package/dist/core/agent-session-services.d.ts.map +1 -1
  62. package/dist/core/agent-session-services.js.map +1 -1
  63. package/dist/core/agent-session.d.ts +36 -2
  64. package/dist/core/agent-session.d.ts.map +1 -1
  65. package/dist/core/agent-session.js +107 -129
  66. package/dist/core/agent-session.js.map +1 -1
  67. package/dist/core/auth-guidance.d.ts.map +1 -1
  68. package/dist/core/auth-guidance.js.map +1 -1
  69. package/dist/core/auth-storage.d.ts.map +1 -1
  70. package/dist/core/auth-storage.js +3 -8
  71. package/dist/core/auth-storage.js.map +1 -1
  72. package/dist/core/bash-executor.d.ts.map +1 -1
  73. package/dist/core/bash-executor.js.map +1 -1
  74. package/dist/core/cache-stats.d.ts.map +1 -1
  75. package/dist/core/cache-stats.js.map +1 -1
  76. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  77. package/dist/core/compaction/branch-summarization.js.map +1 -1
  78. package/dist/core/compaction/compaction.d.ts.map +1 -1
  79. package/dist/core/compaction/compaction.js.map +1 -1
  80. package/dist/core/compaction/index.d.ts.map +1 -1
  81. package/dist/core/compaction/utils.d.ts.map +1 -1
  82. package/dist/core/compaction/utils.js.map +1 -1
  83. package/dist/core/defaults.d.ts.map +1 -1
  84. package/dist/core/diagnostics.d.ts.map +1 -1
  85. package/dist/core/event-bus.d.ts.map +1 -1
  86. package/dist/core/event-bus.js.map +1 -1
  87. package/dist/core/exec.d.ts.map +1 -1
  88. package/dist/core/exec.js.map +1 -1
  89. package/dist/core/experimental.d.ts +4 -0
  90. package/dist/core/experimental.d.ts.map +1 -1
  91. package/dist/core/experimental.js +4 -0
  92. package/dist/core/experimental.js.map +1 -1
  93. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  94. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  95. package/dist/core/export-html/index.d.ts.map +1 -1
  96. package/dist/core/export-html/index.js.map +1 -1
  97. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  98. package/dist/core/export-html/tool-renderer.js.map +1 -1
  99. package/dist/core/extensions/index.d.ts.map +1 -1
  100. package/dist/core/extensions/loader.d.ts.map +1 -1
  101. package/dist/core/extensions/loader.js.map +1 -1
  102. package/dist/core/extensions/runner.d.ts.map +1 -1
  103. package/dist/core/extensions/runner.js +22 -30
  104. package/dist/core/extensions/runner.js.map +1 -1
  105. package/dist/core/extensions/types.d.ts +4 -0
  106. package/dist/core/extensions/types.d.ts.map +1 -1
  107. package/dist/core/extensions/types.js.map +1 -1
  108. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  109. package/dist/core/extensions/wrapper.js.map +1 -1
  110. package/dist/core/footer-data-provider.d.ts.map +1 -1
  111. package/dist/core/footer-data-provider.js +17 -18
  112. package/dist/core/footer-data-provider.js.map +1 -1
  113. package/dist/core/http-dispatcher.d.ts.map +1 -1
  114. package/dist/core/http-dispatcher.js.map +1 -1
  115. package/dist/core/index.d.ts.map +1 -1
  116. package/dist/core/keybindings.d.ts +24 -0
  117. package/dist/core/keybindings.d.ts.map +1 -1
  118. package/dist/core/keybindings.js +0 -1
  119. package/dist/core/keybindings.js.map +1 -1
  120. package/dist/core/messages.d.ts.map +1 -1
  121. package/dist/core/messages.js.map +1 -1
  122. package/dist/core/model-config.d.ts +5 -0
  123. package/dist/core/model-config.d.ts.map +1 -1
  124. package/dist/core/model-config.js +1 -2
  125. package/dist/core/model-config.js.map +1 -1
  126. package/dist/core/model-registry.d.ts.map +1 -1
  127. package/dist/core/model-registry.js +0 -1
  128. package/dist/core/model-registry.js.map +1 -1
  129. package/dist/core/model-resolver.d.ts.map +1 -1
  130. package/dist/core/model-resolver.js.map +1 -1
  131. package/dist/core/model-runtime.d.ts.map +1 -1
  132. package/dist/core/model-runtime.js +15 -25
  133. package/dist/core/model-runtime.js.map +1 -1
  134. package/dist/core/models-store.d.ts.map +1 -1
  135. package/dist/core/models-store.js +3 -4
  136. package/dist/core/models-store.js.map +1 -1
  137. package/dist/core/output-guard.d.ts.map +1 -1
  138. package/dist/core/output-guard.js.map +1 -1
  139. package/dist/core/package-manager.d.ts.map +1 -1
  140. package/dist/core/package-manager.js +0 -7
  141. package/dist/core/package-manager.js.map +1 -1
  142. package/dist/core/pi-manifest.d.ts.map +1 -1
  143. package/dist/core/pi-manifest.js.map +1 -1
  144. package/dist/core/project-trust.d.ts.map +1 -1
  145. package/dist/core/project-trust.js.map +1 -1
  146. package/dist/core/prompt-templates.d.ts.map +1 -1
  147. package/dist/core/prompt-templates.js.map +1 -1
  148. package/dist/core/provider-attribution.d.ts.map +1 -1
  149. package/dist/core/provider-attribution.js.map +1 -1
  150. package/dist/core/provider-composer.d.ts.map +1 -1
  151. package/dist/core/provider-composer.js.map +1 -1
  152. package/dist/core/radius.d.ts.map +1 -1
  153. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  154. package/dist/core/remote-catalog-provider.js.map +1 -1
  155. package/dist/core/resolve-config-value.d.ts.map +1 -1
  156. package/dist/core/resolve-config-value.js.map +1 -1
  157. package/dist/core/resource-loader.d.ts.map +1 -1
  158. package/dist/core/resource-loader.js +0 -44
  159. package/dist/core/resource-loader.js.map +1 -1
  160. package/dist/core/runtime-credentials.d.ts.map +1 -1
  161. package/dist/core/runtime-credentials.js +1 -2
  162. package/dist/core/runtime-credentials.js.map +1 -1
  163. package/dist/core/sdk.d.ts +5 -3
  164. package/dist/core/sdk.d.ts.map +1 -1
  165. package/dist/core/sdk.js +3 -2
  166. package/dist/core/sdk.js.map +1 -1
  167. package/dist/core/session-cwd.d.ts.map +1 -1
  168. package/dist/core/session-cwd.js +0 -1
  169. package/dist/core/session-cwd.js.map +1 -1
  170. package/dist/core/session-manager.d.ts +4 -0
  171. package/dist/core/session-manager.d.ts.map +1 -1
  172. package/dist/core/session-manager.js +55 -35
  173. package/dist/core/session-manager.js.map +1 -1
  174. package/dist/core/settings-manager.d.ts +6 -0
  175. package/dist/core/settings-manager.d.ts.map +1 -1
  176. package/dist/core/settings-manager.js +19 -17
  177. package/dist/core/settings-manager.js.map +1 -1
  178. package/dist/core/skills.d.ts.map +1 -1
  179. package/dist/core/skills.js.map +1 -1
  180. package/dist/core/slash-commands.d.ts.map +1 -1
  181. package/dist/core/source-info.d.ts.map +1 -1
  182. package/dist/core/source-info.js.map +1 -1
  183. package/dist/core/system-prompt.d.ts.map +1 -1
  184. package/dist/core/system-prompt.js +1 -1
  185. package/dist/core/system-prompt.js.map +1 -1
  186. package/dist/core/telemetry.d.ts.map +1 -1
  187. package/dist/core/telemetry.js.map +1 -1
  188. package/dist/core/timings.d.ts.map +1 -1
  189. package/dist/core/timings.js.map +1 -1
  190. package/dist/core/tools/bash.d.ts.map +1 -1
  191. package/dist/core/tools/bash.js +10 -5
  192. package/dist/core/tools/bash.js.map +1 -1
  193. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  194. package/dist/core/tools/edit-diff.js.map +1 -1
  195. package/dist/core/tools/edit.d.ts.map +1 -1
  196. package/dist/core/tools/edit.js +2 -0
  197. package/dist/core/tools/edit.js.map +1 -1
  198. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  199. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  200. package/dist/core/tools/find.d.ts +1 -1
  201. package/dist/core/tools/find.d.ts.map +1 -1
  202. package/dist/core/tools/find.js +1 -1
  203. package/dist/core/tools/find.js.map +1 -1
  204. package/dist/core/tools/grep.d.ts.map +1 -1
  205. package/dist/core/tools/grep.js +1 -1
  206. package/dist/core/tools/grep.js.map +1 -1
  207. package/dist/core/tools/index.d.ts +2 -1
  208. package/dist/core/tools/index.d.ts.map +1 -1
  209. package/dist/core/tools/index.js +9 -1
  210. package/dist/core/tools/index.js.map +1 -1
  211. package/dist/core/tools/ls.d.ts.map +1 -1
  212. package/dist/core/tools/ls.js.map +1 -1
  213. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  214. package/dist/core/tools/output-accumulator.js +12 -18
  215. package/dist/core/tools/output-accumulator.js.map +1 -1
  216. package/dist/core/tools/path-utils.d.ts.map +1 -1
  217. package/dist/core/tools/path-utils.js.map +1 -1
  218. package/dist/core/tools/read.d.ts.map +1 -1
  219. package/dist/core/tools/read.js +2 -0
  220. package/dist/core/tools/read.js.map +1 -1
  221. package/dist/core/tools/render-utils.d.ts.map +1 -1
  222. package/dist/core/tools/render-utils.js.map +1 -1
  223. package/dist/core/tools/subagent.d.ts +82 -0
  224. package/dist/core/tools/subagent.d.ts.map +1 -0
  225. package/dist/core/tools/subagent.js +980 -0
  226. package/dist/core/tools/subagent.js.map +1 -0
  227. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  228. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  229. package/dist/core/tools/truncate.d.ts.map +1 -1
  230. package/dist/core/tools/truncate.js.map +1 -1
  231. package/dist/core/tools/write.d.ts.map +1 -1
  232. package/dist/core/tools/write.js +2 -1
  233. package/dist/core/tools/write.js.map +1 -1
  234. package/dist/core/trust-manager.d.ts.map +1 -1
  235. package/dist/core/trust-manager.js +0 -1
  236. package/dist/core/trust-manager.js.map +1 -1
  237. package/dist/core/usage-totals.d.ts.map +1 -1
  238. package/dist/core/usage-totals.js.map +1 -1
  239. package/dist/extensions/index.d.ts.map +1 -1
  240. package/dist/extensions/llama/client.d.ts.map +1 -1
  241. package/dist/extensions/llama/client.js +0 -2
  242. package/dist/extensions/llama/client.js.map +1 -1
  243. package/dist/extensions/llama/huggingface.d.ts.map +1 -1
  244. package/dist/extensions/llama/huggingface.js +0 -2
  245. package/dist/extensions/llama/huggingface.js.map +1 -1
  246. package/dist/extensions/llama/index.d.ts.map +1 -1
  247. package/dist/extensions/llama/index.js.map +1 -1
  248. package/dist/extensions/llama/provider.d.ts.map +1 -1
  249. package/dist/extensions/llama/provider.js.map +1 -1
  250. package/dist/extensions/llama/ui.d.ts.map +1 -1
  251. package/dist/extensions/llama/ui.js +12 -28
  252. package/dist/extensions/llama/ui.js.map +1 -1
  253. package/dist/humain/agent-execution-protocol.d.ts.map +1 -1
  254. package/dist/humain/agent-execution-protocol.js.map +1 -1
  255. package/dist/humain/agent-execution-runtime.d.ts.map +1 -1
  256. package/dist/humain/agent-execution-runtime.js.map +1 -1
  257. package/dist/humain/bedrock-provider/vendor/index.bundle.mjs +127 -7
  258. package/dist/humain/brand-logo.d.ts.map +1 -1
  259. package/dist/humain/index.d.ts.map +1 -1
  260. package/dist/humain/index.js.map +1 -1
  261. package/dist/humain/legacy-workflow-tiers.d.ts.map +1 -1
  262. package/dist/humain/legacy-workflow-tiers.js.map +1 -1
  263. package/dist/humain/mcp-adapter/vendor/CHANGELOG.md +36 -0
  264. package/dist/humain/mcp-adapter/vendor/README.md +47 -5
  265. package/dist/humain/mcp-adapter/vendor/cli.js +163 -1
  266. package/dist/humain/mcp-adapter/vendor/commands.ts +128 -22
  267. package/dist/humain/mcp-adapter/vendor/config.ts +25 -7
  268. package/dist/humain/mcp-adapter/vendor/direct-tools.ts +5 -4
  269. package/dist/humain/mcp-adapter/vendor/index.bundle.mjs +1663 -458
  270. package/dist/humain/mcp-adapter/vendor/index.ts +219 -32
  271. package/dist/humain/mcp-adapter/vendor/init.ts +36 -4
  272. package/dist/humain/mcp-adapter/vendor/lifecycle.ts +315 -24
  273. package/dist/humain/mcp-adapter/vendor/mcp-auth-flow.ts +39 -6
  274. package/dist/humain/mcp-adapter/vendor/mcp-bearer-store.ts +387 -0
  275. package/dist/humain/mcp-adapter/vendor/mcp-callback-server.ts +27 -3
  276. package/dist/humain/mcp-adapter/vendor/mcp-code.ts +4 -0
  277. package/dist/humain/mcp-adapter/vendor/mcp-panel.ts +42 -13
  278. package/dist/humain/mcp-adapter/vendor/metadata-cache.ts +32 -21
  279. package/dist/humain/mcp-adapter/vendor/package-mcp-loader.ts +168 -0
  280. package/dist/humain/mcp-adapter/vendor/package.json +179 -177
  281. package/dist/humain/mcp-adapter/vendor/proxy-modes.ts +5 -4
  282. package/dist/humain/mcp-adapter/vendor/request-headers-command.ts +31 -37
  283. package/dist/humain/mcp-adapter/vendor/search-ranking.ts +92 -22
  284. package/dist/humain/mcp-adapter/vendor/server-manager.ts +140 -2
  285. package/dist/humain/mcp-adapter/vendor/session-recovery.ts +7 -0
  286. package/dist/humain/mcp-adapter/vendor/tool-approval.ts +15 -2
  287. package/dist/humain/mcp-adapter/vendor/tool-result-renderer.ts +44 -4
  288. package/dist/humain/mcp-adapter/vendor/types.ts +2 -0
  289. package/dist/humain/mcp-adapter/vendor/ui-server.ts +18 -16
  290. package/dist/humain/mcp-adapter/vendor/utils.ts +70 -0
  291. package/dist/humain/mcp-adapter.d.ts.map +1 -1
  292. package/dist/humain/mcp-adapter.js.map +1 -1
  293. package/dist/humain/pi-agent-execution-host.d.ts.map +1 -1
  294. package/dist/humain/pi-agent-execution-host.js.map +1 -1
  295. package/dist/humain/web-access/host.d.ts.map +1 -1
  296. package/dist/humain/web-access/index.d.ts.map +1 -1
  297. package/dist/humain/web-access/index.js.map +1 -1
  298. package/dist/humain/web-access/vendor/activity.d.ts.map +1 -1
  299. package/dist/humain/web-access/vendor/activity.js +7 -5
  300. package/dist/humain/web-access/vendor/activity.js.map +1 -1
  301. package/dist/humain/web-access/vendor/anysearch.d.ts.map +1 -1
  302. package/dist/humain/web-access/vendor/anysearch.js +3 -2
  303. package/dist/humain/web-access/vendor/anysearch.js.map +1 -1
  304. package/dist/humain/web-access/vendor/auth-fetch.d.ts.map +1 -1
  305. package/dist/humain/web-access/vendor/auth-fetch.js.map +1 -1
  306. package/dist/humain/web-access/vendor/bocha.d.ts.map +1 -1
  307. package/dist/humain/web-access/vendor/bocha.js.map +1 -1
  308. package/dist/humain/web-access/vendor/brave.d.ts.map +1 -1
  309. package/dist/humain/web-access/vendor/brave.js +14 -4
  310. package/dist/humain/web-access/vendor/brave.js.map +1 -1
  311. package/dist/humain/web-access/vendor/brightdata-unlocker.d.ts.map +1 -1
  312. package/dist/humain/web-access/vendor/brightdata-unlocker.js.map +1 -1
  313. package/dist/humain/web-access/vendor/brightdata.d.ts.map +1 -1
  314. package/dist/humain/web-access/vendor/brightdata.js.map +1 -1
  315. package/dist/humain/web-access/vendor/chrome-cookies.d.ts.map +1 -1
  316. package/dist/humain/web-access/vendor/chrome-cookies.js +92 -14
  317. package/dist/humain/web-access/vendor/chrome-cookies.js.map +1 -1
  318. package/dist/humain/web-access/vendor/content-find.d.ts.map +1 -1
  319. package/dist/humain/web-access/vendor/content-find.js.map +1 -1
  320. package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -1
  321. package/dist/humain/web-access/vendor/credential-source.js +0 -2
  322. package/dist/humain/web-access/vendor/credential-source.js.map +1 -1
  323. package/dist/humain/web-access/vendor/curator-page.d.ts +3 -0
  324. package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
  325. package/dist/humain/web-access/vendor/curator-page.js +4 -1
  326. package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
  327. package/dist/humain/web-access/vendor/curator-server.d.ts +3 -0
  328. package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
  329. package/dist/humain/web-access/vendor/curator-server.js +6 -0
  330. package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
  331. package/dist/humain/web-access/vendor/data-uri-sanitize.d.ts +21 -0
  332. package/dist/humain/web-access/vendor/data-uri-sanitize.d.ts.map +1 -0
  333. package/dist/humain/web-access/vendor/data-uri-sanitize.js +373 -0
  334. package/dist/humain/web-access/vendor/data-uri-sanitize.js.map +1 -0
  335. package/dist/humain/web-access/vendor/datalab-pdf-extract.d.ts.map +1 -1
  336. package/dist/humain/web-access/vendor/datalab-pdf-extract.js.map +1 -1
  337. package/dist/humain/web-access/vendor/declared-web-links.d.ts.map +1 -1
  338. package/dist/humain/web-access/vendor/declared-web-links.js.map +1 -1
  339. package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -1
  340. package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -1
  341. package/dist/humain/web-access/vendor/exa.d.ts.map +1 -1
  342. package/dist/humain/web-access/vendor/exa.js +16 -7
  343. package/dist/humain/web-access/vendor/exa.js.map +1 -1
  344. package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
  345. package/dist/humain/web-access/vendor/extract.js +45 -5
  346. package/dist/humain/web-access/vendor/extract.js.map +1 -1
  347. package/dist/humain/web-access/vendor/feature-config.d.ts.map +1 -1
  348. package/dist/humain/web-access/vendor/feature-config.js.map +1 -1
  349. package/dist/humain/web-access/vendor/fetch-params.d.ts.map +1 -1
  350. package/dist/humain/web-access/vendor/fetch-params.js.map +1 -1
  351. package/dist/humain/web-access/vendor/firecrawl.d.ts.map +1 -1
  352. package/dist/humain/web-access/vendor/firecrawl.js +15 -2
  353. package/dist/humain/web-access/vendor/firecrawl.js.map +1 -1
  354. package/dist/humain/web-access/vendor/gemini-api.d.ts.map +1 -1
  355. package/dist/humain/web-access/vendor/gemini-api.js.map +1 -1
  356. package/dist/humain/web-access/vendor/gemini-pdf-extract.d.ts.map +1 -1
  357. package/dist/humain/web-access/vendor/gemini-pdf-extract.js.map +1 -1
  358. package/dist/humain/web-access/vendor/gemini-search.d.ts +2 -2
  359. package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
  360. package/dist/humain/web-access/vendor/gemini-search.js +25 -8
  361. package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
  362. package/dist/humain/web-access/vendor/gemini-url-context.d.ts.map +1 -1
  363. package/dist/humain/web-access/vendor/gemini-url-context.js.map +1 -1
  364. package/dist/humain/web-access/vendor/gemini-web-config.d.ts.map +1 -1
  365. package/dist/humain/web-access/vendor/gemini-web-config.js.map +1 -1
  366. package/dist/humain/web-access/vendor/gemini-web.d.ts.map +1 -1
  367. package/dist/humain/web-access/vendor/gemini-web.js.map +1 -1
  368. package/dist/humain/web-access/vendor/github-api.d.ts.map +1 -1
  369. package/dist/humain/web-access/vendor/github-api.js.map +1 -1
  370. package/dist/humain/web-access/vendor/github-extract.d.ts.map +1 -1
  371. package/dist/humain/web-access/vendor/github-extract.js +69 -35
  372. package/dist/humain/web-access/vendor/github-extract.js.map +1 -1
  373. package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
  374. package/dist/humain/web-access/vendor/index.js +58 -54
  375. package/dist/humain/web-access/vendor/index.js.map +1 -1
  376. package/dist/humain/web-access/vendor/jina-search.d.ts.map +1 -1
  377. package/dist/humain/web-access/vendor/jina-search.js.map +1 -1
  378. package/dist/humain/web-access/vendor/kagi.d.ts.map +1 -1
  379. package/dist/humain/web-access/vendor/kagi.js.map +1 -1
  380. package/dist/humain/web-access/vendor/ollama.d.ts.map +1 -1
  381. package/dist/humain/web-access/vendor/ollama.js.map +1 -1
  382. package/dist/humain/web-access/vendor/openai-search.d.ts +1 -1
  383. package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -1
  384. package/dist/humain/web-access/vendor/openai-search.js +15 -5
  385. package/dist/humain/web-access/vendor/openai-search.js.map +1 -1
  386. package/dist/humain/web-access/vendor/page-query.d.ts +1 -2
  387. package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -1
  388. package/dist/humain/web-access/vendor/page-query.js +5 -2
  389. package/dist/humain/web-access/vendor/page-query.js.map +1 -1
  390. package/dist/humain/web-access/vendor/parallel-mcp.d.ts +10 -0
  391. package/dist/humain/web-access/vendor/parallel-mcp.d.ts.map +1 -0
  392. package/dist/humain/web-access/vendor/parallel-mcp.js +224 -0
  393. package/dist/humain/web-access/vendor/parallel-mcp.js.map +1 -0
  394. package/dist/humain/web-access/vendor/parallel.d.ts +1 -0
  395. package/dist/humain/web-access/vendor/parallel.d.ts.map +1 -1
  396. package/dist/humain/web-access/vendor/parallel.js +2 -2
  397. package/dist/humain/web-access/vendor/parallel.js.map +1 -1
  398. package/dist/humain/web-access/vendor/pdf-extract.d.ts +1 -0
  399. package/dist/humain/web-access/vendor/pdf-extract.d.ts.map +1 -1
  400. package/dist/humain/web-access/vendor/pdf-extract.js +15 -5
  401. package/dist/humain/web-access/vendor/pdf-extract.js.map +1 -1
  402. package/dist/humain/web-access/vendor/perplexity.d.ts.map +1 -1
  403. package/dist/humain/web-access/vendor/perplexity.js.map +1 -1
  404. package/dist/humain/web-access/vendor/querit.d.ts.map +1 -1
  405. package/dist/humain/web-access/vendor/querit.js.map +1 -1
  406. package/dist/humain/web-access/vendor/query-rewrite.d.ts +3 -0
  407. package/dist/humain/web-access/vendor/query-rewrite.d.ts.map +1 -0
  408. package/dist/humain/web-access/vendor/query-rewrite.js +42 -0
  409. package/dist/humain/web-access/vendor/query-rewrite.js.map +1 -0
  410. package/dist/humain/web-access/vendor/render-search-error.d.ts.map +1 -1
  411. package/dist/humain/web-access/vendor/render-search-error.js.map +1 -1
  412. package/dist/humain/web-access/vendor/rsc-extract.d.ts.map +1 -1
  413. package/dist/humain/web-access/vendor/rsc-extract.js.map +1 -1
  414. package/dist/humain/web-access/vendor/search1api.d.ts.map +1 -1
  415. package/dist/humain/web-access/vendor/search1api.js.map +1 -1
  416. package/dist/humain/web-access/vendor/searchinfinity.d.ts.map +1 -1
  417. package/dist/humain/web-access/vendor/searchinfinity.js.map +1 -1
  418. package/dist/humain/web-access/vendor/searxng.d.ts.map +1 -1
  419. package/dist/humain/web-access/vendor/searxng.js.map +1 -1
  420. package/dist/humain/web-access/vendor/serpbase.d.ts.map +1 -1
  421. package/dist/humain/web-access/vendor/serpbase.js.map +1 -1
  422. package/dist/humain/web-access/vendor/serpdive.d.ts.map +1 -1
  423. package/dist/humain/web-access/vendor/serpdive.js.map +1 -1
  424. package/dist/humain/web-access/vendor/serper.d.ts +4 -0
  425. package/dist/humain/web-access/vendor/serper.d.ts.map +1 -0
  426. package/dist/humain/web-access/vendor/serper.js +206 -0
  427. package/dist/humain/web-access/vendor/serper.js.map +1 -0
  428. package/dist/humain/web-access/vendor/source-check.d.ts.map +1 -1
  429. package/dist/humain/web-access/vendor/source-check.js.map +1 -1
  430. package/dist/humain/web-access/vendor/ssrf-protection.d.ts +2 -0
  431. package/dist/humain/web-access/vendor/ssrf-protection.d.ts.map +1 -1
  432. package/dist/humain/web-access/vendor/ssrf-protection.js +11 -2
  433. package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -1
  434. package/dist/humain/web-access/vendor/storage.d.ts.map +1 -1
  435. package/dist/humain/web-access/vendor/storage.js.map +1 -1
  436. package/dist/humain/web-access/vendor/summary-model-scope.d.ts +5 -0
  437. package/dist/humain/web-access/vendor/summary-model-scope.d.ts.map +1 -1
  438. package/dist/humain/web-access/vendor/summary-model-scope.js +10 -5
  439. package/dist/humain/web-access/vendor/summary-model-scope.js.map +1 -1
  440. package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -1
  441. package/dist/humain/web-access/vendor/summary-review.js +40 -14
  442. package/dist/humain/web-access/vendor/summary-review.js.map +1 -1
  443. package/dist/humain/web-access/vendor/tavily.d.ts.map +1 -1
  444. package/dist/humain/web-access/vendor/tavily.js +14 -4
  445. package/dist/humain/web-access/vendor/tavily.js.map +1 -1
  446. package/dist/humain/web-access/vendor/tinyfish.d.ts.map +1 -1
  447. package/dist/humain/web-access/vendor/tinyfish.js.map +1 -1
  448. package/dist/humain/web-access/vendor/utils.d.ts +10 -0
  449. package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
  450. package/dist/humain/web-access/vendor/utils.js +70 -0
  451. package/dist/humain/web-access/vendor/utils.js.map +1 -1
  452. package/dist/humain/web-access/vendor/valyu.d.ts +6 -0
  453. package/dist/humain/web-access/vendor/valyu.d.ts.map +1 -0
  454. package/dist/humain/web-access/vendor/valyu.js +194 -0
  455. package/dist/humain/web-access/vendor/valyu.js.map +1 -0
  456. package/dist/humain/web-access/vendor/video-extract.d.ts.map +1 -1
  457. package/dist/humain/web-access/vendor/video-extract.js.map +1 -1
  458. package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -1
  459. package/dist/humain/web-access/vendor/xai-search.js.map +1 -1
  460. package/dist/humain/web-access/vendor/youtube-extract.d.ts.map +1 -1
  461. package/dist/humain/web-access/vendor/youtube-extract.js.map +1 -1
  462. package/dist/index.d.ts +1 -1
  463. package/dist/index.d.ts.map +1 -1
  464. package/dist/index.js.map +1 -1
  465. package/dist/main.d.ts.map +1 -1
  466. package/dist/main.js +4 -0
  467. package/dist/main.js.map +1 -1
  468. package/dist/migrations.d.ts.map +1 -1
  469. package/dist/migrations.js.map +1 -1
  470. package/dist/modes/agent-exec-mode.d.ts.map +1 -1
  471. package/dist/modes/agent-exec-mode.js.map +1 -1
  472. package/dist/modes/index.d.ts.map +1 -1
  473. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/armin.js +6 -10
  475. package/dist/modes/interactive/components/armin.js.map +1 -1
  476. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  477. package/dist/modes/interactive/components/assistant-message.js +2 -9
  478. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  479. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  480. package/dist/modes/interactive/components/bash-execution.js +4 -9
  481. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  482. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  483. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  484. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  485. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  486. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  487. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  488. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  489. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  490. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  491. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  492. package/dist/modes/interactive/components/config-selector.js +5 -22
  493. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  494. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  495. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  496. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  497. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  498. package/dist/modes/interactive/components/custom-editor.js +1 -8
  499. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  500. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  501. package/dist/modes/interactive/components/custom-entry.js +1 -4
  502. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  503. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  504. package/dist/modes/interactive/components/custom-message.js +1 -7
  505. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  506. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  507. package/dist/modes/interactive/components/daxnuts.js +6 -8
  508. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  509. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  510. package/dist/modes/interactive/components/diff.js +2 -2
  511. package/dist/modes/interactive/components/diff.js.map +1 -1
  512. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  513. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  514. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  515. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  516. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  517. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  518. package/dist/modes/interactive/components/extension-editor.js +1 -7
  519. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  520. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  521. package/dist/modes/interactive/components/extension-input.js +2 -8
  522. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  523. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  524. package/dist/modes/interactive/components/extension-selector.js +1 -9
  525. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  526. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  527. package/dist/modes/interactive/components/first-time-setup.js +2 -4
  528. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  529. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  530. package/dist/modes/interactive/components/footer.js +1 -3
  531. package/dist/modes/interactive/components/footer.js.map +1 -1
  532. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  533. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  534. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  535. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  536. package/dist/modes/interactive/components/login-dialog.js +3 -9
  537. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  538. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  539. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  540. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  541. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  542. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  543. package/dist/modes/interactive/components/model-selector.js +14 -26
  544. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  545. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  546. package/dist/modes/interactive/components/oauth-selector.js +3 -11
  547. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  548. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  549. package/dist/modes/interactive/components/scoped-models-selector.js +9 -14
  550. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  551. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  552. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  553. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  554. package/dist/modes/interactive/components/session-selector.js +33 -57
  555. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  556. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  557. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  558. package/dist/modes/interactive/components/settings-selector.js +10 -14
  559. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  560. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  561. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  562. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  563. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  564. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  565. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  566. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  567. package/dist/modes/interactive/components/status-indicator.js +0 -2
  568. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  569. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  570. package/dist/modes/interactive/components/theme-selector.js +0 -2
  571. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  572. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  573. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  574. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  575. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  576. package/dist/modes/interactive/components/tool-execution.js +19 -25
  577. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  578. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  579. package/dist/modes/interactive/components/tree-selector.js +18 -34
  580. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  581. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  582. package/dist/modes/interactive/components/trust-selector.js +0 -6
  583. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  584. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  585. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  586. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  587. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  588. package/dist/modes/interactive/components/user-message.js +0 -4
  589. package/dist/modes/interactive/components/user-message.js.map +1 -1
  590. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  591. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  592. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  593. package/dist/modes/interactive/external-editor.js.map +1 -1
  594. package/dist/modes/interactive/interactive-mode.d.ts +18 -2
  595. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  596. package/dist/modes/interactive/interactive-mode.js +147 -137
  597. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  598. package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
  599. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  600. package/dist/modes/interactive/model-catalog-refresh.js +36 -0
  601. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  602. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  603. package/dist/modes/interactive/model-search.js.map +1 -1
  604. package/dist/modes/interactive/theme/dark.json +2 -0
  605. package/dist/modes/interactive/theme/light.json +2 -0
  606. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  607. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  608. package/dist/modes/interactive/theme/theme-controller.js +25 -18
  609. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  610. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  611. package/dist/modes/interactive/theme/theme.d.ts +7 -5
  612. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  613. package/dist/modes/interactive/theme/theme.js +12 -8
  614. package/dist/modes/interactive/theme/theme.js.map +1 -1
  615. package/dist/modes/json-event.d.ts +4 -1
  616. package/dist/modes/json-event.d.ts.map +1 -1
  617. package/dist/modes/json-event.js +5 -2
  618. package/dist/modes/json-event.js.map +1 -1
  619. package/dist/modes/print-mode.d.ts.map +1 -1
  620. package/dist/modes/print-mode.js.map +1 -1
  621. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  622. package/dist/modes/rpc/jsonl.js.map +1 -1
  623. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  624. package/dist/modes/rpc/rpc-client.js +9 -10
  625. package/dist/modes/rpc/rpc-client.js.map +1 -1
  626. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  627. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  628. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  629. package/dist/package-manager-cli.d.ts.map +1 -1
  630. package/dist/package-manager-cli.js.map +1 -1
  631. package/dist/rpc-entry.d.ts.map +1 -1
  632. package/dist/rpc-entry.js.map +1 -1
  633. package/dist/server/create-harness.d.ts.map +1 -1
  634. package/dist/server/create-harness.js +2 -0
  635. package/dist/server/create-harness.js.map +1 -1
  636. package/dist/utils/abort.d.ts.map +1 -1
  637. package/dist/utils/abort.js.map +1 -1
  638. package/dist/utils/ansi.d.ts.map +1 -1
  639. package/dist/utils/ansi.js.map +1 -1
  640. package/dist/utils/changelog.d.ts.map +1 -1
  641. package/dist/utils/changelog.js.map +1 -1
  642. package/dist/utils/child-process.d.ts.map +1 -1
  643. package/dist/utils/child-process.js.map +1 -1
  644. package/dist/utils/clipboard-image.d.ts.map +1 -1
  645. package/dist/utils/clipboard-image.js +1 -1
  646. package/dist/utils/clipboard-image.js.map +1 -1
  647. package/dist/utils/clipboard-native.d.ts.map +1 -1
  648. package/dist/utils/clipboard-native.js.map +1 -1
  649. package/dist/utils/clipboard.d.ts.map +1 -1
  650. package/dist/utils/clipboard.js.map +1 -1
  651. package/dist/utils/deprecation.d.ts.map +1 -1
  652. package/dist/utils/deprecation.js.map +1 -1
  653. package/dist/utils/exif-orientation.d.ts.map +1 -1
  654. package/dist/utils/exif-orientation.js.map +1 -1
  655. package/dist/utils/frontmatter.d.ts.map +1 -1
  656. package/dist/utils/frontmatter.js.map +1 -1
  657. package/dist/utils/fs-watch.d.ts.map +1 -1
  658. package/dist/utils/fs-watch.js.map +1 -1
  659. package/dist/utils/git.d.ts.map +1 -1
  660. package/dist/utils/git.js.map +1 -1
  661. package/dist/utils/html.d.ts.map +1 -1
  662. package/dist/utils/html.js.map +1 -1
  663. package/dist/utils/image-convert.d.ts.map +1 -1
  664. package/dist/utils/image-convert.js.map +1 -1
  665. package/dist/utils/image-process.d.ts.map +1 -1
  666. package/dist/utils/image-process.js.map +1 -1
  667. package/dist/utils/image-resize-core.d.ts.map +1 -1
  668. package/dist/utils/image-resize-core.js.map +1 -1
  669. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  670. package/dist/utils/image-resize-worker.js.map +1 -1
  671. package/dist/utils/image-resize.d.ts.map +1 -1
  672. package/dist/utils/image-resize.js.map +1 -1
  673. package/dist/utils/json.d.ts.map +1 -1
  674. package/dist/utils/json.js.map +1 -1
  675. package/dist/utils/management-http.d.ts.map +1 -1
  676. package/dist/utils/management-http.js.map +1 -1
  677. package/dist/utils/mime.d.ts.map +1 -1
  678. package/dist/utils/mime.js.map +1 -1
  679. package/dist/utils/open-browser.d.ts.map +1 -1
  680. package/dist/utils/open-browser.js.map +1 -1
  681. package/dist/utils/paths.d.ts.map +1 -1
  682. package/dist/utils/paths.js.map +1 -1
  683. package/dist/utils/photon.d.ts.map +1 -1
  684. package/dist/utils/photon.js.map +1 -1
  685. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  686. package/dist/utils/pi-user-agent.js.map +1 -1
  687. package/dist/utils/shell.d.ts.map +1 -1
  688. package/dist/utils/shell.js.map +1 -1
  689. package/dist/utils/sleep.d.ts.map +1 -1
  690. package/dist/utils/sleep.js.map +1 -1
  691. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  692. package/dist/utils/syntax-highlight.js +1 -1
  693. package/dist/utils/syntax-highlight.js.map +1 -1
  694. package/dist/utils/tool-result-images.d.ts.map +1 -1
  695. package/dist/utils/tool-result-images.js.map +1 -1
  696. package/dist/utils/tools-manager.d.ts +10 -1
  697. package/dist/utils/tools-manager.d.ts.map +1 -1
  698. package/dist/utils/tools-manager.js +14 -19
  699. package/dist/utils/tools-manager.js.map +1 -1
  700. package/dist/utils/version-check.d.ts.map +1 -1
  701. package/dist/utils/version-check.js.map +1 -1
  702. package/dist/utils/windows-self-update.d.ts.map +1 -1
  703. package/dist/utils/windows-self-update.js.map +1 -1
  704. package/docs/compaction.md +3 -3
  705. package/docs/custom-provider.md +1 -1
  706. package/docs/environment-variables.md +1 -0
  707. package/docs/extensions.md +5 -1
  708. package/docs/json.md +6 -4
  709. package/docs/keybindings.md +8 -2
  710. package/docs/rpc.md +15 -4
  711. package/docs/sdk.md +9 -0
  712. package/docs/settings.md +31 -0
  713. package/docs/terminal-setup.md +23 -2
  714. package/docs/themes.md +23 -3
  715. package/docs/tui.md +2 -2
  716. package/docs/usage.md +3 -2
  717. package/examples/extensions/README.md +1 -1
  718. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  719. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  720. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  721. package/examples/extensions/gondolin/package-lock.json +2 -2
  722. package/examples/extensions/gondolin/package.json +1 -1
  723. package/examples/extensions/minimal-mode.ts +6 -6
  724. package/examples/extensions/sandbox/package-lock.json +2 -2
  725. package/examples/extensions/sandbox/package.json +2 -2
  726. package/examples/extensions/subagent/README.md +24 -147
  727. package/examples/extensions/with-deps/package-lock.json +2 -2
  728. package/examples/extensions/with-deps/package.json +1 -1
  729. package/npm-shrinkwrap.json +853 -661
  730. package/package.json +33 -33
  731. package/src/humain/mcp-adapter/UPSTREAM.md +1 -1
  732. package/src/humain/mcp-adapter/upstream.json +3 -3
  733. package/src/humain/mcp-adapter/vendor/CHANGELOG.md +36 -0
  734. package/src/humain/web-access/UPSTREAM.md +1 -1
  735. package/src/humain/web-access/upstream.json +4 -4
  736. package/examples/extensions/subagent/agents.ts +0 -126
  737. package/examples/extensions/subagent/index.ts +0 -1015
@@ -1 +1 @@
1
- {"version":3,"file":"querit.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/querit.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport type { ExtractedContent, ExtractOptions } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst QUERIT_SEARCH_URL = \"https://api.querit.ai/v1/search\";\nconst QUERIT_CONTENTS_URL = \"https://api.querit.ai/v1/contents\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\nconst CONTENTS_TIMEOUT_MS = 60_000;\nconst MAX_CONTENT_URLS = 10;\n\ninterface WebSearchConfig {\n\tqueritApiKey?: unknown;\n}\n\ninterface QueritSearchResult {\n\turl?: string | null;\n\ttitle?: string | null;\n\tsnippet?: string | null;\n\tpage_age?: string | null;\n\tsite_name?: string | null;\n}\n\ninterface QueritSearchResponse {\n\terror_code?: number | string;\n\terror_msg?: string;\n\tsearch_id?: number | string;\n\tresults?: { result?: QueritSearchResult[] };\n}\n\ninterface QueritContentMetadata {\n\ttitle?: string | null;\n\turl?: string | null;\n\tpublishTime?: string | null;\n\tsiteName?: string | null;\n\tsiteIcon?: string | null;\n}\n\ninterface QueritContentResult {\n\tid?: string | null;\n\turl?: string | null;\n\tcontent?: string | null;\n\textrasMeta?: QueritContentMetadata | null;\n}\n\ninterface QueritContentStatus {\n\tid?: string | null;\n\tstatus?: string | null;\n}\n\ninterface QueritContentsResponse {\n\terror_code?: number | string;\n\terror_msg?: string;\n\tsearch_id?: number | string;\n\tresults?: QueritContentResult[];\n\tstatuses?: QueritContentStatus[];\n\tsearchTime?: number;\n}\n\ninterface QueritSearchOptions extends SearchOptions {\n\tincludeContent?: boolean;\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\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid config in ${CONFIG_PATH}: expected a JSON object`);\n\t}\n\tcachedConfig = parsed as WebSearchConfig;\n\treturn cachedConfig;\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string> {\n\tconst key = await resolveCredential({\n\t\tprovider: \"Querit\",\n\t\tconfiguredValue: loadConfig().queritApiKey,\n\t\tenvironmentValue: process.env.QUERIT_API_KEY,\n\t\tsignal,\n\t});\n\tif (!key) {\n\t\tthrow new Error(\n\t\t\t\"Querit API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"queritApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set QUERIT_API_KEY environment variable\\n\" +\n\t\t\t\"Create a key at https://www.querit.ai/en/dashboard/api-keys\",\n\t\t);\n\t}\n\treturn key;\n}\n\nexport function isQueritAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"Querit\",\n\t\tconfiguredValue: loadConfig().queritApiKey,\n\t\tenvironmentValue: process.env.QUERIT_API_KEY,\n\t});\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction requestSignal(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n\tconst timeout = AbortSignal.timeout(timeoutMs);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction normalizeNumResults(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 5;\n\treturn Math.max(1, Math.min(Math.floor(value), 20));\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\nfunction mapDomainFilter(domainFilter: string[] | undefined): { include: string[]; exclude: string[] } {\n\tconst include: string[] = [];\n\tconst exclude: string[] = [];\n\tfor (const raw of domainFilter ?? []) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? exclude : include;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn { include, exclude };\n}\n\nfunction mapRecencyFilter(value: SearchOptions[\"recencyFilter\"]): string | undefined {\n\tif (value === \"day\") return \"d1\";\n\tif (value === \"week\") return \"w1\";\n\tif (value === \"month\") return \"m1\";\n\tif (value === \"year\") return \"y1\";\n\treturn undefined;\n}\n\nfunction buildSearchBody(query: string, options: QueritSearchOptions): Record<string, unknown> {\n\tconst { include, exclude } = mapDomainFilter(options.domainFilter);\n\tconst date = mapRecencyFilter(options.recencyFilter);\n\tconst filters: Record<string, unknown> = {};\n\tif (include.length > 0 || exclude.length > 0) {\n\t\tfilters.sites = {\n\t\t\t...(include.length > 0 ? { include } : {}),\n\t\t\t...(exclude.length > 0 ? { exclude } : {}),\n\t\t};\n\t}\n\tif (date) filters.timeRange = { date };\n\treturn {\n\t\tquery,\n\t\tcount: normalizeNumResults(options.numResults),\n\t\t...(Object.keys(filters).length > 0 ? { filters } : {}),\n\t};\n}\n\nfunction normalizeTimeoutMs(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return CONTENTS_TIMEOUT_MS;\n\treturn Math.max(1, Math.floor(value));\n}\n\nfunction crawlTimeoutSeconds(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 10;\n\treturn Math.max(1, Math.min(Math.ceil(value / 1_000), 60));\n}\n\nfunction buildContentsBody(urls: string[], options: ExtractOptions = {}): Record<string, unknown> {\n\treturn {\n\t\turls,\n\t\tformat: \"markdown\",\n\t\tcrawlTimeout: crawlTimeoutSeconds(options.timeoutMs),\n\t\textrasMeta: true,\n\t};\n}\n\nasync function queritJsonRequest<T>(\n\tlabel: \"Search\" | \"Contents\",\n\turl: string,\n\tapiKey: string,\n\tbody: Record<string, unknown>,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\tAccept: \"application/json\",\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal(signal, timeoutMs),\n\t\t});\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst isRequestAbort = err instanceof Error\n\t\t\t? err.name === \"AbortError\" || err.name === \"TimeoutError\" || /abort|timeout/i.test(message)\n\t\t\t: /abort|timeout/i.test(message);\n\t\tif (!signal?.aborted && isRequestAbort) {\n\t\t\tconst timeoutError = new Error(`Querit ${label} API request timed out after ${Math.ceil(timeoutMs / 1_000)} seconds`);\n\t\t\ttimeoutError.name = \"TimeoutError\";\n\t\t\tthrow timeoutError;\n\t\t}\n\t\tconst redactedMessage = redactCredential(message, apiKey);\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\tconst raw = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`Querit ${label} API error ${response.status}: ${redactCredential(raw, apiKey).slice(0, 300)}`);\n\t}\n\ttry {\n\t\treturn JSON.parse(raw) as T;\n\t} catch (err) {\n\t\tthrow new Error(`Querit ${label} API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n}\n\nfunction assertApiSuccess(label: \"Search\" | \"Contents\", data: QueritSearchResponse | QueritContentsResponse): void {\n\tconst code = Number(data.error_code);\n\tif (!Number.isFinite(code) || code !== 200) {\n\t\tconst renderedCode = data.error_code === undefined ? \"unknown\" : String(data.error_code);\n\t\tconst message = typeof data.error_msg === \"string\" && data.error_msg.trim() ? `: ${data.error_msg.trim()}` : \"\";\n\t\tthrow new Error(`Querit ${label} API returned error ${renderedCode}${message}`);\n\t}\n}\n\nfunction mapSearchResults(data: QueritSearchResponse): SearchResponse[\"results\"] {\n\tconst items = data.results?.result;\n\tif (!Array.isArray(items)) {\n\t\tthrow new Error(\"Querit Search API returned an unexpected response shape\");\n\t}\n\treturn items.flatMap((item) => {\n\t\tif (!item || typeof item.url !== \"string\" || item.url.trim().length === 0) return [];\n\t\tconst url = item.url.trim();\n\t\treturn [{\n\t\t\ttitle: typeof item.title === \"string\" && item.title.trim() ? item.title.trim() : url,\n\t\t\turl,\n\t\t\tsnippet: typeof item.snippet === \"string\" ? item.snippet.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t}];\n\t});\n}\n\nfunction buildAnswer(results: SearchResponse[\"results\"]): string {\n\treturn results.map((result) => {\n\t\tif (result.snippet) return `${result.snippet}\\nSource: ${result.title} (${result.url})`;\n\t\treturn `Source: ${result.title} (${result.url})`;\n\t}).join(\"\\n\\n\");\n}\n\nfunction mapContentResult(result: QueritContentResult | undefined, requestedUrl: string): ExtractedContent | null {\n\tif (!result || typeof result.content !== \"string\" || result.content.trim().length === 0) return null;\n\tconst metadata = result.extrasMeta;\n\treturn {\n\t\turl: requestedUrl,\n\t\ttitle: metadata && typeof metadata.title === \"string\" ? metadata.title.trim() : \"\",\n\t\tcontent: result.content.trim(),\n\t\terror: null,\n\t};\n}\n\nfunction findContentResult(\n\tdata: QueritContentsResponse,\n\trequestedUrl: string,\n\tindex: number,\n\trequestedCount: number,\n): QueritContentResult | undefined {\n\tif (!Array.isArray(data.results)) return undefined;\n\tconst exact = data.results.find((item) => item?.url === requestedUrl || item?.extrasMeta?.url === requestedUrl);\n\tif (exact) return exact;\n\tif (requestedCount === 1) return data.results[0];\n\treturn data.results.length === requestedCount ? data.results[index] : undefined;\n}\n\nfunction failedContentStatus(data: QueritContentsResponse, result: QueritContentResult | undefined, index: number): boolean {\n\tif (!Array.isArray(data.statuses)) return false;\n\tconst status = result?.id\n\t\t? data.statuses.find((item) => item?.id === result.id)\n\t\t: data.statuses[index];\n\treturn status?.status === \"failed\";\n}\n\nasync function fetchContentsBatch(\n\turls: string[],\n\tapiKey: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<QueritContentsResponse> {\n\tconst data = await queritJsonRequest<QueritContentsResponse>(\n\t\t\"Contents\",\n\t\tQUERIT_CONTENTS_URL,\n\t\tapiKey,\n\t\tbuildContentsBody(urls, options),\n\t\tnormalizeTimeoutMs(options.timeoutMs),\n\t\tsignal,\n\t);\n\tassertApiSuccess(\"Contents\", data);\n\tif (!Array.isArray(data.results) || !Array.isArray(data.statuses)) {\n\t\tthrow new Error(\"Querit Contents API returned an unexpected response shape\");\n\t}\n\treturn data;\n}\n\nasync function fetchInlineContent(urls: string[], apiKey: string, signal?: AbortSignal): Promise<ExtractedContent[]> {\n\tconst content: ExtractedContent[] = [];\n\tfor (let offset = 0; offset < urls.length; offset += MAX_CONTENT_URLS) {\n\t\tconst batch = urls.slice(offset, offset + MAX_CONTENT_URLS);\n\t\tconst data = await fetchContentsBatch(batch, apiKey, signal);\n\t\tfor (let index = 0; index < batch.length; index++) {\n\t\t\tconst requestedUrl = batch[index];\n\t\t\tconst result = findContentResult(data, requestedUrl, index, batch.length);\n\t\t\tconst mapped = mapContentResult(result, requestedUrl);\n\t\t\tif (mapped) content.push(mapped);\n\t\t}\n\t}\n\treturn content;\n}\n\nexport async function searchWithQuerit(\n\tquery: string,\n\toptions: QueritSearchOptions = {},\n): Promise<SearchResponse> {\n\tconst apiKey = await getApiKey(options.signal);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\ttry {\n\t\tconst data = await queritJsonRequest<QueritSearchResponse>(\n\t\t\t\"Search\",\n\t\t\tQUERIT_SEARCH_URL,\n\t\t\tapiKey,\n\t\t\tbuildSearchBody(query, options),\n\t\t\tSEARCH_TIMEOUT_MS,\n\t\t\toptions.signal,\n\t\t);\n\t\tassertApiSuccess(\"Search\", data);\n\t\tconst results = mapSearchResults(data);\n\t\tconst response: SearchResponse = { answer: buildAnswer(results), results };\n\t\tif (options.includeContent && results.length > 0) {\n\t\t\tconst inlineContent = await fetchInlineContent(results.map((result) => result.url), apiKey, options.signal);\n\t\t\tif (inlineContent.length > 0) response.inlineContent = inlineContent;\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn response;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (options.signal?.aborted) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\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\nexport async function extractWithQuerit(\n\turl: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<ExtractedContent | null> {\n\tconst apiKey = await getApiKey(signal);\n\tconst activityId = activityMonitor.logStart({ type: \"fetch\", url });\n\ttry {\n\t\tconst data = await fetchContentsBatch([url], apiKey, signal, options);\n\t\tconst result = findContentResult(data, url, 0, 1);\n\t\tconst mapped = mapContentResult(result, url);\n\t\tif (mapped) {\n\t\t\tactivityMonitor.logComplete(activityId, 200);\n\t\t\treturn mapped;\n\t\t}\n\t\tif (failedContentStatus(data, result, 0)) {\n\t\t\tthrow new Error(`Querit Contents API failed to crawl ${url}`);\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn null;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (signal?.aborted) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\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":"querit.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/querit.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport type { ExtractedContent, ExtractOptions } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst QUERIT_SEARCH_URL = \"https://api.querit.ai/v1/search\";\nconst QUERIT_CONTENTS_URL = \"https://api.querit.ai/v1/contents\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\nconst CONTENTS_TIMEOUT_MS = 60_000;\nconst MAX_CONTENT_URLS = 10;\n\ninterface WebSearchConfig {\n\tqueritApiKey?: unknown;\n}\n\ninterface QueritSearchResult {\n\turl?: string | null;\n\ttitle?: string | null;\n\tsnippet?: string | null;\n\tpage_age?: string | null;\n\tsite_name?: string | null;\n}\n\ninterface QueritSearchResponse {\n\terror_code?: number | string;\n\terror_msg?: string;\n\tsearch_id?: number | string;\n\tresults?: { result?: QueritSearchResult[] };\n}\n\ninterface QueritContentMetadata {\n\ttitle?: string | null;\n\turl?: string | null;\n\tpublishTime?: string | null;\n\tsiteName?: string | null;\n\tsiteIcon?: string | null;\n}\n\ninterface QueritContentResult {\n\tid?: string | null;\n\turl?: string | null;\n\tcontent?: string | null;\n\textrasMeta?: QueritContentMetadata | null;\n}\n\ninterface QueritContentStatus {\n\tid?: string | null;\n\tstatus?: string | null;\n}\n\ninterface QueritContentsResponse {\n\terror_code?: number | string;\n\terror_msg?: string;\n\tsearch_id?: number | string;\n\tresults?: QueritContentResult[];\n\tstatuses?: QueritContentStatus[];\n\tsearchTime?: number;\n}\n\ninterface QueritSearchOptions extends SearchOptions {\n\tincludeContent?: boolean;\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\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid config in ${CONFIG_PATH}: expected a JSON object`);\n\t}\n\tcachedConfig = parsed as WebSearchConfig;\n\treturn cachedConfig;\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string> {\n\tconst key = await resolveCredential({\n\t\tprovider: \"Querit\",\n\t\tconfiguredValue: loadConfig().queritApiKey,\n\t\tenvironmentValue: process.env.QUERIT_API_KEY,\n\t\tsignal,\n\t});\n\tif (!key) {\n\t\tthrow new Error(\n\t\t\t\"Querit API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"queritApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set QUERIT_API_KEY environment variable\\n\" +\n\t\t\t\"Create a key at https://www.querit.ai/en/dashboard/api-keys\",\n\t\t);\n\t}\n\treturn key;\n}\n\nexport function isQueritAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"Querit\",\n\t\tconfiguredValue: loadConfig().queritApiKey,\n\t\tenvironmentValue: process.env.QUERIT_API_KEY,\n\t});\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction requestSignal(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n\tconst timeout = AbortSignal.timeout(timeoutMs);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction normalizeNumResults(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 5;\n\treturn Math.max(1, Math.min(Math.floor(value), 20));\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\nfunction mapDomainFilter(domainFilter: string[] | undefined): { include: string[]; exclude: string[] } {\n\tconst include: string[] = [];\n\tconst exclude: string[] = [];\n\tfor (const raw of domainFilter ?? []) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? exclude : include;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn { include, exclude };\n}\n\nfunction mapRecencyFilter(value: SearchOptions[\"recencyFilter\"]): string | undefined {\n\tif (value === \"day\") return \"d1\";\n\tif (value === \"week\") return \"w1\";\n\tif (value === \"month\") return \"m1\";\n\tif (value === \"year\") return \"y1\";\n\treturn undefined;\n}\n\nfunction buildSearchBody(query: string, options: QueritSearchOptions): Record<string, unknown> {\n\tconst { include, exclude } = mapDomainFilter(options.domainFilter);\n\tconst date = mapRecencyFilter(options.recencyFilter);\n\tconst filters: Record<string, unknown> = {};\n\tif (include.length > 0 || exclude.length > 0) {\n\t\tfilters.sites = {\n\t\t\t...(include.length > 0 ? { include } : {}),\n\t\t\t...(exclude.length > 0 ? { exclude } : {}),\n\t\t};\n\t}\n\tif (date) filters.timeRange = { date };\n\treturn {\n\t\tquery,\n\t\tcount: normalizeNumResults(options.numResults),\n\t\t...(Object.keys(filters).length > 0 ? { filters } : {}),\n\t};\n}\n\nfunction normalizeTimeoutMs(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return CONTENTS_TIMEOUT_MS;\n\treturn Math.max(1, Math.floor(value));\n}\n\nfunction crawlTimeoutSeconds(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 10;\n\treturn Math.max(1, Math.min(Math.ceil(value / 1_000), 60));\n}\n\nfunction buildContentsBody(urls: string[], options: ExtractOptions = {}): Record<string, unknown> {\n\treturn {\n\t\turls,\n\t\tformat: \"markdown\",\n\t\tcrawlTimeout: crawlTimeoutSeconds(options.timeoutMs),\n\t\textrasMeta: true,\n\t};\n}\n\nasync function queritJsonRequest<T>(\n\tlabel: \"Search\" | \"Contents\",\n\turl: string,\n\tapiKey: string,\n\tbody: Record<string, unknown>,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\tAccept: \"application/json\",\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal(signal, timeoutMs),\n\t\t});\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst isRequestAbort = err instanceof Error\n\t\t\t? err.name === \"AbortError\" || err.name === \"TimeoutError\" || /abort|timeout/i.test(message)\n\t\t\t: /abort|timeout/i.test(message);\n\t\tif (!signal?.aborted && isRequestAbort) {\n\t\t\tconst timeoutError = new Error(`Querit ${label} API request timed out after ${Math.ceil(timeoutMs / 1_000)} seconds`);\n\t\t\ttimeoutError.name = \"TimeoutError\";\n\t\t\tthrow timeoutError;\n\t\t}\n\t\tconst redactedMessage = redactCredential(message, apiKey);\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\tconst raw = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`Querit ${label} API error ${response.status}: ${redactCredential(raw, apiKey).slice(0, 300)}`);\n\t}\n\ttry {\n\t\treturn JSON.parse(raw) as T;\n\t} catch (err) {\n\t\tthrow new Error(`Querit ${label} API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n}\n\nfunction assertApiSuccess(label: \"Search\" | \"Contents\", data: QueritSearchResponse | QueritContentsResponse): void {\n\tconst code = Number(data.error_code);\n\tif (!Number.isFinite(code) || code !== 200) {\n\t\tconst renderedCode = data.error_code === undefined ? \"unknown\" : String(data.error_code);\n\t\tconst message = typeof data.error_msg === \"string\" && data.error_msg.trim() ? `: ${data.error_msg.trim()}` : \"\";\n\t\tthrow new Error(`Querit ${label} API returned error ${renderedCode}${message}`);\n\t}\n}\n\nfunction mapSearchResults(data: QueritSearchResponse): SearchResponse[\"results\"] {\n\tconst items = data.results?.result;\n\tif (!Array.isArray(items)) {\n\t\tthrow new Error(\"Querit Search API returned an unexpected response shape\");\n\t}\n\treturn items.flatMap((item) => {\n\t\tif (!item || typeof item.url !== \"string\" || item.url.trim().length === 0) return [];\n\t\tconst url = item.url.trim();\n\t\treturn [{\n\t\t\ttitle: typeof item.title === \"string\" && item.title.trim() ? item.title.trim() : url,\n\t\t\turl,\n\t\t\tsnippet: typeof item.snippet === \"string\" ? item.snippet.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t}];\n\t});\n}\n\nfunction buildAnswer(results: SearchResponse[\"results\"]): string {\n\treturn results.map((result) => {\n\t\tif (result.snippet) return `${result.snippet}\\nSource: ${result.title} (${result.url})`;\n\t\treturn `Source: ${result.title} (${result.url})`;\n\t}).join(\"\\n\\n\");\n}\n\nfunction mapContentResult(result: QueritContentResult | undefined, requestedUrl: string): ExtractedContent | null {\n\tif (!result || typeof result.content !== \"string\" || result.content.trim().length === 0) return null;\n\tconst metadata = result.extrasMeta;\n\treturn {\n\t\turl: requestedUrl,\n\t\ttitle: metadata && typeof metadata.title === \"string\" ? metadata.title.trim() : \"\",\n\t\tcontent: result.content.trim(),\n\t\terror: null,\n\t};\n}\n\nfunction findContentResult(\n\tdata: QueritContentsResponse,\n\trequestedUrl: string,\n\tindex: number,\n\trequestedCount: number,\n): QueritContentResult | undefined {\n\tif (!Array.isArray(data.results)) return undefined;\n\tconst exact = data.results.find((item) => item?.url === requestedUrl || item?.extrasMeta?.url === requestedUrl);\n\tif (exact) return exact;\n\tif (requestedCount === 1) return data.results[0];\n\treturn data.results.length === requestedCount ? data.results[index] : undefined;\n}\n\nfunction failedContentStatus(data: QueritContentsResponse, result: QueritContentResult | undefined, index: number): boolean {\n\tif (!Array.isArray(data.statuses)) return false;\n\tconst status = result?.id\n\t\t? data.statuses.find((item) => item?.id === result.id)\n\t\t: data.statuses[index];\n\treturn status?.status === \"failed\";\n}\n\nasync function fetchContentsBatch(\n\turls: string[],\n\tapiKey: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<QueritContentsResponse> {\n\tconst data = await queritJsonRequest<QueritContentsResponse>(\n\t\t\"Contents\",\n\t\tQUERIT_CONTENTS_URL,\n\t\tapiKey,\n\t\tbuildContentsBody(urls, options),\n\t\tnormalizeTimeoutMs(options.timeoutMs),\n\t\tsignal,\n\t);\n\tassertApiSuccess(\"Contents\", data);\n\tif (!Array.isArray(data.results) || !Array.isArray(data.statuses)) {\n\t\tthrow new Error(\"Querit Contents API returned an unexpected response shape\");\n\t}\n\treturn data;\n}\n\nasync function fetchInlineContent(urls: string[], apiKey: string, signal?: AbortSignal): Promise<ExtractedContent[]> {\n\tconst content: ExtractedContent[] = [];\n\tfor (let offset = 0; offset < urls.length; offset += MAX_CONTENT_URLS) {\n\t\tconst batch = urls.slice(offset, offset + MAX_CONTENT_URLS);\n\t\tconst data = await fetchContentsBatch(batch, apiKey, signal);\n\t\tfor (let index = 0; index < batch.length; index++) {\n\t\t\tconst requestedUrl = batch[index];\n\t\t\tconst result = findContentResult(data, requestedUrl, index, batch.length);\n\t\t\tconst mapped = mapContentResult(result, requestedUrl);\n\t\t\tif (mapped) content.push(mapped);\n\t\t}\n\t}\n\treturn content;\n}\n\nexport async function searchWithQuerit(\n\tquery: string,\n\toptions: QueritSearchOptions = {},\n): Promise<SearchResponse> {\n\tconst apiKey = await getApiKey(options.signal);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\ttry {\n\t\tconst data = await queritJsonRequest<QueritSearchResponse>(\n\t\t\t\"Search\",\n\t\t\tQUERIT_SEARCH_URL,\n\t\t\tapiKey,\n\t\t\tbuildSearchBody(query, options),\n\t\t\tSEARCH_TIMEOUT_MS,\n\t\t\toptions.signal,\n\t\t);\n\t\tassertApiSuccess(\"Search\", data);\n\t\tconst results = mapSearchResults(data);\n\t\tconst response: SearchResponse = { answer: buildAnswer(results), results };\n\t\tif (options.includeContent && results.length > 0) {\n\t\t\tconst inlineContent = await fetchInlineContent(results.map((result) => result.url), apiKey, options.signal);\n\t\t\tif (inlineContent.length > 0) response.inlineContent = inlineContent;\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn response;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (options.signal?.aborted) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\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\nexport async function extractWithQuerit(\n\turl: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<ExtractedContent | null> {\n\tconst apiKey = await getApiKey(signal);\n\tconst activityId = activityMonitor.logStart({ type: \"fetch\", url });\n\ttry {\n\t\tconst data = await fetchContentsBatch([url], apiKey, signal, options);\n\t\tconst result = findContentResult(data, url, 0, 1);\n\t\tconst mapped = mapContentResult(result, url);\n\t\tif (mapped) {\n\t\t\tactivityMonitor.logComplete(activityId, 200);\n\t\t\treturn mapped;\n\t\t}\n\t\tif (failedContentStatus(data, result, 0)) {\n\t\t\tthrow new Error(`Querit Contents API failed to crawl ${url}`);\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn null;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (signal?.aborted) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\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"]}
@@ -0,0 +1,3 @@
1
+ import type { SummaryGenerationContext } from "./summary-review.ts";
2
+ export declare function rewriteSearchQuery(query: string, ctx: SummaryGenerationContext, signal: AbortSignal): Promise<string>;
3
+ //# sourceMappingURL=query-rewrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-rewrite.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/query-rewrite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAiBpE,wBAAsB,kBAAkB,CACvC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,WAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CA4BjB"}
@@ -0,0 +1,42 @@
1
+ import { complete } from "@earendil-works/pi-ai/compat";
2
+ import { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns } from "./summary-model-scope.js";
3
+ async function resolveFirstAvailableModel(ctx, candidates) {
4
+ const enabledModelPatterns = loadEnabledModelPatterns(ctx);
5
+ for (const { provider, id } of candidates) {
6
+ const model = findModelWithProviderRouting(ctx.modelRegistry, provider, id);
7
+ if (!model || !modelMatchesEnabledPatterns(model, enabledModelPatterns))
8
+ continue;
9
+ const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
10
+ if (auth.ok && auth.apiKey)
11
+ return { model, apiKey: auth.apiKey, headers: auth.headers };
12
+ }
13
+ throw new Error(`No enabled model available: ${candidates.map(candidate => `${candidate.provider}/${candidate.id}`).join(", ")}`);
14
+ }
15
+ export async function rewriteSearchQuery(query, ctx, signal) {
16
+ const { model, apiKey, headers } = await resolveFirstAvailableModel(ctx, [
17
+ { provider: "anthropic", id: "claude-haiku-4-5" },
18
+ { provider: "google", id: "gemini-3.6-flash" },
19
+ { provider: "openai", id: "gpt-5-mini" },
20
+ ]);
21
+ const registry = ctx.modelRegistry;
22
+ const usesRegistryComplete = typeof registry.complete === "function";
23
+ const completeFn = usesRegistryComplete ? registry.complete.bind(registry) : complete;
24
+ const response = await completeFn(model, {
25
+ messages: [{
26
+ role: "user",
27
+ content: [{ type: "text", text: `Rewrite this web search query to get better, more specific results. Add relevant year qualifiers, precise technical terms, and specificity. Return ONLY the improved query text, nothing else.\n\nQuery: ${query}` }],
28
+ timestamp: Date.now(),
29
+ }],
30
+ }, usesRegistryComplete ? { signal } : { apiKey, headers, signal });
31
+ if (response.stopReason === "aborted")
32
+ throw new Error("Aborted");
33
+ const contentParts = Array.isArray(response.content) ? response.content : [];
34
+ const text = contentParts
35
+ .map((part) => part && typeof part === "object" && part.type === "text" && typeof part.text === "string" ? part.text : "")
36
+ .join("")
37
+ .trim();
38
+ if (!text)
39
+ throw new Error("Rewrite returned empty response");
40
+ return text;
41
+ }
42
+ //# sourceMappingURL=query-rewrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-rewrite.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/query-rewrite.ts"],"names":[],"mappings":"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","sourcesContent":["import { complete, type Api, type Model, type ProviderHeaders } from \"@earendil-works/pi-ai/compat\";\nimport type { SummaryGenerationContext } from \"./summary-review.ts\";\nimport { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns } from \"./summary-model-scope.ts\";\n\nasync function resolveFirstAvailableModel(\n\tctx: SummaryGenerationContext,\n\tcandidates: Array<{ provider: string; id: string }>,\n): Promise<{ model: Model<Api>; apiKey: string; headers?: ProviderHeaders }> {\n\tconst enabledModelPatterns = loadEnabledModelPatterns(ctx);\n\tfor (const { provider, id } of candidates) {\n\t\tconst model = findModelWithProviderRouting(ctx.modelRegistry, provider, id);\n\t\tif (!model || !modelMatchesEnabledPatterns(model, enabledModelPatterns)) continue;\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (auth.ok && auth.apiKey) return { model, apiKey: auth.apiKey, headers: auth.headers };\n\t}\n\tthrow new Error(`No enabled model available: ${candidates.map(candidate => `${candidate.provider}/${candidate.id}`).join(\", \")}`);\n}\n\nexport async function rewriteSearchQuery(\n\tquery: string,\n\tctx: SummaryGenerationContext,\n\tsignal: AbortSignal,\n): Promise<string> {\n\tconst { model, apiKey, headers } = await resolveFirstAvailableModel(ctx, [\n\t\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t\t{ provider: \"google\", id: \"gemini-3.6-flash\" },\n\t\t{ provider: \"openai\", id: \"gpt-5-mini\" },\n\t]);\n\tconst registry = ctx.modelRegistry as typeof ctx.modelRegistry & { complete?: typeof complete };\n\tconst usesRegistryComplete = typeof registry.complete === \"function\";\n\tconst completeFn = usesRegistryComplete ? registry.complete!.bind(registry) : complete;\n\tconst response = await completeFn(\n\t\tmodel,\n\t\t{\n\t\t\tmessages: [{\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: [{ type: \"text\", text: `Rewrite this web search query to get better, more specific results. Add relevant year qualifiers, precise technical terms, and specificity. Return ONLY the improved query text, nothing else.\\n\\nQuery: ${query}` }],\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t}],\n\t\t},\n\t\tusesRegistryComplete ? { signal } : { apiKey, headers, signal },\n\t);\n\tif (response.stopReason === \"aborted\") throw new Error(\"Aborted\");\n\tconst contentParts = Array.isArray(response.content) ? response.content : [];\n\tconst text = contentParts\n\t\t.map((part: unknown) => part && typeof part === \"object\" && (part as { type?: unknown }).type === \"text\" && typeof (part as { text?: unknown }).text === \"string\" ? (part as { text: string }).text : \"\")\n\t\t.join(\"\")\n\t\t.trim();\n\tif (!text) throw new Error(\"Rewrite returned empty response\");\n\treturn text;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"render-search-error.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/render-search-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IAClC,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC1C;8EAC0E;IAC1E,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC/B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oEAAoE;IACpE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,qFAAqF;IACrF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI,GAAG,eAAe,GAAG,IAAI,CA0G3G","sourcesContent":["/**\n * Pure, dependency-free renderer for web_search error / cancel results.\n *\n * WHY THIS EXISTS: the upstream web_search `renderResult` (index.ts) early-returns\n * a SINGLE line on the error/cancel path, before the collapsed/expanded branch.\n * That makes Ctrl+O (app.tools.expand) flip `expanded` with zero visible effect —\n * a dead-end with no diagnostics. It also discards the partial search results\n * gathered before the cancel, so even an expandable view would have nothing to show.\n *\n * This module is the single source of truth for the error/cancel render PLAN\n * (plain strings, no theme/ANSI), so it is unit-testable without pi's runtime\n * (@mariozechner/pi-tui Text/Box). index.ts.renderResult delegates to it and only\n * applies theme colors + creates Text/Box components.\n *\n * Contract for callers:\n * const plan = buildSearchErrorPlan(details);\n * if (plan === null) ... // not an error/cancel result; use the normal renderer\n * // collapsed: [statusLine, ...plan.collapsed, plan.expandHint].filter(Boolean)\n * // expanded: plan.expanded\n */\n\nexport interface CancelledQueryDetail {\n\tquery: string;\n\tprovider: string | null;\n\terror: string | null; // null = completed ok; string = per-query error\n\tresultCount: number;\n}\n\nexport interface SearchErrorDetails {\n\t/** The headline error/cancel message, e.g. \"Search curation cancelled (stale).\" */\n\terror?: string;\n\tcancelled?: boolean;\n\tcancelReason?: string;\n\t/** Did the curator browser page ever establish a connection? */\n\tbrowserConnected?: boolean;\n\t/** Age (ms) of the last curator heartbeat at cancel time, if known. */\n\tlastHeartbeatAgeMs?: number | null;\n\t/** Total queries the user requested. */\n\tqueryCount?: number;\n\t/** Partial per-query results gathered before the cancel/error. */\n\tcancelledQueries?: CancelledQueryDetail[];\n\t/** Arbitrary extra diagnostic lines (e.g. URLs, response id) for non-cancel errors\n\t * like fetch_content / get_search_content. Shown in the expanded view. */\n\textraLines?: string[];\n}\n\nexport interface SearchErrorPlan {\n\t/** Full diagnostic block, shown when expanded (Ctrl+O). */\n\texpanded: string[];\n\t/** Short preview lines, shown under the headline when collapsed. */\n\tcollapsed: string[];\n\t/** The \"... (N more lines, ctrl+o to expand)\" hint, or null if nothing is hidden. */\n\texpandHint: string | null;\n}\n\nfunction truncate(text: string, max: number): string {\n\treturn text.length > max ? text.slice(0, max - 1) + \"\\u2026\" : text;\n}\n\n/**\n * Build the error/cancel render plan. Returns null when `details` carries no\n * error/cancel signal (so the caller falls through to the normal success renderer).\n */\nexport function buildSearchErrorPlan(details: SearchErrorDetails | undefined | null): SearchErrorPlan | null {\n\tif (!details || (!details.error && !details.cancelled)) {\n\t\treturn null;\n\t}\n\n\tconst headline = details.error ?? \"Search cancelled.\";\n\tconst queries = details.cancelledQueries ?? [];\n\tconst queryCount = typeof details.queryCount === \"number\" && details.queryCount > 0\n\t\t? details.queryCount\n\t\t: queries.length;\n\tconst done = queries.length;\n\tconst errored = queries.filter(q => q.error).length;\n\n\t// Rich diagnostics only make sense when there is something to diagnose: a\n\t// cancelled/curator result with partial data, OR a non-cancel error that carries\n\t// extra detail (urls/response-id for fetch_content, the failed query for\n\t// get_search_content). A bare argument error (e.g. \"No URL\n\t// provided\") stays a clean single line -- no noise.\n\tconst extras = details.extraLines ?? [];\n\tconst rich = details.cancelled === true || queries.length > 0 || extras.length > 0;\n\tif (!rich) {\n\t\treturn { expanded: [headline], collapsed: [], expandHint: null };\n\t}\n\n\t// --- diagnostics block (expanded): curator/cancel-specific only. For non-cancel\n\t// errors (fetch_content/get_search_content) there is no browser or\n\t// query-curation state to report, so we skip this block and show only Details. ---\n\tconst expanded: string[] = [headline, \"\"];\n\n\tif (details.cancelled === true || queries.length > 0) {\n\t\tconst diag: string[] = [];\n\t\tif (details.cancelled) {\n\t\t\tdiag.push(`cancel reason : ${details.cancelReason ?? \"unknown\"}`);\n\t\t}\n\t\t// Browser connection state — the most common stale cause (page never opened).\n\t\tconst browserLabel = details.browserConnected === undefined\n\t\t\t? \"unknown\"\n\t\t\t: details.browserConnected\n\t\t\t\t? \"connected\"\n\t\t\t\t: \"never connected\";\n\t\tdiag.push(`browser : ${browserLabel}`);\n\t\tif (typeof details.lastHeartbeatAgeMs === \"number\" && Number.isFinite(details.lastHeartbeatAgeMs)) {\n\t\t\tdiag.push(`last heartbeat : ${Math.round(details.lastHeartbeatAgeMs / 1000)}s ago`);\n\t\t}\n\t\tif (queryCount > 0) {\n\t\t\tdiag.push(`queries started : ${queryCount}`);\n\t\t\tdiag.push(`queries done : ${done}`);\n\t\t\tif (errored > 0) diag.push(`queries errored : ${errored}`);\n\t\t}\n\t\texpanded.push(\"Diagnostics:\");\n\t\tfor (const line of diag) expanded.push(` ${line}`);\n\t}\n\n\t// --- per-query results gathered before cancel ---\n\tif (queries.length > 0) {\n\t\texpanded.push(\"\");\n\t\texpanded.push(\"Per-query results (gathered before cancel):\");\n\t\tfor (const q of queries) {\n\t\t\tconst dq = truncate(q.query, 52);\n\t\t\tconst tag = q.error ? \"[err] \" : \"[ok] \";\n\t\t\tconst provider = q.provider ? ` (${q.provider})` : \"\";\n\t\t\tconst tail = q.error\n\t\t\t\t? `\\u2014 ${truncate(q.error, 60)}`\n\t\t\t\t: `\\u2014 ${q.resultCount} source${q.resultCount === 1 ? \"\" : \"s\"}`;\n\t\t\texpanded.push(` ${tag}\"${dq}\"${provider} ${tail}`);\n\t\t}\n\t}\n\n\t// --- arbitrary extra detail (non-cancel errors) ---\n\tif (extras.length > 0) {\n\t\texpanded.push(\"\");\n\t\texpanded.push(\"Details:\");\n\t\tfor (const e of extras) expanded.push(` ${e}`);\n\t}\n\n\t// --- collapsed preview ---\n\tconst collapsed: string[] = [];\n\tconst parts: string[] = [];\n\tif (queryCount > 0) {\n\t\tparts.push(`${done}/${queryCount} queries completed`);\n\t}\n\tif (errored > 0) {\n\t\tparts.push(`${errored} errored`);\n\t}\n\tif (details.browserConnected === false) {\n\t\tparts.push(\"browser never connected\");\n\t} else if (details.cancelReason) {\n\t\tparts.push(`reason: ${details.cancelReason}`);\n\t}\n\tif (parts.length > 0) {\n\t\tcollapsed.push(parts.join(\"; \") + \".\");\n\t}\n\t// For non-cancel errors with extra detail, preview the first detail line.\n\tif (collapsed.length === 0 && extras.length > 0) {\n\t\tfor (const e of extras.slice(0, 2)) {\n\t\t\tcollapsed.push(truncate(e, 100));\n\t\t}\n\t}\n\n\t// --- expand hint ---\n\tconst hiddenLines = Math.max(0, expanded.length - (1 + collapsed.length)); // headline + preview shown when collapsed\n\tconst expandHint = hiddenLines > 0\n\t\t? `... (${hiddenLines} more lines, ${expanded.length} total, ctrl+o to expand)`\n\t\t: null;\n\n\treturn { expanded, collapsed, expandHint };\n}\n"]}
1
+ {"version":3,"file":"render-search-error.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/render-search-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IAClC,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC1C;8EAC0E;IAC1E,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC/B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oEAAoE;IACpE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,qFAAqF;IACrF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI,GAAG,eAAe,GAAG,IAAI,CA0G3G"}
@@ -1 +1 @@
1
- {"version":3,"file":"render-search-error.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/render-search-error.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure, dependency-free renderer for web_search error / cancel results.\n *\n * WHY THIS EXISTS: the upstream web_search `renderResult` (index.ts) early-returns\n * a SINGLE line on the error/cancel path, before the collapsed/expanded branch.\n * That makes Ctrl+O (app.tools.expand) flip `expanded` with zero visible effect —\n * a dead-end with no diagnostics. It also discards the partial search results\n * gathered before the cancel, so even an expandable view would have nothing to show.\n *\n * This module is the single source of truth for the error/cancel render PLAN\n * (plain strings, no theme/ANSI), so it is unit-testable without pi's runtime\n * (@mariozechner/pi-tui Text/Box). index.ts.renderResult delegates to it and only\n * applies theme colors + creates Text/Box components.\n *\n * Contract for callers:\n * const plan = buildSearchErrorPlan(details);\n * if (plan === null) ... // not an error/cancel result; use the normal renderer\n * // collapsed: [statusLine, ...plan.collapsed, plan.expandHint].filter(Boolean)\n * // expanded: plan.expanded\n */\n\nexport interface CancelledQueryDetail {\n\tquery: string;\n\tprovider: string | null;\n\terror: string | null; // null = completed ok; string = per-query error\n\tresultCount: number;\n}\n\nexport interface SearchErrorDetails {\n\t/** The headline error/cancel message, e.g. \"Search curation cancelled (stale).\" */\n\terror?: string;\n\tcancelled?: boolean;\n\tcancelReason?: string;\n\t/** Did the curator browser page ever establish a connection? */\n\tbrowserConnected?: boolean;\n\t/** Age (ms) of the last curator heartbeat at cancel time, if known. */\n\tlastHeartbeatAgeMs?: number | null;\n\t/** Total queries the user requested. */\n\tqueryCount?: number;\n\t/** Partial per-query results gathered before the cancel/error. */\n\tcancelledQueries?: CancelledQueryDetail[];\n\t/** Arbitrary extra diagnostic lines (e.g. URLs, response id) for non-cancel errors\n\t * like fetch_content / get_search_content. Shown in the expanded view. */\n\textraLines?: string[];\n}\n\nexport interface SearchErrorPlan {\n\t/** Full diagnostic block, shown when expanded (Ctrl+O). */\n\texpanded: string[];\n\t/** Short preview lines, shown under the headline when collapsed. */\n\tcollapsed: string[];\n\t/** The \"... (N more lines, ctrl+o to expand)\" hint, or null if nothing is hidden. */\n\texpandHint: string | null;\n}\n\nfunction truncate(text: string, max: number): string {\n\treturn text.length > max ? text.slice(0, max - 1) + \"\\u2026\" : text;\n}\n\n/**\n * Build the error/cancel render plan. Returns null when `details` carries no\n * error/cancel signal (so the caller falls through to the normal success renderer).\n */\nexport function buildSearchErrorPlan(details: SearchErrorDetails | undefined | null): SearchErrorPlan | null {\n\tif (!details || (!details.error && !details.cancelled)) {\n\t\treturn null;\n\t}\n\n\tconst headline = details.error ?? \"Search cancelled.\";\n\tconst queries = details.cancelledQueries ?? [];\n\tconst queryCount = typeof details.queryCount === \"number\" && details.queryCount > 0\n\t\t? details.queryCount\n\t\t: queries.length;\n\tconst done = queries.length;\n\tconst errored = queries.filter(q => q.error).length;\n\n\t// Rich diagnostics only make sense when there is something to diagnose: a\n\t// cancelled/curator result with partial data, OR a non-cancel error that carries\n\t// extra detail (urls/response-id for fetch_content, the failed query for\n\t// get_search_content). A bare argument error (e.g. \"No URL\n\t// provided\") stays a clean single line -- no noise.\n\tconst extras = details.extraLines ?? [];\n\tconst rich = details.cancelled === true || queries.length > 0 || extras.length > 0;\n\tif (!rich) {\n\t\treturn { expanded: [headline], collapsed: [], expandHint: null };\n\t}\n\n\t// --- diagnostics block (expanded): curator/cancel-specific only. For non-cancel\n\t// errors (fetch_content/get_search_content) there is no browser or\n\t// query-curation state to report, so we skip this block and show only Details. ---\n\tconst expanded: string[] = [headline, \"\"];\n\n\tif (details.cancelled === true || queries.length > 0) {\n\t\tconst diag: string[] = [];\n\t\tif (details.cancelled) {\n\t\t\tdiag.push(`cancel reason : ${details.cancelReason ?? \"unknown\"}`);\n\t\t}\n\t\t// Browser connection state — the most common stale cause (page never opened).\n\t\tconst browserLabel = details.browserConnected === undefined\n\t\t\t? \"unknown\"\n\t\t\t: details.browserConnected\n\t\t\t\t? \"connected\"\n\t\t\t\t: \"never connected\";\n\t\tdiag.push(`browser : ${browserLabel}`);\n\t\tif (typeof details.lastHeartbeatAgeMs === \"number\" && Number.isFinite(details.lastHeartbeatAgeMs)) {\n\t\t\tdiag.push(`last heartbeat : ${Math.round(details.lastHeartbeatAgeMs / 1000)}s ago`);\n\t\t}\n\t\tif (queryCount > 0) {\n\t\t\tdiag.push(`queries started : ${queryCount}`);\n\t\t\tdiag.push(`queries done : ${done}`);\n\t\t\tif (errored > 0) diag.push(`queries errored : ${errored}`);\n\t\t}\n\t\texpanded.push(\"Diagnostics:\");\n\t\tfor (const line of diag) expanded.push(` ${line}`);\n\t}\n\n\t// --- per-query results gathered before cancel ---\n\tif (queries.length > 0) {\n\t\texpanded.push(\"\");\n\t\texpanded.push(\"Per-query results (gathered before cancel):\");\n\t\tfor (const q of queries) {\n\t\t\tconst dq = truncate(q.query, 52);\n\t\t\tconst tag = q.error ? \"[err] \" : \"[ok] \";\n\t\t\tconst provider = q.provider ? ` (${q.provider})` : \"\";\n\t\t\tconst tail = q.error\n\t\t\t\t? `\\u2014 ${truncate(q.error, 60)}`\n\t\t\t\t: `\\u2014 ${q.resultCount} source${q.resultCount === 1 ? \"\" : \"s\"}`;\n\t\t\texpanded.push(` ${tag}\"${dq}\"${provider} ${tail}`);\n\t\t}\n\t}\n\n\t// --- arbitrary extra detail (non-cancel errors) ---\n\tif (extras.length > 0) {\n\t\texpanded.push(\"\");\n\t\texpanded.push(\"Details:\");\n\t\tfor (const e of extras) expanded.push(` ${e}`);\n\t}\n\n\t// --- collapsed preview ---\n\tconst collapsed: string[] = [];\n\tconst parts: string[] = [];\n\tif (queryCount > 0) {\n\t\tparts.push(`${done}/${queryCount} queries completed`);\n\t}\n\tif (errored > 0) {\n\t\tparts.push(`${errored} errored`);\n\t}\n\tif (details.browserConnected === false) {\n\t\tparts.push(\"browser never connected\");\n\t} else if (details.cancelReason) {\n\t\tparts.push(`reason: ${details.cancelReason}`);\n\t}\n\tif (parts.length > 0) {\n\t\tcollapsed.push(parts.join(\"; \") + \".\");\n\t}\n\t// For non-cancel errors with extra detail, preview the first detail line.\n\tif (collapsed.length === 0 && extras.length > 0) {\n\t\tfor (const e of extras.slice(0, 2)) {\n\t\t\tcollapsed.push(truncate(e, 100));\n\t\t}\n\t}\n\n\t// --- expand hint ---\n\tconst hiddenLines = Math.max(0, expanded.length - (1 + collapsed.length)); // headline + preview shown when collapsed\n\tconst expandHint = hiddenLines > 0\n\t\t? `... (${hiddenLines} more lines, ${expanded.length} total, ctrl+o to expand)`\n\t\t: null;\n\n\treturn { expanded, collapsed, expandHint };\n}\n"]}
1
+ {"version":3,"file":"render-search-error.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/render-search-error.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure, dependency-free renderer for web_search error / cancel results.\n *\n * WHY THIS EXISTS: the upstream web_search `renderResult` (index.ts) early-returns\n * a SINGLE line on the error/cancel path, before the collapsed/expanded branch.\n * That makes Ctrl+O (app.tools.expand) flip `expanded` with zero visible effect —\n * a dead-end with no diagnostics. It also discards the partial search results\n * gathered before the cancel, so even an expandable view would have nothing to show.\n *\n * This module is the single source of truth for the error/cancel render PLAN\n * (plain strings, no theme/ANSI), so it is unit-testable without pi's runtime\n * (@mariozechner/pi-tui Text/Box). index.ts.renderResult delegates to it and only\n * applies theme colors + creates Text/Box components.\n *\n * Contract for callers:\n * const plan = buildSearchErrorPlan(details);\n * if (plan === null) ... // not an error/cancel result; use the normal renderer\n * // collapsed: [statusLine, ...plan.collapsed, plan.expandHint].filter(Boolean)\n * // expanded: plan.expanded\n */\n\nexport interface CancelledQueryDetail {\n\tquery: string;\n\tprovider: string | null;\n\terror: string | null; // null = completed ok; string = per-query error\n\tresultCount: number;\n}\n\nexport interface SearchErrorDetails {\n\t/** The headline error/cancel message, e.g. \"Search curation cancelled (stale).\" */\n\terror?: string;\n\tcancelled?: boolean;\n\tcancelReason?: string;\n\t/** Did the curator browser page ever establish a connection? */\n\tbrowserConnected?: boolean;\n\t/** Age (ms) of the last curator heartbeat at cancel time, if known. */\n\tlastHeartbeatAgeMs?: number | null;\n\t/** Total queries the user requested. */\n\tqueryCount?: number;\n\t/** Partial per-query results gathered before the cancel/error. */\n\tcancelledQueries?: CancelledQueryDetail[];\n\t/** Arbitrary extra diagnostic lines (e.g. URLs, response id) for non-cancel errors\n\t * like fetch_content / get_search_content. Shown in the expanded view. */\n\textraLines?: string[];\n}\n\nexport interface SearchErrorPlan {\n\t/** Full diagnostic block, shown when expanded (Ctrl+O). */\n\texpanded: string[];\n\t/** Short preview lines, shown under the headline when collapsed. */\n\tcollapsed: string[];\n\t/** The \"... (N more lines, ctrl+o to expand)\" hint, or null if nothing is hidden. */\n\texpandHint: string | null;\n}\n\nfunction truncate(text: string, max: number): string {\n\treturn text.length > max ? text.slice(0, max - 1) + \"\\u2026\" : text;\n}\n\n/**\n * Build the error/cancel render plan. Returns null when `details` carries no\n * error/cancel signal (so the caller falls through to the normal success renderer).\n */\nexport function buildSearchErrorPlan(details: SearchErrorDetails | undefined | null): SearchErrorPlan | null {\n\tif (!details || (!details.error && !details.cancelled)) {\n\t\treturn null;\n\t}\n\n\tconst headline = details.error ?? \"Search cancelled.\";\n\tconst queries = details.cancelledQueries ?? [];\n\tconst queryCount = typeof details.queryCount === \"number\" && details.queryCount > 0\n\t\t? details.queryCount\n\t\t: queries.length;\n\tconst done = queries.length;\n\tconst errored = queries.filter(q => q.error).length;\n\n\t// Rich diagnostics only make sense when there is something to diagnose: a\n\t// cancelled/curator result with partial data, OR a non-cancel error that carries\n\t// extra detail (urls/response-id for fetch_content, the failed query for\n\t// get_search_content). A bare argument error (e.g. \"No URL\n\t// provided\") stays a clean single line -- no noise.\n\tconst extras = details.extraLines ?? [];\n\tconst rich = details.cancelled === true || queries.length > 0 || extras.length > 0;\n\tif (!rich) {\n\t\treturn { expanded: [headline], collapsed: [], expandHint: null };\n\t}\n\n\t// --- diagnostics block (expanded): curator/cancel-specific only. For non-cancel\n\t// errors (fetch_content/get_search_content) there is no browser or\n\t// query-curation state to report, so we skip this block and show only Details. ---\n\tconst expanded: string[] = [headline, \"\"];\n\n\tif (details.cancelled === true || queries.length > 0) {\n\t\tconst diag: string[] = [];\n\t\tif (details.cancelled) {\n\t\t\tdiag.push(`cancel reason : ${details.cancelReason ?? \"unknown\"}`);\n\t\t}\n\t\t// Browser connection state — the most common stale cause (page never opened).\n\t\tconst browserLabel = details.browserConnected === undefined\n\t\t\t? \"unknown\"\n\t\t\t: details.browserConnected\n\t\t\t\t? \"connected\"\n\t\t\t\t: \"never connected\";\n\t\tdiag.push(`browser : ${browserLabel}`);\n\t\tif (typeof details.lastHeartbeatAgeMs === \"number\" && Number.isFinite(details.lastHeartbeatAgeMs)) {\n\t\t\tdiag.push(`last heartbeat : ${Math.round(details.lastHeartbeatAgeMs / 1000)}s ago`);\n\t\t}\n\t\tif (queryCount > 0) {\n\t\t\tdiag.push(`queries started : ${queryCount}`);\n\t\t\tdiag.push(`queries done : ${done}`);\n\t\t\tif (errored > 0) diag.push(`queries errored : ${errored}`);\n\t\t}\n\t\texpanded.push(\"Diagnostics:\");\n\t\tfor (const line of diag) expanded.push(` ${line}`);\n\t}\n\n\t// --- per-query results gathered before cancel ---\n\tif (queries.length > 0) {\n\t\texpanded.push(\"\");\n\t\texpanded.push(\"Per-query results (gathered before cancel):\");\n\t\tfor (const q of queries) {\n\t\t\tconst dq = truncate(q.query, 52);\n\t\t\tconst tag = q.error ? \"[err] \" : \"[ok] \";\n\t\t\tconst provider = q.provider ? ` (${q.provider})` : \"\";\n\t\t\tconst tail = q.error\n\t\t\t\t? `\\u2014 ${truncate(q.error, 60)}`\n\t\t\t\t: `\\u2014 ${q.resultCount} source${q.resultCount === 1 ? \"\" : \"s\"}`;\n\t\t\texpanded.push(` ${tag}\"${dq}\"${provider} ${tail}`);\n\t\t}\n\t}\n\n\t// --- arbitrary extra detail (non-cancel errors) ---\n\tif (extras.length > 0) {\n\t\texpanded.push(\"\");\n\t\texpanded.push(\"Details:\");\n\t\tfor (const e of extras) expanded.push(` ${e}`);\n\t}\n\n\t// --- collapsed preview ---\n\tconst collapsed: string[] = [];\n\tconst parts: string[] = [];\n\tif (queryCount > 0) {\n\t\tparts.push(`${done}/${queryCount} queries completed`);\n\t}\n\tif (errored > 0) {\n\t\tparts.push(`${errored} errored`);\n\t}\n\tif (details.browserConnected === false) {\n\t\tparts.push(\"browser never connected\");\n\t} else if (details.cancelReason) {\n\t\tparts.push(`reason: ${details.cancelReason}`);\n\t}\n\tif (parts.length > 0) {\n\t\tcollapsed.push(parts.join(\"; \") + \".\");\n\t}\n\t// For non-cancel errors with extra detail, preview the first detail line.\n\tif (collapsed.length === 0 && extras.length > 0) {\n\t\tfor (const e of extras.slice(0, 2)) {\n\t\t\tcollapsed.push(truncate(e, 100));\n\t\t}\n\t}\n\n\t// --- expand hint ---\n\tconst hiddenLines = Math.max(0, expanded.length - (1 + collapsed.length)); // headline + preview shown when collapsed\n\tconst expandHint = hiddenLines > 0\n\t\t? `... (${hiddenLines} more lines, ${expanded.length} total, ctrl+o to expand)`\n\t\t: null;\n\n\treturn { expanded, collapsed, expandHint };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"rsc-extract.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/rsc-extract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAqUvE","sourcesContent":["/**\n * RSC Content Extractor\n *\n * Extracts readable content from Next.js React Server Components (RSC) flight payloads.\n * RSC pages embed content as JSON in <script>self.__next_f.push([...])</script> tags.\n */\n\nexport interface RSCExtractResult {\n title: string;\n content: string;\n}\n\nexport function extractRSCContent(html: string): RSCExtractResult | null {\n if (!html.includes(\"self.__next_f.push\")) {\n return null;\n }\n\n // Parse all RSC chunks into a map\n const chunkMap = new Map<string, string>();\n const scriptRegex = /<script>self\\.__next_f\\.push\\(\\[1,\"([\\s\\S]*?)\"\\]\\)<\\/script>/g;\n\n for (const match of html.matchAll(scriptRegex)) {\n let content: string;\n try {\n content = JSON.parse('\"' + match[1] + '\"');\n } catch {\n continue;\n }\n\n // Parse each line as \"id:payload\"\n // Lines are separated by \\n, each line is one chunk\n // Chunk IDs are hex strings, typically 1-4 chars (supports up to 65535 chunks)\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) continue;\n\n const colonIdx = line.indexOf(\":\");\n if (colonIdx <= 0 || colonIdx > 4) continue;\n\n const id = line.slice(0, colonIdx);\n if (!/^[0-9a-f]+$/i.test(id)) continue;\n\n const payload = line.slice(colonIdx + 1);\n if (!payload) continue;\n\n const existing = chunkMap.get(id);\n if (!existing || payload.length > existing.length) {\n chunkMap.set(id, payload);\n }\n }\n }\n\n if (chunkMap.size === 0) return null;\n\n // Extract title\n const titleMatch = html.match(/<title[^>]*>([^<]+)<\\/title>/);\n const title = titleMatch?.[1]?.split(\"|\")[0]?.trim() || \"\";\n\n // Parse and cache parsed chunks\n const parsedCache = new Map<string, unknown>();\n\n function getParsedChunk(id: string): unknown | null {\n if (parsedCache.has(id)) return parsedCache.get(id);\n\n const chunk = chunkMap.get(id);\n if (!chunk || !chunk.startsWith(\"[\")) {\n parsedCache.set(id, null);\n return null;\n }\n\n try {\n const parsed = JSON.parse(chunk);\n parsedCache.set(id, parsed);\n return parsed;\n } catch {\n parsedCache.set(id, null);\n return null;\n }\n }\n\n // Extract markdown from nodes, resolving refs on the fly\n type Node = unknown;\n const visitedRefs = new Set<string>();\n\n function extractNode(node: Node, ctx = { inTable: false, inCode: false }): string {\n if (node === null || node === undefined) return \"\";\n\n if (typeof node === \"string\") {\n // Check if it's a reference like \"$L30\"\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch) {\n const refId = refMatch[1];\n if (visitedRefs.has(refId)) return \"\"; // Prevent cycles\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n const result = refNode ? extractNode(refNode, ctx) : \"\";\n visitedRefs.delete(refId);\n return result;\n }\n // Filter out RSC-specific artifacts, but preserve content inside code blocks\n if (!ctx.inCode && (node === \"$undefined\" || node === \"$\" || /^\\$[A-Z]/.test(node))) return \"\";\n return node.trim() ? node : \"\";\n }\n\n if (typeof node === \"number\") return String(node);\n if (typeof node === \"boolean\") return \"\";\n if (!Array.isArray(node)) return \"\";\n\n // RSC element: [\"$\", \"tag\", key, props]\n if (node[0] === \"$\" && typeof node[1] === \"string\") {\n const tag = node[1] as string;\n const props = (node[3] || {}) as Record<string, unknown>;\n\n // Skip non-content\n const skipTags = [\"script\", \"style\", \"svg\", \"path\", \"circle\", \"link\", \"meta\",\n \"template\", \"button\", \"input\", \"nav\", \"footer\", \"aside\"];\n if (skipTags.includes(tag)) return \"\";\n\n // Component ref like $L25\n if (tag.startsWith(\"$L\")) {\n const refId = tag.slice(2);\n if (visitedRefs.has(refId)) return \"\";\n\n // Check for heading components with baseId\n if (props.baseId && props.children) {\n return `## ${String(props.children)}\\n\\n`;\n }\n\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n let result = \"\";\n if (refNode) {\n result = extractNode(refNode, ctx);\n } else if (props.children) {\n result = extractNode(props.children as Node, ctx);\n }\n visitedRefs.delete(refId);\n return result;\n }\n\n const children = props.children;\n const content = children ? extractNode(children as Node, ctx) : \"\";\n\n switch (tag) {\n case \"h1\": return `# ${content.trim()}\\n\\n`;\n case \"h2\": return `## ${content.trim()}\\n\\n`;\n case \"h3\": return `### ${content.trim()}\\n\\n`;\n case \"h4\": return `#### ${content.trim()}\\n\\n`;\n case \"h5\": return `##### ${content.trim()}\\n\\n`;\n case \"h6\": return `###### ${content.trim()}\\n\\n`;\n case \"p\": return ctx.inTable ? content : `${content.trim()}\\n\\n`;\n case \"code\": {\n const codeContent = children ? extractNode(children as Node, { ...ctx, inCode: true }) : \"\";\n return ctx.inCode ? codeContent : `\\`${codeContent}\\``;\n }\n case \"pre\": {\n const preContent = children ? extractNode(children as Node, { ...ctx, inCode: true }) : \"\";\n return \"```\\n\" + preContent + \"\\n```\\n\\n\";\n }\n case \"strong\": case \"b\": return `**${content}**`;\n case \"em\": case \"i\": return `*${content}*`;\n case \"li\": return `- ${content.trim()}\\n`;\n case \"ul\": case \"ol\": return content + \"\\n\";\n case \"blockquote\": return `> ${content.trim()}\\n\\n`;\n case \"table\": return extractTable(node as unknown[]) + \"\\n\";\n case \"thead\": case \"tbody\": case \"tr\": case \"th\": case \"td\":\n return content;\n case \"div\":\n if (props.role === \"alert\" || props[\"data-slot\"] === \"alert\") {\n return `> ${content.trim()}\\n\\n`;\n }\n return content;\n case \"a\": {\n const href = props.href as string | undefined;\n return href && !href.startsWith(\"#\") ? `[${content}](${href})` : content;\n }\n default: return content;\n }\n }\n\n // Array of child nodes\n return (node as Node[]).map(n => extractNode(n, ctx)).join(\"\");\n }\n\n function extractTable(tableNode: unknown[]): string {\n const props = (tableNode[3] || {}) as Record<string, unknown>;\n const rows: string[][] = [];\n let headerRowCount = 0;\n\n function walkTable(node: unknown, isHeader = false): void {\n if (node === null || node === undefined) return;\n\n // Handle string refs\n if (typeof node === \"string\") {\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch && !visitedRefs.has(refMatch[1])) {\n visitedRefs.add(refMatch[1]);\n const refNode = getParsedChunk(refMatch[1]);\n if (refNode) walkTable(refNode, isHeader);\n visitedRefs.delete(refMatch[1]);\n }\n return;\n }\n\n if (!Array.isArray(node)) return;\n\n if (node[0] === \"$\") {\n const tag = node[1] as string;\n const nodeProps = (node[3] || {}) as Record<string, unknown>;\n\n // Handle component refs\n if (tag.startsWith(\"$L\")) {\n const refId = tag.slice(2);\n if (!visitedRefs.has(refId)) {\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n if (refNode) walkTable(refNode, isHeader);\n visitedRefs.delete(refId);\n }\n return;\n }\n\n if (tag === \"thead\") walkTable(nodeProps.children, true);\n else if (tag === \"tbody\") walkTable(nodeProps.children, false);\n else if (tag === \"tr\") {\n const cells: string[] = [];\n walkCells(nodeProps.children, cells);\n if (cells.length > 0) {\n rows.push(cells);\n if (isHeader) headerRowCount++;\n }\n } else walkTable(nodeProps.children, isHeader);\n } else {\n for (const child of node) walkTable(child, isHeader);\n }\n }\n\n function walkCells(node: unknown, cells: string[]): void {\n if (node === null || node === undefined) return;\n\n // Handle string refs\n if (typeof node === \"string\") {\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch && !visitedRefs.has(refMatch[1])) {\n visitedRefs.add(refMatch[1]);\n const refNode = getParsedChunk(refMatch[1]);\n if (refNode) walkCells(refNode, cells);\n visitedRefs.delete(refMatch[1]);\n }\n return;\n }\n\n if (!Array.isArray(node)) return;\n\n if (node[0] === \"$\" && (node[1] === \"td\" || node[1] === \"th\")) {\n const cellProps = (node[3] || {}) as Record<string, unknown>;\n const text = extractNode(cellProps.children, { inTable: true, inCode: false })\n .trim()\n .replace(/\\n/g, \" \")\n .replace(/\\\\/g, \"\\\\\\\\\") // Escape backslashes first\n .replace(/\\|/g, \"\\\\|\"); // Then escape pipes\n cells.push(text);\n } else if (node[0] === \"$\" && typeof node[1] === \"string\" && (node[1] as string).startsWith(\"$L\")) {\n // Component ref for a cell\n const refId = (node[1] as string).slice(2);\n if (!visitedRefs.has(refId)) {\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n if (refNode) walkCells(refNode, cells);\n visitedRefs.delete(refId);\n }\n } else {\n for (const child of node) walkCells(child, cells);\n }\n }\n\n walkTable(props.children);\n if (rows.length === 0) return \"\";\n\n const colCount = Math.max(...rows.map(r => r.length));\n let md = \"\";\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i].concat(Array(colCount - rows[i].length).fill(\"\"));\n md += \"| \" + row.join(\" | \") + \" |\\n\";\n if (i === headerRowCount - 1 || (headerRowCount === 0 && i === 0)) {\n md += \"| \" + Array(colCount).fill(\"---\").join(\" | \") + \" |\\n\";\n }\n }\n return md;\n }\n\n // Process main content chunk (usually \"23\")\n const mainChunk = getParsedChunk(\"23\");\n\n if (mainChunk) {\n const content = extractNode(mainChunk);\n if (content.trim().length > 100) {\n const cleaned = content\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n return { title, content: cleaned };\n }\n }\n\n // Fallback: try other chunks\n const contentParts: { order: number; text: string }[] = [];\n\n for (const [id] of chunkMap) {\n if (id === \"23\") continue;\n const parsed = getParsedChunk(id);\n if (!parsed) continue;\n\n visitedRefs.clear();\n const text = extractNode(parsed);\n\n if (text.trim().length > 50 &&\n !text.includes(\"page was not found\") &&\n !text.includes(\"404\")) {\n contentParts.push({ order: parseInt(id, 16), text: text.trim() });\n }\n }\n\n if (contentParts.length === 0) return null;\n\n contentParts.sort((a, b) => a.order - b.order);\n\n const seen = new Set<string>();\n const uniqueParts: string[] = [];\n for (const part of contentParts) {\n const key = part.text.slice(0, 150);\n if (!seen.has(key)) {\n seen.add(key);\n uniqueParts.push(part.text);\n }\n }\n\n const content = uniqueParts.join(\"\\n\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n return content.length > 100 ? { title, content } : null;\n}\n"]}
1
+ {"version":3,"file":"rsc-extract.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/rsc-extract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAqUvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"rsc-extract.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/rsc-extract.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RSC Content Extractor\n *\n * Extracts readable content from Next.js React Server Components (RSC) flight payloads.\n * RSC pages embed content as JSON in <script>self.__next_f.push([...])</script> tags.\n */\n\nexport interface RSCExtractResult {\n title: string;\n content: string;\n}\n\nexport function extractRSCContent(html: string): RSCExtractResult | null {\n if (!html.includes(\"self.__next_f.push\")) {\n return null;\n }\n\n // Parse all RSC chunks into a map\n const chunkMap = new Map<string, string>();\n const scriptRegex = /<script>self\\.__next_f\\.push\\(\\[1,\"([\\s\\S]*?)\"\\]\\)<\\/script>/g;\n\n for (const match of html.matchAll(scriptRegex)) {\n let content: string;\n try {\n content = JSON.parse('\"' + match[1] + '\"');\n } catch {\n continue;\n }\n\n // Parse each line as \"id:payload\"\n // Lines are separated by \\n, each line is one chunk\n // Chunk IDs are hex strings, typically 1-4 chars (supports up to 65535 chunks)\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) continue;\n\n const colonIdx = line.indexOf(\":\");\n if (colonIdx <= 0 || colonIdx > 4) continue;\n\n const id = line.slice(0, colonIdx);\n if (!/^[0-9a-f]+$/i.test(id)) continue;\n\n const payload = line.slice(colonIdx + 1);\n if (!payload) continue;\n\n const existing = chunkMap.get(id);\n if (!existing || payload.length > existing.length) {\n chunkMap.set(id, payload);\n }\n }\n }\n\n if (chunkMap.size === 0) return null;\n\n // Extract title\n const titleMatch = html.match(/<title[^>]*>([^<]+)<\\/title>/);\n const title = titleMatch?.[1]?.split(\"|\")[0]?.trim() || \"\";\n\n // Parse and cache parsed chunks\n const parsedCache = new Map<string, unknown>();\n\n function getParsedChunk(id: string): unknown | null {\n if (parsedCache.has(id)) return parsedCache.get(id);\n\n const chunk = chunkMap.get(id);\n if (!chunk || !chunk.startsWith(\"[\")) {\n parsedCache.set(id, null);\n return null;\n }\n\n try {\n const parsed = JSON.parse(chunk);\n parsedCache.set(id, parsed);\n return parsed;\n } catch {\n parsedCache.set(id, null);\n return null;\n }\n }\n\n // Extract markdown from nodes, resolving refs on the fly\n type Node = unknown;\n const visitedRefs = new Set<string>();\n\n function extractNode(node: Node, ctx = { inTable: false, inCode: false }): string {\n if (node === null || node === undefined) return \"\";\n\n if (typeof node === \"string\") {\n // Check if it's a reference like \"$L30\"\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch) {\n const refId = refMatch[1];\n if (visitedRefs.has(refId)) return \"\"; // Prevent cycles\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n const result = refNode ? extractNode(refNode, ctx) : \"\";\n visitedRefs.delete(refId);\n return result;\n }\n // Filter out RSC-specific artifacts, but preserve content inside code blocks\n if (!ctx.inCode && (node === \"$undefined\" || node === \"$\" || /^\\$[A-Z]/.test(node))) return \"\";\n return node.trim() ? node : \"\";\n }\n\n if (typeof node === \"number\") return String(node);\n if (typeof node === \"boolean\") return \"\";\n if (!Array.isArray(node)) return \"\";\n\n // RSC element: [\"$\", \"tag\", key, props]\n if (node[0] === \"$\" && typeof node[1] === \"string\") {\n const tag = node[1] as string;\n const props = (node[3] || {}) as Record<string, unknown>;\n\n // Skip non-content\n const skipTags = [\"script\", \"style\", \"svg\", \"path\", \"circle\", \"link\", \"meta\",\n \"template\", \"button\", \"input\", \"nav\", \"footer\", \"aside\"];\n if (skipTags.includes(tag)) return \"\";\n\n // Component ref like $L25\n if (tag.startsWith(\"$L\")) {\n const refId = tag.slice(2);\n if (visitedRefs.has(refId)) return \"\";\n\n // Check for heading components with baseId\n if (props.baseId && props.children) {\n return `## ${String(props.children)}\\n\\n`;\n }\n\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n let result = \"\";\n if (refNode) {\n result = extractNode(refNode, ctx);\n } else if (props.children) {\n result = extractNode(props.children as Node, ctx);\n }\n visitedRefs.delete(refId);\n return result;\n }\n\n const children = props.children;\n const content = children ? extractNode(children as Node, ctx) : \"\";\n\n switch (tag) {\n case \"h1\": return `# ${content.trim()}\\n\\n`;\n case \"h2\": return `## ${content.trim()}\\n\\n`;\n case \"h3\": return `### ${content.trim()}\\n\\n`;\n case \"h4\": return `#### ${content.trim()}\\n\\n`;\n case \"h5\": return `##### ${content.trim()}\\n\\n`;\n case \"h6\": return `###### ${content.trim()}\\n\\n`;\n case \"p\": return ctx.inTable ? content : `${content.trim()}\\n\\n`;\n case \"code\": {\n const codeContent = children ? extractNode(children as Node, { ...ctx, inCode: true }) : \"\";\n return ctx.inCode ? codeContent : `\\`${codeContent}\\``;\n }\n case \"pre\": {\n const preContent = children ? extractNode(children as Node, { ...ctx, inCode: true }) : \"\";\n return \"```\\n\" + preContent + \"\\n```\\n\\n\";\n }\n case \"strong\": case \"b\": return `**${content}**`;\n case \"em\": case \"i\": return `*${content}*`;\n case \"li\": return `- ${content.trim()}\\n`;\n case \"ul\": case \"ol\": return content + \"\\n\";\n case \"blockquote\": return `> ${content.trim()}\\n\\n`;\n case \"table\": return extractTable(node as unknown[]) + \"\\n\";\n case \"thead\": case \"tbody\": case \"tr\": case \"th\": case \"td\":\n return content;\n case \"div\":\n if (props.role === \"alert\" || props[\"data-slot\"] === \"alert\") {\n return `> ${content.trim()}\\n\\n`;\n }\n return content;\n case \"a\": {\n const href = props.href as string | undefined;\n return href && !href.startsWith(\"#\") ? `[${content}](${href})` : content;\n }\n default: return content;\n }\n }\n\n // Array of child nodes\n return (node as Node[]).map(n => extractNode(n, ctx)).join(\"\");\n }\n\n function extractTable(tableNode: unknown[]): string {\n const props = (tableNode[3] || {}) as Record<string, unknown>;\n const rows: string[][] = [];\n let headerRowCount = 0;\n\n function walkTable(node: unknown, isHeader = false): void {\n if (node === null || node === undefined) return;\n\n // Handle string refs\n if (typeof node === \"string\") {\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch && !visitedRefs.has(refMatch[1])) {\n visitedRefs.add(refMatch[1]);\n const refNode = getParsedChunk(refMatch[1]);\n if (refNode) walkTable(refNode, isHeader);\n visitedRefs.delete(refMatch[1]);\n }\n return;\n }\n\n if (!Array.isArray(node)) return;\n\n if (node[0] === \"$\") {\n const tag = node[1] as string;\n const nodeProps = (node[3] || {}) as Record<string, unknown>;\n\n // Handle component refs\n if (tag.startsWith(\"$L\")) {\n const refId = tag.slice(2);\n if (!visitedRefs.has(refId)) {\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n if (refNode) walkTable(refNode, isHeader);\n visitedRefs.delete(refId);\n }\n return;\n }\n\n if (tag === \"thead\") walkTable(nodeProps.children, true);\n else if (tag === \"tbody\") walkTable(nodeProps.children, false);\n else if (tag === \"tr\") {\n const cells: string[] = [];\n walkCells(nodeProps.children, cells);\n if (cells.length > 0) {\n rows.push(cells);\n if (isHeader) headerRowCount++;\n }\n } else walkTable(nodeProps.children, isHeader);\n } else {\n for (const child of node) walkTable(child, isHeader);\n }\n }\n\n function walkCells(node: unknown, cells: string[]): void {\n if (node === null || node === undefined) return;\n\n // Handle string refs\n if (typeof node === \"string\") {\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch && !visitedRefs.has(refMatch[1])) {\n visitedRefs.add(refMatch[1]);\n const refNode = getParsedChunk(refMatch[1]);\n if (refNode) walkCells(refNode, cells);\n visitedRefs.delete(refMatch[1]);\n }\n return;\n }\n\n if (!Array.isArray(node)) return;\n\n if (node[0] === \"$\" && (node[1] === \"td\" || node[1] === \"th\")) {\n const cellProps = (node[3] || {}) as Record<string, unknown>;\n const text = extractNode(cellProps.children, { inTable: true, inCode: false })\n .trim()\n .replace(/\\n/g, \" \")\n .replace(/\\\\/g, \"\\\\\\\\\") // Escape backslashes first\n .replace(/\\|/g, \"\\\\|\"); // Then escape pipes\n cells.push(text);\n } else if (node[0] === \"$\" && typeof node[1] === \"string\" && (node[1] as string).startsWith(\"$L\")) {\n // Component ref for a cell\n const refId = (node[1] as string).slice(2);\n if (!visitedRefs.has(refId)) {\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n if (refNode) walkCells(refNode, cells);\n visitedRefs.delete(refId);\n }\n } else {\n for (const child of node) walkCells(child, cells);\n }\n }\n\n walkTable(props.children);\n if (rows.length === 0) return \"\";\n\n const colCount = Math.max(...rows.map(r => r.length));\n let md = \"\";\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i].concat(Array(colCount - rows[i].length).fill(\"\"));\n md += \"| \" + row.join(\" | \") + \" |\\n\";\n if (i === headerRowCount - 1 || (headerRowCount === 0 && i === 0)) {\n md += \"| \" + Array(colCount).fill(\"---\").join(\" | \") + \" |\\n\";\n }\n }\n return md;\n }\n\n // Process main content chunk (usually \"23\")\n const mainChunk = getParsedChunk(\"23\");\n\n if (mainChunk) {\n const content = extractNode(mainChunk);\n if (content.trim().length > 100) {\n const cleaned = content\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n return { title, content: cleaned };\n }\n }\n\n // Fallback: try other chunks\n const contentParts: { order: number; text: string }[] = [];\n\n for (const [id] of chunkMap) {\n if (id === \"23\") continue;\n const parsed = getParsedChunk(id);\n if (!parsed) continue;\n\n visitedRefs.clear();\n const text = extractNode(parsed);\n\n if (text.trim().length > 50 &&\n !text.includes(\"page was not found\") &&\n !text.includes(\"404\")) {\n contentParts.push({ order: parseInt(id, 16), text: text.trim() });\n }\n }\n\n if (contentParts.length === 0) return null;\n\n contentParts.sort((a, b) => a.order - b.order);\n\n const seen = new Set<string>();\n const uniqueParts: string[] = [];\n for (const part of contentParts) {\n const key = part.text.slice(0, 150);\n if (!seen.has(key)) {\n seen.add(key);\n uniqueParts.push(part.text);\n }\n }\n\n const content = uniqueParts.join(\"\\n\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n return content.length > 100 ? { title, content } : null;\n}\n"]}
1
+ {"version":3,"file":"rsc-extract.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/rsc-extract.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RSC Content Extractor\n *\n * Extracts readable content from Next.js React Server Components (RSC) flight payloads.\n * RSC pages embed content as JSON in <script>self.__next_f.push([...])</script> tags.\n */\n\nexport interface RSCExtractResult {\n title: string;\n content: string;\n}\n\nexport function extractRSCContent(html: string): RSCExtractResult | null {\n if (!html.includes(\"self.__next_f.push\")) {\n return null;\n }\n\n // Parse all RSC chunks into a map\n const chunkMap = new Map<string, string>();\n const scriptRegex = /<script>self\\.__next_f\\.push\\(\\[1,\"([\\s\\S]*?)\"\\]\\)<\\/script>/g;\n\n for (const match of html.matchAll(scriptRegex)) {\n let content: string;\n try {\n content = JSON.parse('\"' + match[1] + '\"');\n } catch {\n continue;\n }\n\n // Parse each line as \"id:payload\"\n // Lines are separated by \\n, each line is one chunk\n // Chunk IDs are hex strings, typically 1-4 chars (supports up to 65535 chunks)\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) continue;\n\n const colonIdx = line.indexOf(\":\");\n if (colonIdx <= 0 || colonIdx > 4) continue;\n\n const id = line.slice(0, colonIdx);\n if (!/^[0-9a-f]+$/i.test(id)) continue;\n\n const payload = line.slice(colonIdx + 1);\n if (!payload) continue;\n\n const existing = chunkMap.get(id);\n if (!existing || payload.length > existing.length) {\n chunkMap.set(id, payload);\n }\n }\n }\n\n if (chunkMap.size === 0) return null;\n\n // Extract title\n const titleMatch = html.match(/<title[^>]*>([^<]+)<\\/title>/);\n const title = titleMatch?.[1]?.split(\"|\")[0]?.trim() || \"\";\n\n // Parse and cache parsed chunks\n const parsedCache = new Map<string, unknown>();\n\n function getParsedChunk(id: string): unknown | null {\n if (parsedCache.has(id)) return parsedCache.get(id);\n\n const chunk = chunkMap.get(id);\n if (!chunk || !chunk.startsWith(\"[\")) {\n parsedCache.set(id, null);\n return null;\n }\n\n try {\n const parsed = JSON.parse(chunk);\n parsedCache.set(id, parsed);\n return parsed;\n } catch {\n parsedCache.set(id, null);\n return null;\n }\n }\n\n // Extract markdown from nodes, resolving refs on the fly\n type Node = unknown;\n const visitedRefs = new Set<string>();\n\n function extractNode(node: Node, ctx = { inTable: false, inCode: false }): string {\n if (node === null || node === undefined) return \"\";\n\n if (typeof node === \"string\") {\n // Check if it's a reference like \"$L30\"\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch) {\n const refId = refMatch[1];\n if (visitedRefs.has(refId)) return \"\"; // Prevent cycles\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n const result = refNode ? extractNode(refNode, ctx) : \"\";\n visitedRefs.delete(refId);\n return result;\n }\n // Filter out RSC-specific artifacts, but preserve content inside code blocks\n if (!ctx.inCode && (node === \"$undefined\" || node === \"$\" || /^\\$[A-Z]/.test(node))) return \"\";\n return node.trim() ? node : \"\";\n }\n\n if (typeof node === \"number\") return String(node);\n if (typeof node === \"boolean\") return \"\";\n if (!Array.isArray(node)) return \"\";\n\n // RSC element: [\"$\", \"tag\", key, props]\n if (node[0] === \"$\" && typeof node[1] === \"string\") {\n const tag = node[1] as string;\n const props = (node[3] || {}) as Record<string, unknown>;\n\n // Skip non-content\n const skipTags = [\"script\", \"style\", \"svg\", \"path\", \"circle\", \"link\", \"meta\",\n \"template\", \"button\", \"input\", \"nav\", \"footer\", \"aside\"];\n if (skipTags.includes(tag)) return \"\";\n\n // Component ref like $L25\n if (tag.startsWith(\"$L\")) {\n const refId = tag.slice(2);\n if (visitedRefs.has(refId)) return \"\";\n\n // Check for heading components with baseId\n if (props.baseId && props.children) {\n return `## ${String(props.children)}\\n\\n`;\n }\n\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n let result = \"\";\n if (refNode) {\n result = extractNode(refNode, ctx);\n } else if (props.children) {\n result = extractNode(props.children as Node, ctx);\n }\n visitedRefs.delete(refId);\n return result;\n }\n\n const children = props.children;\n const content = children ? extractNode(children as Node, ctx) : \"\";\n\n switch (tag) {\n case \"h1\": return `# ${content.trim()}\\n\\n`;\n case \"h2\": return `## ${content.trim()}\\n\\n`;\n case \"h3\": return `### ${content.trim()}\\n\\n`;\n case \"h4\": return `#### ${content.trim()}\\n\\n`;\n case \"h5\": return `##### ${content.trim()}\\n\\n`;\n case \"h6\": return `###### ${content.trim()}\\n\\n`;\n case \"p\": return ctx.inTable ? content : `${content.trim()}\\n\\n`;\n case \"code\": {\n const codeContent = children ? extractNode(children as Node, { ...ctx, inCode: true }) : \"\";\n return ctx.inCode ? codeContent : `\\`${codeContent}\\``;\n }\n case \"pre\": {\n const preContent = children ? extractNode(children as Node, { ...ctx, inCode: true }) : \"\";\n return \"```\\n\" + preContent + \"\\n```\\n\\n\";\n }\n case \"strong\": case \"b\": return `**${content}**`;\n case \"em\": case \"i\": return `*${content}*`;\n case \"li\": return `- ${content.trim()}\\n`;\n case \"ul\": case \"ol\": return content + \"\\n\";\n case \"blockquote\": return `> ${content.trim()}\\n\\n`;\n case \"table\": return extractTable(node as unknown[]) + \"\\n\";\n case \"thead\": case \"tbody\": case \"tr\": case \"th\": case \"td\":\n return content;\n case \"div\":\n if (props.role === \"alert\" || props[\"data-slot\"] === \"alert\") {\n return `> ${content.trim()}\\n\\n`;\n }\n return content;\n case \"a\": {\n const href = props.href as string | undefined;\n return href && !href.startsWith(\"#\") ? `[${content}](${href})` : content;\n }\n default: return content;\n }\n }\n\n // Array of child nodes\n return (node as Node[]).map(n => extractNode(n, ctx)).join(\"\");\n }\n\n function extractTable(tableNode: unknown[]): string {\n const props = (tableNode[3] || {}) as Record<string, unknown>;\n const rows: string[][] = [];\n let headerRowCount = 0;\n\n function walkTable(node: unknown, isHeader = false): void {\n if (node === null || node === undefined) return;\n\n // Handle string refs\n if (typeof node === \"string\") {\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch && !visitedRefs.has(refMatch[1])) {\n visitedRefs.add(refMatch[1]);\n const refNode = getParsedChunk(refMatch[1]);\n if (refNode) walkTable(refNode, isHeader);\n visitedRefs.delete(refMatch[1]);\n }\n return;\n }\n\n if (!Array.isArray(node)) return;\n\n if (node[0] === \"$\") {\n const tag = node[1] as string;\n const nodeProps = (node[3] || {}) as Record<string, unknown>;\n\n // Handle component refs\n if (tag.startsWith(\"$L\")) {\n const refId = tag.slice(2);\n if (!visitedRefs.has(refId)) {\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n if (refNode) walkTable(refNode, isHeader);\n visitedRefs.delete(refId);\n }\n return;\n }\n\n if (tag === \"thead\") walkTable(nodeProps.children, true);\n else if (tag === \"tbody\") walkTable(nodeProps.children, false);\n else if (tag === \"tr\") {\n const cells: string[] = [];\n walkCells(nodeProps.children, cells);\n if (cells.length > 0) {\n rows.push(cells);\n if (isHeader) headerRowCount++;\n }\n } else walkTable(nodeProps.children, isHeader);\n } else {\n for (const child of node) walkTable(child, isHeader);\n }\n }\n\n function walkCells(node: unknown, cells: string[]): void {\n if (node === null || node === undefined) return;\n\n // Handle string refs\n if (typeof node === \"string\") {\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch && !visitedRefs.has(refMatch[1])) {\n visitedRefs.add(refMatch[1]);\n const refNode = getParsedChunk(refMatch[1]);\n if (refNode) walkCells(refNode, cells);\n visitedRefs.delete(refMatch[1]);\n }\n return;\n }\n\n if (!Array.isArray(node)) return;\n\n if (node[0] === \"$\" && (node[1] === \"td\" || node[1] === \"th\")) {\n const cellProps = (node[3] || {}) as Record<string, unknown>;\n const text = extractNode(cellProps.children, { inTable: true, inCode: false })\n .trim()\n .replace(/\\n/g, \" \")\n .replace(/\\\\/g, \"\\\\\\\\\") // Escape backslashes first\n .replace(/\\|/g, \"\\\\|\"); // Then escape pipes\n cells.push(text);\n } else if (node[0] === \"$\" && typeof node[1] === \"string\" && (node[1] as string).startsWith(\"$L\")) {\n // Component ref for a cell\n const refId = (node[1] as string).slice(2);\n if (!visitedRefs.has(refId)) {\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n if (refNode) walkCells(refNode, cells);\n visitedRefs.delete(refId);\n }\n } else {\n for (const child of node) walkCells(child, cells);\n }\n }\n\n walkTable(props.children);\n if (rows.length === 0) return \"\";\n\n const colCount = Math.max(...rows.map(r => r.length));\n let md = \"\";\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i].concat(Array(colCount - rows[i].length).fill(\"\"));\n md += \"| \" + row.join(\" | \") + \" |\\n\";\n if (i === headerRowCount - 1 || (headerRowCount === 0 && i === 0)) {\n md += \"| \" + Array(colCount).fill(\"---\").join(\" | \") + \" |\\n\";\n }\n }\n return md;\n }\n\n // Process main content chunk (usually \"23\")\n const mainChunk = getParsedChunk(\"23\");\n\n if (mainChunk) {\n const content = extractNode(mainChunk);\n if (content.trim().length > 100) {\n const cleaned = content\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n return { title, content: cleaned };\n }\n }\n\n // Fallback: try other chunks\n const contentParts: { order: number; text: string }[] = [];\n\n for (const [id] of chunkMap) {\n if (id === \"23\") continue;\n const parsed = getParsedChunk(id);\n if (!parsed) continue;\n\n visitedRefs.clear();\n const text = extractNode(parsed);\n\n if (text.trim().length > 50 &&\n !text.includes(\"page was not found\") &&\n !text.includes(\"404\")) {\n contentParts.push({ order: parseInt(id, 16), text: text.trim() });\n }\n }\n\n if (contentParts.length === 0) return null;\n\n contentParts.sort((a, b) => a.order - b.order);\n\n const seen = new Set<string>();\n const uniqueParts: string[] = [];\n for (const part of contentParts) {\n const key = part.text.slice(0, 150);\n if (!seen.has(key)) {\n seen.add(key);\n uniqueParts.push(part.text);\n }\n }\n\n const content = uniqueParts.join(\"\\n\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n return content.length > 100 ? { title, content } : null;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"search1api.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/search1api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAqCrE,UAAU,uBAAwB,SAAQ,aAAa;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AA4CD,wBAAgB,qBAAqB,IAAI,OAAO,CAM/C;AAmID,wBAAsB,oBAAoB,CACzC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,uBAA4B,GACnC,OAAO,CAAC,cAAc,CAAC,CA8BzB;AAED,wBAAsB,qBAAqB,CAC1C,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAwClC","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport type { ExtractedContent, ExtractOptions } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst SEARCH1API_SEARCH_URL = \"https://api.search1api.com/search\";\nconst SEARCH1API_CRAWL_URL = \"https://api.search1api.com/crawl\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\nconst CRAWL_TIMEOUT_MS = 60_000;\n\ninterface WebSearchConfig {\n\tsearch1apiApiKey?: unknown;\n}\n\ninterface Search1APISearchResult {\n\ttitle?: string | null;\n\tlink?: string | null;\n\tsnippet?: string | null;\n\tcontent?: string | null;\n}\n\ninterface Search1APISearchResponse {\n\tsearchParameters?: Record<string, unknown>;\n\tresults?: Search1APISearchResult[];\n}\n\ninterface Search1APICrawlResult {\n\ttitle?: string | null;\n\tlink?: string | null;\n\tcontent?: string | null;\n\tmetadata?: Record<string, unknown>;\n}\n\ninterface Search1APICrawlResponse {\n\tcrawlParameters?: { url?: string };\n\tresults?: Search1APICrawlResult;\n}\n\ninterface Search1APISearchOptions extends SearchOptions {\n\tincludeContent?: boolean;\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\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid config in ${CONFIG_PATH}: expected a JSON object`);\n\t}\n\tcachedConfig = parsed as WebSearchConfig;\n\treturn cachedConfig;\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string> {\n\tconst key = await resolveCredential({\n\t\tprovider: \"Search1API\",\n\t\tconfiguredValue: loadConfig().search1apiApiKey,\n\t\tenvironmentValue: process.env.SEARCH1API_KEY,\n\t\tsignal,\n\t});\n\tif (!key) {\n\t\tthrow new Error(\n\t\t\t\"Search1API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"search1apiApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set SEARCH1API_KEY environment variable\\n\" +\n\t\t\t\"Create a key at https://dashboard.search1api.com\",\n\t\t);\n\t}\n\treturn key;\n}\n\nexport function isSearch1APIAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"Search1API\",\n\t\tconfiguredValue: loadConfig().search1apiApiKey,\n\t\tenvironmentValue: process.env.SEARCH1API_KEY,\n\t});\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction requestSignal(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n\tconst timeout = AbortSignal.timeout(timeoutMs);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction normalizeNumResults(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 5;\n\treturn Math.max(1, Math.min(Math.floor(value), 20));\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\nfunction mapDomainFilter(domainFilter: string[] | undefined): { includeSites: string[]; excludeSites: string[] } {\n\tconst includeSites: string[] = [];\n\tconst excludeSites: string[] = [];\n\tfor (const raw of domainFilter ?? []) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? excludeSites : includeSites;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn { includeSites, excludeSites };\n}\n\nfunction buildSearchBody(query: string, options: Search1APISearchOptions): Record<string, unknown> {\n\tconst numResults = normalizeNumResults(options.numResults);\n\tconst { includeSites, excludeSites } = mapDomainFilter(options.domainFilter);\n\treturn {\n\t\tquery,\n\t\tmax_results: numResults,\n\t\tcrawl_results: options.includeContent ? numResults : 0,\n\t\t...(includeSites.length > 0 ? { include_sites: includeSites } : {}),\n\t\t...(excludeSites.length > 0 ? { exclude_sites: excludeSites } : {}),\n\t\t...(options.recencyFilter ? { time_range: options.recencyFilter } : {}),\n\t};\n}\n\nasync function search1APIJsonRequest<T>(\n\tlabel: \"Search\" | \"Crawl\",\n\turl: string,\n\tapiKey: string,\n\tbody: Record<string, unknown>,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal(signal, timeoutMs),\n\t\t});\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\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\tconst raw = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`Search1API ${label} API error ${response.status}: ${redactCredential(raw, apiKey).slice(0, 300)}`);\n\t}\n\ttry {\n\t\treturn JSON.parse(raw) as T;\n\t} catch (err) {\n\t\tthrow new Error(`Search1API ${label} API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n}\n\nfunction mapSearchResults(results: Search1APISearchResult[] | undefined): SearchResponse[\"results\"] {\n\tif (!Array.isArray(results)) {\n\t\tthrow new Error(\"Search1API Search API returned an unexpected response shape\");\n\t}\n\treturn results.flatMap((item) => {\n\t\tif (!item || typeof item.link !== \"string\" || item.link.trim().length === 0) return [];\n\t\tconst url = item.link.trim();\n\t\treturn [{\n\t\t\ttitle: typeof item.title === \"string\" && item.title.trim() ? item.title.trim() : url,\n\t\t\turl,\n\t\t\tsnippet: typeof item.snippet === \"string\" ? item.snippet.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t}];\n\t});\n}\n\nfunction mapInlineContent(results: Search1APISearchResult[] | undefined): ExtractedContent[] {\n\tif (!Array.isArray(results)) return [];\n\treturn results.flatMap((item) => {\n\t\tif (!item || typeof item.link !== \"string\" || item.link.trim().length === 0) return [];\n\t\tif (typeof item.content !== \"string\" || item.content.trim().length === 0) return [];\n\t\treturn [{\n\t\t\turl: item.link.trim(),\n\t\t\ttitle: typeof item.title === \"string\" ? item.title.trim() : \"\",\n\t\t\tcontent: item.content,\n\t\t\terror: null,\n\t\t}];\n\t});\n}\n\nfunction buildAnswer(results: SearchResponse[\"results\"]): string {\n\treturn results.map((result) => {\n\t\tif (result.snippet) return `${result.snippet}\\nSource: ${result.title} (${result.url})`;\n\t\treturn `Source: ${result.title} (${result.url})`;\n\t}).join(\"\\n\\n\");\n}\n\nexport async function searchWithSearch1API(\n\tquery: string,\n\toptions: Search1APISearchOptions = {},\n): Promise<SearchResponse> {\n\tconst apiKey = await getApiKey(options.signal);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\ttry {\n\t\tconst data = await search1APIJsonRequest<Search1APISearchResponse>(\n\t\t\t\"Search\",\n\t\t\tSEARCH1API_SEARCH_URL,\n\t\t\tapiKey,\n\t\t\tbuildSearchBody(query, options),\n\t\t\tSEARCH_TIMEOUT_MS,\n\t\t\toptions.signal,\n\t\t);\n\t\tconst results = mapSearchResults(data.results);\n\t\tconst response: SearchResponse = { answer: buildAnswer(results), results };\n\t\tif (options.includeContent) {\n\t\t\tconst inlineContent = mapInlineContent(data.results);\n\t\t\tif (inlineContent.length > 0) response.inlineContent = inlineContent;\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn response;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\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\nexport async function extractWithSearch1API(\n\turl: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<ExtractedContent | null> {\n\tconst apiKey = await getApiKey(signal);\n\tconst activityId = activityMonitor.logStart({ type: \"fetch\", url });\n\ttry {\n\t\tconst data = await search1APIJsonRequest<Search1APICrawlResponse>(\n\t\t\t\"Crawl\",\n\t\t\tSEARCH1API_CRAWL_URL,\n\t\t\tapiKey,\n\t\t\t{ url },\n\t\t\ttypeof options.timeoutMs === \"number\" && Number.isFinite(options.timeoutMs)\n\t\t\t\t? Math.max(1, Math.floor(options.timeoutMs))\n\t\t\t\t: CRAWL_TIMEOUT_MS,\n\t\t\tsignal,\n\t\t);\n\t\tconst result = data.results;\n\t\tif (!result || typeof result !== \"object\") {\n\t\t\tthrow new Error(\"Search1API Crawl API returned an unexpected response shape\");\n\t\t}\n\t\tconst content = typeof result.content === \"string\" ? result.content.trim() : \"\";\n\t\tif (!content) {\n\t\t\tactivityMonitor.logComplete(activityId, 200);\n\t\t\treturn null;\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: typeof result.title === \"string\" ? result.title.trim() : \"\",\n\t\t\tcontent,\n\t\t\terror: null,\n\t\t};\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\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":"search1api.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/search1api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAqCrE,UAAU,uBAAwB,SAAQ,aAAa;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AA4CD,wBAAgB,qBAAqB,IAAI,OAAO,CAM/C;AAmID,wBAAsB,oBAAoB,CACzC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,uBAA4B,GACnC,OAAO,CAAC,cAAc,CAAC,CA8BzB;AAED,wBAAsB,qBAAqB,CAC1C,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAwClC"}