@humain/terminal 0.0.4-beta.1 → 0.0.5

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 (675) hide show
  1. package/CHANGELOG.md +26 -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 +100 -128
  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 +2 -1
  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.map +1 -1
  171. package/dist/core/session-manager.js +9 -13
  172. package/dist/core/session-manager.js.map +1 -1
  173. package/dist/core/settings-manager.d.ts +6 -0
  174. package/dist/core/settings-manager.d.ts.map +1 -1
  175. package/dist/core/settings-manager.js +19 -17
  176. package/dist/core/settings-manager.js.map +1 -1
  177. package/dist/core/skills.d.ts.map +1 -1
  178. package/dist/core/skills.js.map +1 -1
  179. package/dist/core/slash-commands.d.ts.map +1 -1
  180. package/dist/core/source-info.d.ts.map +1 -1
  181. package/dist/core/source-info.js.map +1 -1
  182. package/dist/core/system-prompt.d.ts.map +1 -1
  183. package/dist/core/system-prompt.js +1 -1
  184. package/dist/core/system-prompt.js.map +1 -1
  185. package/dist/core/telemetry.d.ts.map +1 -1
  186. package/dist/core/telemetry.js.map +1 -1
  187. package/dist/core/timings.d.ts.map +1 -1
  188. package/dist/core/timings.js.map +1 -1
  189. package/dist/core/tools/bash.d.ts.map +1 -1
  190. package/dist/core/tools/bash.js +10 -5
  191. package/dist/core/tools/bash.js.map +1 -1
  192. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  193. package/dist/core/tools/edit-diff.js.map +1 -1
  194. package/dist/core/tools/edit.d.ts.map +1 -1
  195. package/dist/core/tools/edit.js +2 -0
  196. package/dist/core/tools/edit.js.map +1 -1
  197. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  198. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  199. package/dist/core/tools/find.d.ts +1 -1
  200. package/dist/core/tools/find.d.ts.map +1 -1
  201. package/dist/core/tools/find.js +1 -1
  202. package/dist/core/tools/find.js.map +1 -1
  203. package/dist/core/tools/grep.d.ts.map +1 -1
  204. package/dist/core/tools/grep.js +1 -1
  205. package/dist/core/tools/grep.js.map +1 -1
  206. package/dist/core/tools/index.d.ts.map +1 -1
  207. package/dist/core/tools/index.js.map +1 -1
  208. package/dist/core/tools/ls.d.ts.map +1 -1
  209. package/dist/core/tools/ls.js.map +1 -1
  210. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  211. package/dist/core/tools/output-accumulator.js +12 -18
  212. package/dist/core/tools/output-accumulator.js.map +1 -1
  213. package/dist/core/tools/path-utils.d.ts.map +1 -1
  214. package/dist/core/tools/path-utils.js.map +1 -1
  215. package/dist/core/tools/read.d.ts.map +1 -1
  216. package/dist/core/tools/read.js +2 -0
  217. package/dist/core/tools/read.js.map +1 -1
  218. package/dist/core/tools/render-utils.d.ts.map +1 -1
  219. package/dist/core/tools/render-utils.js.map +1 -1
  220. package/dist/core/tools/subagent.d.ts +3 -0
  221. package/dist/core/tools/subagent.d.ts.map +1 -1
  222. package/dist/core/tools/subagent.js +30 -9
  223. package/dist/core/tools/subagent.js.map +1 -1
  224. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  225. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  226. package/dist/core/tools/truncate.d.ts.map +1 -1
  227. package/dist/core/tools/truncate.js.map +1 -1
  228. package/dist/core/tools/write.d.ts.map +1 -1
  229. package/dist/core/tools/write.js +2 -1
  230. package/dist/core/tools/write.js.map +1 -1
  231. package/dist/core/trust-manager.d.ts.map +1 -1
  232. package/dist/core/trust-manager.js +0 -1
  233. package/dist/core/trust-manager.js.map +1 -1
  234. package/dist/core/usage-totals.d.ts.map +1 -1
  235. package/dist/core/usage-totals.js.map +1 -1
  236. package/dist/extensions/index.d.ts.map +1 -1
  237. package/dist/extensions/llama/client.d.ts.map +1 -1
  238. package/dist/extensions/llama/client.js +0 -2
  239. package/dist/extensions/llama/client.js.map +1 -1
  240. package/dist/extensions/llama/huggingface.d.ts.map +1 -1
  241. package/dist/extensions/llama/huggingface.js +0 -2
  242. package/dist/extensions/llama/huggingface.js.map +1 -1
  243. package/dist/extensions/llama/index.d.ts.map +1 -1
  244. package/dist/extensions/llama/index.js.map +1 -1
  245. package/dist/extensions/llama/provider.d.ts.map +1 -1
  246. package/dist/extensions/llama/provider.js.map +1 -1
  247. package/dist/extensions/llama/ui.d.ts.map +1 -1
  248. package/dist/extensions/llama/ui.js +12 -28
  249. package/dist/extensions/llama/ui.js.map +1 -1
  250. package/dist/humain/agent-execution-protocol.d.ts.map +1 -1
  251. package/dist/humain/agent-execution-protocol.js.map +1 -1
  252. package/dist/humain/agent-execution-runtime.d.ts.map +1 -1
  253. package/dist/humain/agent-execution-runtime.js.map +1 -1
  254. package/dist/humain/bedrock-provider/vendor/index.bundle.mjs +127 -7
  255. package/dist/humain/brand-logo.d.ts.map +1 -1
  256. package/dist/humain/index.d.ts.map +1 -1
  257. package/dist/humain/index.js.map +1 -1
  258. package/dist/humain/legacy-workflow-tiers.d.ts.map +1 -1
  259. package/dist/humain/legacy-workflow-tiers.js.map +1 -1
  260. package/dist/humain/mcp-adapter/vendor/package.json +3 -3
  261. package/dist/humain/mcp-adapter.d.ts.map +1 -1
  262. package/dist/humain/mcp-adapter.js.map +1 -1
  263. package/dist/humain/pi-agent-execution-host.d.ts.map +1 -1
  264. package/dist/humain/pi-agent-execution-host.js.map +1 -1
  265. package/dist/humain/web-access/host.d.ts.map +1 -1
  266. package/dist/humain/web-access/index.d.ts.map +1 -1
  267. package/dist/humain/web-access/index.js.map +1 -1
  268. package/dist/humain/web-access/vendor/activity.d.ts.map +1 -1
  269. package/dist/humain/web-access/vendor/activity.js +7 -5
  270. package/dist/humain/web-access/vendor/activity.js.map +1 -1
  271. package/dist/humain/web-access/vendor/anysearch.d.ts.map +1 -1
  272. package/dist/humain/web-access/vendor/anysearch.js.map +1 -1
  273. package/dist/humain/web-access/vendor/auth-fetch.d.ts.map +1 -1
  274. package/dist/humain/web-access/vendor/auth-fetch.js.map +1 -1
  275. package/dist/humain/web-access/vendor/bocha.d.ts.map +1 -1
  276. package/dist/humain/web-access/vendor/bocha.js.map +1 -1
  277. package/dist/humain/web-access/vendor/brave.d.ts.map +1 -1
  278. package/dist/humain/web-access/vendor/brave.js.map +1 -1
  279. package/dist/humain/web-access/vendor/brightdata-unlocker.d.ts.map +1 -1
  280. package/dist/humain/web-access/vendor/brightdata-unlocker.js.map +1 -1
  281. package/dist/humain/web-access/vendor/brightdata.d.ts.map +1 -1
  282. package/dist/humain/web-access/vendor/brightdata.js.map +1 -1
  283. package/dist/humain/web-access/vendor/chrome-cookies.d.ts.map +1 -1
  284. package/dist/humain/web-access/vendor/chrome-cookies.js +101 -19
  285. package/dist/humain/web-access/vendor/chrome-cookies.js.map +1 -1
  286. package/dist/humain/web-access/vendor/content-find.d.ts.map +1 -1
  287. package/dist/humain/web-access/vendor/content-find.js.map +1 -1
  288. package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -1
  289. package/dist/humain/web-access/vendor/credential-source.js +0 -2
  290. package/dist/humain/web-access/vendor/credential-source.js.map +1 -1
  291. package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
  292. package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
  293. package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
  294. package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
  295. package/dist/humain/web-access/vendor/data-uri-sanitize.d.ts +21 -0
  296. package/dist/humain/web-access/vendor/data-uri-sanitize.d.ts.map +1 -0
  297. package/dist/humain/web-access/vendor/data-uri-sanitize.js +373 -0
  298. package/dist/humain/web-access/vendor/data-uri-sanitize.js.map +1 -0
  299. package/dist/humain/web-access/vendor/datalab-pdf-extract.d.ts.map +1 -1
  300. package/dist/humain/web-access/vendor/datalab-pdf-extract.js.map +1 -1
  301. package/dist/humain/web-access/vendor/declared-web-links.d.ts.map +1 -1
  302. package/dist/humain/web-access/vendor/declared-web-links.js.map +1 -1
  303. package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -1
  304. package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -1
  305. package/dist/humain/web-access/vendor/exa.d.ts.map +1 -1
  306. package/dist/humain/web-access/vendor/exa.js.map +1 -1
  307. package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
  308. package/dist/humain/web-access/vendor/extract.js +14 -2
  309. package/dist/humain/web-access/vendor/extract.js.map +1 -1
  310. package/dist/humain/web-access/vendor/feature-config.d.ts.map +1 -1
  311. package/dist/humain/web-access/vendor/feature-config.js.map +1 -1
  312. package/dist/humain/web-access/vendor/fetch-params.d.ts.map +1 -1
  313. package/dist/humain/web-access/vendor/fetch-params.js.map +1 -1
  314. package/dist/humain/web-access/vendor/firecrawl.d.ts.map +1 -1
  315. package/dist/humain/web-access/vendor/firecrawl.js +15 -2
  316. package/dist/humain/web-access/vendor/firecrawl.js.map +1 -1
  317. package/dist/humain/web-access/vendor/gemini-api.d.ts.map +1 -1
  318. package/dist/humain/web-access/vendor/gemini-api.js.map +1 -1
  319. package/dist/humain/web-access/vendor/gemini-pdf-extract.d.ts.map +1 -1
  320. package/dist/humain/web-access/vendor/gemini-pdf-extract.js.map +1 -1
  321. package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
  322. package/dist/humain/web-access/vendor/gemini-search.js +30 -16
  323. package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
  324. package/dist/humain/web-access/vendor/gemini-url-context.d.ts.map +1 -1
  325. package/dist/humain/web-access/vendor/gemini-url-context.js.map +1 -1
  326. package/dist/humain/web-access/vendor/gemini-web-config.d.ts.map +1 -1
  327. package/dist/humain/web-access/vendor/gemini-web-config.js.map +1 -1
  328. package/dist/humain/web-access/vendor/gemini-web.d.ts.map +1 -1
  329. package/dist/humain/web-access/vendor/gemini-web.js.map +1 -1
  330. package/dist/humain/web-access/vendor/github-api.d.ts.map +1 -1
  331. package/dist/humain/web-access/vendor/github-api.js.map +1 -1
  332. package/dist/humain/web-access/vendor/github-extract.d.ts.map +1 -1
  333. package/dist/humain/web-access/vendor/github-extract.js +69 -35
  334. package/dist/humain/web-access/vendor/github-extract.js.map +1 -1
  335. package/dist/humain/web-access/vendor/index.d.ts +74 -1
  336. package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
  337. package/dist/humain/web-access/vendor/index.js +38 -15
  338. package/dist/humain/web-access/vendor/index.js.map +1 -1
  339. package/dist/humain/web-access/vendor/jina-search.d.ts.map +1 -1
  340. package/dist/humain/web-access/vendor/jina-search.js.map +1 -1
  341. package/dist/humain/web-access/vendor/kagi.d.ts.map +1 -1
  342. package/dist/humain/web-access/vendor/kagi.js.map +1 -1
  343. package/dist/humain/web-access/vendor/ollama.d.ts.map +1 -1
  344. package/dist/humain/web-access/vendor/ollama.js.map +1 -1
  345. package/dist/humain/web-access/vendor/openai-search.d.ts +1 -1
  346. package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -1
  347. package/dist/humain/web-access/vendor/openai-search.js +15 -5
  348. package/dist/humain/web-access/vendor/openai-search.js.map +1 -1
  349. package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -1
  350. package/dist/humain/web-access/vendor/page-query.js.map +1 -1
  351. package/dist/humain/web-access/vendor/parallel-mcp.d.ts.map +1 -1
  352. package/dist/humain/web-access/vendor/parallel-mcp.js.map +1 -1
  353. package/dist/humain/web-access/vendor/parallel.d.ts.map +1 -1
  354. package/dist/humain/web-access/vendor/parallel.js.map +1 -1
  355. package/dist/humain/web-access/vendor/pdf-extract.d.ts +1 -0
  356. package/dist/humain/web-access/vendor/pdf-extract.d.ts.map +1 -1
  357. package/dist/humain/web-access/vendor/pdf-extract.js +15 -5
  358. package/dist/humain/web-access/vendor/pdf-extract.js.map +1 -1
  359. package/dist/humain/web-access/vendor/perplexity.d.ts.map +1 -1
  360. package/dist/humain/web-access/vendor/perplexity.js.map +1 -1
  361. package/dist/humain/web-access/vendor/querit.d.ts.map +1 -1
  362. package/dist/humain/web-access/vendor/querit.js.map +1 -1
  363. package/dist/humain/web-access/vendor/query-rewrite.d.ts.map +1 -1
  364. package/dist/humain/web-access/vendor/query-rewrite.js.map +1 -1
  365. package/dist/humain/web-access/vendor/render-search-error.d.ts.map +1 -1
  366. package/dist/humain/web-access/vendor/render-search-error.js.map +1 -1
  367. package/dist/humain/web-access/vendor/rsc-extract.d.ts.map +1 -1
  368. package/dist/humain/web-access/vendor/rsc-extract.js.map +1 -1
  369. package/dist/humain/web-access/vendor/search1api.d.ts.map +1 -1
  370. package/dist/humain/web-access/vendor/search1api.js.map +1 -1
  371. package/dist/humain/web-access/vendor/searchinfinity.d.ts.map +1 -1
  372. package/dist/humain/web-access/vendor/searchinfinity.js.map +1 -1
  373. package/dist/humain/web-access/vendor/searxng.d.ts.map +1 -1
  374. package/dist/humain/web-access/vendor/searxng.js.map +1 -1
  375. package/dist/humain/web-access/vendor/serpbase.d.ts.map +1 -1
  376. package/dist/humain/web-access/vendor/serpbase.js.map +1 -1
  377. package/dist/humain/web-access/vendor/serpdive.d.ts.map +1 -1
  378. package/dist/humain/web-access/vendor/serpdive.js.map +1 -1
  379. package/dist/humain/web-access/vendor/serper.d.ts.map +1 -1
  380. package/dist/humain/web-access/vendor/serper.js.map +1 -1
  381. package/dist/humain/web-access/vendor/source-check.d.ts.map +1 -1
  382. package/dist/humain/web-access/vendor/source-check.js.map +1 -1
  383. package/dist/humain/web-access/vendor/ssrf-protection.d.ts +2 -0
  384. package/dist/humain/web-access/vendor/ssrf-protection.d.ts.map +1 -1
  385. package/dist/humain/web-access/vendor/ssrf-protection.js +11 -2
  386. package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -1
  387. package/dist/humain/web-access/vendor/storage.d.ts.map +1 -1
  388. package/dist/humain/web-access/vendor/storage.js.map +1 -1
  389. package/dist/humain/web-access/vendor/summary-model-scope.d.ts.map +1 -1
  390. package/dist/humain/web-access/vendor/summary-model-scope.js.map +1 -1
  391. package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -1
  392. package/dist/humain/web-access/vendor/summary-review.js.map +1 -1
  393. package/dist/humain/web-access/vendor/tavily.d.ts.map +1 -1
  394. package/dist/humain/web-access/vendor/tavily.js.map +1 -1
  395. package/dist/humain/web-access/vendor/tinyfish.d.ts.map +1 -1
  396. package/dist/humain/web-access/vendor/tinyfish.js.map +1 -1
  397. package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
  398. package/dist/humain/web-access/vendor/utils.js.map +1 -1
  399. package/dist/humain/web-access/vendor/valyu.d.ts.map +1 -1
  400. package/dist/humain/web-access/vendor/valyu.js.map +1 -1
  401. package/dist/humain/web-access/vendor/video-extract.d.ts.map +1 -1
  402. package/dist/humain/web-access/vendor/video-extract.js.map +1 -1
  403. package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -1
  404. package/dist/humain/web-access/vendor/xai-search.js.map +1 -1
  405. package/dist/humain/web-access/vendor/youtube-extract.d.ts.map +1 -1
  406. package/dist/humain/web-access/vendor/youtube-extract.js.map +1 -1
  407. package/dist/index.d.ts +1 -1
  408. package/dist/index.d.ts.map +1 -1
  409. package/dist/index.js.map +1 -1
  410. package/dist/main.d.ts.map +1 -1
  411. package/dist/main.js +4 -0
  412. package/dist/main.js.map +1 -1
  413. package/dist/migrations.d.ts.map +1 -1
  414. package/dist/migrations.js.map +1 -1
  415. package/dist/modes/agent-exec-mode.d.ts.map +1 -1
  416. package/dist/modes/agent-exec-mode.js.map +1 -1
  417. package/dist/modes/index.d.ts.map +1 -1
  418. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  419. package/dist/modes/interactive/components/armin.js +6 -10
  420. package/dist/modes/interactive/components/armin.js.map +1 -1
  421. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  422. package/dist/modes/interactive/components/assistant-message.js +2 -9
  423. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  424. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  425. package/dist/modes/interactive/components/bash-execution.js +4 -9
  426. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  427. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  428. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  429. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  430. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  431. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  432. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  433. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  434. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  435. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  436. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  437. package/dist/modes/interactive/components/config-selector.js +5 -22
  438. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  439. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  440. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  441. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  442. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  443. package/dist/modes/interactive/components/custom-editor.js +1 -8
  444. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  445. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  446. package/dist/modes/interactive/components/custom-entry.js +1 -4
  447. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  448. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  449. package/dist/modes/interactive/components/custom-message.js +1 -7
  450. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  451. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  452. package/dist/modes/interactive/components/daxnuts.js +6 -8
  453. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  454. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  455. package/dist/modes/interactive/components/diff.js +2 -2
  456. package/dist/modes/interactive/components/diff.js.map +1 -1
  457. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  458. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  459. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  460. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  461. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  462. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  463. package/dist/modes/interactive/components/extension-editor.js +1 -7
  464. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  465. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  466. package/dist/modes/interactive/components/extension-input.js +2 -8
  467. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  468. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  469. package/dist/modes/interactive/components/extension-selector.js +1 -9
  470. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  471. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  472. package/dist/modes/interactive/components/first-time-setup.js +2 -4
  473. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  474. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  475. package/dist/modes/interactive/components/footer.js +1 -3
  476. package/dist/modes/interactive/components/footer.js.map +1 -1
  477. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  478. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  479. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  480. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  481. package/dist/modes/interactive/components/login-dialog.js +3 -9
  482. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  483. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  484. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  485. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  486. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  487. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  488. package/dist/modes/interactive/components/model-selector.js +14 -26
  489. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  490. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  491. package/dist/modes/interactive/components/oauth-selector.js +3 -11
  492. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  493. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  494. package/dist/modes/interactive/components/scoped-models-selector.js +9 -14
  495. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  496. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  497. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  498. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  499. package/dist/modes/interactive/components/session-selector.js +33 -57
  500. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  501. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  502. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  503. package/dist/modes/interactive/components/settings-selector.js +10 -14
  504. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  505. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  506. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  507. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  508. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  509. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  510. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  511. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  512. package/dist/modes/interactive/components/status-indicator.js +0 -2
  513. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  514. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  515. package/dist/modes/interactive/components/theme-selector.js +0 -2
  516. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  517. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  518. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  519. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  520. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  521. package/dist/modes/interactive/components/tool-execution.js +19 -25
  522. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  523. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  524. package/dist/modes/interactive/components/tree-selector.js +18 -34
  525. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  526. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  527. package/dist/modes/interactive/components/trust-selector.js +0 -6
  528. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  529. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  530. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  531. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  532. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  533. package/dist/modes/interactive/components/user-message.js +0 -4
  534. package/dist/modes/interactive/components/user-message.js.map +1 -1
  535. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  536. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  537. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  538. package/dist/modes/interactive/external-editor.js.map +1 -1
  539. package/dist/modes/interactive/interactive-mode.d.ts +18 -2
  540. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  541. package/dist/modes/interactive/interactive-mode.js +147 -137
  542. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  543. package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
  544. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  545. package/dist/modes/interactive/model-catalog-refresh.js +36 -0
  546. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  547. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  548. package/dist/modes/interactive/model-search.js.map +1 -1
  549. package/dist/modes/interactive/theme/dark.json +2 -0
  550. package/dist/modes/interactive/theme/light.json +2 -0
  551. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  552. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  553. package/dist/modes/interactive/theme/theme-controller.js +25 -18
  554. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  555. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  556. package/dist/modes/interactive/theme/theme.d.ts +7 -5
  557. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  558. package/dist/modes/interactive/theme/theme.js +12 -8
  559. package/dist/modes/interactive/theme/theme.js.map +1 -1
  560. package/dist/modes/json-event.d.ts +4 -1
  561. package/dist/modes/json-event.d.ts.map +1 -1
  562. package/dist/modes/json-event.js +5 -2
  563. package/dist/modes/json-event.js.map +1 -1
  564. package/dist/modes/print-mode.d.ts.map +1 -1
  565. package/dist/modes/print-mode.js.map +1 -1
  566. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  567. package/dist/modes/rpc/jsonl.js.map +1 -1
  568. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  569. package/dist/modes/rpc/rpc-client.js +9 -10
  570. package/dist/modes/rpc/rpc-client.js.map +1 -1
  571. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  572. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  573. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  574. package/dist/package-manager-cli.d.ts.map +1 -1
  575. package/dist/package-manager-cli.js.map +1 -1
  576. package/dist/rpc-entry.d.ts.map +1 -1
  577. package/dist/rpc-entry.js.map +1 -1
  578. package/dist/server/create-harness.d.ts.map +1 -1
  579. package/dist/server/create-harness.js +2 -0
  580. package/dist/server/create-harness.js.map +1 -1
  581. package/dist/utils/abort.d.ts.map +1 -1
  582. package/dist/utils/abort.js.map +1 -1
  583. package/dist/utils/ansi.d.ts.map +1 -1
  584. package/dist/utils/ansi.js.map +1 -1
  585. package/dist/utils/changelog.d.ts.map +1 -1
  586. package/dist/utils/changelog.js.map +1 -1
  587. package/dist/utils/child-process.d.ts.map +1 -1
  588. package/dist/utils/child-process.js.map +1 -1
  589. package/dist/utils/clipboard-image.d.ts.map +1 -1
  590. package/dist/utils/clipboard-image.js +1 -1
  591. package/dist/utils/clipboard-image.js.map +1 -1
  592. package/dist/utils/clipboard-native.d.ts.map +1 -1
  593. package/dist/utils/clipboard-native.js.map +1 -1
  594. package/dist/utils/clipboard.d.ts.map +1 -1
  595. package/dist/utils/clipboard.js.map +1 -1
  596. package/dist/utils/deprecation.d.ts.map +1 -1
  597. package/dist/utils/deprecation.js.map +1 -1
  598. package/dist/utils/exif-orientation.d.ts.map +1 -1
  599. package/dist/utils/exif-orientation.js.map +1 -1
  600. package/dist/utils/frontmatter.d.ts.map +1 -1
  601. package/dist/utils/frontmatter.js.map +1 -1
  602. package/dist/utils/fs-watch.d.ts.map +1 -1
  603. package/dist/utils/fs-watch.js.map +1 -1
  604. package/dist/utils/git.d.ts.map +1 -1
  605. package/dist/utils/git.js.map +1 -1
  606. package/dist/utils/html.d.ts.map +1 -1
  607. package/dist/utils/html.js.map +1 -1
  608. package/dist/utils/image-convert.d.ts.map +1 -1
  609. package/dist/utils/image-convert.js.map +1 -1
  610. package/dist/utils/image-process.d.ts.map +1 -1
  611. package/dist/utils/image-process.js.map +1 -1
  612. package/dist/utils/image-resize-core.d.ts.map +1 -1
  613. package/dist/utils/image-resize-core.js.map +1 -1
  614. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  615. package/dist/utils/image-resize-worker.js.map +1 -1
  616. package/dist/utils/image-resize.d.ts.map +1 -1
  617. package/dist/utils/image-resize.js.map +1 -1
  618. package/dist/utils/json.d.ts.map +1 -1
  619. package/dist/utils/json.js.map +1 -1
  620. package/dist/utils/management-http.d.ts.map +1 -1
  621. package/dist/utils/management-http.js.map +1 -1
  622. package/dist/utils/mime.d.ts.map +1 -1
  623. package/dist/utils/mime.js.map +1 -1
  624. package/dist/utils/open-browser.d.ts.map +1 -1
  625. package/dist/utils/open-browser.js.map +1 -1
  626. package/dist/utils/paths.d.ts.map +1 -1
  627. package/dist/utils/paths.js.map +1 -1
  628. package/dist/utils/photon.d.ts.map +1 -1
  629. package/dist/utils/photon.js.map +1 -1
  630. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  631. package/dist/utils/pi-user-agent.js.map +1 -1
  632. package/dist/utils/shell.d.ts.map +1 -1
  633. package/dist/utils/shell.js.map +1 -1
  634. package/dist/utils/sleep.d.ts.map +1 -1
  635. package/dist/utils/sleep.js.map +1 -1
  636. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  637. package/dist/utils/syntax-highlight.js +1 -1
  638. package/dist/utils/syntax-highlight.js.map +1 -1
  639. package/dist/utils/tool-result-images.d.ts.map +1 -1
  640. package/dist/utils/tool-result-images.js.map +1 -1
  641. package/dist/utils/tools-manager.d.ts +10 -1
  642. package/dist/utils/tools-manager.d.ts.map +1 -1
  643. package/dist/utils/tools-manager.js +14 -19
  644. package/dist/utils/tools-manager.js.map +1 -1
  645. package/dist/utils/version-check.d.ts.map +1 -1
  646. package/dist/utils/version-check.js.map +1 -1
  647. package/dist/utils/windows-self-update.d.ts.map +1 -1
  648. package/dist/utils/windows-self-update.js.map +1 -1
  649. package/docs/compaction.md +3 -3
  650. package/docs/custom-provider.md +1 -1
  651. package/docs/environment-variables.md +1 -0
  652. package/docs/extensions.md +4 -0
  653. package/docs/json.md +6 -4
  654. package/docs/keybindings.md +8 -2
  655. package/docs/rpc.md +15 -4
  656. package/docs/sdk.md +9 -0
  657. package/docs/settings.md +31 -0
  658. package/docs/terminal-setup.md +23 -2
  659. package/docs/themes.md +23 -3
  660. package/docs/tui.md +2 -2
  661. package/docs/usage.md +3 -2
  662. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  663. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  664. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  665. package/examples/extensions/gondolin/package-lock.json +2 -2
  666. package/examples/extensions/gondolin/package.json +1 -1
  667. package/examples/extensions/minimal-mode.ts +6 -6
  668. package/examples/extensions/sandbox/package-lock.json +2 -2
  669. package/examples/extensions/sandbox/package.json +2 -2
  670. package/examples/extensions/with-deps/package-lock.json +2 -2
  671. package/examples/extensions/with-deps/package.json +1 -1
  672. package/npm-shrinkwrap.json +853 -661
  673. package/package.json +33 -33
  674. package/src/humain/web-access/UPSTREAM.md +1 -1
  675. package/src/humain/web-access/upstream.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, constants, fchmodSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, type Stats, unlinkSync, writeFileSync } from \"node:fs\";\nimport { randomBytes } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\nimport { getWebSearchConfigDir } from \"./utils.ts\";\n\nconst CACHE_TTL_MS = 60 * 60 * 1000;\nconst FETCH_CACHE_DIR = \"web-search-cache\";\nconst FETCH_CACHE_VERSION = 1;\nconst CACHE_KEY_PATTERN = /^[A-Za-z0-9_-]+\\.json$/;\nconst CACHE_TMP_PATTERN = /^[A-Za-z0-9_-]+\\.json\\.\\d+\\.\\d+(?:\\.[a-f0-9]{32})?\\.tmp$/;\nconst CACHE_ID_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst MAX_METADATA_TEXT = 8192;\nconst DEFAULT_CACHE_LIMITS = { maxEntries: 128, maxBytes: 128 * 1024 * 1024 };\nconst O_DIRECTORY = process.platform === \"win32\" ? 0 : (constants.O_DIRECTORY ?? 0);\nconst O_NOFOLLOW = process.platform === \"win32\" ? 0 : (constants.O_NOFOLLOW ?? 0);\n\ninterface FetchCacheLimits {\n\tmaxEntries: number;\n\tmaxBytes: number;\n}\n\ninterface CacheFile {\n\tname: string;\n\tsize: number;\n\tmtimeMs: number;\n\tdev: number;\n\tino: number;\n}\n\nexport interface QueryResultData {\n\tquery: string;\n\tanswer: string;\n\tresults: SearchResult[];\n\terror: string | null;\n\tprovider?: string;\n}\n\ninterface FetchCacheRef {\n\tversion: typeof FETCH_CACHE_VERSION;\n\tkey: string;\n\tstoredAt: number;\n}\n\ninterface StoredFetchUrlMetadata {\n\turl: string;\n\ttitle: string;\n\terror: string | null;\n\tcontentLength: number;\n\tmimeType?: string;\n\tstatus?: number;\n\tduration?: number;\n}\n\nexport interface StoredSearchData {\n\tid: string;\n\ttype: \"search\" | \"fetch\" | \"research\";\n\ttimestamp: number;\n\tqueries?: QueryResultData[];\n\turls?: ExtractedContent[];\n\tartifact?: unknown;\n\tfetchCache?: FetchCacheRef;\n\turlMetadata?: StoredFetchUrlMetadata[];\n\tfetchCacheError?: string;\n}\n\nconst storedResults = new Map<string, StoredSearchData>();\n\nexport function generateId(): string {\n\treturn Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nexport function getFetchCacheDir(): string {\n\treturn join(getWebSearchConfigDir(), FETCH_CACHE_DIR);\n}\n\nfunction fetchCachePath(key: string): string | null {\n\tif (!CACHE_KEY_PATTERN.test(key)) return null;\n\treturn join(getFetchCacheDir(), key);\n}\n\nfunction cacheKeyForId(id: string): string {\n\tif (!CACHE_ID_PATTERN.test(id)) {\n\t\tthrow new Error(`Invalid fetched content cache id: ${id}`);\n\t}\n\treturn `${id}.json`;\n}\n\nfunction truncateMetadataText(value: string | undefined): string {\n\tif (!value) return \"\";\n\treturn value.length > MAX_METADATA_TEXT ? `${value.slice(0, MAX_METADATA_TEXT)}...` : value;\n}\n\nfunction metadataForUrls(urls: ExtractedContent[]): StoredFetchUrlMetadata[] {\n\treturn urls.map((url) => ({\n\t\turl: truncateMetadataText(url.url),\n\t\ttitle: truncateMetadataText(url.title),\n\t\terror: url.error ? truncateMetadataText(url.error) : null,\n\t\tcontentLength: url.content.length,\n\t\t...(url.mimeType ? { mimeType: truncateMetadataText(url.mimeType) } : {}),\n\t\t...(typeof url.status === \"number\" ? { status: url.status } : {}),\n\t\t...(typeof url.duration === \"number\" ? { duration: url.duration } : {}),\n\t}));\n}\n\nfunction isFetchCacheRef(value: unknown): value is FetchCacheRef {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst ref = value as Record<string, unknown>;\n\treturn ref.version === FETCH_CACHE_VERSION &&\n\t\ttypeof ref.key === \"string\" && CACHE_KEY_PATTERN.test(ref.key) &&\n\t\ttypeof ref.storedAt === \"number\" && Number.isFinite(ref.storedAt);\n}\n\nfunction isStoredFetchUrlMetadata(value: unknown): value is StoredFetchUrlMetadata {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst meta = value as Record<string, unknown>;\n\treturn typeof meta.url === \"string\" &&\n\t\ttypeof meta.title === \"string\" &&\n\t\t(meta.error === null || typeof meta.error === \"string\") &&\n\t\ttypeof meta.contentLength === \"number\" && Number.isFinite(meta.contentLength) && meta.contentLength >= 0 &&\n\t\t(meta.mimeType === undefined || typeof meta.mimeType === \"string\") &&\n\t\t(meta.status === undefined || typeof meta.status === \"number\") &&\n\t\t(meta.duration === undefined || typeof meta.duration === \"number\");\n}\n\nfunction isInlineFetchedUrl(value: unknown): value is ExtractedContent {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst url = value as Record<string, unknown>;\n\treturn typeof url.url === \"string\" &&\n\t\ttypeof url.title === \"string\" &&\n\t\ttypeof url.content === \"string\" &&\n\t\t(url.error === null || typeof url.error === \"string\");\n}\n\nfunction isInlineFetchData(data: StoredSearchData): data is StoredSearchData & { urls: ExtractedContent[] } {\n\treturn data.type === \"fetch\" && Array.isArray(data.urls) && data.urls.every(isInlineFetchedUrl);\n}\n\nfunction cacheLimits(limits?: Partial<FetchCacheLimits>): FetchCacheLimits {\n\tconst resolved = {\n\t\tmaxEntries: limits?.maxEntries ?? DEFAULT_CACHE_LIMITS.maxEntries,\n\t\tmaxBytes: limits?.maxBytes ?? DEFAULT_CACHE_LIMITS.maxBytes,\n\t};\n\tif (!Number.isFinite(resolved.maxEntries) || !Number.isInteger(resolved.maxEntries) || resolved.maxEntries <= 0 ||\n\t\t!Number.isFinite(resolved.maxBytes) || !Number.isInteger(resolved.maxBytes) || resolved.maxBytes <= 0) {\n\t\tthrow new Error(\"Fetched content cache limits must be finite positive integers\");\n\t}\n\treturn resolved;\n}\n\nfunction enforceDirectoryMode(fd: number): void {\n\ttry {\n\t\tfchmodSync(fd, 0o700);\n\t} catch (err) {\n\t\tif (process.platform !== \"win32\") throw err;\n\t}\n}\n\nfunction enforceFileMode(fd: number): void {\n\ttry {\n\t\tfchmodSync(fd, 0o600);\n\t} catch (err) {\n\t\tif (process.platform !== \"win32\") throw err;\n\t}\n}\n\nfunction safeFetchCacheDir(create: true): string;\nfunction safeFetchCacheDir(create: false): string | null;\nfunction safeFetchCacheDir(create: boolean): string | null {\n\tconst dir = getFetchCacheDir();\n\tif (create) mkdirSync(dir, { recursive: true, mode: 0o700 });\n\tlet before: Stats;\n\ttry {\n\t\tbefore = lstatSync(dir);\n\t} catch (err) {\n\t\tif (!create && (err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow err;\n\t}\n\tif (before.isSymbolicLink() || !before.isDirectory()) {\n\t\tthrow new Error(\"Fetched content cache path is not a safe directory\");\n\t}\n\tif (process.platform === \"win32\") {\n\t\tconst after = lstatSync(dir);\n\t\tif (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while securing it\");\n\t\t}\n\t\treturn dir;\n\t}\n\tlet fd: number | null = null;\n\ttry {\n\t\tfd = openSync(dir, constants.O_RDONLY | O_DIRECTORY | O_NOFOLLOW);\n\t\tconst opened = fstatSync(fd);\n\t\tif (!opened.isDirectory() || opened.dev !== before.dev || opened.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while opening\");\n\t\t}\n\t\tenforceDirectoryMode(fd);\n\t\tcloseSync(fd);\n\t\tfd = null;\n\t\tconst after = lstatSync(dir);\n\t\tif (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while securing it\");\n\t\t}\n\t\treturn dir;\n\t} finally {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t}\n}\n\nfunction openRegularFile(path: string): { fd: number; info: Stats } {\n\tconst before = lstatSync(path);\n\tif (before.isSymbolicLink() || !before.isFile()) throw new Error(\"Fetched content cache entry is not a regular file\");\n\tconst fd = openSync(path, constants.O_RDONLY | O_NOFOLLOW);\n\ttry {\n\t\tconst info = fstatSync(fd);\n\t\tif (!info.isFile() || info.dev !== before.dev || info.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache entry changed while opening\");\n\t\t}\n\t\treturn { fd, info };\n\t} catch (err) {\n\t\tcloseSync(fd);\n\t\tthrow err;\n\t}\n}\n\ntype CacheUnlinkResult = \"removed\" | \"missing\" | \"changed\" | \"error\";\n\nfunction unlinkCacheFile(dir: string, file: CacheFile): CacheUnlinkResult {\n\ttry {\n\t\tconst root = lstatSync(dir);\n\t\tif (root.isSymbolicLink() || !root.isDirectory()) return \"changed\";\n\t\tconst path = join(dir, file.name);\n\t\tlet current: Stats;\n\t\ttry {\n\t\t\tcurrent = lstatSync(path);\n\t\t} catch (err) {\n\t\t\treturn (err as NodeJS.ErrnoException).code === \"ENOENT\" ? \"missing\" : \"error\";\n\t\t}\n\t\tif (current.isSymbolicLink() || !current.isFile() || current.dev !== file.dev || current.ino !== file.ino) return \"changed\";\n\t\ttry {\n\t\t\tunlinkSync(path);\n\t\t\treturn \"removed\";\n\t\t} catch (err) {\n\t\t\treturn (err as NodeJS.ErrnoException).code === \"ENOENT\" ? \"missing\" : \"error\";\n\t\t}\n\t} catch {\n\t\treturn \"error\";\n\t}\n}\n\nfunction pruneFetchCache(now: number, limits: FetchCacheLimits, preferredKey?: string, reservation?: { key: string; bytes: number }): boolean {\n\tlet dir: string | null;\n\ttry {\n\t\tdir = safeFetchCacheDir(false);\n\t} catch {\n\t\treturn false;\n\t}\n\tif (!dir) return true;\n\n\tlet entries: string[];\n\ttry {\n\t\tentries = readdirSync(dir);\n\t} catch {\n\t\treturn false;\n\t}\n\n\tconst files: CacheFile[] = [];\n\tfor (const entry of entries) {\n\t\tif (!CACHE_KEY_PATTERN.test(entry) && !CACHE_TMP_PATTERN.test(entry)) continue;\n\t\tconst path = join(dir, entry);\n\t\tlet opened: ReturnType<typeof openRegularFile>;\n\t\ttry {\n\t\t\topened = openRegularFile(path);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tenforceFileMode(opened.fd);\n\t\t} catch {\n\t\t\tcloseSync(opened.fd);\n\t\t\tcontinue;\n\t\t}\n\t\tcloseSync(opened.fd);\n\t\tconst file = { name: entry, size: opened.info.size, mtimeMs: opened.info.mtimeMs, dev: opened.info.dev, ino: opened.info.ino };\n\t\tif (now - file.mtimeMs >= CACHE_TTL_MS) {\n\t\t\tconst removed = unlinkCacheFile(dir, file);\n\t\t\tif (removed !== \"removed\" && removed !== \"missing\") return false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (CACHE_KEY_PATTERN.test(entry)) files.push(file);\n\t}\n\n\tfiles.sort((a, b) => a.mtimeMs - b.mtimeMs || a.name.localeCompare(b.name));\n\tconst projectedUsage = () => {\n\t\tconst replaced = reservation ? files.find((file) => file.name === reservation.key) : undefined;\n\t\treturn {\n\t\t\tentries: files.length + (reservation && !replaced ? 1 : 0),\n\t\t\tbytes: files.reduce((total, file) => total + file.size, 0) + (reservation ? reservation.bytes - (replaced?.size ?? 0) : 0),\n\t\t};\n\t};\n\tconst attempted = new Set<string>();\n\tlet usage = projectedUsage();\n\twhile (usage.entries > limits.maxEntries || usage.bytes > limits.maxBytes) {\n\t\tconst index = files.findIndex((file) => file.name !== preferredKey && !attempted.has(file.name));\n\t\tif (index < 0) break;\n\t\tconst file = files[index];\n\t\tattempted.add(file.name);\n\t\tconst removed = unlinkCacheFile(dir, file);\n\t\tif (removed === \"removed\" || removed === \"missing\") files.splice(index, 1);\n\t\tusage = projectedUsage();\n\t}\n\treturn usage.entries <= limits.maxEntries && usage.bytes <= limits.maxBytes;\n}\n\nfunction writeFetchCache(data: StoredSearchData & { urls: ExtractedContent[] }): FetchCacheRef {\n\tconst limits = DEFAULT_CACHE_LIMITS;\n\tconst serialized = JSON.stringify(data);\n\tconst size = Buffer.byteLength(serialized);\n\tif (size > limits.maxBytes) throw new Error(`Fetched content cache entry exceeds ${limits.maxBytes} bytes`);\n\n\tconst dir = safeFetchCacheDir(true);\n\tconst key = cacheKeyForId(data.id);\n\tif (!pruneFetchCache(Date.now(), limits, key, { key, bytes: size })) {\n\t\tthrow new Error(\"Fetched content cache could not reserve space for a new entry\");\n\t}\n\tconst finalPath = join(dir, key);\n\tconst tmpName = `${key}.${process.pid}.${Date.now()}.${randomBytes(16).toString(\"hex\")}.tmp`;\n\tconst tmpPath = join(dir, tmpName);\n\tlet fd: number | null = null;\n\tlet tmpFile: CacheFile | null = null;\n\tlet renamed = false;\n\ttry {\n\t\tfd = openSync(tmpPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | O_NOFOLLOW, 0o600);\n\t\tconst tmpInfo = fstatSync(fd);\n\t\ttmpFile = { name: tmpName, size: tmpInfo.size, mtimeMs: tmpInfo.mtimeMs, dev: tmpInfo.dev, ino: tmpInfo.ino };\n\t\tenforceFileMode(fd);\n\t\twriteFileSync(fd, serialized, \"utf8\");\n\t\tfsyncSync(fd);\n\t\tcloseSync(fd);\n\t\tfd = null;\n\t\tsafeFetchCacheDir(false);\n\t\trenameSync(tmpPath, finalPath);\n\t\trenamed = true;\n\t\tconst written = lstatSync(finalPath);\n\t\tif (!written.isFile() || written.dev !== tmpFile.dev || written.ino !== tmpFile.ino) {\n\t\t\tthrow new Error(\"Fetched content cache entry changed after writing\");\n\t\t}\n\t\tif (!pruneFetchCache(Date.now(), limits, key)) {\n\t\t\tthrow new Error(\"Fetched content cache could not meet its limits after writing\");\n\t\t}\n\t} catch (err) {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t\tif (tmpFile) unlinkCacheFile(dir, { ...tmpFile, name: renamed ? key : tmpName });\n\t\tthrow err;\n\t}\n\treturn { version: FETCH_CACHE_VERSION, key, storedAt: Date.now() };\n}\n\nfunction cacheWriteError(err: unknown): string {\n\tconst message = err instanceof Error ? err.message : String(err);\n\treturn `Failed to write fetched content cache: ${message}`;\n}\n\nfunction createFetchSessionData(data: StoredSearchData & { urls: ExtractedContent[] }, ref: FetchCacheRef | null, cacheError?: string): StoredSearchData {\n\treturn {\n\t\tid: data.id,\n\t\ttype: \"fetch\",\n\t\ttimestamp: data.timestamp,\n\t\turlMetadata: metadataForUrls(data.urls),\n\t\t...(ref ? { fetchCache: ref } : {}),\n\t\t...(cacheError ? { fetchCacheError: truncateMetadataText(cacheError) } : {}),\n\t};\n}\n\nfunction fetchUrlMetadata(data: StoredSearchData): StoredFetchUrlMetadata[] {\n\tif (data.urlMetadata) return data.urlMetadata;\n\treturn isInlineFetchData(data) ? metadataForUrls(data.urls) : [];\n}\n\nfunction unavailableFetchData(data: StoredSearchData, reason: string): StoredSearchData {\n\treturn {\n\t\t...data,\n\t\turls: fetchUrlMetadata(data).map((meta) => ({\n\t\t\turl: meta.url,\n\t\t\ttitle: meta.title,\n\t\t\tcontent: \"\",\n\t\t\terror: reason,\n\t\t\t...(meta.mimeType ? { mimeType: meta.mimeType } : {}),\n\t\t\t...(typeof meta.status === \"number\" ? { status: meta.status } : {}),\n\t\t\t...(typeof meta.duration === \"number\" ? { duration: meta.duration } : {}),\n\t\t})),\n\t};\n}\n\nfunction readCachedFetchData(data: StoredSearchData, now = Date.now()): StoredSearchData {\n\tif (data.type !== \"fetch\") return data;\n\tif (now - data.timestamp >= CACHE_TTL_MS) {\n\t\treturn unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t}\n\tif (isInlineFetchData(data)) return data;\n\tif (!data.fetchCache) {\n\t\treturn unavailableFetchData(data, data.fetchCacheError ?? \"Cached fetched content is unavailable\");\n\t}\n\tconst path = fetchCachePath(data.fetchCache.key);\n\tif (!path) return unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\tlet fd: number | null = null;\n\ttry {\n\t\tif (!safeFetchCacheDir(false)) return unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t\tconst opened = openRegularFile(path);\n\t\tfd = opened.fd;\n\t\tenforceFileMode(fd);\n\t\tconst parsed: unknown = JSON.parse(readFileSync(fd, \"utf8\"));\n\t\tif (!isValidStoredData(parsed) || parsed.type !== \"fetch\" || parsed.id !== data.id || !isInlineFetchData(parsed)) {\n\t\t\treturn unavailableFetchData(data, \"Cached fetched content is invalid\");\n\t\t}\n\t\treturn { ...parsed, fetchCache: data.fetchCache, urlMetadata: data.urlMetadata };\n\t} catch (err) {\n\t\tif ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\treturn unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t\t}\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn unavailableFetchData(data, `Cached fetched content could not be read: ${message}`);\n\t} finally {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t}\n}\n\nexport function pruneExpiredFetchCache(now = Date.now(), requestedLimits?: Partial<FetchCacheLimits>): void {\n\tconst limits = cacheLimits(requestedLimits);\n\ttry { pruneFetchCache(now, limits); } catch {}\n}\n\nexport function storeResult(id: string, data: StoredSearchData): void {\n\tstoredResults.set(id, data);\n}\n\nexport function storeFetchedContentResult(id: string, data: StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] }): StoredSearchData {\n\tlet ref: FetchCacheRef | null = null;\n\tlet cacheError: string | undefined;\n\ttry {\n\t\tref = writeFetchCache(data);\n\t} catch (err) {\n\t\tcacheError = cacheWriteError(err);\n\t}\n\tstoredResults.set(id, ref ? { ...data, fetchCache: ref, urlMetadata: metadataForUrls(data.urls) } : { ...data, fetchCacheError: cacheError });\n\treturn createFetchSessionData(data, ref, cacheError);\n}\n\nexport function getResult(id: string): StoredSearchData | null {\n\tconst data = storedResults.get(id);\n\tif (!data) return null;\n\tconst loaded = readCachedFetchData(data);\n\tif (loaded !== data) storedResults.set(id, loaded);\n\treturn loaded;\n}\n\nexport function getAllResults(): StoredSearchData[] {\n\treturn Array.from(storedResults.values());\n}\n\nexport function deleteResult(id: string): boolean {\n\tconst data = storedResults.get(id);\n\tif (data?.fetchCache) {\n\t\ttry {\n\t\t\tconst dir = safeFetchCacheDir(false);\n\t\t\tconst path = fetchCachePath(data.fetchCache.key);\n\t\t\tif (dir && path) {\n\t\t\t\tconst info = lstatSync(path);\n\t\t\t\tif (!info.isSymbolicLink() && info.isFile()) {\n\t\t\t\t\tunlinkCacheFile(dir, { name: data.fetchCache.key, size: info.size, mtimeMs: info.mtimeMs, dev: info.dev, ino: info.ino });\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t}\n\treturn storedResults.delete(id);\n}\n\nexport function clearResults(): void {\n\tstoredResults.clear();\n}\n\nfunction isValidStoredData(data: unknown): data is StoredSearchData {\n\tif (!data || typeof data !== \"object\") return false;\n\tconst d = data as Record<string, unknown>;\n\tif (typeof d.id !== \"string\" || !d.id) return false;\n\tif (d.type !== \"search\" && d.type !== \"fetch\" && d.type !== \"research\") return false;\n\tif (typeof d.timestamp !== \"number\") return false;\n\tif (d.type === \"search\" && !Array.isArray(d.queries)) return false;\n\tif (d.type === \"fetch\") {\n\t\tif (Array.isArray(d.urls)) return d.urls.every(isInlineFetchedUrl);\n\t\tif (!Array.isArray(d.urlMetadata) || !d.urlMetadata.every(isStoredFetchUrlMetadata)) return false;\n\t\treturn d.fetchCache === undefined ? d.fetchCacheError === undefined || typeof d.fetchCacheError === \"string\" : isFetchCacheRef(d.fetchCache);\n\t}\n\tif (d.type === \"research\" && (!d.artifact || typeof d.artifact !== \"object\")) return false;\n\treturn true;\n}\n\nexport function restoreFromSession(ctx: ExtensionContext): void {\n\tstoredResults.clear();\n\tconst now = Date.now();\n\tpruneExpiredFetchCache(now);\n\n\tfor (const entry of ctx.sessionManager.getBranch()) {\n\t\tif (entry.type === \"custom\" && entry.customType === \"web-search-results\") {\n\t\t\tconst data = entry.data;\n\t\t\tif (isValidStoredData(data) && now - data.timestamp < CACHE_TTL_MS) {\n\t\t\t\tstoredResults.set(data.id, data);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, constants, fchmodSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, type Stats, unlinkSync, writeFileSync } from \"node:fs\";\nimport { randomBytes } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\nimport { getWebSearchConfigDir } from \"./utils.ts\";\n\nconst CACHE_TTL_MS = 60 * 60 * 1000;\nconst FETCH_CACHE_DIR = \"web-search-cache\";\nconst FETCH_CACHE_VERSION = 1;\nconst CACHE_KEY_PATTERN = /^[A-Za-z0-9_-]+\\.json$/;\nconst CACHE_TMP_PATTERN = /^[A-Za-z0-9_-]+\\.json\\.\\d+\\.\\d+(?:\\.[a-f0-9]{32})?\\.tmp$/;\nconst CACHE_ID_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst MAX_METADATA_TEXT = 8192;\nconst DEFAULT_CACHE_LIMITS = { maxEntries: 128, maxBytes: 128 * 1024 * 1024 };\nconst O_DIRECTORY = process.platform === \"win32\" ? 0 : (constants.O_DIRECTORY ?? 0);\nconst O_NOFOLLOW = process.platform === \"win32\" ? 0 : (constants.O_NOFOLLOW ?? 0);\n\ninterface FetchCacheLimits {\n\tmaxEntries: number;\n\tmaxBytes: number;\n}\n\ninterface CacheFile {\n\tname: string;\n\tsize: number;\n\tmtimeMs: number;\n\tdev: number;\n\tino: number;\n}\n\nexport interface QueryResultData {\n\tquery: string;\n\tanswer: string;\n\tresults: SearchResult[];\n\terror: string | null;\n\tprovider?: string;\n}\n\ninterface FetchCacheRef {\n\tversion: typeof FETCH_CACHE_VERSION;\n\tkey: string;\n\tstoredAt: number;\n}\n\ninterface StoredFetchUrlMetadata {\n\turl: string;\n\ttitle: string;\n\terror: string | null;\n\tcontentLength: number;\n\tmimeType?: string;\n\tstatus?: number;\n\tduration?: number;\n}\n\nexport interface StoredSearchData {\n\tid: string;\n\ttype: \"search\" | \"fetch\" | \"research\";\n\ttimestamp: number;\n\tqueries?: QueryResultData[];\n\turls?: ExtractedContent[];\n\tartifact?: unknown;\n\tfetchCache?: FetchCacheRef;\n\turlMetadata?: StoredFetchUrlMetadata[];\n\tfetchCacheError?: string;\n}\n\nconst storedResults = new Map<string, StoredSearchData>();\n\nexport function generateId(): string {\n\treturn Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nexport function getFetchCacheDir(): string {\n\treturn join(getWebSearchConfigDir(), FETCH_CACHE_DIR);\n}\n\nfunction fetchCachePath(key: string): string | null {\n\tif (!CACHE_KEY_PATTERN.test(key)) return null;\n\treturn join(getFetchCacheDir(), key);\n}\n\nfunction cacheKeyForId(id: string): string {\n\tif (!CACHE_ID_PATTERN.test(id)) {\n\t\tthrow new Error(`Invalid fetched content cache id: ${id}`);\n\t}\n\treturn `${id}.json`;\n}\n\nfunction truncateMetadataText(value: string | undefined): string {\n\tif (!value) return \"\";\n\treturn value.length > MAX_METADATA_TEXT ? `${value.slice(0, MAX_METADATA_TEXT)}...` : value;\n}\n\nfunction metadataForUrls(urls: ExtractedContent[]): StoredFetchUrlMetadata[] {\n\treturn urls.map((url) => ({\n\t\turl: truncateMetadataText(url.url),\n\t\ttitle: truncateMetadataText(url.title),\n\t\terror: url.error ? truncateMetadataText(url.error) : null,\n\t\tcontentLength: url.content.length,\n\t\t...(url.mimeType ? { mimeType: truncateMetadataText(url.mimeType) } : {}),\n\t\t...(typeof url.status === \"number\" ? { status: url.status } : {}),\n\t\t...(typeof url.duration === \"number\" ? { duration: url.duration } : {}),\n\t}));\n}\n\nfunction isFetchCacheRef(value: unknown): value is FetchCacheRef {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst ref = value as Record<string, unknown>;\n\treturn ref.version === FETCH_CACHE_VERSION &&\n\t\ttypeof ref.key === \"string\" && CACHE_KEY_PATTERN.test(ref.key) &&\n\t\ttypeof ref.storedAt === \"number\" && Number.isFinite(ref.storedAt);\n}\n\nfunction isStoredFetchUrlMetadata(value: unknown): value is StoredFetchUrlMetadata {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst meta = value as Record<string, unknown>;\n\treturn typeof meta.url === \"string\" &&\n\t\ttypeof meta.title === \"string\" &&\n\t\t(meta.error === null || typeof meta.error === \"string\") &&\n\t\ttypeof meta.contentLength === \"number\" && Number.isFinite(meta.contentLength) && meta.contentLength >= 0 &&\n\t\t(meta.mimeType === undefined || typeof meta.mimeType === \"string\") &&\n\t\t(meta.status === undefined || typeof meta.status === \"number\") &&\n\t\t(meta.duration === undefined || typeof meta.duration === \"number\");\n}\n\nfunction isInlineFetchedUrl(value: unknown): value is ExtractedContent {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst url = value as Record<string, unknown>;\n\treturn typeof url.url === \"string\" &&\n\t\ttypeof url.title === \"string\" &&\n\t\ttypeof url.content === \"string\" &&\n\t\t(url.error === null || typeof url.error === \"string\");\n}\n\nfunction isInlineFetchData(data: StoredSearchData): data is StoredSearchData & { urls: ExtractedContent[] } {\n\treturn data.type === \"fetch\" && Array.isArray(data.urls) && data.urls.every(isInlineFetchedUrl);\n}\n\nfunction cacheLimits(limits?: Partial<FetchCacheLimits>): FetchCacheLimits {\n\tconst resolved = {\n\t\tmaxEntries: limits?.maxEntries ?? DEFAULT_CACHE_LIMITS.maxEntries,\n\t\tmaxBytes: limits?.maxBytes ?? DEFAULT_CACHE_LIMITS.maxBytes,\n\t};\n\tif (!Number.isFinite(resolved.maxEntries) || !Number.isInteger(resolved.maxEntries) || resolved.maxEntries <= 0 ||\n\t\t!Number.isFinite(resolved.maxBytes) || !Number.isInteger(resolved.maxBytes) || resolved.maxBytes <= 0) {\n\t\tthrow new Error(\"Fetched content cache limits must be finite positive integers\");\n\t}\n\treturn resolved;\n}\n\nfunction enforceDirectoryMode(fd: number): void {\n\ttry {\n\t\tfchmodSync(fd, 0o700);\n\t} catch (err) {\n\t\tif (process.platform !== \"win32\") throw err;\n\t}\n}\n\nfunction enforceFileMode(fd: number): void {\n\ttry {\n\t\tfchmodSync(fd, 0o600);\n\t} catch (err) {\n\t\tif (process.platform !== \"win32\") throw err;\n\t}\n}\n\nfunction safeFetchCacheDir(create: true): string;\nfunction safeFetchCacheDir(create: false): string | null;\nfunction safeFetchCacheDir(create: boolean): string | null {\n\tconst dir = getFetchCacheDir();\n\tif (create) mkdirSync(dir, { recursive: true, mode: 0o700 });\n\tlet before: Stats;\n\ttry {\n\t\tbefore = lstatSync(dir);\n\t} catch (err) {\n\t\tif (!create && (err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow err;\n\t}\n\tif (before.isSymbolicLink() || !before.isDirectory()) {\n\t\tthrow new Error(\"Fetched content cache path is not a safe directory\");\n\t}\n\tif (process.platform === \"win32\") {\n\t\tconst after = lstatSync(dir);\n\t\tif (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while securing it\");\n\t\t}\n\t\treturn dir;\n\t}\n\tlet fd: number | null = null;\n\ttry {\n\t\tfd = openSync(dir, constants.O_RDONLY | O_DIRECTORY | O_NOFOLLOW);\n\t\tconst opened = fstatSync(fd);\n\t\tif (!opened.isDirectory() || opened.dev !== before.dev || opened.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while opening\");\n\t\t}\n\t\tenforceDirectoryMode(fd);\n\t\tcloseSync(fd);\n\t\tfd = null;\n\t\tconst after = lstatSync(dir);\n\t\tif (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while securing it\");\n\t\t}\n\t\treturn dir;\n\t} finally {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t}\n}\n\nfunction openRegularFile(path: string): { fd: number; info: Stats } {\n\tconst before = lstatSync(path);\n\tif (before.isSymbolicLink() || !before.isFile()) throw new Error(\"Fetched content cache entry is not a regular file\");\n\tconst fd = openSync(path, constants.O_RDONLY | O_NOFOLLOW);\n\ttry {\n\t\tconst info = fstatSync(fd);\n\t\tif (!info.isFile() || info.dev !== before.dev || info.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache entry changed while opening\");\n\t\t}\n\t\treturn { fd, info };\n\t} catch (err) {\n\t\tcloseSync(fd);\n\t\tthrow err;\n\t}\n}\n\ntype CacheUnlinkResult = \"removed\" | \"missing\" | \"changed\" | \"error\";\n\nfunction unlinkCacheFile(dir: string, file: CacheFile): CacheUnlinkResult {\n\ttry {\n\t\tconst root = lstatSync(dir);\n\t\tif (root.isSymbolicLink() || !root.isDirectory()) return \"changed\";\n\t\tconst path = join(dir, file.name);\n\t\tlet current: Stats;\n\t\ttry {\n\t\t\tcurrent = lstatSync(path);\n\t\t} catch (err) {\n\t\t\treturn (err as NodeJS.ErrnoException).code === \"ENOENT\" ? \"missing\" : \"error\";\n\t\t}\n\t\tif (current.isSymbolicLink() || !current.isFile() || current.dev !== file.dev || current.ino !== file.ino) return \"changed\";\n\t\ttry {\n\t\t\tunlinkSync(path);\n\t\t\treturn \"removed\";\n\t\t} catch (err) {\n\t\t\treturn (err as NodeJS.ErrnoException).code === \"ENOENT\" ? \"missing\" : \"error\";\n\t\t}\n\t} catch {\n\t\treturn \"error\";\n\t}\n}\n\nfunction pruneFetchCache(now: number, limits: FetchCacheLimits, preferredKey?: string, reservation?: { key: string; bytes: number }): boolean {\n\tlet dir: string | null;\n\ttry {\n\t\tdir = safeFetchCacheDir(false);\n\t} catch {\n\t\treturn false;\n\t}\n\tif (!dir) return true;\n\n\tlet entries: string[];\n\ttry {\n\t\tentries = readdirSync(dir);\n\t} catch {\n\t\treturn false;\n\t}\n\n\tconst files: CacheFile[] = [];\n\tfor (const entry of entries) {\n\t\tif (!CACHE_KEY_PATTERN.test(entry) && !CACHE_TMP_PATTERN.test(entry)) continue;\n\t\tconst path = join(dir, entry);\n\t\tlet opened: ReturnType<typeof openRegularFile>;\n\t\ttry {\n\t\t\topened = openRegularFile(path);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tenforceFileMode(opened.fd);\n\t\t} catch {\n\t\t\tcloseSync(opened.fd);\n\t\t\tcontinue;\n\t\t}\n\t\tcloseSync(opened.fd);\n\t\tconst file = { name: entry, size: opened.info.size, mtimeMs: opened.info.mtimeMs, dev: opened.info.dev, ino: opened.info.ino };\n\t\tif (now - file.mtimeMs >= CACHE_TTL_MS) {\n\t\t\tconst removed = unlinkCacheFile(dir, file);\n\t\t\tif (removed !== \"removed\" && removed !== \"missing\") return false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (CACHE_KEY_PATTERN.test(entry)) files.push(file);\n\t}\n\n\tfiles.sort((a, b) => a.mtimeMs - b.mtimeMs || a.name.localeCompare(b.name));\n\tconst projectedUsage = () => {\n\t\tconst replaced = reservation ? files.find((file) => file.name === reservation.key) : undefined;\n\t\treturn {\n\t\t\tentries: files.length + (reservation && !replaced ? 1 : 0),\n\t\t\tbytes: files.reduce((total, file) => total + file.size, 0) + (reservation ? reservation.bytes - (replaced?.size ?? 0) : 0),\n\t\t};\n\t};\n\tconst attempted = new Set<string>();\n\tlet usage = projectedUsage();\n\twhile (usage.entries > limits.maxEntries || usage.bytes > limits.maxBytes) {\n\t\tconst index = files.findIndex((file) => file.name !== preferredKey && !attempted.has(file.name));\n\t\tif (index < 0) break;\n\t\tconst file = files[index];\n\t\tattempted.add(file.name);\n\t\tconst removed = unlinkCacheFile(dir, file);\n\t\tif (removed === \"removed\" || removed === \"missing\") files.splice(index, 1);\n\t\tusage = projectedUsage();\n\t}\n\treturn usage.entries <= limits.maxEntries && usage.bytes <= limits.maxBytes;\n}\n\nfunction writeFetchCache(data: StoredSearchData & { urls: ExtractedContent[] }): FetchCacheRef {\n\tconst limits = DEFAULT_CACHE_LIMITS;\n\tconst serialized = JSON.stringify(data);\n\tconst size = Buffer.byteLength(serialized);\n\tif (size > limits.maxBytes) throw new Error(`Fetched content cache entry exceeds ${limits.maxBytes} bytes`);\n\n\tconst dir = safeFetchCacheDir(true);\n\tconst key = cacheKeyForId(data.id);\n\tif (!pruneFetchCache(Date.now(), limits, key, { key, bytes: size })) {\n\t\tthrow new Error(\"Fetched content cache could not reserve space for a new entry\");\n\t}\n\tconst finalPath = join(dir, key);\n\tconst tmpName = `${key}.${process.pid}.${Date.now()}.${randomBytes(16).toString(\"hex\")}.tmp`;\n\tconst tmpPath = join(dir, tmpName);\n\tlet fd: number | null = null;\n\tlet tmpFile: CacheFile | null = null;\n\tlet renamed = false;\n\ttry {\n\t\tfd = openSync(tmpPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | O_NOFOLLOW, 0o600);\n\t\tconst tmpInfo = fstatSync(fd);\n\t\ttmpFile = { name: tmpName, size: tmpInfo.size, mtimeMs: tmpInfo.mtimeMs, dev: tmpInfo.dev, ino: tmpInfo.ino };\n\t\tenforceFileMode(fd);\n\t\twriteFileSync(fd, serialized, \"utf8\");\n\t\tfsyncSync(fd);\n\t\tcloseSync(fd);\n\t\tfd = null;\n\t\tsafeFetchCacheDir(false);\n\t\trenameSync(tmpPath, finalPath);\n\t\trenamed = true;\n\t\tconst written = lstatSync(finalPath);\n\t\tif (!written.isFile() || written.dev !== tmpFile.dev || written.ino !== tmpFile.ino) {\n\t\t\tthrow new Error(\"Fetched content cache entry changed after writing\");\n\t\t}\n\t\tif (!pruneFetchCache(Date.now(), limits, key)) {\n\t\t\tthrow new Error(\"Fetched content cache could not meet its limits after writing\");\n\t\t}\n\t} catch (err) {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t\tif (tmpFile) unlinkCacheFile(dir, { ...tmpFile, name: renamed ? key : tmpName });\n\t\tthrow err;\n\t}\n\treturn { version: FETCH_CACHE_VERSION, key, storedAt: Date.now() };\n}\n\nfunction cacheWriteError(err: unknown): string {\n\tconst message = err instanceof Error ? err.message : String(err);\n\treturn `Failed to write fetched content cache: ${message}`;\n}\n\nfunction createFetchSessionData(data: StoredSearchData & { urls: ExtractedContent[] }, ref: FetchCacheRef | null, cacheError?: string): StoredSearchData {\n\treturn {\n\t\tid: data.id,\n\t\ttype: \"fetch\",\n\t\ttimestamp: data.timestamp,\n\t\turlMetadata: metadataForUrls(data.urls),\n\t\t...(ref ? { fetchCache: ref } : {}),\n\t\t...(cacheError ? { fetchCacheError: truncateMetadataText(cacheError) } : {}),\n\t};\n}\n\nfunction fetchUrlMetadata(data: StoredSearchData): StoredFetchUrlMetadata[] {\n\tif (data.urlMetadata) return data.urlMetadata;\n\treturn isInlineFetchData(data) ? metadataForUrls(data.urls) : [];\n}\n\nfunction unavailableFetchData(data: StoredSearchData, reason: string): StoredSearchData {\n\treturn {\n\t\t...data,\n\t\turls: fetchUrlMetadata(data).map((meta) => ({\n\t\t\turl: meta.url,\n\t\t\ttitle: meta.title,\n\t\t\tcontent: \"\",\n\t\t\terror: reason,\n\t\t\t...(meta.mimeType ? { mimeType: meta.mimeType } : {}),\n\t\t\t...(typeof meta.status === \"number\" ? { status: meta.status } : {}),\n\t\t\t...(typeof meta.duration === \"number\" ? { duration: meta.duration } : {}),\n\t\t})),\n\t};\n}\n\nfunction readCachedFetchData(data: StoredSearchData, now = Date.now()): StoredSearchData {\n\tif (data.type !== \"fetch\") return data;\n\tif (now - data.timestamp >= CACHE_TTL_MS) {\n\t\treturn unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t}\n\tif (isInlineFetchData(data)) return data;\n\tif (!data.fetchCache) {\n\t\treturn unavailableFetchData(data, data.fetchCacheError ?? \"Cached fetched content is unavailable\");\n\t}\n\tconst path = fetchCachePath(data.fetchCache.key);\n\tif (!path) return unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\tlet fd: number | null = null;\n\ttry {\n\t\tif (!safeFetchCacheDir(false)) return unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t\tconst opened = openRegularFile(path);\n\t\tfd = opened.fd;\n\t\tenforceFileMode(fd);\n\t\tconst parsed: unknown = JSON.parse(readFileSync(fd, \"utf8\"));\n\t\tif (!isValidStoredData(parsed) || parsed.type !== \"fetch\" || parsed.id !== data.id || !isInlineFetchData(parsed)) {\n\t\t\treturn unavailableFetchData(data, \"Cached fetched content is invalid\");\n\t\t}\n\t\treturn { ...parsed, fetchCache: data.fetchCache, urlMetadata: data.urlMetadata };\n\t} catch (err) {\n\t\tif ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\treturn unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t\t}\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn unavailableFetchData(data, `Cached fetched content could not be read: ${message}`);\n\t} finally {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t}\n}\n\nexport function pruneExpiredFetchCache(now = Date.now(), requestedLimits?: Partial<FetchCacheLimits>): void {\n\tconst limits = cacheLimits(requestedLimits);\n\ttry { pruneFetchCache(now, limits); } catch {}\n}\n\nexport function storeResult(id: string, data: StoredSearchData): void {\n\tstoredResults.set(id, data);\n}\n\nexport function storeFetchedContentResult(id: string, data: StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] }): StoredSearchData {\n\tlet ref: FetchCacheRef | null = null;\n\tlet cacheError: string | undefined;\n\ttry {\n\t\tref = writeFetchCache(data);\n\t} catch (err) {\n\t\tcacheError = cacheWriteError(err);\n\t}\n\tstoredResults.set(id, ref ? { ...data, fetchCache: ref, urlMetadata: metadataForUrls(data.urls) } : { ...data, fetchCacheError: cacheError });\n\treturn createFetchSessionData(data, ref, cacheError);\n}\n\nexport function getResult(id: string): StoredSearchData | null {\n\tconst data = storedResults.get(id);\n\tif (!data) return null;\n\tconst loaded = readCachedFetchData(data);\n\tif (loaded !== data) storedResults.set(id, loaded);\n\treturn loaded;\n}\n\nexport function getAllResults(): StoredSearchData[] {\n\treturn Array.from(storedResults.values());\n}\n\nexport function deleteResult(id: string): boolean {\n\tconst data = storedResults.get(id);\n\tif (data?.fetchCache) {\n\t\ttry {\n\t\t\tconst dir = safeFetchCacheDir(false);\n\t\t\tconst path = fetchCachePath(data.fetchCache.key);\n\t\t\tif (dir && path) {\n\t\t\t\tconst info = lstatSync(path);\n\t\t\t\tif (!info.isSymbolicLink() && info.isFile()) {\n\t\t\t\t\tunlinkCacheFile(dir, { name: data.fetchCache.key, size: info.size, mtimeMs: info.mtimeMs, dev: info.dev, ino: info.ino });\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t}\n\treturn storedResults.delete(id);\n}\n\nexport function clearResults(): void {\n\tstoredResults.clear();\n}\n\nfunction isValidStoredData(data: unknown): data is StoredSearchData {\n\tif (!data || typeof data !== \"object\") return false;\n\tconst d = data as Record<string, unknown>;\n\tif (typeof d.id !== \"string\" || !d.id) return false;\n\tif (d.type !== \"search\" && d.type !== \"fetch\" && d.type !== \"research\") return false;\n\tif (typeof d.timestamp !== \"number\") return false;\n\tif (d.type === \"search\" && !Array.isArray(d.queries)) return false;\n\tif (d.type === \"fetch\") {\n\t\tif (Array.isArray(d.urls)) return d.urls.every(isInlineFetchedUrl);\n\t\tif (!Array.isArray(d.urlMetadata) || !d.urlMetadata.every(isStoredFetchUrlMetadata)) return false;\n\t\treturn d.fetchCache === undefined ? d.fetchCacheError === undefined || typeof d.fetchCacheError === \"string\" : isFetchCacheRef(d.fetchCache);\n\t}\n\tif (d.type === \"research\" && (!d.artifact || typeof d.artifact !== \"object\")) return false;\n\treturn true;\n}\n\nexport function restoreFromSession(ctx: ExtensionContext): void {\n\tstoredResults.clear();\n\tconst now = Date.now();\n\tpruneExpiredFetchCache(now);\n\n\tfor (const entry of ctx.sessionManager.getBranch()) {\n\t\tif (entry.type === \"custom\" && entry.customType === \"web-search-results\") {\n\t\t\tconst data = entry.data;\n\t\t\tif (isValidStoredData(data) && now - data.timestamp < CACHE_TTL_MS) {\n\t\t\t\tstoredResults.set(data.id, data);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"summary-model-scope.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-model-scope.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAEnG,UAAU,wBAAwB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,IAAI,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACjE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAClD,YAAY,IAAI,SAAS,CAAC,EAAE,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,SAAS,EAC/D,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,GACR,CAAC,GAAG,SAAS,CAWf;AAaD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,EAAE,GAAG,IAAI,CAcvF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,oBAAoB,CAAA;CAAE,CAO1G;AAoBD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,CAehG","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../host.ts\";\n\nconst THINKING_LEVELS = new Set([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\n\nexport type SummaryThinkingLevel = \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ninterface SummaryModelScopeContext {\n\tcwd: string;\n\tisProjectTrusted(): boolean;\n}\n\nexport interface ModelLike {\n\tprovider: string;\n\tid: string;\n}\n\nexport interface ModelRegistryLike<T extends ModelLike = ModelLike> {\n\tfind(provider: string, id: string): T | undefined;\n\tgetAvailable(): readonly T[];\n}\n\n/**\n * Resolve a model through its native provider or a provider that routes that model ID.\n *\n * The direct registry fallback preserves explicit/native model resolution when a\n * provider's availability snapshot does not include the configured model. Callers\n * continue to apply their existing enabled-model and authentication checks.\n */\nexport function findModelWithProviderRouting<T extends ModelLike>(\n\tregistry: ModelRegistryLike<T>,\n\tprovider: string,\n\tid: string,\n): T | undefined {\n\tconst available = registry.getAvailable();\n\tconst direct = available.find(model => model.provider === provider && model.id === id);\n\tif (direct) return direct;\n\n\tconst routedId = `${provider}/${id}`;\n\t// If multiple routers expose the same model ID, Pi's available-model ordering\n\t// determines which route is selected. An explicit provider/model selector can\n\t// select a specific route when that distinction matters.\n\tconst routed = available.find(model => model.id === routedId);\n\treturn routed ?? registry.find(provider, id);\n}\n\nfunction readSettings(path: string): Record<string, unknown> {\n\tif (!existsSync(path)) return {};\n\tconst raw = readFileSync(path, \"utf8\");\n\ttry {\n\t\treturn JSON.parse(raw) as Record<string, unknown>;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${path}: ${message}`);\n\t}\n}\n\nexport function loadEnabledModelPatterns(ctx: SummaryModelScopeContext): string[] | null {\n\tconst globalSettings = readSettings(join(getAgentDir(), \"settings.json\"));\n\tconst projectSettings = ctx.isProjectTrusted()\n\t\t? readSettings(join(ctx.cwd, \".humain-terminal\", \"settings.json\"))\n\t\t: {};\n\tconst value = Object.hasOwn(projectSettings, \"enabledModels\")\n\t\t? projectSettings.enabledModels\n\t\t: globalSettings.enabledModels;\n\tif (value === undefined) return null;\n\tif (!Array.isArray(value)) throw new Error(\"enabledModels must be an array\");\n\treturn value\n\t\t.filter((item): item is string => typeof item === \"string\")\n\t\t.map(item => item.trim())\n\t\t.filter(Boolean);\n}\n\nexport function summaryModelValue(model: ModelLike): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nexport function splitThinkingSuffix(value: string): { value: string; thinkingLevel?: SummaryThinkingLevel } {\n\tconst index = value.lastIndexOf(\":\");\n\tif (index < 0) return { value };\n\tconst suffix = value.slice(index + 1);\n\treturn THINKING_LEVELS.has(suffix)\n\t\t? { value: value.slice(0, index), thinkingLevel: suffix as SummaryThinkingLevel }\n\t\t: { value };\n}\n\nfunction stripThinkingSuffix(pattern: string): string {\n return splitThinkingSuffix(pattern).value;\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n\tlet source = \"^\";\n\tfor (const char of pattern) {\n\t\tif (char === \"*\") {\n\t\t\tsource += \".*\";\n\t\t} else if (char === \"?\") {\n\t\t\tsource += \".\";\n\t\t} else {\n\t\t\tsource += char.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n\t\t}\n\t}\n\treturn new RegExp(`${source}$`, \"i\");\n}\n\nexport function modelMatchesEnabledPatterns(model: ModelLike, patterns: string[] | null): boolean {\n\tif (patterns === null) return true;\n\tconst value = summaryModelValue(model).toLowerCase();\n\tconst id = model.id.toLowerCase();\n\tfor (const rawPattern of patterns) {\n\t\tconst pattern = stripThinkingSuffix(rawPattern.trim()).toLowerCase();\n\t\tif (!pattern) continue;\n\t\tif (pattern.includes(\"*\") || pattern.includes(\"?\")) {\n\t\t\tconst regex = globToRegExp(pattern);\n\t\t\tif (regex.test(value) || regex.test(id)) return true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (pattern === value || pattern === id) return true;\n\t}\n\treturn false;\n}\n"]}
1
+ {"version":3,"file":"summary-model-scope.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-model-scope.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAEnG,UAAU,wBAAwB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,IAAI,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACjE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAClD,YAAY,IAAI,SAAS,CAAC,EAAE,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,SAAS,EAC/D,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,GACR,CAAC,GAAG,SAAS,CAWf;AAaD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,EAAE,GAAG,IAAI,CAcvF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,oBAAoB,CAAA;CAAE,CAO1G;AAoBD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,CAehG"}
@@ -1 +1 @@
1
- {"version":3,"file":"summary-model-scope.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-model-scope.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../host.ts\";\n\nconst THINKING_LEVELS = new Set([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\n\nexport type SummaryThinkingLevel = \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ninterface SummaryModelScopeContext {\n\tcwd: string;\n\tisProjectTrusted(): boolean;\n}\n\nexport interface ModelLike {\n\tprovider: string;\n\tid: string;\n}\n\nexport interface ModelRegistryLike<T extends ModelLike = ModelLike> {\n\tfind(provider: string, id: string): T | undefined;\n\tgetAvailable(): readonly T[];\n}\n\n/**\n * Resolve a model through its native provider or a provider that routes that model ID.\n *\n * The direct registry fallback preserves explicit/native model resolution when a\n * provider's availability snapshot does not include the configured model. Callers\n * continue to apply their existing enabled-model and authentication checks.\n */\nexport function findModelWithProviderRouting<T extends ModelLike>(\n\tregistry: ModelRegistryLike<T>,\n\tprovider: string,\n\tid: string,\n): T | undefined {\n\tconst available = registry.getAvailable();\n\tconst direct = available.find(model => model.provider === provider && model.id === id);\n\tif (direct) return direct;\n\n\tconst routedId = `${provider}/${id}`;\n\t// If multiple routers expose the same model ID, Pi's available-model ordering\n\t// determines which route is selected. An explicit provider/model selector can\n\t// select a specific route when that distinction matters.\n\tconst routed = available.find(model => model.id === routedId);\n\treturn routed ?? registry.find(provider, id);\n}\n\nfunction readSettings(path: string): Record<string, unknown> {\n\tif (!existsSync(path)) return {};\n\tconst raw = readFileSync(path, \"utf8\");\n\ttry {\n\t\treturn JSON.parse(raw) as Record<string, unknown>;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${path}: ${message}`);\n\t}\n}\n\nexport function loadEnabledModelPatterns(ctx: SummaryModelScopeContext): string[] | null {\n\tconst globalSettings = readSettings(join(getAgentDir(), \"settings.json\"));\n\tconst projectSettings = ctx.isProjectTrusted()\n\t\t? readSettings(join(ctx.cwd, \".humain-terminal\", \"settings.json\"))\n\t\t: {};\n\tconst value = Object.hasOwn(projectSettings, \"enabledModels\")\n\t\t? projectSettings.enabledModels\n\t\t: globalSettings.enabledModels;\n\tif (value === undefined) return null;\n\tif (!Array.isArray(value)) throw new Error(\"enabledModels must be an array\");\n\treturn value\n\t\t.filter((item): item is string => typeof item === \"string\")\n\t\t.map(item => item.trim())\n\t\t.filter(Boolean);\n}\n\nexport function summaryModelValue(model: ModelLike): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nexport function splitThinkingSuffix(value: string): { value: string; thinkingLevel?: SummaryThinkingLevel } {\n\tconst index = value.lastIndexOf(\":\");\n\tif (index < 0) return { value };\n\tconst suffix = value.slice(index + 1);\n\treturn THINKING_LEVELS.has(suffix)\n\t\t? { value: value.slice(0, index), thinkingLevel: suffix as SummaryThinkingLevel }\n\t\t: { value };\n}\n\nfunction stripThinkingSuffix(pattern: string): string {\n return splitThinkingSuffix(pattern).value;\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n\tlet source = \"^\";\n\tfor (const char of pattern) {\n\t\tif (char === \"*\") {\n\t\t\tsource += \".*\";\n\t\t} else if (char === \"?\") {\n\t\t\tsource += \".\";\n\t\t} else {\n\t\t\tsource += char.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n\t\t}\n\t}\n\treturn new RegExp(`${source}$`, \"i\");\n}\n\nexport function modelMatchesEnabledPatterns(model: ModelLike, patterns: string[] | null): boolean {\n\tif (patterns === null) return true;\n\tconst value = summaryModelValue(model).toLowerCase();\n\tconst id = model.id.toLowerCase();\n\tfor (const rawPattern of patterns) {\n\t\tconst pattern = stripThinkingSuffix(rawPattern.trim()).toLowerCase();\n\t\tif (!pattern) continue;\n\t\tif (pattern.includes(\"*\") || pattern.includes(\"?\")) {\n\t\t\tconst regex = globToRegExp(pattern);\n\t\t\tif (regex.test(value) || regex.test(id)) return true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (pattern === value || pattern === id) return true;\n\t}\n\treturn false;\n}\n"]}
1
+ {"version":3,"file":"summary-model-scope.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-model-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAmB7F;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAC3C,QAA8B,EAC9B,QAAgB,EAChB,EAAU;IAEV,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,EAAE,EAAE,CAAC;IACrC,8EAA8E;IAC9E,8EAA8E;IAC9E,yDAAyD;IACzD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IAC9D,OAAO,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAA6B;IACrE,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC1E,MAAM,eAAe,GAAG,GAAG,CAAC,gBAAgB,EAAE;QAC7C,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;QAClE,CAAC,CAAC,EAAE,CAAC;IACN,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC;QAC5D,CAAC,CAAC,eAAe,CAAC,aAAa;QAC/B,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAC7E,OAAO,KAAK;SACV,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;SAC1D,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SACxB,MAAM,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAgB;IACjD,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACtC,OAAO,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;QACjC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,MAA8B,EAAE;QACjF,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC3C,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;AAC3C,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACpC,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,CAAC;QACf,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAgB,EAAE,QAAyB;IACtF,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACrE,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrD,SAAS;QACV,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../host.ts\";\n\nconst THINKING_LEVELS = new Set([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\n\nexport type SummaryThinkingLevel = \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\ninterface SummaryModelScopeContext {\n\tcwd: string;\n\tisProjectTrusted(): boolean;\n}\n\nexport interface ModelLike {\n\tprovider: string;\n\tid: string;\n}\n\nexport interface ModelRegistryLike<T extends ModelLike = ModelLike> {\n\tfind(provider: string, id: string): T | undefined;\n\tgetAvailable(): readonly T[];\n}\n\n/**\n * Resolve a model through its native provider or a provider that routes that model ID.\n *\n * The direct registry fallback preserves explicit/native model resolution when a\n * provider's availability snapshot does not include the configured model. Callers\n * continue to apply their existing enabled-model and authentication checks.\n */\nexport function findModelWithProviderRouting<T extends ModelLike>(\n\tregistry: ModelRegistryLike<T>,\n\tprovider: string,\n\tid: string,\n): T | undefined {\n\tconst available = registry.getAvailable();\n\tconst direct = available.find(model => model.provider === provider && model.id === id);\n\tif (direct) return direct;\n\n\tconst routedId = `${provider}/${id}`;\n\t// If multiple routers expose the same model ID, Pi's available-model ordering\n\t// determines which route is selected. An explicit provider/model selector can\n\t// select a specific route when that distinction matters.\n\tconst routed = available.find(model => model.id === routedId);\n\treturn routed ?? registry.find(provider, id);\n}\n\nfunction readSettings(path: string): Record<string, unknown> {\n\tif (!existsSync(path)) return {};\n\tconst raw = readFileSync(path, \"utf8\");\n\ttry {\n\t\treturn JSON.parse(raw) as Record<string, unknown>;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${path}: ${message}`);\n\t}\n}\n\nexport function loadEnabledModelPatterns(ctx: SummaryModelScopeContext): string[] | null {\n\tconst globalSettings = readSettings(join(getAgentDir(), \"settings.json\"));\n\tconst projectSettings = ctx.isProjectTrusted()\n\t\t? readSettings(join(ctx.cwd, \".humain-terminal\", \"settings.json\"))\n\t\t: {};\n\tconst value = Object.hasOwn(projectSettings, \"enabledModels\")\n\t\t? projectSettings.enabledModels\n\t\t: globalSettings.enabledModels;\n\tif (value === undefined) return null;\n\tif (!Array.isArray(value)) throw new Error(\"enabledModels must be an array\");\n\treturn value\n\t\t.filter((item): item is string => typeof item === \"string\")\n\t\t.map(item => item.trim())\n\t\t.filter(Boolean);\n}\n\nexport function summaryModelValue(model: ModelLike): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nexport function splitThinkingSuffix(value: string): { value: string; thinkingLevel?: SummaryThinkingLevel } {\n\tconst index = value.lastIndexOf(\":\");\n\tif (index < 0) return { value };\n\tconst suffix = value.slice(index + 1);\n\treturn THINKING_LEVELS.has(suffix)\n\t\t? { value: value.slice(0, index), thinkingLevel: suffix as SummaryThinkingLevel }\n\t\t: { value };\n}\n\nfunction stripThinkingSuffix(pattern: string): string {\n return splitThinkingSuffix(pattern).value;\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n\tlet source = \"^\";\n\tfor (const char of pattern) {\n\t\tif (char === \"*\") {\n\t\t\tsource += \".*\";\n\t\t} else if (char === \"?\") {\n\t\t\tsource += \".\";\n\t\t} else {\n\t\t\tsource += char.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n\t\t}\n\t}\n\treturn new RegExp(`${source}$`, \"i\");\n}\n\nexport function modelMatchesEnabledPatterns(model: ModelLike, patterns: string[] | null): boolean {\n\tif (patterns === null) return true;\n\tconst value = summaryModelValue(model).toLowerCase();\n\tconst id = model.id.toLowerCase();\n\tfor (const rawPattern of patterns) {\n\t\tconst pattern = stripThinkingSuffix(rawPattern.trim()).toLowerCase();\n\t\tif (!pattern) continue;\n\t\tif (pattern.includes(\"*\") || pattern.includes(\"?\")) {\n\t\t\tconst regex = globToRegExp(pattern);\n\t\t\tif (regex.test(value) || regex.test(id)) return true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (pattern === value || pattern === id) return true;\n\t}\n\treturn false;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"summary-review.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAsD,MAAM,8BAA8B,CAAC;AAC5G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,KAAK,gBAAgB,GAAG,OAAO,QAAQ,CAAC;AAYxC,eAAO,MAAM,8BAA8B,QAAS,CAAC;AAErD,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,eAAe,GAAG,wBAAwB,CAAC;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,kBAAkB,CAAC,CAAC;AAiCtH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAkCxF;AA2ED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAkB5G;AA8FD,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,eAAe,EAAE,EAC1B,GAAG,EAAE,wBAAwB,EAC7B,MAAM,CAAC,EAAE,WAAW,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,gBAAgB,EAC7B,UAAU,SAAiC,GACzC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAuIjD","sourcesContent":["import { clampThinkingLevel, type ModelThinkingLevel, type ThinkingLevel } from \"@earendil-works/pi-ai\";\nimport { complete, completeSimple, type Api, type Message, type Model } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns, splitThinkingSuffix, type SummaryThinkingLevel } from \"./summary-model-scope.ts\";\nimport type { QueryResultData } from \"./storage.ts\";\n\ntype ProviderHeaders = Record<string, string | null>;\ntype CompleteFunction = typeof complete;\ntype SummaryModelRegistry = SummaryGenerationContext[\"modelRegistry\"] & { complete?: CompleteFunction };\n\nconst PREFERRED_SUMMARY_MODELS = [\n\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.6-luna\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.6-terra\" },\n\t{ provider: \"google\", id: \"gemini-3.6-flash\" },\n\t{ provider: \"openai\", id: \"gpt-5-mini\" },\n\t{ provider: \"deepseek\", id: \"deepseek-v4-flash\" },\n] as const;\n\nexport const SUMMARY_GENERATION_DEADLINE_MS = 30_000;\n\nexport interface SummaryMeta {\n\tmodel: string | null;\n\tdurationMs: number;\n\ttokenEstimate: number;\n\tfallbackUsed: boolean;\n\tfallbackReason?: string;\n\tphase?: \"summary-model\" | \"deterministic-fallback\";\n\tedited?: boolean;\n}\n\nexport type SummaryGenerationContext = Pick<ExtensionContext, \"model\" | \"modelRegistry\" | \"cwd\" | \"isProjectTrusted\">;\n\nfunction estimateTokens(text: string): number {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return 0;\n\treturn Math.max(1, Math.ceil(trimmed.length / 4));\n}\n\nfunction summarizeQueryResult(result: QueryResultData): string {\n\tif (result.error) {\n\t\treturn `Query: ${result.query}\\nStatus: Error\\nError: ${result.error}`;\n\t}\n\n\tconst lines = [\n\t\t`Query: ${result.query}`,\n\t\t`Provider: ${result.provider ?? \"unknown\"}`,\n\t\t`Answer: ${result.answer || \"(no answer text returned)\"}`,\n\t];\n\n\tif (result.results.length === 0) {\n\t\tlines.push(\"Sources: none\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tlines.push(\"Sources:\");\n\tfor (let i = 0; i < result.results.length; i++) {\n\t\tconst source = result.results[i];\n\t\tlines.push(`${i + 1}. ${source.title} — ${source.url}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string {\n\tconst sections = [\n\t\t\"You are writing the final web search summary for a coding assistant.\",\n\t\t\"Write a concise, factual summary using only the provided search results.\",\n\t\t\"Requirements:\",\n\t\t\"- Keep it readable and skimmable.\",\n\t\t\"- Include key findings and caveats.\",\n\t\t\"- Do not invent sources or claims.\",\n\t\t\"- If evidence is weak or conflicting, say so explicitly.\",\n\t\t\"- End with a short \\\"Sources\\\" section listing the most relevant URLs.\",\n\t];\n\n\tif (feedback) {\n\t\tsections.push(\"- Incorporate the user feedback provided below into the summary.\");\n\t}\n\n\tsections.push(\"\");\n\tsections.push(\"<search_results>\");\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tsections.push(`\\n[Result ${i + 1}]`);\n\t\tsections.push(summarizeQueryResult(results[i]));\n\t}\n\n\tsections.push(\"\\n</search_results>\");\n\n\tif (feedback) {\n\t\tsections.push(\"\");\n\t\tsections.push(\"<user_feedback>\");\n\t\tsections.push(feedback);\n\t\tsections.push(\"</user_feedback>\");\n\t}\n\n\treturn sections.join(\"\\n\");\n}\n\nfunction buildDeterministicAnswerPreview(answer: string): string {\n\tlet text = answer.replace(/\\s+/g, \" \").trim();\n\tif (text.length === 0) return \"\";\n\n\tconst sourceMarker = text.search(/\\bSources?\\s*:/i);\n\tif (sourceMarker >= 0) text = text.slice(0, sourceMarker).trim();\n\tif (text.length === 0) return \"\";\n\n\treturn text.length > 240 ? `${text.slice(0, 237)}...` : text;\n}\n\nfunction buildDeterministicSummaryLines(results: QueryResultData[]): string[] {\n\tif (results.length === 0) {\n\t\treturn [\n\t\t\t\"No completed search results were available when the curator session finished.\",\n\t\t\t\"\",\n\t\t\t\"Sources\",\n\t\t\t\"- None\",\n\t\t];\n\t}\n\n\tconst lines: string[] = [\n\t\t\"Summary based on the currently selected search results.\",\n\t\t\"\",\n\t];\n\n\tconst sourceUrls: string[] = [];\n\tlet successful = 0;\n\tlet failed = 0;\n\n\tfor (const result of results) {\n\t\tif (result.error) {\n\t\t\tfailed += 1;\n\t\t\tlines.push(`- ${result.query}: failed (${result.error})`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsuccessful += 1;\n\t\tconst preview = buildDeterministicAnswerPreview(result.answer);\n\t\tif (preview.length > 0) {\n\t\t\tlines.push(`- ${result.query}: ${preview}`);\n\t\t} else {\n\t\t\tlines.push(`- ${result.query}: returned ${result.results.length} source${result.results.length === 1 ? \"\" : \"s\"} without answer text.`);\n\t\t}\n\n\t\tfor (const source of result.results) {\n\t\t\tif (!sourceUrls.includes(source.url)) {\n\t\t\t\tsourceUrls.push(source.url);\n\t\t\t}\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(`Completed queries: ${results.length}`);\n\tlines.push(`Successful: ${successful}`);\n\tlines.push(`Failed: ${failed}`);\n\tlines.push(\"\");\n\tlines.push(\"Sources\");\n\n\tif (sourceUrls.length === 0) {\n\t\tlines.push(\"- None\");\n\t} else {\n\t\tfor (const url of sourceUrls.slice(0, 12)) {\n\t\t\tlines.push(`- ${url}`);\n\t\t}\n\t\tif (sourceUrls.length > 12) {\n\t\t\tlines.push(`- ... and ${sourceUrls.length - 12} more`);\n\t\t}\n\t}\n\n\treturn lines;\n}\n\nexport function buildDeterministicSummary(results: QueryResultData[]): { summary: string; meta: SummaryMeta } {\n\tconst summary = buildDeterministicSummaryLines(results).join(\"\\n\").trim();\n\tconst nonEmptySummary = summary.length > 0\n\t\t? summary\n\t\t: \"No completed search results were available when the curator session finished.\\n\\nSources\\n- None\";\n\n\treturn {\n\t\tsummary: nonEmptySummary,\n\t\tmeta: {\n\t\t\tmodel: null,\n\t\t\tdurationMs: 0,\n\t\t\ttokenEstimate: estimateTokens(nonEmptySummary),\n\t\t\tfallbackUsed: true,\n\t\t\tfallbackReason: \"deterministic-submit-fallback\",\n\t\t\tphase: \"deterministic-fallback\",\n\t\t\tedited: false,\n\t\t},\n\t};\n}\n\nfunction parseModelSelector(value: string): { provider: string; id: string; thinkingLevel?: SummaryThinkingLevel } {\n\tconst selector = splitThinkingSuffix(value);\n\tconst slashIndex = selector.value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex >= selector.value.length - 1) {\n\t\tthrow new Error(`Invalid summary model: ${value}. Use provider/model-id.`);\n\t}\n\treturn {\n\t\tprovider: selector.value.slice(0, slashIndex),\n\t\tid: selector.value.slice(slashIndex + 1),\n\t\tthinkingLevel: selector.thinkingLevel,\n\t};\n}\n\nfunction resolveThinkingLevel(model: Model<Api>, requested?: SummaryThinkingLevel): ModelThinkingLevel | undefined {\n\tif (!requested) return undefined;\n\treturn clampThinkingLevel(model, requested as ModelThinkingLevel);\n}\n\nasync function resolveSummaryModelCandidates(\n\tctx: SummaryGenerationContext,\n\tmodelOverride?: string,\n): Promise<{ candidates: Array<{ model: Model<Api>; apiKey?: string; headers?: ProviderHeaders; thinkingLevel?: SummaryThinkingLevel }>; errors: string[] }> {\n\tconst enabledModelPatterns = loadEnabledModelPatterns(ctx);\n\tconst specs: Array<{ provider: string; id: string; thinkingLevel?: SummaryThinkingLevel }> = [];\n\tconst normalizedOverride = typeof modelOverride === \"string\" ? modelOverride.trim() : \"\";\n\tif (normalizedOverride.length > 0) specs.push(parseModelSelector(normalizedOverride));\n\tspecs.push(...PREFERRED_SUMMARY_MODELS);\n\n\tconst candidates: Array<{ model: Model<Api>; apiKey?: string; headers?: ProviderHeaders; thinkingLevel?: SummaryThinkingLevel }> = [];\n\tconst errors: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const spec of specs) {\n\t\tconst value = `${spec.provider}/${spec.id}`;\n\t\tif (seen.has(value)) continue;\n\t\tseen.add(value);\n\n\t\tconst model = findModelWithProviderRouting(ctx.modelRegistry, spec.provider, spec.id);\n\t\tif (!model) {\n\t\t\terrors.push(`Summary model not found: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) {\n\t\t\terrors.push(`Summary model is not enabled: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok) {\n\t\t\terrors.push(`No API key available for summary model ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ model, apiKey: auth.apiKey, headers: auth.headers, thinkingLevel: spec.thinkingLevel });\n\t}\n\treturn { candidates, errors };\n}\n\nfunction buildFallbackSummary(\n\tresults: QueryResultData[],\n\tfallbackReason: string,\n\tdurationMs = 0,\n): { summary: string; meta: SummaryMeta } {\n\tconst deterministic = buildDeterministicSummary(results);\n\treturn {\n\t\tsummary: deterministic.summary,\n\t\tmeta: {\n\t\t\t...deterministic.meta,\n\t\t\tdurationMs,\n\t\t\tfallbackReason,\n\t\t},\n\t};\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tconst name = (err as { name?: unknown }).name;\n\tconst message = (err as { message?: unknown }).message;\n\treturn name === \"AbortError\" || (typeof message === \"string\" && message.toLowerCase().includes(\"abort\"));\n}\n\nfunction getTextFromContentPart(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"\";\n\tconst value = part as Record<string, unknown>;\n\tif (typeof value.text === \"string\") return value.text;\n\tif (typeof value.refusal === \"string\") return value.refusal;\n\treturn \"\";\n}\n\nfunction getContentPartType(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"unknown\";\n\tconst value = part as Record<string, unknown>;\n\treturn typeof value.type === \"string\" ? value.type : \"unknown\";\n}\n\nexport async function generateSummaryDraft(\n\tresults: QueryResultData[],\n\tctx: SummaryGenerationContext,\n\tsignal?: AbortSignal,\n\tmodelOverride?: string,\n\tfeedback?: string,\n\tcompleteFn?: CompleteFunction,\n\tdeadlineMs = SUMMARY_GENERATION_DEADLINE_MS,\n): Promise<{ summary: string; meta: SummaryMeta }> {\n\tif (!ctx || !ctx.modelRegistry) {\n\t\tthrow new Error(\"Summary generation context unavailable\");\n\t}\n\n\tconst registry = ctx.modelRegistry as SummaryModelRegistry;\n\tconst customCompleteFn = completeFn !== undefined;\n\tconst usesRegistryComplete = !customCompleteFn && typeof registry.complete === \"function\";\n\tcompleteFn ??= usesRegistryComplete ? registry.complete!.bind(registry) as CompleteFunction : complete;\n\n\tconst generationStartedAt = Date.now();\n\tconst deadlineController = new AbortController();\n\tconst deadlineMarker = Symbol(\"summary-generation-deadline\");\n\tlet deadlineTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet resolveDeadline!: () => void;\n\tconst deadlinePromise = new Promise<typeof deadlineMarker>(resolve => {\n\t\tresolveDeadline = () => resolve(deadlineMarker);\n\t\tdeadlineTimer = setTimeout(() => {\n\t\t\tdeadlineController.abort();\n\t\t\tresolveDeadline();\n\t\t}, deadlineMs);\n\t});\n\n\tlet callerAbortListener: (() => void) | undefined;\n\tconst callerAbortPromise = signal\n\t\t? new Promise<never>((_, reject) => {\n\t\t\tcallerAbortListener = () => reject(new Error(\"Aborted\"));\n\t\t\tif (signal.aborted) callerAbortListener();\n\t\t\telse signal.addEventListener(\"abort\", callerAbortListener, { once: true });\n\t\t})\n\t\t: undefined;\n\tconst completionSignal = signal\n\t\t? AbortSignal.any([signal, deadlineController.signal])\n\t\t: deadlineController.signal;\n\n\tasync function raceSummaryOperation<T>(operation: Promise<T>): Promise<T> {\n\t\t// A provider may ignore AbortSignal and never settle; observe it before racing so\n\t\t// its eventual rejection cannot become an unhandled promise rejection.\n\t\tvoid operation.then(() => undefined, () => undefined);\n\t\tconst contenders: Promise<unknown>[] = [operation, deadlinePromise];\n\t\tif (callerAbortPromise) contenders.push(callerAbortPromise);\n\t\tconst result = await Promise.race(contenders);\n\t\tif (result === deadlineMarker) {\n\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\tthrow deadlineMarker;\n\t\t}\n\t\treturn result as T;\n\t}\n\n\ttry {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\tconst prompt = buildSummaryPrompt(results, feedback);\n\t\tlet resolved: Awaited<ReturnType<typeof resolveSummaryModelCandidates>>;\n\t\ttry {\n\t\t\tresolved = await raceSummaryOperation(resolveSummaryModelCandidates(ctx, modelOverride));\n\t\t} catch (err) {\n\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\tif (err === deadlineMarker || deadlineController.signal.aborted) {\n\t\t\t\treturn buildFallbackSummary(results, \"summary-generation-timeout\", Date.now() - generationStartedAt);\n\t\t\t}\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\treturn buildFallbackSummary(results, `summary-model-settings-error: ${message}`, Date.now() - generationStartedAt);\n\t\t}\n\n\t\tlet lastError = resolved.errors.at(-1);\n\t\tfor (const { model, apiKey, headers, thinkingLevel } of resolved.candidates) {\n\t\t\tconst startedAt = Date.now();\n\t\t\ttry {\n\t\t\t\tconst userMessage: Message = {\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: [{ type: \"text\", text: prompt }],\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tconst requestedThinkingLevel = resolveThinkingLevel(model, thinkingLevel);\n\t\t\t\tconst enabledThinkingLevel = requestedThinkingLevel && requestedThinkingLevel !== \"off\"\n\t\t\t\t\t? requestedThinkingLevel as ThinkingLevel\n\t\t\t\t\t: undefined;\n\t\t\t\tconst completionOptions = {\n\t\t\t\t\t...(usesRegistryComplete ? {} : { apiKey, headers }),\n\t\t\t\t\tsignal: completionSignal,\n\t\t\t\t\t...(requestedThinkingLevel ? { reasoning: requestedThinkingLevel } : {}),\n\t\t\t\t\t...(enabledThinkingLevel ? { reasoningEffort: enabledThinkingLevel } : {}),\n\t\t\t\t};\n\t\t\t\tconst completion = thinkingLevel !== undefined && !customCompleteFn && !usesRegistryComplete\n\t\t\t\t\t? completeSimple(model, { messages: [userMessage] }, { apiKey, headers, signal: completionSignal, ...(enabledThinkingLevel ? { reasoning: enabledThinkingLevel } : {}) })\n\t\t\t\t\t: completeFn(model, { messages: [userMessage] }, completionOptions);\n\n\t\t\t\tconst response = await raceSummaryOperation(Promise.resolve(completion));\n\t\t\t\tif (response.stopReason === \"aborted\") {\n\t\t\t\t\tthrow new Error(\"Aborted\");\n\t\t\t\t}\n\n\t\t\t\tconst contentParts = Array.isArray(response.content) ? response.content : [];\n\t\t\t\tconst summary = contentParts\n\t\t\t\t\t.map((part: unknown) => getTextFromContentPart(part))\n\t\t\t\t\t.filter((text: string) => text.trim().length > 0)\n\t\t\t\t\t.join(\"\\n\")\n\t\t\t\t\t.trim();\n\n\t\t\t\tif (summary.length === 0) {\n\t\t\t\t\tconst partTypes = contentParts.map((part: unknown) => getContentPartType(part));\n\t\t\t\t\tconst typesLabel = partTypes.length > 0 ? partTypes.join(\", \") : \"none\";\n\t\t\t\t\tthrow new Error(`Summary model returned empty response (content parts: ${typesLabel})`);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsummary,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tmodel: `${model.provider}/${model.id}`,\n\t\t\t\t\t\tdurationMs: Math.max(0, Date.now() - startedAt),\n\t\t\t\t\t\ttokenEstimate: estimateTokens(summary),\n\t\t\t\t\t\tfallbackUsed: false,\n\t\t\t\t\t\tphase: \"summary-model\",\n\t\t\t\t\t\tedited: false,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\t\tif (err === deadlineMarker || deadlineController.signal.aborted) {\n\t\t\t\t\treturn buildFallbackSummary(results, \"summary-generation-timeout\", Date.now() - generationStartedAt);\n\t\t\t\t}\n\t\t\t\tif (isAbortError(err)) throw err;\n\t\t\t\tlastError = err instanceof Error ? err.message : String(err);\n\t\t\t}\n\t\t}\n\n\t\treturn buildFallbackSummary(\n\t\t\tresults,\n\t\t\tlastError ? `summary-model-unavailable: ${lastError}` : \"summary-model-unavailable\",\n\t\t\tDate.now() - generationStartedAt,\n\t\t);\n\t} finally {\n\t\tif (deadlineTimer) clearTimeout(deadlineTimer);\n\t\tif (signal && callerAbortListener) signal.removeEventListener(\"abort\", callerAbortListener);\n\t}\n}\n"]}
1
+ {"version":3,"file":"summary-review.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAsD,MAAM,8BAA8B,CAAC;AAC5G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,KAAK,gBAAgB,GAAG,OAAO,QAAQ,CAAC;AAYxC,eAAO,MAAM,8BAA8B,QAAS,CAAC;AAErD,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,eAAe,GAAG,wBAAwB,CAAC;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,kBAAkB,CAAC,CAAC;AAiCtH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAkCxF;AA2ED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAkB5G;AA8FD,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,eAAe,EAAE,EAC1B,GAAG,EAAE,wBAAwB,EAC7B,MAAM,CAAC,EAAE,WAAW,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,gBAAgB,EAC7B,UAAU,SAAiC,GACzC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAuIjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"summary-review.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-review.ts"],"names":[],"mappings":"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","sourcesContent":["import { clampThinkingLevel, type ModelThinkingLevel, type ThinkingLevel } from \"@earendil-works/pi-ai\";\nimport { complete, completeSimple, type Api, type Message, type Model } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns, splitThinkingSuffix, type SummaryThinkingLevel } from \"./summary-model-scope.ts\";\nimport type { QueryResultData } from \"./storage.ts\";\n\ntype ProviderHeaders = Record<string, string | null>;\ntype CompleteFunction = typeof complete;\ntype SummaryModelRegistry = SummaryGenerationContext[\"modelRegistry\"] & { complete?: CompleteFunction };\n\nconst PREFERRED_SUMMARY_MODELS = [\n\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.6-luna\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.6-terra\" },\n\t{ provider: \"google\", id: \"gemini-3.6-flash\" },\n\t{ provider: \"openai\", id: \"gpt-5-mini\" },\n\t{ provider: \"deepseek\", id: \"deepseek-v4-flash\" },\n] as const;\n\nexport const SUMMARY_GENERATION_DEADLINE_MS = 30_000;\n\nexport interface SummaryMeta {\n\tmodel: string | null;\n\tdurationMs: number;\n\ttokenEstimate: number;\n\tfallbackUsed: boolean;\n\tfallbackReason?: string;\n\tphase?: \"summary-model\" | \"deterministic-fallback\";\n\tedited?: boolean;\n}\n\nexport type SummaryGenerationContext = Pick<ExtensionContext, \"model\" | \"modelRegistry\" | \"cwd\" | \"isProjectTrusted\">;\n\nfunction estimateTokens(text: string): number {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return 0;\n\treturn Math.max(1, Math.ceil(trimmed.length / 4));\n}\n\nfunction summarizeQueryResult(result: QueryResultData): string {\n\tif (result.error) {\n\t\treturn `Query: ${result.query}\\nStatus: Error\\nError: ${result.error}`;\n\t}\n\n\tconst lines = [\n\t\t`Query: ${result.query}`,\n\t\t`Provider: ${result.provider ?? \"unknown\"}`,\n\t\t`Answer: ${result.answer || \"(no answer text returned)\"}`,\n\t];\n\n\tif (result.results.length === 0) {\n\t\tlines.push(\"Sources: none\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tlines.push(\"Sources:\");\n\tfor (let i = 0; i < result.results.length; i++) {\n\t\tconst source = result.results[i];\n\t\tlines.push(`${i + 1}. ${source.title} — ${source.url}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string {\n\tconst sections = [\n\t\t\"You are writing the final web search summary for a coding assistant.\",\n\t\t\"Write a concise, factual summary using only the provided search results.\",\n\t\t\"Requirements:\",\n\t\t\"- Keep it readable and skimmable.\",\n\t\t\"- Include key findings and caveats.\",\n\t\t\"- Do not invent sources or claims.\",\n\t\t\"- If evidence is weak or conflicting, say so explicitly.\",\n\t\t\"- End with a short \\\"Sources\\\" section listing the most relevant URLs.\",\n\t];\n\n\tif (feedback) {\n\t\tsections.push(\"- Incorporate the user feedback provided below into the summary.\");\n\t}\n\n\tsections.push(\"\");\n\tsections.push(\"<search_results>\");\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tsections.push(`\\n[Result ${i + 1}]`);\n\t\tsections.push(summarizeQueryResult(results[i]));\n\t}\n\n\tsections.push(\"\\n</search_results>\");\n\n\tif (feedback) {\n\t\tsections.push(\"\");\n\t\tsections.push(\"<user_feedback>\");\n\t\tsections.push(feedback);\n\t\tsections.push(\"</user_feedback>\");\n\t}\n\n\treturn sections.join(\"\\n\");\n}\n\nfunction buildDeterministicAnswerPreview(answer: string): string {\n\tlet text = answer.replace(/\\s+/g, \" \").trim();\n\tif (text.length === 0) return \"\";\n\n\tconst sourceMarker = text.search(/\\bSources?\\s*:/i);\n\tif (sourceMarker >= 0) text = text.slice(0, sourceMarker).trim();\n\tif (text.length === 0) return \"\";\n\n\treturn text.length > 240 ? `${text.slice(0, 237)}...` : text;\n}\n\nfunction buildDeterministicSummaryLines(results: QueryResultData[]): string[] {\n\tif (results.length === 0) {\n\t\treturn [\n\t\t\t\"No completed search results were available when the curator session finished.\",\n\t\t\t\"\",\n\t\t\t\"Sources\",\n\t\t\t\"- None\",\n\t\t];\n\t}\n\n\tconst lines: string[] = [\n\t\t\"Summary based on the currently selected search results.\",\n\t\t\"\",\n\t];\n\n\tconst sourceUrls: string[] = [];\n\tlet successful = 0;\n\tlet failed = 0;\n\n\tfor (const result of results) {\n\t\tif (result.error) {\n\t\t\tfailed += 1;\n\t\t\tlines.push(`- ${result.query}: failed (${result.error})`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsuccessful += 1;\n\t\tconst preview = buildDeterministicAnswerPreview(result.answer);\n\t\tif (preview.length > 0) {\n\t\t\tlines.push(`- ${result.query}: ${preview}`);\n\t\t} else {\n\t\t\tlines.push(`- ${result.query}: returned ${result.results.length} source${result.results.length === 1 ? \"\" : \"s\"} without answer text.`);\n\t\t}\n\n\t\tfor (const source of result.results) {\n\t\t\tif (!sourceUrls.includes(source.url)) {\n\t\t\t\tsourceUrls.push(source.url);\n\t\t\t}\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(`Completed queries: ${results.length}`);\n\tlines.push(`Successful: ${successful}`);\n\tlines.push(`Failed: ${failed}`);\n\tlines.push(\"\");\n\tlines.push(\"Sources\");\n\n\tif (sourceUrls.length === 0) {\n\t\tlines.push(\"- None\");\n\t} else {\n\t\tfor (const url of sourceUrls.slice(0, 12)) {\n\t\t\tlines.push(`- ${url}`);\n\t\t}\n\t\tif (sourceUrls.length > 12) {\n\t\t\tlines.push(`- ... and ${sourceUrls.length - 12} more`);\n\t\t}\n\t}\n\n\treturn lines;\n}\n\nexport function buildDeterministicSummary(results: QueryResultData[]): { summary: string; meta: SummaryMeta } {\n\tconst summary = buildDeterministicSummaryLines(results).join(\"\\n\").trim();\n\tconst nonEmptySummary = summary.length > 0\n\t\t? summary\n\t\t: \"No completed search results were available when the curator session finished.\\n\\nSources\\n- None\";\n\n\treturn {\n\t\tsummary: nonEmptySummary,\n\t\tmeta: {\n\t\t\tmodel: null,\n\t\t\tdurationMs: 0,\n\t\t\ttokenEstimate: estimateTokens(nonEmptySummary),\n\t\t\tfallbackUsed: true,\n\t\t\tfallbackReason: \"deterministic-submit-fallback\",\n\t\t\tphase: \"deterministic-fallback\",\n\t\t\tedited: false,\n\t\t},\n\t};\n}\n\nfunction parseModelSelector(value: string): { provider: string; id: string; thinkingLevel?: SummaryThinkingLevel } {\n\tconst selector = splitThinkingSuffix(value);\n\tconst slashIndex = selector.value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex >= selector.value.length - 1) {\n\t\tthrow new Error(`Invalid summary model: ${value}. Use provider/model-id.`);\n\t}\n\treturn {\n\t\tprovider: selector.value.slice(0, slashIndex),\n\t\tid: selector.value.slice(slashIndex + 1),\n\t\tthinkingLevel: selector.thinkingLevel,\n\t};\n}\n\nfunction resolveThinkingLevel(model: Model<Api>, requested?: SummaryThinkingLevel): ModelThinkingLevel | undefined {\n\tif (!requested) return undefined;\n\treturn clampThinkingLevel(model, requested as ModelThinkingLevel);\n}\n\nasync function resolveSummaryModelCandidates(\n\tctx: SummaryGenerationContext,\n\tmodelOverride?: string,\n): Promise<{ candidates: Array<{ model: Model<Api>; apiKey?: string; headers?: ProviderHeaders; thinkingLevel?: SummaryThinkingLevel }>; errors: string[] }> {\n\tconst enabledModelPatterns = loadEnabledModelPatterns(ctx);\n\tconst specs: Array<{ provider: string; id: string; thinkingLevel?: SummaryThinkingLevel }> = [];\n\tconst normalizedOverride = typeof modelOverride === \"string\" ? modelOverride.trim() : \"\";\n\tif (normalizedOverride.length > 0) specs.push(parseModelSelector(normalizedOverride));\n\tspecs.push(...PREFERRED_SUMMARY_MODELS);\n\n\tconst candidates: Array<{ model: Model<Api>; apiKey?: string; headers?: ProviderHeaders; thinkingLevel?: SummaryThinkingLevel }> = [];\n\tconst errors: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const spec of specs) {\n\t\tconst value = `${spec.provider}/${spec.id}`;\n\t\tif (seen.has(value)) continue;\n\t\tseen.add(value);\n\n\t\tconst model = findModelWithProviderRouting(ctx.modelRegistry, spec.provider, spec.id);\n\t\tif (!model) {\n\t\t\terrors.push(`Summary model not found: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) {\n\t\t\terrors.push(`Summary model is not enabled: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok) {\n\t\t\terrors.push(`No API key available for summary model ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ model, apiKey: auth.apiKey, headers: auth.headers, thinkingLevel: spec.thinkingLevel });\n\t}\n\treturn { candidates, errors };\n}\n\nfunction buildFallbackSummary(\n\tresults: QueryResultData[],\n\tfallbackReason: string,\n\tdurationMs = 0,\n): { summary: string; meta: SummaryMeta } {\n\tconst deterministic = buildDeterministicSummary(results);\n\treturn {\n\t\tsummary: deterministic.summary,\n\t\tmeta: {\n\t\t\t...deterministic.meta,\n\t\t\tdurationMs,\n\t\t\tfallbackReason,\n\t\t},\n\t};\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tconst name = (err as { name?: unknown }).name;\n\tconst message = (err as { message?: unknown }).message;\n\treturn name === \"AbortError\" || (typeof message === \"string\" && message.toLowerCase().includes(\"abort\"));\n}\n\nfunction getTextFromContentPart(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"\";\n\tconst value = part as Record<string, unknown>;\n\tif (typeof value.text === \"string\") return value.text;\n\tif (typeof value.refusal === \"string\") return value.refusal;\n\treturn \"\";\n}\n\nfunction getContentPartType(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"unknown\";\n\tconst value = part as Record<string, unknown>;\n\treturn typeof value.type === \"string\" ? value.type : \"unknown\";\n}\n\nexport async function generateSummaryDraft(\n\tresults: QueryResultData[],\n\tctx: SummaryGenerationContext,\n\tsignal?: AbortSignal,\n\tmodelOverride?: string,\n\tfeedback?: string,\n\tcompleteFn?: CompleteFunction,\n\tdeadlineMs = SUMMARY_GENERATION_DEADLINE_MS,\n): Promise<{ summary: string; meta: SummaryMeta }> {\n\tif (!ctx || !ctx.modelRegistry) {\n\t\tthrow new Error(\"Summary generation context unavailable\");\n\t}\n\n\tconst registry = ctx.modelRegistry as SummaryModelRegistry;\n\tconst customCompleteFn = completeFn !== undefined;\n\tconst usesRegistryComplete = !customCompleteFn && typeof registry.complete === \"function\";\n\tcompleteFn ??= usesRegistryComplete ? registry.complete!.bind(registry) as CompleteFunction : complete;\n\n\tconst generationStartedAt = Date.now();\n\tconst deadlineController = new AbortController();\n\tconst deadlineMarker = Symbol(\"summary-generation-deadline\");\n\tlet deadlineTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet resolveDeadline!: () => void;\n\tconst deadlinePromise = new Promise<typeof deadlineMarker>(resolve => {\n\t\tresolveDeadline = () => resolve(deadlineMarker);\n\t\tdeadlineTimer = setTimeout(() => {\n\t\t\tdeadlineController.abort();\n\t\t\tresolveDeadline();\n\t\t}, deadlineMs);\n\t});\n\n\tlet callerAbortListener: (() => void) | undefined;\n\tconst callerAbortPromise = signal\n\t\t? new Promise<never>((_, reject) => {\n\t\t\tcallerAbortListener = () => reject(new Error(\"Aborted\"));\n\t\t\tif (signal.aborted) callerAbortListener();\n\t\t\telse signal.addEventListener(\"abort\", callerAbortListener, { once: true });\n\t\t})\n\t\t: undefined;\n\tconst completionSignal = signal\n\t\t? AbortSignal.any([signal, deadlineController.signal])\n\t\t: deadlineController.signal;\n\n\tasync function raceSummaryOperation<T>(operation: Promise<T>): Promise<T> {\n\t\t// A provider may ignore AbortSignal and never settle; observe it before racing so\n\t\t// its eventual rejection cannot become an unhandled promise rejection.\n\t\tvoid operation.then(() => undefined, () => undefined);\n\t\tconst contenders: Promise<unknown>[] = [operation, deadlinePromise];\n\t\tif (callerAbortPromise) contenders.push(callerAbortPromise);\n\t\tconst result = await Promise.race(contenders);\n\t\tif (result === deadlineMarker) {\n\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\tthrow deadlineMarker;\n\t\t}\n\t\treturn result as T;\n\t}\n\n\ttry {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\tconst prompt = buildSummaryPrompt(results, feedback);\n\t\tlet resolved: Awaited<ReturnType<typeof resolveSummaryModelCandidates>>;\n\t\ttry {\n\t\t\tresolved = await raceSummaryOperation(resolveSummaryModelCandidates(ctx, modelOverride));\n\t\t} catch (err) {\n\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\tif (err === deadlineMarker || deadlineController.signal.aborted) {\n\t\t\t\treturn buildFallbackSummary(results, \"summary-generation-timeout\", Date.now() - generationStartedAt);\n\t\t\t}\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\treturn buildFallbackSummary(results, `summary-model-settings-error: ${message}`, Date.now() - generationStartedAt);\n\t\t}\n\n\t\tlet lastError = resolved.errors.at(-1);\n\t\tfor (const { model, apiKey, headers, thinkingLevel } of resolved.candidates) {\n\t\t\tconst startedAt = Date.now();\n\t\t\ttry {\n\t\t\t\tconst userMessage: Message = {\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: [{ type: \"text\", text: prompt }],\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tconst requestedThinkingLevel = resolveThinkingLevel(model, thinkingLevel);\n\t\t\t\tconst enabledThinkingLevel = requestedThinkingLevel && requestedThinkingLevel !== \"off\"\n\t\t\t\t\t? requestedThinkingLevel as ThinkingLevel\n\t\t\t\t\t: undefined;\n\t\t\t\tconst completionOptions = {\n\t\t\t\t\t...(usesRegistryComplete ? {} : { apiKey, headers }),\n\t\t\t\t\tsignal: completionSignal,\n\t\t\t\t\t...(requestedThinkingLevel ? { reasoning: requestedThinkingLevel } : {}),\n\t\t\t\t\t...(enabledThinkingLevel ? { reasoningEffort: enabledThinkingLevel } : {}),\n\t\t\t\t};\n\t\t\t\tconst completion = thinkingLevel !== undefined && !customCompleteFn && !usesRegistryComplete\n\t\t\t\t\t? completeSimple(model, { messages: [userMessage] }, { apiKey, headers, signal: completionSignal, ...(enabledThinkingLevel ? { reasoning: enabledThinkingLevel } : {}) })\n\t\t\t\t\t: completeFn(model, { messages: [userMessage] }, completionOptions);\n\n\t\t\t\tconst response = await raceSummaryOperation(Promise.resolve(completion));\n\t\t\t\tif (response.stopReason === \"aborted\") {\n\t\t\t\t\tthrow new Error(\"Aborted\");\n\t\t\t\t}\n\n\t\t\t\tconst contentParts = Array.isArray(response.content) ? response.content : [];\n\t\t\t\tconst summary = contentParts\n\t\t\t\t\t.map((part: unknown) => getTextFromContentPart(part))\n\t\t\t\t\t.filter((text: string) => text.trim().length > 0)\n\t\t\t\t\t.join(\"\\n\")\n\t\t\t\t\t.trim();\n\n\t\t\t\tif (summary.length === 0) {\n\t\t\t\t\tconst partTypes = contentParts.map((part: unknown) => getContentPartType(part));\n\t\t\t\t\tconst typesLabel = partTypes.length > 0 ? partTypes.join(\", \") : \"none\";\n\t\t\t\t\tthrow new Error(`Summary model returned empty response (content parts: ${typesLabel})`);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsummary,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tmodel: `${model.provider}/${model.id}`,\n\t\t\t\t\t\tdurationMs: Math.max(0, Date.now() - startedAt),\n\t\t\t\t\t\ttokenEstimate: estimateTokens(summary),\n\t\t\t\t\t\tfallbackUsed: false,\n\t\t\t\t\t\tphase: \"summary-model\",\n\t\t\t\t\t\tedited: false,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\t\tif (err === deadlineMarker || deadlineController.signal.aborted) {\n\t\t\t\t\treturn buildFallbackSummary(results, \"summary-generation-timeout\", Date.now() - generationStartedAt);\n\t\t\t\t}\n\t\t\t\tif (isAbortError(err)) throw err;\n\t\t\t\tlastError = err instanceof Error ? err.message : String(err);\n\t\t\t}\n\t\t}\n\n\t\treturn buildFallbackSummary(\n\t\t\tresults,\n\t\t\tlastError ? `summary-model-unavailable: ${lastError}` : \"summary-model-unavailable\",\n\t\t\tDate.now() - generationStartedAt,\n\t\t);\n\t} finally {\n\t\tif (deadlineTimer) clearTimeout(deadlineTimer);\n\t\tif (signal && callerAbortListener) signal.removeEventListener(\"abort\", callerAbortListener);\n\t}\n}\n"]}
1
+ {"version":3,"file":"summary-review.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-review.ts"],"names":[],"mappings":"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","sourcesContent":["import { clampThinkingLevel, type ModelThinkingLevel, type ThinkingLevel } from \"@earendil-works/pi-ai\";\nimport { complete, completeSimple, type Api, type Message, type Model } from \"@earendil-works/pi-ai/compat\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport { findModelWithProviderRouting, loadEnabledModelPatterns, modelMatchesEnabledPatterns, splitThinkingSuffix, type SummaryThinkingLevel } from \"./summary-model-scope.ts\";\nimport type { QueryResultData } from \"./storage.ts\";\n\ntype ProviderHeaders = Record<string, string | null>;\ntype CompleteFunction = typeof complete;\ntype SummaryModelRegistry = SummaryGenerationContext[\"modelRegistry\"] & { complete?: CompleteFunction };\n\nconst PREFERRED_SUMMARY_MODELS = [\n\t{ provider: \"anthropic\", id: \"claude-haiku-4-5\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.6-luna\" },\n\t{ provider: \"openai-codex\", id: \"gpt-5.6-terra\" },\n\t{ provider: \"google\", id: \"gemini-3.6-flash\" },\n\t{ provider: \"openai\", id: \"gpt-5-mini\" },\n\t{ provider: \"deepseek\", id: \"deepseek-v4-flash\" },\n] as const;\n\nexport const SUMMARY_GENERATION_DEADLINE_MS = 30_000;\n\nexport interface SummaryMeta {\n\tmodel: string | null;\n\tdurationMs: number;\n\ttokenEstimate: number;\n\tfallbackUsed: boolean;\n\tfallbackReason?: string;\n\tphase?: \"summary-model\" | \"deterministic-fallback\";\n\tedited?: boolean;\n}\n\nexport type SummaryGenerationContext = Pick<ExtensionContext, \"model\" | \"modelRegistry\" | \"cwd\" | \"isProjectTrusted\">;\n\nfunction estimateTokens(text: string): number {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return 0;\n\treturn Math.max(1, Math.ceil(trimmed.length / 4));\n}\n\nfunction summarizeQueryResult(result: QueryResultData): string {\n\tif (result.error) {\n\t\treturn `Query: ${result.query}\\nStatus: Error\\nError: ${result.error}`;\n\t}\n\n\tconst lines = [\n\t\t`Query: ${result.query}`,\n\t\t`Provider: ${result.provider ?? \"unknown\"}`,\n\t\t`Answer: ${result.answer || \"(no answer text returned)\"}`,\n\t];\n\n\tif (result.results.length === 0) {\n\t\tlines.push(\"Sources: none\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tlines.push(\"Sources:\");\n\tfor (let i = 0; i < result.results.length; i++) {\n\t\tconst source = result.results[i];\n\t\tlines.push(`${i + 1}. ${source.title} — ${source.url}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function buildSummaryPrompt(results: QueryResultData[], feedback?: string): string {\n\tconst sections = [\n\t\t\"You are writing the final web search summary for a coding assistant.\",\n\t\t\"Write a concise, factual summary using only the provided search results.\",\n\t\t\"Requirements:\",\n\t\t\"- Keep it readable and skimmable.\",\n\t\t\"- Include key findings and caveats.\",\n\t\t\"- Do not invent sources or claims.\",\n\t\t\"- If evidence is weak or conflicting, say so explicitly.\",\n\t\t\"- End with a short \\\"Sources\\\" section listing the most relevant URLs.\",\n\t];\n\n\tif (feedback) {\n\t\tsections.push(\"- Incorporate the user feedback provided below into the summary.\");\n\t}\n\n\tsections.push(\"\");\n\tsections.push(\"<search_results>\");\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tsections.push(`\\n[Result ${i + 1}]`);\n\t\tsections.push(summarizeQueryResult(results[i]));\n\t}\n\n\tsections.push(\"\\n</search_results>\");\n\n\tif (feedback) {\n\t\tsections.push(\"\");\n\t\tsections.push(\"<user_feedback>\");\n\t\tsections.push(feedback);\n\t\tsections.push(\"</user_feedback>\");\n\t}\n\n\treturn sections.join(\"\\n\");\n}\n\nfunction buildDeterministicAnswerPreview(answer: string): string {\n\tlet text = answer.replace(/\\s+/g, \" \").trim();\n\tif (text.length === 0) return \"\";\n\n\tconst sourceMarker = text.search(/\\bSources?\\s*:/i);\n\tif (sourceMarker >= 0) text = text.slice(0, sourceMarker).trim();\n\tif (text.length === 0) return \"\";\n\n\treturn text.length > 240 ? `${text.slice(0, 237)}...` : text;\n}\n\nfunction buildDeterministicSummaryLines(results: QueryResultData[]): string[] {\n\tif (results.length === 0) {\n\t\treturn [\n\t\t\t\"No completed search results were available when the curator session finished.\",\n\t\t\t\"\",\n\t\t\t\"Sources\",\n\t\t\t\"- None\",\n\t\t];\n\t}\n\n\tconst lines: string[] = [\n\t\t\"Summary based on the currently selected search results.\",\n\t\t\"\",\n\t];\n\n\tconst sourceUrls: string[] = [];\n\tlet successful = 0;\n\tlet failed = 0;\n\n\tfor (const result of results) {\n\t\tif (result.error) {\n\t\t\tfailed += 1;\n\t\t\tlines.push(`- ${result.query}: failed (${result.error})`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsuccessful += 1;\n\t\tconst preview = buildDeterministicAnswerPreview(result.answer);\n\t\tif (preview.length > 0) {\n\t\t\tlines.push(`- ${result.query}: ${preview}`);\n\t\t} else {\n\t\t\tlines.push(`- ${result.query}: returned ${result.results.length} source${result.results.length === 1 ? \"\" : \"s\"} without answer text.`);\n\t\t}\n\n\t\tfor (const source of result.results) {\n\t\t\tif (!sourceUrls.includes(source.url)) {\n\t\t\t\tsourceUrls.push(source.url);\n\t\t\t}\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(`Completed queries: ${results.length}`);\n\tlines.push(`Successful: ${successful}`);\n\tlines.push(`Failed: ${failed}`);\n\tlines.push(\"\");\n\tlines.push(\"Sources\");\n\n\tif (sourceUrls.length === 0) {\n\t\tlines.push(\"- None\");\n\t} else {\n\t\tfor (const url of sourceUrls.slice(0, 12)) {\n\t\t\tlines.push(`- ${url}`);\n\t\t}\n\t\tif (sourceUrls.length > 12) {\n\t\t\tlines.push(`- ... and ${sourceUrls.length - 12} more`);\n\t\t}\n\t}\n\n\treturn lines;\n}\n\nexport function buildDeterministicSummary(results: QueryResultData[]): { summary: string; meta: SummaryMeta } {\n\tconst summary = buildDeterministicSummaryLines(results).join(\"\\n\").trim();\n\tconst nonEmptySummary = summary.length > 0\n\t\t? summary\n\t\t: \"No completed search results were available when the curator session finished.\\n\\nSources\\n- None\";\n\n\treturn {\n\t\tsummary: nonEmptySummary,\n\t\tmeta: {\n\t\t\tmodel: null,\n\t\t\tdurationMs: 0,\n\t\t\ttokenEstimate: estimateTokens(nonEmptySummary),\n\t\t\tfallbackUsed: true,\n\t\t\tfallbackReason: \"deterministic-submit-fallback\",\n\t\t\tphase: \"deterministic-fallback\",\n\t\t\tedited: false,\n\t\t},\n\t};\n}\n\nfunction parseModelSelector(value: string): { provider: string; id: string; thinkingLevel?: SummaryThinkingLevel } {\n\tconst selector = splitThinkingSuffix(value);\n\tconst slashIndex = selector.value.indexOf(\"/\");\n\tif (slashIndex <= 0 || slashIndex >= selector.value.length - 1) {\n\t\tthrow new Error(`Invalid summary model: ${value}. Use provider/model-id.`);\n\t}\n\treturn {\n\t\tprovider: selector.value.slice(0, slashIndex),\n\t\tid: selector.value.slice(slashIndex + 1),\n\t\tthinkingLevel: selector.thinkingLevel,\n\t};\n}\n\nfunction resolveThinkingLevel(model: Model<Api>, requested?: SummaryThinkingLevel): ModelThinkingLevel | undefined {\n\tif (!requested) return undefined;\n\treturn clampThinkingLevel(model, requested as ModelThinkingLevel);\n}\n\nasync function resolveSummaryModelCandidates(\n\tctx: SummaryGenerationContext,\n\tmodelOverride?: string,\n): Promise<{ candidates: Array<{ model: Model<Api>; apiKey?: string; headers?: ProviderHeaders; thinkingLevel?: SummaryThinkingLevel }>; errors: string[] }> {\n\tconst enabledModelPatterns = loadEnabledModelPatterns(ctx);\n\tconst specs: Array<{ provider: string; id: string; thinkingLevel?: SummaryThinkingLevel }> = [];\n\tconst normalizedOverride = typeof modelOverride === \"string\" ? modelOverride.trim() : \"\";\n\tif (normalizedOverride.length > 0) specs.push(parseModelSelector(normalizedOverride));\n\tspecs.push(...PREFERRED_SUMMARY_MODELS);\n\n\tconst candidates: Array<{ model: Model<Api>; apiKey?: string; headers?: ProviderHeaders; thinkingLevel?: SummaryThinkingLevel }> = [];\n\tconst errors: string[] = [];\n\tconst seen = new Set<string>();\n\tfor (const spec of specs) {\n\t\tconst value = `${spec.provider}/${spec.id}`;\n\t\tif (seen.has(value)) continue;\n\t\tseen.add(value);\n\n\t\tconst model = findModelWithProviderRouting(ctx.modelRegistry, spec.provider, spec.id);\n\t\tif (!model) {\n\t\t\terrors.push(`Summary model not found: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!modelMatchesEnabledPatterns(model, enabledModelPatterns)) {\n\t\t\terrors.push(`Summary model is not enabled: ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (!auth.ok) {\n\t\t\terrors.push(`No API key available for summary model ${value}`);\n\t\t\tcontinue;\n\t\t}\n\t\tcandidates.push({ model, apiKey: auth.apiKey, headers: auth.headers, thinkingLevel: spec.thinkingLevel });\n\t}\n\treturn { candidates, errors };\n}\n\nfunction buildFallbackSummary(\n\tresults: QueryResultData[],\n\tfallbackReason: string,\n\tdurationMs = 0,\n): { summary: string; meta: SummaryMeta } {\n\tconst deterministic = buildDeterministicSummary(results);\n\treturn {\n\t\tsummary: deterministic.summary,\n\t\tmeta: {\n\t\t\t...deterministic.meta,\n\t\t\tdurationMs,\n\t\t\tfallbackReason,\n\t\t},\n\t};\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tconst name = (err as { name?: unknown }).name;\n\tconst message = (err as { message?: unknown }).message;\n\treturn name === \"AbortError\" || (typeof message === \"string\" && message.toLowerCase().includes(\"abort\"));\n}\n\nfunction getTextFromContentPart(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"\";\n\tconst value = part as Record<string, unknown>;\n\tif (typeof value.text === \"string\") return value.text;\n\tif (typeof value.refusal === \"string\") return value.refusal;\n\treturn \"\";\n}\n\nfunction getContentPartType(part: unknown): string {\n\tif (!part || typeof part !== \"object\") return \"unknown\";\n\tconst value = part as Record<string, unknown>;\n\treturn typeof value.type === \"string\" ? value.type : \"unknown\";\n}\n\nexport async function generateSummaryDraft(\n\tresults: QueryResultData[],\n\tctx: SummaryGenerationContext,\n\tsignal?: AbortSignal,\n\tmodelOverride?: string,\n\tfeedback?: string,\n\tcompleteFn?: CompleteFunction,\n\tdeadlineMs = SUMMARY_GENERATION_DEADLINE_MS,\n): Promise<{ summary: string; meta: SummaryMeta }> {\n\tif (!ctx || !ctx.modelRegistry) {\n\t\tthrow new Error(\"Summary generation context unavailable\");\n\t}\n\n\tconst registry = ctx.modelRegistry as SummaryModelRegistry;\n\tconst customCompleteFn = completeFn !== undefined;\n\tconst usesRegistryComplete = !customCompleteFn && typeof registry.complete === \"function\";\n\tcompleteFn ??= usesRegistryComplete ? registry.complete!.bind(registry) as CompleteFunction : complete;\n\n\tconst generationStartedAt = Date.now();\n\tconst deadlineController = new AbortController();\n\tconst deadlineMarker = Symbol(\"summary-generation-deadline\");\n\tlet deadlineTimer: ReturnType<typeof setTimeout> | undefined;\n\tlet resolveDeadline!: () => void;\n\tconst deadlinePromise = new Promise<typeof deadlineMarker>(resolve => {\n\t\tresolveDeadline = () => resolve(deadlineMarker);\n\t\tdeadlineTimer = setTimeout(() => {\n\t\t\tdeadlineController.abort();\n\t\t\tresolveDeadline();\n\t\t}, deadlineMs);\n\t});\n\n\tlet callerAbortListener: (() => void) | undefined;\n\tconst callerAbortPromise = signal\n\t\t? new Promise<never>((_, reject) => {\n\t\t\tcallerAbortListener = () => reject(new Error(\"Aborted\"));\n\t\t\tif (signal.aborted) callerAbortListener();\n\t\t\telse signal.addEventListener(\"abort\", callerAbortListener, { once: true });\n\t\t})\n\t\t: undefined;\n\tconst completionSignal = signal\n\t\t? AbortSignal.any([signal, deadlineController.signal])\n\t\t: deadlineController.signal;\n\n\tasync function raceSummaryOperation<T>(operation: Promise<T>): Promise<T> {\n\t\t// A provider may ignore AbortSignal and never settle; observe it before racing so\n\t\t// its eventual rejection cannot become an unhandled promise rejection.\n\t\tvoid operation.then(() => undefined, () => undefined);\n\t\tconst contenders: Promise<unknown>[] = [operation, deadlinePromise];\n\t\tif (callerAbortPromise) contenders.push(callerAbortPromise);\n\t\tconst result = await Promise.race(contenders);\n\t\tif (result === deadlineMarker) {\n\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\tthrow deadlineMarker;\n\t\t}\n\t\treturn result as T;\n\t}\n\n\ttry {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\tconst prompt = buildSummaryPrompt(results, feedback);\n\t\tlet resolved: Awaited<ReturnType<typeof resolveSummaryModelCandidates>>;\n\t\ttry {\n\t\t\tresolved = await raceSummaryOperation(resolveSummaryModelCandidates(ctx, modelOverride));\n\t\t} catch (err) {\n\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\tif (err === deadlineMarker || deadlineController.signal.aborted) {\n\t\t\t\treturn buildFallbackSummary(results, \"summary-generation-timeout\", Date.now() - generationStartedAt);\n\t\t\t}\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\treturn buildFallbackSummary(results, `summary-model-settings-error: ${message}`, Date.now() - generationStartedAt);\n\t\t}\n\n\t\tlet lastError = resolved.errors.at(-1);\n\t\tfor (const { model, apiKey, headers, thinkingLevel } of resolved.candidates) {\n\t\t\tconst startedAt = Date.now();\n\t\t\ttry {\n\t\t\t\tconst userMessage: Message = {\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: [{ type: \"text\", text: prompt }],\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tconst requestedThinkingLevel = resolveThinkingLevel(model, thinkingLevel);\n\t\t\t\tconst enabledThinkingLevel = requestedThinkingLevel && requestedThinkingLevel !== \"off\"\n\t\t\t\t\t? requestedThinkingLevel as ThinkingLevel\n\t\t\t\t\t: undefined;\n\t\t\t\tconst completionOptions = {\n\t\t\t\t\t...(usesRegistryComplete ? {} : { apiKey, headers }),\n\t\t\t\t\tsignal: completionSignal,\n\t\t\t\t\t...(requestedThinkingLevel ? { reasoning: requestedThinkingLevel } : {}),\n\t\t\t\t\t...(enabledThinkingLevel ? { reasoningEffort: enabledThinkingLevel } : {}),\n\t\t\t\t};\n\t\t\t\tconst completion = thinkingLevel !== undefined && !customCompleteFn && !usesRegistryComplete\n\t\t\t\t\t? completeSimple(model, { messages: [userMessage] }, { apiKey, headers, signal: completionSignal, ...(enabledThinkingLevel ? { reasoning: enabledThinkingLevel } : {}) })\n\t\t\t\t\t: completeFn(model, { messages: [userMessage] }, completionOptions);\n\n\t\t\t\tconst response = await raceSummaryOperation(Promise.resolve(completion));\n\t\t\t\tif (response.stopReason === \"aborted\") {\n\t\t\t\t\tthrow new Error(\"Aborted\");\n\t\t\t\t}\n\n\t\t\t\tconst contentParts = Array.isArray(response.content) ? response.content : [];\n\t\t\t\tconst summary = contentParts\n\t\t\t\t\t.map((part: unknown) => getTextFromContentPart(part))\n\t\t\t\t\t.filter((text: string) => text.trim().length > 0)\n\t\t\t\t\t.join(\"\\n\")\n\t\t\t\t\t.trim();\n\n\t\t\t\tif (summary.length === 0) {\n\t\t\t\t\tconst partTypes = contentParts.map((part: unknown) => getContentPartType(part));\n\t\t\t\t\tconst typesLabel = partTypes.length > 0 ? partTypes.join(\", \") : \"none\";\n\t\t\t\t\tthrow new Error(`Summary model returned empty response (content parts: ${typesLabel})`);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsummary,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tmodel: `${model.provider}/${model.id}`,\n\t\t\t\t\t\tdurationMs: Math.max(0, Date.now() - startedAt),\n\t\t\t\t\t\ttokenEstimate: estimateTokens(summary),\n\t\t\t\t\t\tfallbackUsed: false,\n\t\t\t\t\t\tphase: \"summary-model\",\n\t\t\t\t\t\tedited: false,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\t\t\t\tif (err === deadlineMarker || deadlineController.signal.aborted) {\n\t\t\t\t\treturn buildFallbackSummary(results, \"summary-generation-timeout\", Date.now() - generationStartedAt);\n\t\t\t\t}\n\t\t\t\tif (isAbortError(err)) throw err;\n\t\t\t\tlastError = err instanceof Error ? err.message : String(err);\n\t\t\t}\n\t\t}\n\n\t\treturn buildFallbackSummary(\n\t\t\tresults,\n\t\t\tlastError ? `summary-model-unavailable: ${lastError}` : \"summary-model-unavailable\",\n\t\t\tDate.now() - generationStartedAt,\n\t\t);\n\t} finally {\n\t\tif (deadlineTimer) clearTimeout(deadlineTimer);\n\t\tif (signal && callerAbortListener) signal.removeEventListener(\"abort\", callerAbortListener);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tavily.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tavily.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAyBrE,UAAU,mBAAoB,SAAQ,aAAa;IAClD,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AA8HD,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CA6DhH","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { fetchWithCredentialRedirects, getWebSearchConfigPath, resolveApiBaseUrl } from \"./utils.ts\";\n\nconst TAVILY_API_BASE_URL = \"https://api.tavily.com\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\ninterface WebSearchConfig {\n\ttavilyApiKey?: unknown;\n\ttavilyBaseUrl?: unknown;\n}\n\ninterface TavilyResult {\n\ttitle?: string;\n\turl?: string;\n\tcontent?: string;\n\traw_content?: string | null;\n}\n\ninterface TavilyResponse {\n\tanswer?: string;\n\tresults?: TavilyResult[];\n}\n\ninterface TavilySearchOptions 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\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string | null> {\n\treturn resolveCredential({\n\t\tprovider: \"Tavily\",\n\t\tconfiguredValue: loadConfig().tavilyApiKey,\n\t\tenvironmentValue: process.env.TAVILY_API_KEY,\n\t\tsignal,\n\t});\n}\n\nfunction getApiUrl(): string {\n\treturn `${resolveApiBaseUrl({\n\t\tconfigKey: \"tavilyBaseUrl\",\n\t\tconfiguredValue: loadConfig().tavilyBaseUrl,\n\t\tdefaultValue: TAVILY_API_BASE_URL,\n\t\tenvironmentKey: \"TAVILY_BASE_URL\",\n\t\tenvironmentValue: process.env.TAVILY_BASE_URL,\n\t})}/search`;\n}\n\nasync function requireApiKey(signal?: AbortSignal): Promise<string> {\n\tconst apiKey = await getApiKey(signal);\n\tif (!apiKey) {\n\t\tthrow new Error(\n\t\t\t\"Tavily API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"tavilyApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set TAVILY_API_KEY environment variable\\n\" +\n\t\t\t\"Get a key at https://app.tavily.com/\",\n\t\t);\n\t}\n\treturn apiKey;\n}\n\nfunction normalizeCount(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_domains?: string[]; exclude_domains?: string[] } {\n\tif (!domainFilter?.length) return {};\n\tconst include_domains: string[] = [];\n\tconst exclude_domains: 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_domains : include_domains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn {\n\t\t...(include_domains.length > 0 ? { include_domains } : {}),\n\t\t...(exclude_domains.length > 0 ? { exclude_domains } : {}),\n\t};\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n\tconst timeout = AbortSignal.timeout(SEARCH_TIMEOUT_MS);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction mapResults(results: TavilyResult[] | undefined, numResults: number): SearchResponse[\"results\"] {\n\tif (!Array.isArray(results)) return [];\n\tconst mapped: SearchResponse[\"results\"] = [];\n\tfor (const item of results) {\n\t\tif (!item?.url) continue;\n\t\tmapped.push({\n\t\t\ttitle: item.title || `Source ${mapped.length + 1}`,\n\t\t\turl: item.url,\n\t\t\tsnippet: typeof item.content === \"string\" ? item.content.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t});\n\t\tif (mapped.length >= numResults) break;\n\t}\n\treturn mapped;\n}\n\nfunction mapInlineContent(results: TavilyResult[] | undefined): ExtractedContent[] {\n\tif (!Array.isArray(results)) return [];\n\treturn results.flatMap((item) => {\n\t\tif (!item?.url || typeof item.raw_content !== \"string\" || item.raw_content.trim().length === 0) return [];\n\t\treturn [{\n\t\t\turl: item.url,\n\t\t\ttitle: item.title || \"\",\n\t\t\tcontent: item.raw_content,\n\t\t\terror: null,\n\t\t}];\n\t});\n}\n\nexport function isTavilyAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"Tavily\",\n\t\tconfiguredValue: loadConfig().tavilyApiKey,\n\t\tenvironmentValue: process.env.TAVILY_API_KEY,\n\t});\n}\n\nexport async function searchWithTavily(query: string, options: TavilySearchOptions = {}): Promise<SearchResponse> {\n\tconst apiUrl = getApiUrl();\n\tconst apiKey = await requireApiKey(options.signal);\n\tconst numResults = normalizeCount(options.numResults);\n\tconst body: Record<string, unknown> = {\n\t\tquery,\n\t\tsearch_depth: \"basic\",\n\t\tmax_results: numResults,\n\t\tinclude_answer: \"basic\",\n\t\tinclude_raw_content: options.includeContent ? \"markdown\" : false,\n\t\t...(options.recencyFilter ? { time_range: options.recencyFilter } : {}),\n\t\t...mapDomainFilter(options.domainFilter),\n\t};\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetchWithCredentialRedirects(apiUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Authorization\": `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(options.signal),\n\t\t}, [\"Authorization\"]);\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\tif (!response.ok) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tconst errorText = redactCredential(await response.text(), apiKey);\n\t\tthrow new Error(`Tavily API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t}\n\n\tlet data: TavilyResponse;\n\ttry {\n\t\tdata = await response.json() as TavilyResponse;\n\t} catch (err) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tthrow new Error(`Tavily API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n\n\tactivityMonitor.logComplete(activityId, response.status);\n\tconst result: SearchResponse = {\n\t\tanswer: typeof data.answer === \"string\" ? data.answer : \"\",\n\t\tresults: mapResults(data.results, numResults),\n\t};\n\tif (options.includeContent) {\n\t\tconst inlineContent = mapInlineContent(data.results);\n\t\tif (inlineContent.length > 0) result.inlineContent = inlineContent;\n\t}\n\treturn result;\n}\n"]}
1
+ {"version":3,"file":"tavily.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tavily.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAyBrE,UAAU,mBAAoB,SAAQ,aAAa;IAClD,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AA8HD,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CA6DhH"}
@@ -1 +1 @@
1
- {"version":3,"file":"tavily.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tavily.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { fetchWithCredentialRedirects, getWebSearchConfigPath, resolveApiBaseUrl } from \"./utils.ts\";\n\nconst TAVILY_API_BASE_URL = \"https://api.tavily.com\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\ninterface WebSearchConfig {\n\ttavilyApiKey?: unknown;\n\ttavilyBaseUrl?: unknown;\n}\n\ninterface TavilyResult {\n\ttitle?: string;\n\turl?: string;\n\tcontent?: string;\n\traw_content?: string | null;\n}\n\ninterface TavilyResponse {\n\tanswer?: string;\n\tresults?: TavilyResult[];\n}\n\ninterface TavilySearchOptions 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\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string | null> {\n\treturn resolveCredential({\n\t\tprovider: \"Tavily\",\n\t\tconfiguredValue: loadConfig().tavilyApiKey,\n\t\tenvironmentValue: process.env.TAVILY_API_KEY,\n\t\tsignal,\n\t});\n}\n\nfunction getApiUrl(): string {\n\treturn `${resolveApiBaseUrl({\n\t\tconfigKey: \"tavilyBaseUrl\",\n\t\tconfiguredValue: loadConfig().tavilyBaseUrl,\n\t\tdefaultValue: TAVILY_API_BASE_URL,\n\t\tenvironmentKey: \"TAVILY_BASE_URL\",\n\t\tenvironmentValue: process.env.TAVILY_BASE_URL,\n\t})}/search`;\n}\n\nasync function requireApiKey(signal?: AbortSignal): Promise<string> {\n\tconst apiKey = await getApiKey(signal);\n\tif (!apiKey) {\n\t\tthrow new Error(\n\t\t\t\"Tavily API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"tavilyApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set TAVILY_API_KEY environment variable\\n\" +\n\t\t\t\"Get a key at https://app.tavily.com/\",\n\t\t);\n\t}\n\treturn apiKey;\n}\n\nfunction normalizeCount(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_domains?: string[]; exclude_domains?: string[] } {\n\tif (!domainFilter?.length) return {};\n\tconst include_domains: string[] = [];\n\tconst exclude_domains: 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_domains : include_domains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn {\n\t\t...(include_domains.length > 0 ? { include_domains } : {}),\n\t\t...(exclude_domains.length > 0 ? { exclude_domains } : {}),\n\t};\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n\tconst timeout = AbortSignal.timeout(SEARCH_TIMEOUT_MS);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction mapResults(results: TavilyResult[] | undefined, numResults: number): SearchResponse[\"results\"] {\n\tif (!Array.isArray(results)) return [];\n\tconst mapped: SearchResponse[\"results\"] = [];\n\tfor (const item of results) {\n\t\tif (!item?.url) continue;\n\t\tmapped.push({\n\t\t\ttitle: item.title || `Source ${mapped.length + 1}`,\n\t\t\turl: item.url,\n\t\t\tsnippet: typeof item.content === \"string\" ? item.content.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t});\n\t\tif (mapped.length >= numResults) break;\n\t}\n\treturn mapped;\n}\n\nfunction mapInlineContent(results: TavilyResult[] | undefined): ExtractedContent[] {\n\tif (!Array.isArray(results)) return [];\n\treturn results.flatMap((item) => {\n\t\tif (!item?.url || typeof item.raw_content !== \"string\" || item.raw_content.trim().length === 0) return [];\n\t\treturn [{\n\t\t\turl: item.url,\n\t\t\ttitle: item.title || \"\",\n\t\t\tcontent: item.raw_content,\n\t\t\terror: null,\n\t\t}];\n\t});\n}\n\nexport function isTavilyAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"Tavily\",\n\t\tconfiguredValue: loadConfig().tavilyApiKey,\n\t\tenvironmentValue: process.env.TAVILY_API_KEY,\n\t});\n}\n\nexport async function searchWithTavily(query: string, options: TavilySearchOptions = {}): Promise<SearchResponse> {\n\tconst apiUrl = getApiUrl();\n\tconst apiKey = await requireApiKey(options.signal);\n\tconst numResults = normalizeCount(options.numResults);\n\tconst body: Record<string, unknown> = {\n\t\tquery,\n\t\tsearch_depth: \"basic\",\n\t\tmax_results: numResults,\n\t\tinclude_answer: \"basic\",\n\t\tinclude_raw_content: options.includeContent ? \"markdown\" : false,\n\t\t...(options.recencyFilter ? { time_range: options.recencyFilter } : {}),\n\t\t...mapDomainFilter(options.domainFilter),\n\t};\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetchWithCredentialRedirects(apiUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Authorization\": `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(options.signal),\n\t\t}, [\"Authorization\"]);\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\tif (!response.ok) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tconst errorText = redactCredential(await response.text(), apiKey);\n\t\tthrow new Error(`Tavily API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t}\n\n\tlet data: TavilyResponse;\n\ttry {\n\t\tdata = await response.json() as TavilyResponse;\n\t} catch (err) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tthrow new Error(`Tavily API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n\n\tactivityMonitor.logComplete(activityId, response.status);\n\tconst result: SearchResponse = {\n\t\tanswer: typeof data.answer === \"string\" ? data.answer : \"\",\n\t\tresults: mapResults(data.results, numResults),\n\t};\n\tif (options.includeContent) {\n\t\tconst inlineContent = mapInlineContent(data.results);\n\t\tif (inlineContent.length > 0) result.inlineContent = inlineContent;\n\t}\n\treturn result;\n}\n"]}
1
+ {"version":3,"file":"tavily.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tavily.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { fetchWithCredentialRedirects, getWebSearchConfigPath, resolveApiBaseUrl } from \"./utils.ts\";\n\nconst TAVILY_API_BASE_URL = \"https://api.tavily.com\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\n\ninterface WebSearchConfig {\n\ttavilyApiKey?: unknown;\n\ttavilyBaseUrl?: unknown;\n}\n\ninterface TavilyResult {\n\ttitle?: string;\n\turl?: string;\n\tcontent?: string;\n\traw_content?: string | null;\n}\n\ninterface TavilyResponse {\n\tanswer?: string;\n\tresults?: TavilyResult[];\n}\n\ninterface TavilySearchOptions 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\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string | null> {\n\treturn resolveCredential({\n\t\tprovider: \"Tavily\",\n\t\tconfiguredValue: loadConfig().tavilyApiKey,\n\t\tenvironmentValue: process.env.TAVILY_API_KEY,\n\t\tsignal,\n\t});\n}\n\nfunction getApiUrl(): string {\n\treturn `${resolveApiBaseUrl({\n\t\tconfigKey: \"tavilyBaseUrl\",\n\t\tconfiguredValue: loadConfig().tavilyBaseUrl,\n\t\tdefaultValue: TAVILY_API_BASE_URL,\n\t\tenvironmentKey: \"TAVILY_BASE_URL\",\n\t\tenvironmentValue: process.env.TAVILY_BASE_URL,\n\t})}/search`;\n}\n\nasync function requireApiKey(signal?: AbortSignal): Promise<string> {\n\tconst apiKey = await getApiKey(signal);\n\tif (!apiKey) {\n\t\tthrow new Error(\n\t\t\t\"Tavily API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"tavilyApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set TAVILY_API_KEY environment variable\\n\" +\n\t\t\t\"Get a key at https://app.tavily.com/\",\n\t\t);\n\t}\n\treturn apiKey;\n}\n\nfunction normalizeCount(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_domains?: string[]; exclude_domains?: string[] } {\n\tif (!domainFilter?.length) return {};\n\tconst include_domains: string[] = [];\n\tconst exclude_domains: 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_domains : include_domains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn {\n\t\t...(include_domains.length > 0 ? { include_domains } : {}),\n\t\t...(exclude_domains.length > 0 ? { exclude_domains } : {}),\n\t};\n}\n\nfunction requestSignal(signal?: AbortSignal): AbortSignal {\n\tconst timeout = AbortSignal.timeout(SEARCH_TIMEOUT_MS);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction mapResults(results: TavilyResult[] | undefined, numResults: number): SearchResponse[\"results\"] {\n\tif (!Array.isArray(results)) return [];\n\tconst mapped: SearchResponse[\"results\"] = [];\n\tfor (const item of results) {\n\t\tif (!item?.url) continue;\n\t\tmapped.push({\n\t\t\ttitle: item.title || `Source ${mapped.length + 1}`,\n\t\t\turl: item.url,\n\t\t\tsnippet: typeof item.content === \"string\" ? item.content.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t});\n\t\tif (mapped.length >= numResults) break;\n\t}\n\treturn mapped;\n}\n\nfunction mapInlineContent(results: TavilyResult[] | undefined): ExtractedContent[] {\n\tif (!Array.isArray(results)) return [];\n\treturn results.flatMap((item) => {\n\t\tif (!item?.url || typeof item.raw_content !== \"string\" || item.raw_content.trim().length === 0) return [];\n\t\treturn [{\n\t\t\turl: item.url,\n\t\t\ttitle: item.title || \"\",\n\t\t\tcontent: item.raw_content,\n\t\t\terror: null,\n\t\t}];\n\t});\n}\n\nexport function isTavilyAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"Tavily\",\n\t\tconfiguredValue: loadConfig().tavilyApiKey,\n\t\tenvironmentValue: process.env.TAVILY_API_KEY,\n\t});\n}\n\nexport async function searchWithTavily(query: string, options: TavilySearchOptions = {}): Promise<SearchResponse> {\n\tconst apiUrl = getApiUrl();\n\tconst apiKey = await requireApiKey(options.signal);\n\tconst numResults = normalizeCount(options.numResults);\n\tconst body: Record<string, unknown> = {\n\t\tquery,\n\t\tsearch_depth: \"basic\",\n\t\tmax_results: numResults,\n\t\tinclude_answer: \"basic\",\n\t\tinclude_raw_content: options.includeContent ? \"markdown\" : false,\n\t\t...(options.recencyFilter ? { time_range: options.recencyFilter } : {}),\n\t\t...mapDomainFilter(options.domainFilter),\n\t};\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetchWithCredentialRedirects(apiUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Authorization\": `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(options.signal),\n\t\t}, [\"Authorization\"]);\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\tif (!response.ok) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tconst errorText = redactCredential(await response.text(), apiKey);\n\t\tthrow new Error(`Tavily API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t}\n\n\tlet data: TavilyResponse;\n\ttry {\n\t\tdata = await response.json() as TavilyResponse;\n\t} catch (err) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tthrow new Error(`Tavily API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n\n\tactivityMonitor.logComplete(activityId, response.status);\n\tconst result: SearchResponse = {\n\t\tanswer: typeof data.answer === \"string\" ? data.answer : \"\",\n\t\tresults: mapResults(data.results, numResults),\n\t};\n\tif (options.includeContent) {\n\t\tconst inlineContent = mapInlineContent(data.results);\n\t\tif (inlineContent.length > 0) result.inlineContent = inlineContent;\n\t}\n\treturn result;\n}\n"]}