agim-cli 1.2.45 → 1.2.49

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 (434) hide show
  1. package/CHANGELOG.md +340 -0
  2. package/README.md +40 -6
  3. package/README.zh-CN.md +40 -6
  4. package/dist/cli-ui/config-wizard.js +16 -2
  5. package/dist/cli-ui/config-wizard.js.map +1 -1
  6. package/dist/cli-ui/diag.d.ts +29 -0
  7. package/dist/cli-ui/diag.d.ts.map +1 -0
  8. package/dist/cli-ui/diag.js +135 -0
  9. package/dist/cli-ui/diag.js.map +1 -0
  10. package/dist/cli-ui/i18n.d.ts +38 -0
  11. package/dist/cli-ui/i18n.d.ts.map +1 -1
  12. package/dist/cli-ui/i18n.js +101 -0
  13. package/dist/cli-ui/i18n.js.map +1 -1
  14. package/dist/cli-ui/setup-llm.d.ts +30 -0
  15. package/dist/cli-ui/setup-llm.d.ts.map +1 -0
  16. package/dist/cli-ui/setup-llm.js +460 -0
  17. package/dist/cli-ui/setup-llm.js.map +1 -0
  18. package/dist/cli-ui/setup-mcp.d.ts +19 -0
  19. package/dist/cli-ui/setup-mcp.d.ts.map +1 -0
  20. package/dist/cli-ui/setup-mcp.js +308 -0
  21. package/dist/cli-ui/setup-mcp.js.map +1 -0
  22. package/dist/cli-ui/token-menu.js +2 -2
  23. package/dist/cli-ui/token-menu.js.map +1 -1
  24. package/dist/cli.js +121 -22
  25. package/dist/cli.js.map +1 -1
  26. package/dist/core/access-token.d.ts +16 -5
  27. package/dist/core/access-token.d.ts.map +1 -1
  28. package/dist/core/access-token.js +82 -13
  29. package/dist/core/access-token.js.map +1 -1
  30. package/dist/core/agent-cwd.d.ts.map +1 -1
  31. package/dist/core/agent-cwd.js +74 -0
  32. package/dist/core/agent-cwd.js.map +1 -1
  33. package/dist/core/approval-bus.d.ts +22 -0
  34. package/dist/core/approval-bus.d.ts.map +1 -1
  35. package/dist/core/approval-bus.js +93 -0
  36. package/dist/core/approval-bus.js.map +1 -1
  37. package/dist/core/ask-user-router.d.ts +24 -0
  38. package/dist/core/ask-user-router.d.ts.map +1 -0
  39. package/dist/core/ask-user-router.js +84 -0
  40. package/dist/core/ask-user-router.js.map +1 -0
  41. package/dist/core/ask-user-rpc.d.ts +80 -0
  42. package/dist/core/ask-user-rpc.d.ts.map +1 -0
  43. package/dist/core/ask-user-rpc.js +388 -0
  44. package/dist/core/ask-user-rpc.js.map +1 -0
  45. package/dist/core/audit-log.d.ts +1 -1
  46. package/dist/core/audit-log.d.ts.map +1 -1
  47. package/dist/core/audit-log.js.map +1 -1
  48. package/dist/core/commands/builtin.d.ts.map +1 -1
  49. package/dist/core/commands/builtin.js +21 -5
  50. package/dist/core/commands/builtin.js.map +1 -1
  51. package/dist/core/commands/goal.d.ts +3 -0
  52. package/dist/core/commands/goal.d.ts.map +1 -0
  53. package/dist/core/commands/goal.js +240 -0
  54. package/dist/core/commands/goal.js.map +1 -0
  55. package/dist/core/commands/heartbeat.d.ts +3 -0
  56. package/dist/core/commands/heartbeat.d.ts.map +1 -0
  57. package/dist/core/commands/heartbeat.js +219 -0
  58. package/dist/core/commands/heartbeat.js.map +1 -0
  59. package/dist/core/commands/router-compare.d.ts +3 -0
  60. package/dist/core/commands/router-compare.d.ts.map +1 -0
  61. package/dist/core/commands/router-compare.js +81 -0
  62. package/dist/core/commands/router-compare.js.map +1 -0
  63. package/dist/core/commands/router.d.ts.map +1 -1
  64. package/dist/core/commands/router.js +9 -1
  65. package/dist/core/commands/router.js.map +1 -1
  66. package/dist/core/commands/skill.d.ts +3 -0
  67. package/dist/core/commands/skill.d.ts.map +1 -0
  68. package/dist/core/commands/skill.js +91 -0
  69. package/dist/core/commands/skill.js.map +1 -0
  70. package/dist/core/config-schema.d.ts +28 -0
  71. package/dist/core/config-schema.d.ts.map +1 -1
  72. package/dist/core/config-schema.js +124 -0
  73. package/dist/core/config-schema.js.map +1 -1
  74. package/dist/core/goals.d.ts +81 -0
  75. package/dist/core/goals.d.ts.map +1 -0
  76. package/dist/core/goals.js +361 -0
  77. package/dist/core/goals.js.map +1 -0
  78. package/dist/core/heartbeat-store.d.ts +90 -0
  79. package/dist/core/heartbeat-store.d.ts.map +1 -0
  80. package/dist/core/heartbeat-store.js +302 -0
  81. package/dist/core/heartbeat-store.js.map +1 -0
  82. package/dist/core/heartbeat.d.ts +35 -0
  83. package/dist/core/heartbeat.d.ts.map +1 -0
  84. package/dist/core/heartbeat.js +332 -0
  85. package/dist/core/heartbeat.js.map +1 -0
  86. package/dist/core/intent-llm.d.ts +9 -0
  87. package/dist/core/intent-llm.d.ts.map +1 -1
  88. package/dist/core/intent-llm.js +77 -32
  89. package/dist/core/intent-llm.js.map +1 -1
  90. package/dist/core/llm/agent-loop.d.ts +112 -0
  91. package/dist/core/llm/agent-loop.d.ts.map +1 -0
  92. package/dist/core/llm/agent-loop.js +313 -0
  93. package/dist/core/llm/agent-loop.js.map +1 -0
  94. package/dist/core/llm/anthropic-provider.d.ts +53 -0
  95. package/dist/core/llm/anthropic-provider.d.ts.map +1 -0
  96. package/dist/core/llm/anthropic-provider.js +339 -0
  97. package/dist/core/llm/anthropic-provider.js.map +1 -0
  98. package/dist/core/llm/auto-compact.d.ts +35 -0
  99. package/dist/core/llm/auto-compact.d.ts.map +1 -0
  100. package/dist/core/llm/auto-compact.js +149 -0
  101. package/dist/core/llm/auto-compact.js.map +1 -0
  102. package/dist/core/llm/builtin-dispatcher.d.ts +21 -0
  103. package/dist/core/llm/builtin-dispatcher.d.ts.map +1 -0
  104. package/dist/core/llm/builtin-dispatcher.js +196 -0
  105. package/dist/core/llm/builtin-dispatcher.js.map +1 -0
  106. package/dist/core/llm/imhub-dispatcher.d.ts +27 -0
  107. package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -0
  108. package/dist/core/llm/imhub-dispatcher.js +308 -0
  109. package/dist/core/llm/imhub-dispatcher.js.map +1 -0
  110. package/dist/core/llm/index.d.ts +11 -0
  111. package/dist/core/llm/index.d.ts.map +1 -0
  112. package/dist/core/llm/index.js +16 -0
  113. package/dist/core/llm/index.js.map +1 -0
  114. package/dist/core/llm/introspection.d.ts +73 -0
  115. package/dist/core/llm/introspection.d.ts.map +1 -0
  116. package/dist/core/llm/introspection.js +90 -0
  117. package/dist/core/llm/introspection.js.map +1 -0
  118. package/dist/core/llm/mcp-client.d.ts +80 -0
  119. package/dist/core/llm/mcp-client.d.ts.map +1 -0
  120. package/dist/core/llm/mcp-client.js +270 -0
  121. package/dist/core/llm/mcp-client.js.map +1 -0
  122. package/dist/core/llm/mcp-registry.d.ts +57 -0
  123. package/dist/core/llm/mcp-registry.d.ts.map +1 -0
  124. package/dist/core/llm/mcp-registry.js +155 -0
  125. package/dist/core/llm/mcp-registry.js.map +1 -0
  126. package/dist/core/llm/openai-compat-provider.d.ts +65 -0
  127. package/dist/core/llm/openai-compat-provider.d.ts.map +1 -0
  128. package/dist/core/llm/openai-compat-provider.js +451 -0
  129. package/dist/core/llm/openai-compat-provider.js.map +1 -0
  130. package/dist/core/llm/policy-approval-gate.d.ts +30 -0
  131. package/dist/core/llm/policy-approval-gate.d.ts.map +1 -0
  132. package/dist/core/llm/policy-approval-gate.js +86 -0
  133. package/dist/core/llm/policy-approval-gate.js.map +1 -0
  134. package/dist/core/llm/provider-base.d.ts +302 -0
  135. package/dist/core/llm/provider-base.d.ts.map +1 -0
  136. package/dist/core/llm/provider-base.js +222 -0
  137. package/dist/core/llm/provider-base.js.map +1 -0
  138. package/dist/core/llm/registry.d.ts +44 -0
  139. package/dist/core/llm/registry.d.ts.map +1 -0
  140. package/dist/core/llm/registry.js +160 -0
  141. package/dist/core/llm/registry.js.map +1 -0
  142. package/dist/core/llm/secrets.d.ts +46 -0
  143. package/dist/core/llm/secrets.d.ts.map +1 -0
  144. package/dist/core/llm/secrets.js +157 -0
  145. package/dist/core/llm/secrets.js.map +1 -0
  146. package/dist/core/llm/tool-dispatcher.d.ts +37 -0
  147. package/dist/core/llm/tool-dispatcher.d.ts.map +1 -0
  148. package/dist/core/llm/tool-dispatcher.js +85 -0
  149. package/dist/core/llm/tool-dispatcher.js.map +1 -0
  150. package/dist/core/memory-consolidate.d.ts.map +1 -1
  151. package/dist/core/memory-consolidate.js +38 -23
  152. package/dist/core/memory-consolidate.js.map +1 -1
  153. package/dist/core/memory-distill.d.ts.map +1 -1
  154. package/dist/core/memory-distill.js +51 -25
  155. package/dist/core/memory-distill.js.map +1 -1
  156. package/dist/core/memory-rpc.d.ts.map +1 -1
  157. package/dist/core/memory-rpc.js +6 -0
  158. package/dist/core/memory-rpc.js.map +1 -1
  159. package/dist/core/message-sink.d.ts.map +1 -1
  160. package/dist/core/message-sink.js +76 -0
  161. package/dist/core/message-sink.js.map +1 -1
  162. package/dist/core/notification-evaluator.d.ts +49 -0
  163. package/dist/core/notification-evaluator.d.ts.map +1 -0
  164. package/dist/core/notification-evaluator.js +232 -0
  165. package/dist/core/notification-evaluator.js.map +1 -0
  166. package/dist/core/onboarding.d.ts.map +1 -1
  167. package/dist/core/onboarding.js +10 -0
  168. package/dist/core/onboarding.js.map +1 -1
  169. package/dist/core/persona.d.ts +10 -0
  170. package/dist/core/persona.d.ts.map +1 -1
  171. package/dist/core/persona.js +28 -14
  172. package/dist/core/persona.js.map +1 -1
  173. package/dist/core/push-rpc.d.ts +8 -0
  174. package/dist/core/push-rpc.d.ts.map +1 -1
  175. package/dist/core/push-rpc.js +41 -1
  176. package/dist/core/push-rpc.js.map +1 -1
  177. package/dist/core/registry.d.ts.map +1 -1
  178. package/dist/core/registry.js +11 -0
  179. package/dist/core/registry.js.map +1 -1
  180. package/dist/core/render-router.d.ts.map +1 -1
  181. package/dist/core/render-router.js +23 -6
  182. package/dist/core/render-router.js.map +1 -1
  183. package/dist/core/router-compare.d.ts +76 -0
  184. package/dist/core/router-compare.d.ts.map +1 -0
  185. package/dist/core/router-compare.js +253 -0
  186. package/dist/core/router-compare.js.map +1 -0
  187. package/dist/core/router.d.ts.map +1 -1
  188. package/dist/core/router.js +25 -1
  189. package/dist/core/router.js.map +1 -1
  190. package/dist/core/skills/builtin/agim-self/SKILL.md +81 -0
  191. package/dist/core/skills/loader.d.ts +120 -0
  192. package/dist/core/skills/loader.d.ts.map +1 -0
  193. package/dist/core/skills/loader.js +577 -0
  194. package/dist/core/skills/loader.js.map +1 -0
  195. package/dist/core/skills-rpc.d.ts +44 -0
  196. package/dist/core/skills-rpc.d.ts.map +1 -0
  197. package/dist/core/skills-rpc.js +71 -0
  198. package/dist/core/skills-rpc.js.map +1 -0
  199. package/dist/core/types.d.ts +35 -0
  200. package/dist/core/types.d.ts.map +1 -1
  201. package/dist/core/util/format-age.d.ts +20 -0
  202. package/dist/core/util/format-age.d.ts.map +1 -0
  203. package/dist/core/util/format-age.js +86 -0
  204. package/dist/core/util/format-age.js.map +1 -0
  205. package/dist/plugins/agents/acp/acp-adapter.d.ts +3 -0
  206. package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -1
  207. package/dist/plugins/agents/acp/acp-adapter.js +12 -0
  208. package/dist/plugins/agents/acp/acp-adapter.js.map +1 -1
  209. package/dist/plugins/agents/antigravity/index.d.ts +1 -0
  210. package/dist/plugins/agents/antigravity/index.d.ts.map +1 -1
  211. package/dist/plugins/agents/antigravity/index.js +1 -0
  212. package/dist/plugins/agents/antigravity/index.js.map +1 -1
  213. package/dist/plugins/agents/claude-code/index.d.ts +1 -0
  214. package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
  215. package/dist/plugins/agents/claude-code/index.js +1 -0
  216. package/dist/plugins/agents/claude-code/index.js.map +1 -1
  217. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +22 -0
  218. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
  219. package/dist/plugins/agents/claude-code/mcp-approval-server.js +157 -0
  220. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
  221. package/dist/plugins/agents/codex/index.d.ts +1 -0
  222. package/dist/plugins/agents/codex/index.d.ts.map +1 -1
  223. package/dist/plugins/agents/codex/index.js +1 -0
  224. package/dist/plugins/agents/codex/index.js.map +1 -1
  225. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts +43 -0
  226. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -0
  227. package/dist/plugins/agents/cursor/ensure-mcp-config.js +99 -0
  228. package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -0
  229. package/dist/plugins/agents/cursor/index.d.ts +28 -0
  230. package/dist/plugins/agents/cursor/index.d.ts.map +1 -0
  231. package/dist/plugins/agents/cursor/index.js +290 -0
  232. package/dist/plugins/agents/cursor/index.js.map +1 -0
  233. package/dist/plugins/agents/native/index.d.ts +34 -0
  234. package/dist/plugins/agents/native/index.d.ts.map +1 -0
  235. package/dist/plugins/agents/native/index.js +598 -0
  236. package/dist/plugins/agents/native/index.js.map +1 -0
  237. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
  238. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
  239. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
  240. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
  241. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
  242. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
  243. package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
  244. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
  245. package/dist/web/agim-skills-api.d.ts +4 -0
  246. package/dist/web/agim-skills-api.d.ts.map +1 -0
  247. package/dist/web/agim-skills-api.js +150 -0
  248. package/dist/web/agim-skills-api.js.map +1 -0
  249. package/dist/web/background-tasks-api.d.ts +7 -0
  250. package/dist/web/background-tasks-api.d.ts.map +1 -0
  251. package/dist/web/background-tasks-api.js +225 -0
  252. package/dist/web/background-tasks-api.js.map +1 -0
  253. package/dist/web/llm-api.d.ts +8 -0
  254. package/dist/web/llm-api.d.ts.map +1 -0
  255. package/dist/web/llm-api.js +300 -0
  256. package/dist/web/llm-api.js.map +1 -0
  257. package/dist/web/mcp-api.d.ts +8 -0
  258. package/dist/web/mcp-api.d.ts.map +1 -0
  259. package/dist/web/mcp-api.js +205 -0
  260. package/dist/web/mcp-api.js.map +1 -0
  261. package/dist/web/public/assets/{a2a-Cdl8iY0e.js → a2a-06bnQicA.js} +3 -3
  262. package/dist/web/public/assets/{a2a-Cdl8iY0e.js.map → a2a-06bnQicA.js.map} +1 -1
  263. package/dist/web/public/assets/{activity-DXahuK1C.js → activity-Bhc6Esfy.js} +2 -2
  264. package/dist/web/public/assets/{activity-DXahuK1C.js.map → activity-Bhc6Esfy.js.map} +1 -1
  265. package/dist/web/public/assets/{admins-C8fJsuHC.js → admins-BVpnOw3o.js} +3 -3
  266. package/dist/web/public/assets/{admins-C8fJsuHC.js.map → admins-BVpnOw3o.js.map} +1 -1
  267. package/dist/web/public/assets/agents-Cn7D3UMz.js +7 -0
  268. package/dist/web/public/assets/agents-Cn7D3UMz.js.map +1 -0
  269. package/dist/web/public/assets/{approvals-CpyL90ef.js → approvals-BJiLyoLf.js} +3 -3
  270. package/dist/web/public/assets/{approvals-CpyL90ef.js.map → approvals-BJiLyoLf.js.map} +1 -1
  271. package/dist/web/public/assets/asks-C7gKbna1.js +7 -0
  272. package/dist/web/public/assets/asks-C7gKbna1.js.map +1 -0
  273. package/dist/web/public/assets/{audit-DDqpiC3z.js → audit-DgWZD8l5.js} +2 -2
  274. package/dist/web/public/assets/{audit-DDqpiC3z.js.map → audit-DgWZD8l5.js.map} +1 -1
  275. package/dist/web/public/assets/bell-pWZT2wlM.js +7 -0
  276. package/dist/web/public/assets/bell-pWZT2wlM.js.map +1 -0
  277. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js → bgjobs-DkAJdzHf.js} +2 -2
  278. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js.map → bgjobs-DkAJdzHf.js.map} +1 -1
  279. package/dist/web/public/assets/{brain-CJyZe3Oa.js → brain-B0mM-ro_.js} +2 -2
  280. package/dist/web/public/assets/{brain-CJyZe3Oa.js.map → brain-B0mM-ro_.js.map} +1 -1
  281. package/dist/web/public/assets/{briefcase-DcLbQF2I.js → briefcase-CUQlj33_.js} +2 -2
  282. package/dist/web/public/assets/{briefcase-DcLbQF2I.js.map → briefcase-CUQlj33_.js.map} +1 -1
  283. package/dist/web/public/assets/{chevron-right-BhKELKvM.js → chevron-right-CJuDP_fx.js} +2 -2
  284. package/dist/web/public/assets/{chevron-right-BhKELKvM.js.map → chevron-right-CJuDP_fx.js.map} +1 -1
  285. package/dist/web/public/assets/{circle-check-D1qST9RS.js → circle-check-CYse8LRx.js} +2 -2
  286. package/dist/web/public/assets/{circle-check-D1qST9RS.js.map → circle-check-CYse8LRx.js.map} +1 -1
  287. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js → circle-check-big-9NpJLA1Z.js} +2 -2
  288. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js.map → circle-check-big-9NpJLA1Z.js.map} +1 -1
  289. package/dist/web/public/assets/{circle-x-DtePUX5x.js → circle-x-BxZ24SVG.js} +2 -2
  290. package/dist/web/public/assets/{circle-x-DtePUX5x.js.map → circle-x-BxZ24SVG.js.map} +1 -1
  291. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js → confirm-dialog-CmHeZ7ei.js} +2 -2
  292. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js.map → confirm-dialog-CmHeZ7ei.js.map} +1 -1
  293. package/dist/web/public/assets/{data-table-BRLUxacD.js → data-table-tu4BIahS.js} +5 -5
  294. package/dist/web/public/assets/{data-table-BRLUxacD.js.map → data-table-tu4BIahS.js.map} +1 -1
  295. package/dist/web/public/assets/{dialog-By4YA8bm.js → dialog-D8QAkLhI.js} +3 -3
  296. package/dist/web/public/assets/{dialog-By4YA8bm.js.map → dialog-D8QAkLhI.js.map} +1 -1
  297. package/dist/web/public/assets/{download-CiTB2sCh.js → download-DBS0ZPTh.js} +2 -2
  298. package/dist/web/public/assets/{download-CiTB2sCh.js.map → download-DBS0ZPTh.js.map} +1 -1
  299. package/dist/web/public/assets/{email-H-b2AExg.js → email-DgbAEEvZ.js} +3 -3
  300. package/dist/web/public/assets/{email-H-b2AExg.js.map → email-DgbAEEvZ.js.map} +1 -1
  301. package/dist/web/public/assets/{empty-state-DZJTUlvz.js → empty-state-B1S_EYNJ.js} +2 -2
  302. package/dist/web/public/assets/{empty-state-DZJTUlvz.js.map → empty-state-B1S_EYNJ.js.map} +1 -1
  303. package/dist/web/public/assets/{external-link-CfU6Rttn.js → external-link-Dkmwlv6p.js} +2 -2
  304. package/dist/web/public/assets/{external-link-CfU6Rttn.js.map → external-link-Dkmwlv6p.js.map} +1 -1
  305. package/dist/web/public/assets/{eye-BvWcd0pJ.js → eye-Ch0DLviZ.js} +4 -4
  306. package/dist/web/public/assets/{eye-BvWcd0pJ.js.map → eye-Ch0DLviZ.js.map} +1 -1
  307. package/dist/web/public/assets/{facts-BRDbQLSI.js → facts-C3YV1Mkp.js} +2 -2
  308. package/dist/web/public/assets/{facts-BRDbQLSI.js.map → facts-C3YV1Mkp.js.map} +1 -1
  309. package/dist/web/public/assets/goals-DEt5gGry.js +17 -0
  310. package/dist/web/public/assets/goals-DEt5gGry.js.map +1 -0
  311. package/dist/web/public/assets/{health-DJPFOiKw.js → health-DuB9uNiZ.js} +2 -2
  312. package/dist/web/public/assets/{health-DJPFOiKw.js.map → health-DuB9uNiZ.js.map} +1 -1
  313. package/dist/web/public/assets/heart-pulse-CD8xNAGs.js +7 -0
  314. package/dist/web/public/assets/heart-pulse-CD8xNAGs.js.map +1 -0
  315. package/dist/web/public/assets/heartbeat-DbR8VwmG.js +7 -0
  316. package/dist/web/public/assets/heartbeat-DbR8VwmG.js.map +1 -0
  317. package/dist/web/public/assets/hot-izk3vGQB.js +17 -0
  318. package/dist/web/public/assets/hot-izk3vGQB.js.map +1 -0
  319. package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
  320. package/dist/web/public/assets/index-BY1vfCja.js +166 -0
  321. package/dist/web/public/assets/index-BY1vfCja.js.map +1 -0
  322. package/dist/web/public/assets/installed-BXB3-YIy.js +31 -0
  323. package/dist/web/public/assets/installed-BXB3-YIy.js.map +1 -0
  324. package/dist/web/public/assets/{jobs-DdWaBgOh.js → jobs-DkbM4mIQ.js} +2 -2
  325. package/dist/web/public/assets/{jobs-DdWaBgOh.js.map → jobs-DkbM4mIQ.js.map} +1 -1
  326. package/dist/web/public/assets/{layout-Dr12u0W_.js → layout-5ePj6Bek.js} +2 -2
  327. package/dist/web/public/assets/{layout-Dr12u0W_.js.map → layout-5ePj6Bek.js.map} +1 -1
  328. package/dist/web/public/assets/layout-B5Dzy_Zc.js +2 -0
  329. package/dist/web/public/assets/layout-B5Dzy_Zc.js.map +1 -0
  330. package/dist/web/public/assets/layout-BZpbNQFb.js +2 -0
  331. package/dist/web/public/assets/layout-BZpbNQFb.js.map +1 -0
  332. package/dist/web/public/assets/layout-DY9Xq34u.js +2 -0
  333. package/dist/web/public/assets/layout-DY9Xq34u.js.map +1 -0
  334. package/dist/web/public/assets/{layout-BybpkTy0.js → layout-DxzBaeTv.js} +2 -2
  335. package/dist/web/public/assets/{layout-BybpkTy0.js.map → layout-DxzBaeTv.js.map} +1 -1
  336. package/dist/web/public/assets/llm-Dg4W7eRM.js +7 -0
  337. package/dist/web/public/assets/llm-Dg4W7eRM.js.map +1 -0
  338. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js → loader-circle-pGNYdPoE.js} +2 -2
  339. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js.map → loader-circle-pGNYdPoE.js.map} +1 -1
  340. package/dist/web/public/assets/{map-pin-B8hea8yW.js → map-pin-D1UX9mg7.js} +2 -2
  341. package/dist/web/public/assets/{map-pin-B8hea8yW.js.map → map-pin-D1UX9mg7.js.map} +1 -1
  342. package/dist/web/public/assets/mcp-uoOzu4_J.js +7 -0
  343. package/dist/web/public/assets/mcp-uoOzu4_J.js.map +1 -0
  344. package/dist/web/public/assets/{memos-C0_I1Uzt.js → memos-CAWASHg5.js} +2 -2
  345. package/dist/web/public/assets/{memos-C0_I1Uzt.js.map → memos-CAWASHg5.js.map} +1 -1
  346. package/dist/web/public/assets/{messengers-DuS5_JlE.js → messengers-B1-mZms8.js} +3 -3
  347. package/dist/web/public/assets/{messengers-DuS5_JlE.js.map → messengers-B1-mZms8.js.map} +1 -1
  348. package/dist/web/public/assets/native-agent-UuVvvzsW.js +7 -0
  349. package/dist/web/public/assets/native-agent-UuVvvzsW.js.map +1 -0
  350. package/dist/web/public/assets/{network-CpkocMHV.js → network-DpjSgAwW.js} +2 -2
  351. package/dist/web/public/assets/{network-CpkocMHV.js.map → network-DpjSgAwW.js.map} +1 -1
  352. package/dist/web/public/assets/{outbox-mGqTV2Ex.js → outbox-DeAgiXkY.js} +3 -3
  353. package/dist/web/public/assets/{outbox-mGqTV2Ex.js.map → outbox-DeAgiXkY.js.map} +1 -1
  354. package/dist/web/public/assets/{pagination-BAYvy11u.js → pagination-5GD_he3L.js} +3 -3
  355. package/dist/web/public/assets/{pagination-BAYvy11u.js.map → pagination-5GD_he3L.js.map} +1 -1
  356. package/dist/web/public/assets/{persona-CM0TLPJa.js → persona-BhkDCmeB.js} +2 -2
  357. package/dist/web/public/assets/{persona-CM0TLPJa.js.map → persona-BhkDCmeB.js.map} +1 -1
  358. package/dist/web/public/assets/{play-DMgMpe7N.js → play-B7o6cJ8W.js} +2 -2
  359. package/dist/web/public/assets/{play-DMgMpe7N.js.map → play-B7o6cJ8W.js.map} +1 -1
  360. package/dist/web/public/assets/plus-C5d4C6Zp.js +7 -0
  361. package/dist/web/public/assets/plus-C5d4C6Zp.js.map +1 -0
  362. package/dist/web/public/assets/policy-Ct_sKm3Y.js +2 -0
  363. package/dist/web/public/assets/{policy-Ch-xirrA.js.map → policy-Ct_sKm3Y.js.map} +1 -1
  364. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js → refresh-ccw-BlXMN3UX.js} +2 -2
  365. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js.map → refresh-ccw-BlXMN3UX.js.map} +1 -1
  366. package/dist/web/public/assets/{reminders-Dbe7Rc4h.js → reminders-gb1Y0S3t.js} +4 -9
  367. package/dist/web/public/assets/reminders-gb1Y0S3t.js.map +1 -0
  368. package/dist/web/public/assets/{save-1aALBaZc.js → save-DAFuApnY.js} +2 -2
  369. package/dist/web/public/assets/{save-1aALBaZc.js.map → save-DAFuApnY.js.map} +1 -1
  370. package/dist/web/public/assets/{schedules-BBQ2wcnS.js → schedules-CtFumT2B.js} +3 -3
  371. package/dist/web/public/assets/{schedules-BBQ2wcnS.js.map → schedules-CtFumT2B.js.map} +1 -1
  372. package/dist/web/public/assets/{search-DDYjsJ7-.js → search-BWuZE0YD.js} +2 -2
  373. package/dist/web/public/assets/{search-DDYjsJ7-.js.map → search-BWuZE0YD.js.map} +1 -1
  374. package/dist/web/public/assets/{service-DMp11TKF.js → service-lah7RWEc.js} +3 -3
  375. package/dist/web/public/assets/{service-DMp11TKF.js.map → service-lah7RWEc.js.map} +1 -1
  376. package/dist/web/public/assets/{status-badge-Cvj81JKi.js → status-badge-BgmFa_8z.js} +2 -2
  377. package/dist/web/public/assets/{status-badge-Cvj81JKi.js.map → status-badge-BgmFa_8z.js.map} +1 -1
  378. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js → subtasks-CgqrOGhl.js} +3 -3
  379. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js.map → subtasks-CgqrOGhl.js.map} +1 -1
  380. package/dist/web/public/assets/{table-B6nK6k3L.js → table-BhDzIBvB.js} +2 -2
  381. package/dist/web/public/assets/{table-B6nK6k3L.js.map → table-BhDzIBvB.js.map} +1 -1
  382. package/dist/web/public/assets/{topn-BwFh2jKv.js → topn-DXgTCdM_.js} +3 -3
  383. package/dist/web/public/assets/{topn-BwFh2jKv.js.map → topn-DXgTCdM_.js.map} +1 -1
  384. package/dist/web/public/assets/{trash-2-CqpMjbu5.js → trash-2-i4F_Rzh3.js} +3 -3
  385. package/dist/web/public/assets/{trash-2-CqpMjbu5.js.map → trash-2-i4F_Rzh3.js.map} +1 -1
  386. package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js +2 -0
  387. package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js.map +1 -0
  388. package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js +2 -0
  389. package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js.map +1 -0
  390. package/dist/web/public/assets/{use-memory-jxZdt-RL.js → use-memory-B_RQWQyG.js} +2 -2
  391. package/dist/web/public/assets/{use-memory-jxZdt-RL.js.map → use-memory-B_RQWQyG.js.map} +1 -1
  392. package/dist/web/public/assets/{use-observability-9TDgLO9y.js → use-observability-CCTN-a71.js} +2 -2
  393. package/dist/web/public/assets/{use-observability-9TDgLO9y.js.map → use-observability-CCTN-a71.js.map} +1 -1
  394. package/dist/web/public/assets/{use-settings-DFB_c2pr.js → use-settings-D4EdDLiK.js} +2 -2
  395. package/dist/web/public/assets/{use-settings-DFB_c2pr.js.map → use-settings-D4EdDLiK.js.map} +1 -1
  396. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js → use-workspace-BhTEp_QH.js} +2 -2
  397. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js.map → use-workspace-BhTEp_QH.js.map} +1 -1
  398. package/dist/web/public/assets/useQuery-DmoWKLw3.js +2 -0
  399. package/dist/web/public/assets/{useQuery-rLmHxFp4.js.map → useQuery-DmoWKLw3.js.map} +1 -1
  400. package/dist/web/public/assets/{vector-D9UqmLi6.js → vector-By-cheMu.js} +2 -2
  401. package/dist/web/public/assets/{vector-D9UqmLi6.js.map → vector-By-cheMu.js.map} +1 -1
  402. package/dist/web/public/assets/{viewer-_OpObeWr.js → viewer-CJNrz2iw.js} +3 -3
  403. package/dist/web/public/assets/{viewer-_OpObeWr.js.map → viewer-CJNrz2iw.js.map} +1 -1
  404. package/dist/web/public/assets/{workspace-DSHRdspq.js → workspace-DvYlIAhu.js} +4 -4
  405. package/dist/web/public/assets/{workspace-DSHRdspq.js.map → workspace-DvYlIAhu.js.map} +1 -1
  406. package/dist/web/public/assets/{workspaces-CsBdhbXz.js → workspaces-2pn73O-K.js} +3 -3
  407. package/dist/web/public/assets/{workspaces-CsBdhbXz.js.map → workspaces-2pn73O-K.js.map} +1 -1
  408. package/dist/web/public/assets/{x-D1re-vBd.js → x-5Z_de5zo.js} +2 -2
  409. package/dist/web/public/assets/{x-D1re-vBd.js.map → x-5Z_de5zo.js.map} +1 -1
  410. package/dist/web/public/index.html +2 -2
  411. package/dist/web/server.d.ts.map +1 -1
  412. package/dist/web/server.js +45 -0
  413. package/dist/web/server.js.map +1 -1
  414. package/package.json +2 -2
  415. package/dist/web/public/assets/agents-lrzFDGgX.js +0 -12
  416. package/dist/web/public/assets/agents-lrzFDGgX.js.map +0 -1
  417. package/dist/web/public/assets/hot-CFGHGkqL.js +0 -17
  418. package/dist/web/public/assets/hot-CFGHGkqL.js.map +0 -1
  419. package/dist/web/public/assets/index-C4hk1i67.js +0 -166
  420. package/dist/web/public/assets/index-C4hk1i67.js.map +0 -1
  421. package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
  422. package/dist/web/public/assets/installed-UONWfKHS.js +0 -7
  423. package/dist/web/public/assets/installed-UONWfKHS.js.map +0 -1
  424. package/dist/web/public/assets/layout-C8_IQRGM.js +0 -2
  425. package/dist/web/public/assets/layout-C8_IQRGM.js.map +0 -1
  426. package/dist/web/public/assets/layout-CxRHLqvi.js +0 -2
  427. package/dist/web/public/assets/layout-CxRHLqvi.js.map +0 -1
  428. package/dist/web/public/assets/layout-LC5zjw1h.js +0 -2
  429. package/dist/web/public/assets/layout-LC5zjw1h.js.map +0 -1
  430. package/dist/web/public/assets/policy-Ch-xirrA.js +0 -2
  431. package/dist/web/public/assets/reminders-Dbe7Rc4h.js.map +0 -1
  432. package/dist/web/public/assets/use-skills-OZKB5x-S.js +0 -2
  433. package/dist/web/public/assets/use-skills-OZKB5x-S.js.map +0 -1
  434. package/dist/web/public/assets/useQuery-rLmHxFp4.js +0 -2
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Chat message role. We intentionally support only the three canonical
3
+ * roles needed by introspection callers; tool / function roles arrive in
4
+ * Stage 2 when we add the real agent loop.
5
+ */
6
+ export type LlmMessageRole = 'system' | 'user' | 'assistant' | 'tool';
7
+ /**
8
+ * Single chat message as sent to / received from the LLM provider.
9
+ *
10
+ * Roles + valid combinations of fields:
11
+ *
12
+ * { role: 'system' | 'user', content }
13
+ * plain text turn.
14
+ *
15
+ * { role: 'assistant', content, toolCalls? }
16
+ * model output. content may be the empty string when the model
17
+ * emitted only tool calls. toolCalls echoes ChatResult.toolCalls
18
+ * verbatim from a prior turn — required for history so the next
19
+ * tool-result message can reference call IDs.
20
+ *
21
+ * { role: 'tool', content, toolCallId }
22
+ * reply from agent code to a previous assistant tool call. content
23
+ * is the stringified tool result. toolCallId MUST match an id from
24
+ * the assistant turn's toolCalls (else providers reject the batch).
25
+ */
26
+ export interface LlmMessage {
27
+ role: LlmMessageRole;
28
+ content: string;
29
+ /** Required when role='tool'; ignored otherwise. */
30
+ toolCallId?: string;
31
+ /** Required to round-trip assistant turns that contained tool calls;
32
+ * ignored on user/system/tool messages. Empty/undefined for plain
33
+ * assistant text turns. */
34
+ toolCalls?: ToolCallRequest[];
35
+ /** DeepSeek / thinking-mode providers echo `reasoning_content` on
36
+ * assistant turns; MUST round-trip on subsequent API calls. */
37
+ reasoningContent?: string;
38
+ /** Optional multimodal attachments (typically images). Providers with
39
+ * `supportsVision() === true` encode these as image_url / image
40
+ * content blocks; others ignore the field and only see `content`. The
41
+ * text path is preserved verbatim so non-vision providers still know
42
+ * an attachment was referenced. */
43
+ media?: Array<{
44
+ /** Absolute path to the file on disk. agim only attaches files
45
+ * inside the per-user media dir (`~/.agim/media/...`); providers
46
+ * read + inline-base64 the bytes. */
47
+ path: string;
48
+ /** Optional MIME hint (e.g. 'image/jpeg'). Provider may sniff from
49
+ * the extension if absent. */
50
+ mime?: string;
51
+ }>;
52
+ }
53
+ /**
54
+ * Single tool exposed to the LLM. Equivalent to OpenAI's
55
+ * {type:'function', function:{...}} wrapper and Anthropic's {name,
56
+ * description, input_schema} entry; providers do the dialect adapt.
57
+ *
58
+ * `parameters` MUST be a JSON Schema object (typically
59
+ * `{type:'object', properties:{...}, required:[...]}`). We don't
60
+ * validate the schema here — providers usually pass it through verbatim
61
+ * and the LLM itself enforces the contract.
62
+ */
63
+ export interface ToolDef {
64
+ name: string;
65
+ description: string;
66
+ parameters: Record<string, unknown>;
67
+ }
68
+ /**
69
+ * One tool call requested by the model. The Stage-2 agent loop iterates
70
+ * over `ChatResult.toolCalls`, executes each one, then appends matching
71
+ * `{role:'tool'}` messages and re-invokes the provider. The `id` is
72
+ * provider-assigned (OpenAI: 'call_...', Anthropic: 'toolu_...') and
73
+ * MUST round-trip on the tool-result message — providers reject batches
74
+ * where ids don't match.
75
+ *
76
+ * `arguments` is the already-JSON-parsed input. OpenAI returns a JSON
77
+ * string in `function.arguments`; we parse it client-side so every
78
+ * caller sees a normal object. When the LLM emits malformed JSON the
79
+ * provider sets `argumentsRaw` and leaves `arguments` as `{}`; tool
80
+ * implementations should validate the shape themselves.
81
+ *
82
+ * `raw` is reserved for provider-specific metadata that must round-trip
83
+ * across turns (e.g. Anthropic cache_control hints, future Gemini
84
+ * thought signatures). The agent loop preserves it verbatim.
85
+ */
86
+ export interface ToolCallRequest {
87
+ id: string;
88
+ name: string;
89
+ arguments: Record<string, unknown>;
90
+ /** When present, JSON parsing of the arguments failed; tools should
91
+ * validate or refuse. Kept as a separate field so the common case
92
+ * (`arguments` is the parsed object) stays cheap. */
93
+ argumentsRaw?: string;
94
+ raw?: unknown;
95
+ }
96
+ /** Tool-choice hint forwarded to providers. Most providers default to
97
+ * 'auto'; a few callers want to force a specific tool ('required' +
98
+ * name) or block all tool use ('none') for one call. Provider support
99
+ * varies — unknown values fall back to 'auto'. */
100
+ export type ToolChoice = 'auto' | 'required' | 'none' | {
101
+ type: 'tool';
102
+ name: string;
103
+ };
104
+ /** Token + cost usage surfaced by the provider, when available. */
105
+ export interface LlmUsage {
106
+ promptTokens?: number;
107
+ completionTokens?: number;
108
+ totalTokens?: number;
109
+ /** Cost in USD if the provider reports it; otherwise undefined. We
110
+ * deliberately don't try to compute cost from a hardcoded price table
111
+ * — Stage 1 just passes through whatever the provider says. */
112
+ costUsd?: number;
113
+ }
114
+ /** Reason the model stopped generating. */
115
+ export type FinishReason = 'stop' | 'tool_use' | 'length' | 'content_filter' | 'error' | 'unknown';
116
+ /** Per-call options. All fields are optional with sensible defaults. */
117
+ export interface ChatOptions {
118
+ /** Override the provider's default model for this call. */
119
+ model?: string;
120
+ /** Sampling temperature. Default = provider default (usually 0.7). */
121
+ temperature?: number;
122
+ /** Max tokens in the completion. Default = provider default. */
123
+ maxTokens?: number;
124
+ /** Optional system prompt to prepend (a convenience over building a
125
+ * system message yourself; ignored if messages already starts with
126
+ * a system message). */
127
+ system?: string;
128
+ /** Abort the request when this signal fires. Required by callers that
129
+ * manage their own deadlines (memory-consolidate has a 60s cap). */
130
+ signal?: AbortSignal;
131
+ /** Internal hard deadline in ms. If both signal and timeoutMs are
132
+ * given, the earlier of the two wins. */
133
+ timeoutMs?: number;
134
+ /** Called once per provider response (or once per chunk for stream)
135
+ * with whatever usage info the provider returned. Best-effort —
136
+ * callers should not block on this. */
137
+ onUsage?: (usage: LlmUsage) => void;
138
+ /** Extra provider-specific knobs. Each provider documents what it
139
+ * reads from this bag; unknown keys are ignored. Keeps the public
140
+ * ChatOptions type stable while letting power users tune
141
+ * OpenRouter-style headers, DeepSeek-specific thinking mode, etc. */
142
+ providerOptions?: Record<string, unknown>;
143
+ /** Stage 2 — tool definitions advertised to the model. When unset
144
+ * (or empty) the model has no tool access for this call; this is
145
+ * the introspection-caller default and matches Stage-1 behaviour. */
146
+ tools?: ToolDef[];
147
+ /** Stage 2 — tool-use hint. 'auto' (default) lets the model decide;
148
+ * 'required' forces some tool call; 'none' suppresses tools even
149
+ * when `tools` is non-empty; `{type:'tool', name}` forces a
150
+ * specific tool. Provider support varies; unknown values fall
151
+ * back to 'auto'. */
152
+ toolChoice?: ToolChoice;
153
+ }
154
+ /** Result of a chat call. */
155
+ export interface ChatResult {
156
+ /** Plain text body. May be the empty string on `finishReason: 'error'`
157
+ * or when the model emitted only tool_calls. */
158
+ text: string;
159
+ /** Stage 2 — tool calls the model wants the agent loop to execute.
160
+ * When present, finishReason is typically 'tool_use'. Stage-1
161
+ * introspection callers can simply ignore this field — non-empty
162
+ * toolCalls in a chat() call (no agent loop) just means the model
163
+ * spent budget on a tool the caller never advertised, which is rare
164
+ * but harmless. */
165
+ toolCalls?: ToolCallRequest[];
166
+ /** Provider-specific thinking trace (e.g. DeepSeek reasoning_content). */
167
+ reasoningContent?: string;
168
+ /** Usage metrics, when the provider reports them. */
169
+ usage: LlmUsage;
170
+ /** Why the model stopped. */
171
+ finishReason: FinishReason;
172
+ /** Model id the provider actually used (handy for diagnostics when
173
+ * the caller relies on the provider's default rather than an explicit
174
+ * `opts.model`). */
175
+ modelUsed: string;
176
+ }
177
+ /** Lightweight stream chunk. Stage 1 streams only text deltas. */
178
+ export interface ChatStreamChunk {
179
+ textDelta: string;
180
+ /** Only populated on the final chunk. Earlier chunks have null. */
181
+ finishReason?: FinishReason | null;
182
+ /** Only populated on the final chunk, when the provider reports it. */
183
+ usage?: LlmUsage;
184
+ }
185
+ /**
186
+ * Common configuration every provider needs. Concrete providers may add
187
+ * their own fields (e.g. OpenAICompatProvider adds `baseUrl`).
188
+ */
189
+ export interface ProviderConfigBase {
190
+ /** Unique identifier within an agim instance — e.g. "deepseek-cheap"
191
+ * or "gpt-4-1-judge". This is what `llmRoles` references. */
192
+ name: string;
193
+ /** Default model id the provider sends when ChatOptions.model is unset. */
194
+ model: string;
195
+ /** Provider type label, surfaced in logs and the web UI. */
196
+ providerType: string;
197
+ /** API key — provider implementations look this up via secrets.ts; the
198
+ * base class only uses it for logging length / fingerprinting. */
199
+ apiKey?: string;
200
+ /** Default temperature; falls back to 0.3 for cheap introspection
201
+ * callers (we want deterministic JSON, not creativity). */
202
+ defaultTemperature?: number;
203
+ /** Default max output tokens. Tight default so a misconfigured prompt
204
+ * can't burn 16k tokens worth of "Sure! Let me explain…". */
205
+ defaultMaxTokens?: number;
206
+ }
207
+ /**
208
+ * Base class for every LLM provider. The transport-specific work happens
209
+ * in `_callApi` / `_callApiStream` which subclasses implement. The base
210
+ * adds:
211
+ * - timeout / AbortSignal merging
212
+ * - default system prompt injection
213
+ * - onUsage plumbing (callers shouldn't have to defend against missing
214
+ * usage info)
215
+ * - finishReason normalization
216
+ */
217
+ export declare abstract class LlmProvider {
218
+ readonly name: string;
219
+ readonly model: string;
220
+ readonly providerType: string;
221
+ protected readonly apiKey: string | undefined;
222
+ protected readonly defaultTemperature: number;
223
+ protected readonly defaultMaxTokens: number;
224
+ constructor(cfg: ProviderConfigBase);
225
+ /** True when the provider has the credentials it needs. False suggests
226
+ * the operator forgot to set the secret; the registry filters these
227
+ * out at load time so `getProvider()` callers don't have to check. */
228
+ isConfigured(): boolean;
229
+ /** True when this provider can interpret LlmMessage.media (typically
230
+ * image attachments). Default false — only the openai-compat
231
+ * provider currently overrides this (operators opt-in via the
232
+ * provider's `vision: true` config or a model-name heuristic).
233
+ * Anthropic / others fall back to text-only. */
234
+ supportsVision(): boolean;
235
+ /**
236
+ * Buffered chat call: send the full message list, await the entire
237
+ * response. Used by all Stage-1 introspection callers because the
238
+ * downstream parsers want a complete JSON string anyway.
239
+ */
240
+ chat(messages: LlmMessage[], opts?: ChatOptions): Promise<ChatResult>;
241
+ /**
242
+ * Streaming chat call: async-iterable of text deltas. Stage-1 callers
243
+ * don't use this yet, but it's in the base API so Stage 2's agent loop
244
+ * (and the future "stream thinking to web UI" feature) can build on it
245
+ * without API churn.
246
+ */
247
+ chatStream(messages: LlmMessage[], opts?: ChatOptions): AsyncIterable<ChatStreamChunk>;
248
+ /** Concrete providers implement this for buffered responses. */
249
+ protected abstract _callApi(messages: LlmMessage[], opts: NormalizedOptions, signal: AbortSignal): Promise<ChatResult>;
250
+ /** Concrete providers implement this for streamed responses. Default
251
+ * implementation falls back to buffered + single-chunk yield, so
252
+ * providers that don't support streaming still work (the caller sees
253
+ * one big chunk on completion). Override for real streaming. */
254
+ protected _callApiStream(messages: LlmMessage[], opts: NormalizedOptions, signal: AbortSignal): AsyncIterable<ChatStreamChunk>;
255
+ /**
256
+ * Prepend `opts.system` as a system message iff the caller didn't
257
+ * already supply one. Saves callers from threading the same conditional
258
+ * everywhere; documented in ChatOptions so behaviour is unsurprising.
259
+ */
260
+ private _prepareMessages;
261
+ private _mergeOptions;
262
+ /**
263
+ * Merge the caller's AbortSignal with the optional timeout into a
264
+ * single composite signal. We deliberately don't use AbortSignal.any
265
+ * because Node 18 doesn't have it; the manual wiring is small enough
266
+ * to keep us portable. Returns a cleanup fn the caller must invoke to
267
+ * clear the timeout (prevents the test runner from keeping the event
268
+ * loop alive past test completion).
269
+ */
270
+ private _buildSignal;
271
+ }
272
+ /** Internal normalized form of ChatOptions — concrete providers receive
273
+ * this rather than the raw ChatOptions so they don't have to repeat the
274
+ * defaulting logic. */
275
+ export interface NormalizedOptions {
276
+ model: string;
277
+ temperature: number;
278
+ maxTokens: number;
279
+ timeoutMs?: number;
280
+ providerOptions: Record<string, unknown>;
281
+ /** Stage 2 — tool definitions to advertise. Empty array → undefined
282
+ * so providers can rely on `opts.tools ? ... : ...` shorthand. */
283
+ tools?: ToolDef[];
284
+ toolChoice?: ToolChoice;
285
+ }
286
+ /**
287
+ * Helper for providers that want to format an error consistently. Wrapping
288
+ * the underlying fetch / SDK error in LlmProviderError makes it easy for
289
+ * callers (and the registry's "is the provider healthy?" probe) to tell
290
+ * a transport failure apart from a logic bug.
291
+ */
292
+ export declare class LlmProviderError extends Error {
293
+ readonly providerName: string;
294
+ readonly httpStatus?: number;
295
+ readonly transient: boolean;
296
+ constructor(providerName: string, message: string, opts?: {
297
+ httpStatus?: number;
298
+ transient?: boolean;
299
+ cause?: unknown;
300
+ });
301
+ }
302
+ //# sourceMappingURL=provider-base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-base.d.ts","sourceRoot":"","sources":["../../../src/core/llm/provider-base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,222 @@
1
+ // LLM provider abstraction (Stage 1 — D+ plan, 2026-05-23).
2
+ //
3
+ // The goal here is intentionally small: give agim a way to do
4
+ // "single-shot LLM call → text" *without* spawning a CLI agent (Claude
5
+ // Code / Codex / OpenCode). agim stays a CLI bridge in spirit — these
6
+ // providers are only used by internal introspection callers
7
+ // (memory-distill, memory-consolidate, intent-llm, future heartbeat /
8
+ // notification evaluator).
9
+ //
10
+ // Stage 1 explicitly does NOT implement:
11
+ // - tool calling / agent loop (that's Stage 2)
12
+ // - MCP client (Stage 2)
13
+ // - file / shell tools (delegated to MCP in Stage 2)
14
+ // - Anthropic native messages API (Stage 2)
15
+ //
16
+ // What it DOES support:
17
+ // - `chat(messages, opts) → ChatResult` for buffered text responses
18
+ // - `chatStream(...)` async iterable for incremental delivery
19
+ // - timeouts via AbortSignal
20
+ // - usage / cost telemetry surfaced through onUsage callback
21
+ //
22
+ // Concrete providers (Stage 1: OpenAICompatProvider only) subclass and
23
+ // implement `_callApi` / `_callApiStream`. The base wraps with timeout +
24
+ // telemetry plumbing so providers stay focused on transport details.
25
+ /**
26
+ * Base class for every LLM provider. The transport-specific work happens
27
+ * in `_callApi` / `_callApiStream` which subclasses implement. The base
28
+ * adds:
29
+ * - timeout / AbortSignal merging
30
+ * - default system prompt injection
31
+ * - onUsage plumbing (callers shouldn't have to defend against missing
32
+ * usage info)
33
+ * - finishReason normalization
34
+ */
35
+ export class LlmProvider {
36
+ name;
37
+ model;
38
+ providerType;
39
+ apiKey;
40
+ defaultTemperature;
41
+ defaultMaxTokens;
42
+ constructor(cfg) {
43
+ if (!cfg.name)
44
+ throw new Error('LlmProvider: name is required');
45
+ if (!cfg.model)
46
+ throw new Error('LlmProvider: model is required');
47
+ if (!cfg.providerType)
48
+ throw new Error('LlmProvider: providerType is required');
49
+ this.name = cfg.name;
50
+ this.model = cfg.model;
51
+ this.providerType = cfg.providerType;
52
+ this.apiKey = cfg.apiKey;
53
+ this.defaultTemperature = cfg.defaultTemperature ?? 0.3;
54
+ this.defaultMaxTokens = cfg.defaultMaxTokens ?? 1024;
55
+ }
56
+ /** True when the provider has the credentials it needs. False suggests
57
+ * the operator forgot to set the secret; the registry filters these
58
+ * out at load time so `getProvider()` callers don't have to check. */
59
+ isConfigured() {
60
+ return Boolean(this.apiKey);
61
+ }
62
+ /** True when this provider can interpret LlmMessage.media (typically
63
+ * image attachments). Default false — only the openai-compat
64
+ * provider currently overrides this (operators opt-in via the
65
+ * provider's `vision: true` config or a model-name heuristic).
66
+ * Anthropic / others fall back to text-only. */
67
+ supportsVision() {
68
+ return false;
69
+ }
70
+ /**
71
+ * Buffered chat call: send the full message list, await the entire
72
+ * response. Used by all Stage-1 introspection callers because the
73
+ * downstream parsers want a complete JSON string anyway.
74
+ */
75
+ async chat(messages, opts = {}) {
76
+ const prepared = this._prepareMessages(messages, opts);
77
+ const merged = this._mergeOptions(opts);
78
+ const signal = this._buildSignal(opts.signal, merged.timeoutMs);
79
+ const result = await this._callApi(prepared, merged, signal.signal);
80
+ signal.cleanup();
81
+ if (opts.onUsage) {
82
+ try {
83
+ opts.onUsage(result.usage);
84
+ }
85
+ catch { /* swallow — telemetry is best-effort */ }
86
+ }
87
+ return result;
88
+ }
89
+ /**
90
+ * Streaming chat call: async-iterable of text deltas. Stage-1 callers
91
+ * don't use this yet, but it's in the base API so Stage 2's agent loop
92
+ * (and the future "stream thinking to web UI" feature) can build on it
93
+ * without API churn.
94
+ */
95
+ async *chatStream(messages, opts = {}) {
96
+ const prepared = this._prepareMessages(messages, opts);
97
+ const merged = this._mergeOptions(opts);
98
+ const signal = this._buildSignal(opts.signal, merged.timeoutMs);
99
+ try {
100
+ let lastUsage;
101
+ for await (const chunk of this._callApiStream(prepared, merged, signal.signal)) {
102
+ if (chunk.usage)
103
+ lastUsage = chunk.usage;
104
+ yield chunk;
105
+ }
106
+ if (lastUsage && opts.onUsage) {
107
+ try {
108
+ opts.onUsage(lastUsage);
109
+ }
110
+ catch { /* swallow */ }
111
+ }
112
+ }
113
+ finally {
114
+ signal.cleanup();
115
+ }
116
+ }
117
+ /** Concrete providers implement this for streamed responses. Default
118
+ * implementation falls back to buffered + single-chunk yield, so
119
+ * providers that don't support streaming still work (the caller sees
120
+ * one big chunk on completion). Override for real streaming. */
121
+ async *_callApiStream(messages, opts, signal) {
122
+ const result = await this._callApi(messages, opts, signal);
123
+ yield {
124
+ textDelta: result.text,
125
+ finishReason: result.finishReason,
126
+ usage: result.usage,
127
+ };
128
+ }
129
+ /**
130
+ * Prepend `opts.system` as a system message iff the caller didn't
131
+ * already supply one. Saves callers from threading the same conditional
132
+ * everywhere; documented in ChatOptions so behaviour is unsurprising.
133
+ */
134
+ _prepareMessages(messages, opts) {
135
+ if (!opts.system)
136
+ return messages;
137
+ if (messages.length > 0 && messages[0].role === 'system')
138
+ return messages;
139
+ return [{ role: 'system', content: opts.system }, ...messages];
140
+ }
141
+ _mergeOptions(opts) {
142
+ return {
143
+ model: opts.model || this.model,
144
+ temperature: opts.temperature ?? this.defaultTemperature,
145
+ maxTokens: opts.maxTokens ?? this.defaultMaxTokens,
146
+ timeoutMs: opts.timeoutMs,
147
+ providerOptions: opts.providerOptions ?? {},
148
+ tools: opts.tools && opts.tools.length > 0 ? opts.tools : undefined,
149
+ toolChoice: opts.toolChoice,
150
+ };
151
+ }
152
+ /**
153
+ * Merge the caller's AbortSignal with the optional timeout into a
154
+ * single composite signal. We deliberately don't use AbortSignal.any
155
+ * because Node 18 doesn't have it; the manual wiring is small enough
156
+ * to keep us portable. Returns a cleanup fn the caller must invoke to
157
+ * clear the timeout (prevents the test runner from keeping the event
158
+ * loop alive past test completion).
159
+ */
160
+ _buildSignal(userSignal, timeoutMs) {
161
+ if (!userSignal && !timeoutMs) {
162
+ // Fast path: no constraints, return a never-aborted controller so
163
+ // _callApi has a single signal contract to work with.
164
+ const ctrl = new AbortController();
165
+ return { signal: ctrl.signal, cleanup: () => { } };
166
+ }
167
+ const ctrl = new AbortController();
168
+ let timer = null;
169
+ const onUserAbort = () => {
170
+ ctrl.abort(userSignal?.reason ?? new Error('aborted'));
171
+ };
172
+ if (userSignal) {
173
+ if (userSignal.aborted)
174
+ onUserAbort();
175
+ else
176
+ userSignal.addEventListener('abort', onUserAbort, { once: true });
177
+ }
178
+ if (timeoutMs && Number.isFinite(timeoutMs) && timeoutMs > 0) {
179
+ timer = setTimeout(() => ctrl.abort(new Error(`LLM call timed out after ${timeoutMs}ms`)), timeoutMs);
180
+ if (typeof timer === 'object' && timer && 'unref' in timer) {
181
+ timer.unref();
182
+ }
183
+ }
184
+ return {
185
+ signal: ctrl.signal,
186
+ cleanup: () => {
187
+ if (timer)
188
+ clearTimeout(timer);
189
+ if (userSignal)
190
+ userSignal.removeEventListener('abort', onUserAbort);
191
+ },
192
+ };
193
+ }
194
+ }
195
+ /**
196
+ * Helper for providers that want to format an error consistently. Wrapping
197
+ * the underlying fetch / SDK error in LlmProviderError makes it easy for
198
+ * callers (and the registry's "is the provider healthy?" probe) to tell
199
+ * a transport failure apart from a logic bug.
200
+ */
201
+ export class LlmProviderError extends Error {
202
+ providerName;
203
+ httpStatus;
204
+ transient;
205
+ constructor(providerName, message, opts = {}) {
206
+ super(message);
207
+ this.name = 'LlmProviderError';
208
+ this.providerName = providerName;
209
+ this.httpStatus = opts.httpStatus;
210
+ // 429 / 408 / 503 / 504 are conventional "retry-me" codes. Callers
211
+ // can use this flag to decide whether to back off or fall back to a
212
+ // CLI agent right away.
213
+ this.transient = opts.transient ?? (opts.httpStatus === 408 ||
214
+ opts.httpStatus === 429 ||
215
+ opts.httpStatus === 503 ||
216
+ opts.httpStatus === 504);
217
+ if (opts.cause !== undefined) {
218
+ this.cause = opts.cause;
219
+ }
220
+ }
221
+ }
222
+ //# sourceMappingURL=provider-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-base.js","sourceRoot":"","sources":["../../../src/core/llm/provider-base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { ValidatedConfig } from '../config-schema.js';
2
+ import type { LlmProvider } from './provider-base.js';
3
+ /** Role names recognised by Stage 1 callers. Strings rather than enum so
4
+ * forward-compat roles (added in later stages) compile against an older
5
+ * agim without type errors. */
6
+ export type LlmRole = 'cheap' | 'evaluator' | 'native-chat' | string;
7
+ /**
8
+ * Build the registry from a validated config. Idempotent — repeated
9
+ * calls fully replace the previous state. Logs (info / warn) the load
10
+ * outcome so operators see what landed at startup.
11
+ */
12
+ export declare function loadFromConfig(cfg: ValidatedConfig | {
13
+ llmBackends?: unknown;
14
+ llmRoles?: unknown;
15
+ }): void;
16
+ /**
17
+ * Get the provider configured for `role`, or null when no usable
18
+ * backend is wired. Callers should NEVER throw on null — that's how the
19
+ * registry tells them "fall back to your CLI path".
20
+ */
21
+ export declare function getProvider(role: LlmRole): LlmProvider | null;
22
+ /** Look up a provider directly by backend name (mostly for the web
23
+ * "Test connection" button and unit tests). */
24
+ export declare function getProviderByName(name: string): LlmProvider | null;
25
+ /** List all configured backends — handy for the web UI roster. */
26
+ export declare function listProviders(): {
27
+ name: string;
28
+ providerType: string;
29
+ model: string;
30
+ }[];
31
+ /** Test/diagnostic: clear the registry. Used by bun tests so module
32
+ * state doesn't leak across cases. */
33
+ export declare function _resetRegistry(): void;
34
+ /** Diagnostic snapshot for the cost dashboard's "LLM backends" tile. */
35
+ export declare function describeRegistry(): {
36
+ backends: {
37
+ name: string;
38
+ providerType: string;
39
+ model: string;
40
+ }[];
41
+ roles: Record<string, string>;
42
+ unconfigured: string[];
43
+ };
44
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/llm/registry.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAG1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAKrD;;gCAEgC;AAChC,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,CAAA;AAoBpE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAqDzG;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAI7D;AAED;gDACgD;AAChD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAElE;AAED,kEAAkE;AAClE,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAMvF;AAED;uCACuC;AACvC,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,IAAI;IAClC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACjE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB,CAMA"}