@humain/terminal 0.0.2 → 0.0.3-beta.0

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 (680) hide show
  1. package/CHANGELOG.md +241 -24
  2. package/README.md +143 -119
  3. package/dist/cli/args.d.ts +4 -2
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +37 -39
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/auth-check.d.ts +19 -0
  8. package/dist/cli/auth-check.d.ts.map +1 -0
  9. package/dist/cli/auth-check.js +50 -0
  10. package/dist/cli/auth-check.js.map +1 -0
  11. package/dist/cli/auth-command.d.ts +24 -0
  12. package/dist/cli/auth-command.d.ts.map +1 -0
  13. package/dist/cli/auth-command.js +103 -0
  14. package/dist/cli/auth-command.js.map +1 -0
  15. package/dist/cli/config-selector.d.ts.map +1 -1
  16. package/dist/cli/config-selector.js +2 -2
  17. package/dist/cli/config-selector.js.map +1 -1
  18. package/dist/cli/credential-print.d.ts +5 -15
  19. package/dist/cli/credential-print.d.ts.map +1 -1
  20. package/dist/cli/credential-print.js +42 -83
  21. package/dist/cli/credential-print.js.map +1 -1
  22. package/dist/cli/experimental/auth.d.ts +16 -0
  23. package/dist/cli/experimental/auth.d.ts.map +1 -0
  24. package/dist/cli/experimental/auth.js +13 -0
  25. package/dist/cli/experimental/auth.js.map +1 -0
  26. package/dist/cli/experimental/cli.d.ts +6 -0
  27. package/dist/cli/experimental/cli.d.ts.map +1 -0
  28. package/dist/cli/experimental/cli.js +5 -0
  29. package/dist/cli/experimental/cli.js.map +1 -0
  30. package/dist/cli/experimental/command-options.d.ts +17 -0
  31. package/dist/cli/experimental/command-options.d.ts.map +1 -0
  32. package/dist/cli/experimental/command-options.js +35 -0
  33. package/dist/cli/experimental/command-options.js.map +1 -0
  34. package/dist/cli/experimental/command.d.ts +63 -0
  35. package/dist/cli/experimental/command.d.ts.map +1 -0
  36. package/dist/cli/experimental/command.js +130 -0
  37. package/dist/cli/experimental/command.js.map +1 -0
  38. package/dist/cli/experimental/commands/client.d.ts +13 -0
  39. package/dist/cli/experimental/commands/client.d.ts.map +1 -0
  40. package/dist/cli/experimental/commands/client.js +25 -0
  41. package/dist/cli/experimental/commands/client.js.map +1 -0
  42. package/dist/cli/experimental/commands/pi.d.ts +15 -0
  43. package/dist/cli/experimental/commands/pi.d.ts.map +1 -0
  44. package/dist/cli/experimental/commands/pi.js +28 -0
  45. package/dist/cli/experimental/commands/pi.js.map +1 -0
  46. package/dist/cli/experimental/commands/server.d.ts +13 -0
  47. package/dist/cli/experimental/commands/server.d.ts.map +1 -0
  48. package/dist/cli/experimental/commands/server.js +25 -0
  49. package/dist/cli/experimental/commands/server.js.map +1 -0
  50. package/dist/cli/experimental/transport-address.d.ts +10 -0
  51. package/dist/cli/experimental/transport-address.d.ts.map +1 -0
  52. package/dist/cli/experimental/transport-address.js +38 -0
  53. package/dist/cli/experimental/transport-address.js.map +1 -0
  54. package/dist/cli/list-models.d.ts +1 -1
  55. package/dist/cli/list-models.d.ts.map +1 -1
  56. package/dist/cli/list-models.js +2 -2
  57. package/dist/cli/list-models.js.map +1 -1
  58. package/dist/cli/startup-ui.d.ts +1 -1
  59. package/dist/cli/startup-ui.d.ts.map +1 -1
  60. package/dist/cli/startup-ui.js +2 -2
  61. package/dist/cli/startup-ui.js.map +1 -1
  62. package/dist/client/index.d.ts +3 -0
  63. package/dist/client/index.d.ts.map +1 -0
  64. package/dist/client/index.js +3 -0
  65. package/dist/client/index.js.map +1 -0
  66. package/dist/client/remote-session.d.ts +53 -0
  67. package/dist/client/remote-session.d.ts.map +1 -0
  68. package/dist/client/remote-session.js +340 -0
  69. package/dist/client/remote-session.js.map +1 -0
  70. package/dist/client/transcript.d.ts +12 -0
  71. package/dist/client/transcript.d.ts.map +1 -0
  72. package/dist/client/transcript.js +98 -0
  73. package/dist/client/transcript.js.map +1 -0
  74. package/dist/core/agent-session-services.d.ts +1 -0
  75. package/dist/core/agent-session-services.d.ts.map +1 -1
  76. package/dist/core/agent-session-services.js +1 -0
  77. package/dist/core/agent-session-services.js.map +1 -1
  78. package/dist/core/agent-session.d.ts +1 -10
  79. package/dist/core/agent-session.d.ts.map +1 -1
  80. package/dist/core/agent-session.js +72 -70
  81. package/dist/core/agent-session.js.map +1 -1
  82. package/dist/core/auth-storage.d.ts +25 -9
  83. package/dist/core/auth-storage.d.ts.map +1 -1
  84. package/dist/core/auth-storage.js +237 -39
  85. package/dist/core/auth-storage.js.map +1 -1
  86. package/dist/core/extensions/index.d.ts +1 -1
  87. package/dist/core/extensions/index.d.ts.map +1 -1
  88. package/dist/core/extensions/index.js.map +1 -1
  89. package/dist/core/extensions/loader.d.ts.map +1 -1
  90. package/dist/core/extensions/loader.js +60 -41
  91. package/dist/core/extensions/loader.js.map +1 -1
  92. package/dist/core/extensions/runner.d.ts +2 -1
  93. package/dist/core/extensions/runner.d.ts.map +1 -1
  94. package/dist/core/extensions/runner.js +3 -0
  95. package/dist/core/extensions/runner.js.map +1 -1
  96. package/dist/core/extensions/types.d.ts +27 -4
  97. package/dist/core/extensions/types.d.ts.map +1 -1
  98. package/dist/core/extensions/types.js.map +1 -1
  99. package/dist/core/http-dispatcher.d.ts.map +1 -1
  100. package/dist/core/http-dispatcher.js +5 -0
  101. package/dist/core/http-dispatcher.js.map +1 -1
  102. package/dist/core/keybindings.d.ts +45 -5
  103. package/dist/core/keybindings.d.ts.map +1 -1
  104. package/dist/core/keybindings.js.map +1 -1
  105. package/dist/core/model-config.d.ts +29 -5
  106. package/dist/core/model-config.d.ts.map +1 -1
  107. package/dist/core/model-config.js +4 -0
  108. package/dist/core/model-config.js.map +1 -1
  109. package/dist/core/model-registry.d.ts +5 -3
  110. package/dist/core/model-registry.d.ts.map +1 -1
  111. package/dist/core/model-registry.js +13 -10
  112. package/dist/core/model-registry.js.map +1 -1
  113. package/dist/core/model-resolver.d.ts +4 -3
  114. package/dist/core/model-resolver.d.ts.map +1 -1
  115. package/dist/core/model-resolver.js +42 -10
  116. package/dist/core/model-resolver.js.map +1 -1
  117. package/dist/core/model-runtime.d.ts +30 -13
  118. package/dist/core/model-runtime.d.ts.map +1 -1
  119. package/dist/core/model-runtime.js +233 -73
  120. package/dist/core/model-runtime.js.map +1 -1
  121. package/dist/core/models-store.d.ts +12 -7
  122. package/dist/core/models-store.d.ts.map +1 -1
  123. package/dist/core/models-store.js +83 -14
  124. package/dist/core/models-store.js.map +1 -1
  125. package/dist/core/package-manager.d.ts +6 -3
  126. package/dist/core/package-manager.d.ts.map +1 -1
  127. package/dist/core/package-manager.js +80 -61
  128. package/dist/core/package-manager.js.map +1 -1
  129. package/dist/core/pi-manifest.d.ts +8 -0
  130. package/dist/core/pi-manifest.d.ts.map +1 -0
  131. package/dist/core/pi-manifest.js +28 -0
  132. package/dist/core/pi-manifest.js.map +1 -0
  133. package/dist/core/provider-composer.d.ts +4 -1
  134. package/dist/core/provider-composer.d.ts.map +1 -1
  135. package/dist/core/provider-composer.js +36 -15
  136. package/dist/core/provider-composer.js.map +1 -1
  137. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  138. package/dist/core/remote-catalog-provider.js +73 -67
  139. package/dist/core/remote-catalog-provider.js.map +1 -1
  140. package/dist/core/resource-loader.d.ts.map +1 -1
  141. package/dist/core/resource-loader.js +2 -2
  142. package/dist/core/resource-loader.js.map +1 -1
  143. package/dist/core/runtime-credentials.d.ts +5 -5
  144. package/dist/core/runtime-credentials.d.ts.map +1 -1
  145. package/dist/core/runtime-credentials.js +11 -8
  146. package/dist/core/runtime-credentials.js.map +1 -1
  147. package/dist/core/sdk.d.ts +1 -1
  148. package/dist/core/sdk.d.ts.map +1 -1
  149. package/dist/core/sdk.js +2 -2
  150. package/dist/core/sdk.js.map +1 -1
  151. package/dist/core/session-manager.d.ts.map +1 -1
  152. package/dist/core/session-manager.js +3 -1
  153. package/dist/core/session-manager.js.map +1 -1
  154. package/dist/core/settings-manager.d.ts +12 -0
  155. package/dist/core/settings-manager.d.ts.map +1 -1
  156. package/dist/core/settings-manager.js +40 -16
  157. package/dist/core/settings-manager.js.map +1 -1
  158. package/dist/core/system-prompt.d.ts.map +1 -1
  159. package/dist/core/system-prompt.js +8 -0
  160. package/dist/core/system-prompt.js.map +1 -1
  161. package/dist/core/tools/bash.d.ts +5 -1
  162. package/dist/core/tools/bash.d.ts.map +1 -1
  163. package/dist/core/tools/bash.js +16 -15
  164. package/dist/core/tools/bash.js.map +1 -1
  165. package/dist/core/tools/edit.d.ts +4 -0
  166. package/dist/core/tools/edit.d.ts.map +1 -1
  167. package/dist/core/tools/edit.js +11 -7
  168. package/dist/core/tools/edit.js.map +1 -1
  169. package/dist/core/tools/find.d.ts +7 -0
  170. package/dist/core/tools/find.d.ts.map +1 -1
  171. package/dist/core/tools/find.js +16 -19
  172. package/dist/core/tools/find.js.map +1 -1
  173. package/dist/core/tools/grep.d.ts +4 -0
  174. package/dist/core/tools/grep.d.ts.map +1 -1
  175. package/dist/core/tools/grep.js +5 -1
  176. package/dist/core/tools/grep.js.map +1 -1
  177. package/dist/core/tools/ls.d.ts +4 -0
  178. package/dist/core/tools/ls.d.ts.map +1 -1
  179. package/dist/core/tools/ls.js +5 -1
  180. package/dist/core/tools/ls.js.map +1 -1
  181. package/dist/core/tools/read.d.ts +4 -0
  182. package/dist/core/tools/read.d.ts.map +1 -1
  183. package/dist/core/tools/read.js +7 -3
  184. package/dist/core/tools/read.js.map +1 -1
  185. package/dist/core/tools/write.d.ts +4 -0
  186. package/dist/core/tools/write.d.ts.map +1 -1
  187. package/dist/core/tools/write.js +6 -2
  188. package/dist/core/tools/write.js.map +1 -1
  189. package/dist/extensions/llama/index.d.ts.map +1 -1
  190. package/dist/extensions/llama/index.js +11 -2
  191. package/dist/extensions/llama/index.js.map +1 -1
  192. package/dist/extensions/llama/provider.d.ts.map +1 -1
  193. package/dist/extensions/llama/provider.js +21 -7
  194. package/dist/extensions/llama/provider.js.map +1 -1
  195. package/dist/humain/agent-execution-protocol.d.ts +218 -0
  196. package/dist/humain/agent-execution-protocol.d.ts.map +1 -0
  197. package/dist/humain/agent-execution-protocol.js +204 -0
  198. package/dist/humain/agent-execution-protocol.js.map +1 -0
  199. package/dist/humain/agent-execution-runtime.d.ts +35 -0
  200. package/dist/humain/agent-execution-runtime.d.ts.map +1 -0
  201. package/dist/humain/agent-execution-runtime.js +170 -0
  202. package/dist/humain/agent-execution-runtime.js.map +1 -0
  203. package/dist/humain/index.d.ts.map +1 -1
  204. package/dist/humain/index.js +8 -7
  205. package/dist/humain/index.js.map +1 -1
  206. package/dist/humain/mcp-adapter/vendor/CHANGELOG.md +660 -0
  207. package/dist/humain/mcp-adapter/vendor/LICENSE +21 -0
  208. package/dist/humain/mcp-adapter/vendor/README.md +733 -0
  209. package/dist/humain/mcp-adapter/vendor/abort.ts +34 -0
  210. package/dist/humain/mcp-adapter/vendor/agent-dir.ts +60 -0
  211. package/dist/humain/mcp-adapter/vendor/agent-plugin-loader.ts +377 -0
  212. package/dist/humain/mcp-adapter/vendor/app-bridge.bundle.js +67 -0
  213. package/dist/humain/mcp-adapter/vendor/banner.png +0 -0
  214. package/dist/humain/mcp-adapter/vendor/cli.js +209 -0
  215. package/dist/humain/mcp-adapter/vendor/commands.ts +627 -0
  216. package/dist/humain/mcp-adapter/vendor/config.ts +1226 -0
  217. package/dist/humain/mcp-adapter/vendor/consent-manager.ts +64 -0
  218. package/dist/humain/mcp-adapter/vendor/direct-tools.ts +604 -0
  219. package/dist/humain/mcp-adapter/vendor/elicitation-handler.ts +348 -0
  220. package/dist/humain/mcp-adapter/vendor/error-signal.ts +21 -0
  221. package/dist/humain/mcp-adapter/vendor/errors.ts +223 -0
  222. package/dist/humain/mcp-adapter/vendor/glimpse-ui.ts +80 -0
  223. package/dist/humain/mcp-adapter/vendor/host-html-template.ts +461 -0
  224. package/dist/humain/mcp-adapter/vendor/index.bundle.d.mts +4 -0
  225. package/dist/humain/mcp-adapter/vendor/index.bundle.mjs +15923 -0
  226. package/dist/humain/mcp-adapter/vendor/index.ts +898 -0
  227. package/dist/humain/mcp-adapter/vendor/init.ts +649 -0
  228. package/dist/humain/mcp-adapter/vendor/json-schema-validator.ts +69 -0
  229. package/dist/humain/mcp-adapter/vendor/lifecycle.ts +147 -0
  230. package/dist/humain/mcp-adapter/vendor/logger.ts +169 -0
  231. package/dist/humain/mcp-adapter/vendor/mcp-auth-flow.ts +993 -0
  232. package/dist/humain/mcp-adapter/vendor/mcp-auth.ts +1000 -0
  233. package/dist/humain/mcp-adapter/vendor/mcp-callback-server.ts +510 -0
  234. package/dist/humain/mcp-adapter/vendor/mcp-code.ts +354 -0
  235. package/dist/humain/mcp-adapter/vendor/mcp-keyring-helper.cjs +89 -0
  236. package/dist/humain/mcp-adapter/vendor/mcp-oauth-provider.ts +616 -0
  237. package/dist/humain/mcp-adapter/vendor/mcp-output-guard.ts +408 -0
  238. package/dist/humain/mcp-adapter/vendor/mcp-panel.ts +1015 -0
  239. package/dist/humain/mcp-adapter/vendor/mcp-probe.ts +187 -0
  240. package/dist/humain/mcp-adapter/vendor/mcp-script-worker.mjs +130 -0
  241. package/dist/humain/mcp-adapter/vendor/mcp-setup-panel.ts +666 -0
  242. package/dist/humain/mcp-adapter/vendor/mcp-status.ts +109 -0
  243. package/dist/humain/mcp-adapter/vendor/mcp-trace.ts +306 -0
  244. package/dist/humain/mcp-adapter/vendor/metadata-cache.ts +353 -0
  245. package/dist/humain/mcp-adapter/vendor/npx-resolver.ts +543 -0
  246. package/dist/humain/mcp-adapter/vendor/oauth-handler.ts +30 -0
  247. package/dist/humain/mcp-adapter/vendor/oauth.ts +48 -0
  248. package/dist/humain/mcp-adapter/vendor/onboarding-state.ts +76 -0
  249. package/dist/humain/mcp-adapter/vendor/package.json +178 -0
  250. package/dist/humain/mcp-adapter/vendor/panel-keys.ts +53 -0
  251. package/dist/humain/mcp-adapter/vendor/prompts.ts +353 -0
  252. package/dist/humain/mcp-adapter/vendor/proxy-modes.ts +1331 -0
  253. package/dist/humain/mcp-adapter/vendor/resource-tools.ts +17 -0
  254. package/dist/humain/mcp-adapter/vendor/runtime-owner.ts +91 -0
  255. package/dist/humain/mcp-adapter/vendor/sampling-handler.ts +284 -0
  256. package/dist/humain/mcp-adapter/vendor/search-ranking.ts +206 -0
  257. package/dist/humain/mcp-adapter/vendor/server-manager.ts +1124 -0
  258. package/dist/humain/mcp-adapter/vendor/session-recovery.ts +151 -0
  259. package/dist/humain/mcp-adapter/vendor/skills/mcp-scripting/SKILL.md +38 -0
  260. package/dist/humain/mcp-adapter/vendor/state.ts +62 -0
  261. package/dist/humain/mcp-adapter/vendor/tool-approval.ts +182 -0
  262. package/dist/humain/mcp-adapter/vendor/tool-metadata.ts +276 -0
  263. package/dist/humain/mcp-adapter/vendor/tool-registrar.ts +253 -0
  264. package/dist/humain/mcp-adapter/vendor/tool-result-renderer.ts +423 -0
  265. package/dist/humain/mcp-adapter/vendor/ts-shape.ts +149 -0
  266. package/dist/humain/mcp-adapter/vendor/types.ts +859 -0
  267. package/dist/humain/mcp-adapter/vendor/ui-app-bridge-helpers.ts +40 -0
  268. package/dist/humain/mcp-adapter/vendor/ui-resource-handler.ts +250 -0
  269. package/dist/humain/mcp-adapter/vendor/ui-server.ts +866 -0
  270. package/dist/humain/mcp-adapter/vendor/ui-session.ts +570 -0
  271. package/dist/humain/mcp-adapter/vendor/ui-stream-types.ts +89 -0
  272. package/dist/humain/mcp-adapter/vendor/ui-tool-visibility.ts +25 -0
  273. package/dist/humain/mcp-adapter/vendor/unix-socket-transport.ts +85 -0
  274. package/dist/humain/mcp-adapter/vendor/utils.ts +310 -0
  275. package/dist/humain/mcp-adapter.d.ts +3 -0
  276. package/dist/humain/mcp-adapter.d.ts.map +1 -0
  277. package/dist/humain/mcp-adapter.js +5 -0
  278. package/dist/humain/mcp-adapter.js.map +1 -0
  279. package/dist/humain/pi-agent-execution-host.d.ts +34 -0
  280. package/dist/humain/pi-agent-execution-host.d.ts.map +1 -0
  281. package/dist/humain/pi-agent-execution-host.js +77 -0
  282. package/dist/humain/pi-agent-execution-host.js.map +1 -0
  283. package/dist/humain/web-access/host.d.ts +4 -0
  284. package/dist/humain/web-access/host.d.ts.map +1 -0
  285. package/dist/humain/web-access/host.js +3 -0
  286. package/dist/humain/web-access/host.js.map +1 -0
  287. package/dist/humain/web-access/index.d.ts +3 -0
  288. package/dist/humain/web-access/index.d.ts.map +1 -0
  289. package/dist/humain/web-access/index.js +5 -0
  290. package/dist/humain/web-access/index.js.map +1 -0
  291. package/dist/humain/web-access/vendor/activity.d.ts +34 -0
  292. package/dist/humain/web-access/vendor/activity.d.ts.map +1 -0
  293. package/dist/humain/web-access/vendor/activity.js +68 -0
  294. package/dist/humain/web-access/vendor/activity.js.map +1 -0
  295. package/dist/humain/web-access/vendor/anysearch.d.ts +8 -0
  296. package/dist/humain/web-access/vendor/anysearch.d.ts.map +1 -0
  297. package/dist/humain/web-access/vendor/anysearch.js +167 -0
  298. package/dist/humain/web-access/vendor/anysearch.js.map +1 -0
  299. package/dist/humain/web-access/vendor/bocha.d.ts +4 -0
  300. package/dist/humain/web-access/vendor/bocha.d.ts.map +1 -0
  301. package/dist/humain/web-access/vendor/bocha.js +219 -0
  302. package/dist/humain/web-access/vendor/bocha.js.map +1 -0
  303. package/dist/humain/web-access/vendor/brave.d.ts +4 -0
  304. package/dist/humain/web-access/vendor/brave.d.ts.map +1 -0
  305. package/dist/humain/web-access/vendor/brave.js +194 -0
  306. package/dist/humain/web-access/vendor/brave.js.map +1 -0
  307. package/dist/humain/web-access/vendor/brightdata-unlocker.d.ts +12 -0
  308. package/dist/humain/web-access/vendor/brightdata-unlocker.d.ts.map +1 -0
  309. package/dist/humain/web-access/vendor/brightdata-unlocker.js +230 -0
  310. package/dist/humain/web-access/vendor/brightdata-unlocker.js.map +1 -0
  311. package/dist/humain/web-access/vendor/brightdata.d.ts +8 -0
  312. package/dist/humain/web-access/vendor/brightdata.d.ts.map +1 -0
  313. package/dist/humain/web-access/vendor/brightdata.js +519 -0
  314. package/dist/humain/web-access/vendor/brightdata.js.map +1 -0
  315. package/dist/humain/web-access/vendor/chrome-cookies.d.ts +10 -0
  316. package/dist/humain/web-access/vendor/chrome-cookies.d.ts.map +1 -0
  317. package/dist/humain/web-access/vendor/chrome-cookies.js +438 -0
  318. package/dist/humain/web-access/vendor/chrome-cookies.js.map +1 -0
  319. package/dist/humain/web-access/vendor/content-find.d.ts +11 -0
  320. package/dist/humain/web-access/vendor/content-find.d.ts.map +1 -0
  321. package/dist/humain/web-access/vendor/content-find.js +117 -0
  322. package/dist/humain/web-access/vendor/content-find.js.map +1 -0
  323. package/dist/humain/web-access/vendor/credential-source.d.ts +28 -0
  324. package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -0
  325. package/dist/humain/web-access/vendor/credential-source.js +151 -0
  326. package/dist/humain/web-access/vendor/credential-source.js.map +1 -0
  327. package/dist/humain/web-access/vendor/curator-page.d.ts +29 -0
  328. package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -0
  329. package/dist/humain/web-access/vendor/curator-page.js +3554 -0
  330. package/dist/humain/web-access/vendor/curator-page.js.map +1 -0
  331. package/dist/humain/web-access/vendor/curator-server.d.ts +93 -0
  332. package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -0
  333. package/dist/humain/web-access/vendor/curator-server.js +688 -0
  334. package/dist/humain/web-access/vendor/curator-server.js.map +1 -0
  335. package/dist/humain/web-access/vendor/datalab-pdf-extract.d.ts +60 -0
  336. package/dist/humain/web-access/vendor/datalab-pdf-extract.d.ts.map +1 -0
  337. package/dist/humain/web-access/vendor/datalab-pdf-extract.js +416 -0
  338. package/dist/humain/web-access/vendor/datalab-pdf-extract.js.map +1 -0
  339. package/dist/humain/web-access/vendor/declared-web-links.d.ts +16 -0
  340. package/dist/humain/web-access/vendor/declared-web-links.d.ts.map +1 -0
  341. package/dist/humain/web-access/vendor/declared-web-links.js +168 -0
  342. package/dist/humain/web-access/vendor/declared-web-links.js.map +1 -0
  343. package/dist/humain/web-access/vendor/duckduckgo.d.ts +4 -0
  344. package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -0
  345. package/dist/humain/web-access/vendor/duckduckgo.js +123 -0
  346. package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -0
  347. package/dist/humain/web-access/vendor/exa.d.ts +10 -0
  348. package/dist/humain/web-access/vendor/exa.d.ts.map +1 -0
  349. package/dist/humain/web-access/vendor/exa.js +426 -0
  350. package/dist/humain/web-access/vendor/exa.js.map +1 -0
  351. package/dist/humain/web-access/vendor/extract.d.ts +46 -0
  352. package/dist/humain/web-access/vendor/extract.d.ts.map +1 -0
  353. package/dist/humain/web-access/vendor/extract.js +1064 -0
  354. package/dist/humain/web-access/vendor/extract.js.map +1 -0
  355. package/dist/humain/web-access/vendor/feature-config.d.ts +3 -0
  356. package/dist/humain/web-access/vendor/feature-config.d.ts.map +1 -0
  357. package/dist/humain/web-access/vendor/feature-config.js +27 -0
  358. package/dist/humain/web-access/vendor/feature-config.js.map +1 -0
  359. package/dist/humain/web-access/vendor/fetch-params.d.ts +25 -0
  360. package/dist/humain/web-access/vendor/fetch-params.d.ts.map +1 -0
  361. package/dist/humain/web-access/vendor/fetch-params.js +57 -0
  362. package/dist/humain/web-access/vendor/fetch-params.js.map +1 -0
  363. package/dist/humain/web-access/vendor/firecrawl.d.ts +12 -0
  364. package/dist/humain/web-access/vendor/firecrawl.d.ts.map +1 -0
  365. package/dist/humain/web-access/vendor/firecrawl.js +239 -0
  366. package/dist/humain/web-access/vendor/firecrawl.js.map +1 -0
  367. package/dist/humain/web-access/vendor/gemini-api.d.ts +27 -0
  368. package/dist/humain/web-access/vendor/gemini-api.d.ts.map +1 -0
  369. package/dist/humain/web-access/vendor/gemini-api.js +230 -0
  370. package/dist/humain/web-access/vendor/gemini-api.js.map +1 -0
  371. package/dist/humain/web-access/vendor/gemini-pdf-extract.d.ts +9 -0
  372. package/dist/humain/web-access/vendor/gemini-pdf-extract.d.ts.map +1 -0
  373. package/dist/humain/web-access/vendor/gemini-pdf-extract.js +85 -0
  374. package/dist/humain/web-access/vendor/gemini-pdf-extract.js.map +1 -0
  375. package/dist/humain/web-access/vendor/gemini-search.d.ts +40 -0
  376. package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -0
  377. package/dist/humain/web-access/vendor/gemini-search.js +814 -0
  378. package/dist/humain/web-access/vendor/gemini-search.js.map +1 -0
  379. package/dist/humain/web-access/vendor/gemini-url-context.d.ts +4 -0
  380. package/dist/humain/web-access/vendor/gemini-url-context.d.ts.map +1 -0
  381. package/dist/humain/web-access/vendor/gemini-url-context.js +101 -0
  382. package/dist/humain/web-access/vendor/gemini-url-context.js.map +1 -0
  383. package/dist/humain/web-access/vendor/gemini-web-config.d.ts +4 -0
  384. package/dist/humain/web-access/vendor/gemini-web-config.d.ts.map +1 -0
  385. package/dist/humain/web-access/vendor/gemini-web-config.js +42 -0
  386. package/dist/humain/web-access/vendor/gemini-web-config.js.map +1 -0
  387. package/dist/humain/web-access/vendor/gemini-web.d.ts +18 -0
  388. package/dist/humain/web-access/vendor/gemini-web.d.ts.map +1 -0
  389. package/dist/humain/web-access/vendor/gemini-web.js +385 -0
  390. package/dist/humain/web-access/vendor/gemini-web.js.map +1 -0
  391. package/dist/humain/web-access/vendor/github-api.d.ts +7 -0
  392. package/dist/humain/web-access/vendor/github-api.d.ts.map +1 -0
  393. package/dist/humain/web-access/vendor/github-api.js +160 -0
  394. package/dist/humain/web-access/vendor/github-api.js.map +1 -0
  395. package/dist/humain/web-access/vendor/github-extract.d.ts +13 -0
  396. package/dist/humain/web-access/vendor/github-extract.d.ts.map +1 -0
  397. package/dist/humain/web-access/vendor/github-extract.js +635 -0
  398. package/dist/humain/web-access/vendor/github-extract.js.map +1 -0
  399. package/dist/humain/web-access/vendor/index.d.ts +4 -0
  400. package/dist/humain/web-access/vendor/index.d.ts.map +1 -0
  401. package/dist/humain/web-access/vendor/index.js +3002 -0
  402. package/dist/humain/web-access/vendor/index.js.map +1 -0
  403. package/dist/humain/web-access/vendor/jina-search.d.ts +8 -0
  404. package/dist/humain/web-access/vendor/jina-search.d.ts.map +1 -0
  405. package/dist/humain/web-access/vendor/jina-search.js +255 -0
  406. package/dist/humain/web-access/vendor/jina-search.js.map +1 -0
  407. package/dist/humain/web-access/vendor/kagi.d.ts +15 -0
  408. package/dist/humain/web-access/vendor/kagi.d.ts.map +1 -0
  409. package/dist/humain/web-access/vendor/kagi.js +262 -0
  410. package/dist/humain/web-access/vendor/kagi.js.map +1 -0
  411. package/dist/humain/web-access/vendor/ollama.d.ts +15 -0
  412. package/dist/humain/web-access/vendor/ollama.d.ts.map +1 -0
  413. package/dist/humain/web-access/vendor/ollama.js +216 -0
  414. package/dist/humain/web-access/vendor/ollama.js.map +1 -0
  415. package/dist/humain/web-access/vendor/openai-search.d.ts +15 -0
  416. package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -0
  417. package/dist/humain/web-access/vendor/openai-search.js +459 -0
  418. package/dist/humain/web-access/vendor/openai-search.js.map +1 -0
  419. package/dist/humain/web-access/vendor/page-query.d.ts +16 -0
  420. package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -0
  421. package/dist/humain/web-access/vendor/page-query.js +79 -0
  422. package/dist/humain/web-access/vendor/page-query.js.map +1 -0
  423. package/dist/humain/web-access/vendor/parallel.d.ts +12 -0
  424. package/dist/humain/web-access/vendor/parallel.d.ts.map +1 -0
  425. package/dist/humain/web-access/vendor/parallel.js +343 -0
  426. package/dist/humain/web-access/vendor/parallel.js.map +1 -0
  427. package/dist/humain/web-access/vendor/pdf-extract.d.ts +44 -0
  428. package/dist/humain/web-access/vendor/pdf-extract.d.ts.map +1 -0
  429. package/dist/humain/web-access/vendor/pdf-extract.js +298 -0
  430. package/dist/humain/web-access/vendor/pdf-extract.js.map +1 -0
  431. package/dist/humain/web-access/vendor/perplexity.d.ts +20 -0
  432. package/dist/humain/web-access/vendor/perplexity.d.ts.map +1 -0
  433. package/dist/humain/web-access/vendor/perplexity.js +159 -0
  434. package/dist/humain/web-access/vendor/perplexity.js.map +1 -0
  435. package/dist/humain/web-access/vendor/querit.d.ts +10 -0
  436. package/dist/humain/web-access/vendor/querit.d.ts.map +1 -0
  437. package/dist/humain/web-access/vendor/querit.js +335 -0
  438. package/dist/humain/web-access/vendor/querit.js.map +1 -0
  439. package/dist/humain/web-access/vendor/render-search-error.d.ts +57 -0
  440. package/dist/humain/web-access/vendor/render-search-error.d.ts.map +1 -0
  441. package/dist/humain/web-access/vendor/render-search-error.js +130 -0
  442. package/dist/humain/web-access/vendor/render-search-error.js.map +1 -0
  443. package/dist/humain/web-access/vendor/rsc-extract.d.ts +12 -0
  444. package/dist/humain/web-access/vendor/rsc-extract.d.ts.map +1 -0
  445. package/dist/humain/web-access/vendor/rsc-extract.js +329 -0
  446. package/dist/humain/web-access/vendor/rsc-extract.js.map +1 -0
  447. package/dist/humain/web-access/vendor/search1api.d.ts +10 -0
  448. package/dist/humain/web-access/vendor/search1api.d.ts.map +1 -0
  449. package/dist/humain/web-access/vendor/search1api.js +251 -0
  450. package/dist/humain/web-access/vendor/search1api.js.map +1 -0
  451. package/dist/humain/web-access/vendor/searchinfinity.d.ts +8 -0
  452. package/dist/humain/web-access/vendor/searchinfinity.d.ts.map +1 -0
  453. package/dist/humain/web-access/vendor/searchinfinity.js +229 -0
  454. package/dist/humain/web-access/vendor/searchinfinity.js.map +1 -0
  455. package/dist/humain/web-access/vendor/searxng.d.ts +4 -0
  456. package/dist/humain/web-access/vendor/searxng.d.ts.map +1 -0
  457. package/dist/humain/web-access/vendor/searxng.js +238 -0
  458. package/dist/humain/web-access/vendor/searxng.js.map +1 -0
  459. package/dist/humain/web-access/vendor/serpbase.d.ts +4 -0
  460. package/dist/humain/web-access/vendor/serpbase.d.ts.map +1 -0
  461. package/dist/humain/web-access/vendor/serpbase.js +211 -0
  462. package/dist/humain/web-access/vendor/serpbase.js.map +1 -0
  463. package/dist/humain/web-access/vendor/serpdive.d.ts +8 -0
  464. package/dist/humain/web-access/vendor/serpdive.d.ts.map +1 -0
  465. package/dist/humain/web-access/vendor/serpdive.js +267 -0
  466. package/dist/humain/web-access/vendor/serpdive.js.map +1 -0
  467. package/dist/humain/web-access/vendor/source-check.d.ts +99 -0
  468. package/dist/humain/web-access/vendor/source-check.d.ts.map +1 -0
  469. package/dist/humain/web-access/vendor/source-check.js +205 -0
  470. package/dist/humain/web-access/vendor/source-check.js.map +1 -0
  471. package/dist/humain/web-access/vendor/ssrf-protection.d.ts +50 -0
  472. package/dist/humain/web-access/vendor/ssrf-protection.d.ts.map +1 -0
  473. package/dist/humain/web-access/vendor/ssrf-protection.js +466 -0
  474. package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -0
  475. package/dist/humain/web-access/vendor/storage.d.ts +55 -0
  476. package/dist/humain/web-access/vendor/storage.d.ts.map +1 -0
  477. package/dist/humain/web-access/vendor/storage.js +485 -0
  478. package/dist/humain/web-access/vendor/storage.js.map +1 -0
  479. package/dist/humain/web-access/vendor/summary-model-scope.d.ts +25 -0
  480. package/dist/humain/web-access/vendor/summary-model-scope.d.ts.map +1 -0
  481. package/dist/humain/web-access/vendor/summary-model-scope.js +98 -0
  482. package/dist/humain/web-access/vendor/summary-model-scope.js.map +1 -0
  483. package/dist/humain/web-access/vendor/summary-review.d.ts +24 -0
  484. package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -0
  485. package/dist/humain/web-access/vendor/summary-review.js +341 -0
  486. package/dist/humain/web-access/vendor/summary-review.js.map +1 -0
  487. package/dist/humain/web-access/vendor/tavily.d.ts +8 -0
  488. package/dist/humain/web-access/vendor/tavily.d.ts.map +1 -0
  489. package/dist/humain/web-access/vendor/tavily.js +194 -0
  490. package/dist/humain/web-access/vendor/tavily.js.map +1 -0
  491. package/dist/humain/web-access/vendor/tinyfish.d.ts +11 -0
  492. package/dist/humain/web-access/vendor/tinyfish.d.ts.map +1 -0
  493. package/dist/humain/web-access/vendor/tinyfish.js +331 -0
  494. package/dist/humain/web-access/vendor/tinyfish.js.map +1 -0
  495. package/dist/humain/web-access/vendor/utils.d.ts +20 -0
  496. package/dist/humain/web-access/vendor/utils.d.ts.map +1 -0
  497. package/dist/humain/web-access/vendor/utils.js +91 -0
  498. package/dist/humain/web-access/vendor/utils.js.map +1 -0
  499. package/dist/humain/web-access/vendor/video-extract.d.ts +16 -0
  500. package/dist/humain/web-access/vendor/video-extract.d.ts.map +1 -0
  501. package/dist/humain/web-access/vendor/video-extract.js +335 -0
  502. package/dist/humain/web-access/vendor/video-extract.js.map +1 -0
  503. package/dist/humain/web-access/vendor/xai-search.d.ts +13 -0
  504. package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -0
  505. package/dist/humain/web-access/vendor/xai-search.js +331 -0
  506. package/dist/humain/web-access/vendor/xai-search.js.map +1 -0
  507. package/dist/humain/web-access/vendor/youtube-extract.d.ts +27 -0
  508. package/dist/humain/web-access/vendor/youtube-extract.d.ts.map +1 -0
  509. package/dist/humain/web-access/vendor/youtube-extract.js +282 -0
  510. package/dist/humain/web-access/vendor/youtube-extract.js.map +1 -0
  511. package/dist/index.d.ts +7 -4
  512. package/dist/index.d.ts.map +1 -1
  513. package/dist/index.js +5 -2
  514. package/dist/index.js.map +1 -1
  515. package/dist/main.d.ts +2 -2
  516. package/dist/main.d.ts.map +1 -1
  517. package/dist/main.js +169 -102
  518. package/dist/main.js.map +1 -1
  519. package/dist/modes/agent-exec-mode.d.ts +14 -0
  520. package/dist/modes/agent-exec-mode.d.ts.map +1 -0
  521. package/dist/modes/agent-exec-mode.js +92 -0
  522. package/dist/modes/agent-exec-mode.js.map +1 -0
  523. package/dist/modes/index.d.ts +4 -2
  524. package/dist/modes/index.d.ts.map +1 -1
  525. package/dist/modes/index.js +2 -1
  526. package/dist/modes/index.js.map +1 -1
  527. package/dist/modes/interactive/components/assistant-message.d.ts +5 -2
  528. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  529. package/dist/modes/interactive/components/assistant-message.js +13 -4
  530. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  531. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  532. package/dist/modes/interactive/components/custom-editor.js +7 -0
  533. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  534. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  535. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  536. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  537. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  538. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  539. package/dist/modes/interactive/components/footer.js +1 -1
  540. package/dist/modes/interactive/components/footer.js.map +1 -1
  541. package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
  542. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  543. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  544. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  545. package/dist/modes/interactive/components/mermaid.d.ts +11 -0
  546. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  547. package/dist/modes/interactive/components/mermaid.js +75 -0
  548. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  549. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  550. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  551. package/dist/modes/interactive/components/model-selector.js +16 -4
  552. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  553. package/dist/modes/interactive/components/scoped-models-selector.d.ts +4 -0
  554. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  555. package/dist/modes/interactive/components/scoped-models-selector.js +26 -0
  556. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  557. package/dist/modes/interactive/components/settings-selector.d.ts +8 -2
  558. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  559. package/dist/modes/interactive/components/settings-selector.js +30 -0
  560. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  561. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  562. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  563. package/dist/modes/interactive/components/user-message.js +9 -2
  564. package/dist/modes/interactive/components/user-message.js.map +1 -1
  565. package/dist/modes/interactive/interactive-mode.d.ts +45 -9
  566. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  567. package/dist/modes/interactive/interactive-mode.js +581 -211
  568. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  569. package/dist/modes/interactive/theme/dark.json +1 -0
  570. package/dist/modes/interactive/theme/light.json +1 -0
  571. package/dist/modes/interactive/theme/theme-controller.d.ts +3 -0
  572. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  573. package/dist/modes/interactive/theme/theme-controller.js +10 -1
  574. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  575. package/dist/modes/interactive/theme/theme-schema.json +5 -1
  576. package/dist/modes/interactive/theme/theme.d.ts +2 -2
  577. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  578. package/dist/modes/interactive/theme/theme.js +24 -6
  579. package/dist/modes/interactive/theme/theme.js.map +1 -1
  580. package/dist/modes/json-event.d.ts +28 -0
  581. package/dist/modes/json-event.d.ts.map +1 -0
  582. package/dist/modes/json-event.js +12 -0
  583. package/dist/modes/json-event.js.map +1 -0
  584. package/dist/modes/print-mode.d.ts.map +1 -1
  585. package/dist/modes/print-mode.js +12 -2
  586. package/dist/modes/print-mode.js.map +1 -1
  587. package/dist/modes/rpc/rpc-client.d.ts +12 -5
  588. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  589. package/dist/modes/rpc/rpc-client.js +55 -1
  590. package/dist/modes/rpc/rpc-client.js.map +1 -1
  591. package/dist/modes/rpc/rpc-mode.d.ts +1 -1
  592. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  593. package/dist/modes/rpc/rpc-mode.js +13 -3
  594. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  595. package/dist/modes/rpc/rpc-types.d.ts +15 -0
  596. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  597. package/dist/modes/rpc/rpc-types.js.map +1 -1
  598. package/dist/package-manager-cli.d.ts.map +1 -1
  599. package/dist/package-manager-cli.js +11 -9
  600. package/dist/package-manager-cli.js.map +1 -1
  601. package/dist/rpc-entry.d.ts.map +1 -1
  602. package/dist/rpc-entry.js +3 -2
  603. package/dist/rpc-entry.js.map +1 -1
  604. package/dist/server/create-harness.d.ts +26 -0
  605. package/dist/server/create-harness.d.ts.map +1 -0
  606. package/dist/server/create-harness.js +104 -0
  607. package/dist/server/create-harness.js.map +1 -0
  608. package/dist/utils/abort.d.ts +5 -0
  609. package/dist/utils/abort.d.ts.map +1 -0
  610. package/dist/utils/abort.js +48 -0
  611. package/dist/utils/abort.js.map +1 -0
  612. package/dist/utils/clipboard.d.ts +1 -1
  613. package/dist/utils/clipboard.d.ts.map +1 -1
  614. package/dist/utils/clipboard.js +22 -2
  615. package/dist/utils/clipboard.js.map +1 -1
  616. package/dist/utils/management-http.d.ts +23 -0
  617. package/dist/utils/management-http.d.ts.map +1 -0
  618. package/dist/utils/management-http.js +50 -0
  619. package/dist/utils/management-http.js.map +1 -0
  620. package/dist/utils/paths.d.ts +3 -0
  621. package/dist/utils/paths.d.ts.map +1 -1
  622. package/dist/utils/paths.js +23 -1
  623. package/dist/utils/paths.js.map +1 -1
  624. package/dist/utils/tool-result-images.d.ts +19 -0
  625. package/dist/utils/tool-result-images.d.ts.map +1 -0
  626. package/dist/utils/tool-result-images.js +45 -0
  627. package/dist/utils/tool-result-images.js.map +1 -0
  628. package/dist/utils/tools-manager.d.ts.map +1 -1
  629. package/dist/utils/tools-manager.js +13 -25
  630. package/dist/utils/tools-manager.js.map +1 -1
  631. package/dist/utils/version-check.d.ts +4 -0
  632. package/dist/utils/version-check.d.ts.map +1 -1
  633. package/dist/utils/version-check.js +23 -5
  634. package/dist/utils/version-check.js.map +1 -1
  635. package/docs/compaction.md +2 -2
  636. package/docs/custom-provider.md +7 -5
  637. package/docs/extensions.md +30 -5
  638. package/docs/humain-terminal.md +21 -1
  639. package/docs/json.md +24 -19
  640. package/docs/keybindings.md +46 -14
  641. package/docs/models.md +32 -11
  642. package/docs/providers.md +9 -1
  643. package/docs/quickstart.md +39 -37
  644. package/docs/rpc.md +31 -11
  645. package/docs/sdk.md +21 -2
  646. package/docs/security.md +21 -21
  647. package/docs/session-format.md +14 -14
  648. package/docs/settings.md +4 -1
  649. package/docs/themes.md +5 -3
  650. package/docs/usage.md +7 -0
  651. package/examples/extensions/custom-compaction.ts +3 -18
  652. package/examples/extensions/custom-provider-anthropic/index.ts +5 -1
  653. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  654. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  655. package/examples/extensions/custom-provider-gitlab-duo/index.ts +5 -1
  656. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  657. package/examples/extensions/doom-overlay/wad-finder.ts +7 -3
  658. package/examples/extensions/gondolin/package-lock.json +2 -2
  659. package/examples/extensions/gondolin/package.json +1 -1
  660. package/examples/extensions/handoff.ts +4 -13
  661. package/examples/extensions/qna.ts +5 -9
  662. package/examples/extensions/sandbox/package-lock.json +2 -2
  663. package/examples/extensions/sandbox/package.json +1 -1
  664. package/examples/extensions/summarize.ts +9 -20
  665. package/examples/extensions/with-deps/package-lock.json +2 -2
  666. package/examples/extensions/with-deps/package.json +1 -1
  667. package/examples/rpc-extension-ui.ts +11 -2
  668. package/examples/sdk/02-custom-model.ts +2 -3
  669. package/examples/sdk/09-api-keys-and-oauth.ts +1 -1
  670. package/examples/sdk/12-full-control.ts +1 -1
  671. package/examples/sdk/README.md +1 -1
  672. package/npm-shrinkwrap.json +2771 -535
  673. package/package.json +40 -11
  674. package/src/humain/mcp-adapter/UPSTREAM.md +15 -0
  675. package/src/humain/mcp-adapter/upstream.json +7 -0
  676. package/src/humain/mcp-adapter/vendor/CHANGELOG.md +660 -0
  677. package/src/humain/mcp-adapter/vendor/LICENSE +21 -0
  678. package/src/humain/web-access/UPSTREAM.md +17 -0
  679. package/src/humain/web-access/upstream.json +23 -0
  680. package/src/humain/web-access/vendor/LICENSE +21 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-search.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/gemini-search.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { CredentialResolutionError } from \"./credential-source.ts\";\nimport { getApiKey, getVersionedApiBase, fetchGeminiApi, isGatewayConfigured, isGeminiApiAvailable, redactGeminiApiResponse } from \"./gemini-api.ts\";\nimport { getGeminiWebAvailabilityDiagnostic, isGeminiWebAvailable, queryWithCookies } from \"./gemini-web.ts\";\nimport { isPerplexityAvailable, searchWithPerplexity, type SearchResult, type SearchResponse, type SearchOptions } from \"./perplexity.ts\";\nimport { isExaAvailable, searchWithExa } from \"./exa.ts\";\nimport { isBraveAvailable, searchWithBrave } from \"./brave.ts\";\nimport { isOpenAISearchAvailable, searchWithOpenAI } from \"./openai-search.ts\";\nimport { isParallelAvailable, searchWithParallel } from \"./parallel.ts\";\nimport { isTinyFishAvailable, searchWithTinyFish } from \"./tinyfish.ts\";\nimport { isSearch1APIAvailable, searchWithSearch1API } from \"./search1api.ts\";\nimport { isSearchinfinityAvailable, searchWithSearchinfinity } from \"./searchinfinity.ts\";\nimport { isQueritAvailable, searchWithQuerit } from \"./querit.ts\";\nimport { isTavilyAvailable, searchWithTavily } from \"./tavily.ts\";\nimport { isJinaSearchAvailable, searchWithJina } from \"./jina-search.ts\";\nimport { isSerpdiveAvailable, searchWithSerpdive } from \"./serpdive.ts\";\nimport { isKagiAvailable, searchWithKagi } from \"./kagi.ts\";\nimport { isBochaAvailable, searchWithBocha } from \"./bocha.ts\";\nimport { isOllamaAvailable, searchWithOllama } from \"./ollama.ts\";\nimport { isSearXNGAvailable, searchWithSearXNG } from \"./searxng.ts\";\nimport { isDuckDuckGoAvailable, searchWithDuckDuckGo } from \"./duckduckgo.ts\";\nimport { isAnySearchAvailable, searchWithAnySearch } from \"./anysearch.ts\";\nimport { isXaiSearchAvailable, searchWithXai } from \"./xai-search.ts\";\nimport { isBrightDataAvailable, searchWithBrightData } from \"./brightdata.ts\";\nimport { isSerpBaseAvailable, searchWithSerpBase } from \"./serpbase.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nexport const RESOLVED_SEARCH_PROVIDERS = [\"openai\", \"brave\", \"parallel\", \"tinyfish\", \"search1api\", \"searchinfinity\", \"querit\", \"tavily\", \"jina\", \"searxng\", \"duckduckgo\", \"perplexity\", \"gemini\", \"exa\", \"serpdive\", \"kagi\", \"ollama\", \"anysearch\", \"xai\", \"brightdata\", \"serpbase\", \"bocha\"] as const;\nexport const SEARCH_PROVIDERS = [\"auto\", \"all\", ...RESOLVED_SEARCH_PROVIDERS] as const;\n\nexport type ResolvedSearchProvider = typeof RESOLVED_SEARCH_PROVIDERS[number];\nexport type SearchProvider = typeof SEARCH_PROVIDERS[number];\nexport type SearchProviderSelection = SearchProvider | ResolvedSearchProvider[];\nexport type SearchProviderErrorKind =\n\t| \"transient\"\n\t| \"quota\"\n\t| \"network\"\n\t| \"credential\"\n\t| \"config\"\n\t| \"auth\"\n\t| \"invalid-request\"\n\t| \"invalid-response\"\n\t| \"aborted\"\n\t| \"unknown\";\n\nexport interface SearchRoutingConfig {\n\tproviders: ResolvedSearchProvider[];\n\tfallbackOn: Array<Extract<SearchProviderErrorKind, \"transient\" | \"quota\" | \"network\" | \"invalid-response\">>;\n}\n\nexport class SearchProviderError extends Error {\n\treadonly provider: ResolvedSearchProvider;\n\treadonly kind: SearchProviderErrorKind;\n\treadonly status?: number;\n\treadonly causeError: unknown;\n\n\tconstructor(\n\t\tprovider: ResolvedSearchProvider,\n\t\tkind: SearchProviderErrorKind,\n\t\tmessage: string,\n\t\tstatus: number | undefined,\n\t\tcause: unknown,\n\t) {\n\t\tsuper(`${provider} search failed (${kind}): ${message}`);\n\t\tthis.name = \"SearchProviderError\";\n\t\tthis.provider = provider;\n\t\tthis.kind = kind;\n\t\tthis.status = status;\n\t\tthis.causeError = cause;\n\t}\n}\n\nexport interface ProviderSearchResponse extends SearchResponse {\n\tprovider: ResolvedSearchProvider;\n}\n\nexport interface ProviderSearchFailure {\n\tprovider: ResolvedSearchProvider;\n\terror: string;\n}\n\nexport interface AttributedSearchResponse extends SearchResponse {\n\tprovider: ResolvedSearchProvider | \"all\";\n\tproviderResponses?: ProviderSearchResponse[];\n\tproviderErrors?: ProviderSearchFailure[];\n}\n\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst DEFAULT_SEARCH_MODEL = \"gemini-3.6-flash\";\n// Explicit-only providers (DuckDuckGo, AnySearch, xAI, Bright Data, SerpBase) are deliberately absent:\n// `all` must never fan out to an opt-in or paid provider without the user asking for it.\nconst ALL_SEARCH_PROVIDERS: ResolvedSearchProvider[] = [\"searxng\", \"openai\", \"exa\", \"brave\", \"parallel\", \"tinyfish\", \"search1api\", \"searchinfinity\", \"querit\", \"tavily\", \"jina\", \"serpdive\", \"kagi\", \"ollama\", \"perplexity\", \"gemini\", \"bocha\"];\nconst VALID_ROUTING_KINDS = [\"transient\", \"quota\", \"network\", \"invalid-response\"] as const;\n\ntype SearchConfig = {\n\tsearchProvider: SearchProviderSelection;\n\tsearchProviderConfigured: boolean;\n\tsearchRouting?: SearchRoutingConfig;\n\tsearchModel?: string;\n};\n\nlet cachedSearchConfig: SearchConfig | null = null;\n\nfunction getSearchConfig(): SearchConfig {\n\tif (cachedSearchConfig) return cachedSearchConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedSearchConfig = { searchProvider: \"auto\", searchProviderConfigured: false };\n\t\treturn cachedSearchConfig;\n\t}\n\n\tconst rawText = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet raw: Record<string, unknown>;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(rawText);\n\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\tthrow new Error(\"expected a JSON object\");\n\t\t}\n\t\traw = parsed 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 ${CONFIG_PATH}: ${message}`);\n\t}\n\n\tconst searchModel = normalizeSearchModel(raw.searchModel);\n\tconst searchProviderConfigured = Object.hasOwn(raw, \"searchProvider\") || Object.hasOwn(raw, \"provider\");\n\tcachedSearchConfig = {\n\t\tsearchProvider: normalizeSearchProviderSelection(raw.searchProvider ?? raw.provider, `provider in ${CONFIG_PATH}`),\n\t\tsearchProviderConfigured,\n\t\t...(Object.hasOwn(raw, \"searchRouting\") ? { searchRouting: normalizeSearchRouting(raw.searchRouting) } : {}),\n\t\t...(searchModel ? { searchModel } : {}),\n\t};\n\treturn cachedSearchConfig;\n}\n\nfunction normalizeSearchRouting(value: unknown): SearchRoutingConfig {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\tthrow new Error(`searchRouting in ${CONFIG_PATH} must be an object`);\n\t}\n\tconst raw = value as Record<string, unknown>;\n\tconst providers = normalizeResolvedProviderList(raw.providers, `searchRouting.providers in ${CONFIG_PATH}`);\n\tif (!Array.isArray(raw.fallbackOn) || raw.fallbackOn.length === 0) {\n\t\tthrow new Error(`searchRouting.fallbackOn in ${CONFIG_PATH} must be a non-empty array`);\n\t}\n\tconst fallbackOn: SearchRoutingConfig[\"fallbackOn\"] = [];\n\tfor (const kind of raw.fallbackOn) {\n\t\tif (typeof kind !== \"string\" || !VALID_ROUTING_KINDS.includes(kind as typeof VALID_ROUTING_KINDS[number])) {\n\t\t\tthrow new Error(`searchRouting.fallbackOn in ${CONFIG_PATH} may only contain transient, quota, network, or invalid-response`);\n\t\t}\n\t\tif (!fallbackOn.includes(kind as SearchRoutingConfig[\"fallbackOn\"][number])) {\n\t\t\tfallbackOn.push(kind as SearchRoutingConfig[\"fallbackOn\"][number]);\n\t\t}\n\t}\n\treturn { providers, fallbackOn };\n}\n\nexport function getConfiguredSearchRouting(): SearchRoutingConfig | undefined {\n\tconst config = getSearchConfig();\n\treturn config.searchProviderConfigured ? undefined : config.searchRouting;\n}\n\nfunction normalizeSearchModel(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeResolvedProviderList(value: unknown, label: string): ResolvedSearchProvider[] {\n\tif (!Array.isArray(value) || value.length === 0) {\n\t\tthrow new Error(`${label} must be a non-empty array`);\n\t}\n\tconst providers: ResolvedSearchProvider[] = [];\n\tfor (const provider of value) {\n\t\tconst normalized = typeof provider === \"string\" ? provider.trim().toLowerCase() : \"\";\n\t\tif (!RESOLVED_SEARCH_PROVIDERS.includes(normalized as ResolvedSearchProvider)) {\n\t\t\tthrow new Error(`${label} contains an invalid provider: ${String(provider)}`);\n\t\t}\n\t\tif (providers.includes(normalized as ResolvedSearchProvider)) {\n\t\t\tthrow new Error(`${label} must not contain duplicates: ${normalized}`);\n\t\t}\n\t\tproviders.push(normalized as ResolvedSearchProvider);\n\t}\n\treturn providers;\n}\n\nexport function normalizeSearchProviderSelection(value: unknown, label = \"provider\"): SearchProviderSelection {\n\tif (Array.isArray(value)) return normalizeResolvedProviderList(value, label);\n\tconst normalized = typeof value === \"string\" ? value.trim().toLowerCase() : \"\";\n\treturn SEARCH_PROVIDERS.includes(normalized as SearchProvider) ? normalized as SearchProvider : \"auto\";\n}\n\nexport interface FullSearchOptions extends SearchOptions {\n\tprovider?: SearchProviderSelection;\n\tincludeContent?: boolean;\n\textensionContext?: ExtensionContext;\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction isAbortError(err: unknown): boolean {\n\treturn errorMessage(err).toLowerCase().includes(\"abort\");\n}\n\nfunction shouldTryOpenAIInAuto(options: SearchOptions): boolean {\n\tif (options.recencyFilter) return false;\n\tif (typeof options.numResults === \"number\" && Number.isFinite(options.numResults) && Math.floor(options.numResults) !== 5) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nasync function searchWithGemini(\n\tquery: string,\n\toptions: SearchOptions,\n\tstrictErrors: boolean,\n): Promise<SearchResponse | null> {\n\tconst errors: string[] = [];\n\n\ttry {\n\t\tconst apiResult = await searchWithGeminiApi(query, options);\n\t\tif (apiResult) return apiResult;\n\t} catch (err) {\n\t\tif (err instanceof CredentialResolutionError || isAbortError(err)) throw err;\n\t\terrors.push(`Gemini API: ${errorMessage(err)}`);\n\t}\n\n\ttry {\n\t\tconst webResult = await searchWithGeminiWeb(query, options);\n\t\tif (webResult) return webResult;\n\t\tconst diagnostic = getGeminiWebAvailabilityDiagnostic();\n\t\tif (diagnostic) errors.push(`Gemini Web: ${diagnostic}`);\n\t} catch (err) {\n\t\tif (isAbortError(err)) throw err;\n\t\terrors.push(`Gemini Web: ${errorMessage(err)}`);\n\t}\n\n\tif (strictErrors && errors.length > 0) {\n\t\tthrow new Error(`Gemini search failed:\\n - ${errors.join(\"\\n - \")}`);\n\t}\n\n\treturn null;\n}\n\nfunction providerErrorStatus(message: string): number | undefined {\n\tconst match = message.match(/\\b(?:error|status|http)\\s+(\\d{3})\\b/i);\n\tif (!match) return undefined;\n\treturn Number(match[1]);\n}\n\nfunction classifyProviderError(provider: ResolvedSearchProvider, err: unknown): SearchProviderError {\n\tif (err instanceof SearchProviderError) return err;\n\tconst message = errorMessage(err);\n\tconst lower = message.toLowerCase();\n\tconst status = providerErrorStatus(message);\n\tlet kind: SearchProviderErrorKind = \"unknown\";\n\tif (err instanceof CredentialResolutionError || /(?:api )?key (?:not found|missing)|credential resolution/.test(lower)) {\n\t\tkind = \"credential\";\n\t} else if (isAbortError(err)) {\n\t\tkind = \"aborted\";\n\t} else if (provider === \"xai\" && status === 403 && /spending[- ]limit|(?:no|out of) credits?|insufficient quota|quota (?:exceeded|exhausted)|credits? (?:exhausted|depleted|used up)/.test(lower)) {\n\t\tkind = \"quota\";\n\t} else if (status === 401 || status === 403) {\n\t\tkind = \"auth\";\n\t} else if (status === 400 || status === 422) {\n\t\tkind = \"invalid-request\";\n\t} else if (status === 402 || status === 429) {\n\t\tkind = \"quota\";\n\t} else if (status !== undefined && (status === 408 || status === 425 || status >= 500)) {\n\t\tkind = \"transient\";\n\t} else if (/rate limit|quota|too many requests/.test(lower)) {\n\t\tkind = \"quota\";\n\t} else if (/unauthorized|forbidden|permission denied/.test(lower)) {\n\t\tkind = \"auth\";\n\t} else if (/bad request|invalid request/.test(lower)) {\n\t\tkind = \"invalid-request\";\n\t} else if (/invalid json|no parseable response|no parseable results|invalid response|returned empty response/.test(lower)) {\n\t\tkind = \"invalid-response\";\n\t} else if (/temporar|service unavailable|server error/.test(lower)) {\n\t\tkind = \"transient\";\n\t} else if (err instanceof TypeError || /fetch failed|network|econnreset|econnrefused|enotfound|etimedout|timed out|socket/.test(lower)) {\n\t\tkind = \"network\";\n\t} else if (/invalid or missing|invalid config|failed to parse|must be an? |configuration/.test(lower)) {\n\t\tkind = \"config\";\n\t}\n\treturn new SearchProviderError(provider, kind, message, status, err);\n}\n\nasync function searchWithResolvedProvider(\n\tprovider: ResolvedSearchProvider,\n\tquery: string,\n\toptions: FullSearchOptions,\n): Promise<AttributedSearchResponse> {\n\tif (provider === \"openai\") {\n\t\tconst result = await searchWithOpenAI(query, options, options.extensionContext);\n\t\treturn { ...result, provider };\n\t}\n\tif (provider === \"brave\") return { ...(await searchWithBrave(query, options)), provider };\n\tif (provider === \"parallel\") return { ...(await searchWithParallel(query, options)), provider };\n\tif (provider === \"tinyfish\") return { ...(await searchWithTinyFish(query, options)), provider };\n\tif (provider === \"search1api\") return { ...(await searchWithSearch1API(query, options)), provider };\n\tif (provider === \"searchinfinity\") return { ...(await searchWithSearchinfinity(query, options)), provider };\n\tif (provider === \"querit\") return { ...(await searchWithQuerit(query, options)), provider };\n\tif (provider === \"tavily\") return { ...(await searchWithTavily(query, options)), provider };\n\tif (provider === \"jina\") return { ...(await searchWithJina(query, options)), provider };\n\tif (provider === \"serpdive\") return { ...(await searchWithSerpdive(query, options)), provider };\n\tif (provider === \"kagi\") return { ...(await searchWithKagi(query, options)), provider };\n\tif (provider === \"bocha\") return { ...(await searchWithBocha(query, options)), provider };\n\tif (provider === \"ollama\") return { ...(await searchWithOllama(query, options)), provider };\n\tif (provider === \"anysearch\") return { ...(await searchWithAnySearch(query, options)), provider };\n\tif (provider === \"xai\") return { ...(await searchWithXai(query, options, options.extensionContext)), provider };\n\tif (provider === \"brightdata\") return { ...(await searchWithBrightData(query, options)), provider };\n\tif (provider === \"serpbase\") return { ...(await searchWithSerpBase(query, options)), provider };\n\tif (provider === \"perplexity\") return { ...(await searchWithPerplexity(query, options)), provider };\n\tif (provider === \"searxng\") return { ...(await searchWithSearXNG(query, options)), provider };\n\tif (provider === \"duckduckgo\") return { ...(await searchWithDuckDuckGo(query, options)), provider };\n\tif (provider === \"gemini\") {\n\t\tconst result = await searchWithGemini(query, options, true);\n\t\tif (result) return { ...result, provider };\n\t\tthrow new Error(\n\t\t\t\"Gemini search unavailable. Either:\\n\" +\n\t\t\t` 1. Configure geminiApiKey in ${CONFIG_PATH} or set GEMINI_API_KEY\\n` +\n\t\t\t\" 2. Set GOOGLE_GEMINI_BASE_URL + CLOUDFLARE_API_KEY for Cloudflare AI Gateway routing\\n\" +\n\t\t\t\" 3. Sign into gemini.google.com in a supported Chromium-based browser\",\n\t\t);\n\t}\n\tconst result = await searchWithExa(query, options);\n\tif (result) return { ...result, provider };\n\tthrow new Error(\"Exa search returned no results.\");\n}\n\nasync function isResolvedProviderAvailable(provider: ResolvedSearchProvider, options: FullSearchOptions): Promise<boolean> {\n\tif (provider === \"openai\") return isOpenAISearchAvailable(options.extensionContext);\n\tif (provider === \"brave\") return isBraveAvailable();\n\tif (provider === \"parallel\") return isParallelAvailable();\n\tif (provider === \"tinyfish\") return isTinyFishAvailable();\n\tif (provider === \"search1api\") return isSearch1APIAvailable();\n\tif (provider === \"searchinfinity\") return isSearchinfinityAvailable();\n\tif (provider === \"querit\") return isQueritAvailable();\n\tif (provider === \"tavily\") return isTavilyAvailable();\n\tif (provider === \"jina\") return isJinaSearchAvailable();\n\tif (provider === \"serpdive\") return isSerpdiveAvailable();\n\tif (provider === \"kagi\") return isKagiAvailable();\n\tif (provider === \"bocha\") return isBochaAvailable();\n\tif (provider === \"ollama\") return isOllamaAvailable();\n\tif (provider === \"anysearch\") return isAnySearchAvailable();\n\tif (provider === \"xai\") return isXaiSearchAvailable(options.extensionContext);\n\tif (provider === \"brightdata\") return isBrightDataAvailable();\n\tif (provider === \"serpbase\") return isSerpBaseAvailable();\n\tif (provider === \"perplexity\") return isPerplexityAvailable();\n\tif (provider === \"searxng\") return isSearXNGAvailable();\n\tif (provider === \"duckduckgo\") return isDuckDuckGoAvailable();\n\tif (provider === \"gemini\") return isGeminiApiAvailable() || !!(await isGeminiWebAvailable());\n\treturn isExaAvailable();\n}\n\nfunction providerLabel(provider: ResolvedSearchProvider): string {\n\tif (provider === \"openai\") return \"OpenAI\";\n\tif (provider === \"tinyfish\") return \"TinyFish\";\n\tif (provider === \"search1api\") return \"Search1API\";\n\tif (provider === \"searchinfinity\") return \"Searchinfinity\";\n\tif (provider === \"querit\") return \"Querit\";\n\tif (provider === \"serpdive\") return \"SERPdive\";\n\tif (provider === \"searxng\") return \"SearXNG\";\n\tif (provider === \"duckduckgo\") return \"DuckDuckGo\";\n\tif (provider === \"kagi\") return \"Kagi\";\n\tif (provider === \"bocha\") return \"Bocha\";\n\tif (provider === \"ollama\") return \"Ollama\";\n\tif (provider === \"xai\") return \"xAI\";\n\tif (provider === \"brightdata\") return \"Bright Data\";\n\tif (provider === \"serpbase\") return \"SerpBase\";\n\treturn provider.charAt(0).toUpperCase() + provider.slice(1);\n}\n\nasync function searchWithAllProvider(\n\tprovider: ResolvedSearchProvider,\n\tquery: string,\n\toptions: FullSearchOptions,\n): Promise<AttributedSearchResponse> {\n\tif (provider !== \"gemini\") return searchWithResolvedProvider(provider, query, options);\n\tconst result = await searchWithGeminiApi(query, options);\n\tif (result) return { ...result, provider };\n\tthrow new Error(\"Gemini API search returned no results.\");\n}\n\nasync function searchWithProviders(\n\tquery: string,\n\toptions: FullSearchOptions,\n\tselectedProviders?: ResolvedSearchProvider[],\n): Promise<AttributedSearchResponse> {\n\tconst providers = selectedProviders ?? (await Promise.all(ALL_SEARCH_PROVIDERS.map(async (provider) => ({\n\t\tprovider,\n\t\tavailable: provider === \"gemini\"\n\t\t\t? isGeminiApiAvailable()\n\t\t\t: await isResolvedProviderAvailable(provider, options),\n\t})))).filter((entry) => entry.available).map((entry) => entry.provider);\n\tif (providers.length === 0) {\n\t\tthrow new Error(\"No configured search provider available for provider \\\"all\\\". AnySearch, xAI, Bright Data, and SerpBase are excluded.\");\n\t}\n\n\tconst settled = await Promise.allSettled(\n\t\tproviders.map((provider) => selectedProviders\n\t\t\t? searchWithResolvedProvider(provider, query, options)\n\t\t\t: searchWithAllProvider(provider, query, options)),\n\t);\n\tif (options.signal?.aborted) throw new Error(\"Aborted\");\n\n\tconst successes: AttributedSearchResponse[] = [];\n\tconst failures: Array<{ provider: ResolvedSearchProvider; error: string }> = [];\n\tfor (let index = 0; index < settled.length; index++) {\n\t\tconst outcome = settled[index];\n\t\tif (outcome.status === \"fulfilled\") {\n\t\t\tsuccesses.push(outcome.value);\n\t\t} else {\n\t\t\tfailures.push({ provider: providers[index], error: errorMessage(outcome.reason) });\n\t\t}\n\t}\n\tif (successes.length === 0) {\n\t\tconst label = selectedProviders ? \"Selected-provider\" : \"All-provider\";\n\t\tthrow new Error(`${label} search failed:\\n - ${failures.map(({ provider, error }) => `${providerLabel(provider)}: ${error}`).join(\"\\n - \")}`);\n\t}\n\n\tconst results: SearchResult[] = [];\n\tconst seenResultUrls = new Set<string>();\n\tconst inlineContent: NonNullable<SearchResponse[\"inlineContent\"]> = [];\n\tconst seenInlineUrls = new Set<string>();\n\tfor (const response of successes) {\n\t\tfor (const result of response.results) {\n\t\t\tif (seenResultUrls.has(result.url)) continue;\n\t\t\tseenResultUrls.add(result.url);\n\t\t\tresults.push(result);\n\t\t}\n\t\tfor (const content of response.inlineContent ?? []) {\n\t\t\tif (seenInlineUrls.has(content.url)) continue;\n\t\t\tseenInlineUrls.add(content.url);\n\t\t\tinlineContent.push(content);\n\t\t}\n\t}\n\n\tconst answerSections = successes.map((response) =>\n\t\t`## ${providerLabel(response.provider as ResolvedSearchProvider)}\\n\\n${response.answer || \"(No answer text returned.)\"}`\n\t);\n\tif (failures.length > 0) {\n\t\tanswerSections.push(\n\t\t\t`## Provider errors\\n\\n${failures.map(({ provider, error }) => `- **${providerLabel(provider)}:** ${error}`).join(\"\\n\")}`,\n\t\t);\n\t}\n\n\treturn {\n\t\tprovider: \"all\",\n\t\tanswer: answerSections.join(\"\\n\\n\"),\n\t\tresults,\n\t\tproviderResponses: successes as ProviderSearchResponse[],\n\t\t...(failures.length > 0 ? { providerErrors: failures } : {}),\n\t\t...(inlineContent.length > 0 ? { inlineContent } : {}),\n\t};\n}\n\nasync function searchWithConfiguredRouting(\n\tquery: string,\n\toptions: FullSearchOptions,\n\trouting: SearchRoutingConfig,\n): Promise<AttributedSearchResponse> {\n\tconst diagnostics: string[] = [];\n\tfor (const provider of routing.providers) {\n\t\tif (!(await isResolvedProviderAvailable(provider, options))) {\n\t\t\tdiagnostics.push(`${provider}: unavailable`);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\treturn await searchWithResolvedProvider(provider, query, options);\n\t\t} catch (err) {\n\t\t\tconst classified = classifyProviderError(provider, err);\n\t\t\tdiagnostics.push(`${provider} [${classified.kind}]: ${errorMessage(err)}`);\n\t\t\tif (!routing.fallbackOn.includes(classified.kind as SearchRoutingConfig[\"fallbackOn\"][number])) {\n\t\t\t\tthrow classified;\n\t\t\t}\n\t\t}\n\t}\n\tthrow new Error(`Configured search routing exhausted:\\n - ${diagnostics.join(\"\\n - \")}`);\n}\n\nexport async function search(query: string, options: FullSearchOptions = {}): Promise<AttributedSearchResponse> {\n\tconst config = getSearchConfig();\n\tconst provider = options.provider === undefined || options.provider === \"auto\"\n\t\t? config.searchProvider\n\t\t: options.provider;\n\tif (Array.isArray(provider)) {\n\t\treturn searchWithProviders(query, options, normalizeResolvedProviderList(provider, \"provider\"));\n\t}\n\tif (provider === \"all\") return searchWithProviders(query, options);\n\tif (provider !== \"auto\") return searchWithResolvedProvider(provider, query, options);\n\tif (!config.searchProviderConfigured && config.searchRouting) {\n\t\treturn searchWithConfiguredRouting(query, options, config.searchRouting);\n\t}\n\n\tconst fallbackErrors: string[] = [];\n\n\tif (isSearXNGAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSearXNG(query, options);\n\t\t\treturn { ...result, provider: \"searxng\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`SearXNG: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (shouldTryOpenAIInAuto(options)) {\n\t\ttry {\n\t\t\tif (await isOpenAISearchAvailable(options.extensionContext)) {\n\t\t\t\tconst result = await searchWithOpenAI(query, options, options.extensionContext);\n\t\t\t\treturn { ...result, provider: \"openai\" };\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`OpenAI: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isExaAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithExa(query, options);\n\t\t\tif (result) return { ...result, provider: \"exa\" };\n\t\t} catch (err) {\n\t\t\tif (err instanceof CredentialResolutionError || isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Exa: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isBraveAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithBrave(query, options);\n\t\t\treturn { ...result, provider: \"brave\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Brave: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isParallelAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithParallel(query, options);\n\t\t\treturn { ...result, provider: \"parallel\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Parallel: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isTinyFishAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithTinyFish(query, options);\n\t\t\treturn { ...result, provider: \"tinyfish\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`TinyFish: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isSearch1APIAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSearch1API(query, options);\n\t\t\treturn { ...result, provider: \"search1api\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Search1API: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isSearchinfinityAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSearchinfinity(query, options);\n\t\t\treturn { ...result, provider: \"searchinfinity\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Searchinfinity: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isQueritAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithQuerit(query, options);\n\t\t\treturn { ...result, provider: \"querit\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Querit: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isTavilyAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithTavily(query, options);\n\t\t\treturn { ...result, provider: \"tavily\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Tavily: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isJinaSearchAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithJina(query, options);\n\t\t\treturn { ...result, provider: \"jina\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Jina: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isSerpdiveAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithSerpdive(query, options);\n\t\t\treturn { ...result, provider: \"serpdive\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`SERPdive: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isKagiAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithKagi(query, options);\n\t\t\treturn { ...result, provider: \"kagi\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Kagi: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isBochaAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithBocha(query, options);\n\t\t\treturn { ...result, provider: \"bocha\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Bocha: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isOllamaAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithOllama(query, options);\n\t\t\treturn { ...result, provider: \"ollama\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Ollama: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\tif (isPerplexityAvailable()) {\n\t\ttry {\n\t\t\tconst result = await searchWithPerplexity(query, options);\n\t\t\treturn { ...result, provider: \"perplexity\" };\n\t\t} catch (err) {\n\t\t\tif (isAbortError(err)) throw err;\n\t\t\tfallbackErrors.push(`Perplexity: ${errorMessage(err)}`);\n\t\t}\n\t}\n\n\ttry {\n\t\tconst geminiResult = await searchWithGemini(query, options, false);\n\t\tif (geminiResult) return { ...geminiResult, provider: \"gemini\" };\n\t} catch (err) {\n\t\tif (isAbortError(err)) throw err;\n\t\tfallbackErrors.push(`Gemini: ${errorMessage(err)}`);\n\t}\n\n\tif (fallbackErrors.length > 0) {\n\t\tthrow new Error(`Auto provider search failed:\\n - ${fallbackErrors.join(\"\\n - \")}`);\n\t}\n\n\tthrow new Error(\n\t\t\"No search provider available. Either:\\n\" +\n\t\t\" 1. Use /login to sign in with a Codex subscription for OpenAI web search\\n\" +\n\t\t` 2. Set openaiApiKey, braveApiKey, parallelApiKey, tinyfishApiKey, search1apiApiKey, searchinfinityApiKey, queritApiKey, tavilyApiKey, jinaApiKey, serpdiveApiKey, kagiApiKey, ollamaApiKey, searxngBaseUrl, perplexityApiKey, exaApiKey, geminiApiKey, bochaApiKey, or cloudflareApiKey in ${CONFIG_PATH}\\n` +\n\t\t\" 3. Set OPENAI_API_KEY, BRAVE_API_KEY, PARALLEL_API_KEY, TINYFISH_API_KEY, SEARCH1API_KEY, SEARCHINFINITY_API_KEY, QUERIT_API_KEY, TAVILY_API_KEY, JINA_API_KEY, SERPDIVE_API_KEY, KAGI_API_KEY, BOCHA_API_KEY, OLLAMA_API_KEY, SEARXNG_BASE_URL, EXA_API_KEY, PERPLEXITY_API_KEY, GEMINI_API_KEY, or CLOUDFLARE_API_KEY env vars\\n\" +\n\t\t\" 4. Set GOOGLE_GEMINI_BASE_URL with CLOUDFLARE_API_KEY for Cloudflare AI Gateway routing\\n\" +\n\t\t\" 5. Sign into gemini.google.com in a supported Chromium-based browser\\n\" +\n\t\t\" 6. Explicitly select provider: \\\"anysearch\\\" for anonymous AnySearch, \\\"xai\\\" for Grok, \\\"brightdata\\\" with brightdataSerpZone for paid Bright Data SERP, or \\\"serpbase\\\" with serpbaseApiKey for paid Google SERP\"\n\t);\n}\n\nasync function searchWithGeminiApi(query: string, options: SearchOptions = {}): Promise<SearchResponse | null> {\n\tconst requestSignal = AbortSignal.any([\n\t\tAbortSignal.timeout(120000),\n\t\t...(options.signal ? [options.signal] : []),\n\t]);\n\tconst apiKey = await getApiKey(requestSignal);\n\tif (!apiKey && !isGatewayConfigured()) return null;\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\n\ttry {\n\t\tconst model = getSearchConfig().searchModel ?? DEFAULT_SEARCH_MODEL;\n\t\tconst body = {\n\t\t\tcontents: [{ role: \"user\", parts: [{ text: query }] }],\n\t\t\ttools: [{ google_search: {} }],\n\t\t};\n\n\t\tconst res = await fetchGeminiApi(`${getVersionedApiBase()}/models/${model}:generateContent`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal,\n\t\t}, apiKey);\n\n\t\tif (!res.ok) {\n\t\t\tconst errorText = redactGeminiApiResponse(res, await res.text(), apiKey);\n\t\t\tthrow new Error(`Gemini API error ${res.status}: ${errorText.slice(0, 300)}`);\n\t\t}\n\n\t\tconst data = await res.json() as GeminiSearchResponse;\n\t\tactivityMonitor.logComplete(activityId, res.status);\n\n\t\tconst answer = data.candidates?.[0]?.content?.parts\n\t\t\t?.map(p => p.text).filter(Boolean).join(\"\\n\") ?? \"\";\n\n\t\tconst metadata = data.candidates?.[0]?.groundingMetadata;\n\t\tconst results = await resolveGroundingChunks(metadata?.groundingChunks, options.signal);\n\n\t\tif (!answer && results.length === 0) return null;\n\t\treturn { answer, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\tthrow err;\n\t}\n}\n\nasync function searchWithGeminiWeb(query: string, options: SearchOptions = {}): Promise<SearchResponse | null> {\n\tconst cookies = await isGeminiWebAvailable();\n\tif (!cookies) return null;\n\n\tconst prompt = buildSearchPrompt(query, options);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\n\ttry {\n\t\tconst text = await queryWithCookies(prompt, cookies, {\n\t\t\tsignal: options.signal,\n\t\t\ttimeoutMs: 120000,\n\t\t});\n\n\t\tactivityMonitor.logComplete(activityId, 200);\n\n\t\tconst results = extractSourceUrls(text);\n\t\treturn { answer: text, results };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\tthrow err;\n\t}\n}\n\nfunction buildSearchPrompt(query: string, options: SearchOptions): string {\n\tlet prompt = `Search the web and answer the following question. Include source URLs for your claims.\\nFormat your response as:\\n1. A direct answer to the question\\n2. Cited sources as markdown links\\n\\nQuestion: ${query}`;\n\n\tif (options.recencyFilter) {\n\t\tconst labels: Record<string, string> = {\n\t\t\tday: \"past 24 hours\",\n\t\t\tweek: \"past week\",\n\t\t\tmonth: \"past month\",\n\t\t\tyear: \"past year\",\n\t\t};\n\t\tprompt += `\\n\\nOnly include results from the ${labels[options.recencyFilter]}.`;\n\t}\n\n\tif (options.domainFilter?.length) {\n\t\tconst includes = options.domainFilter.filter(d => !d.startsWith(\"-\"));\n\t\tconst excludes = options.domainFilter.filter(d => d.startsWith(\"-\")).map(d => d.slice(1));\n\t\tif (includes.length) prompt += `\\n\\nOnly cite sources from: ${includes.join(\", \")}`;\n\t\tif (excludes.length) prompt += `\\n\\nDo not cite sources from: ${excludes.join(\", \")}`;\n\t}\n\n\treturn prompt;\n}\n\nfunction extractSourceUrls(markdown: string): SearchResult[] {\n\tconst results: SearchResult[] = [];\n\tconst seen = new Set<string>();\n\tconst linkRegex = /\\[([^\\]]+)\\]\\((https?:\\/\\/[^)]+)\\)/g;\n\tfor (const match of markdown.matchAll(linkRegex)) {\n\t\tconst url = match[2];\n\t\tif (seen.has(url)) continue;\n\t\tseen.add(url);\n\t\tresults.push({ title: match[1], url, snippet: \"\" });\n\t}\n\treturn results;\n}\n\nasync function resolveGroundingChunks(\n\tchunks: GroundingChunk[] | undefined,\n\tsignal?: AbortSignal,\n): Promise<SearchResult[]> {\n\tif (!chunks?.length) return [];\n\n\tconst results: SearchResult[] = [];\n\tfor (const chunk of chunks) {\n\t\tif (!chunk.web) continue;\n\t\tconst title = chunk.web.title || \"\";\n\t\tlet url = chunk.web.uri || \"\";\n\n\t\tif (url.includes(\"vertexaisearch.cloud.google.com/grounding-api-redirect\")) {\n\t\t\tconst resolved = await resolveRedirect(url, signal);\n\t\t\tif (resolved) url = resolved;\n\t\t}\n\n\t\tif (url) results.push({ title, url, snippet: \"\" });\n\t}\n\treturn results;\n}\n\nasync function resolveRedirect(proxyUrl: string, signal?: AbortSignal): Promise<string | null> {\n\ttry {\n\t\tconst res = await fetch(proxyUrl, {\n\t\t\tmethod: \"HEAD\",\n\t\t\tredirect: \"manual\",\n\t\t\tsignal: AbortSignal.any([\n\t\t\t\tAbortSignal.timeout(5000),\n\t\t\t\t...(signal ? [signal] : []),\n\t\t\t]),\n\t\t});\n\t\treturn res.headers.get(\"location\") || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\ninterface GeminiSearchResponse {\n\tcandidates?: Array<{\n\t\tcontent?: { parts?: Array<{ text?: string }> };\n\t\tgroundingMetadata?: {\n\t\t\twebSearchQueries?: string[];\n\t\t\tgroundingChunks?: GroundingChunk[];\n\t\t\tgroundingSupports?: Array<{\n\t\t\t\tsegment?: { startIndex?: number; endIndex?: number; text?: string };\n\t\t\t\tgroundingChunkIndices?: number[];\n\t\t\t}>;\n\t\t};\n\t}>;\n}\n\ninterface GroundingChunk {\n\tweb?: { uri?: string; title?: string };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { type ExtractedContent } from "./extract.ts";
2
+ export declare function extractWithUrlContext(url: string, signal?: AbortSignal): Promise<ExtractedContent | null>;
3
+ export declare function extractWithGeminiWeb(url: string, signal?: AbortSignal): Promise<ExtractedContent | null>;
4
+ //# sourceMappingURL=gemini-url-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-url-context.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/gemini-url-context.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAa1E,wBAAsB,qBAAqB,CAC1C,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAyDlC;AAED,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA4BlC","sourcesContent":["import { activityMonitor } from \"./activity.ts\";\nimport { CredentialResolutionError } from \"./credential-source.ts\";\nimport { getApiKey, getVersionedApiBase, fetchGeminiApi, isGatewayConfigured, DEFAULT_MODEL } from \"./gemini-api.ts\";\nimport { isGeminiWebAvailable, queryWithCookies } from \"./gemini-web.ts\";\nimport { extractHeadingTitle, type ExtractedContent } from \"./extract.ts\";\n\nconst EXTRACTION_PROMPT = `Extract the complete readable content from this URL as clean markdown.\nInclude the page title, all text content, code blocks, and tables.\nDo not summarize — extract the full content.\n\nURL: `;\n\nfunction shouldRethrow(err: unknown): boolean {\n\tconst message = err instanceof Error ? err.message : String(err);\n\treturn err instanceof CredentialResolutionError || message.startsWith(\"Failed to parse \");\n}\n\nexport async function extractWithUrlContext(\n\turl: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent | null> {\n\tconst requestSignal = AbortSignal.any([\n\t\tAbortSignal.timeout(60000),\n\t\t...(signal ? [signal] : []),\n\t]);\n\tconst apiKey = await getApiKey(requestSignal);\n\tif (!apiKey && !isGatewayConfigured()) return null;\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query: `url_context: ${url}` });\n\n\ttry {\n\t\tconst model = DEFAULT_MODEL;\n\t\tconst body = {\n\t\t\tcontents: [{ role: \"user\", parts: [{ text: EXTRACTION_PROMPT + url }] }],\n\t\t\ttools: [{ url_context: {} }],\n\t\t};\n\n\t\tconst res = await fetchGeminiApi(`${getVersionedApiBase()}/models/${model}:generateContent`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal,\n\t\t}, apiKey);\n\n\t\tif (!res.ok) {\n\t\t\tactivityMonitor.logComplete(activityId, res.status);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst data = await res.json() as UrlContextResponse;\n\t\tactivityMonitor.logComplete(activityId, res.status);\n\n\t\tconst metadata = data.candidates?.[0]?.url_context_metadata;\n\t\tif (metadata?.url_metadata?.length) {\n\t\t\tconst status = metadata.url_metadata[0].url_retrieval_status;\n\t\t\tif (status === \"URL_RETRIEVAL_STATUS_UNSAFE\" || status === \"URL_RETRIEVAL_STATUS_ERROR\") {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tconst content = data.candidates?.[0]?.content?.parts\n\t\t\t?.map(p => p.text).filter(Boolean).join(\"\\n\") ?? \"\";\n\n\t\tif (!content || content.length < 50) return null;\n\n\t\tconst title = extractTitleFromContent(content, url);\n\t\treturn { url, title, content, error: null };\n\t} catch (err) {\n\t\tif (shouldRethrow(err)) throw err;\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\treturn null;\n\t}\n}\n\nexport async function extractWithGeminiWeb(\n\turl: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent | null> {\n\tconst cookies = await isGeminiWebAvailable();\n\tif (!cookies) return null;\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query: `gemini_web: ${url}` });\n\n\ttry {\n\t\tconst text = await queryWithCookies(EXTRACTION_PROMPT + url, cookies, {\n\t\t\tsignal,\n\t\t\ttimeoutMs: 60000,\n\t\t});\n\n\t\tactivityMonitor.logComplete(activityId, 200);\n\n\t\tif (!text || text.length < 50) return null;\n\n\t\tconst title = extractTitleFromContent(text, url);\n\t\treturn { url, title, content: text, error: null };\n\t} catch (err) {\n\t\tif (shouldRethrow(err)) throw err;\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\treturn null;\n\t}\n}\n\nfunction extractTitleFromContent(text: string, url: string): string {\n\treturn extractHeadingTitle(text) ?? (new URL(url).pathname.split(\"/\").pop() || url);\n}\n\ninterface UrlContextResponse {\n\tcandidates?: Array<{\n\t\tcontent?: { parts?: Array<{ text?: string }> };\n\t\turl_context_metadata?: {\n\t\t\turl_metadata?: Array<{\n\t\t\t\tretrieved_url?: string;\n\t\t\t\turl_retrieval_status?: string;\n\t\t\t}>;\n\t\t};\n\t}>;\n}\n"]}
@@ -0,0 +1,101 @@
1
+ import { activityMonitor } from "./activity.js";
2
+ import { CredentialResolutionError } from "./credential-source.js";
3
+ import { getApiKey, getVersionedApiBase, fetchGeminiApi, isGatewayConfigured, DEFAULT_MODEL } from "./gemini-api.js";
4
+ import { isGeminiWebAvailable, queryWithCookies } from "./gemini-web.js";
5
+ import { extractHeadingTitle } from "./extract.js";
6
+ const EXTRACTION_PROMPT = `Extract the complete readable content from this URL as clean markdown.
7
+ Include the page title, all text content, code blocks, and tables.
8
+ Do not summarize — extract the full content.
9
+
10
+ URL: `;
11
+ function shouldRethrow(err) {
12
+ const message = err instanceof Error ? err.message : String(err);
13
+ return err instanceof CredentialResolutionError || message.startsWith("Failed to parse ");
14
+ }
15
+ export async function extractWithUrlContext(url, signal) {
16
+ const requestSignal = AbortSignal.any([
17
+ AbortSignal.timeout(60000),
18
+ ...(signal ? [signal] : []),
19
+ ]);
20
+ const apiKey = await getApiKey(requestSignal);
21
+ if (!apiKey && !isGatewayConfigured())
22
+ return null;
23
+ const activityId = activityMonitor.logStart({ type: "api", query: `url_context: ${url}` });
24
+ try {
25
+ const model = DEFAULT_MODEL;
26
+ const body = {
27
+ contents: [{ role: "user", parts: [{ text: EXTRACTION_PROMPT + url }] }],
28
+ tools: [{ url_context: {} }],
29
+ };
30
+ const res = await fetchGeminiApi(`${getVersionedApiBase()}/models/${model}:generateContent`, {
31
+ method: "POST",
32
+ headers: { "Content-Type": "application/json" },
33
+ body: JSON.stringify(body),
34
+ signal: requestSignal,
35
+ }, apiKey);
36
+ if (!res.ok) {
37
+ activityMonitor.logComplete(activityId, res.status);
38
+ return null;
39
+ }
40
+ const data = await res.json();
41
+ activityMonitor.logComplete(activityId, res.status);
42
+ const metadata = data.candidates?.[0]?.url_context_metadata;
43
+ if (metadata?.url_metadata?.length) {
44
+ const status = metadata.url_metadata[0].url_retrieval_status;
45
+ if (status === "URL_RETRIEVAL_STATUS_UNSAFE" || status === "URL_RETRIEVAL_STATUS_ERROR") {
46
+ return null;
47
+ }
48
+ }
49
+ const content = data.candidates?.[0]?.content?.parts
50
+ ?.map(p => p.text).filter(Boolean).join("\n") ?? "";
51
+ if (!content || content.length < 50)
52
+ return null;
53
+ const title = extractTitleFromContent(content, url);
54
+ return { url, title, content, error: null };
55
+ }
56
+ catch (err) {
57
+ if (shouldRethrow(err))
58
+ throw err;
59
+ const message = err instanceof Error ? err.message : String(err);
60
+ if (message.toLowerCase().includes("abort")) {
61
+ activityMonitor.logComplete(activityId, 0);
62
+ }
63
+ else {
64
+ activityMonitor.logError(activityId, message);
65
+ }
66
+ return null;
67
+ }
68
+ }
69
+ export async function extractWithGeminiWeb(url, signal) {
70
+ const cookies = await isGeminiWebAvailable();
71
+ if (!cookies)
72
+ return null;
73
+ const activityId = activityMonitor.logStart({ type: "api", query: `gemini_web: ${url}` });
74
+ try {
75
+ const text = await queryWithCookies(EXTRACTION_PROMPT + url, cookies, {
76
+ signal,
77
+ timeoutMs: 60000,
78
+ });
79
+ activityMonitor.logComplete(activityId, 200);
80
+ if (!text || text.length < 50)
81
+ return null;
82
+ const title = extractTitleFromContent(text, url);
83
+ return { url, title, content: text, error: null };
84
+ }
85
+ catch (err) {
86
+ if (shouldRethrow(err))
87
+ throw err;
88
+ const message = err instanceof Error ? err.message : String(err);
89
+ if (message.toLowerCase().includes("abort")) {
90
+ activityMonitor.logComplete(activityId, 0);
91
+ }
92
+ else {
93
+ activityMonitor.logError(activityId, message);
94
+ }
95
+ return null;
96
+ }
97
+ }
98
+ function extractTitleFromContent(text, url) {
99
+ return extractHeadingTitle(text) ?? (new URL(url).pathname.split("/").pop() || url);
100
+ }
101
+ //# sourceMappingURL=gemini-url-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-url-context.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/gemini-url-context.ts"],"names":[],"mappings":"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","sourcesContent":["import { activityMonitor } from \"./activity.ts\";\nimport { CredentialResolutionError } from \"./credential-source.ts\";\nimport { getApiKey, getVersionedApiBase, fetchGeminiApi, isGatewayConfigured, DEFAULT_MODEL } from \"./gemini-api.ts\";\nimport { isGeminiWebAvailable, queryWithCookies } from \"./gemini-web.ts\";\nimport { extractHeadingTitle, type ExtractedContent } from \"./extract.ts\";\n\nconst EXTRACTION_PROMPT = `Extract the complete readable content from this URL as clean markdown.\nInclude the page title, all text content, code blocks, and tables.\nDo not summarize — extract the full content.\n\nURL: `;\n\nfunction shouldRethrow(err: unknown): boolean {\n\tconst message = err instanceof Error ? err.message : String(err);\n\treturn err instanceof CredentialResolutionError || message.startsWith(\"Failed to parse \");\n}\n\nexport async function extractWithUrlContext(\n\turl: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent | null> {\n\tconst requestSignal = AbortSignal.any([\n\t\tAbortSignal.timeout(60000),\n\t\t...(signal ? [signal] : []),\n\t]);\n\tconst apiKey = await getApiKey(requestSignal);\n\tif (!apiKey && !isGatewayConfigured()) return null;\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query: `url_context: ${url}` });\n\n\ttry {\n\t\tconst model = DEFAULT_MODEL;\n\t\tconst body = {\n\t\t\tcontents: [{ role: \"user\", parts: [{ text: EXTRACTION_PROMPT + url }] }],\n\t\t\ttools: [{ url_context: {} }],\n\t\t};\n\n\t\tconst res = await fetchGeminiApi(`${getVersionedApiBase()}/models/${model}:generateContent`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal,\n\t\t}, apiKey);\n\n\t\tif (!res.ok) {\n\t\t\tactivityMonitor.logComplete(activityId, res.status);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst data = await res.json() as UrlContextResponse;\n\t\tactivityMonitor.logComplete(activityId, res.status);\n\n\t\tconst metadata = data.candidates?.[0]?.url_context_metadata;\n\t\tif (metadata?.url_metadata?.length) {\n\t\t\tconst status = metadata.url_metadata[0].url_retrieval_status;\n\t\t\tif (status === \"URL_RETRIEVAL_STATUS_UNSAFE\" || status === \"URL_RETRIEVAL_STATUS_ERROR\") {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tconst content = data.candidates?.[0]?.content?.parts\n\t\t\t?.map(p => p.text).filter(Boolean).join(\"\\n\") ?? \"\";\n\n\t\tif (!content || content.length < 50) return null;\n\n\t\tconst title = extractTitleFromContent(content, url);\n\t\treturn { url, title, content, error: null };\n\t} catch (err) {\n\t\tif (shouldRethrow(err)) throw err;\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\treturn null;\n\t}\n}\n\nexport async function extractWithGeminiWeb(\n\turl: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent | null> {\n\tconst cookies = await isGeminiWebAvailable();\n\tif (!cookies) return null;\n\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query: `gemini_web: ${url}` });\n\n\ttry {\n\t\tconst text = await queryWithCookies(EXTRACTION_PROMPT + url, cookies, {\n\t\t\tsignal,\n\t\t\ttimeoutMs: 60000,\n\t\t});\n\n\t\tactivityMonitor.logComplete(activityId, 200);\n\n\t\tif (!text || text.length < 50) return null;\n\n\t\tconst title = extractTitleFromContent(text, url);\n\t\treturn { url, title, content: text, error: null };\n\t} catch (err) {\n\t\tif (shouldRethrow(err)) throw err;\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tif (message.toLowerCase().includes(\"abort\")) {\n\t\t\tactivityMonitor.logComplete(activityId, 0);\n\t\t} else {\n\t\t\tactivityMonitor.logError(activityId, message);\n\t\t}\n\t\treturn null;\n\t}\n}\n\nfunction extractTitleFromContent(text: string, url: string): string {\n\treturn extractHeadingTitle(text) ?? (new URL(url).pathname.split(\"/\").pop() || url);\n}\n\ninterface UrlContextResponse {\n\tcandidates?: Array<{\n\t\tcontent?: { parts?: Array<{ text?: string }> };\n\t\turl_context_metadata?: {\n\t\t\turl_metadata?: Array<{\n\t\t\t\tretrieved_url?: string;\n\t\t\t\turl_retrieval_status?: string;\n\t\t\t}>;\n\t\t};\n\t}>;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export declare function normalizeChromeProfile(value: unknown): string | undefined;
2
+ export declare function getChromeProfileFromConfig(): string | undefined;
3
+ export declare function isBrowserCookieAccessAllowed(): boolean;
4
+ //# sourceMappingURL=gemini-web-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-web-config.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/gemini-web-config.ts"],"names":[],"mappings":"AAYA,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIzE;AAyBD,wBAAgB,0BAA0B,IAAI,MAAM,GAAG,SAAS,CAE/D;AAED,wBAAgB,4BAA4B,IAAI,OAAO,CAKtD","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst CONFIG_PATH = getWebSearchConfigPath();\n\ninterface GeminiWebConfig {\n\tchromeProfile?: string;\n\tallowBrowserCookies?: boolean;\n}\n\nlet cachedConfig: GeminiWebConfig | null = null;\n\nexport function normalizeChromeProfile(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nfunction loadConfig(): GeminiWebConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst rawText = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet raw: { chromeProfile?: unknown; allowBrowserCookies?: unknown };\n\ttry {\n\t\traw = JSON.parse(rawText) as { chromeProfile?: unknown; allowBrowserCookies?: unknown };\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\tcachedConfig = {\n\t\tchromeProfile: normalizeChromeProfile(raw.chromeProfile),\n\t\tallowBrowserCookies: raw.allowBrowserCookies === true,\n\t};\n\treturn cachedConfig;\n}\n\nexport function getChromeProfileFromConfig(): string | undefined {\n\treturn loadConfig().chromeProfile;\n}\n\nexport function isBrowserCookieAccessAllowed(): boolean {\n\tif (process.env.PI_ALLOW_BROWSER_COOKIES === \"1\" || process.env.FEYNMAN_ALLOW_BROWSER_COOKIES === \"1\") {\n\t\treturn true;\n\t}\n\treturn loadConfig().allowBrowserCookies === true;\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { getWebSearchConfigPath } from "./utils.js";
3
+ const CONFIG_PATH = getWebSearchConfigPath();
4
+ let cachedConfig = null;
5
+ export function normalizeChromeProfile(value) {
6
+ if (typeof value !== "string")
7
+ return undefined;
8
+ const normalized = value.trim();
9
+ return normalized.length > 0 ? normalized : undefined;
10
+ }
11
+ function loadConfig() {
12
+ if (cachedConfig)
13
+ return cachedConfig;
14
+ if (!existsSync(CONFIG_PATH)) {
15
+ cachedConfig = {};
16
+ return cachedConfig;
17
+ }
18
+ const rawText = readFileSync(CONFIG_PATH, "utf-8");
19
+ let raw;
20
+ try {
21
+ raw = JSON.parse(rawText);
22
+ }
23
+ catch (err) {
24
+ const message = err instanceof Error ? err.message : String(err);
25
+ throw new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);
26
+ }
27
+ cachedConfig = {
28
+ chromeProfile: normalizeChromeProfile(raw.chromeProfile),
29
+ allowBrowserCookies: raw.allowBrowserCookies === true,
30
+ };
31
+ return cachedConfig;
32
+ }
33
+ export function getChromeProfileFromConfig() {
34
+ return loadConfig().chromeProfile;
35
+ }
36
+ export function isBrowserCookieAccessAllowed() {
37
+ if (process.env.PI_ALLOW_BROWSER_COOKIES === "1" || process.env.FEYNMAN_ALLOW_BROWSER_COOKIES === "1") {
38
+ return true;
39
+ }
40
+ return loadConfig().allowBrowserCookies === true;
41
+ }
42
+ //# sourceMappingURL=gemini-web-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-web-config.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/gemini-web-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,GAAG,sBAAsB,EAAE,CAAC;AAO7C,IAAI,YAAY,GAA2B,IAAI,CAAC;AAEhD,MAAM,UAAU,sBAAsB,CAAC,KAAc,EAAsB;IAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CACtD;AAED,SAAS,UAAU,GAAoB;IACtC,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,YAAY,GAAG,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,GAA+D,CAAC;IACpE,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA+D,CAAC;IACzF,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,WAAW,KAAK,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,YAAY,GAAG;QACd,aAAa,EAAE,sBAAsB,CAAC,GAAG,CAAC,aAAa,CAAC;QACxD,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,KAAK,IAAI;KACrD,CAAC;IACF,OAAO,YAAY,CAAC;AAAA,CACpB;AAED,MAAM,UAAU,0BAA0B,GAAuB;IAChE,OAAO,UAAU,EAAE,CAAC,aAAa,CAAC;AAAA,CAClC;AAED,MAAM,UAAU,4BAA4B,GAAY;IACvD,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,GAAG,EAAE,CAAC;QACvG,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,UAAU,EAAE,CAAC,mBAAmB,KAAK,IAAI,CAAC;AAAA,CACjD","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst CONFIG_PATH = getWebSearchConfigPath();\n\ninterface GeminiWebConfig {\n\tchromeProfile?: string;\n\tallowBrowserCookies?: boolean;\n}\n\nlet cachedConfig: GeminiWebConfig | null = null;\n\nexport function normalizeChromeProfile(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nfunction loadConfig(): GeminiWebConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst rawText = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet raw: { chromeProfile?: unknown; allowBrowserCookies?: unknown };\n\ttry {\n\t\traw = JSON.parse(rawText) as { chromeProfile?: unknown; allowBrowserCookies?: unknown };\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\tcachedConfig = {\n\t\tchromeProfile: normalizeChromeProfile(raw.chromeProfile),\n\t\tallowBrowserCookies: raw.allowBrowserCookies === true,\n\t};\n\treturn cachedConfig;\n}\n\nexport function getChromeProfileFromConfig(): string | undefined {\n\treturn loadConfig().chromeProfile;\n}\n\nexport function isBrowserCookieAccessAllowed(): boolean {\n\tif (process.env.PI_ALLOW_BROWSER_COOKIES === \"1\" || process.env.FEYNMAN_ALLOW_BROWSER_COOKIES === \"1\") {\n\t\treturn true;\n\t}\n\treturn loadConfig().allowBrowserCookies === true;\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { type CookieMap } from "./chrome-cookies.ts";
2
+ export declare const DEFAULT_GEMINI_WEB_MODEL = "gemini-3.1-pro";
3
+ export declare function setGeminiFetchOverrideForTests(fetchImpl: typeof fetch | null): void;
4
+ export declare const GEMINI_MAX_HEADER_SIZE: number;
5
+ export declare function createGeminiFetch(undiciImpl: typeof import("undici")): typeof fetch;
6
+ export declare function resolveGeminiFetch(): Promise<typeof fetch>;
7
+ export interface GeminiWebOptions {
8
+ youtubeUrl?: string;
9
+ model?: string;
10
+ files?: string[];
11
+ signal?: AbortSignal;
12
+ timeoutMs?: number;
13
+ }
14
+ export declare function isGeminiWebAvailable(chromeProfile?: string): Promise<CookieMap | null>;
15
+ export declare function getGeminiWebAvailabilityDiagnostic(): string | null;
16
+ export declare function getActiveGoogleEmail(cookies: CookieMap): Promise<string | null>;
17
+ export declare function queryWithCookies(prompt: string, cookieMap: CookieMap, options?: GeminiWebOptions): Promise<string>;
18
+ //# sourceMappingURL=gemini-web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-web.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/gemini-web.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,SAAS,EAAoB,MAAM,qBAAqB,CAAC;AAetG,eAAO,MAAM,wBAAwB,mBAAmB,CAAC;AAyBzD,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,OAAO,KAAK,GAAG,IAAI,GAAG,IAAI,CAEnF;AAOD,eAAO,MAAM,sBAAsB,QAAkB,CAAC;AAKtD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,QAAQ,CAAC,GAAG,OAAO,KAAK,CAiBnF;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,CAchE;AAED,MAAM,WAAW,gBAAgB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,oBAAoB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAS5F;AAED,wBAAgB,kCAAkC,IAAI,MAAM,GAAG,IAAI,CAElE;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BrF;AAED,wBAAsB,gBAAgB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAiBjB","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport { getLastGoogleCookieDiagnostic, type CookieMap, getGoogleCookies } from \"./chrome-cookies.ts\";\nimport { getChromeProfileFromConfig, isBrowserCookieAccessAllowed, normalizeChromeProfile } from \"./gemini-web-config.ts\";\n\nconst GEMINI_APP_URL = \"https://gemini.google.com/app\";\nconst GEMINI_STREAM_GENERATE_URL =\n\t\"https://gemini.google.com/_/BardChatUi/data/assistant.lamda.BardFrontendService/StreamGenerate\";\nconst GEMINI_UPLOAD_URL = \"https://content-push.googleapis.com/upload\";\nconst GEMINI_UPLOAD_PUSH_ID = \"feeds/mcudyrk2a4khkz\";\nconst GOOGLE_LIST_ACCOUNTS_URL =\n\t\"https://accounts.google.com/ListAccounts?gpsia=1&source=ChromiumBrowser&laf=b64bin&json=standard\";\n\nconst USER_AGENT =\n\t\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\";\n\nconst MODEL_HEADER_NAME = \"x-goog-ext-525001261-jspb\";\nexport const DEFAULT_GEMINI_WEB_MODEL = \"gemini-3.1-pro\";\nconst MODEL_HEADERS: Record<string, string> = {\n\t[DEFAULT_GEMINI_WEB_MODEL]: '[1,null,null,null,\"9d8ca3786ebdfbea\",null,null,0,[4]]',\n\t\"gemini-2.5-pro\": '[1,null,null,null,\"4af6c7f5da75d65d\",null,null,0,[4]]',\n\t\"gemini-2.5-flash\": '[1,null,null,null,\"9ec249fc9ad08861\",null,null,0,[4]]',\n};\n\nconst REQUIRED_COOKIES = [\"__Secure-1PSID\", \"__Secure-1PSIDTS\"];\n\n// Gemini Web talks to Google's frontend inside the host agent (pi), whose\n// global undici dispatcher runs HTTP/1.1 with undici's default 16 KiB\n// maxHeaderSize. Google's gemini.google.com /app response headers routinely\n// exceed that budget over HTTP/1.1, so cookie-bearing requests fail with\n// UND_ERR_HEADERS_OVERFLOW surfaced as \"fetch failed\". Route these requests\n// through a dedicated undici Agent with a larger header budget instead; fall\n// back to the ambient global fetch when undici is not resolvable (e.g.\n// standalone test environments).\nlet geminiFetchImpl: typeof fetch | null = null;\n\n// Test-only hook: lets tests inject a simulated transport instead of patching\n// globalThis.fetch. Gemini Web deliberately bypasses the ambient global fetch\n// (inside the pi host agent it is constrained to undici's 16 KiB\n// maxHeaderSize and cannot serve Google's /app page over HTTP/1.1), so\n// globalThis.fetch patching is no longer a reliable way to intercept these\n// requests.\nexport function setGeminiFetchOverrideForTests(fetchImpl: typeof fetch | null): void {\n\tgeminiFetchOverride = fetchImpl;\n}\n\nlet geminiFetchOverride: typeof fetch | null = null;\n\n// The header budget Gemini Web needs for Google frontend responses.\n// Google's /app page exceeds undici's default 16 KiB maxHeaderSize when\n// served over HTTP/1.1, which is how pi's global dispatcher operates.\nexport const GEMINI_MAX_HEADER_SIZE = 4 * 1024 * 1024;\n\n// Build a fetch that routes through a dedicated undici Agent with a larger\n// header budget than the host agent's global dispatcher allows. Exported for\n// tests so the agent configuration can be asserted without network access.\nexport function createGeminiFetch(undiciImpl: typeof import(\"undici\")): typeof fetch {\n\tconst agent = new undiciImpl.EnvHttpProxyAgent({\n\t\tallowH2: false,\n\t\tconnectTimeout: 30_000,\n\t\tmaxHeaderSize: GEMINI_MAX_HEADER_SIZE,\n\t\tpipelining: 1,\n\t});\n\t// undici 8 types its fetch request/response structurally differently from\n\t// the DOM lib types (duplex/textStream on Request, Symbol.dispose on\n\t// Headers); the shape this module uses (status, ok, headers.get, text) is\n\t// identical, so bridge the two.\n\ttype UndiciFetch = typeof undiciImpl.fetch;\n\treturn (input, init) =>\n\t\tundiciImpl.fetch(\n\t\t\tinput as unknown as Parameters<UndiciFetch>[0],\n\t\t\t{ ...init, dispatcher: agent } as unknown as Parameters<UndiciFetch>[1],\n\t\t) as unknown as Promise<Response>;\n}\n\nexport async function resolveGeminiFetch(): Promise<typeof fetch> {\n\tif (geminiFetchOverride) return geminiFetchOverride;\n\tif (geminiFetchImpl) return geminiFetchImpl;\n\n\tlet undici: typeof import(\"undici\");\n\ttry {\n\t\tundici = await import(\"undici\");\n\t} catch {\n\t\tgeminiFetchImpl = fetch;\n\t\treturn geminiFetchImpl;\n\t}\n\n\tgeminiFetchImpl = createGeminiFetch(undici);\n\treturn geminiFetchImpl;\n}\n\nexport interface GeminiWebOptions {\n\tyoutubeUrl?: string;\n\tmodel?: string;\n\tfiles?: string[];\n\tsignal?: AbortSignal;\n\ttimeoutMs?: number;\n}\n\nexport async function isGeminiWebAvailable(chromeProfile?: string): Promise<CookieMap | null> {\n\tif (!isBrowserCookieAccessAllowed()) return null;\n\n\tconst result = await getGoogleCookies({\n\t\tprofile: normalizeChromeProfile(chromeProfile) ?? getChromeProfileFromConfig(),\n\t\trequiredCookies: REQUIRED_COOKIES,\n\t});\n\tif (!result) return null;\n\treturn result.cookies;\n}\n\nexport function getGeminiWebAvailabilityDiagnostic(): string | null {\n\treturn isBrowserCookieAccessAllowed() ? getLastGoogleCookieDiagnostic() : null;\n}\n\nexport async function getActiveGoogleEmail(cookies: CookieMap): Promise<string | null> {\n\tconst cookieHeader = buildCookieHeader(cookies);\n\tif (!cookieHeader) return null;\n\n\ttry {\n\t\tconst html = await fetchWithCookieRedirects(\n\t\t\tGEMINI_APP_URL,\n\t\t\tcookieHeader,\n\t\t\t10,\n\t\t\tAbortSignal.timeout(10000),\n\t\t);\n\t\tconst email = extractEmailFromGeminiHtml(html);\n\t\tif (email) return email;\n\t} catch {\n\t}\n\n\ttry {\n\t\tconst response = await fetchWithCookieRedirects(\n\t\t\tGOOGLE_LIST_ACCOUNTS_URL,\n\t\t\tcookieHeader,\n\t\t\t10,\n\t\t\tAbortSignal.timeout(10000),\n\t\t);\n\t\treturn extractEmailFromListAccounts(response);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function queryWithCookies(\n\tprompt: string,\n\tcookieMap: CookieMap,\n\toptions: GeminiWebOptions = {},\n): Promise<string> {\n\tconst model = options.model ?? DEFAULT_GEMINI_WEB_MODEL;\n\tif (!MODEL_HEADERS[model]) {\n\t\tthrow new Error(`Gemini Web does not support model ${model}; configure Gemini API or choose a supported Gemini Web model.`);\n\t}\n\tconst timeoutMs = options.timeoutMs ?? 120000;\n\n\tlet fullPrompt = prompt;\n\tif (options.youtubeUrl) {\n\t\tfullPrompt = `${fullPrompt}\\n\\nYouTube video: ${options.youtubeUrl}`;\n\t}\n\n\tconst result = await runGeminiWebOnce(fullPrompt, cookieMap, model, options.files, timeoutMs, options.signal);\n\n\tif (result.errorMessage) throw new Error(result.errorMessage);\n\tif (!result.text) throw new Error(\"Gemini Web returned empty response\");\n\treturn result.text;\n}\n\ninterface GeminiWebResult {\n\ttext: string;\n\terrorCode?: number;\n\terrorMessage?: string;\n}\n\nasync function runGeminiWebOnce(\n\tprompt: string,\n\tcookieMap: CookieMap,\n\tmodel: string,\n\tfiles: string[] | undefined,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<GeminiWebResult> {\n\tconst effectiveSignal = withTimeout(signal, timeoutMs);\n\tconst cookieHeader = buildCookieHeader(cookieMap);\n\tconst accessToken = await fetchAccessToken(cookieHeader, effectiveSignal);\n\n\tconst uploaded: Array<{ id: string; name: string }> = [];\n\tif (files) {\n\t\tfor (const filePath of files) {\n\t\t\tuploaded.push(await uploadFile(filePath, cookieHeader, effectiveSignal));\n\t\t}\n\t}\n\n\tconst fReq = buildFReqPayload(prompt, uploaded);\n\tconst params = new URLSearchParams();\n\tparams.set(\"at\", accessToken);\n\tparams.set(\"f.req\", fReq);\n\n\tconst res = await (await resolveGeminiFetch())(GEMINI_STREAM_GENERATE_URL, {\n\t\tmethod: \"POST\",\n\t\tredirect: \"error\",\n\t\theaders: {\n\t\t\t\"content-type\": \"application/x-www-form-urlencoded;charset=utf-8\",\n\t\t\thost: \"gemini.google.com\",\n\t\t\torigin: \"https://gemini.google.com\",\n\t\t\treferer: \"https://gemini.google.com/\",\n\t\t\t\"x-same-domain\": \"1\",\n\t\t\t\"user-agent\": USER_AGENT,\n\t\t\tcookie: cookieHeader,\n\t\t\t[MODEL_HEADER_NAME]: MODEL_HEADERS[model],\n\t\t},\n\t\tbody: params.toString(),\n\t\tsignal: effectiveSignal,\n\t});\n\n\tconst rawText = await res.text();\n\n\tif (!res.ok) {\n\t\treturn { text: \"\", errorMessage: `Gemini request failed: ${res.status}` };\n\t}\n\n\ttry {\n\t\treturn parseStreamGenerateResponse(rawText);\n\t} catch (err) {\n\t\tlet errorCode: number | undefined;\n\t\ttry {\n\t\t\tconst json = JSON.parse(trimJsonEnvelope(rawText));\n\t\t\terrorCode = extractErrorCode(json);\n\t\t} catch {\n\t\t}\n\t\treturn {\n\t\t\ttext: \"\",\n\t\t\terrorCode,\n\t\t\terrorMessage: err instanceof Error ? err.message : String(err),\n\t\t};\n\t}\n}\n\nasync function fetchAccessToken(\n\tcookieHeader: string,\n\tsignal: AbortSignal,\n): Promise<string> {\n\tconst html = await fetchWithCookieRedirects(GEMINI_APP_URL, cookieHeader, 10, signal);\n\n\tfor (const key of [\"SNlM0e\", \"thykhd\"]) {\n\t\tconst match = html.match(new RegExp(`\"${key}\":\"(.*?)\"`));\n\t\tif (match?.[1]) return match[1];\n\t}\n\n\tthrow new Error(\"Unable to authenticate with Gemini. Make sure you're signed into gemini.google.com in a supported Chromium-based browser.\");\n}\n\nasync function fetchWithCookieRedirects(\n\turl: string,\n\tcookieHeader: string,\n\tmaxRedirects: number,\n\tsignal: AbortSignal,\n): Promise<string> {\n\tlet current = url;\n\tconst allowedOrigin = new URL(url).origin;\n\tfor (let i = 0; i <= maxRedirects; i++) {\n\t\tconst res = await (await resolveGeminiFetch())(current, {\n\t\t\theaders: { \"user-agent\": USER_AGENT, cookie: cookieHeader },\n\t\t\tredirect: \"manual\",\n\t\t\tsignal,\n\t\t});\n\t\tif (res.status >= 300 && res.status < 400) {\n\t\t\tconst location = res.headers.get(\"location\");\n\t\t\tif (location) {\n\t\t\t\tconst next = new URL(location, current);\n\t\t\t\tif (next.origin !== allowedOrigin) {\n\t\t\t\t\tthrow new Error(`Refusing to send Google cookies across origins: ${allowedOrigin} -> ${next.origin}`);\n\t\t\t\t}\n\t\t\t\tcurrent = next.toString();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\treturn await res.text();\n\t}\n\tthrow new Error(`Too many redirects (>${maxRedirects})`);\n}\n\nfunction extractEmailFromGeminiHtml(html: string): string | null {\n\tconst patterns = [\n\t\t// Gemini bootstraps the active account in oPEP7c. Prefer it over generic\n\t\t// feature/config entries that may contain other signed-in Google accounts.\n\t\t/\"oPEP7c\"\\s*:\\s*\"([^\"]+)\"/,\n\t\t// The Google account menu aria-label is rendered for the active account.\n\t\t/aria-label=\"Google Account:[^\"]*?\\(([^)]+)\\)\"/,\n\t\t/\"displayEmail\"\\s*:\\s*\"([^\"]+)\"/,\n\t\t/\"defaultEmail\"\\s*:\\s*\"([^\"]+)\"/,\n\t\t/\"email\"\\s*:\\s*\"([^\"]+)\"/,\n\t\t/\"identifier\"\\s*:\\s*\"([^\"]+)\"/,\n\t\t/\"gaiaIdentifier\"\\s*:\\s*\"([^\"]+)\"/,\n\t];\n\n\tfor (const pattern of patterns) {\n\t\tconst match = html.match(pattern);\n\t\tconst email = normalizeEmail(match?.[1]);\n\t\tif (email) return email;\n\t}\n\n\treturn findFirstEmail(html);\n}\n\nfunction extractEmailFromListAccounts(text: string): string | null {\n\tconst trimmed = text.replace(/^\\)\\]\\}'\\s*/, \"\");\n\ttry {\n\t\treturn findEmailInValue(JSON.parse(trimmed)) ?? findFirstEmail(trimmed);\n\t} catch {\n\t\treturn findFirstEmail(trimmed);\n\t}\n}\n\nfunction findEmailInValue(value: unknown): string | null {\n\tif (typeof value === \"string\") return normalizeEmail(value);\n\tif (Array.isArray(value)) {\n\t\tfor (const item of value) {\n\t\t\tconst email = findEmailInValue(item);\n\t\t\tif (email) return email;\n\t\t}\n\t\treturn null;\n\t}\n\tif (value && typeof value === \"object\") {\n\t\tfor (const item of Object.values(value as Record<string, unknown>)) {\n\t\t\tconst email = findEmailInValue(item);\n\t\t\tif (email) return email;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction findFirstEmail(text: string): string | null {\n\tconst normalized = decodeEmailEscapes(text);\n\tconst match = normalized.match(/\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/i);\n\treturn match?.[0] ?? null;\n}\n\nfunction normalizeEmail(value: string | undefined): string | null {\n\tif (!value) return null;\n\tconst normalized = decodeEmailEscapes(value.trim());\n\treturn /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i.test(normalized) ? normalized : null;\n}\n\nfunction decodeEmailEscapes(value: string): string {\n\treturn value\n\t\t.replace(/\\\\u0040/gi, \"@\")\n\t\t.replace(/\\\\x40/gi, \"@\")\n\t\t.replace(/&#64;/gi, \"@\")\n\t\t.replace(/&commat;/gi, \"@\")\n\t\t.replace(/\\\\\"/g, \"\\\"\")\n\t\t.replace(/\\\\\\\\/g, \"\\\\\");\n}\n\nasync function uploadFile(\n\tfilePath: string,\n\tcookieHeader: string,\n\tsignal: AbortSignal,\n): Promise<{ id: string; name: string }> {\n\tconst data = readFileSync(filePath);\n\tconst fileName = basename(filePath);\n\tconst boundary = \"----FormBoundary\" + Math.random().toString(36).slice(2);\n\tconst header = `--${boundary}\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"${fileName}\"\\r\\nContent-Type: application/octet-stream\\r\\n\\r\\n`;\n\tconst footer = `\\r\\n--${boundary}--\\r\\n`;\n\n\tconst body = Buffer.concat([\n\t\tBuffer.from(header, \"utf-8\"),\n\t\tdata,\n\t\tBuffer.from(footer, \"utf-8\"),\n\t]);\n\n\tconst res = await (await resolveGeminiFetch())(GEMINI_UPLOAD_URL, {\n\t\tmethod: \"POST\",\n\t\tredirect: \"error\",\n\t\theaders: {\n\t\t\t\"content-type\": `multipart/form-data; boundary=${boundary}`,\n\t\t\t\"push-id\": GEMINI_UPLOAD_PUSH_ID,\n\t\t\t\"user-agent\": USER_AGENT,\n\t\t\tcookie: cookieHeader,\n\t\t},\n\t\tbody,\n\t\tsignal,\n\t});\n\n\tif (!res.ok) {\n\t\tconst text = await res.text();\n\t\tthrow new Error(`File upload failed: ${res.status} (${text.slice(0, 200)})`);\n\t}\n\n\treturn { id: await res.text(), name: fileName };\n}\n\nfunction buildFReqPayload(\n\tprompt: string,\n\tuploaded: Array<{ id: string; name: string }>,\n): string {\n\tconst promptPayload =\n\t\tuploaded.length > 0\n\t\t\t? [prompt, 0, null, uploaded.map((file) => [[file.id, 1]])]\n\t\t\t: [prompt];\n\tconst innerList = [promptPayload, null, null];\n\treturn JSON.stringify([null, JSON.stringify(innerList)]);\n}\n\nfunction withTimeout(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n\tconst timeout = AbortSignal.timeout(timeoutMs);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction buildCookieHeader(cookieMap: CookieMap): string {\n\treturn Object.entries(cookieMap)\n\t\t.filter(([, value]) => typeof value === \"string\" && value.length > 0)\n\t\t.map(([name, value]) => `${name}=${value}`)\n\t\t.join(\"; \");\n}\n\nfunction getNestedValue(value: unknown, pathParts: number[]): unknown {\n\tlet current: unknown = value;\n\tfor (const part of pathParts) {\n\t\tif (current == null) return undefined;\n\t\tif (!Array.isArray(current)) return undefined;\n\t\tcurrent = (current as unknown[])[part];\n\t}\n\treturn current;\n}\n\nfunction trimJsonEnvelope(text: string): string {\n\tconst start = text.indexOf(\"[\");\n\tconst end = text.lastIndexOf(\"]\");\n\tif (start === -1 || end === -1 || end <= start) {\n\t\tthrow new Error(\"Gemini response did not contain a JSON payload.\");\n\t}\n\treturn text.slice(start, end + 1);\n}\n\nfunction extractErrorCode(responseJson: unknown): number | undefined {\n\tconst code = getNestedValue(responseJson, [0, 5, 2, 0, 1, 0]);\n\treturn typeof code === \"number\" && code >= 0 ? code : undefined;\n}\n\nfunction extractCandidateText(candidate: unknown): string {\n\tconst textRaw = getNestedValue(candidate, [1, 0]);\n\tlet text = typeof textRaw === \"string\" ? textRaw : \"\";\n\n\tif (/^http:\\/\\/googleusercontent\\.com\\/card_content\\/\\d+/.test(text)) {\n\t\tconst alt = getNestedValue(candidate, [22, 0]);\n\t\tif (typeof alt === \"string\" && alt.length > 0) text = alt;\n\t}\n\n\treturn text;\n}\n\nfunction parseStreamGenerateResponse(rawText: string): GeminiWebResult {\n\tconst responseJson = JSON.parse(trimJsonEnvelope(rawText));\n\tconst errorCode = extractErrorCode(responseJson);\n\n\tconst parts = Array.isArray(responseJson) ? responseJson : [];\n\tlet firstCandidateSeen: unknown = undefined;\n\tlet latestNonEmptyText = \"\";\n\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst partBody = getNestedValue(parts[i], [2]);\n\t\tif (!partBody || typeof partBody !== \"string\") continue;\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(partBody);\n\t\t\tconst candidateList = getNestedValue(parsed, [4]);\n\t\t\tif (!Array.isArray(candidateList) || candidateList.length === 0) continue;\n\n\t\t\tconst firstCandidate = (candidateList as unknown[])[0];\n\t\t\tif (firstCandidateSeen === undefined) firstCandidateSeen = firstCandidate;\n\n\t\t\tconst text = extractCandidateText(firstCandidate);\n\t\t\tif (text.length > 0) latestNonEmptyText = text;\n\t\t} catch {\n\t\t}\n\t}\n\n\tconst text = latestNonEmptyText.length > 0\n\t\t? latestNonEmptyText\n\t\t: extractCandidateText(firstCandidateSeen);\n\n\treturn { text, errorCode };\n}\n"]}