@humain/terminal 0.0.18 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/bun/cli.d.ts +3 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +3 -8
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/bun/runtime-setup.d.ts +2 -0
  7. package/dist/bun/runtime-setup.d.ts.map +1 -0
  8. package/dist/bun/runtime-setup.js +9 -0
  9. package/dist/bun/runtime-setup.js.map +1 -0
  10. package/dist/bun/sandbox-env-setup.d.ts +2 -0
  11. package/dist/bun/sandbox-env-setup.d.ts.map +1 -0
  12. package/dist/bun/sandbox-env-setup.js +4 -0
  13. package/dist/bun/sandbox-env-setup.js.map +1 -0
  14. package/dist/bundle/chunks/anthropic-messages-XULXUBIG.js +6 -0
  15. package/dist/bundle/chunks/{azure-openai-responses-ZN52D6YC.js → azure-openai-responses-JEG2XOYC.js} +1 -1
  16. package/dist/bundle/chunks/bedrock-converse-stream.js +6 -6
  17. package/dist/bundle/chunks/{chunk-ARF4OE6X.js → chunk-2LC3S3VV.js} +8 -8
  18. package/dist/bundle/chunks/chunk-43O5DDAH.js +31 -0
  19. package/dist/bundle/chunks/{chunk-H2O6VOXT.js → chunk-46DC2JD6.js} +2 -2
  20. package/dist/bundle/chunks/chunk-7ZC4UXSL.js +2 -0
  21. package/dist/bundle/chunks/{chunk-WJZ4KLGL.js → chunk-E6KP6V7F.js} +1 -1
  22. package/dist/bundle/chunks/{chunk-PSKDLDLZ.js → chunk-HPPQHK3J.js} +3 -3
  23. package/dist/bundle/chunks/chunk-JUPSJTFQ.js +42 -0
  24. package/dist/bundle/chunks/{chunk-QLVZGOBY.js → chunk-LYAMSPR2.js} +360 -352
  25. package/dist/bundle/chunks/chunk-PL7O7J4J.js +133 -0
  26. package/dist/bundle/chunks/chunk-USJZMAIR.js +2 -0
  27. package/dist/bundle/chunks/{extract-2L7ZVN7F.js → extract-TRW5FBY6.js} +2 -2
  28. package/dist/bundle/chunks/github-copilot.js +1 -1
  29. package/dist/bundle/chunks/{google-generative-ai-FF7M7XHT.js → google-generative-ai-OX6VSCA6.js} +1 -1
  30. package/dist/bundle/chunks/{google-vertex-YMUBFRBA.js → google-vertex-GW76GSS2.js} +1 -1
  31. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  32. package/dist/bundle/chunks/{mistral-conversations-O4M7IQML.js → mistral-conversations-WXGXZOFJ.js} +1 -1
  33. package/dist/bundle/chunks/node-AUOGOBCN.js +2 -0
  34. package/dist/bundle/chunks/node-KOIP55YZ.js +16 -0
  35. package/dist/bundle/chunks/openai-codex-responses-NPLWP6ZC.js +10 -0
  36. package/dist/bundle/chunks/{openai-completions-L4AHDQ5D.js → openai-completions-OT2GTJKC.js} +3 -3
  37. package/dist/bundle/chunks/openai-responses-5A6CR7GI.js +2 -0
  38. package/dist/bundle/chunks/{openrouter-images-Y2PCWAQH.js → openrouter-images-YLQ4RJ2F.js} +1 -1
  39. package/dist/bundle/chunks/{pi-messages-57K43J6J.js → pi-messages-OJF77SY3.js} +1 -1
  40. package/dist/bundle/chunks/{undici-D6ABF53Q.js → undici-KA2LJNVT.js} +1 -1
  41. package/dist/bundle/chunks/webapi-RFAXLI2D.js +5 -0
  42. package/dist/bundle/cli.js +1 -1
  43. package/dist/bundle/index.js +1 -1
  44. package/dist/bundle/rpc-entry.js +1 -1
  45. package/dist/cli/config-selector.d.ts.map +1 -1
  46. package/dist/cli/config-selector.js +2 -1
  47. package/dist/cli/config-selector.js.map +1 -1
  48. package/dist/cli/setup.d.ts +2 -0
  49. package/dist/cli/setup.d.ts.map +1 -0
  50. package/dist/cli/setup.js +13 -0
  51. package/dist/cli/setup.js.map +1 -0
  52. package/dist/cli.js +1 -17
  53. package/dist/cli.js.map +1 -1
  54. package/dist/config.d.ts +1 -0
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +1 -0
  57. package/dist/config.js.map +1 -1
  58. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  59. package/dist/core/agent-session-runtime.js +15 -7
  60. package/dist/core/agent-session-runtime.js.map +1 -1
  61. package/dist/core/agent-session.d.ts +2 -6
  62. package/dist/core/agent-session.d.ts.map +1 -1
  63. package/dist/core/agent-session.js +16 -8
  64. package/dist/core/agent-session.js.map +1 -1
  65. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  66. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  67. package/dist/core/compaction/branch-summarization.js +2 -1
  68. package/dist/core/compaction/branch-summarization.js.map +1 -1
  69. package/dist/core/extensions/loader.d.ts.map +1 -1
  70. package/dist/core/extensions/loader.js +1 -2
  71. package/dist/core/extensions/loader.js.map +1 -1
  72. package/dist/core/extensions/types.d.ts +8 -2
  73. package/dist/core/extensions/types.d.ts.map +1 -1
  74. package/dist/core/extensions/types.js.map +1 -1
  75. package/dist/core/http-dispatcher.d.ts.map +1 -1
  76. package/dist/core/http-dispatcher.js +2 -0
  77. package/dist/core/http-dispatcher.js.map +1 -1
  78. package/dist/core/keybindings.d.ts +5 -0
  79. package/dist/core/keybindings.d.ts.map +1 -1
  80. package/dist/core/keybindings.js +4 -0
  81. package/dist/core/keybindings.js.map +1 -1
  82. package/dist/core/messages.d.ts +1 -1
  83. package/dist/core/messages.d.ts.map +1 -1
  84. package/dist/core/messages.js.map +1 -1
  85. package/dist/core/model-config.d.ts +15 -0
  86. package/dist/core/model-config.d.ts.map +1 -1
  87. package/dist/core/model-config.js +3 -0
  88. package/dist/core/model-config.js.map +1 -1
  89. package/dist/core/model-runtime.d.ts +1 -0
  90. package/dist/core/model-runtime.d.ts.map +1 -1
  91. package/dist/core/model-runtime.js +5 -2
  92. package/dist/core/model-runtime.js.map +1 -1
  93. package/dist/core/provider-composer.d.ts.map +1 -1
  94. package/dist/core/provider-composer.js +8 -2
  95. package/dist/core/provider-composer.js.map +1 -1
  96. package/dist/core/session-manager.d.ts +3 -2
  97. package/dist/core/session-manager.d.ts.map +1 -1
  98. package/dist/core/session-manager.js +40 -13
  99. package/dist/core/session-manager.js.map +1 -1
  100. package/dist/core/settings-manager.js.map +1 -1
  101. package/dist/core/skills.d.ts +1 -1
  102. package/dist/core/skills.d.ts.map +1 -1
  103. package/dist/core/skills.js +4 -2
  104. package/dist/core/skills.js.map +1 -1
  105. package/dist/core/system-prompt.d.ts.map +1 -1
  106. package/dist/core/system-prompt.js +8 -9
  107. package/dist/core/system-prompt.js.map +1 -1
  108. package/dist/core/tools/bash.d.ts.map +1 -1
  109. package/dist/core/tools/bash.js +3 -120
  110. package/dist/core/tools/bash.js.map +1 -1
  111. package/dist/core/tools/edit.d.ts +1 -12
  112. package/dist/core/tools/edit.d.ts.map +1 -1
  113. package/dist/core/tools/edit.js +5 -163
  114. package/dist/core/tools/edit.js.map +1 -1
  115. package/dist/core/tools/find.d.ts.map +1 -1
  116. package/dist/core/tools/find.js +4 -55
  117. package/dist/core/tools/find.js.map +1 -1
  118. package/dist/core/tools/grep.d.ts.map +1 -1
  119. package/dist/core/tools/grep.js +4 -60
  120. package/dist/core/tools/grep.js.map +1 -1
  121. package/dist/core/tools/ls.d.ts.map +1 -1
  122. package/dist/core/tools/ls.js +4 -49
  123. package/dist/core/tools/ls.js.map +1 -1
  124. package/dist/core/tools/read.d.ts.map +1 -1
  125. package/dist/core/tools/read.js +4 -120
  126. package/dist/core/tools/read.js.map +1 -1
  127. package/dist/core/tools/renderers/bash.d.ts +12 -0
  128. package/dist/core/tools/renderers/bash.d.ts.map +1 -0
  129. package/dist/core/tools/renderers/bash.js +133 -0
  130. package/dist/core/tools/renderers/bash.js.map +1 -0
  131. package/dist/core/tools/renderers/edit.d.ts +23 -0
  132. package/dist/core/tools/renderers/edit.d.ts.map +1 -0
  133. package/dist/core/tools/renderers/edit.js +167 -0
  134. package/dist/core/tools/renderers/edit.js.map +1 -0
  135. package/dist/core/tools/renderers/find.d.ts +10 -0
  136. package/dist/core/tools/renderers/find.d.ts.map +1 -0
  137. package/dist/core/tools/renderers/find.js +64 -0
  138. package/dist/core/tools/renderers/find.js.map +1 -0
  139. package/dist/core/tools/renderers/grep.d.ts +10 -0
  140. package/dist/core/tools/renderers/grep.d.ts.map +1 -0
  141. package/dist/core/tools/renderers/grep.js +69 -0
  142. package/dist/core/tools/renderers/grep.js.map +1 -0
  143. package/dist/core/tools/renderers/index.d.ts +22 -0
  144. package/dist/core/tools/renderers/index.d.ts.map +1 -0
  145. package/dist/core/tools/renderers/index.js +48 -0
  146. package/dist/core/tools/renderers/index.js.map +1 -0
  147. package/dist/core/tools/renderers/ls.d.ts +10 -0
  148. package/dist/core/tools/renderers/ls.d.ts.map +1 -0
  149. package/dist/core/tools/renderers/ls.js +58 -0
  150. package/dist/core/tools/renderers/ls.js.map +1 -0
  151. package/dist/core/tools/renderers/read.d.ts +11 -0
  152. package/dist/core/tools/renderers/read.d.ts.map +1 -0
  153. package/dist/core/tools/renderers/read.js +129 -0
  154. package/dist/core/tools/renderers/read.js.map +1 -0
  155. package/dist/core/tools/renderers/write.d.ts +10 -0
  156. package/dist/core/tools/renderers/write.d.ts.map +1 -0
  157. package/dist/core/tools/renderers/write.js +152 -0
  158. package/dist/core/tools/renderers/write.js.map +1 -0
  159. package/dist/core/tools/write.d.ts.map +1 -1
  160. package/dist/core/tools/write.js +5 -145
  161. package/dist/core/tools/write.js.map +1 -1
  162. package/dist/humain/bedrock-provider/vendor/index.bundle.mjs +51 -12
  163. package/dist/humain/index.d.ts.map +1 -1
  164. package/dist/humain/index.js +2 -0
  165. package/dist/humain/index.js.map +1 -1
  166. package/dist/humain/mcp-adapter/vendor/package.json +2 -2
  167. package/dist/humain/node-http.d.ts +3 -0
  168. package/dist/humain/node-http.d.ts.map +1 -0
  169. package/dist/humain/node-http.js +119 -0
  170. package/dist/humain/node-http.js.map +1 -0
  171. package/dist/humain/node-provider.d.ts +4 -0
  172. package/dist/humain/node-provider.d.ts.map +1 -0
  173. package/dist/humain/node-provider.js +359 -0
  174. package/dist/humain/node-provider.js.map +1 -0
  175. package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
  176. package/dist/humain/web-access/vendor/curator-page.js +3 -1
  177. package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
  178. package/dist/humain/web-access/vendor/curator-server.d.ts +2 -0
  179. package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
  180. package/dist/humain/web-access/vendor/curator-server.js +4 -2
  181. package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
  182. package/dist/humain/web-access/vendor/gemini-search.d.ts +2 -2
  183. package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
  184. package/dist/humain/web-access/vendor/gemini-search.js +11 -4
  185. package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
  186. package/dist/humain/web-access/vendor/github-extract.d.ts.map +1 -1
  187. package/dist/humain/web-access/vendor/github-extract.js +238 -1
  188. package/dist/humain/web-access/vendor/github-extract.js.map +1 -1
  189. package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
  190. package/dist/humain/web-access/vendor/index.js +118 -64
  191. package/dist/humain/web-access/vendor/index.js.map +1 -1
  192. package/dist/humain/web-access/vendor/mistral-search.d.ts +4 -0
  193. package/dist/humain/web-access/vendor/mistral-search.d.ts.map +1 -0
  194. package/dist/humain/web-access/vendor/mistral-search.js +274 -0
  195. package/dist/humain/web-access/vendor/mistral-search.js.map +1 -0
  196. package/dist/humain/web-access/vendor/perplexity.d.ts.map +1 -1
  197. package/dist/humain/web-access/vendor/perplexity.js +12 -1
  198. package/dist/humain/web-access/vendor/perplexity.js.map +1 -1
  199. package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
  200. package/dist/humain/web-access/vendor/utils.js +1 -2
  201. package/dist/humain/web-access/vendor/utils.js.map +1 -1
  202. package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -1
  203. package/dist/humain/web-access/vendor/xai-search.js +92 -35
  204. package/dist/humain/web-access/vendor/xai-search.js.map +1 -1
  205. package/dist/index.d.ts +1 -1
  206. package/dist/index.d.ts.map +1 -1
  207. package/dist/index.js +1 -51
  208. package/dist/index.js.map +1 -1
  209. package/dist/main.d.ts.map +1 -1
  210. package/dist/main.js +20 -1
  211. package/dist/main.js.map +1 -1
  212. package/dist/modes/interactive/chat-viewport.d.ts +20 -0
  213. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
  214. package/dist/modes/interactive/chat-viewport.js +28 -0
  215. package/dist/modes/interactive/chat-viewport.js.map +1 -0
  216. package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  217. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  218. package/dist/modes/interactive/components/assistant-message.js +18 -10
  219. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  220. package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
  221. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  222. package/dist/modes/interactive/components/custom-editor.js +37 -1
  223. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  224. package/dist/modes/interactive/components/index.d.ts +1 -1
  225. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  226. package/dist/modes/interactive/components/index.js.map +1 -1
  227. package/dist/modes/interactive/components/login-dialog.d.ts +7 -2
  228. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  229. package/dist/modes/interactive/components/login-dialog.js +46 -21
  230. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  231. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  232. package/dist/modes/interactive/components/model-selector.js +8 -17
  233. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  234. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  235. package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
  236. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  237. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  238. package/dist/modes/interactive/components/settings-selector.js +14 -10
  239. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  240. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  241. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  242. package/dist/modes/interactive/components/status-indicator.js +10 -3
  243. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  244. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  245. package/dist/modes/interactive/components/thinking-selector.js +4 -4
  246. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  247. package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
  248. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  249. package/dist/modes/interactive/components/tool-execution.js +34 -32
  250. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  251. package/dist/modes/interactive/components/trust-selector.js +2 -2
  252. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  253. package/dist/modes/interactive/interactive-mode.d.ts +8 -15
  254. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  255. package/dist/modes/interactive/interactive-mode.js +106 -94
  256. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  257. package/dist/modes/interactive/session-share.d.ts.map +1 -1
  258. package/dist/modes/interactive/session-share.js +8 -12
  259. package/dist/modes/interactive/session-share.js.map +1 -1
  260. package/dist/modes/interactive/theme/dark.json +2 -1
  261. package/dist/modes/interactive/theme/light.json +2 -1
  262. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
  263. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  264. package/dist/modes/interactive/theme/theme-controller.js +5 -0
  265. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  266. package/dist/modes/interactive/theme/theme-json.d.ts +84 -0
  267. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -0
  268. package/dist/modes/interactive/theme/theme-json.js +130 -0
  269. package/dist/modes/interactive/theme/theme-json.js.map +1 -0
  270. package/dist/modes/interactive/theme/theme-schema.json +6 -2
  271. package/dist/modes/interactive/theme/theme.d.ts +14 -5
  272. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  273. package/dist/modes/interactive/theme/theme.js +18 -119
  274. package/dist/modes/interactive/theme/theme.js.map +1 -1
  275. package/dist/modes/interactive/tui-renderer.d.ts +21 -0
  276. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
  277. package/dist/modes/interactive/tui-renderer.js +66 -0
  278. package/dist/modes/interactive/tui-renderer.js.map +1 -0
  279. package/dist/utils/exif-orientation.d.ts.map +1 -1
  280. package/dist/utils/exif-orientation.js +2 -3
  281. package/dist/utils/exif-orientation.js.map +1 -1
  282. package/dist/utils/tools-manager.d.ts +1 -0
  283. package/dist/utils/tools-manager.d.ts.map +1 -1
  284. package/dist/utils/tools-manager.js +41 -19
  285. package/dist/utils/tools-manager.js.map +1 -1
  286. package/docs/containerization.md +45 -0
  287. package/docs/development.md +19 -0
  288. package/docs/environment-variables.md +2 -0
  289. package/docs/extensions.md +5 -2
  290. package/docs/humain-terminal.md +6 -0
  291. package/docs/keybindings.md +5 -2
  292. package/docs/models.md +4 -1
  293. package/docs/providers.md +19 -1
  294. package/docs/rpc.md +1 -1
  295. package/docs/sdk.md +5 -0
  296. package/docs/settings.md +3 -3
  297. package/docs/skills.md +1 -1
  298. package/docs/terminal-setup.md +15 -0
  299. package/docs/themes.md +8 -6
  300. package/docs/tui.md +19 -0
  301. package/examples/README.md +3 -0
  302. package/examples/extensions/custom-provider-anthropic/package-lock.json +84 -84
  303. package/examples/extensions/custom-provider-anthropic/package.json +17 -17
  304. package/examples/extensions/custom-provider-gitlab-duo/package.json +14 -14
  305. package/examples/extensions/dynamic-resources/dynamic.json +2 -0
  306. package/examples/extensions/gondolin/package-lock.json +8 -8
  307. package/examples/extensions/gondolin/package.json +1 -1
  308. package/examples/extensions/sandbox/package-lock.json +6 -6
  309. package/examples/extensions/sandbox/package.json +2 -2
  310. package/examples/extensions/with-deps/package-lock.json +29 -29
  311. package/examples/extensions/with-deps/package.json +20 -20
  312. package/examples/plugins/pi-example-plugin/README.md +38 -0
  313. package/examples/plugins/pi-example-plugin/package.json +10 -0
  314. package/examples/plugins/pi-example-plugin/src/contract.ts +13 -0
  315. package/examples/plugins/pi-example-plugin/src/session.ts +23 -0
  316. package/examples/plugins/pi-example-plugin/src/tui.ts +31 -0
  317. package/npm-shrinkwrap.json +772 -205
  318. package/package.json +31 -24
  319. package/src/humain/web-access/UPSTREAM.md +12 -1
  320. package/src/humain/web-access/upstream.json +4 -4
  321. package/dist/bundle/chunks/anthropic-messages-M4LCS3KH.js +0 -6
  322. package/dist/bundle/chunks/chunk-3VI4HD7D.js +0 -31
  323. package/dist/bundle/chunks/chunk-BOW22LW6.js +0 -42
  324. package/dist/bundle/chunks/chunk-CBHC6EL7.js +0 -133
  325. package/dist/bundle/chunks/chunk-JUUC5AZY.js +0 -2
  326. package/dist/bundle/chunks/node-ZHY4LHC7.js +0 -15
  327. package/dist/bundle/chunks/openai-codex-responses-HRVCDY54.js +0 -8
  328. package/dist/bundle/chunks/openai-responses-4MWLJHIK.js +0 -2
  329. package/dist/bundle/chunks/webapi-AFS5FDJJ.js +0 -5
  330. package/dist/bundle/client.js +0 -2
  331. package/dist/cli/experimental/auth.d.ts +0 -16
  332. package/dist/cli/experimental/auth.d.ts.map +0 -1
  333. package/dist/cli/experimental/auth.js +0 -13
  334. package/dist/cli/experimental/auth.js.map +0 -1
  335. package/dist/cli/experimental/cli.d.ts +0 -6
  336. package/dist/cli/experimental/cli.d.ts.map +0 -1
  337. package/dist/cli/experimental/cli.js +0 -5
  338. package/dist/cli/experimental/cli.js.map +0 -1
  339. package/dist/cli/experimental/command-options.d.ts +0 -17
  340. package/dist/cli/experimental/command-options.d.ts.map +0 -1
  341. package/dist/cli/experimental/command-options.js +0 -35
  342. package/dist/cli/experimental/command-options.js.map +0 -1
  343. package/dist/cli/experimental/command.d.ts +0 -63
  344. package/dist/cli/experimental/command.d.ts.map +0 -1
  345. package/dist/cli/experimental/command.js +0 -127
  346. package/dist/cli/experimental/command.js.map +0 -1
  347. package/dist/cli/experimental/commands/client.d.ts +0 -13
  348. package/dist/cli/experimental/commands/client.d.ts.map +0 -1
  349. package/dist/cli/experimental/commands/client.js +0 -25
  350. package/dist/cli/experimental/commands/client.js.map +0 -1
  351. package/dist/cli/experimental/commands/pi.d.ts +0 -15
  352. package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
  353. package/dist/cli/experimental/commands/pi.js +0 -28
  354. package/dist/cli/experimental/commands/pi.js.map +0 -1
  355. package/dist/cli/experimental/commands/server.d.ts +0 -13
  356. package/dist/cli/experimental/commands/server.d.ts.map +0 -1
  357. package/dist/cli/experimental/commands/server.js +0 -25
  358. package/dist/cli/experimental/commands/server.js.map +0 -1
  359. package/dist/cli/experimental/transport-address.d.ts +0 -10
  360. package/dist/cli/experimental/transport-address.d.ts.map +0 -1
  361. package/dist/cli/experimental/transport-address.js +0 -38
  362. package/dist/cli/experimental/transport-address.js.map +0 -1
  363. package/dist/client/index.d.ts +0 -3
  364. package/dist/client/index.d.ts.map +0 -1
  365. package/dist/client/index.js +0 -3
  366. package/dist/client/index.js.map +0 -1
  367. package/dist/client/remote-session.d.ts +0 -53
  368. package/dist/client/remote-session.d.ts.map +0 -1
  369. package/dist/client/remote-session.js +0 -340
  370. package/dist/client/remote-session.js.map +0 -1
  371. package/dist/client/transcript.d.ts +0 -12
  372. package/dist/client/transcript.d.ts.map +0 -1
  373. package/dist/client/transcript.js +0 -98
  374. package/dist/client/transcript.js.map +0 -1
  375. package/dist/server/create-harness.d.ts +0 -26
  376. package/dist/server/create-harness.d.ts.map +0 -1
  377. package/dist/server/create-harness.js +0 -106
  378. package/dist/server/create-harness.js.map +0 -1
@@ -0,0 +1,119 @@
1
+ import { lazyStream, } from "@earendil-works/pi-ai";
2
+ const PERMANENT_LIMIT_CODES = new Set([
3
+ "weekly_cap_exceeded",
4
+ "quota_exceeded",
5
+ "partner_credit_limit_exceeded",
6
+ "insufficient_quota",
7
+ "billing_hard_limit_reached",
8
+ ]);
9
+ export function withHumainNodeHttp(api) {
10
+ const run = (model, context, options, simple) => lazyStream(model, async () => {
11
+ let httpError;
12
+ let requestId = null;
13
+ let retryAfter = null;
14
+ const key = options?.apiKey;
15
+ const redact = (value) => (key ? value.replaceAll(key, "[redacted]") : value);
16
+ const fetcher = options?.fetch ?? globalThis.fetch;
17
+ const requestOptions = {
18
+ ...options,
19
+ // The Anthropic adapter must not interpret a gateway key as an OAuth token.
20
+ apiKey: model.api === "anthropic-messages" ? "humain-node" : key,
21
+ fetch: async (input, init) => {
22
+ const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));
23
+ if (key)
24
+ headers.set("Authorization", `Bearer ${key}`);
25
+ headers.delete("x-api-key");
26
+ if (model.api === "anthropic-messages") {
27
+ // The SDK appends /v1/messages?beta=true; Node exposes <configured base>/messages.
28
+ const url = `${model.baseUrl.replace(/\/+$/u, "")}/messages`;
29
+ input = input instanceof Request ? new Request(url, input) : url;
30
+ headers.delete("anthropic-beta");
31
+ }
32
+ requestId = null;
33
+ retryAfter = null;
34
+ httpError = undefined;
35
+ const response = await fetcher(input, { ...init, headers, redirect: "error" });
36
+ requestId = response.headers.get("x-request-id");
37
+ retryAfter = response.headers.get("retry-after");
38
+ if (response.ok)
39
+ return response;
40
+ const payload = await response
41
+ .clone()
42
+ .json()
43
+ .catch(() => undefined);
44
+ const error = typeof payload === "object" && payload !== null && "error" in payload ? payload.error : undefined;
45
+ const code = typeof error === "object" && error !== null
46
+ ? "code" in error && typeof error.code === "string"
47
+ ? error.code
48
+ : "type" in error && typeof error.type === "string"
49
+ ? error.type
50
+ : undefined
51
+ : undefined;
52
+ let retryable = !PERMANENT_LIMIT_CODES.has(code ?? "") &&
53
+ response.headers.get("x-should-retry") !== "false" &&
54
+ ([408, 409, 429].includes(response.status) || response.status >= 500);
55
+ httpError = { status: response.status, code: code && redact(code), retryable };
56
+ if (retryAfter) {
57
+ const retryAt = /^\d+(?:\.\d+)?$/u.test(retryAfter)
58
+ ? Date.now() + Number(retryAfter) * 1000
59
+ : Date.parse(retryAfter);
60
+ if (Number.isFinite(retryAt)) {
61
+ const delay = retryAt - Date.now();
62
+ const maxDelay = options?.maxRetryDelayMs ?? 60_000;
63
+ // Fail instead of shortening a server delay or overflowing the JS timer.
64
+ if (delay > 2_147_483_647 || (maxDelay > 0 && delay > maxDelay)) {
65
+ retryable = false;
66
+ httpError.retryable = false;
67
+ }
68
+ else {
69
+ httpError.retryAt = retryAt;
70
+ }
71
+ }
72
+ }
73
+ if (!retryable) {
74
+ const responseHeaders = new Headers(response.headers);
75
+ responseHeaders.set("x-should-retry", "false");
76
+ return new Response(response.body, {
77
+ status: response.status,
78
+ statusText: response.statusText,
79
+ headers: responseHeaders,
80
+ });
81
+ }
82
+ return response;
83
+ },
84
+ };
85
+ const source = simple
86
+ ? api.streamSimple(model, context, requestOptions)
87
+ : api.stream(model, context, requestOptions);
88
+ return (async function* () {
89
+ for await (const event of source) {
90
+ if (event.type === "error") {
91
+ event.error.errorMessage = redact([
92
+ event.error.errorMessage ?? "HUMAIN Node request failed",
93
+ httpError?.code && `code: ${httpError.code}`,
94
+ httpError?.status === 401 && "Run /login humain-node to replace the API key.",
95
+ httpError?.status === 404 &&
96
+ httpError.code === "model_not_found" &&
97
+ "Use /model to refresh the catalog and choose an available model (or restart with --list-models).",
98
+ retryAfter && `Retry-After: ${retryAfter}`,
99
+ requestId && `X-Request-ID: ${requestId}`,
100
+ ]
101
+ .filter(Boolean)
102
+ .join("; "));
103
+ if (httpError) {
104
+ event.error.diagnostics = [
105
+ ...(event.error.diagnostics ?? []),
106
+ { type: "provider_http_error", timestamp: Date.now(), details: httpError },
107
+ ];
108
+ }
109
+ }
110
+ yield event;
111
+ }
112
+ })();
113
+ });
114
+ return {
115
+ stream: (model, context, options) => run(model, context, options, false),
116
+ streamSimple: (model, context, options) => run(model, context, options, true),
117
+ };
118
+ }
119
+ //# sourceMappingURL=node-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-http.js","sourceRoot":"","sources":["../../src/humain/node-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,UAAU,GAIV,MAAM,uBAAuB,CAAC;AAE/B,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACrC,qBAAqB;IACrB,gBAAgB;IAChB,+BAA+B;IAC/B,oBAAoB;IACpB,4BAA4B;CAC5B,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,GAAoB;IACtD,MAAM,GAAG,GAAG,CAAC,KAAiB,EAAE,OAAgB,EAAE,OAAwC,EAAE,MAAe,EAAE,EAAE,CAC9G,UAAU,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;QAC5B,IAAI,SAA8C,CAAC;QACnD,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,MAAM,GAAG,GAAG,OAAO,EAAE,MAAM,CAAC;QAC5B,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9F,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QACnD,MAAM,cAAc,GAAG;YACtB,GAAG,OAAO;YACV,4EAA4E;YAC5E,MAAM,EAAE,KAAK,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG;YAChE,KAAK,EAAE,KAAK,EAAE,KAAkC,EAAE,IAAkB,EAAqB,EAAE;gBAC1F,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;gBACrG,IAAI,GAAG;oBAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC;gBACvD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC5B,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,EAAE,CAAC;oBACxC,mFAAmF;oBACnF,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;oBAC7D,KAAK,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;oBACjE,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBAClC,CAAC;gBACD,SAAS,GAAG,IAAI,CAAC;gBACjB,UAAU,GAAG,IAAI,CAAC;gBAClB,SAAS,GAAG,SAAS,CAAC;gBACtB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/E,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACjD,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACjD,IAAI,QAAQ,CAAC,EAAE;oBAAE,OAAO,QAAQ,CAAC;gBACjC,MAAM,OAAO,GAAY,MAAM,QAAQ;qBACrC,KAAK,EAAE;qBACP,IAAI,EAAE;qBACN,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACzB,MAAM,KAAK,GACV,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;gBACnG,MAAM,IAAI,GACT,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;oBAC1C,CAAC,CAAC,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;wBAClD,CAAC,CAAC,KAAK,CAAC,IAAI;wBACZ,CAAC,CAAC,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;4BAClD,CAAC,CAAC,KAAK,CAAC,IAAI;4BACZ,CAAC,CAAC,SAAS;oBACb,CAAC,CAAC,SAAS,CAAC;gBACd,IAAI,SAAS,GACZ,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;oBACtC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,OAAO;oBAClD,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;gBACvE,SAAS,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;gBAC/E,IAAI,UAAU,EAAE,CAAC;oBAChB,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;wBAClD,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI;wBACxC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBAC1B,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC9B,MAAM,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;wBACnC,MAAM,QAAQ,GAAG,OAAO,EAAE,eAAe,IAAI,MAAM,CAAC;wBACpD,yEAAyE;wBACzE,IAAI,KAAK,GAAG,aAAa,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC;4BACjE,SAAS,GAAG,KAAK,CAAC;4BAClB,SAAS,CAAC,SAAS,GAAG,KAAK,CAAC;wBAC7B,CAAC;6BAAM,CAAC;4BACP,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;wBAC7B,CAAC;oBACF,CAAC;gBACF,CAAC;gBACD,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACtD,eAAe,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;oBAC/C,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;wBAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,OAAO,EAAE,eAAe;qBACxB,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO,QAAQ,CAAC;YACjB,CAAC;SACD,CAAC;QACF,MAAM,MAAM,GAAG,MAAM;YACpB,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC;YAClD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,SAAS,CAAC;YACtB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC5B,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAChC;wBACC,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,4BAA4B;wBACxD,SAAS,EAAE,IAAI,IAAI,SAAS,SAAS,CAAC,IAAI,EAAE;wBAC5C,SAAS,EAAE,MAAM,KAAK,GAAG,IAAI,gDAAgD;wBAC7E,SAAS,EAAE,MAAM,KAAK,GAAG;4BACxB,SAAS,CAAC,IAAI,KAAK,iBAAiB;4BACpC,kGAAkG;wBACnG,UAAU,IAAI,gBAAgB,UAAU,EAAE;wBAC1C,SAAS,IAAI,iBAAiB,SAAS,EAAE;qBACzC;yBACC,MAAM,CAAC,OAAO,CAAC;yBACf,IAAI,CAAC,IAAI,CAAC,CACZ,CAAC;oBACF,IAAI,SAAS,EAAE,CAAC;wBACf,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG;4BACzB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;4BAClC,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;yBAC1E,CAAC;oBACH,CAAC;gBACF,CAAC;gBACD,MAAM,KAAK,CAAC;YACb,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;IACN,CAAC,CAAC,CAAC;IACJ,OAAO;QACN,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC;QACxE,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;KAC7E,CAAC;AACH,CAAC","sourcesContent":["import {\n\ttype Api,\n\ttype AssistantMessageEvent,\n\ttype Context,\n\tlazyStream,\n\ttype Model,\n\ttype ProviderStreams,\n\ttype SimpleStreamOptions,\n} from \"@earendil-works/pi-ai\";\n\nconst PERMANENT_LIMIT_CODES = new Set([\n\t\"weekly_cap_exceeded\",\n\t\"quota_exceeded\",\n\t\"partner_credit_limit_exceeded\",\n\t\"insufficient_quota\",\n\t\"billing_hard_limit_reached\",\n]);\n\nexport function withHumainNodeHttp(api: ProviderStreams): ProviderStreams {\n\tconst run = (model: Model<Api>, context: Context, options: SimpleStreamOptions | undefined, simple: boolean) =>\n\t\tlazyStream(model, async () => {\n\t\t\tlet httpError: Record<string, unknown> | undefined;\n\t\t\tlet requestId: string | null = null;\n\t\t\tlet retryAfter: string | null = null;\n\t\t\tconst key = options?.apiKey;\n\t\t\tconst redact = (value: string): string => (key ? value.replaceAll(key, \"[redacted]\") : value);\n\t\t\tconst fetcher = options?.fetch ?? globalThis.fetch;\n\t\t\tconst requestOptions = {\n\t\t\t\t...options,\n\t\t\t\t// The Anthropic adapter must not interpret a gateway key as an OAuth token.\n\t\t\t\tapiKey: model.api === \"anthropic-messages\" ? \"humain-node\" : key,\n\t\t\t\tfetch: async (input: Parameters<typeof fetch>[0], init?: RequestInit): Promise<Response> => {\n\t\t\t\t\tconst headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));\n\t\t\t\t\tif (key) headers.set(\"Authorization\", `Bearer ${key}`);\n\t\t\t\t\theaders.delete(\"x-api-key\");\n\t\t\t\t\tif (model.api === \"anthropic-messages\") {\n\t\t\t\t\t\t// The SDK appends /v1/messages?beta=true; Node exposes <configured base>/messages.\n\t\t\t\t\t\tconst url = `${model.baseUrl.replace(/\\/+$/u, \"\")}/messages`;\n\t\t\t\t\t\tinput = input instanceof Request ? new Request(url, input) : url;\n\t\t\t\t\t\theaders.delete(\"anthropic-beta\");\n\t\t\t\t\t}\n\t\t\t\t\trequestId = null;\n\t\t\t\t\tretryAfter = null;\n\t\t\t\t\thttpError = undefined;\n\t\t\t\t\tconst response = await fetcher(input, { ...init, headers, redirect: \"error\" });\n\t\t\t\t\trequestId = response.headers.get(\"x-request-id\");\n\t\t\t\t\tretryAfter = response.headers.get(\"retry-after\");\n\t\t\t\t\tif (response.ok) return response;\n\t\t\t\t\tconst payload: unknown = await response\n\t\t\t\t\t\t.clone()\n\t\t\t\t\t\t.json()\n\t\t\t\t\t\t.catch(() => undefined);\n\t\t\t\t\tconst error =\n\t\t\t\t\t\ttypeof payload === \"object\" && payload !== null && \"error\" in payload ? payload.error : undefined;\n\t\t\t\t\tconst code =\n\t\t\t\t\t\ttypeof error === \"object\" && error !== null\n\t\t\t\t\t\t\t? \"code\" in error && typeof error.code === \"string\"\n\t\t\t\t\t\t\t\t? error.code\n\t\t\t\t\t\t\t\t: \"type\" in error && typeof error.type === \"string\"\n\t\t\t\t\t\t\t\t\t? error.type\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tlet retryable =\n\t\t\t\t\t\t!PERMANENT_LIMIT_CODES.has(code ?? \"\") &&\n\t\t\t\t\t\tresponse.headers.get(\"x-should-retry\") !== \"false\" &&\n\t\t\t\t\t\t([408, 409, 429].includes(response.status) || response.status >= 500);\n\t\t\t\t\thttpError = { status: response.status, code: code && redact(code), retryable };\n\t\t\t\t\tif (retryAfter) {\n\t\t\t\t\t\tconst retryAt = /^\\d+(?:\\.\\d+)?$/u.test(retryAfter)\n\t\t\t\t\t\t\t? Date.now() + Number(retryAfter) * 1000\n\t\t\t\t\t\t\t: Date.parse(retryAfter);\n\t\t\t\t\t\tif (Number.isFinite(retryAt)) {\n\t\t\t\t\t\t\tconst delay = retryAt - Date.now();\n\t\t\t\t\t\t\tconst maxDelay = options?.maxRetryDelayMs ?? 60_000;\n\t\t\t\t\t\t\t// Fail instead of shortening a server delay or overflowing the JS timer.\n\t\t\t\t\t\t\tif (delay > 2_147_483_647 || (maxDelay > 0 && delay > maxDelay)) {\n\t\t\t\t\t\t\t\tretryable = false;\n\t\t\t\t\t\t\t\thttpError.retryable = false;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thttpError.retryAt = retryAt;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!retryable) {\n\t\t\t\t\t\tconst responseHeaders = new Headers(response.headers);\n\t\t\t\t\t\tresponseHeaders.set(\"x-should-retry\", \"false\");\n\t\t\t\t\t\treturn new Response(response.body, {\n\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t\tstatusText: response.statusText,\n\t\t\t\t\t\t\theaders: responseHeaders,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn response;\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst source = simple\n\t\t\t\t? api.streamSimple(model, context, requestOptions)\n\t\t\t\t: api.stream(model, context, requestOptions);\n\t\t\treturn (async function* (): AsyncGenerator<AssistantMessageEvent> {\n\t\t\t\tfor await (const event of source) {\n\t\t\t\t\tif (event.type === \"error\") {\n\t\t\t\t\t\tevent.error.errorMessage = redact(\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\tevent.error.errorMessage ?? \"HUMAIN Node request failed\",\n\t\t\t\t\t\t\t\thttpError?.code && `code: ${httpError.code}`,\n\t\t\t\t\t\t\t\thttpError?.status === 401 && \"Run /login humain-node to replace the API key.\",\n\t\t\t\t\t\t\t\thttpError?.status === 404 &&\n\t\t\t\t\t\t\t\t\thttpError.code === \"model_not_found\" &&\n\t\t\t\t\t\t\t\t\t\"Use /model to refresh the catalog and choose an available model (or restart with --list-models).\",\n\t\t\t\t\t\t\t\tretryAfter && `Retry-After: ${retryAfter}`,\n\t\t\t\t\t\t\t\trequestId && `X-Request-ID: ${requestId}`,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t.join(\"; \"),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (httpError) {\n\t\t\t\t\t\t\tevent.error.diagnostics = [\n\t\t\t\t\t\t\t\t...(event.error.diagnostics ?? []),\n\t\t\t\t\t\t\t\t{ type: \"provider_http_error\", timestamp: Date.now(), details: httpError },\n\t\t\t\t\t\t\t];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tyield event;\n\t\t\t\t}\n\t\t\t})();\n\t\t});\n\treturn {\n\t\tstream: (model, context, options) => run(model, context, options, false),\n\t\tstreamSimple: (model, context, options) => run(model, context, options, true),\n\t};\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { type Provider } from "@earendil-works/pi-ai";
2
+ export declare const HUMAIN_NODE_PROVIDER = "humain-node";
3
+ export declare function createHumainNodeProvider(env?: NodeJS.ProcessEnv): Provider;
4
+ //# sourceMappingURL=node-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-provider.d.ts","sourceRoot":"","sources":["../../src/humain/node-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAQN,KAAK,QAAQ,EAEb,MAAM,uBAAuB,CAAC;AAM/B,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAwRlD,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,QAAQ,CAgGvF"}
@@ -0,0 +1,359 @@
1
+ import { setTimeout as delay } from "node:timers/promises";
2
+ import { createProvider, } from "@earendil-works/pi-ai";
3
+ import { anthropicMessagesApi } from "@earendil-works/pi-ai/api/anthropic-messages.lazy";
4
+ import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completions.lazy";
5
+ import { openAIResponsesApi } from "@earendil-works/pi-ai/api/openai-responses.lazy";
6
+ import { withHumainNodeHttp } from "./node-http.js";
7
+ export const HUMAIN_NODE_PROVIDER = "humain-node";
8
+ const DEFAULT_BASE_URL = "https://api.node.humain.com/v1";
9
+ const API_KEY_ENV = "HUMAIN_NODE_API_KEY";
10
+ const BASE_URL_ENV = "HUMAIN_NODE_BASE_URL";
11
+ const RETRYABLE_STATUS_CODES = new Set([408, 425, 429, 500, 502, 503, 504]);
12
+ const PERMANENT_LIMIT_CODES = new Set([
13
+ "billing_hard_limit_reached",
14
+ "insufficient_quota",
15
+ "partner_credit_limit_exceeded",
16
+ "quota_exceeded",
17
+ "weekly_cap_exceeded",
18
+ ]);
19
+ const REQUEST_TIMEOUT_MS = 5_000;
20
+ const MAX_RETRIES = 2;
21
+ const MAX_RETRY_DELAY_MS = 2_000;
22
+ const ZERO_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
23
+ function normalizeBaseUrl(value) {
24
+ let url;
25
+ try {
26
+ url = new URL(value.trim());
27
+ }
28
+ catch {
29
+ throw new Error("Invalid HUMAIN Node base URL");
30
+ }
31
+ const local = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "[::1]";
32
+ if (url.protocol !== "https:" && !(local && url.protocol === "http:")) {
33
+ throw new Error("HUMAIN Node base URL must use HTTPS (HTTP is allowed only for localhost)");
34
+ }
35
+ if (url.username || url.password || url.search || url.hash) {
36
+ throw new Error("HUMAIN Node base URL must not contain credentials, a query, or a fragment");
37
+ }
38
+ url.pathname = url.pathname.replace(/\/+$/u, "") || "/";
39
+ return url.toString().replace(/\/$/u, "");
40
+ }
41
+ function credentialBaseUrl(credential) {
42
+ const value = credential?.env?.[BASE_URL_ENV];
43
+ return typeof value === "string" && value.trim() ? normalizeBaseUrl(value) : undefined;
44
+ }
45
+ async function resolveBaseUrl(ctx, credential) {
46
+ return credentialBaseUrl(credential) ?? normalizeBaseUrl((await ctx.env(BASE_URL_ENV)) ?? DEFAULT_BASE_URL);
47
+ }
48
+ function endpointApi(value) {
49
+ const normalized = value
50
+ .trim()
51
+ .toLowerCase()
52
+ .replace(/^https?:\/\/[^/]+/u, "")
53
+ .replace(/\/+$/u, "");
54
+ switch (normalized) {
55
+ case "responses":
56
+ case "/responses":
57
+ case "openai-responses":
58
+ case "openai_responses":
59
+ return "openai-responses";
60
+ case "chat/completions":
61
+ case "/chat/completions":
62
+ case "chat-completions":
63
+ case "chat_completions":
64
+ case "openai-completions":
65
+ case "openai_chat_completions":
66
+ return "openai-completions";
67
+ case "messages":
68
+ case "/messages":
69
+ case "anthropic-messages":
70
+ case "anthropic_messages":
71
+ return "anthropic-messages";
72
+ default:
73
+ return undefined;
74
+ }
75
+ }
76
+ function modelApi(id, node) {
77
+ if (typeof node.api_interface === "string") {
78
+ const primary = endpointApi(node.api_interface);
79
+ if (primary)
80
+ return primary;
81
+ }
82
+ const supported = Array.isArray(node.supported_formats)
83
+ ? node.supported_formats.flatMap((value) => (typeof value === "string" ? (endpointApi(value) ?? []) : []))
84
+ : [];
85
+ for (const preferred of ["openai-responses", "openai-completions", "anthropic-messages"]) {
86
+ if (supported.includes(preferred))
87
+ return preferred;
88
+ }
89
+ const primary = typeof node.api_interface === "string" ? node.api_interface : "missing";
90
+ throw new Error(`HUMAIN Node model "${id}" has an unsupported API interface: ${primary}`);
91
+ }
92
+ function positiveInteger(value, field, id) {
93
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0) {
94
+ throw new Error(`HUMAIN Node model "${id}" has invalid ${field}`);
95
+ }
96
+ return value;
97
+ }
98
+ function toModel(value, baseUrl) {
99
+ if (typeof value !== "object" || value === null || !("id" in value)) {
100
+ throw new Error("HUMAIN Node returned a malformed model entry");
101
+ }
102
+ const raw = value;
103
+ if (raw.active === false)
104
+ return undefined;
105
+ const node = typeof raw.node === "object" && raw.node !== null ? raw.node : raw;
106
+ const payload = { ...raw, node };
107
+ if (typeof payload.id !== "string" || !payload.id.trim()) {
108
+ throw new Error("HUMAIN Node returned a malformed model entry");
109
+ }
110
+ const id = payload.id.trim();
111
+ if (typeof payload.node.supports_streaming !== "boolean") {
112
+ throw new Error(`HUMAIN Node model "${id}" has invalid supports_streaming`);
113
+ }
114
+ if (typeof payload.node.supports_function_calling !== "boolean") {
115
+ throw new Error(`HUMAIN Node model "${id}" has invalid supports_function_calling`);
116
+ }
117
+ if (payload.node.supports_streaming === false || payload.node.supports_function_calling === false)
118
+ return undefined;
119
+ let api;
120
+ try {
121
+ api = modelApi(id, payload.node);
122
+ }
123
+ catch (error) {
124
+ if (payload.node.api_interface === "image_generations" || payload.node.api_interface === "realtime")
125
+ return undefined;
126
+ throw error;
127
+ }
128
+ const contextWindow = payload.node.max_context_tokens;
129
+ const maxTokens = payload.node.max_output_tokens;
130
+ if (contextWindow === null || maxTokens === null || contextWindow === 0 || maxTokens === 0)
131
+ return undefined;
132
+ return {
133
+ id,
134
+ name: typeof payload.display_name === "string" && payload.display_name.trim()
135
+ ? payload.display_name.trim()
136
+ : typeof payload.name === "string" && payload.name.trim()
137
+ ? payload.name.trim()
138
+ : id,
139
+ api,
140
+ provider: HUMAIN_NODE_PROVIDER,
141
+ baseUrl,
142
+ reasoning: false,
143
+ input: payload.node.supports_images === true ? ["text", "image"] : ["text"],
144
+ cost: ZERO_COST,
145
+ contextWindow: positiveInteger(contextWindow, "max_context_tokens", id),
146
+ maxTokens: positiveInteger(maxTokens, "max_output_tokens", id),
147
+ ...(api === "openai-completions"
148
+ ? {
149
+ compat: {
150
+ supportsStore: false,
151
+ supportsDeveloperRole: false,
152
+ supportsReasoningEffort: false,
153
+ supportsUsageInStreaming: true,
154
+ supportsStrictMode: false,
155
+ supportsLongCacheRetention: false,
156
+ maxTokensField: "max_tokens",
157
+ },
158
+ }
159
+ : {}),
160
+ };
161
+ }
162
+ function retryDelay(response, attempt) {
163
+ const retryAfter = response.headers.get("retry-after");
164
+ if (retryAfter) {
165
+ const seconds = Number(retryAfter);
166
+ const delay = Number.isFinite(seconds) ? seconds * 1_000 : Date.parse(retryAfter) - Date.now();
167
+ if (Number.isFinite(delay)) {
168
+ const bounded = Math.max(0, delay);
169
+ return bounded <= MAX_RETRY_DELAY_MS ? bounded : undefined;
170
+ }
171
+ }
172
+ return 100 * 2 ** attempt;
173
+ }
174
+ function errorDetails(response, payload) {
175
+ const error = payload.error;
176
+ const code = typeof error?.code === "string" ? error.code : undefined;
177
+ const type = typeof error?.type === "string" ? error.type : undefined;
178
+ const detail = typeof error?.message === "string" ? error.message : undefined;
179
+ const retryAfter = response.headers.get("retry-after");
180
+ const requestId = response.headers.get("x-request-id");
181
+ return {
182
+ code,
183
+ message: [
184
+ `HUMAIN Node model discovery failed: ${response.status}`,
185
+ code && `code=${code}`,
186
+ type && `type=${type}`,
187
+ detail,
188
+ retryAfter && `Retry-After: ${retryAfter}`,
189
+ requestId && `X-Request-ID: ${requestId}`,
190
+ ]
191
+ .filter(Boolean)
192
+ .join("; "),
193
+ };
194
+ }
195
+ async function fetchModelsUnredacted(baseUrl, apiKey, signal) {
196
+ for (let attempt = 0;; attempt++) {
197
+ signal.throwIfAborted();
198
+ const attemptSignal = AbortSignal.any([signal, AbortSignal.timeout(REQUEST_TIMEOUT_MS)]);
199
+ let response;
200
+ try {
201
+ response = await fetch(new URL(`${baseUrl}/models`), {
202
+ signal: attemptSignal,
203
+ redirect: "error",
204
+ headers: { Accept: "application/json", Authorization: `Bearer ${apiKey}` },
205
+ });
206
+ }
207
+ catch (error) {
208
+ if (signal.aborted || attempt >= MAX_RETRIES)
209
+ throw error;
210
+ await delay(100 * 2 ** attempt, undefined, { signal });
211
+ continue;
212
+ }
213
+ const payload = await response.json().catch(() => ({}));
214
+ if (!response.ok) {
215
+ const details = errorDetails(response, typeof payload === "object" && payload !== null ? payload : {});
216
+ const retryMs = retryDelay(response, attempt);
217
+ if (attempt < MAX_RETRIES &&
218
+ RETRYABLE_STATUS_CODES.has(response.status) &&
219
+ !PERMANENT_LIMIT_CODES.has(details.code ?? "") &&
220
+ retryMs !== undefined) {
221
+ await delay(retryMs, undefined, { signal });
222
+ continue;
223
+ }
224
+ throw new Error(details.message);
225
+ }
226
+ if (typeof payload !== "object" || payload === null) {
227
+ throw new Error("HUMAIN Node returned a malformed model catalog");
228
+ }
229
+ const entries = "data" in payload && Array.isArray(payload.data)
230
+ ? payload.data
231
+ : "items" in payload && Array.isArray(payload.items)
232
+ ? payload.items
233
+ : undefined;
234
+ if (!entries)
235
+ throw new Error("HUMAIN Node returned a malformed model catalog");
236
+ const ids = new Set();
237
+ for (const entry of entries) {
238
+ if (typeof entry !== "object" || entry === null || !("id" in entry) || typeof entry.id !== "string")
239
+ continue;
240
+ const id = entry.id.trim();
241
+ if (ids.has(id))
242
+ throw new Error(`HUMAIN Node returned duplicate model id "${id}"`);
243
+ ids.add(id);
244
+ }
245
+ return entries.flatMap((entry) => toModel(entry, baseUrl) ?? []);
246
+ }
247
+ }
248
+ async function fetchModels(baseUrl, apiKey, signal) {
249
+ try {
250
+ return await fetchModelsUnredacted(baseUrl, apiKey, signal);
251
+ }
252
+ catch (error) {
253
+ if (signal.aborted)
254
+ throw signal.reason;
255
+ const message = (error instanceof Error ? error.message : String(error)).replaceAll(apiKey, "[redacted]");
256
+ const redacted = new Error(message);
257
+ if (error instanceof Error)
258
+ redacted.name = error.name;
259
+ throw redacted;
260
+ }
261
+ }
262
+ export function createHumainNodeProvider(env = process.env) {
263
+ let models = [];
264
+ let activeScope;
265
+ const apiKeyAuth = {
266
+ name: "HUMAIN Node API key",
267
+ login: async (interaction) => {
268
+ if (!env[API_KEY_ENV]?.trim()) {
269
+ interaction.notify({
270
+ type: "info",
271
+ message: "Create a HUMAIN Node API key in Node Users, then paste it below.",
272
+ });
273
+ }
274
+ const enteredKey = (await interaction.prompt({
275
+ type: "secret",
276
+ message: "Enter HUMAIN Node API key (leave blank to use HUMAIN_NODE_API_KEY)",
277
+ })).trim();
278
+ const key = enteredKey || env[API_KEY_ENV]?.trim();
279
+ if (!key)
280
+ throw new Error("HUMAIN Node API key is required");
281
+ const enteredUrl = await interaction.prompt({
282
+ type: "text",
283
+ message: "HUMAIN Node base URL",
284
+ placeholder: env[BASE_URL_ENV] ?? DEFAULT_BASE_URL,
285
+ });
286
+ const baseUrl = normalizeBaseUrl(enteredUrl.trim() || env[BASE_URL_ENV] || DEFAULT_BASE_URL);
287
+ await fetchModels(baseUrl, key, interaction.signal);
288
+ return {
289
+ type: "api_key",
290
+ key: enteredKey.replaceAll("$", () => "$$").replace(/^!/u, () => "$!") || undefined,
291
+ env: { [BASE_URL_ENV]: baseUrl },
292
+ };
293
+ },
294
+ check: async ({ ctx, credential, signal }) => {
295
+ signal.throwIfAborted();
296
+ const key = credential?.key ?? (await ctx.env(API_KEY_ENV));
297
+ return key
298
+ ? { type: "api_key", source: credential?.key ? "stored credential" : API_KEY_ENV }
299
+ : undefined;
300
+ },
301
+ resolve: async ({ ctx, credential, signal }) => {
302
+ signal.throwIfAborted();
303
+ const key = credential?.key ?? (await ctx.env(API_KEY_ENV));
304
+ if (!key)
305
+ return undefined;
306
+ const baseUrl = await resolveBaseUrl(ctx, credential);
307
+ return {
308
+ auth: { apiKey: key, baseUrl },
309
+ env: { ...credential?.env, [BASE_URL_ENV]: baseUrl },
310
+ source: credential?.key ? "stored credential" : API_KEY_ENV,
311
+ };
312
+ },
313
+ };
314
+ const base = createProvider({
315
+ id: HUMAIN_NODE_PROVIDER,
316
+ name: "HUMAIN Node",
317
+ baseUrl: DEFAULT_BASE_URL,
318
+ auth: { apiKey: apiKeyAuth },
319
+ models: [],
320
+ api: {
321
+ "anthropic-messages": withHumainNodeHttp(anthropicMessagesApi()),
322
+ "openai-completions": withHumainNodeHttp(openAICompletionsApi()),
323
+ "openai-responses": withHumainNodeHttp(openAIResponsesApi()),
324
+ },
325
+ });
326
+ return {
327
+ ...base,
328
+ getModels: () => models,
329
+ refreshModels: async (context) => {
330
+ const credential = context.credential?.type === "api_key" ? context.credential : undefined;
331
+ const key = credential?.key;
332
+ const baseUrl = credential ? (credentialBaseUrl(credential) ?? DEFAULT_BASE_URL) : undefined;
333
+ const scope = key && baseUrl ? `${baseUrl}\0${key}` : undefined;
334
+ if (scope !== activeScope) {
335
+ if (!(await context.publish({
336
+ persist: null,
337
+ update: () => {
338
+ models = [];
339
+ activeScope = scope;
340
+ },
341
+ })))
342
+ return;
343
+ }
344
+ if (!context.allowNetwork || context.signal.aborted || !key || !baseUrl)
345
+ return;
346
+ const refreshed = await fetchModels(baseUrl, key, context.signal);
347
+ if (context.signal.aborted)
348
+ return;
349
+ await context.publish({
350
+ persist: null,
351
+ update: () => {
352
+ models = refreshed;
353
+ activeScope = scope;
354
+ },
355
+ });
356
+ },
357
+ };
358
+ }
359
+ //# sourceMappingURL=node-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-provider.js","sourceRoot":"","sources":["../../src/humain/node-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { setTimeout as delay } from \"node:timers/promises\";\nimport {\n\ttype Api,\n\ttype ApiKeyAuth,\n\ttype ApiKeyCredential,\n\ttype AuthContext,\n\ttype AuthResult,\n\tcreateProvider,\n\ttype Model,\n\ttype Provider,\n\ttype RefreshModelsContext,\n} from \"@earendil-works/pi-ai\";\nimport { anthropicMessagesApi } from \"@earendil-works/pi-ai/api/anthropic-messages.lazy\";\nimport { openAICompletionsApi } from \"@earendil-works/pi-ai/api/openai-completions.lazy\";\nimport { openAIResponsesApi } from \"@earendil-works/pi-ai/api/openai-responses.lazy\";\nimport { withHumainNodeHttp } from \"./node-http.ts\";\n\nexport const HUMAIN_NODE_PROVIDER = \"humain-node\";\n\nconst DEFAULT_BASE_URL = \"https://api.node.humain.com/v1\";\nconst API_KEY_ENV = \"HUMAIN_NODE_API_KEY\";\nconst BASE_URL_ENV = \"HUMAIN_NODE_BASE_URL\";\nconst RETRYABLE_STATUS_CODES = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst PERMANENT_LIMIT_CODES = new Set([\n\t\"billing_hard_limit_reached\",\n\t\"insufficient_quota\",\n\t\"partner_credit_limit_exceeded\",\n\t\"quota_exceeded\",\n\t\"weekly_cap_exceeded\",\n]);\nconst REQUEST_TIMEOUT_MS = 5_000;\nconst MAX_RETRIES = 2;\nconst MAX_RETRY_DELAY_MS = 2_000;\nconst ZERO_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n\ninterface NodeModelPayload {\n\tid: unknown;\n\tname?: unknown;\n\tdisplay_name?: unknown;\n\tnode: {\n\t\tapi_interface?: unknown;\n\t\tsupported_formats?: unknown;\n\t\tmax_context_tokens?: unknown;\n\t\tmax_output_tokens?: unknown;\n\t\tsupports_streaming?: unknown;\n\t\tsupports_function_calling?: unknown;\n\t\tsupports_images?: unknown;\n\t};\n}\n\ninterface NodeErrorPayload {\n\terror?: { code?: unknown; type?: unknown; message?: unknown };\n}\n\nfunction normalizeBaseUrl(value: string): string {\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(value.trim());\n\t} catch {\n\t\tthrow new Error(\"Invalid HUMAIN Node base URL\");\n\t}\n\tconst local = url.hostname === \"localhost\" || url.hostname === \"127.0.0.1\" || url.hostname === \"[::1]\";\n\tif (url.protocol !== \"https:\" && !(local && url.protocol === \"http:\")) {\n\t\tthrow new Error(\"HUMAIN Node base URL must use HTTPS (HTTP is allowed only for localhost)\");\n\t}\n\tif (url.username || url.password || url.search || url.hash) {\n\t\tthrow new Error(\"HUMAIN Node base URL must not contain credentials, a query, or a fragment\");\n\t}\n\turl.pathname = url.pathname.replace(/\\/+$/u, \"\") || \"/\";\n\treturn url.toString().replace(/\\/$/u, \"\");\n}\n\nfunction credentialBaseUrl(credential: ApiKeyCredential | undefined): string | undefined {\n\tconst value = credential?.env?.[BASE_URL_ENV];\n\treturn typeof value === \"string\" && value.trim() ? normalizeBaseUrl(value) : undefined;\n}\n\nasync function resolveBaseUrl(ctx: AuthContext, credential?: ApiKeyCredential): Promise<string> {\n\treturn credentialBaseUrl(credential) ?? normalizeBaseUrl((await ctx.env(BASE_URL_ENV)) ?? DEFAULT_BASE_URL);\n}\n\nfunction endpointApi(value: string): Api | undefined {\n\tconst normalized = value\n\t\t.trim()\n\t\t.toLowerCase()\n\t\t.replace(/^https?:\\/\\/[^/]+/u, \"\")\n\t\t.replace(/\\/+$/u, \"\");\n\tswitch (normalized) {\n\t\tcase \"responses\":\n\t\tcase \"/responses\":\n\t\tcase \"openai-responses\":\n\t\tcase \"openai_responses\":\n\t\t\treturn \"openai-responses\";\n\t\tcase \"chat/completions\":\n\t\tcase \"/chat/completions\":\n\t\tcase \"chat-completions\":\n\t\tcase \"chat_completions\":\n\t\tcase \"openai-completions\":\n\t\tcase \"openai_chat_completions\":\n\t\t\treturn \"openai-completions\";\n\t\tcase \"messages\":\n\t\tcase \"/messages\":\n\t\tcase \"anthropic-messages\":\n\t\tcase \"anthropic_messages\":\n\t\t\treturn \"anthropic-messages\";\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction modelApi(id: string, node: NodeModelPayload[\"node\"]): Api {\n\tif (typeof node.api_interface === \"string\") {\n\t\tconst primary = endpointApi(node.api_interface);\n\t\tif (primary) return primary;\n\t}\n\tconst supported = Array.isArray(node.supported_formats)\n\t\t? node.supported_formats.flatMap((value) => (typeof value === \"string\" ? (endpointApi(value) ?? []) : []))\n\t\t: [];\n\tfor (const preferred of [\"openai-responses\", \"openai-completions\", \"anthropic-messages\"] as const) {\n\t\tif (supported.includes(preferred)) return preferred;\n\t}\n\tconst primary = typeof node.api_interface === \"string\" ? node.api_interface : \"missing\";\n\tthrow new Error(`HUMAIN Node model \"${id}\" has an unsupported API interface: ${primary}`);\n}\n\nfunction positiveInteger(value: unknown, field: string, id: string): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value <= 0) {\n\t\tthrow new Error(`HUMAIN Node model \"${id}\" has invalid ${field}`);\n\t}\n\treturn value;\n}\n\nfunction toModel(value: unknown, baseUrl: string): Model<Api> | undefined {\n\tif (typeof value !== \"object\" || value === null || !(\"id\" in value)) {\n\t\tthrow new Error(\"HUMAIN Node returned a malformed model entry\");\n\t}\n\tconst raw = value as Record<string, unknown>;\n\tif (raw.active === false) return undefined;\n\tconst node = typeof raw.node === \"object\" && raw.node !== null ? raw.node : raw;\n\tconst payload = { ...raw, node } as unknown as NodeModelPayload;\n\tif (typeof payload.id !== \"string\" || !payload.id.trim()) {\n\t\tthrow new Error(\"HUMAIN Node returned a malformed model entry\");\n\t}\n\tconst id = payload.id.trim();\n\tif (typeof payload.node.supports_streaming !== \"boolean\") {\n\t\tthrow new Error(`HUMAIN Node model \"${id}\" has invalid supports_streaming`);\n\t}\n\tif (typeof payload.node.supports_function_calling !== \"boolean\") {\n\t\tthrow new Error(`HUMAIN Node model \"${id}\" has invalid supports_function_calling`);\n\t}\n\tif (payload.node.supports_streaming === false || payload.node.supports_function_calling === false) return undefined;\n\tlet api: Api;\n\ttry {\n\t\tapi = modelApi(id, payload.node);\n\t} catch (error) {\n\t\tif (payload.node.api_interface === \"image_generations\" || payload.node.api_interface === \"realtime\")\n\t\t\treturn undefined;\n\t\tthrow error;\n\t}\n\tconst contextWindow = payload.node.max_context_tokens;\n\tconst maxTokens = payload.node.max_output_tokens;\n\tif (contextWindow === null || maxTokens === null || contextWindow === 0 || maxTokens === 0) return undefined;\n\treturn {\n\t\tid,\n\t\tname:\n\t\t\ttypeof payload.display_name === \"string\" && payload.display_name.trim()\n\t\t\t\t? payload.display_name.trim()\n\t\t\t\t: typeof payload.name === \"string\" && payload.name.trim()\n\t\t\t\t\t? payload.name.trim()\n\t\t\t\t\t: id,\n\t\tapi,\n\t\tprovider: HUMAIN_NODE_PROVIDER,\n\t\tbaseUrl,\n\t\treasoning: false,\n\t\tinput: payload.node.supports_images === true ? [\"text\", \"image\"] : [\"text\"],\n\t\tcost: ZERO_COST,\n\t\tcontextWindow: positiveInteger(contextWindow, \"max_context_tokens\", id),\n\t\tmaxTokens: positiveInteger(maxTokens, \"max_output_tokens\", id),\n\t\t...(api === \"openai-completions\"\n\t\t\t? {\n\t\t\t\t\tcompat: {\n\t\t\t\t\t\tsupportsStore: false,\n\t\t\t\t\t\tsupportsDeveloperRole: false,\n\t\t\t\t\t\tsupportsReasoningEffort: false,\n\t\t\t\t\t\tsupportsUsageInStreaming: true,\n\t\t\t\t\t\tsupportsStrictMode: false,\n\t\t\t\t\t\tsupportsLongCacheRetention: false,\n\t\t\t\t\t\tmaxTokensField: \"max_tokens\" as const,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nfunction retryDelay(response: Response, attempt: number): number | undefined {\n\tconst retryAfter = response.headers.get(\"retry-after\");\n\tif (retryAfter) {\n\t\tconst seconds = Number(retryAfter);\n\t\tconst delay = Number.isFinite(seconds) ? seconds * 1_000 : Date.parse(retryAfter) - Date.now();\n\t\tif (Number.isFinite(delay)) {\n\t\t\tconst bounded = Math.max(0, delay);\n\t\t\treturn bounded <= MAX_RETRY_DELAY_MS ? bounded : undefined;\n\t\t}\n\t}\n\treturn 100 * 2 ** attempt;\n}\n\nfunction errorDetails(response: Response, payload: NodeErrorPayload): { code?: string; message: string } {\n\tconst error = payload.error;\n\tconst code = typeof error?.code === \"string\" ? error.code : undefined;\n\tconst type = typeof error?.type === \"string\" ? error.type : undefined;\n\tconst detail = typeof error?.message === \"string\" ? error.message : undefined;\n\tconst retryAfter = response.headers.get(\"retry-after\");\n\tconst requestId = response.headers.get(\"x-request-id\");\n\treturn {\n\t\tcode,\n\t\tmessage: [\n\t\t\t`HUMAIN Node model discovery failed: ${response.status}`,\n\t\t\tcode && `code=${code}`,\n\t\t\ttype && `type=${type}`,\n\t\t\tdetail,\n\t\t\tretryAfter && `Retry-After: ${retryAfter}`,\n\t\t\trequestId && `X-Request-ID: ${requestId}`,\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"; \"),\n\t};\n}\n\nasync function fetchModelsUnredacted(baseUrl: string, apiKey: string, signal: AbortSignal): Promise<Model<Api>[]> {\n\tfor (let attempt = 0; ; attempt++) {\n\t\tsignal.throwIfAborted();\n\t\tconst attemptSignal = AbortSignal.any([signal, AbortSignal.timeout(REQUEST_TIMEOUT_MS)]);\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await fetch(new URL(`${baseUrl}/models`), {\n\t\t\t\tsignal: attemptSignal,\n\t\t\t\tredirect: \"error\",\n\t\t\t\theaders: { Accept: \"application/json\", Authorization: `Bearer ${apiKey}` },\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (signal.aborted || attempt >= MAX_RETRIES) throw error;\n\t\t\tawait delay(100 * 2 ** attempt, undefined, { signal });\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst payload: unknown = await response.json().catch(() => ({}));\n\t\tif (!response.ok) {\n\t\t\tconst details = errorDetails(\n\t\t\t\tresponse,\n\t\t\t\ttypeof payload === \"object\" && payload !== null ? (payload as NodeErrorPayload) : {},\n\t\t\t);\n\t\t\tconst retryMs = retryDelay(response, attempt);\n\t\t\tif (\n\t\t\t\tattempt < MAX_RETRIES &&\n\t\t\t\tRETRYABLE_STATUS_CODES.has(response.status) &&\n\t\t\t\t!PERMANENT_LIMIT_CODES.has(details.code ?? \"\") &&\n\t\t\t\tretryMs !== undefined\n\t\t\t) {\n\t\t\t\tawait delay(retryMs, undefined, { signal });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthrow new Error(details.message);\n\t\t}\n\t\tif (typeof payload !== \"object\" || payload === null) {\n\t\t\tthrow new Error(\"HUMAIN Node returned a malformed model catalog\");\n\t\t}\n\t\tconst entries =\n\t\t\t\"data\" in payload && Array.isArray(payload.data)\n\t\t\t\t? payload.data\n\t\t\t\t: \"items\" in payload && Array.isArray(payload.items)\n\t\t\t\t\t? payload.items\n\t\t\t\t\t: undefined;\n\t\tif (!entries) throw new Error(\"HUMAIN Node returned a malformed model catalog\");\n\t\tconst ids = new Set<string>();\n\t\tfor (const entry of entries) {\n\t\t\tif (typeof entry !== \"object\" || entry === null || !(\"id\" in entry) || typeof entry.id !== \"string\") continue;\n\t\t\tconst id = entry.id.trim();\n\t\t\tif (ids.has(id)) throw new Error(`HUMAIN Node returned duplicate model id \"${id}\"`);\n\t\t\tids.add(id);\n\t\t}\n\t\treturn entries.flatMap((entry) => toModel(entry, baseUrl) ?? []);\n\t}\n}\n\nasync function fetchModels(baseUrl: string, apiKey: string, signal: AbortSignal): Promise<Model<Api>[]> {\n\ttry {\n\t\treturn await fetchModelsUnredacted(baseUrl, apiKey, signal);\n\t} catch (error) {\n\t\tif (signal.aborted) throw signal.reason;\n\t\tconst message = (error instanceof Error ? error.message : String(error)).replaceAll(apiKey, \"[redacted]\");\n\t\tconst redacted = new Error(message);\n\t\tif (error instanceof Error) redacted.name = error.name;\n\t\tthrow redacted;\n\t}\n}\n\nexport function createHumainNodeProvider(env: NodeJS.ProcessEnv = process.env): Provider {\n\tlet models: readonly Model<Api>[] = [];\n\tlet activeScope: string | undefined;\n\tconst apiKeyAuth: ApiKeyAuth = {\n\t\tname: \"HUMAIN Node API key\",\n\t\tlogin: async (interaction) => {\n\t\t\tif (!env[API_KEY_ENV]?.trim()) {\n\t\t\t\tinteraction.notify({\n\t\t\t\t\ttype: \"info\",\n\t\t\t\t\tmessage: \"Create a HUMAIN Node API key in Node Users, then paste it below.\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst enteredKey = (\n\t\t\t\tawait interaction.prompt({\n\t\t\t\t\ttype: \"secret\",\n\t\t\t\t\tmessage: \"Enter HUMAIN Node API key (leave blank to use HUMAIN_NODE_API_KEY)\",\n\t\t\t\t})\n\t\t\t).trim();\n\t\t\tconst key = enteredKey || env[API_KEY_ENV]?.trim();\n\t\t\tif (!key) throw new Error(\"HUMAIN Node API key is required\");\n\t\t\tconst enteredUrl = await interaction.prompt({\n\t\t\t\ttype: \"text\",\n\t\t\t\tmessage: \"HUMAIN Node base URL\",\n\t\t\t\tplaceholder: env[BASE_URL_ENV] ?? DEFAULT_BASE_URL,\n\t\t\t});\n\t\t\tconst baseUrl = normalizeBaseUrl(enteredUrl.trim() || env[BASE_URL_ENV] || DEFAULT_BASE_URL);\n\t\t\tawait fetchModels(baseUrl, key, interaction.signal);\n\t\t\treturn {\n\t\t\t\ttype: \"api_key\" as const,\n\t\t\t\tkey: enteredKey.replaceAll(\"$\", () => \"$$\").replace(/^!/u, () => \"$!\") || undefined,\n\t\t\t\tenv: { [BASE_URL_ENV]: baseUrl },\n\t\t\t};\n\t\t},\n\t\tcheck: async ({ ctx, credential, signal }) => {\n\t\t\tsignal.throwIfAborted();\n\t\t\tconst key = credential?.key ?? (await ctx.env(API_KEY_ENV));\n\t\t\treturn key\n\t\t\t\t? { type: \"api_key\" as const, source: credential?.key ? \"stored credential\" : API_KEY_ENV }\n\t\t\t\t: undefined;\n\t\t},\n\t\tresolve: async ({ ctx, credential, signal }): Promise<AuthResult | undefined> => {\n\t\t\tsignal.throwIfAborted();\n\t\t\tconst key = credential?.key ?? (await ctx.env(API_KEY_ENV));\n\t\t\tif (!key) return undefined;\n\t\t\tconst baseUrl = await resolveBaseUrl(ctx, credential);\n\t\t\treturn {\n\t\t\t\tauth: { apiKey: key, baseUrl },\n\t\t\t\tenv: { ...credential?.env, [BASE_URL_ENV]: baseUrl },\n\t\t\t\tsource: credential?.key ? \"stored credential\" : API_KEY_ENV,\n\t\t\t};\n\t\t},\n\t};\n\tconst base = createProvider({\n\t\tid: HUMAIN_NODE_PROVIDER,\n\t\tname: \"HUMAIN Node\",\n\t\tbaseUrl: DEFAULT_BASE_URL,\n\t\tauth: { apiKey: apiKeyAuth },\n\t\tmodels: [],\n\t\tapi: {\n\t\t\t\"anthropic-messages\": withHumainNodeHttp(anthropicMessagesApi()),\n\t\t\t\"openai-completions\": withHumainNodeHttp(openAICompletionsApi()),\n\t\t\t\"openai-responses\": withHumainNodeHttp(openAIResponsesApi()),\n\t\t},\n\t});\n\treturn {\n\t\t...base,\n\t\tgetModels: () => models,\n\t\trefreshModels: async (context: RefreshModelsContext) => {\n\t\t\tconst credential = context.credential?.type === \"api_key\" ? context.credential : undefined;\n\t\t\tconst key = credential?.key;\n\t\t\tconst baseUrl = credential ? (credentialBaseUrl(credential) ?? DEFAULT_BASE_URL) : undefined;\n\t\t\tconst scope = key && baseUrl ? `${baseUrl}\\0${key}` : undefined;\n\t\t\tif (scope !== activeScope) {\n\t\t\t\tif (\n\t\t\t\t\t!(await context.publish({\n\t\t\t\t\t\tpersist: null,\n\t\t\t\t\t\tupdate: () => {\n\t\t\t\t\t\t\tmodels = [];\n\t\t\t\t\t\t\tactiveScope = scope;\n\t\t\t\t\t\t},\n\t\t\t\t\t}))\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!context.allowNetwork || context.signal.aborted || !key || !baseUrl) return;\n\t\t\tconst refreshed = await fetchModels(baseUrl, key, context.signal);\n\t\t\tif (context.signal.aborted) return;\n\t\t\tawait context.publish({\n\t\t\t\tpersist: null,\n\t\t\t\tupdate: () => {\n\t\t\t\t\tmodels = refreshed;\n\t\t\t\t\tactiveScope = scope;\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"curator-page.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/curator-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AA4D/D,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,oBAAoB,EACxC,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACtD,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAChC,MAAM,CAyIR"}
1
+ {"version":3,"file":"curator-page.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/curator-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AA6D/D,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,oBAAoB,EACxC,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EACtD,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAChC,MAAM,CAyIR"}
@@ -33,6 +33,7 @@ function buildProviderButtons(available, selected, hasInitialQueries) {
33
33
  { value: "anysearch", label: "AnySearch", available: available.anysearch },
34
34
  { value: "xcrawl", label: "XCrawl", available: available.xcrawl },
35
35
  { value: "xai", label: "xAI", available: available.xai },
36
+ { value: "mistral", label: "Mistral", available: available.mistral },
36
37
  { value: "brightdata", label: "Bright Data", available: available.brightdata },
37
38
  { value: "serpbase", label: "SerpBase", available: available.serpbase },
38
39
  { value: "serper", label: "Serper", available: available.serper },
@@ -1447,7 +1448,7 @@ const SCRIPT = `(function() {
1447
1448
  var token = DATA.sessionToken;
1448
1449
  var timeoutSec = DATA.timeout;
1449
1450
  var queries = Array.isArray(DATA.queries) ? DATA.queries : [];
1450
- var providers = ["all", "openai", "exa", "brave", "parallel", "parallel-mcp", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "firecrawl", "jina", "serpdive", "kagi", "bocha", "ollama", "searxng", "duckduckgo", "perplexity", "gemini", "kimi", "anysearch", "xcrawl", "xai", "brightdata", "serpbase", "serper", "valyu"];
1451
+ var providers = ["all", "openai", "exa", "brave", "parallel", "parallel-mcp", "tinyfish", "search1api", "searchinfinity", "querit", "tavily", "firecrawl", "jina", "serpdive", "kagi", "bocha", "ollama", "searxng", "duckduckgo", "perplexity", "gemini", "kimi", "anysearch", "xcrawl", "xai", "mistral", "brightdata", "serpbase", "serper", "valyu"];
1451
1452
  var availProviders = DATA.availableProviders && typeof DATA.availableProviders === "object" ? DATA.availableProviders : {};
1452
1453
  var workflow = "summary-review";
1453
1454
  var initialDefaultProvider = typeof DATA.defaultProvider === "string" ? DATA.defaultProvider : "exa";
@@ -1674,6 +1675,7 @@ const SCRIPT = `(function() {
1674
1675
  if (provider === "anysearch") return "AnySearch";
1675
1676
  if (provider === "xcrawl") return "XCrawl";
1676
1677
  if (provider === "xai") return "xAI";
1678
+ if (provider === "mistral") return "Mistral";
1677
1679
  if (provider === "brightdata") return "Bright Data";
1678
1680
  if (provider === "serpbase") return "SerpBase";
1679
1681
  return "Unknown";