@pentoshi/clai 4.18.0 → 4.19.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 (403) hide show
  1. package/CONTRIBUTING.md +3 -2
  2. package/PROVIDERS.md +1 -1
  3. package/README.md +108 -267
  4. package/SECURITY.md +5 -1
  5. package/dist/agent/compaction-summary.d.ts +1 -1
  6. package/dist/agent/compaction-summary.js +4 -4
  7. package/dist/agent/compaction-summary.js.map +1 -1
  8. package/dist/agent/context/compaction-user-instructions.js +1 -1
  9. package/dist/agent/context/compaction-user-instructions.js.map +1 -1
  10. package/dist/agent/durable-envelope.js +1 -1
  11. package/dist/agent/durable-envelope.js.map +1 -1
  12. package/dist/agent/turn/tool-execution/result-framing.js +8 -6
  13. package/dist/agent/turn/tool-execution/result-framing.js.map +1 -1
  14. package/dist/app/adapters/current-store-adapter.js +7 -3
  15. package/dist/app/adapters/current-store-adapter.js.map +1 -1
  16. package/dist/app/commands/catalog.js +4 -0
  17. package/dist/app/commands/catalog.js.map +1 -1
  18. package/dist/app/commands/registry.js +1 -1
  19. package/dist/app/commands/registry.js.map +1 -1
  20. package/dist/app/controllers/session-changes.d.ts +5 -0
  21. package/dist/app/controllers/session-changes.js +50 -20
  22. package/dist/app/controllers/session-changes.js.map +1 -1
  23. package/dist/app/controllers/session-controller.d.ts +8 -0
  24. package/dist/app/controllers/session-controller.js +64 -6
  25. package/dist/app/controllers/session-controller.js.map +1 -1
  26. package/dist/app/controllers/session-id.d.ts +1 -0
  27. package/dist/app/controllers/session-id.js +4 -0
  28. package/dist/app/controllers/session-id.js.map +1 -0
  29. package/dist/app/controllers/session-late-work.d.ts +27 -0
  30. package/dist/app/controllers/session-late-work.js +113 -0
  31. package/dist/app/controllers/session-late-work.js.map +1 -0
  32. package/dist/app/controllers/session-persistence.d.ts +5 -3
  33. package/dist/app/controllers/session-persistence.js +8 -5
  34. package/dist/app/controllers/session-persistence.js.map +1 -1
  35. package/dist/app/ports/persistence-port.d.ts +6 -1
  36. package/dist/classic/app/app-wiring.d.ts +4 -2
  37. package/dist/classic/app/app-wiring.js +6 -2
  38. package/dist/classic/app/app-wiring.js.map +1 -1
  39. package/dist/classic/app/use-feed.js +9 -2
  40. package/dist/classic/app/use-feed.js.map +1 -1
  41. package/dist/classic/app/wiring-interactions.d.ts +3 -2
  42. package/dist/classic/app/wiring-interactions.js +15 -7
  43. package/dist/classic/app/wiring-interactions.js.map +1 -1
  44. package/dist/classic/app/wiring-lifecycle.js +9 -1
  45. package/dist/classic/app/wiring-lifecycle.js.map +1 -1
  46. package/dist/classic/app/wiring-types.d.ts +4 -1
  47. package/dist/classic/bootstrap/renderer-handle.js +11 -3
  48. package/dist/classic/bootstrap/renderer-handle.js.map +1 -1
  49. package/dist/classic/bootstrap/start-classic.js +4 -17
  50. package/dist/classic/bootstrap/start-classic.js.map +1 -1
  51. package/dist/classic/feed/background-layout.d.ts +26 -0
  52. package/dist/classic/feed/background-layout.js +77 -0
  53. package/dist/classic/feed/background-layout.js.map +1 -0
  54. package/dist/classic/feed/estimated-height.d.ts +2 -0
  55. package/dist/classic/feed/estimated-height.js +24 -0
  56. package/dist/classic/feed/estimated-height.js.map +1 -0
  57. package/dist/classic/feed/feed-blocks.d.ts +4 -1
  58. package/dist/classic/feed/feed-blocks.js +26 -6
  59. package/dist/classic/feed/feed-blocks.js.map +1 -1
  60. package/dist/classic/feed/transcript-window.d.ts +1 -0
  61. package/dist/classic/feed/transcript-window.js +41 -15
  62. package/dist/classic/feed/transcript-window.js.map +1 -1
  63. package/dist/classic/panels/pager-panel.d.ts +11 -8
  64. package/dist/classic/panels/pager-panel.js +42 -28
  65. package/dist/classic/panels/pager-panel.js.map +1 -1
  66. package/dist/classic/panels/pager-region-paint.d.ts +3 -0
  67. package/dist/classic/panels/pager-region-paint.js +43 -0
  68. package/dist/classic/panels/pager-region-paint.js.map +1 -0
  69. package/dist/classic/panels/pager-search-paint.d.ts +3 -0
  70. package/dist/classic/panels/pager-search-paint.js +59 -0
  71. package/dist/classic/panels/pager-search-paint.js.map +1 -0
  72. package/dist/classic/panels/pager-source-controller.js +2 -0
  73. package/dist/classic/panels/pager-source-controller.js.map +1 -1
  74. package/dist/classic/panels/panel-controller.js +5 -6
  75. package/dist/classic/panels/panel-controller.js.map +1 -1
  76. package/dist/classic/panels/panel-host.js +2 -2
  77. package/dist/classic/panels/panel-host.js.map +1 -1
  78. package/dist/classic/panels/panel-initial-states.d.ts +1 -0
  79. package/dist/classic/panels/panel-initial-states.js +1 -0
  80. package/dist/classic/panels/panel-initial-states.js.map +1 -1
  81. package/dist/classic/panels/panel-types.d.ts +1 -0
  82. package/dist/classic/panels/panel-wheel.js +2 -2
  83. package/dist/classic/panels/panel-wheel.js.map +1 -1
  84. package/dist/classic/panels/text-editor-panel.d.ts +2 -1
  85. package/dist/classic/panels/text-editor-panel.js +21 -12
  86. package/dist/classic/panels/text-editor-panel.js.map +1 -1
  87. package/dist/classic/render/ansi-text.js +49 -33
  88. package/dist/classic/render/ansi-text.js.map +1 -1
  89. package/dist/classic/render/ink-theme.js +1 -1
  90. package/dist/classic/render/ink-theme.js.map +1 -1
  91. package/dist/classic/render/measure.js +2 -3
  92. package/dist/classic/render/measure.js.map +1 -1
  93. package/dist/commands/current-version.d.ts +1 -0
  94. package/dist/commands/current-version.js +42 -0
  95. package/dist/commands/current-version.js.map +1 -0
  96. package/dist/commands/update.d.ts +2 -1
  97. package/dist/commands/update.js +4 -41
  98. package/dist/commands/update.js.map +1 -1
  99. package/dist/index.d.ts +1 -1
  100. package/dist/index.js +21 -12
  101. package/dist/index.js.map +1 -1
  102. package/dist/llm/capabilities.js +13 -6
  103. package/dist/llm/capabilities.js.map +1 -1
  104. package/dist/llm/capability/vision-patterns.js +1 -1
  105. package/dist/llm/capability/vision-patterns.js.map +1 -1
  106. package/dist/llm/freebuff-agent-prompt.d.ts +1 -0
  107. package/dist/llm/freebuff-agent-prompt.js +46 -0
  108. package/dist/llm/freebuff-agent-prompt.js.map +1 -0
  109. package/dist/llm/freebuff-auth.js +15 -3
  110. package/dist/llm/freebuff-auth.js.map +1 -1
  111. package/dist/llm/freebuff-device-key.d.ts +39 -0
  112. package/dist/llm/freebuff-device-key.js +330 -0
  113. package/dist/llm/freebuff-device-key.js.map +1 -0
  114. package/dist/llm/freebuff-env-profile.d.ts +41 -0
  115. package/dist/llm/freebuff-env-profile.js +205 -0
  116. package/dist/llm/freebuff-env-profile.js.map +1 -0
  117. package/dist/llm/freebuff-fingerprint.d.ts +21 -0
  118. package/dist/llm/freebuff-fingerprint.js +137 -0
  119. package/dist/llm/freebuff-fingerprint.js.map +1 -0
  120. package/dist/llm/freebuff-models.d.ts +26 -5
  121. package/dist/llm/freebuff-models.js +137 -80
  122. package/dist/llm/freebuff-models.js.map +1 -1
  123. package/dist/llm/freebuff-run.d.ts +2 -0
  124. package/dist/llm/freebuff-run.js +77 -24
  125. package/dist/llm/freebuff-run.js.map +1 -1
  126. package/dist/llm/freebuff-session-api.d.ts +3 -1
  127. package/dist/llm/freebuff-session-api.js +26 -18
  128. package/dist/llm/freebuff-session-api.js.map +1 -1
  129. package/dist/llm/freebuff-session.d.ts +7 -1
  130. package/dist/llm/freebuff-session.js +81 -31
  131. package/dist/llm/freebuff-session.js.map +1 -1
  132. package/dist/llm/freebuff-wire.d.ts +8 -0
  133. package/dist/llm/freebuff-wire.js +42 -20
  134. package/dist/llm/freebuff-wire.js.map +1 -1
  135. package/dist/llm/freebuff.js +79 -9
  136. package/dist/llm/freebuff.js.map +1 -1
  137. package/dist/llm/main-effort-discovery.d.ts +16 -0
  138. package/dist/llm/main-effort-discovery.js +71 -0
  139. package/dist/llm/main-effort-discovery.js.map +1 -0
  140. package/dist/llm/omnirush-session-upload.d.ts +1 -0
  141. package/dist/llm/omnirush-session-upload.js +14 -1
  142. package/dist/llm/omnirush-session-upload.js.map +1 -1
  143. package/dist/llm/provider-profiles.js +28 -2
  144. package/dist/llm/provider-profiles.js.map +1 -1
  145. package/dist/llm/provider.js +2 -1
  146. package/dist/llm/provider.js.map +1 -1
  147. package/dist/llm/request-plan.js +13 -7
  148. package/dist/llm/request-plan.js.map +1 -1
  149. package/dist/llm/responses-request.js +8 -1
  150. package/dist/llm/responses-request.js.map +1 -1
  151. package/dist/llm/river-models.js +3 -1
  152. package/dist/llm/river-models.js.map +1 -1
  153. package/dist/llm/routing/attempt-complete.js +6 -1
  154. package/dist/llm/routing/attempt-complete.js.map +1 -1
  155. package/dist/llm/routing/attempt-request.d.ts +3 -1
  156. package/dist/llm/routing/attempt-request.js +39 -5
  157. package/dist/llm/routing/attempt-request.js.map +1 -1
  158. package/dist/llm/routing/attempt-stream.js +8 -1
  159. package/dist/llm/routing/attempt-stream.js.map +1 -1
  160. package/dist/llm/routing/error-classification.d.ts +1 -0
  161. package/dist/llm/routing/error-classification.js +9 -1
  162. package/dist/llm/routing/error-classification.js.map +1 -1
  163. package/dist/llm/wire/effort-preflight.d.ts +4 -1
  164. package/dist/llm/wire/effort-preflight.js +49 -6
  165. package/dist/llm/wire/effort-preflight.js.map +1 -1
  166. package/dist/llm/wire/openai-complete.d.ts +1 -0
  167. package/dist/llm/wire/openai-complete.js +5 -1
  168. package/dist/llm/wire/openai-complete.js.map +1 -1
  169. package/dist/llm/wire/openai-stream.d.ts +1 -0
  170. package/dist/llm/wire/openai-stream.js +1 -0
  171. package/dist/llm/wire/openai-stream.js.map +1 -1
  172. package/dist/llm/wire/responses-first.js +3 -0
  173. package/dist/llm/wire/responses-first.js.map +1 -1
  174. package/dist/os/ownership-repair.d.ts +5 -0
  175. package/dist/os/ownership-repair.js +62 -0
  176. package/dist/os/ownership-repair.js.map +1 -0
  177. package/dist/os/permissions.d.ts +7 -0
  178. package/dist/os/permissions.js +27 -22
  179. package/dist/os/permissions.js.map +1 -1
  180. package/dist/os/settle-within.d.ts +1 -0
  181. package/dist/os/settle-within.js +12 -0
  182. package/dist/os/settle-within.js.map +1 -0
  183. package/dist/os/user-environment.d.ts +1 -0
  184. package/dist/os/user-environment.js +3 -0
  185. package/dist/os/user-environment.js.map +1 -0
  186. package/dist/os/user-identity.d.ts +11 -0
  187. package/dist/os/user-identity.js +163 -0
  188. package/dist/os/user-identity.js.map +1 -0
  189. package/dist/safety/tool-classification.js +6 -0
  190. package/dist/safety/tool-classification.js.map +1 -1
  191. package/dist/security/known-secrets.d.ts +5 -0
  192. package/dist/security/known-secrets.js +50 -0
  193. package/dist/security/known-secrets.js.map +1 -0
  194. package/dist/session-runtime/client.d.ts +1 -1
  195. package/dist/session-runtime/client.js +6 -3
  196. package/dist/session-runtime/client.js.map +1 -1
  197. package/dist/session-runtime/host.js +2 -0
  198. package/dist/session-runtime/host.js.map +1 -1
  199. package/dist/session-runtime/paths.js +14 -6
  200. package/dist/session-runtime/paths.js.map +1 -1
  201. package/dist/session-runtime/start-runtime.js +5 -8
  202. package/dist/session-runtime/start-runtime.js.map +1 -1
  203. package/dist/session-runtime/store.js +4 -1
  204. package/dist/session-runtime/store.js.map +1 -1
  205. package/dist/store/config/endpoints.js +3 -1
  206. package/dist/store/config/endpoints.js.map +1 -1
  207. package/dist/store/credentials/crypto.d.ts +7 -0
  208. package/dist/store/credentials/crypto.js +118 -0
  209. package/dist/store/credentials/crypto.js.map +1 -0
  210. package/dist/store/credentials.d.ts +21 -0
  211. package/dist/store/credentials.js +150 -0
  212. package/dist/store/credentials.js.map +1 -0
  213. package/dist/store/history/freshness.d.ts +2 -0
  214. package/dist/store/history/freshness.js +3 -2
  215. package/dist/store/history/freshness.js.map +1 -1
  216. package/dist/store/history/jsonl-backend.js +20 -6
  217. package/dist/store/history/jsonl-backend.js.map +1 -1
  218. package/dist/store/history/jsonl-lock.d.ts +1 -0
  219. package/dist/store/history/jsonl-lock.js +94 -71
  220. package/dist/store/history/jsonl-lock.js.map +1 -1
  221. package/dist/store/history/recovery.d.ts +2 -0
  222. package/dist/store/history/recovery.js.map +1 -1
  223. package/dist/store/history/session-queries.js +0 -3
  224. package/dist/store/history/session-queries.js.map +1 -1
  225. package/dist/store/history/sqlite-backend.js +2 -0
  226. package/dist/store/history/sqlite-backend.js.map +1 -1
  227. package/dist/store/history/transcript-merge.d.ts +2 -0
  228. package/dist/store/history/transcript-merge.js +46 -0
  229. package/dist/store/history/transcript-merge.js.map +1 -0
  230. package/dist/store/history-index.d.ts +2 -0
  231. package/dist/store/history-index.js +3 -2
  232. package/dist/store/history-index.js.map +1 -1
  233. package/dist/store/history.d.ts +2 -1
  234. package/dist/store/history.js +43 -11
  235. package/dist/store/history.js.map +1 -1
  236. package/dist/store/keys/secret-store.js +5 -2
  237. package/dist/store/keys/secret-store.js.map +1 -1
  238. package/dist/store/legacy-location.d.ts +1 -0
  239. package/dist/store/legacy-location.js +37 -0
  240. package/dist/store/legacy-location.js.map +1 -0
  241. package/dist/store/ownership.d.ts +3 -0
  242. package/dist/store/ownership.js +23 -0
  243. package/dist/store/ownership.js.map +1 -0
  244. package/dist/store/paths.js +3 -2
  245. package/dist/store/paths.js.map +1 -1
  246. package/dist/store/redaction-cache.d.ts +0 -5
  247. package/dist/store/redaction-cache.js +6 -5
  248. package/dist/store/redaction-cache.js.map +1 -1
  249. package/dist/store/scope.js +7 -2
  250. package/dist/store/scope.js.map +1 -1
  251. package/dist/store/session-prompts.d.ts +1 -0
  252. package/dist/store/session-prompts.js +34 -13
  253. package/dist/store/session-prompts.js.map +1 -1
  254. package/dist/store/session-workspace.js +3 -0
  255. package/dist/store/session-workspace.js.map +1 -1
  256. package/dist/tools/credentials.d.ts +2 -0
  257. package/dist/tools/credentials.js +27 -0
  258. package/dist/tools/credentials.js.map +1 -0
  259. package/dist/tools/definitions/aggregate.js +2 -0
  260. package/dist/tools/definitions/aggregate.js.map +1 -1
  261. package/dist/tools/definitions/credentials.d.ts +1 -0
  262. package/dist/tools/definitions/credentials.js +15 -0
  263. package/dist/tools/definitions/credentials.js.map +1 -0
  264. package/dist/tools/definitions/fs-read.js +3 -2
  265. package/dist/tools/definitions/fs-read.js.map +1 -1
  266. package/dist/tools/definitions/terminal.js +2 -1
  267. package/dist/tools/definitions/terminal.js.map +1 -1
  268. package/dist/tools/elevated-shell.js +11 -14
  269. package/dist/tools/elevated-shell.js.map +1 -1
  270. package/dist/tools/interactive-session-tools.js +20 -4
  271. package/dist/tools/interactive-session-tools.js.map +1 -1
  272. package/dist/tools/registry.js +2 -0
  273. package/dist/tools/registry.js.map +1 -1
  274. package/dist/tools/sudo-session.d.ts +2 -1
  275. package/dist/tools/sudo-session.js +26 -9
  276. package/dist/tools/sudo-session.js.map +1 -1
  277. package/dist/tui-v2/app/App.js +9 -9
  278. package/dist/tui-v2/app/App.js.map +1 -1
  279. package/dist/tui-v2/app/layout-widths.js +4 -4
  280. package/dist/tui-v2/app/layout-widths.js.map +1 -1
  281. package/dist/tui-v2/bootstrap/renderer-handle.d.ts +2 -0
  282. package/dist/tui-v2/bootstrap/renderer-handle.js +21 -10
  283. package/dist/tui-v2/bootstrap/renderer-handle.js.map +1 -1
  284. package/dist/tui-v2/bootstrap/start-tui-v2.js +13 -28
  285. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  286. package/dist/tui-v2/components/modal/text-editor-modal.js +4 -0
  287. package/dist/tui-v2/components/modal/text-editor-modal.js.map +1 -1
  288. package/dist/tui-v2/components/overlay/overlay-host.js +1 -2
  289. package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
  290. package/dist/tui-v2/components/pager/pager-line.d.ts +1 -0
  291. package/dist/tui-v2/components/pager/pager-line.js +46 -27
  292. package/dist/tui-v2/components/pager/pager-line.js.map +1 -1
  293. package/dist/tui-v2/components/pager/pager-rows.d.ts +3 -0
  294. package/dist/tui-v2/components/pager/pager-rows.js +18 -1
  295. package/dist/tui-v2/components/pager/pager-rows.js.map +1 -1
  296. package/dist/tui-v2/components/pager/pager.d.ts +2 -0
  297. package/dist/tui-v2/components/pager/pager.js +10 -6
  298. package/dist/tui-v2/components/pager/pager.js.map +1 -1
  299. package/dist/tui-v2/components/plan/plan-view.js +5 -3
  300. package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
  301. package/dist/tui-v2/components/toast/toast-anim.d.ts +6 -0
  302. package/dist/tui-v2/components/toast/toast-anim.js +17 -0
  303. package/dist/tui-v2/components/toast/toast-anim.js.map +1 -1
  304. package/dist/tui-v2/components/toast/toast-host.js +15 -5
  305. package/dist/tui-v2/components/toast/toast-host.js.map +1 -1
  306. package/dist/tui-v2/components/transcript/tool-card.js +5 -2
  307. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  308. package/dist/tui-v2/components/transcript/transcript-anchor.d.ts +20 -0
  309. package/dist/tui-v2/components/transcript/transcript-anchor.js +43 -0
  310. package/dist/tui-v2/components/transcript/transcript-anchor.js.map +1 -0
  311. package/dist/tui-v2/components/transcript/transcript-view.js +27 -40
  312. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
  313. package/dist/tui-v2/components/transcript/user-message.js +31 -21
  314. package/dist/tui-v2/components/transcript/user-message.js.map +1 -1
  315. package/dist/tui-v2/rendering/pager-markdown.d.ts +3 -2
  316. package/dist/tui-v2/rendering/pager-markdown.js +15 -11
  317. package/dist/tui-v2/rendering/pager-markdown.js.map +1 -1
  318. package/dist/types.d.ts +1 -0
  319. package/dist/ui-core/bootstrap/composition-root.js +23 -0
  320. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  321. package/dist/ui-core/bootstrap/lifecycle.d.ts +1 -0
  322. package/dist/ui-core/bootstrap/lifecycle.js +6 -0
  323. package/dist/ui-core/bootstrap/lifecycle.js.map +1 -1
  324. package/dist/ui-core/bootstrap/resume-option.d.ts +11 -0
  325. package/dist/ui-core/bootstrap/resume-option.js +9 -0
  326. package/dist/ui-core/bootstrap/resume-option.js.map +1 -0
  327. package/dist/ui-core/bootstrap/session-merge.d.ts +4 -0
  328. package/dist/ui-core/bootstrap/session-merge.js +19 -0
  329. package/dist/ui-core/bootstrap/session-merge.js.map +1 -0
  330. package/dist/ui-core/bootstrap/session-resume.d.ts +2 -11
  331. package/dist/ui-core/bootstrap/session-resume.js +2 -8
  332. package/dist/ui-core/bootstrap/session-resume.js.map +1 -1
  333. package/dist/ui-core/bootstrap/shutdown-services.d.ts +3 -0
  334. package/dist/ui-core/bootstrap/shutdown-services.js +24 -0
  335. package/dist/ui-core/bootstrap/shutdown-services.js.map +1 -0
  336. package/dist/ui-core/commands/change-commands.js +53 -15
  337. package/dist/ui-core/commands/change-commands.js.map +1 -1
  338. package/dist/ui-core/commands/command-handlers.js +2 -0
  339. package/dist/ui-core/commands/command-handlers.js.map +1 -1
  340. package/dist/ui-core/commands/credential-commands.d.ts +7 -0
  341. package/dist/ui-core/commands/credential-commands.js +114 -0
  342. package/dist/ui-core/commands/credential-commands.js.map +1 -0
  343. package/dist/ui-core/commands/pickers/search-reasoning.js +14 -4
  344. package/dist/ui-core/commands/pickers/search-reasoning.js.map +1 -1
  345. package/dist/ui-core/controllers/overlay-controller.d.ts +4 -1
  346. package/dist/ui-core/controllers/overlay-controller.js +3 -2
  347. package/dist/ui-core/controllers/overlay-controller.js.map +1 -1
  348. package/dist/ui-core/layout/compute-layout.d.ts +3 -1
  349. package/dist/ui-core/layout/compute-layout.js +4 -2
  350. package/dist/ui-core/layout/compute-layout.js.map +1 -1
  351. package/dist/{classic/render/palette.js → ui-core/rendering/ansi-palette.js} +1 -1
  352. package/dist/ui-core/rendering/ansi-palette.js.map +1 -0
  353. package/dist/ui-core/rendering/artifact-pager-source.d.ts +1 -0
  354. package/dist/ui-core/rendering/artifact-pager-source.js.map +1 -1
  355. package/dist/ui-core/rendering/markdown-diff-rows.d.ts +12 -0
  356. package/dist/ui-core/rendering/markdown-diff-rows.js +85 -0
  357. package/dist/ui-core/rendering/markdown-diff-rows.js.map +1 -0
  358. package/dist/ui-core/rendering/markdown.d.ts +1 -0
  359. package/dist/ui-core/rendering/markdown.js +12 -0
  360. package/dist/ui-core/rendering/markdown.js.map +1 -1
  361. package/dist/ui-core/rendering/open-tool-output.js +40 -14
  362. package/dist/ui-core/rendering/open-tool-output.js.map +1 -1
  363. package/dist/ui-core/rendering/pager-regions.d.ts +7 -0
  364. package/dist/ui-core/rendering/pager-regions.js +8 -0
  365. package/dist/ui-core/rendering/pager-regions.js.map +1 -0
  366. package/dist/ui-core/rendering/plan-view.js +5 -5
  367. package/dist/ui-core/rendering/plan-view.js.map +1 -1
  368. package/dist/ui-core/rendering/render-markdown-lines.d.ts +1 -0
  369. package/dist/ui-core/rendering/render-markdown-lines.js +5 -2
  370. package/dist/ui-core/rendering/render-markdown-lines.js.map +1 -1
  371. package/dist/ui-core/rendering/session-change-diff.d.ts +2 -0
  372. package/dist/ui-core/rendering/session-change-diff.js +85 -0
  373. package/dist/ui-core/rendering/session-change-diff.js.map +1 -0
  374. package/dist/ui-core/rendering/session-prompts-pager-source.js +1 -1
  375. package/dist/ui-core/rendering/session-prompts-pager-source.js.map +1 -1
  376. package/dist/ui-core/rendering/task-disclosure.js +3 -3
  377. package/dist/ui-core/rendering/task-disclosure.js.map +1 -1
  378. package/dist/ui-core/rendering/text-width.d.ts +1 -0
  379. package/dist/ui-core/rendering/text-width.js +80 -4
  380. package/dist/ui-core/rendering/text-width.js.map +1 -1
  381. package/dist/ui-core/rendering/tool-presenter.d.ts +2 -0
  382. package/dist/ui-core/rendering/tool-presenter.js +53 -0
  383. package/dist/ui-core/rendering/tool-presenter.js.map +1 -1
  384. package/dist/ui-core/state/pager-search.d.ts +8 -0
  385. package/dist/ui-core/state/pager-search.js +20 -0
  386. package/dist/ui-core/state/pager-search.js.map +1 -1
  387. package/dist/ui-core/state/transcript-store.d.ts +2 -1
  388. package/dist/ui-core/state/transcript-store.js +35 -0
  389. package/dist/ui-core/state/transcript-store.js.map +1 -1
  390. package/dist/ui-core/state/transcript-window.d.ts +2 -2
  391. package/dist/ui-core/state/transcript-window.js +2 -2
  392. package/dist/ui-core/state/transcript-window.js.map +1 -1
  393. package/dist/version.generated.d.ts +2 -2
  394. package/dist/version.generated.js +2 -2
  395. package/package.json +1 -1
  396. package/dist/classic/render/palette.js.map +0 -1
  397. package/dist/tui-v2/components/modal/prompt-actions-modal.d.ts +0 -10
  398. package/dist/tui-v2/components/modal/prompt-actions-modal.js +0 -101
  399. package/dist/tui-v2/components/modal/prompt-actions-modal.js.map +0 -1
  400. package/dist/ui-core/rendering/prompt-preview.d.ts +0 -5
  401. package/dist/ui-core/rendering/prompt-preview.js +0 -27
  402. package/dist/ui-core/rendering/prompt-preview.js.map +0 -1
  403. /package/dist/{classic/render/palette.d.ts → ui-core/rendering/ansi-palette.d.ts} +0 -0
@@ -0,0 +1,137 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { arch as osArch, cpus as osCpus, hostname as osHostname, networkInterfaces as osNetworkInterfaces, platform as osPlatform, } from "node:os";
4
+ import { join } from "node:path";
5
+ import { normalizeFreebuffProcessName } from "./freebuff-env-profile.js";
6
+ const DEFAULT_MACHINE_ID_PATHS = ["/etc/machine-id", "/var/lib/dbus/machine-id"];
7
+ const DEFAULT_DMI_DIR = "/sys/class/dmi/id";
8
+ const DEFAULT_CPUINFO_PATH = "/proc/cpuinfo";
9
+ const DEFAULT_OS_RELEASE_PATH = "/etc/os-release";
10
+ const ZERO_MAC = "00:00:00:00:00:00";
11
+ export function createLegacyFreebuffFingerprintId() {
12
+ return `codebuff-cli-${randomBytes(6).toString("base64url").substring(0, 8)}`;
13
+ }
14
+ function readTextDefault(path) {
15
+ try {
16
+ return readFileSync(path, "utf8");
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function machineIdOf(deps) {
23
+ const read = deps.readText ?? readTextDefault;
24
+ for (const path of deps.machineIdPaths ?? DEFAULT_MACHINE_ID_PATHS) {
25
+ const value = read(path)?.trim();
26
+ if (value && value !== "unknown" && value.length >= 8)
27
+ return value;
28
+ }
29
+ return null;
30
+ }
31
+ function dmiValue(deps, field) {
32
+ const read = deps.readText ?? readTextDefault;
33
+ return read(join(deps.dmiDir ?? DEFAULT_DMI_DIR, field))?.trim() ?? "";
34
+ }
35
+ function parseCpuInfo(text) {
36
+ let manufacturer = "";
37
+ let brand = "";
38
+ let physicalCores = 0;
39
+ for (const line of text.split("\n")) {
40
+ const separator = line.indexOf(":");
41
+ if (separator < 0)
42
+ continue;
43
+ const name = line.slice(0, separator).trim();
44
+ const value = line.slice(separator + 1).trim();
45
+ if (!value)
46
+ continue;
47
+ if (!manufacturer && (name === "vendor_id" || name === "CPU implementer"))
48
+ manufacturer = value;
49
+ if (!brand && (name === "model name" || name === "Processor" || name === "Hardware"))
50
+ brand = value;
51
+ if (!physicalCores && name === "cpu cores") {
52
+ const cores = Number(value);
53
+ if (Number.isSafeInteger(cores) && cores > 0)
54
+ physicalCores = cores;
55
+ }
56
+ }
57
+ return { manufacturer, brand, physicalCores };
58
+ }
59
+ function distroOf(deps) {
60
+ const read = deps.readText ?? readTextDefault;
61
+ const release = read(deps.osReleasePath ?? DEFAULT_OS_RELEASE_PATH);
62
+ if (!release)
63
+ return "";
64
+ const match = /^PRETTY_NAME=(.*)$/m.exec(release);
65
+ return match?.[1]?.trim().replace(/^"|"$/g, "") ?? "";
66
+ }
67
+ function networkSnapshot(deps) {
68
+ const interfaces = deps.networkInterfaces
69
+ ? deps.networkInterfaces()
70
+ : osNetworkInterfaces();
71
+ const macAddresses = Object.values(interfaces)
72
+ .flatMap((entries) => (entries ?? []).filter((entry) => entry && !entry.internal && entry.mac && entry.mac !== ZERO_MAC))
73
+ .map((entry) => entry.mac)
74
+ .sort();
75
+ return { macAddresses, interfaceCount: Object.keys(interfaces).length };
76
+ }
77
+ async function enhancedFreebuffFingerprintId(deps) {
78
+ try {
79
+ const machineId = machineIdOf(deps);
80
+ if (!machineId)
81
+ return null;
82
+ const env = deps.env ?? process.env;
83
+ const read = deps.readText ?? readTextDefault;
84
+ const cpu = parseCpuInfo(read(deps.cpuInfoPath ?? DEFAULT_CPUINFO_PATH) ?? "");
85
+ const platform = deps.platform ?? osPlatform();
86
+ const network = networkSnapshot(deps);
87
+ const profile = {
88
+ system: {
89
+ manufacturer: dmiValue(deps, "sys_vendor"),
90
+ model: dmiValue(deps, "product_name"),
91
+ serial: dmiValue(deps, "product_serial"),
92
+ uuid: dmiValue(deps, "product_uuid"),
93
+ },
94
+ cpu: {
95
+ manufacturer: cpu.manufacturer,
96
+ brand: cpu.brand,
97
+ cores: (deps.cpuCount ?? (() => osCpus().length))(),
98
+ physicalCores: cpu.physicalCores,
99
+ },
100
+ os: {
101
+ platform,
102
+ distro: distroOf(deps),
103
+ arch: deps.arch ?? osArch(),
104
+ hostname: (deps.hostname ?? osHostname)(),
105
+ },
106
+ runtime: {
107
+ nodeVersion: deps.nodeVersion ?? process.version,
108
+ platform,
109
+ arch: deps.arch ?? osArch(),
110
+ shell: normalizeFreebuffProcessName(env.SHELL),
111
+ cpuCount: (deps.cpuCount ?? (() => osCpus().length))(),
112
+ },
113
+ network,
114
+ machineId,
115
+ fingerprintVersion: "2.0",
116
+ };
117
+ const digest = createHash("sha256").update(JSON.stringify(profile)).digest("base64url");
118
+ return `enhanced-${digest}`;
119
+ }
120
+ catch {
121
+ return null;
122
+ }
123
+ }
124
+ let cachedFingerprint;
125
+ async function computeFreebuffFingerprintId(deps) {
126
+ return (await enhancedFreebuffFingerprintId(deps)) ?? createLegacyFreebuffFingerprintId();
127
+ }
128
+ export function freebuffFingerprintId(deps = {}) {
129
+ if (!cachedFingerprint) {
130
+ cachedFingerprint = computeFreebuffFingerprintId(deps).catch(() => createLegacyFreebuffFingerprintId());
131
+ }
132
+ return cachedFingerprint;
133
+ }
134
+ export function resetFreebuffFingerprint() {
135
+ cachedFingerprint = undefined;
136
+ }
137
+ //# sourceMappingURL=freebuff-fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freebuff-fingerprint.js","sourceRoot":"","sources":["../../src/llm/freebuff-fingerprint.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,29 @@
1
- import { type FreebuffSessionResponse } from "./freebuff-session-api.js";
2
- export declare const FREEBUFF_CATALOG_VERSION = 1;
1
+ export declare const FREEBUFF_CATALOG_PROTOCOL = "1";
2
+ export declare const FREEBUFF_CATALOG_PROTOCOL_HEADER = "x-freebuff-catalog-protocol";
3
+ export declare const FREEBUFF_CATALOG_FETCH_HEADER = "x-freebuff-catalog-fetch";
4
+ export declare const FREEBUFF_CATALOG_CLIENT = "cli";
3
5
  export declare const FREEBUFF_STATIC_MODEL_IDS: readonly string[];
4
- export declare function visibleFreebuffModelIds(response: FreebuffSessionResponse): string[];
6
+ export interface FreebuffCatalogRow {
7
+ readonly key: string;
8
+ readonly handle: string;
9
+ readonly access: string | undefined;
10
+ readonly opensAt: number | undefined;
11
+ }
12
+ export interface FreebuffCatalogSnapshot {
13
+ readonly version: string | undefined;
14
+ readonly fetchId: string | undefined;
15
+ readonly rows: readonly FreebuffCatalogRow[];
16
+ }
17
+ export interface FreebuffCatalogDeps {
18
+ readonly fetch?: typeof fetch | undefined;
19
+ readonly baseUrl?: string | undefined;
20
+ readonly now?: (() => number) | undefined;
21
+ }
22
+ export declare function freebuffCatalogSnapshot(token: string, deps?: FreebuffCatalogDeps): FreebuffCatalogSnapshot | undefined;
23
+ export declare function freebuffCatalogHandle(token: string, model: string, deps?: FreebuffCatalogDeps): string | undefined;
24
+ export declare function refreshFreebuffCatalog(token: string, signal?: AbortSignal, deps?: FreebuffCatalogDeps): Promise<FreebuffCatalogSnapshot | null>;
25
+ export declare function visibleFreebuffCatalogModelIds(snapshot: FreebuffCatalogSnapshot, now?: number): string[];
5
26
  export declare function mergeFreebuffModelIds(visible: readonly string[]): string[];
6
- export declare function resetFreebuffCatalogCache(): void;
7
- export declare function fetchFreebuffModelIds(token: string, signal?: AbortSignal): Promise<string[]>;
8
27
  export declare function freebuffStaticModelIds(): string[];
28
+ export declare function resetFreebuffCatalogCache(): void;
29
+ export declare function fetchFreebuffModelIds(token: string, signal?: AbortSignal, deps?: FreebuffCatalogDeps): Promise<string[]>;
@@ -1,7 +1,14 @@
1
1
  import { createHash } from "node:crypto";
2
- import { callFreebuffSession } from "./freebuff-session-api.js";
3
- export const FREEBUFF_CATALOG_VERSION = 1;
2
+ import { FREEBUFF_API_BASE_URL } from "./freebuff-auth.js";
3
+ import { freebuffDeviceHeaders, freebuffForgetDeviceKeyRegistration, isFreebuffDeviceKeyError, } from "./freebuff-device-key.js";
4
+ const CATALOG_PATH = "/api/v1/freebuff/models";
5
+ export const FREEBUFF_CATALOG_PROTOCOL = "1";
6
+ export const FREEBUFF_CATALOG_PROTOCOL_HEADER = "x-freebuff-catalog-protocol";
7
+ export const FREEBUFF_CATALOG_FETCH_HEADER = "x-freebuff-catalog-fetch";
8
+ export const FREEBUFF_CATALOG_CLIENT = "cli";
4
9
  const CACHE_TTL_MS = 30 * 60 * 1000;
10
+ const CATALOG_TIMEOUT_MS = 20_000;
11
+ const MAX_CACHED_ACCOUNTS = 10;
5
12
  export const FREEBUFF_STATIC_MODEL_IDS = [
6
13
  "anthropic/claude-fable-5.1",
7
14
  "anthropic/claude-opus-4.8",
@@ -66,112 +73,162 @@ export const FREEBUFF_STATIC_MODEL_IDS = [
66
73
  "z-ai/glm-5.3-flashx",
67
74
  "z-ai/glm-5.3-prime",
68
75
  ];
69
- function collectKeys(value, into) {
70
- if (!value || typeof value !== "object" || Array.isArray(value))
71
- return;
72
- for (const key of Object.keys(value)) {
73
- if (key.trim())
74
- into.add(key.trim());
75
- }
76
- }
77
- function planRequiredIds(freebucks) {
78
- const required = new Set();
79
- const ids = freebucks?.planRequiredModelIds;
80
- if (Array.isArray(ids)) {
81
- for (const id of ids) {
82
- if (typeof id === "string" && id.trim())
83
- required.add(id.trim());
84
- }
85
- }
86
- return required;
87
- }
88
- function zeroPriceIds(freebucks) {
89
- const free = new Set();
90
- const prices = freebucks?.prices;
91
- if (!prices || typeof prices !== "object" || Array.isArray(prices))
92
- return free;
93
- for (const [id, price] of Object.entries(prices)) {
94
- if (id.trim() && price === 0)
95
- free.add(id.trim());
96
- }
97
- return free;
98
- }
99
- export function visibleFreebuffModelIds(response) {
100
- const record = response;
101
- const blocked = planRequiredIds(record.freebucks);
102
- const ids = new Set();
103
- if (typeof record.model === "string" && record.model.trim())
104
- ids.add(record.model.trim());
105
- collectKeys(record.rateLimitsByModel, ids);
106
- for (const id of zeroPriceIds(record.freebucks))
107
- ids.add(id);
108
- for (const id of blocked)
109
- ids.delete(id);
110
- return [...ids];
111
- }
112
- export function mergeFreebuffModelIds(visible) {
113
- const merged = new Set(FREEBUFF_STATIC_MODEL_IDS);
114
- for (const id of visible) {
115
- const trimmed = id.trim();
116
- if (trimmed)
117
- merged.add(trimmed);
118
- }
119
- return [...merged].sort((a, b) => a.localeCompare(b));
120
- }
121
76
  const cached = new Map();
122
77
  const requestsInFlight = new Map();
123
- const MAX_CACHED_ACCOUNTS = 10;
124
- export function resetFreebuffCatalogCache() {
125
- cached.clear();
126
- requestsInFlight.clear();
127
- }
128
78
  function tokenCacheKey(token) {
129
79
  return createHash("sha256").update(token).digest("hex");
130
80
  }
131
- function cacheCatalog(tokenHash, modelIds, fetchedAt) {
81
+ function catalogUrl(base) {
82
+ return `${base.replace(/\/$/, "")}${CATALOG_PATH}`;
83
+ }
84
+ function recordOf(value) {
85
+ return value !== null && typeof value === "object" && !Array.isArray(value)
86
+ ? value
87
+ : undefined;
88
+ }
89
+ function parseSnapshot(payload) {
90
+ const record = recordOf(payload);
91
+ if (!record || record.protocol !== 1 || !Array.isArray(record.rows))
92
+ return null;
93
+ const rows = [];
94
+ for (const raw of record.rows) {
95
+ const row = recordOf(raw);
96
+ const key = row?.key;
97
+ const handle = row?.handle;
98
+ if (typeof key !== "string" || !key.trim() || typeof handle !== "string" || !handle.trim())
99
+ continue;
100
+ rows.push({
101
+ key: key.trim(),
102
+ handle: handle.trim(),
103
+ access: typeof row?.access === "string" ? row.access : undefined,
104
+ opensAt: typeof row?.opensAt === "number" && Number.isFinite(row.opensAt) ? row.opensAt : undefined,
105
+ });
106
+ }
107
+ return {
108
+ version: typeof record.version === "string" ? record.version : undefined,
109
+ fetchId: typeof record.fetchId === "string" ? record.fetchId : undefined,
110
+ rows,
111
+ };
112
+ }
113
+ function cacheSnapshot(tokenHash, snapshot, fetchedAt) {
132
114
  cached.delete(tokenHash);
133
- cached.set(tokenHash, { tokenHash, modelIds, fetchedAt });
115
+ cached.set(tokenHash, { snapshot, fetchedAt });
134
116
  if (cached.size > MAX_CACHED_ACCOUNTS) {
135
117
  const oldest = cached.keys().next().value;
136
118
  if (oldest)
137
119
  cached.delete(oldest);
138
120
  }
139
121
  }
140
- export async function fetchFreebuffModelIds(token, signal) {
122
+ function pruneStaleEntries(now) {
123
+ for (const [key, entry] of cached) {
124
+ if (now - entry.fetchedAt >= CACHE_TTL_MS)
125
+ cached.delete(key);
126
+ }
127
+ }
128
+ async function requestCatalog(token, deps, signal, register) {
129
+ const url = catalogUrl(deps.baseUrl ?? FREEBUFF_API_BASE_URL);
130
+ const timeout = AbortSignal.timeout(CATALOG_TIMEOUT_MS);
131
+ const combined = signal ? AbortSignal.any([signal, timeout]) : timeout;
132
+ const headers = {
133
+ authorization: `Bearer ${token}`,
134
+ [FREEBUFF_CATALOG_PROTOCOL_HEADER]: FREEBUFF_CATALOG_PROTOCOL,
135
+ "x-freebuff-client": FREEBUFF_CATALOG_CLIENT,
136
+ "user-agent": "Bun/1.3.14",
137
+ accept: "*/*",
138
+ "accept-encoding": "gzip, deflate, br",
139
+ };
140
+ const current = cached.get(tokenCacheKey(token))?.snapshot;
141
+ Object.assign(headers, await freebuffDeviceHeaders({
142
+ token,
143
+ method: "GET",
144
+ url,
145
+ ...(current?.fetchId !== undefined ? { fetchId: current.fetchId } : {}),
146
+ register,
147
+ }));
148
+ const response = await (deps.fetch ?? fetch)(url, { method: "GET", headers, signal: combined });
149
+ if (!response.ok) {
150
+ const payload = (await response.json().catch(() => null));
151
+ const error = (recordOf(payload)?.error);
152
+ if (typeof error === "string") {
153
+ if (isFreebuffDeviceKeyError(error))
154
+ freebuffForgetDeviceKeyRegistration(token, url);
155
+ }
156
+ return null;
157
+ }
158
+ return parseSnapshot(await response.json().catch(() => null));
159
+ }
160
+ async function loadCatalog(token, deps, signal, force) {
141
161
  const tokenHash = tokenCacheKey(token);
142
- const now = Date.now();
162
+ const now = deps.now?.() ?? Date.now();
163
+ pruneStaleEntries(now);
143
164
  const previous = cached.get(tokenHash);
144
- if (previous && now - previous.fetchedAt < CACHE_TTL_MS) {
145
- cached.delete(tokenHash);
146
- cached.set(tokenHash, previous);
147
- return [...previous.modelIds];
148
- }
149
- const inFlight = requestsInFlight.get(tokenHash);
150
- if (inFlight)
151
- return [...(await inFlight)];
165
+ if (!force && previous && now - previous.fetchedAt < CACHE_TTL_MS)
166
+ return previous.snapshot;
167
+ const inflight = requestsInFlight.get(tokenHash);
168
+ if (inflight)
169
+ return inflight;
152
170
  const request = (async () => {
153
171
  try {
154
- const response = await callFreebuffSession("GET", token, { signal });
155
- const visible = visibleFreebuffModelIds(response).sort((a, b) => a.localeCompare(b));
156
- const modelIds = visible.length > 0 ? visible : freebuffStaticModelIds();
157
- cacheCatalog(tokenHash, modelIds, Date.now());
158
- return modelIds;
172
+ const snapshot = await requestCatalog(token, deps, signal, Boolean(previous));
173
+ if (snapshot)
174
+ cacheSnapshot(tokenHash, snapshot, deps.now?.() ?? Date.now());
175
+ return snapshot ?? previous?.snapshot ?? null;
159
176
  }
160
177
  catch {
161
- return previous ? [...previous.modelIds] : freebuffStaticModelIds();
178
+ return previous?.snapshot ?? null;
162
179
  }
163
180
  })();
164
181
  requestsInFlight.set(tokenHash, request);
165
182
  try {
166
- return [...(await request)];
183
+ return await request;
167
184
  }
168
185
  finally {
169
- if (requestsInFlight.get(tokenHash) === request) {
186
+ if (requestsInFlight.get(tokenHash) === request)
170
187
  requestsInFlight.delete(tokenHash);
171
- }
172
188
  }
173
189
  }
190
+ export function freebuffCatalogSnapshot(token, deps = {}) {
191
+ const now = deps.now?.() ?? Date.now();
192
+ pruneStaleEntries(now);
193
+ return cached.get(tokenCacheKey(token))?.snapshot;
194
+ }
195
+ export function freebuffCatalogHandle(token, model, deps = {}) {
196
+ const snapshot = freebuffCatalogSnapshot(token, deps);
197
+ return snapshot?.rows.find((row) => row.key === model)?.handle;
198
+ }
199
+ export function refreshFreebuffCatalog(token, signal, deps = {}) {
200
+ return loadCatalog(token, deps, signal, true);
201
+ }
202
+ export function visibleFreebuffCatalogModelIds(snapshot, now = Date.now()) {
203
+ const ids = new Set();
204
+ for (const row of snapshot.rows) {
205
+ if (row.access === "locked")
206
+ continue;
207
+ if (row.opensAt !== undefined && row.opensAt > now)
208
+ continue;
209
+ ids.add(row.key);
210
+ }
211
+ return [...ids];
212
+ }
213
+ export function mergeFreebuffModelIds(visible) {
214
+ const merged = new Set(FREEBUFF_STATIC_MODEL_IDS);
215
+ for (const id of visible) {
216
+ const trimmed = id.trim();
217
+ if (trimmed)
218
+ merged.add(trimmed);
219
+ }
220
+ return [...merged].sort((a, b) => a.localeCompare(b));
221
+ }
174
222
  export function freebuffStaticModelIds() {
175
223
  return mergeFreebuffModelIds([]);
176
224
  }
225
+ export function resetFreebuffCatalogCache() {
226
+ cached.clear();
227
+ requestsInFlight.clear();
228
+ }
229
+ export async function fetchFreebuffModelIds(token, signal, deps = {}) {
230
+ const snapshot = await loadCatalog(token, deps, signal, false);
231
+ const ids = snapshot ? visibleFreebuffCatalogModelIds(snapshot).sort((a, b) => a.localeCompare(b)) : [];
232
+ return ids.length > 0 ? ids : freebuffStaticModelIds();
233
+ }
177
234
  //# sourceMappingURL=freebuff-models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"freebuff-models.js","sourceRoot":"","sources":["../../src/llm/freebuff-models.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"freebuff-models.js","sourceRoot":"","sources":["../../src/llm/freebuff-models.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
+ export declare const FREEBUFF_CATALOG_AGENT_ID = "base3-free-catalog";
1
2
  export declare function freebuffAgentId(model: string): string;
3
+ export declare function freebuffAgentIdForToken(token: string, model: string): string;
2
4
  export interface FreebuffRun {
3
5
  readonly runId: string;
4
6
  readonly clientId: string;
@@ -1,6 +1,8 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { ProviderError } from "./http.js";
3
3
  import { FREEBUFF_API_BASE_URL } from "./freebuff-auth.js";
4
+ import { freebuffCatalogSnapshot } from "./freebuff-models.js";
5
+ import { freebuffActingUserHeaders } from "./freebuff-wire.js";
4
6
  const RUN_PATH = "/api/v1/agent-runs";
5
7
  const RUN_TIMEOUT_MS = 30_000;
6
8
  const BASE3_AGENT_BY_MODEL = {
@@ -89,11 +91,15 @@ const BASE2_AGENT_BY_MODEL = {
89
91
  "z-ai/glm-5.3-flashx": "base2-free-glm-5-3-flashx",
90
92
  "z-ai/glm-5.3-prime": "base2-free-glm-5-3-prime",
91
93
  };
92
- const FALLBACK_AGENT_ID = "codebuff/base2-free";
94
+ const FALLBACK_AGENT_ID = "base2-free";
95
+ export const FREEBUFF_CATALOG_AGENT_ID = "base3-free-catalog";
93
96
  export function freebuffAgentId(model) {
94
97
  const id = model.trim();
95
- const agent = BASE3_AGENT_BY_MODEL[id] ?? BASE2_AGENT_BY_MODEL[id];
96
- return agent ? `codebuff/${agent}` : FALLBACK_AGENT_ID;
98
+ return BASE3_AGENT_BY_MODEL[id] ?? BASE2_AGENT_BY_MODEL[id] ?? FALLBACK_AGENT_ID;
99
+ }
100
+ export function freebuffAgentIdForToken(token, model) {
101
+ const row = freebuffCatalogSnapshot(token)?.rows.find((candidate) => candidate.key === model.trim());
102
+ return row ? FREEBUFF_CATALOG_AGENT_ID : freebuffAgentId(model);
97
103
  }
98
104
  function runUrl(base) {
99
105
  return `${base.replace(/\/$/, "")}${RUN_PATH}`;
@@ -102,31 +108,78 @@ function runSignal(signal) {
102
108
  const timeout = AbortSignal.timeout(RUN_TIMEOUT_MS);
103
109
  return signal ? AbortSignal.any([signal, timeout]) : timeout;
104
110
  }
105
- async function postRun(token, body, action, deps) {
106
- const response = await (deps.fetch ?? fetch)(runUrl(deps.baseUrl ?? FREEBUFF_API_BASE_URL), {
107
- method: "POST",
108
- headers: {
109
- authorization: `Bearer ${token}`,
110
- "content-type": "application/json",
111
- },
112
- body: JSON.stringify(body),
113
- signal: runSignal(deps.signal),
111
+ const RUN_RETRIES = 3;
112
+ const RUN_RETRY_BASE_MS = 1_000;
113
+ const RUN_RETRY_CAP_MS = 8_000;
114
+ const RETRYABLE_RUN_STATUSES = new Set([408, 429, 500, 502, 503, 504]);
115
+ function runRetryDelay(attempt) {
116
+ return Math.min(RUN_RETRY_BASE_MS * 2 ** attempt, RUN_RETRY_CAP_MS);
117
+ }
118
+ function delay(ms, signal) {
119
+ return new Promise((resolve, reject) => {
120
+ if (signal?.aborted) {
121
+ reject(signal.reason ?? new DOMException("Aborted", "AbortError"));
122
+ return;
123
+ }
124
+ const timer = setTimeout(() => {
125
+ signal?.removeEventListener("abort", onAbort);
126
+ resolve();
127
+ }, ms);
128
+ function onAbort() {
129
+ clearTimeout(timer);
130
+ reject(signal?.reason ?? new DOMException("Aborted", "AbortError"));
131
+ }
132
+ signal?.addEventListener("abort", onAbort, { once: true });
114
133
  });
115
- const text = await response.text().catch(() => "");
116
- if (!response.ok) {
117
- throw new ProviderError(`Freebuff ${action} failed (${response.status}${text ? `: ${text.slice(0, 300)}` : ""})`, response.status, text.slice(0, 2_000));
118
- }
119
- if (!text)
120
- return undefined;
121
- try {
122
- return JSON.parse(text);
123
- }
124
- catch {
125
- return undefined;
134
+ }
135
+ async function postRun(token, body, action, deps) {
136
+ const url = runUrl(deps.baseUrl ?? FREEBUFF_API_BASE_URL);
137
+ const requestBody = JSON.stringify(body);
138
+ let lastError;
139
+ for (let attempt = 0; attempt <= RUN_RETRIES; attempt += 1) {
140
+ let response;
141
+ try {
142
+ response = await (deps.fetch ?? fetch)(url, {
143
+ method: "POST",
144
+ headers: {
145
+ authorization: `Bearer ${token}`,
146
+ "content-type": "application/json",
147
+ "user-agent": "Bun/1.3.14",
148
+ accept: "*/*",
149
+ "accept-encoding": "gzip, deflate, br",
150
+ ...freebuffActingUserHeaders(),
151
+ },
152
+ body: requestBody,
153
+ signal: runSignal(deps.signal),
154
+ });
155
+ }
156
+ catch (error) {
157
+ lastError = error;
158
+ if (attempt === RUN_RETRIES || deps.signal?.aborted)
159
+ throw error;
160
+ await delay(runRetryDelay(attempt), deps.signal);
161
+ continue;
162
+ }
163
+ const text = await response.text().catch(() => "");
164
+ if (response.ok) {
165
+ if (!text)
166
+ return undefined;
167
+ try {
168
+ return JSON.parse(text);
169
+ }
170
+ catch {
171
+ return undefined;
172
+ }
173
+ }
174
+ lastError = new ProviderError(`Freebuff ${action} failed (${response.status}${text ? `: ${text.slice(0, 300)}` : ""})`, response.status, text.slice(0, 2_000));
175
+ if (!RETRYABLE_RUN_STATUSES.has(response.status) || attempt === RUN_RETRIES)
176
+ throw lastError;
177
+ await delay(runRetryDelay(attempt), deps.signal);
126
178
  }
179
+ throw lastError instanceof Error ? lastError : new ProviderError(`Freebuff ${action} failed after retries.`);
127
180
  }
128
181
  export async function startFreebuffRun(token, model, deps = {}) {
129
- const agentId = freebuffAgentId(model);
182
+ const agentId = freebuffAgentIdForToken(token, model);
130
183
  const payload = await postRun(token, { action: "START", agentId, ancestorRunIds: [] }, "run start", deps);
131
184
  const runId = payload?.["runId"];
132
185
  if (typeof runId !== "string" || !runId) {