@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":"rsc-extract.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/rsc-extract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAqUvE","sourcesContent":["/**\n * RSC Content Extractor\n *\n * Extracts readable content from Next.js React Server Components (RSC) flight payloads.\n * RSC pages embed content as JSON in <script>self.__next_f.push([...])</script> tags.\n */\n\nexport interface RSCExtractResult {\n title: string;\n content: string;\n}\n\nexport function extractRSCContent(html: string): RSCExtractResult | null {\n if (!html.includes(\"self.__next_f.push\")) {\n return null;\n }\n\n // Parse all RSC chunks into a map\n const chunkMap = new Map<string, string>();\n const scriptRegex = /<script>self\\.__next_f\\.push\\(\\[1,\"([\\s\\S]*?)\"\\]\\)<\\/script>/g;\n\n for (const match of html.matchAll(scriptRegex)) {\n let content: string;\n try {\n content = JSON.parse('\"' + match[1] + '\"');\n } catch {\n continue;\n }\n\n // Parse each line as \"id:payload\"\n // Lines are separated by \\n, each line is one chunk\n // Chunk IDs are hex strings, typically 1-4 chars (supports up to 65535 chunks)\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) continue;\n\n const colonIdx = line.indexOf(\":\");\n if (colonIdx <= 0 || colonIdx > 4) continue;\n\n const id = line.slice(0, colonIdx);\n if (!/^[0-9a-f]+$/i.test(id)) continue;\n\n const payload = line.slice(colonIdx + 1);\n if (!payload) continue;\n\n const existing = chunkMap.get(id);\n if (!existing || payload.length > existing.length) {\n chunkMap.set(id, payload);\n }\n }\n }\n\n if (chunkMap.size === 0) return null;\n\n // Extract title\n const titleMatch = html.match(/<title[^>]*>([^<]+)<\\/title>/);\n const title = titleMatch?.[1]?.split(\"|\")[0]?.trim() || \"\";\n\n // Parse and cache parsed chunks\n const parsedCache = new Map<string, unknown>();\n\n function getParsedChunk(id: string): unknown | null {\n if (parsedCache.has(id)) return parsedCache.get(id);\n\n const chunk = chunkMap.get(id);\n if (!chunk || !chunk.startsWith(\"[\")) {\n parsedCache.set(id, null);\n return null;\n }\n\n try {\n const parsed = JSON.parse(chunk);\n parsedCache.set(id, parsed);\n return parsed;\n } catch {\n parsedCache.set(id, null);\n return null;\n }\n }\n\n // Extract markdown from nodes, resolving refs on the fly\n type Node = unknown;\n const visitedRefs = new Set<string>();\n\n function extractNode(node: Node, ctx = { inTable: false, inCode: false }): string {\n if (node === null || node === undefined) return \"\";\n\n if (typeof node === \"string\") {\n // Check if it's a reference like \"$L30\"\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch) {\n const refId = refMatch[1];\n if (visitedRefs.has(refId)) return \"\"; // Prevent cycles\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n const result = refNode ? extractNode(refNode, ctx) : \"\";\n visitedRefs.delete(refId);\n return result;\n }\n // Filter out RSC-specific artifacts, but preserve content inside code blocks\n if (!ctx.inCode && (node === \"$undefined\" || node === \"$\" || /^\\$[A-Z]/.test(node))) return \"\";\n return node.trim() ? node : \"\";\n }\n\n if (typeof node === \"number\") return String(node);\n if (typeof node === \"boolean\") return \"\";\n if (!Array.isArray(node)) return \"\";\n\n // RSC element: [\"$\", \"tag\", key, props]\n if (node[0] === \"$\" && typeof node[1] === \"string\") {\n const tag = node[1] as string;\n const props = (node[3] || {}) as Record<string, unknown>;\n\n // Skip non-content\n const skipTags = [\"script\", \"style\", \"svg\", \"path\", \"circle\", \"link\", \"meta\",\n \"template\", \"button\", \"input\", \"nav\", \"footer\", \"aside\"];\n if (skipTags.includes(tag)) return \"\";\n\n // Component ref like $L25\n if (tag.startsWith(\"$L\")) {\n const refId = tag.slice(2);\n if (visitedRefs.has(refId)) return \"\";\n\n // Check for heading components with baseId\n if (props.baseId && props.children) {\n return `## ${String(props.children)}\\n\\n`;\n }\n\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n let result = \"\";\n if (refNode) {\n result = extractNode(refNode, ctx);\n } else if (props.children) {\n result = extractNode(props.children as Node, ctx);\n }\n visitedRefs.delete(refId);\n return result;\n }\n\n const children = props.children;\n const content = children ? extractNode(children as Node, ctx) : \"\";\n\n switch (tag) {\n case \"h1\": return `# ${content.trim()}\\n\\n`;\n case \"h2\": return `## ${content.trim()}\\n\\n`;\n case \"h3\": return `### ${content.trim()}\\n\\n`;\n case \"h4\": return `#### ${content.trim()}\\n\\n`;\n case \"h5\": return `##### ${content.trim()}\\n\\n`;\n case \"h6\": return `###### ${content.trim()}\\n\\n`;\n case \"p\": return ctx.inTable ? content : `${content.trim()}\\n\\n`;\n case \"code\": {\n const codeContent = children ? extractNode(children as Node, { ...ctx, inCode: true }) : \"\";\n return ctx.inCode ? codeContent : `\\`${codeContent}\\``;\n }\n case \"pre\": {\n const preContent = children ? extractNode(children as Node, { ...ctx, inCode: true }) : \"\";\n return \"```\\n\" + preContent + \"\\n```\\n\\n\";\n }\n case \"strong\": case \"b\": return `**${content}**`;\n case \"em\": case \"i\": return `*${content}*`;\n case \"li\": return `- ${content.trim()}\\n`;\n case \"ul\": case \"ol\": return content + \"\\n\";\n case \"blockquote\": return `> ${content.trim()}\\n\\n`;\n case \"table\": return extractTable(node as unknown[]) + \"\\n\";\n case \"thead\": case \"tbody\": case \"tr\": case \"th\": case \"td\":\n return content;\n case \"div\":\n if (props.role === \"alert\" || props[\"data-slot\"] === \"alert\") {\n return `> ${content.trim()}\\n\\n`;\n }\n return content;\n case \"a\": {\n const href = props.href as string | undefined;\n return href && !href.startsWith(\"#\") ? `[${content}](${href})` : content;\n }\n default: return content;\n }\n }\n\n // Array of child nodes\n return (node as Node[]).map(n => extractNode(n, ctx)).join(\"\");\n }\n\n function extractTable(tableNode: unknown[]): string {\n const props = (tableNode[3] || {}) as Record<string, unknown>;\n const rows: string[][] = [];\n let headerRowCount = 0;\n\n function walkTable(node: unknown, isHeader = false): void {\n if (node === null || node === undefined) return;\n\n // Handle string refs\n if (typeof node === \"string\") {\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch && !visitedRefs.has(refMatch[1])) {\n visitedRefs.add(refMatch[1]);\n const refNode = getParsedChunk(refMatch[1]);\n if (refNode) walkTable(refNode, isHeader);\n visitedRefs.delete(refMatch[1]);\n }\n return;\n }\n\n if (!Array.isArray(node)) return;\n\n if (node[0] === \"$\") {\n const tag = node[1] as string;\n const nodeProps = (node[3] || {}) as Record<string, unknown>;\n\n // Handle component refs\n if (tag.startsWith(\"$L\")) {\n const refId = tag.slice(2);\n if (!visitedRefs.has(refId)) {\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n if (refNode) walkTable(refNode, isHeader);\n visitedRefs.delete(refId);\n }\n return;\n }\n\n if (tag === \"thead\") walkTable(nodeProps.children, true);\n else if (tag === \"tbody\") walkTable(nodeProps.children, false);\n else if (tag === \"tr\") {\n const cells: string[] = [];\n walkCells(nodeProps.children, cells);\n if (cells.length > 0) {\n rows.push(cells);\n if (isHeader) headerRowCount++;\n }\n } else walkTable(nodeProps.children, isHeader);\n } else {\n for (const child of node) walkTable(child, isHeader);\n }\n }\n\n function walkCells(node: unknown, cells: string[]): void {\n if (node === null || node === undefined) return;\n\n // Handle string refs\n if (typeof node === \"string\") {\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch && !visitedRefs.has(refMatch[1])) {\n visitedRefs.add(refMatch[1]);\n const refNode = getParsedChunk(refMatch[1]);\n if (refNode) walkCells(refNode, cells);\n visitedRefs.delete(refMatch[1]);\n }\n return;\n }\n\n if (!Array.isArray(node)) return;\n\n if (node[0] === \"$\" && (node[1] === \"td\" || node[1] === \"th\")) {\n const cellProps = (node[3] || {}) as Record<string, unknown>;\n const text = extractNode(cellProps.children, { inTable: true, inCode: false })\n .trim()\n .replace(/\\n/g, \" \")\n .replace(/\\\\/g, \"\\\\\\\\\") // Escape backslashes first\n .replace(/\\|/g, \"\\\\|\"); // Then escape pipes\n cells.push(text);\n } else if (node[0] === \"$\" && typeof node[1] === \"string\" && (node[1] as string).startsWith(\"$L\")) {\n // Component ref for a cell\n const refId = (node[1] as string).slice(2);\n if (!visitedRefs.has(refId)) {\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n if (refNode) walkCells(refNode, cells);\n visitedRefs.delete(refId);\n }\n } else {\n for (const child of node) walkCells(child, cells);\n }\n }\n\n walkTable(props.children);\n if (rows.length === 0) return \"\";\n\n const colCount = Math.max(...rows.map(r => r.length));\n let md = \"\";\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i].concat(Array(colCount - rows[i].length).fill(\"\"));\n md += \"| \" + row.join(\" | \") + \" |\\n\";\n if (i === headerRowCount - 1 || (headerRowCount === 0 && i === 0)) {\n md += \"| \" + Array(colCount).fill(\"---\").join(\" | \") + \" |\\n\";\n }\n }\n return md;\n }\n\n // Process main content chunk (usually \"23\")\n const mainChunk = getParsedChunk(\"23\");\n\n if (mainChunk) {\n const content = extractNode(mainChunk);\n if (content.trim().length > 100) {\n const cleaned = content\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n return { title, content: cleaned };\n }\n }\n\n // Fallback: try other chunks\n const contentParts: { order: number; text: string }[] = [];\n\n for (const [id] of chunkMap) {\n if (id === \"23\") continue;\n const parsed = getParsedChunk(id);\n if (!parsed) continue;\n\n visitedRefs.clear();\n const text = extractNode(parsed);\n\n if (text.trim().length > 50 &&\n !text.includes(\"page was not found\") &&\n !text.includes(\"404\")) {\n contentParts.push({ order: parseInt(id, 16), text: text.trim() });\n }\n }\n\n if (contentParts.length === 0) return null;\n\n contentParts.sort((a, b) => a.order - b.order);\n\n const seen = new Set<string>();\n const uniqueParts: string[] = [];\n for (const part of contentParts) {\n const key = part.text.slice(0, 150);\n if (!seen.has(key)) {\n seen.add(key);\n uniqueParts.push(part.text);\n }\n }\n\n const content = uniqueParts.join(\"\\n\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n return content.length > 100 ? { title, content } : null;\n}\n"]}
@@ -0,0 +1,329 @@
1
+ /**
2
+ * RSC Content Extractor
3
+ *
4
+ * Extracts readable content from Next.js React Server Components (RSC) flight payloads.
5
+ * RSC pages embed content as JSON in <script>self.__next_f.push([...])</script> tags.
6
+ */
7
+ export function extractRSCContent(html) {
8
+ if (!html.includes("self.__next_f.push")) {
9
+ return null;
10
+ }
11
+ // Parse all RSC chunks into a map
12
+ const chunkMap = new Map();
13
+ const scriptRegex = /<script>self\.__next_f\.push\(\[1,"([\s\S]*?)"\]\)<\/script>/g;
14
+ for (const match of html.matchAll(scriptRegex)) {
15
+ let content;
16
+ try {
17
+ content = JSON.parse('"' + match[1] + '"');
18
+ }
19
+ catch {
20
+ continue;
21
+ }
22
+ // Parse each line as "id:payload"
23
+ // Lines are separated by \n, each line is one chunk
24
+ // Chunk IDs are hex strings, typically 1-4 chars (supports up to 65535 chunks)
25
+ for (const line of content.split("\n")) {
26
+ if (!line.trim())
27
+ continue;
28
+ const colonIdx = line.indexOf(":");
29
+ if (colonIdx <= 0 || colonIdx > 4)
30
+ continue;
31
+ const id = line.slice(0, colonIdx);
32
+ if (!/^[0-9a-f]+$/i.test(id))
33
+ continue;
34
+ const payload = line.slice(colonIdx + 1);
35
+ if (!payload)
36
+ continue;
37
+ const existing = chunkMap.get(id);
38
+ if (!existing || payload.length > existing.length) {
39
+ chunkMap.set(id, payload);
40
+ }
41
+ }
42
+ }
43
+ if (chunkMap.size === 0)
44
+ return null;
45
+ // Extract title
46
+ const titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/);
47
+ const title = titleMatch?.[1]?.split("|")[0]?.trim() || "";
48
+ // Parse and cache parsed chunks
49
+ const parsedCache = new Map();
50
+ function getParsedChunk(id) {
51
+ if (parsedCache.has(id))
52
+ return parsedCache.get(id);
53
+ const chunk = chunkMap.get(id);
54
+ if (!chunk || !chunk.startsWith("[")) {
55
+ parsedCache.set(id, null);
56
+ return null;
57
+ }
58
+ try {
59
+ const parsed = JSON.parse(chunk);
60
+ parsedCache.set(id, parsed);
61
+ return parsed;
62
+ }
63
+ catch {
64
+ parsedCache.set(id, null);
65
+ return null;
66
+ }
67
+ }
68
+ const visitedRefs = new Set();
69
+ function extractNode(node, ctx = { inTable: false, inCode: false }) {
70
+ if (node === null || node === undefined)
71
+ return "";
72
+ if (typeof node === "string") {
73
+ // Check if it's a reference like "$L30"
74
+ const refMatch = node.match(/^\$L([0-9a-f]+)$/i);
75
+ if (refMatch) {
76
+ const refId = refMatch[1];
77
+ if (visitedRefs.has(refId))
78
+ return ""; // Prevent cycles
79
+ visitedRefs.add(refId);
80
+ const refNode = getParsedChunk(refId);
81
+ const result = refNode ? extractNode(refNode, ctx) : "";
82
+ visitedRefs.delete(refId);
83
+ return result;
84
+ }
85
+ // Filter out RSC-specific artifacts, but preserve content inside code blocks
86
+ if (!ctx.inCode && (node === "$undefined" || node === "$" || /^\$[A-Z]/.test(node)))
87
+ return "";
88
+ return node.trim() ? node : "";
89
+ }
90
+ if (typeof node === "number")
91
+ return String(node);
92
+ if (typeof node === "boolean")
93
+ return "";
94
+ if (!Array.isArray(node))
95
+ return "";
96
+ // RSC element: ["$", "tag", key, props]
97
+ if (node[0] === "$" && typeof node[1] === "string") {
98
+ const tag = node[1];
99
+ const props = (node[3] || {});
100
+ // Skip non-content
101
+ const skipTags = ["script", "style", "svg", "path", "circle", "link", "meta",
102
+ "template", "button", "input", "nav", "footer", "aside"];
103
+ if (skipTags.includes(tag))
104
+ return "";
105
+ // Component ref like $L25
106
+ if (tag.startsWith("$L")) {
107
+ const refId = tag.slice(2);
108
+ if (visitedRefs.has(refId))
109
+ return "";
110
+ // Check for heading components with baseId
111
+ if (props.baseId && props.children) {
112
+ return `## ${String(props.children)}\n\n`;
113
+ }
114
+ visitedRefs.add(refId);
115
+ const refNode = getParsedChunk(refId);
116
+ let result = "";
117
+ if (refNode) {
118
+ result = extractNode(refNode, ctx);
119
+ }
120
+ else if (props.children) {
121
+ result = extractNode(props.children, ctx);
122
+ }
123
+ visitedRefs.delete(refId);
124
+ return result;
125
+ }
126
+ const children = props.children;
127
+ const content = children ? extractNode(children, ctx) : "";
128
+ switch (tag) {
129
+ case "h1": return `# ${content.trim()}\n\n`;
130
+ case "h2": return `## ${content.trim()}\n\n`;
131
+ case "h3": return `### ${content.trim()}\n\n`;
132
+ case "h4": return `#### ${content.trim()}\n\n`;
133
+ case "h5": return `##### ${content.trim()}\n\n`;
134
+ case "h6": return `###### ${content.trim()}\n\n`;
135
+ case "p": return ctx.inTable ? content : `${content.trim()}\n\n`;
136
+ case "code": {
137
+ const codeContent = children ? extractNode(children, { ...ctx, inCode: true }) : "";
138
+ return ctx.inCode ? codeContent : `\`${codeContent}\``;
139
+ }
140
+ case "pre": {
141
+ const preContent = children ? extractNode(children, { ...ctx, inCode: true }) : "";
142
+ return "```\n" + preContent + "\n```\n\n";
143
+ }
144
+ case "strong":
145
+ case "b": return `**${content}**`;
146
+ case "em":
147
+ case "i": return `*${content}*`;
148
+ case "li": return `- ${content.trim()}\n`;
149
+ case "ul":
150
+ case "ol": return content + "\n";
151
+ case "blockquote": return `> ${content.trim()}\n\n`;
152
+ case "table": return extractTable(node) + "\n";
153
+ case "thead":
154
+ case "tbody":
155
+ case "tr":
156
+ case "th":
157
+ case "td":
158
+ return content;
159
+ case "div":
160
+ if (props.role === "alert" || props["data-slot"] === "alert") {
161
+ return `> ${content.trim()}\n\n`;
162
+ }
163
+ return content;
164
+ case "a": {
165
+ const href = props.href;
166
+ return href && !href.startsWith("#") ? `[${content}](${href})` : content;
167
+ }
168
+ default: return content;
169
+ }
170
+ }
171
+ // Array of child nodes
172
+ return node.map(n => extractNode(n, ctx)).join("");
173
+ }
174
+ function extractTable(tableNode) {
175
+ const props = (tableNode[3] || {});
176
+ const rows = [];
177
+ let headerRowCount = 0;
178
+ function walkTable(node, isHeader = false) {
179
+ if (node === null || node === undefined)
180
+ return;
181
+ // Handle string refs
182
+ if (typeof node === "string") {
183
+ const refMatch = node.match(/^\$L([0-9a-f]+)$/i);
184
+ if (refMatch && !visitedRefs.has(refMatch[1])) {
185
+ visitedRefs.add(refMatch[1]);
186
+ const refNode = getParsedChunk(refMatch[1]);
187
+ if (refNode)
188
+ walkTable(refNode, isHeader);
189
+ visitedRefs.delete(refMatch[1]);
190
+ }
191
+ return;
192
+ }
193
+ if (!Array.isArray(node))
194
+ return;
195
+ if (node[0] === "$") {
196
+ const tag = node[1];
197
+ const nodeProps = (node[3] || {});
198
+ // Handle component refs
199
+ if (tag.startsWith("$L")) {
200
+ const refId = tag.slice(2);
201
+ if (!visitedRefs.has(refId)) {
202
+ visitedRefs.add(refId);
203
+ const refNode = getParsedChunk(refId);
204
+ if (refNode)
205
+ walkTable(refNode, isHeader);
206
+ visitedRefs.delete(refId);
207
+ }
208
+ return;
209
+ }
210
+ if (tag === "thead")
211
+ walkTable(nodeProps.children, true);
212
+ else if (tag === "tbody")
213
+ walkTable(nodeProps.children, false);
214
+ else if (tag === "tr") {
215
+ const cells = [];
216
+ walkCells(nodeProps.children, cells);
217
+ if (cells.length > 0) {
218
+ rows.push(cells);
219
+ if (isHeader)
220
+ headerRowCount++;
221
+ }
222
+ }
223
+ else
224
+ walkTable(nodeProps.children, isHeader);
225
+ }
226
+ else {
227
+ for (const child of node)
228
+ walkTable(child, isHeader);
229
+ }
230
+ }
231
+ function walkCells(node, cells) {
232
+ if (node === null || node === undefined)
233
+ return;
234
+ // Handle string refs
235
+ if (typeof node === "string") {
236
+ const refMatch = node.match(/^\$L([0-9a-f]+)$/i);
237
+ if (refMatch && !visitedRefs.has(refMatch[1])) {
238
+ visitedRefs.add(refMatch[1]);
239
+ const refNode = getParsedChunk(refMatch[1]);
240
+ if (refNode)
241
+ walkCells(refNode, cells);
242
+ visitedRefs.delete(refMatch[1]);
243
+ }
244
+ return;
245
+ }
246
+ if (!Array.isArray(node))
247
+ return;
248
+ if (node[0] === "$" && (node[1] === "td" || node[1] === "th")) {
249
+ const cellProps = (node[3] || {});
250
+ const text = extractNode(cellProps.children, { inTable: true, inCode: false })
251
+ .trim()
252
+ .replace(/\n/g, " ")
253
+ .replace(/\\/g, "\\\\") // Escape backslashes first
254
+ .replace(/\|/g, "\\|"); // Then escape pipes
255
+ cells.push(text);
256
+ }
257
+ else if (node[0] === "$" && typeof node[1] === "string" && node[1].startsWith("$L")) {
258
+ // Component ref for a cell
259
+ const refId = node[1].slice(2);
260
+ if (!visitedRefs.has(refId)) {
261
+ visitedRefs.add(refId);
262
+ const refNode = getParsedChunk(refId);
263
+ if (refNode)
264
+ walkCells(refNode, cells);
265
+ visitedRefs.delete(refId);
266
+ }
267
+ }
268
+ else {
269
+ for (const child of node)
270
+ walkCells(child, cells);
271
+ }
272
+ }
273
+ walkTable(props.children);
274
+ if (rows.length === 0)
275
+ return "";
276
+ const colCount = Math.max(...rows.map(r => r.length));
277
+ let md = "";
278
+ for (let i = 0; i < rows.length; i++) {
279
+ const row = rows[i].concat(Array(colCount - rows[i].length).fill(""));
280
+ md += "| " + row.join(" | ") + " |\n";
281
+ if (i === headerRowCount - 1 || (headerRowCount === 0 && i === 0)) {
282
+ md += "| " + Array(colCount).fill("---").join(" | ") + " |\n";
283
+ }
284
+ }
285
+ return md;
286
+ }
287
+ // Process main content chunk (usually "23")
288
+ const mainChunk = getParsedChunk("23");
289
+ if (mainChunk) {
290
+ const content = extractNode(mainChunk);
291
+ if (content.trim().length > 100) {
292
+ const cleaned = content
293
+ .replace(/\n{3,}/g, "\n\n")
294
+ .trim();
295
+ return { title, content: cleaned };
296
+ }
297
+ }
298
+ // Fallback: try other chunks
299
+ const contentParts = [];
300
+ for (const [id] of chunkMap) {
301
+ if (id === "23")
302
+ continue;
303
+ const parsed = getParsedChunk(id);
304
+ if (!parsed)
305
+ continue;
306
+ visitedRefs.clear();
307
+ const text = extractNode(parsed);
308
+ if (text.trim().length > 50 &&
309
+ !text.includes("page was not found") &&
310
+ !text.includes("404")) {
311
+ contentParts.push({ order: parseInt(id, 16), text: text.trim() });
312
+ }
313
+ }
314
+ if (contentParts.length === 0)
315
+ return null;
316
+ contentParts.sort((a, b) => a.order - b.order);
317
+ const seen = new Set();
318
+ const uniqueParts = [];
319
+ for (const part of contentParts) {
320
+ const key = part.text.slice(0, 150);
321
+ if (!seen.has(key)) {
322
+ seen.add(key);
323
+ uniqueParts.push(part.text);
324
+ }
325
+ }
326
+ const content = uniqueParts.join("\n\n").replace(/\n{3,}/g, "\n\n").trim();
327
+ return content.length > 100 ? { title, content } : null;
328
+ }
329
+ //# sourceMappingURL=rsc-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsc-extract.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/rsc-extract.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * RSC Content Extractor\n *\n * Extracts readable content from Next.js React Server Components (RSC) flight payloads.\n * RSC pages embed content as JSON in <script>self.__next_f.push([...])</script> tags.\n */\n\nexport interface RSCExtractResult {\n title: string;\n content: string;\n}\n\nexport function extractRSCContent(html: string): RSCExtractResult | null {\n if (!html.includes(\"self.__next_f.push\")) {\n return null;\n }\n\n // Parse all RSC chunks into a map\n const chunkMap = new Map<string, string>();\n const scriptRegex = /<script>self\\.__next_f\\.push\\(\\[1,\"([\\s\\S]*?)\"\\]\\)<\\/script>/g;\n\n for (const match of html.matchAll(scriptRegex)) {\n let content: string;\n try {\n content = JSON.parse('\"' + match[1] + '\"');\n } catch {\n continue;\n }\n\n // Parse each line as \"id:payload\"\n // Lines are separated by \\n, each line is one chunk\n // Chunk IDs are hex strings, typically 1-4 chars (supports up to 65535 chunks)\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) continue;\n\n const colonIdx = line.indexOf(\":\");\n if (colonIdx <= 0 || colonIdx > 4) continue;\n\n const id = line.slice(0, colonIdx);\n if (!/^[0-9a-f]+$/i.test(id)) continue;\n\n const payload = line.slice(colonIdx + 1);\n if (!payload) continue;\n\n const existing = chunkMap.get(id);\n if (!existing || payload.length > existing.length) {\n chunkMap.set(id, payload);\n }\n }\n }\n\n if (chunkMap.size === 0) return null;\n\n // Extract title\n const titleMatch = html.match(/<title[^>]*>([^<]+)<\\/title>/);\n const title = titleMatch?.[1]?.split(\"|\")[0]?.trim() || \"\";\n\n // Parse and cache parsed chunks\n const parsedCache = new Map<string, unknown>();\n\n function getParsedChunk(id: string): unknown | null {\n if (parsedCache.has(id)) return parsedCache.get(id);\n\n const chunk = chunkMap.get(id);\n if (!chunk || !chunk.startsWith(\"[\")) {\n parsedCache.set(id, null);\n return null;\n }\n\n try {\n const parsed = JSON.parse(chunk);\n parsedCache.set(id, parsed);\n return parsed;\n } catch {\n parsedCache.set(id, null);\n return null;\n }\n }\n\n // Extract markdown from nodes, resolving refs on the fly\n type Node = unknown;\n const visitedRefs = new Set<string>();\n\n function extractNode(node: Node, ctx = { inTable: false, inCode: false }): string {\n if (node === null || node === undefined) return \"\";\n\n if (typeof node === \"string\") {\n // Check if it's a reference like \"$L30\"\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch) {\n const refId = refMatch[1];\n if (visitedRefs.has(refId)) return \"\"; // Prevent cycles\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n const result = refNode ? extractNode(refNode, ctx) : \"\";\n visitedRefs.delete(refId);\n return result;\n }\n // Filter out RSC-specific artifacts, but preserve content inside code blocks\n if (!ctx.inCode && (node === \"$undefined\" || node === \"$\" || /^\\$[A-Z]/.test(node))) return \"\";\n return node.trim() ? node : \"\";\n }\n\n if (typeof node === \"number\") return String(node);\n if (typeof node === \"boolean\") return \"\";\n if (!Array.isArray(node)) return \"\";\n\n // RSC element: [\"$\", \"tag\", key, props]\n if (node[0] === \"$\" && typeof node[1] === \"string\") {\n const tag = node[1] as string;\n const props = (node[3] || {}) as Record<string, unknown>;\n\n // Skip non-content\n const skipTags = [\"script\", \"style\", \"svg\", \"path\", \"circle\", \"link\", \"meta\",\n \"template\", \"button\", \"input\", \"nav\", \"footer\", \"aside\"];\n if (skipTags.includes(tag)) return \"\";\n\n // Component ref like $L25\n if (tag.startsWith(\"$L\")) {\n const refId = tag.slice(2);\n if (visitedRefs.has(refId)) return \"\";\n\n // Check for heading components with baseId\n if (props.baseId && props.children) {\n return `## ${String(props.children)}\\n\\n`;\n }\n\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n let result = \"\";\n if (refNode) {\n result = extractNode(refNode, ctx);\n } else if (props.children) {\n result = extractNode(props.children as Node, ctx);\n }\n visitedRefs.delete(refId);\n return result;\n }\n\n const children = props.children;\n const content = children ? extractNode(children as Node, ctx) : \"\";\n\n switch (tag) {\n case \"h1\": return `# ${content.trim()}\\n\\n`;\n case \"h2\": return `## ${content.trim()}\\n\\n`;\n case \"h3\": return `### ${content.trim()}\\n\\n`;\n case \"h4\": return `#### ${content.trim()}\\n\\n`;\n case \"h5\": return `##### ${content.trim()}\\n\\n`;\n case \"h6\": return `###### ${content.trim()}\\n\\n`;\n case \"p\": return ctx.inTable ? content : `${content.trim()}\\n\\n`;\n case \"code\": {\n const codeContent = children ? extractNode(children as Node, { ...ctx, inCode: true }) : \"\";\n return ctx.inCode ? codeContent : `\\`${codeContent}\\``;\n }\n case \"pre\": {\n const preContent = children ? extractNode(children as Node, { ...ctx, inCode: true }) : \"\";\n return \"```\\n\" + preContent + \"\\n```\\n\\n\";\n }\n case \"strong\": case \"b\": return `**${content}**`;\n case \"em\": case \"i\": return `*${content}*`;\n case \"li\": return `- ${content.trim()}\\n`;\n case \"ul\": case \"ol\": return content + \"\\n\";\n case \"blockquote\": return `> ${content.trim()}\\n\\n`;\n case \"table\": return extractTable(node as unknown[]) + \"\\n\";\n case \"thead\": case \"tbody\": case \"tr\": case \"th\": case \"td\":\n return content;\n case \"div\":\n if (props.role === \"alert\" || props[\"data-slot\"] === \"alert\") {\n return `> ${content.trim()}\\n\\n`;\n }\n return content;\n case \"a\": {\n const href = props.href as string | undefined;\n return href && !href.startsWith(\"#\") ? `[${content}](${href})` : content;\n }\n default: return content;\n }\n }\n\n // Array of child nodes\n return (node as Node[]).map(n => extractNode(n, ctx)).join(\"\");\n }\n\n function extractTable(tableNode: unknown[]): string {\n const props = (tableNode[3] || {}) as Record<string, unknown>;\n const rows: string[][] = [];\n let headerRowCount = 0;\n\n function walkTable(node: unknown, isHeader = false): void {\n if (node === null || node === undefined) return;\n\n // Handle string refs\n if (typeof node === \"string\") {\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch && !visitedRefs.has(refMatch[1])) {\n visitedRefs.add(refMatch[1]);\n const refNode = getParsedChunk(refMatch[1]);\n if (refNode) walkTable(refNode, isHeader);\n visitedRefs.delete(refMatch[1]);\n }\n return;\n }\n\n if (!Array.isArray(node)) return;\n\n if (node[0] === \"$\") {\n const tag = node[1] as string;\n const nodeProps = (node[3] || {}) as Record<string, unknown>;\n\n // Handle component refs\n if (tag.startsWith(\"$L\")) {\n const refId = tag.slice(2);\n if (!visitedRefs.has(refId)) {\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n if (refNode) walkTable(refNode, isHeader);\n visitedRefs.delete(refId);\n }\n return;\n }\n\n if (tag === \"thead\") walkTable(nodeProps.children, true);\n else if (tag === \"tbody\") walkTable(nodeProps.children, false);\n else if (tag === \"tr\") {\n const cells: string[] = [];\n walkCells(nodeProps.children, cells);\n if (cells.length > 0) {\n rows.push(cells);\n if (isHeader) headerRowCount++;\n }\n } else walkTable(nodeProps.children, isHeader);\n } else {\n for (const child of node) walkTable(child, isHeader);\n }\n }\n\n function walkCells(node: unknown, cells: string[]): void {\n if (node === null || node === undefined) return;\n\n // Handle string refs\n if (typeof node === \"string\") {\n const refMatch = node.match(/^\\$L([0-9a-f]+)$/i);\n if (refMatch && !visitedRefs.has(refMatch[1])) {\n visitedRefs.add(refMatch[1]);\n const refNode = getParsedChunk(refMatch[1]);\n if (refNode) walkCells(refNode, cells);\n visitedRefs.delete(refMatch[1]);\n }\n return;\n }\n\n if (!Array.isArray(node)) return;\n\n if (node[0] === \"$\" && (node[1] === \"td\" || node[1] === \"th\")) {\n const cellProps = (node[3] || {}) as Record<string, unknown>;\n const text = extractNode(cellProps.children, { inTable: true, inCode: false })\n .trim()\n .replace(/\\n/g, \" \")\n .replace(/\\\\/g, \"\\\\\\\\\") // Escape backslashes first\n .replace(/\\|/g, \"\\\\|\"); // Then escape pipes\n cells.push(text);\n } else if (node[0] === \"$\" && typeof node[1] === \"string\" && (node[1] as string).startsWith(\"$L\")) {\n // Component ref for a cell\n const refId = (node[1] as string).slice(2);\n if (!visitedRefs.has(refId)) {\n visitedRefs.add(refId);\n const refNode = getParsedChunk(refId);\n if (refNode) walkCells(refNode, cells);\n visitedRefs.delete(refId);\n }\n } else {\n for (const child of node) walkCells(child, cells);\n }\n }\n\n walkTable(props.children);\n if (rows.length === 0) return \"\";\n\n const colCount = Math.max(...rows.map(r => r.length));\n let md = \"\";\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i].concat(Array(colCount - rows[i].length).fill(\"\"));\n md += \"| \" + row.join(\" | \") + \" |\\n\";\n if (i === headerRowCount - 1 || (headerRowCount === 0 && i === 0)) {\n md += \"| \" + Array(colCount).fill(\"---\").join(\" | \") + \" |\\n\";\n }\n }\n return md;\n }\n\n // Process main content chunk (usually \"23\")\n const mainChunk = getParsedChunk(\"23\");\n\n if (mainChunk) {\n const content = extractNode(mainChunk);\n if (content.trim().length > 100) {\n const cleaned = content\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n return { title, content: cleaned };\n }\n }\n\n // Fallback: try other chunks\n const contentParts: { order: number; text: string }[] = [];\n\n for (const [id] of chunkMap) {\n if (id === \"23\") continue;\n const parsed = getParsedChunk(id);\n if (!parsed) continue;\n\n visitedRefs.clear();\n const text = extractNode(parsed);\n\n if (text.trim().length > 50 &&\n !text.includes(\"page was not found\") &&\n !text.includes(\"404\")) {\n contentParts.push({ order: parseInt(id, 16), text: text.trim() });\n }\n }\n\n if (contentParts.length === 0) return null;\n\n contentParts.sort((a, b) => a.order - b.order);\n\n const seen = new Set<string>();\n const uniqueParts: string[] = [];\n for (const part of contentParts) {\n const key = part.text.slice(0, 150);\n if (!seen.has(key)) {\n seen.add(key);\n uniqueParts.push(part.text);\n }\n }\n\n const content = uniqueParts.join(\"\\n\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n return content.length > 100 ? { title, content } : null;\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { ExtractedContent, ExtractOptions } from "./extract.ts";
2
+ import type { SearchOptions, SearchResponse } from "./perplexity.ts";
3
+ interface Search1APISearchOptions extends SearchOptions {
4
+ includeContent?: boolean;
5
+ }
6
+ export declare function isSearch1APIAvailable(): boolean;
7
+ export declare function searchWithSearch1API(query: string, options?: Search1APISearchOptions): Promise<SearchResponse>;
8
+ export declare function extractWithSearch1API(url: string, signal?: AbortSignal, options?: ExtractOptions): Promise<ExtractedContent | null>;
9
+ export {};
10
+ //# sourceMappingURL=search1api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search1api.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/search1api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAqCrE,UAAU,uBAAwB,SAAQ,aAAa;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AA4CD,wBAAgB,qBAAqB,IAAI,OAAO,CAM/C;AAmID,wBAAsB,oBAAoB,CACzC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,uBAA4B,GACnC,OAAO,CAAC,cAAc,CAAC,CA8BzB;AAED,wBAAsB,qBAAqB,CAC1C,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAwClC","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport type { ExtractedContent, ExtractOptions } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst SEARCH1API_SEARCH_URL = \"https://api.search1api.com/search\";\nconst SEARCH1API_CRAWL_URL = \"https://api.search1api.com/crawl\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\nconst CRAWL_TIMEOUT_MS = 60_000;\n\ninterface WebSearchConfig {\n\tsearch1apiApiKey?: unknown;\n}\n\ninterface Search1APISearchResult {\n\ttitle?: string | null;\n\tlink?: string | null;\n\tsnippet?: string | null;\n\tcontent?: string | null;\n}\n\ninterface Search1APISearchResponse {\n\tsearchParameters?: Record<string, unknown>;\n\tresults?: Search1APISearchResult[];\n}\n\ninterface Search1APICrawlResult {\n\ttitle?: string | null;\n\tlink?: string | null;\n\tcontent?: string | null;\n\tmetadata?: Record<string, unknown>;\n}\n\ninterface Search1APICrawlResponse {\n\tcrawlParameters?: { url?: string };\n\tresults?: Search1APICrawlResult;\n}\n\ninterface Search1APISearchOptions extends SearchOptions {\n\tincludeContent?: boolean;\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid config in ${CONFIG_PATH}: expected a JSON object`);\n\t}\n\tcachedConfig = parsed as WebSearchConfig;\n\treturn cachedConfig;\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string> {\n\tconst key = await resolveCredential({\n\t\tprovider: \"Search1API\",\n\t\tconfiguredValue: loadConfig().search1apiApiKey,\n\t\tenvironmentValue: process.env.SEARCH1API_KEY,\n\t\tsignal,\n\t});\n\tif (!key) {\n\t\tthrow new Error(\n\t\t\t\"Search1API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"search1apiApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set SEARCH1API_KEY environment variable\\n\" +\n\t\t\t\"Create a key at https://dashboard.search1api.com\",\n\t\t);\n\t}\n\treturn key;\n}\n\nexport function isSearch1APIAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"Search1API\",\n\t\tconfiguredValue: loadConfig().search1apiApiKey,\n\t\tenvironmentValue: process.env.SEARCH1API_KEY,\n\t});\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction requestSignal(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n\tconst timeout = AbortSignal.timeout(timeoutMs);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction normalizeNumResults(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 5;\n\treturn Math.max(1, Math.min(Math.floor(value), 20));\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction mapDomainFilter(domainFilter: string[] | undefined): { includeSites: string[]; excludeSites: string[] } {\n\tconst includeSites: string[] = [];\n\tconst excludeSites: string[] = [];\n\tfor (const raw of domainFilter ?? []) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? excludeSites : includeSites;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn { includeSites, excludeSites };\n}\n\nfunction buildSearchBody(query: string, options: Search1APISearchOptions): Record<string, unknown> {\n\tconst numResults = normalizeNumResults(options.numResults);\n\tconst { includeSites, excludeSites } = mapDomainFilter(options.domainFilter);\n\treturn {\n\t\tquery,\n\t\tmax_results: numResults,\n\t\tcrawl_results: options.includeContent ? numResults : 0,\n\t\t...(includeSites.length > 0 ? { include_sites: includeSites } : {}),\n\t\t...(excludeSites.length > 0 ? { exclude_sites: excludeSites } : {}),\n\t\t...(options.recencyFilter ? { time_range: options.recencyFilter } : {}),\n\t};\n}\n\nasync function search1APIJsonRequest<T>(\n\tlabel: \"Search\" | \"Crawl\",\n\turl: string,\n\tapiKey: string,\n\tbody: Record<string, unknown>,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: requestSignal(signal, timeoutMs),\n\t\t});\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n\n\tconst raw = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`Search1API ${label} API error ${response.status}: ${redactCredential(raw, apiKey).slice(0, 300)}`);\n\t}\n\ttry {\n\t\treturn JSON.parse(raw) as T;\n\t} catch (err) {\n\t\tthrow new Error(`Search1API ${label} API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n}\n\nfunction mapSearchResults(results: Search1APISearchResult[] | undefined): SearchResponse[\"results\"] {\n\tif (!Array.isArray(results)) {\n\t\tthrow new Error(\"Search1API Search API returned an unexpected response shape\");\n\t}\n\treturn results.flatMap((item) => {\n\t\tif (!item || typeof item.link !== \"string\" || item.link.trim().length === 0) return [];\n\t\tconst url = item.link.trim();\n\t\treturn [{\n\t\t\ttitle: typeof item.title === \"string\" && item.title.trim() ? item.title.trim() : url,\n\t\t\turl,\n\t\t\tsnippet: typeof item.snippet === \"string\" ? item.snippet.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t}];\n\t});\n}\n\nfunction mapInlineContent(results: Search1APISearchResult[] | undefined): ExtractedContent[] {\n\tif (!Array.isArray(results)) return [];\n\treturn results.flatMap((item) => {\n\t\tif (!item || typeof item.link !== \"string\" || item.link.trim().length === 0) return [];\n\t\tif (typeof item.content !== \"string\" || item.content.trim().length === 0) return [];\n\t\treturn [{\n\t\t\turl: item.link.trim(),\n\t\t\ttitle: typeof item.title === \"string\" ? item.title.trim() : \"\",\n\t\t\tcontent: item.content,\n\t\t\terror: null,\n\t\t}];\n\t});\n}\n\nfunction buildAnswer(results: SearchResponse[\"results\"]): string {\n\treturn results.map((result) => {\n\t\tif (result.snippet) return `${result.snippet}\\nSource: ${result.title} (${result.url})`;\n\t\treturn `Source: ${result.title} (${result.url})`;\n\t}).join(\"\\n\\n\");\n}\n\nexport async function searchWithSearch1API(\n\tquery: string,\n\toptions: Search1APISearchOptions = {},\n): Promise<SearchResponse> {\n\tconst apiKey = await getApiKey(options.signal);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\ttry {\n\t\tconst data = await search1APIJsonRequest<Search1APISearchResponse>(\n\t\t\t\"Search\",\n\t\t\tSEARCH1API_SEARCH_URL,\n\t\t\tapiKey,\n\t\t\tbuildSearchBody(query, options),\n\t\t\tSEARCH_TIMEOUT_MS,\n\t\t\toptions.signal,\n\t\t);\n\t\tconst results = mapSearchResults(data.results);\n\t\tconst response: SearchResponse = { answer: buildAnswer(results), results };\n\t\tif (options.includeContent) {\n\t\t\tconst inlineContent = mapInlineContent(data.results);\n\t\t\tif (inlineContent.length > 0) response.inlineContent = inlineContent;\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn response;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n}\n\nexport async function extractWithSearch1API(\n\turl: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<ExtractedContent | null> {\n\tconst apiKey = await getApiKey(signal);\n\tconst activityId = activityMonitor.logStart({ type: \"fetch\", url });\n\ttry {\n\t\tconst data = await search1APIJsonRequest<Search1APICrawlResponse>(\n\t\t\t\"Crawl\",\n\t\t\tSEARCH1API_CRAWL_URL,\n\t\t\tapiKey,\n\t\t\t{ url },\n\t\t\ttypeof options.timeoutMs === \"number\" && Number.isFinite(options.timeoutMs)\n\t\t\t\t? Math.max(1, Math.floor(options.timeoutMs))\n\t\t\t\t: CRAWL_TIMEOUT_MS,\n\t\t\tsignal,\n\t\t);\n\t\tconst result = data.results;\n\t\tif (!result || typeof result !== \"object\") {\n\t\t\tthrow new Error(\"Search1API Crawl API returned an unexpected response shape\");\n\t\t}\n\t\tconst content = typeof result.content === \"string\" ? result.content.trim() : \"\";\n\t\tif (!content) {\n\t\t\tactivityMonitor.logComplete(activityId, 200);\n\t\t\treturn null;\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn {\n\t\t\turl,\n\t\t\ttitle: typeof result.title === \"string\" ? result.title.trim() : \"\",\n\t\t\tcontent,\n\t\t\terror: null,\n\t\t};\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n}\n"]}