agim-cli 1.2.45 → 1.2.48

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 (426) hide show
  1. package/CHANGELOG.md +295 -0
  2. package/README.md +39 -5
  3. package/README.zh-CN.md +40 -6
  4. package/dist/cli-ui/config-wizard.js +15 -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 +36 -0
  11. package/dist/cli-ui/i18n.d.ts.map +1 -1
  12. package/dist/cli-ui/i18n.js +97 -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 +100 -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 +46 -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 +6 -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/native/index.d.ts +34 -0
  226. package/dist/plugins/agents/native/index.d.ts.map +1 -0
  227. package/dist/plugins/agents/native/index.js +598 -0
  228. package/dist/plugins/agents/native/index.js.map +1 -0
  229. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
  230. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
  231. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
  232. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
  233. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
  234. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
  235. package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
  236. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
  237. package/dist/web/agim-skills-api.d.ts +4 -0
  238. package/dist/web/agim-skills-api.d.ts.map +1 -0
  239. package/dist/web/agim-skills-api.js +150 -0
  240. package/dist/web/agim-skills-api.js.map +1 -0
  241. package/dist/web/background-tasks-api.d.ts +7 -0
  242. package/dist/web/background-tasks-api.d.ts.map +1 -0
  243. package/dist/web/background-tasks-api.js +225 -0
  244. package/dist/web/background-tasks-api.js.map +1 -0
  245. package/dist/web/llm-api.d.ts +8 -0
  246. package/dist/web/llm-api.d.ts.map +1 -0
  247. package/dist/web/llm-api.js +300 -0
  248. package/dist/web/llm-api.js.map +1 -0
  249. package/dist/web/mcp-api.d.ts +8 -0
  250. package/dist/web/mcp-api.d.ts.map +1 -0
  251. package/dist/web/mcp-api.js +205 -0
  252. package/dist/web/mcp-api.js.map +1 -0
  253. package/dist/web/public/assets/{a2a-Cdl8iY0e.js → a2a-Mke0F7ZM.js} +3 -3
  254. package/dist/web/public/assets/{a2a-Cdl8iY0e.js.map → a2a-Mke0F7ZM.js.map} +1 -1
  255. package/dist/web/public/assets/{activity-DXahuK1C.js → activity-0zGnf1_m.js} +2 -2
  256. package/dist/web/public/assets/{activity-DXahuK1C.js.map → activity-0zGnf1_m.js.map} +1 -1
  257. package/dist/web/public/assets/{admins-C8fJsuHC.js → admins-DSi3KRky.js} +3 -3
  258. package/dist/web/public/assets/{admins-C8fJsuHC.js.map → admins-DSi3KRky.js.map} +1 -1
  259. package/dist/web/public/assets/agents-BLWe20EJ.js +7 -0
  260. package/dist/web/public/assets/agents-BLWe20EJ.js.map +1 -0
  261. package/dist/web/public/assets/{approvals-CpyL90ef.js → approvals-Cu_JdM-8.js} +3 -3
  262. package/dist/web/public/assets/{approvals-CpyL90ef.js.map → approvals-Cu_JdM-8.js.map} +1 -1
  263. package/dist/web/public/assets/asks-DfV8vxey.js +7 -0
  264. package/dist/web/public/assets/asks-DfV8vxey.js.map +1 -0
  265. package/dist/web/public/assets/{audit-DDqpiC3z.js → audit-2EVhhvGV.js} +2 -2
  266. package/dist/web/public/assets/{audit-DDqpiC3z.js.map → audit-2EVhhvGV.js.map} +1 -1
  267. package/dist/web/public/assets/bell-Wz_wuOa_.js +7 -0
  268. package/dist/web/public/assets/bell-Wz_wuOa_.js.map +1 -0
  269. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js → bgjobs-DXROZFAW.js} +2 -2
  270. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js.map → bgjobs-DXROZFAW.js.map} +1 -1
  271. package/dist/web/public/assets/{brain-CJyZe3Oa.js → brain-Dh5VOzRL.js} +2 -2
  272. package/dist/web/public/assets/{brain-CJyZe3Oa.js.map → brain-Dh5VOzRL.js.map} +1 -1
  273. package/dist/web/public/assets/{briefcase-DcLbQF2I.js → briefcase-DfxbvM9i.js} +2 -2
  274. package/dist/web/public/assets/{briefcase-DcLbQF2I.js.map → briefcase-DfxbvM9i.js.map} +1 -1
  275. package/dist/web/public/assets/{chevron-right-BhKELKvM.js → chevron-right-DU8Xla1M.js} +2 -2
  276. package/dist/web/public/assets/{chevron-right-BhKELKvM.js.map → chevron-right-DU8Xla1M.js.map} +1 -1
  277. package/dist/web/public/assets/{circle-check-D1qST9RS.js → circle-check-Be_S993G.js} +2 -2
  278. package/dist/web/public/assets/{circle-check-D1qST9RS.js.map → circle-check-Be_S993G.js.map} +1 -1
  279. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js → circle-check-big-CsQkLR1u.js} +2 -2
  280. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js.map → circle-check-big-CsQkLR1u.js.map} +1 -1
  281. package/dist/web/public/assets/{circle-x-DtePUX5x.js → circle-x-qkQu1Swu.js} +2 -2
  282. package/dist/web/public/assets/{circle-x-DtePUX5x.js.map → circle-x-qkQu1Swu.js.map} +1 -1
  283. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js → confirm-dialog-Bm6MsLXZ.js} +2 -2
  284. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js.map → confirm-dialog-Bm6MsLXZ.js.map} +1 -1
  285. package/dist/web/public/assets/{data-table-BRLUxacD.js → data-table-Dw4Df09-.js} +5 -5
  286. package/dist/web/public/assets/{data-table-BRLUxacD.js.map → data-table-Dw4Df09-.js.map} +1 -1
  287. package/dist/web/public/assets/{dialog-By4YA8bm.js → dialog-CNsc4COh.js} +3 -3
  288. package/dist/web/public/assets/{dialog-By4YA8bm.js.map → dialog-CNsc4COh.js.map} +1 -1
  289. package/dist/web/public/assets/{download-CiTB2sCh.js → download-Bnhk_vDY.js} +2 -2
  290. package/dist/web/public/assets/{download-CiTB2sCh.js.map → download-Bnhk_vDY.js.map} +1 -1
  291. package/dist/web/public/assets/{email-H-b2AExg.js → email-jgAX8liM.js} +3 -3
  292. package/dist/web/public/assets/{email-H-b2AExg.js.map → email-jgAX8liM.js.map} +1 -1
  293. package/dist/web/public/assets/{empty-state-DZJTUlvz.js → empty-state-D8QXQ5y9.js} +2 -2
  294. package/dist/web/public/assets/{empty-state-DZJTUlvz.js.map → empty-state-D8QXQ5y9.js.map} +1 -1
  295. package/dist/web/public/assets/{external-link-CfU6Rttn.js → external-link-C8AYvhBb.js} +2 -2
  296. package/dist/web/public/assets/{external-link-CfU6Rttn.js.map → external-link-C8AYvhBb.js.map} +1 -1
  297. package/dist/web/public/assets/{eye-BvWcd0pJ.js → eye-pmI_4E8x.js} +4 -4
  298. package/dist/web/public/assets/{eye-BvWcd0pJ.js.map → eye-pmI_4E8x.js.map} +1 -1
  299. package/dist/web/public/assets/{facts-BRDbQLSI.js → facts-BRHLLX2u.js} +2 -2
  300. package/dist/web/public/assets/{facts-BRDbQLSI.js.map → facts-BRHLLX2u.js.map} +1 -1
  301. package/dist/web/public/assets/goals-p7cNp01l.js +17 -0
  302. package/dist/web/public/assets/goals-p7cNp01l.js.map +1 -0
  303. package/dist/web/public/assets/{health-DJPFOiKw.js → health-CuGIXg8C.js} +2 -2
  304. package/dist/web/public/assets/{health-DJPFOiKw.js.map → health-CuGIXg8C.js.map} +1 -1
  305. package/dist/web/public/assets/heart-pulse-D0AHQl1d.js +7 -0
  306. package/dist/web/public/assets/heart-pulse-D0AHQl1d.js.map +1 -0
  307. package/dist/web/public/assets/heartbeat-DJRDS2GQ.js +7 -0
  308. package/dist/web/public/assets/heartbeat-DJRDS2GQ.js.map +1 -0
  309. package/dist/web/public/assets/hot-B1qKTiGD.js +17 -0
  310. package/dist/web/public/assets/hot-B1qKTiGD.js.map +1 -0
  311. package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
  312. package/dist/web/public/assets/index-XJngV1gH.js +166 -0
  313. package/dist/web/public/assets/index-XJngV1gH.js.map +1 -0
  314. package/dist/web/public/assets/installed-Dz4-KevJ.js +31 -0
  315. package/dist/web/public/assets/installed-Dz4-KevJ.js.map +1 -0
  316. package/dist/web/public/assets/{jobs-DdWaBgOh.js → jobs-kwOypiWd.js} +2 -2
  317. package/dist/web/public/assets/{jobs-DdWaBgOh.js.map → jobs-kwOypiWd.js.map} +1 -1
  318. package/dist/web/public/assets/layout-01n3Aibo.js +2 -0
  319. package/dist/web/public/assets/layout-01n3Aibo.js.map +1 -0
  320. package/dist/web/public/assets/layout-CVYe2vN8.js +2 -0
  321. package/dist/web/public/assets/layout-CVYe2vN8.js.map +1 -0
  322. package/dist/web/public/assets/{layout-Dr12u0W_.js → layout-CbHxH58i.js} +2 -2
  323. package/dist/web/public/assets/{layout-Dr12u0W_.js.map → layout-CbHxH58i.js.map} +1 -1
  324. package/dist/web/public/assets/layout-DD1Dei48.js +2 -0
  325. package/dist/web/public/assets/layout-DD1Dei48.js.map +1 -0
  326. package/dist/web/public/assets/{layout-BybpkTy0.js → layout-s11iwkL-.js} +2 -2
  327. package/dist/web/public/assets/{layout-BybpkTy0.js.map → layout-s11iwkL-.js.map} +1 -1
  328. package/dist/web/public/assets/llm-DPlK10Lg.js +7 -0
  329. package/dist/web/public/assets/llm-DPlK10Lg.js.map +1 -0
  330. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js → loader-circle-DymEG5Cl.js} +2 -2
  331. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js.map → loader-circle-DymEG5Cl.js.map} +1 -1
  332. package/dist/web/public/assets/{map-pin-B8hea8yW.js → map-pin-CyZg1-Jk.js} +2 -2
  333. package/dist/web/public/assets/{map-pin-B8hea8yW.js.map → map-pin-CyZg1-Jk.js.map} +1 -1
  334. package/dist/web/public/assets/mcp-CiifW_qp.js +7 -0
  335. package/dist/web/public/assets/mcp-CiifW_qp.js.map +1 -0
  336. package/dist/web/public/assets/{memos-C0_I1Uzt.js → memos-Bsiq64qW.js} +2 -2
  337. package/dist/web/public/assets/{memos-C0_I1Uzt.js.map → memos-Bsiq64qW.js.map} +1 -1
  338. package/dist/web/public/assets/{messengers-DuS5_JlE.js → messengers-alGJK9dO.js} +3 -3
  339. package/dist/web/public/assets/{messengers-DuS5_JlE.js.map → messengers-alGJK9dO.js.map} +1 -1
  340. package/dist/web/public/assets/native-agent-CgzcqRsU.js +7 -0
  341. package/dist/web/public/assets/native-agent-CgzcqRsU.js.map +1 -0
  342. package/dist/web/public/assets/{network-CpkocMHV.js → network-BSRJfeGk.js} +2 -2
  343. package/dist/web/public/assets/{network-CpkocMHV.js.map → network-BSRJfeGk.js.map} +1 -1
  344. package/dist/web/public/assets/{outbox-mGqTV2Ex.js → outbox-DSDls9xU.js} +3 -3
  345. package/dist/web/public/assets/{outbox-mGqTV2Ex.js.map → outbox-DSDls9xU.js.map} +1 -1
  346. package/dist/web/public/assets/{pagination-BAYvy11u.js → pagination-DVXNZ2ti.js} +3 -3
  347. package/dist/web/public/assets/{pagination-BAYvy11u.js.map → pagination-DVXNZ2ti.js.map} +1 -1
  348. package/dist/web/public/assets/{persona-CM0TLPJa.js → persona-BB1gIwTX.js} +2 -2
  349. package/dist/web/public/assets/{persona-CM0TLPJa.js.map → persona-BB1gIwTX.js.map} +1 -1
  350. package/dist/web/public/assets/{play-DMgMpe7N.js → play-CcECAHfL.js} +2 -2
  351. package/dist/web/public/assets/{play-DMgMpe7N.js.map → play-CcECAHfL.js.map} +1 -1
  352. package/dist/web/public/assets/plus-DrStBHss.js +7 -0
  353. package/dist/web/public/assets/plus-DrStBHss.js.map +1 -0
  354. package/dist/web/public/assets/policy-BgDYTxy7.js +2 -0
  355. package/dist/web/public/assets/{policy-Ch-xirrA.js.map → policy-BgDYTxy7.js.map} +1 -1
  356. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js → refresh-ccw-BBRPVLH8.js} +2 -2
  357. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js.map → refresh-ccw-BBRPVLH8.js.map} +1 -1
  358. package/dist/web/public/assets/{reminders-Dbe7Rc4h.js → reminders-jwy196Xw.js} +4 -9
  359. package/dist/web/public/assets/reminders-jwy196Xw.js.map +1 -0
  360. package/dist/web/public/assets/{save-1aALBaZc.js → save-iBtyruco.js} +2 -2
  361. package/dist/web/public/assets/{save-1aALBaZc.js.map → save-iBtyruco.js.map} +1 -1
  362. package/dist/web/public/assets/{schedules-BBQ2wcnS.js → schedules-DDl_Sr5r.js} +3 -3
  363. package/dist/web/public/assets/{schedules-BBQ2wcnS.js.map → schedules-DDl_Sr5r.js.map} +1 -1
  364. package/dist/web/public/assets/{search-DDYjsJ7-.js → search-Yb1S22sv.js} +2 -2
  365. package/dist/web/public/assets/{search-DDYjsJ7-.js.map → search-Yb1S22sv.js.map} +1 -1
  366. package/dist/web/public/assets/{service-DMp11TKF.js → service-jrg0kMtK.js} +3 -3
  367. package/dist/web/public/assets/{service-DMp11TKF.js.map → service-jrg0kMtK.js.map} +1 -1
  368. package/dist/web/public/assets/{status-badge-Cvj81JKi.js → status-badge-Arxyw3TL.js} +2 -2
  369. package/dist/web/public/assets/{status-badge-Cvj81JKi.js.map → status-badge-Arxyw3TL.js.map} +1 -1
  370. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js → subtasks-CkyuMv_X.js} +3 -3
  371. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js.map → subtasks-CkyuMv_X.js.map} +1 -1
  372. package/dist/web/public/assets/{table-B6nK6k3L.js → table-BKdG9tsY.js} +2 -2
  373. package/dist/web/public/assets/{table-B6nK6k3L.js.map → table-BKdG9tsY.js.map} +1 -1
  374. package/dist/web/public/assets/{topn-BwFh2jKv.js → topn-BpX8BKWS.js} +3 -3
  375. package/dist/web/public/assets/{topn-BwFh2jKv.js.map → topn-BpX8BKWS.js.map} +1 -1
  376. package/dist/web/public/assets/{trash-2-CqpMjbu5.js → trash-2-DxKJo_-6.js} +3 -3
  377. package/dist/web/public/assets/{trash-2-CqpMjbu5.js.map → trash-2-DxKJo_-6.js.map} +1 -1
  378. package/dist/web/public/assets/use-background-tasks-vqoDXiAq.js +2 -0
  379. package/dist/web/public/assets/use-background-tasks-vqoDXiAq.js.map +1 -0
  380. package/dist/web/public/assets/use-llm-admin-D4snixaM.js +2 -0
  381. package/dist/web/public/assets/use-llm-admin-D4snixaM.js.map +1 -0
  382. package/dist/web/public/assets/{use-memory-jxZdt-RL.js → use-memory-Cqf3xywK.js} +2 -2
  383. package/dist/web/public/assets/{use-memory-jxZdt-RL.js.map → use-memory-Cqf3xywK.js.map} +1 -1
  384. package/dist/web/public/assets/{use-observability-9TDgLO9y.js → use-observability-Thh7LWoE.js} +2 -2
  385. package/dist/web/public/assets/{use-observability-9TDgLO9y.js.map → use-observability-Thh7LWoE.js.map} +1 -1
  386. package/dist/web/public/assets/{use-settings-DFB_c2pr.js → use-settings-DRhH8owt.js} +2 -2
  387. package/dist/web/public/assets/{use-settings-DFB_c2pr.js.map → use-settings-DRhH8owt.js.map} +1 -1
  388. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js → use-workspace-iLKz-h_7.js} +2 -2
  389. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js.map → use-workspace-iLKz-h_7.js.map} +1 -1
  390. package/dist/web/public/assets/useQuery-gnz30xMJ.js +2 -0
  391. package/dist/web/public/assets/{useQuery-rLmHxFp4.js.map → useQuery-gnz30xMJ.js.map} +1 -1
  392. package/dist/web/public/assets/{vector-D9UqmLi6.js → vector-COjljy_4.js} +2 -2
  393. package/dist/web/public/assets/{vector-D9UqmLi6.js.map → vector-COjljy_4.js.map} +1 -1
  394. package/dist/web/public/assets/{viewer-_OpObeWr.js → viewer-AQHSc8hZ.js} +3 -3
  395. package/dist/web/public/assets/{viewer-_OpObeWr.js.map → viewer-AQHSc8hZ.js.map} +1 -1
  396. package/dist/web/public/assets/{workspace-DSHRdspq.js → workspace-DRtSCbx5.js} +4 -4
  397. package/dist/web/public/assets/{workspace-DSHRdspq.js.map → workspace-DRtSCbx5.js.map} +1 -1
  398. package/dist/web/public/assets/{workspaces-CsBdhbXz.js → workspaces-BLR5ZBu6.js} +3 -3
  399. package/dist/web/public/assets/{workspaces-CsBdhbXz.js.map → workspaces-BLR5ZBu6.js.map} +1 -1
  400. package/dist/web/public/assets/{x-D1re-vBd.js → x-DGQ0qjhc.js} +2 -2
  401. package/dist/web/public/assets/{x-D1re-vBd.js.map → x-DGQ0qjhc.js.map} +1 -1
  402. package/dist/web/public/index.html +2 -2
  403. package/dist/web/server.d.ts.map +1 -1
  404. package/dist/web/server.js +45 -0
  405. package/dist/web/server.js.map +1 -1
  406. package/package.json +2 -2
  407. package/dist/web/public/assets/agents-lrzFDGgX.js +0 -12
  408. package/dist/web/public/assets/agents-lrzFDGgX.js.map +0 -1
  409. package/dist/web/public/assets/hot-CFGHGkqL.js +0 -17
  410. package/dist/web/public/assets/hot-CFGHGkqL.js.map +0 -1
  411. package/dist/web/public/assets/index-C4hk1i67.js +0 -166
  412. package/dist/web/public/assets/index-C4hk1i67.js.map +0 -1
  413. package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
  414. package/dist/web/public/assets/installed-UONWfKHS.js +0 -7
  415. package/dist/web/public/assets/installed-UONWfKHS.js.map +0 -1
  416. package/dist/web/public/assets/layout-C8_IQRGM.js +0 -2
  417. package/dist/web/public/assets/layout-C8_IQRGM.js.map +0 -1
  418. package/dist/web/public/assets/layout-CxRHLqvi.js +0 -2
  419. package/dist/web/public/assets/layout-CxRHLqvi.js.map +0 -1
  420. package/dist/web/public/assets/layout-LC5zjw1h.js +0 -2
  421. package/dist/web/public/assets/layout-LC5zjw1h.js.map +0 -1
  422. package/dist/web/public/assets/policy-Ch-xirrA.js +0 -2
  423. package/dist/web/public/assets/reminders-Dbe7Rc4h.js.map +0 -1
  424. package/dist/web/public/assets/use-skills-OZKB5x-S.js +0 -2
  425. package/dist/web/public/assets/use-skills-OZKB5x-S.js.map +0 -1
  426. package/dist/web/public/assets/useQuery-rLmHxFp4.js +0 -2
@@ -0,0 +1,8 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ /**
3
+ * Match-and-handle dispatcher. Returns `true` when the request was
4
+ * served (caller should stop walking its own route table); `false`
5
+ * when the URL/method didn't match anything in this module.
6
+ */
7
+ export declare function handleLlmApi(req: IncomingMessage, res: ServerResponse, url: URL): Promise<boolean>;
8
+ //# sourceMappingURL=llm-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-api.d.ts","sourceRoot":"","sources":["../../src/web/llm-api.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAiDhE;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAClD,OAAO,CAAC,OAAO,CAAC,CA6BlB"}
@@ -0,0 +1,300 @@
1
+ // llm-api — web REST surface for the Stage 4 LLM-backend configuration
2
+ // UX. Mirrors what `agim setup llm` does on the CLI side, but lives
3
+ // behind the existing web auth model (operators only — gated by
4
+ // requireAdmin in the caller).
5
+ //
6
+ // Endpoints exposed:
7
+ //
8
+ // GET /api/llm → { backends, roles, status }
9
+ // POST /api/llm/backends body { name, provider, baseUrl, model, apiKey? }
10
+ // → 201 Created or 409 Conflict / 400 Validation
11
+ // DELETE /api/llm/backends/:name → 200 OK { removedRoles }
12
+ // PUT /api/llm/roles body { cheap?, evaluator?, "native-chat"?, … }
13
+ // → 200 OK; empty string / null deletes the binding
14
+ // POST /api/llm/secrets/:name body { apiKey } → 200 OK
15
+ // DELETE /api/llm/secrets/:name → 200 OK
16
+ //
17
+ // All write paths run the merged config through configSchema BEFORE
18
+ // touching disk so a typo can't poison ~/.agim/config.json — same
19
+ // safety net as the CLI wizard.
20
+ import { readFile, writeFile, mkdir, chmod } from 'node:fs/promises';
21
+ import { join } from 'node:path';
22
+ import { AGIM_HOME } from '../core/agim-paths.js';
23
+ import { configSchema } from '../core/config-schema.js';
24
+ import { saveSecret, removeSecret, describeSecretSource, } from '../core/llm/secrets.js';
25
+ import { getProviderByName, loadFromConfig as loadLlmFromConfig } from '../core/llm/registry.js';
26
+ const CONFIG_FILE = join(AGIM_HOME, 'config.json');
27
+ // ─── HTTP helpers (deliberately tiny — server.ts has its own JSON
28
+ // helpers; we copy the shape here to keep this module standalone) ─
29
+ function send(res, code, body) {
30
+ res.statusCode = code;
31
+ res.setHeader('Content-Type', 'application/json; charset=utf-8');
32
+ res.end(JSON.stringify(body));
33
+ }
34
+ async function readJsonBody(req) {
35
+ const chunks = [];
36
+ for await (const c of req)
37
+ chunks.push(Buffer.isBuffer(c) ? c : Buffer.from(c));
38
+ const raw = Buffer.concat(chunks).toString('utf-8');
39
+ if (!raw.trim())
40
+ return null;
41
+ try {
42
+ return JSON.parse(raw);
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ // ─── routing ────────────────────────────────────────────────────────
49
+ /**
50
+ * Match-and-handle dispatcher. Returns `true` when the request was
51
+ * served (caller should stop walking its own route table); `false`
52
+ * when the URL/method didn't match anything in this module.
53
+ */
54
+ export async function handleLlmApi(req, res, url) {
55
+ const p = url.pathname;
56
+ const m = req.method ?? 'GET';
57
+ if (p === '/api/llm' && m === 'GET') {
58
+ await handleList(res);
59
+ return true;
60
+ }
61
+ if (p === '/api/llm/backends' && m === 'POST') {
62
+ await handleAddBackend(req, res);
63
+ return true;
64
+ }
65
+ if (p === '/api/llm/roles' && m === 'PUT') {
66
+ await handlePutRoles(req, res);
67
+ return true;
68
+ }
69
+ const rmBackend = p.match(/^\/api\/llm\/backends\/([A-Za-z0-9-]+)$/);
70
+ if (rmBackend && m === 'DELETE') {
71
+ await handleRemoveBackend(res, rmBackend[1]);
72
+ return true;
73
+ }
74
+ const setSecret = p.match(/^\/api\/llm\/secrets\/([A-Za-z0-9-]+)$/);
75
+ if (setSecret && m === 'POST') {
76
+ await handleSetSecret(req, res, setSecret[1]);
77
+ return true;
78
+ }
79
+ if (setSecret && m === 'DELETE') {
80
+ await handleRemoveSecret(res, setSecret[1]);
81
+ return true;
82
+ }
83
+ const pingBackend = p.match(/^\/api\/llm\/backends\/([A-Za-z0-9-]+)\/ping$/);
84
+ if (pingBackend && m === 'POST') {
85
+ await handlePing(res, pingBackend[1]);
86
+ return true;
87
+ }
88
+ return false;
89
+ }
90
+ // ─── handlers ───────────────────────────────────────────────────────
91
+ async function handleList(res) {
92
+ const cfg = await readConfig();
93
+ const backends = (cfg.llmBackends ?? []).map((b) => {
94
+ const src = describeSecretSource(b.name);
95
+ return {
96
+ name: b.name,
97
+ provider: b.provider,
98
+ baseUrl: b.baseUrl,
99
+ model: b.model,
100
+ secret: { source: src.source, envKey: src.envKey },
101
+ };
102
+ });
103
+ send(res, 200, {
104
+ backends,
105
+ roles: cfg.llmRoles ?? {},
106
+ });
107
+ }
108
+ async function handleAddBackend(req, res) {
109
+ const body = await readJsonBody(req);
110
+ if (!body || typeof body !== 'object') {
111
+ send(res, 400, { error: 'request body must be a JSON object' });
112
+ return;
113
+ }
114
+ const name = typeof body.name === 'string' ? body.name.trim() : '';
115
+ const provider = body.provider;
116
+ const baseUrl = typeof body.baseUrl === 'string' ? body.baseUrl.trim() : '';
117
+ const model = typeof body.model === 'string' ? body.model.trim() : '';
118
+ const apiKey = typeof body.apiKey === 'string' ? body.apiKey.trim() : '';
119
+ if (!name || !/^[A-Za-z0-9][A-Za-z0-9-]*$/.test(name)) {
120
+ send(res, 400, { error: 'name is required and must match [A-Za-z0-9][A-Za-z0-9-]*' });
121
+ return;
122
+ }
123
+ if (provider !== 'openai-compat' && provider !== 'anthropic') {
124
+ send(res, 400, { error: 'provider must be "openai-compat" or "anthropic"' });
125
+ return;
126
+ }
127
+ if (!baseUrl || !/^https?:\/\//i.test(baseUrl)) {
128
+ send(res, 400, { error: 'baseUrl must be an http(s) URL' });
129
+ return;
130
+ }
131
+ if (!model) {
132
+ send(res, 400, { error: 'model is required' });
133
+ return;
134
+ }
135
+ const cfg = await readConfig();
136
+ const existing = cfg.llmBackends ?? [];
137
+ if (existing.some((b) => b.name === name)) {
138
+ send(res, 409, { error: `backend "${name}" already exists` });
139
+ return;
140
+ }
141
+ const next = { name, provider, baseUrl, model };
142
+ cfg.llmBackends = [...existing, next];
143
+ const parsed = configSchema.safeParse(cfg);
144
+ if (!parsed.success) {
145
+ send(res, 400, {
146
+ error: 'config validation failed',
147
+ issues: parsed.error.issues.map((i) => i.message),
148
+ });
149
+ return;
150
+ }
151
+ await writeConfig(cfg);
152
+ if (apiKey)
153
+ saveSecret(name, apiKey);
154
+ send(res, 201, { name, secretStored: !!apiKey });
155
+ }
156
+ async function handleRemoveBackend(res, name) {
157
+ const cfg = await readConfig();
158
+ const backends = cfg.llmBackends ?? [];
159
+ const next = backends.filter((b) => b.name !== name);
160
+ if (next.length === backends.length) {
161
+ send(res, 404, { error: `no backend named "${name}"` });
162
+ return;
163
+ }
164
+ cfg.llmBackends = next;
165
+ const roles = cfg.llmRoles ?? {};
166
+ const cleaned = {};
167
+ let removedRoles = 0;
168
+ for (const [r, b] of Object.entries(roles)) {
169
+ if (b === name) {
170
+ removedRoles++;
171
+ continue;
172
+ }
173
+ cleaned[r] = b;
174
+ }
175
+ cfg.llmRoles = cleaned;
176
+ await writeConfig(cfg);
177
+ removeSecret(name);
178
+ send(res, 200, { removedRoles });
179
+ }
180
+ async function handlePutRoles(req, res) {
181
+ const body = await readJsonBody(req);
182
+ if (!body || typeof body !== 'object') {
183
+ send(res, 400, { error: 'request body must be a JSON object' });
184
+ return;
185
+ }
186
+ const cfg = await readConfig();
187
+ const backendNames = new Set((cfg.llmBackends ?? []).map((b) => b.name));
188
+ const current = cfg.llmRoles ?? {};
189
+ const next = { ...current };
190
+ for (const [rawRole, rawValue] of Object.entries(body)) {
191
+ const role = rawRole.trim();
192
+ if (!role)
193
+ continue;
194
+ if (rawValue === null || rawValue === '' || rawValue === undefined) {
195
+ delete next[role];
196
+ continue;
197
+ }
198
+ if (typeof rawValue !== 'string') {
199
+ send(res, 400, { error: `role "${role}" must be a string (backend name) or null/empty to unbind` });
200
+ return;
201
+ }
202
+ const target = rawValue.trim();
203
+ if (!backendNames.has(target)) {
204
+ send(res, 400, { error: `role "${role}" references unknown backend "${target}"` });
205
+ return;
206
+ }
207
+ next[role] = target;
208
+ }
209
+ cfg.llmRoles = next;
210
+ const parsed = configSchema.safeParse(cfg);
211
+ if (!parsed.success) {
212
+ send(res, 400, {
213
+ error: 'config validation failed',
214
+ issues: parsed.error.issues.map((i) => i.message),
215
+ });
216
+ return;
217
+ }
218
+ await writeConfig(cfg);
219
+ send(res, 200, { roles: next });
220
+ }
221
+ async function handleSetSecret(req, res, name) {
222
+ const cfg = await readConfig();
223
+ if (!(cfg.llmBackends ?? []).some((b) => b.name === name)) {
224
+ send(res, 404, { error: `no backend named "${name}"` });
225
+ return;
226
+ }
227
+ const body = await readJsonBody(req);
228
+ if (!body || typeof body.apiKey !== 'string' || !body.apiKey.trim()) {
229
+ send(res, 400, { error: 'apiKey is required (non-empty string)' });
230
+ return;
231
+ }
232
+ saveSecret(name, body.apiKey.trim());
233
+ const src = describeSecretSource(name);
234
+ send(res, 200, { name, source: src.source });
235
+ }
236
+ async function handleRemoveSecret(res, name) {
237
+ removeSecret(name);
238
+ send(res, 200, { name });
239
+ }
240
+ async function handlePing(res, name) {
241
+ // Stage 6 — backend ping. Loads the config (so a newly-added backend
242
+ // is reachable even before agim restarts), looks up the provider,
243
+ // and issues a tiny chat probe ('ping') with a tight timeout. The
244
+ // response shape is operator-debug-flavored: ok / errorClass / ms /
245
+ // sampleText / tokens. Failures DO NOT throw — they land as ok:false
246
+ // with a readable error string the UI can show.
247
+ const cfg = await readConfig();
248
+ if (!(cfg.llmBackends ?? []).some((b) => b.name === name)) {
249
+ send(res, 404, { error: `no backend named "${name}"` });
250
+ return;
251
+ }
252
+ loadLlmFromConfig(cfg);
253
+ const provider = getProviderByName(name);
254
+ if (!provider) {
255
+ send(res, 200, {
256
+ name, ok: false,
257
+ error: 'backend not in registry (likely missing API key)',
258
+ });
259
+ return;
260
+ }
261
+ const startedAt = Date.now();
262
+ try {
263
+ const r = await provider.chat([{ role: 'user', content: 'ping' }], { timeoutMs: 10_000, maxTokens: 16 });
264
+ send(res, 200, {
265
+ name, ok: true,
266
+ durationMs: Date.now() - startedAt,
267
+ tokensIn: r.usage.promptTokens,
268
+ tokensOut: r.usage.completionTokens,
269
+ sampleText: r.text.slice(0, 200),
270
+ });
271
+ }
272
+ catch (err) {
273
+ send(res, 200, {
274
+ name, ok: false,
275
+ durationMs: Date.now() - startedAt,
276
+ error: err instanceof Error ? err.message : String(err),
277
+ });
278
+ }
279
+ }
280
+ // ─── disk helpers ───────────────────────────────────────────────────
281
+ async function readConfig() {
282
+ try {
283
+ const raw = await readFile(CONFIG_FILE, 'utf-8');
284
+ return JSON.parse(raw);
285
+ }
286
+ catch (err) {
287
+ if (err.code === 'ENOENT')
288
+ return {};
289
+ throw err;
290
+ }
291
+ }
292
+ async function writeConfig(cfg) {
293
+ await mkdir(AGIM_HOME, { recursive: true, mode: 0o700 });
294
+ await writeFile(CONFIG_FILE, JSON.stringify(cfg, null, 2), { mode: 0o600 });
295
+ try {
296
+ await chmod(CONFIG_FILE, 0o600);
297
+ }
298
+ catch { /* ignore on Windows */ }
299
+ }
300
+ //# sourceMappingURL=llm-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-api.js","sourceRoot":"","sources":["../../src/web/llm-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ /**
3
+ * Match-and-handle dispatcher. Returns `true` when the request was
4
+ * served (caller should stop walking its own route table); `false`
5
+ * when the URL/method didn't match.
6
+ */
7
+ export declare function handleMcpApi(req: IncomingMessage, res: ServerResponse, url: URL): Promise<boolean>;
8
+ //# sourceMappingURL=mcp-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-api.d.ts","sourceRoot":"","sources":["../../src/web/mcp-api.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAiDhE;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAClD,OAAO,CAAC,OAAO,CAAC,CAsBlB"}
@@ -0,0 +1,205 @@
1
+ // mcp-api — web REST surface for the Stage 6 MCP-servers configuration
2
+ // UX. Mirrors `/api/llm/*` shape; the operator can list, add, remove
3
+ // external MCP servers and probe their health from the web console
4
+ // without hand-editing `~/.agim/config.json`.
5
+ //
6
+ // Endpoints exposed:
7
+ //
8
+ // GET /api/mcp → { servers, connected }
9
+ // POST /api/mcp/servers body { name, command|url, args?, headers?, ... }
10
+ // → 201 / 400 validation / 409 conflict
11
+ // DELETE /api/mcp/servers/:name → 200 OK
12
+ // POST /api/mcp/servers/:name/health → 200 { connected, toolCount, lastError? }
13
+ // (re-probes by calling listAvailableTools)
14
+ // POST /api/mcp/reload → 200 { connected: number } — reload from config.json
15
+ // and reconnect all (used after manual JSON edits)
16
+ //
17
+ // All write paths run the merged config through configSchema BEFORE
18
+ // touching disk — same safety net as `/api/llm/*`.
19
+ import { readFile, writeFile, mkdir, chmod } from 'node:fs/promises';
20
+ import { join } from 'node:path';
21
+ import { AGIM_HOME } from '../core/agim-paths.js';
22
+ import { configSchema } from '../core/config-schema.js';
23
+ import { loadFromConfig as loadMcpFromConfig, connectAll as connectAllMcp, describeRegistry as describeMcpRegistry, } from '../core/llm/mcp-registry.js';
24
+ const CONFIG_FILE = join(AGIM_HOME, 'config.json');
25
+ // ─── HTTP helpers (tiny, no shared mock-friendly base needed) ────────
26
+ function send(res, code, body) {
27
+ res.statusCode = code;
28
+ res.setHeader('Content-Type', 'application/json; charset=utf-8');
29
+ res.end(JSON.stringify(body));
30
+ }
31
+ async function readJsonBody(req) {
32
+ const chunks = [];
33
+ for await (const c of req)
34
+ chunks.push(Buffer.isBuffer(c) ? c : Buffer.from(c));
35
+ const raw = Buffer.concat(chunks).toString('utf-8');
36
+ if (!raw.trim())
37
+ return null;
38
+ try {
39
+ return JSON.parse(raw);
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ // ─── routing ────────────────────────────────────────────────────────
46
+ /**
47
+ * Match-and-handle dispatcher. Returns `true` when the request was
48
+ * served (caller should stop walking its own route table); `false`
49
+ * when the URL/method didn't match.
50
+ */
51
+ export async function handleMcpApi(req, res, url) {
52
+ const p = url.pathname;
53
+ const m = req.method ?? 'GET';
54
+ if (p === '/api/mcp' && m === 'GET') {
55
+ await handleList(res);
56
+ return true;
57
+ }
58
+ if (p === '/api/mcp/servers' && m === 'POST') {
59
+ await handleAddServer(req, res);
60
+ return true;
61
+ }
62
+ if (p === '/api/mcp/reload' && m === 'POST') {
63
+ await handleReload(res);
64
+ return true;
65
+ }
66
+ const removeMatch = p.match(/^\/api\/mcp\/servers\/([A-Za-z0-9._-]+)$/);
67
+ if (removeMatch && m === 'DELETE') {
68
+ await handleRemoveServer(res, removeMatch[1]);
69
+ return true;
70
+ }
71
+ const healthMatch = p.match(/^\/api\/mcp\/servers\/([A-Za-z0-9._-]+)\/health$/);
72
+ if (healthMatch && m === 'POST') {
73
+ await handleHealth(res, healthMatch[1]);
74
+ return true;
75
+ }
76
+ return false;
77
+ }
78
+ // ─── handlers ───────────────────────────────────────────────────────
79
+ async function handleList(res) {
80
+ const cfg = await readConfig();
81
+ const servers = (cfg.mcpServers ?? []).map((s) => sanitizeServer(s));
82
+ // Best-effort runtime status — empty when the registry hasn't been
83
+ // loaded (agim daemon may not have called loadMcpFromConfig yet).
84
+ let snap = { servers: [], totalTools: 0 };
85
+ try {
86
+ snap = describeMcpRegistry();
87
+ }
88
+ catch { /* registry not initialized */ }
89
+ send(res, 200, { servers, runtime: snap });
90
+ }
91
+ async function handleAddServer(req, res) {
92
+ const body = await readJsonBody(req);
93
+ if (!body || typeof body !== 'object') {
94
+ send(res, 400, { error: 'request body must be a JSON object' });
95
+ return;
96
+ }
97
+ const cfg = await readConfig();
98
+ const existing = cfg.mcpServers ?? [];
99
+ if (existing.some((s) => s.name === body.name)) {
100
+ send(res, 409, { error: `mcp server "${body.name}" already exists` });
101
+ return;
102
+ }
103
+ cfg.mcpServers = [...existing, body];
104
+ // Validate via configSchema before writing — same gate the CLI uses.
105
+ // mcpServerSchema's superRefine catches the "neither command nor url"
106
+ // and "both set" cases with a readable issue string.
107
+ const parsed = configSchema.safeParse(cfg);
108
+ if (!parsed.success) {
109
+ send(res, 400, {
110
+ error: 'config validation failed',
111
+ issues: parsed.error.issues.map((i) => i.message),
112
+ });
113
+ return;
114
+ }
115
+ await writeConfig(cfg);
116
+ send(res, 201, { name: body.name });
117
+ }
118
+ async function handleRemoveServer(res, name) {
119
+ const cfg = await readConfig();
120
+ const servers = cfg.mcpServers ?? [];
121
+ const next = servers.filter((s) => s.name !== name);
122
+ if (next.length === servers.length) {
123
+ send(res, 404, { error: `no mcp server named "${name}"` });
124
+ return;
125
+ }
126
+ cfg.mcpServers = next;
127
+ await writeConfig(cfg);
128
+ send(res, 200, { name });
129
+ }
130
+ /**
131
+ * Re-probe an existing server: reload registry from on-disk config,
132
+ * connect, return the per-server status. Cheap enough to do
133
+ * synchronously per UI button-press; the actual reconnect can take a
134
+ * second or two for stdio servers spawning subprocesses.
135
+ */
136
+ async function handleHealth(res, name) {
137
+ const cfg = await readConfig();
138
+ if (!(cfg.mcpServers ?? []).some((s) => s.name === name)) {
139
+ send(res, 404, { error: `no mcp server named "${name}"` });
140
+ return;
141
+ }
142
+ try {
143
+ loadMcpFromConfig(cfg);
144
+ await connectAllMcp();
145
+ const snap = describeMcpRegistry();
146
+ const row = snap.servers.find((r) => r.name === name);
147
+ if (!row) {
148
+ send(res, 200, { name, connected: false, toolCount: 0, lastError: 'server not registered after reload' });
149
+ return;
150
+ }
151
+ send(res, 200, {
152
+ name,
153
+ connected: row.connected,
154
+ toolCount: row.toolCount,
155
+ ...(row.error ? { lastError: row.error } : {}),
156
+ });
157
+ }
158
+ catch (err) {
159
+ send(res, 200, {
160
+ name, connected: false, toolCount: 0,
161
+ lastError: err instanceof Error ? err.message : String(err),
162
+ });
163
+ }
164
+ }
165
+ async function handleReload(res) {
166
+ const cfg = await readConfig();
167
+ loadMcpFromConfig(cfg);
168
+ const r = await connectAllMcp();
169
+ send(res, 200, {
170
+ requested: r.ok.length + Object.keys(r.failed).length,
171
+ connected: r.ok.length,
172
+ failed: r.failed,
173
+ toolCount: r.toolCount,
174
+ });
175
+ }
176
+ // ─── helpers ────────────────────────────────────────────────────────
177
+ /** Strip nothing — mcp configs don't contain secrets the way LLM ones
178
+ * do. Operator-supplied headers MAY contain bearer tokens; for now
179
+ * we surface them as-is in the API response. SECURITY: the /api/mcp
180
+ * GET is gated by requireAdmin upstream (see server.ts), so this is
181
+ * admin-only data. If we later add operator-scoped read-only views,
182
+ * this is where we'd mask `headers.Authorization`. */
183
+ function sanitizeServer(s) {
184
+ return s;
185
+ }
186
+ async function readConfig() {
187
+ try {
188
+ const raw = await readFile(CONFIG_FILE, 'utf-8');
189
+ return JSON.parse(raw);
190
+ }
191
+ catch (err) {
192
+ if (err.code === 'ENOENT')
193
+ return {};
194
+ throw err;
195
+ }
196
+ }
197
+ async function writeConfig(cfg) {
198
+ await mkdir(AGIM_HOME, { recursive: true, mode: 0o700 });
199
+ await writeFile(CONFIG_FILE, JSON.stringify(cfg, null, 2), { mode: 0o600 });
200
+ try {
201
+ await chmod(CONFIG_FILE, 0o600);
202
+ }
203
+ catch { /* ignore on Windows */ }
204
+ }
205
+ //# sourceMappingURL=mcp-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-api.js","sourceRoot":"","sources":["../../src/web/mcp-api.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import{x as p,aa as f,q as o,ac as g,Q as t,r as m,c as j}from"./index-C4hk1i67.js";import{e as N}from"./react-C9F3QeMB.js";import{D as y}from"./data-table-BRLUxacD.js";import{E as b}from"./empty-state-DZJTUlvz.js";import{S as w}from"./status-badge-Cvj81JKi.js";import{u as x}from"./useQuery-rLmHxFp4.js";import{u as v}from"./use-event-stream-BGeFcayX.js";import{L as A}from"./loader-circle-BiR4Xs-3.js";import{R as S}from"./refresh-ccw-D8mc4hxU.js";import"./table-B6nK6k3L.js";/**
1
+ import{y as p,ab as f,q as o,ad as g,U as t,s as m,c as j}from"./index-XJngV1gH.js";import{e as N}from"./react-C9F3QeMB.js";import{D as y}from"./data-table-Dw4Df09-.js";import{E as b}from"./empty-state-D8QXQ5y9.js";import{S as w}from"./status-badge-Arxyw3TL.js";import{u as x}from"./useQuery-gnz30xMJ.js";import{u as v}from"./use-event-stream-BGeFcayX.js";import{L as A}from"./loader-circle-DymEG5Cl.js";import{R as S}from"./refresh-ccw-BBRPVLH8.js";import"./table-BKdG9tsY.js";/**
2
2
  * @license lucide-react v0.469.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
- */const C=p("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]),l={all:["a2a"],stats:["a2a","stats"],recent:e=>["a2a","recent",e]};function q(){return x({queryKey:l.stats,queryFn:()=>o.getA2AStats()})}function T(e){return x({queryKey:l.recent(e),queryFn:()=>o.getA2ARecent(e)})}function E(){const e=f();return()=>e.invalidateQueries({queryKey:l.all})}const L={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function z(){const{t:e}=g(["tasks","common"]),s=E(),n=q(),r=T({limit:50}),u=r.data?.rows??[],c=n.data,d=v({job:()=>s()}),h=N.useMemo(()=>[{id:"id",header:e("a2a.col.id"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.id]}),headClassName:"w-16"},{id:"agent",header:e("a2a.col.agent"),cell:a=>t.jsx("span",{className:"font-medium",children:a.agent}),headClassName:"w-32"},{id:"parent",header:e("a2a.col.parent"),cell:a=>a.parent_id!=null?t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.parent_id]}):t.jsx("span",{className:"text-text-muted",children:"—"}),headClassName:"w-20"},{id:"depth",header:e("a2a.col.depth"),cell:a=>t.jsx("span",{className:"tabular-nums text-text-dim",children:a.call_depth}),headClassName:"w-16",hideOnMobile:!0},{id:"status",header:e("a2a.col.status"),cell:a=>t.jsx(w,{status:a.status,children:a.status}),headClassName:"w-28"},{id:"prompt",header:e("a2a.col.prompt"),cell:a=>t.jsx("span",{className:"line-clamp-2 text-text-dim",children:a.prompt??"—"}),asCardTitle:!0},{id:"createdAt",header:e("a2a.col.createdAt"),cell:a=>t.jsx("span",{className:"text-text-dim",children:R(a.created_at)}),headClassName:"w-40",hideOnMobile:!0}],[e]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("a2a.title")}),t.jsx("span",{className:m("text-xs font-medium tabular-nums",L[d]),children:e(`jobs.live.${d}`)}),t.jsxs(j,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{r.refetch(),n.refetch()},disabled:r.isFetching||n.isFetching,"aria-label":e("actions.refresh",{ns:"common"}),children:[r.isFetching?t.jsx(A,{className:"h-4 w-4 animate-spin"}):t.jsx(S,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),t.jsx("p",{className:"text-sm text-text-dim",children:e("a2a.subtitle")})]}),c&&t.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[t.jsx(i,{label:e("a2a.stats.total"),value:c.total,tone:"info"}),t.jsx(i,{label:e("a2a.stats.recent24h"),value:c.recent24h,tone:"success"}),t.jsx(i,{label:e("a2a.stats.maxDepth"),value:c.maxDepth,tone:"warning"})]}),t.jsx(y,{columns:h,rows:u,getRowId:a=>String(a.id),loading:r.isLoading,emptyState:t.jsx(b,{icon:t.jsx(C,{}),title:e("a2a.empty.title"),description:e("a2a.empty.description")})})]})}const k={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function i({label:e,value:s,tone:n}){return t.jsxs("div",{className:m("rounded-md border bg-surface px-3 py-2",k[n]),children:[t.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:e}),t.jsx("div",{className:"text-2xl font-semibold tabular-nums",children:s})]})}function R(e){try{const s=new Date(e);return Number.isNaN(s.getTime())?e:s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}export{z as default};
7
- //# sourceMappingURL=a2a-Cdl8iY0e.js.map
6
+ */const C=p("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]),l={all:["a2a"],stats:["a2a","stats"],recent:e=>["a2a","recent",e]};function q(){return x({queryKey:l.stats,queryFn:()=>o.getA2AStats()})}function T(e){return x({queryKey:l.recent(e),queryFn:()=>o.getA2ARecent(e)})}function E(){const e=f();return()=>e.invalidateQueries({queryKey:l.all})}const L={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function U(){const{t:e}=g(["tasks","common"]),s=E(),n=q(),r=T({limit:50}),u=r.data?.rows??[],i=n.data,d=v({job:()=>s()}),h=N.useMemo(()=>[{id:"id",header:e("a2a.col.id"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.id]}),headClassName:"w-16"},{id:"agent",header:e("a2a.col.agent"),cell:a=>t.jsx("span",{className:"font-medium",children:a.agent}),headClassName:"w-32"},{id:"parent",header:e("a2a.col.parent"),cell:a=>a.parent_id!=null?t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.parent_id]}):t.jsx("span",{className:"text-text-muted",children:"—"}),headClassName:"w-20"},{id:"depth",header:e("a2a.col.depth"),cell:a=>t.jsx("span",{className:"tabular-nums text-text-dim",children:a.call_depth}),headClassName:"w-16",hideOnMobile:!0},{id:"status",header:e("a2a.col.status"),cell:a=>t.jsx(w,{status:a.status,children:a.status}),headClassName:"w-28"},{id:"prompt",header:e("a2a.col.prompt"),cell:a=>t.jsx("span",{className:"line-clamp-2 text-text-dim",children:a.prompt??"—"}),asCardTitle:!0},{id:"createdAt",header:e("a2a.col.createdAt"),cell:a=>t.jsx("span",{className:"text-text-dim",children:R(a.created_at)}),headClassName:"w-40",hideOnMobile:!0}],[e]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("a2a.title")}),t.jsx("span",{className:m("text-xs font-medium tabular-nums",L[d]),children:e(`jobs.live.${d}`)}),t.jsxs(j,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{r.refetch(),n.refetch()},disabled:r.isFetching||n.isFetching,"aria-label":e("actions.refresh",{ns:"common"}),children:[r.isFetching?t.jsx(A,{className:"h-4 w-4 animate-spin"}):t.jsx(S,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),t.jsx("p",{className:"text-sm text-text-dim",children:e("a2a.subtitle")})]}),i&&t.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[t.jsx(c,{label:e("a2a.stats.total"),value:i.total,tone:"info"}),t.jsx(c,{label:e("a2a.stats.recent24h"),value:i.recent24h,tone:"success"}),t.jsx(c,{label:e("a2a.stats.maxDepth"),value:i.maxDepth,tone:"warning"})]}),t.jsx(y,{columns:h,rows:u,getRowId:a=>String(a.id),loading:r.isLoading,emptyState:t.jsx(b,{icon:t.jsx(C,{}),title:e("a2a.empty.title"),description:e("a2a.empty.description")})})]})}const k={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function c({label:e,value:s,tone:n}){return t.jsxs("div",{className:m("rounded-md border bg-surface px-3 py-2",k[n]),children:[t.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:e}),t.jsx("div",{className:"text-2xl font-semibold tabular-nums",children:s})]})}function R(e){try{const s=new Date(e);return Number.isNaN(s.getTime())?e:s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}export{U as default};
7
+ //# sourceMappingURL=a2a-Mke0F7ZM.js.map