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,73 @@
1
+ import { type LlmRole } from './registry.js';
2
+ import { type LlmUsage } from './provider-base.js';
3
+ export interface IntrospectionInput {
4
+ /** Role name to look up in the registry. */
5
+ role: LlmRole;
6
+ /** The user prompt. Required. */
7
+ prompt: string;
8
+ /** Optional system prompt prepended as a system message. */
9
+ system?: string;
10
+ /** Hard deadline. Default 30s — short enough that a stuck provider
11
+ * trips fallback fast, long enough that legitimate JSON extraction
12
+ * on a free-tier model completes. */
13
+ timeoutMs?: number;
14
+ /** Caller may pass through an AbortSignal (e.g. distill's queue is
15
+ * draining); we merge it with timeoutMs. */
16
+ signal?: AbortSignal;
17
+ /** Per-call temperature override (cheap callers usually want 0.2; the
18
+ * provider default is already low so this is rarely needed). */
19
+ temperature?: number;
20
+ /** Per-call model override; falls back to the provider's default. */
21
+ model?: string;
22
+ }
23
+ export interface IntrospectionResult {
24
+ /** Plain text body. Empty string means "model returned nothing useful";
25
+ * the caller decides whether that's a failure. */
26
+ text: string;
27
+ /** Aggregate usage from the provider. */
28
+ usage: LlmUsage;
29
+ /** Backend name that handled the request; useful for audit rows. */
30
+ backendName: string;
31
+ /** Provider type label (e.g. "deepseek" / "openai-compat") for the
32
+ * cost dashboard. */
33
+ providerType: string;
34
+ /** Elapsed wall-clock time. */
35
+ durationMs: number;
36
+ }
37
+ /**
38
+ * Try to satisfy the introspection request via the configured backend
39
+ * for `role`. Returns null when:
40
+ * - no provider is wired for this role, OR
41
+ * - the provider call failed (errors are logged + classified, never
42
+ * re-thrown — the caller's fallback path takes over).
43
+ *
44
+ * The "return null on failure" contract is exactly what distill /
45
+ * consolidate / intent want: they then fall back to spawning their
46
+ * CLI agent and the user notices nothing.
47
+ */
48
+ export declare function tryIntrospect(input: IntrospectionInput): Promise<IntrospectionResult | null>;
49
+ /**
50
+ * Stage 5 — try a CHAIN of roles in order until one returns a non-null
51
+ * result. The chain is operator-configurable per call (typically
52
+ * ['cheap', 'native-chat', 'evaluator'] for low-stakes introspection
53
+ * that should escalate to a smarter / different vendor on failure).
54
+ *
55
+ * Returns the first successful IntrospectionResult, augmented with
56
+ * `triedRoles` so the caller can audit which roles got skipped. When
57
+ * every role in the chain returns null, returns null — the caller's
58
+ * existing CLI-fallback path takes over (same contract as
59
+ * tryIntrospect).
60
+ */
61
+ export interface IntrospectionChainInput extends Omit<IntrospectionInput, 'role'> {
62
+ /** Roles to try in order. Empty array returns null immediately. */
63
+ roles: LlmRole[];
64
+ /** Per-role wall-clock cap (default 30s). */
65
+ perRoleTimeoutMs?: number;
66
+ }
67
+ export interface IntrospectionChainResult extends IntrospectionResult {
68
+ /** Roles attempted in order, including the one that succeeded
69
+ * (always last). Lets the caller log "we fell back twice". */
70
+ triedRoles: LlmRole[];
71
+ }
72
+ export declare function tryIntrospectChain(input: IntrospectionChainInput): Promise<IntrospectionChainResult | null>;
73
+ //# sourceMappingURL=introspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspection.d.ts","sourceRoot":"","sources":["../../../src/core/llm/introspection.ts"],"names":[],"mappings":"AAUA,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAIrF,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,IAAI,EAAE,OAAO,CAAA;IACb,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;0CAEsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;iDAC6C;IAC7C,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB;qEACiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC;uDACmD;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,KAAK,EAAE,QAAQ,CAAA;IACf,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAA;IACnB;0BACsB;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAmClG;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,uBACf,SAAQ,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACxC,mEAAmE;IACnE,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE;mEAC+D;IAC/D,UAAU,EAAE,OAAO,EAAE,CAAA;CACtB;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CA2B1C"}
@@ -0,0 +1,90 @@
1
+ // Introspection helper — bridges the registry to the existing CLI-style
2
+ // "give me a string back" pattern that distill / consolidate / intent
3
+ // already use.
4
+ //
5
+ // Callers don't want to know about LlmMessage[] / ChatResult. They have
6
+ // a flat prompt string and a per-call deadline; they want a Promise<{
7
+ // text, costUsd }> back. This file does that mapping in one place so
8
+ // every introspection caller stays a 1-line change.
9
+ import { logger as rootLogger } from '../logger.js';
10
+ import { getProvider } from './registry.js';
11
+ import { LlmProviderError } from './provider-base.js';
12
+ const log = rootLogger.child({ component: 'llm-introspection' });
13
+ /**
14
+ * Try to satisfy the introspection request via the configured backend
15
+ * for `role`. Returns null when:
16
+ * - no provider is wired for this role, OR
17
+ * - the provider call failed (errors are logged + classified, never
18
+ * re-thrown — the caller's fallback path takes over).
19
+ *
20
+ * The "return null on failure" contract is exactly what distill /
21
+ * consolidate / intent want: they then fall back to spawning their
22
+ * CLI agent and the user notices nothing.
23
+ */
24
+ export async function tryIntrospect(input) {
25
+ const provider = getProvider(input.role);
26
+ if (!provider)
27
+ return null;
28
+ const messages = [{ role: 'user', content: input.prompt }];
29
+ const startedAt = Date.now();
30
+ try {
31
+ const result = await provider.chat(messages, {
32
+ system: input.system,
33
+ timeoutMs: input.timeoutMs ?? 30_000,
34
+ signal: input.signal,
35
+ temperature: input.temperature,
36
+ model: input.model,
37
+ });
38
+ return {
39
+ text: result.text,
40
+ usage: result.usage,
41
+ backendName: provider.name,
42
+ providerType: provider.providerType,
43
+ durationMs: Date.now() - startedAt,
44
+ };
45
+ }
46
+ catch (err) {
47
+ const transient = err instanceof LlmProviderError ? err.transient : false;
48
+ const httpStatus = err instanceof LlmProviderError ? err.httpStatus : undefined;
49
+ log.warn({
50
+ event: 'llm.introspect.failed',
51
+ role: input.role,
52
+ backend: provider.name,
53
+ providerType: provider.providerType,
54
+ transient,
55
+ httpStatus,
56
+ err: err instanceof Error ? err.message : String(err),
57
+ });
58
+ return null;
59
+ }
60
+ }
61
+ export async function tryIntrospectChain(input) {
62
+ if (!input.roles || input.roles.length === 0)
63
+ return null;
64
+ const tried = [];
65
+ for (const role of input.roles) {
66
+ tried.push(role);
67
+ const r = await tryIntrospect({
68
+ role,
69
+ prompt: input.prompt,
70
+ system: input.system,
71
+ timeoutMs: input.perRoleTimeoutMs ?? input.timeoutMs ?? 30_000,
72
+ signal: input.signal,
73
+ temperature: input.temperature,
74
+ model: input.model,
75
+ });
76
+ if (r) {
77
+ log.info({
78
+ event: 'llm.introspect.chain.success',
79
+ role, attempts: tried.length, totalRoles: input.roles.length,
80
+ });
81
+ return { ...r, triedRoles: tried.slice() };
82
+ }
83
+ }
84
+ log.info({
85
+ event: 'llm.introspect.chain.exhausted',
86
+ attempts: tried.length, roles: tried.join(','),
87
+ });
88
+ return null;
89
+ }
90
+ //# sourceMappingURL=introspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspection.js","sourceRoot":"","sources":["../../../src/core/llm/introspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { ToolDef } from './provider-base.js';
2
+ /**
3
+ * Tool naming policy: `mcp_{server}_{tool}`. Avoids name collisions when
4
+ * two servers advertise the same tool name (common: every server has
5
+ * `read_file`). The original tool name is preserved on `originalName`
6
+ * so error messages stay legible and `enabledTools` filtering can match
7
+ * either form.
8
+ */
9
+ export declare function _namespacedNameForTest(serverName: string, toolName: string): string;
10
+ /** Stage-2 config shape for one MCP server. Mirrors the zod schema in
11
+ * config-schema.ts but kept here as a plain TS interface so this file
12
+ * doesn't import the whole schema module just for the type. */
13
+ export interface McpServerConfig {
14
+ name: string;
15
+ command?: string;
16
+ args?: string[];
17
+ env?: Record<string, string>;
18
+ cwd?: string;
19
+ url?: string;
20
+ headers?: Record<string, string>;
21
+ toolTimeoutMs?: number;
22
+ enabledTools?: string[];
23
+ enabled?: boolean;
24
+ }
25
+ /** Result of a single tool call. Stage-2 agent loop treats this as
26
+ * free-form text appended to the conversation as a tool message. */
27
+ export interface ToolCallResult {
28
+ text: string;
29
+ isError: boolean;
30
+ }
31
+ /**
32
+ * Wraps one MCP server connection. The caller (`mcp-registry.ts`)
33
+ * holds a Map<server-name, McpClient> and is responsible for lifecycle
34
+ * (connectAll at boot, closeAll on shutdown).
35
+ */
36
+ export declare class McpClient {
37
+ readonly name: string;
38
+ private readonly cfg;
39
+ private readonly toolTimeoutMs;
40
+ private client;
41
+ private cachedTools;
42
+ constructor(cfg: McpServerConfig);
43
+ /** True once connect() has completed without error. */
44
+ isConnected(): boolean;
45
+ /**
46
+ * Pick the right transport for the config and run the MCP handshake.
47
+ * Errors propagate; registry surfaces them as `unhealthy` rows.
48
+ */
49
+ connect(): Promise<void>;
50
+ /**
51
+ * Discover the server's tool roster and project into agim ToolDef[].
52
+ * Applies `enabledTools` filter and the namespaced-name policy.
53
+ */
54
+ listAvailableTools(): Promise<ToolDef[]>;
55
+ /**
56
+ * Invoke a tool by either the namespaced or original name. Returns
57
+ * the concatenated text content + an isError flag (the MCP spec
58
+ * lets a tool succeed at the transport level while reporting a
59
+ * domain-level error; the agent loop should usually pass either
60
+ * back to the model so it can react).
61
+ */
62
+ callTool(callName: string, args: Record<string, unknown>, opts?: {
63
+ signal?: AbortSignal;
64
+ }): Promise<ToolCallResult>;
65
+ /** Best-effort close. Idempotent. */
66
+ close(): Promise<void>;
67
+ private _resolveOriginalName;
68
+ }
69
+ /** Make sure the input schema is at least an object — MCP servers
70
+ * sometimes return undefined or a non-object for parameterless tools. */
71
+ export declare function _ensureObjectSchemaForTest(raw: unknown): Record<string, unknown>;
72
+ /**
73
+ * MCP tool results are `content: [{type, text, ...}, ...]`. Concatenate
74
+ * every `text` block into one string for the agent loop. Non-text
75
+ * blocks (image, resource) are stringified as `[image]` etc. so the
76
+ * model at least sees they were there; first-class image support
77
+ * lands when we wire vision providers.
78
+ */
79
+ export declare function _aggregateTextContentForTest(content: unknown): string;
80
+ //# sourceMappingURL=mcp-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../../src/core/llm/mcp-client.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAMjD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnF;AAQD;;gEAEgE;AAChE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;qEACqE;AACrE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;GAIG;AACH,qBAAa,SAAS;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiB;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,MAAM,CAAsB;IAKpC,OAAO,CAAC,WAAW,CAAoE;gBAE3E,GAAG,EAAE,eAAe;IAMhC,uDAAuD;IACvD,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAgC9C;;;;;;OAMG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAqC7H,qCAAqC;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,OAAO,CAAC,oBAAoB;CAW7B;AAmCD;0EAC0E;AAC1E,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEhF;AASD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAErE"}
@@ -0,0 +1,270 @@
1
+ // mcp-client — thin wrapper over @modelcontextprotocol/sdk for the
2
+ // native agent loop (Stage 2 sub-PR #2).
3
+ //
4
+ // What this file does:
5
+ // - One McpClient per configured server (stdio / sse / streamable-http)
6
+ // - connect(): instantiate the right transport + Client + handshake
7
+ // - listAvailableTools(): discover tools and expose them as agim's
8
+ // ToolDef[] with namespaced names (`mcp_{server}_{tool}`)
9
+ // - callTool(name, args): run a tool by namespaced or original name,
10
+ // return its text result. Wraps the SDK's untyped result in a
11
+ // simpler "text or error" string for the agent loop.
12
+ // - close(): graceful shutdown (used in cli.ts at process exit so we
13
+ // don't leave orphan stdio subprocesses)
14
+ //
15
+ // What this file deliberately does NOT do (yet):
16
+ // - Resource subscription (server -> client notifications). The
17
+ // agent loop in sub-PR #3 doesn't consume these.
18
+ // - MCP prompts as tools. Useful in nanobot's design but premature
19
+ // until we have a use case here.
20
+ // - Auto-reconnect on transport drop. The SDK does some of this
21
+ // internally; we let the caller (the agent loop) treat connect
22
+ // failures as "tool unavailable for this iteration" via the
23
+ // registry's `unhealthy` flag, then re-probe on subsequent ticks.
24
+ // - Schema normalisation for OpenAI's strict `tools[]` schema. The
25
+ // provider already passes input_schema verbatim; if a server emits
26
+ // an OpenAI-rejected variant (e.g. nullable union via `type: [s,n]`)
27
+ // the openai-compat provider will surface the API error. We can
28
+ // add normalisation later when we hit a real-world server that
29
+ // trips it.
30
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
31
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
32
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
33
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
34
+ import { logger as rootLogger } from '../logger.js';
35
+ const log = rootLogger.child({ component: 'mcp-client' });
36
+ const DEFAULT_TOOL_TIMEOUT_MS = 30_000;
37
+ /**
38
+ * Tool naming policy: `mcp_{server}_{tool}`. Avoids name collisions when
39
+ * two servers advertise the same tool name (common: every server has
40
+ * `read_file`). The original tool name is preserved on `originalName`
41
+ * so error messages stay legible and `enabledTools` filtering can match
42
+ * either form.
43
+ */
44
+ export function _namespacedNameForTest(serverName, toolName) {
45
+ return namespacedName(serverName, toolName);
46
+ }
47
+ function namespacedName(serverName, toolName) {
48
+ const safeServer = serverName.replace(/[^A-Za-z0-9]+/g, '_');
49
+ const safeTool = toolName.replace(/[^A-Za-z0-9_]+/g, '_');
50
+ return `mcp_${safeServer}_${safeTool}`;
51
+ }
52
+ /**
53
+ * Wraps one MCP server connection. The caller (`mcp-registry.ts`)
54
+ * holds a Map<server-name, McpClient> and is responsible for lifecycle
55
+ * (connectAll at boot, closeAll on shutdown).
56
+ */
57
+ export class McpClient {
58
+ name;
59
+ cfg;
60
+ toolTimeoutMs;
61
+ client = null;
62
+ // Cache the listTools() result so the agent loop doesn't pay the
63
+ // round-trip cost on every iteration. Servers that hot-reload tools
64
+ // mid-session would need an explicit refresh hook; punt until a real
65
+ // case appears.
66
+ cachedTools = null;
67
+ constructor(cfg) {
68
+ this.name = cfg.name;
69
+ this.cfg = cfg;
70
+ this.toolTimeoutMs = cfg.toolTimeoutMs ?? DEFAULT_TOOL_TIMEOUT_MS;
71
+ }
72
+ /** True once connect() has completed without error. */
73
+ isConnected() {
74
+ return this.client !== null;
75
+ }
76
+ /**
77
+ * Pick the right transport for the config and run the MCP handshake.
78
+ * Errors propagate; registry surfaces them as `unhealthy` rows.
79
+ */
80
+ async connect() {
81
+ if (this.client)
82
+ return; // idempotent
83
+ const transport = buildTransport(this.cfg);
84
+ const client = new Client({ name: 'agim-mcp-client', version: '1' },
85
+ // capabilities — we don't advertise sampling / roots / elicitation
86
+ // yet; tools-only consumer.
87
+ { capabilities: {} });
88
+ await client.connect(transport);
89
+ this.client = client;
90
+ log.info({
91
+ event: 'mcp.connected', server: this.name,
92
+ transport: classifyTransport(this.cfg),
93
+ });
94
+ }
95
+ /**
96
+ * Discover the server's tool roster and project into agim ToolDef[].
97
+ * Applies `enabledTools` filter and the namespaced-name policy.
98
+ */
99
+ async listAvailableTools() {
100
+ if (!this.client)
101
+ throw new Error(`mcp-client[${this.name}]: not connected`);
102
+ if (this.cachedTools)
103
+ return this.cachedTools.full;
104
+ const resp = await this.client.listTools({});
105
+ // resp.tools shape per MCP spec: [{name, description?, inputSchema}]
106
+ const filter = this.cfg.enabledTools && this.cfg.enabledTools.length > 0
107
+ && !(this.cfg.enabledTools.length === 1 && this.cfg.enabledTools[0] === '*')
108
+ ? new Set(this.cfg.enabledTools)
109
+ : null;
110
+ const out = [];
111
+ const byCallName = new Map(); // namespaced -> original
112
+ for (const t of resp.tools) {
113
+ if (!t?.name)
114
+ continue;
115
+ const namespaced = namespacedName(this.name, t.name);
116
+ if (filter && !filter.has(t.name) && !filter.has(namespaced))
117
+ continue;
118
+ byCallName.set(namespaced, t.name);
119
+ out.push({
120
+ name: namespaced,
121
+ description: typeof t.description === 'string' ? t.description : '',
122
+ parameters: ensureObjectSchema(t.inputSchema),
123
+ });
124
+ }
125
+ this.cachedTools = { full: out, byCallName };
126
+ log.info({
127
+ event: 'mcp.tools.listed', server: this.name,
128
+ count: out.length, filtered: filter !== null,
129
+ });
130
+ return out;
131
+ }
132
+ /**
133
+ * Invoke a tool by either the namespaced or original name. Returns
134
+ * the concatenated text content + an isError flag (the MCP spec
135
+ * lets a tool succeed at the transport level while reporting a
136
+ * domain-level error; the agent loop should usually pass either
137
+ * back to the model so it can react).
138
+ */
139
+ async callTool(callName, args, opts = {}) {
140
+ if (!this.client)
141
+ throw new Error(`mcp-client[${this.name}]: not connected`);
142
+ const originalName = this._resolveOriginalName(callName);
143
+ if (originalName === null) {
144
+ return { text: `unknown tool: ${callName}`, isError: true };
145
+ }
146
+ const t0 = Date.now();
147
+ try {
148
+ const resp = await this.client.callTool({ name: originalName, arguments: args }, undefined, {
149
+ timeout: this.toolTimeoutMs,
150
+ signal: opts.signal,
151
+ });
152
+ const text = aggregateTextContent(resp?.content);
153
+ const isError = Boolean(resp?.isError);
154
+ log.info({
155
+ event: 'mcp.tool.called',
156
+ server: this.name, tool: originalName,
157
+ elapsedMs: Date.now() - t0,
158
+ bytes: text.length, isError,
159
+ });
160
+ return { text, isError };
161
+ }
162
+ catch (err) {
163
+ const msg = err instanceof Error ? err.message : String(err);
164
+ log.warn({
165
+ event: 'mcp.tool.failed',
166
+ server: this.name, tool: originalName,
167
+ elapsedMs: Date.now() - t0,
168
+ err: msg,
169
+ });
170
+ return { text: `mcp tool call failed: ${msg}`, isError: true };
171
+ }
172
+ }
173
+ /** Best-effort close. Idempotent. */
174
+ async close() {
175
+ if (!this.client)
176
+ return;
177
+ try {
178
+ await this.client.close();
179
+ }
180
+ catch { /* ignore */ }
181
+ this.client = null;
182
+ this.cachedTools = null;
183
+ }
184
+ _resolveOriginalName(callName) {
185
+ if (!this.cachedTools)
186
+ return null;
187
+ // First try namespaced (preferred); fall back to original (handy
188
+ // for human-driven /heartbeat run-now style debugging).
189
+ const mapped = this.cachedTools.byCallName.get(callName);
190
+ if (mapped)
191
+ return mapped;
192
+ for (const orig of this.cachedTools.byCallName.values()) {
193
+ if (orig === callName)
194
+ return orig;
195
+ }
196
+ return null;
197
+ }
198
+ }
199
+ // ─── Transport factory ────────────────────────────────────────────────
200
+ function buildTransport(cfg) {
201
+ if (cfg.command) {
202
+ return new StdioClientTransport({
203
+ command: cfg.command,
204
+ args: cfg.args ?? [],
205
+ env: cfg.env,
206
+ cwd: cfg.cwd,
207
+ });
208
+ }
209
+ if (cfg.url) {
210
+ const u = new URL(cfg.url);
211
+ if (cfg.url.endsWith('/sse')) {
212
+ return new SSEClientTransport(u, cfg.headers ? {
213
+ requestInit: { headers: cfg.headers },
214
+ } : undefined);
215
+ }
216
+ return new StreamableHTTPClientTransport(u, cfg.headers ? {
217
+ requestInit: { headers: cfg.headers },
218
+ } : undefined);
219
+ }
220
+ throw new Error(`mcp-client[${cfg.name}]: must set either command (stdio) or url (http/sse)`);
221
+ }
222
+ function classifyTransport(cfg) {
223
+ if (cfg.command)
224
+ return 'stdio';
225
+ if (cfg.url?.endsWith('/sse'))
226
+ return 'sse';
227
+ return 'streamableHttp';
228
+ }
229
+ // ─── Helpers ──────────────────────────────────────────────────────────
230
+ /** Make sure the input schema is at least an object — MCP servers
231
+ * sometimes return undefined or a non-object for parameterless tools. */
232
+ export function _ensureObjectSchemaForTest(raw) {
233
+ return ensureObjectSchema(raw);
234
+ }
235
+ function ensureObjectSchema(raw) {
236
+ if (raw && typeof raw === 'object' && !Array.isArray(raw)) {
237
+ return raw;
238
+ }
239
+ return { type: 'object', properties: {} };
240
+ }
241
+ /**
242
+ * MCP tool results are `content: [{type, text, ...}, ...]`. Concatenate
243
+ * every `text` block into one string for the agent loop. Non-text
244
+ * blocks (image, resource) are stringified as `[image]` etc. so the
245
+ * model at least sees they were there; first-class image support
246
+ * lands when we wire vision providers.
247
+ */
248
+ export function _aggregateTextContentForTest(content) {
249
+ return aggregateTextContent(content);
250
+ }
251
+ function aggregateTextContent(content) {
252
+ if (!Array.isArray(content))
253
+ return '';
254
+ const out = [];
255
+ for (const block of content) {
256
+ if (!block || typeof block !== 'object')
257
+ continue;
258
+ if (block.type === 'text' && typeof block.text === 'string') {
259
+ out.push(block.text);
260
+ }
261
+ else if (block.type === 'image') {
262
+ out.push('[image]');
263
+ }
264
+ else if (block.type === 'resource' || block.type === 'resource_link') {
265
+ out.push('[resource]');
266
+ }
267
+ }
268
+ return out.join('');
269
+ }
270
+ //# sourceMappingURL=mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../../src/core/llm/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { type ToolCallResult } from './mcp-client.js';
2
+ import type { ToolDef } from './provider-base.js';
3
+ /**
4
+ * Build McpClient instances from config. Idempotent — repeated calls
5
+ * fully replace the previous state (any open connections are closed
6
+ * first via closeAll).
7
+ */
8
+ export declare function loadFromConfig(cfg: {
9
+ mcpServers?: unknown;
10
+ }): Promise<void>;
11
+ /**
12
+ * Connect every registered client. Failures are recorded in
13
+ * `state.unhealthy` so a broken server doesn't poison the startup
14
+ * sequence. Returns a summary so callers (cli.ts boot log) can print
15
+ * something useful.
16
+ */
17
+ export declare function connectAll(): Promise<{
18
+ ok: string[];
19
+ failed: Record<string, string>;
20
+ toolCount: number;
21
+ }>;
22
+ /** All tools across every connected client. Safe to call before
23
+ * connectAll (returns []). The order is insertion order of the
24
+ * mcpServers config — useful for the web UI listing. */
25
+ export declare function getAllTools(): ToolDef[];
26
+ /** Look up which server owns a given namespaced tool name. */
27
+ export declare function getOwningServer(callName: string): string | null;
28
+ /**
29
+ * Dispatch a tool call to the right client. Returns a "tool unknown"
30
+ * error result rather than throwing; the agent loop converts that into
31
+ * a `{role:'tool', isError:true}` message so the model can recover.
32
+ */
33
+ export declare function callToolByName(callName: string, args: Record<string, unknown>, opts?: {
34
+ signal?: AbortSignal;
35
+ }): Promise<ToolCallResult>;
36
+ /**
37
+ * Snapshot for cli.ts boot log + future web UI. Reports server count,
38
+ * total advertised tools, and which servers are unhealthy.
39
+ */
40
+ export declare function describeRegistry(): {
41
+ servers: Array<{
42
+ name: string;
43
+ connected: boolean;
44
+ toolCount: number;
45
+ error?: string;
46
+ }>;
47
+ totalTools: number;
48
+ };
49
+ /**
50
+ * Close every client connection. Idempotent — safe to call from
51
+ * graceful shutdown paths even when nothing is connected.
52
+ */
53
+ export declare function closeAll(): Promise<void>;
54
+ /** Test-only: clear without close. Use only in test setups where the
55
+ * real clients were never instantiated. */
56
+ export declare function _resetRegistry(): void;
57
+ //# sourceMappingURL=mcp-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-registry.d.ts","sourceRoot":"","sources":["../../../src/core/llm/mcp-registry.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAmC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACtF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAoBjD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBjF;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B/G;AAED;;yDAEyD;AACzD,wBAAgB,WAAW,IAAI,OAAO,EAAE,CAEvC;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAClC,OAAO,CAAC,cAAc,CAAC,CAazB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI;IAClC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACvF,UAAU,EAAE,MAAM,CAAA;CACnB,CAaA;AAED;;;GAGG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAI9C;AAED;4CAC4C;AAC5C,wBAAgB,cAAc,IAAI,IAAI,CAErC"}