agim-cli 1.2.45 → 1.2.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/CHANGELOG.md +340 -0
  2. package/README.md +40 -6
  3. package/README.zh-CN.md +40 -6
  4. package/dist/cli-ui/config-wizard.js +16 -2
  5. package/dist/cli-ui/config-wizard.js.map +1 -1
  6. package/dist/cli-ui/diag.d.ts +29 -0
  7. package/dist/cli-ui/diag.d.ts.map +1 -0
  8. package/dist/cli-ui/diag.js +135 -0
  9. package/dist/cli-ui/diag.js.map +1 -0
  10. package/dist/cli-ui/i18n.d.ts +38 -0
  11. package/dist/cli-ui/i18n.d.ts.map +1 -1
  12. package/dist/cli-ui/i18n.js +101 -0
  13. package/dist/cli-ui/i18n.js.map +1 -1
  14. package/dist/cli-ui/setup-llm.d.ts +30 -0
  15. package/dist/cli-ui/setup-llm.d.ts.map +1 -0
  16. package/dist/cli-ui/setup-llm.js +460 -0
  17. package/dist/cli-ui/setup-llm.js.map +1 -0
  18. package/dist/cli-ui/setup-mcp.d.ts +19 -0
  19. package/dist/cli-ui/setup-mcp.d.ts.map +1 -0
  20. package/dist/cli-ui/setup-mcp.js +308 -0
  21. package/dist/cli-ui/setup-mcp.js.map +1 -0
  22. package/dist/cli-ui/token-menu.js +2 -2
  23. package/dist/cli-ui/token-menu.js.map +1 -1
  24. package/dist/cli.js +121 -22
  25. package/dist/cli.js.map +1 -1
  26. package/dist/core/access-token.d.ts +16 -5
  27. package/dist/core/access-token.d.ts.map +1 -1
  28. package/dist/core/access-token.js +82 -13
  29. package/dist/core/access-token.js.map +1 -1
  30. package/dist/core/agent-cwd.d.ts.map +1 -1
  31. package/dist/core/agent-cwd.js +74 -0
  32. package/dist/core/agent-cwd.js.map +1 -1
  33. package/dist/core/approval-bus.d.ts +22 -0
  34. package/dist/core/approval-bus.d.ts.map +1 -1
  35. package/dist/core/approval-bus.js +93 -0
  36. package/dist/core/approval-bus.js.map +1 -1
  37. package/dist/core/ask-user-router.d.ts +24 -0
  38. package/dist/core/ask-user-router.d.ts.map +1 -0
  39. package/dist/core/ask-user-router.js +84 -0
  40. package/dist/core/ask-user-router.js.map +1 -0
  41. package/dist/core/ask-user-rpc.d.ts +80 -0
  42. package/dist/core/ask-user-rpc.d.ts.map +1 -0
  43. package/dist/core/ask-user-rpc.js +388 -0
  44. package/dist/core/ask-user-rpc.js.map +1 -0
  45. package/dist/core/audit-log.d.ts +1 -1
  46. package/dist/core/audit-log.d.ts.map +1 -1
  47. package/dist/core/audit-log.js.map +1 -1
  48. package/dist/core/commands/builtin.d.ts.map +1 -1
  49. package/dist/core/commands/builtin.js +21 -5
  50. package/dist/core/commands/builtin.js.map +1 -1
  51. package/dist/core/commands/goal.d.ts +3 -0
  52. package/dist/core/commands/goal.d.ts.map +1 -0
  53. package/dist/core/commands/goal.js +240 -0
  54. package/dist/core/commands/goal.js.map +1 -0
  55. package/dist/core/commands/heartbeat.d.ts +3 -0
  56. package/dist/core/commands/heartbeat.d.ts.map +1 -0
  57. package/dist/core/commands/heartbeat.js +219 -0
  58. package/dist/core/commands/heartbeat.js.map +1 -0
  59. package/dist/core/commands/router-compare.d.ts +3 -0
  60. package/dist/core/commands/router-compare.d.ts.map +1 -0
  61. package/dist/core/commands/router-compare.js +81 -0
  62. package/dist/core/commands/router-compare.js.map +1 -0
  63. package/dist/core/commands/router.d.ts.map +1 -1
  64. package/dist/core/commands/router.js +9 -1
  65. package/dist/core/commands/router.js.map +1 -1
  66. package/dist/core/commands/skill.d.ts +3 -0
  67. package/dist/core/commands/skill.d.ts.map +1 -0
  68. package/dist/core/commands/skill.js +91 -0
  69. package/dist/core/commands/skill.js.map +1 -0
  70. package/dist/core/config-schema.d.ts +28 -0
  71. package/dist/core/config-schema.d.ts.map +1 -1
  72. package/dist/core/config-schema.js +124 -0
  73. package/dist/core/config-schema.js.map +1 -1
  74. package/dist/core/goals.d.ts +81 -0
  75. package/dist/core/goals.d.ts.map +1 -0
  76. package/dist/core/goals.js +361 -0
  77. package/dist/core/goals.js.map +1 -0
  78. package/dist/core/heartbeat-store.d.ts +90 -0
  79. package/dist/core/heartbeat-store.d.ts.map +1 -0
  80. package/dist/core/heartbeat-store.js +302 -0
  81. package/dist/core/heartbeat-store.js.map +1 -0
  82. package/dist/core/heartbeat.d.ts +35 -0
  83. package/dist/core/heartbeat.d.ts.map +1 -0
  84. package/dist/core/heartbeat.js +332 -0
  85. package/dist/core/heartbeat.js.map +1 -0
  86. package/dist/core/intent-llm.d.ts +9 -0
  87. package/dist/core/intent-llm.d.ts.map +1 -1
  88. package/dist/core/intent-llm.js +77 -32
  89. package/dist/core/intent-llm.js.map +1 -1
  90. package/dist/core/llm/agent-loop.d.ts +112 -0
  91. package/dist/core/llm/agent-loop.d.ts.map +1 -0
  92. package/dist/core/llm/agent-loop.js +313 -0
  93. package/dist/core/llm/agent-loop.js.map +1 -0
  94. package/dist/core/llm/anthropic-provider.d.ts +53 -0
  95. package/dist/core/llm/anthropic-provider.d.ts.map +1 -0
  96. package/dist/core/llm/anthropic-provider.js +339 -0
  97. package/dist/core/llm/anthropic-provider.js.map +1 -0
  98. package/dist/core/llm/auto-compact.d.ts +35 -0
  99. package/dist/core/llm/auto-compact.d.ts.map +1 -0
  100. package/dist/core/llm/auto-compact.js +149 -0
  101. package/dist/core/llm/auto-compact.js.map +1 -0
  102. package/dist/core/llm/builtin-dispatcher.d.ts +21 -0
  103. package/dist/core/llm/builtin-dispatcher.d.ts.map +1 -0
  104. package/dist/core/llm/builtin-dispatcher.js +196 -0
  105. package/dist/core/llm/builtin-dispatcher.js.map +1 -0
  106. package/dist/core/llm/imhub-dispatcher.d.ts +27 -0
  107. package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -0
  108. package/dist/core/llm/imhub-dispatcher.js +308 -0
  109. package/dist/core/llm/imhub-dispatcher.js.map +1 -0
  110. package/dist/core/llm/index.d.ts +11 -0
  111. package/dist/core/llm/index.d.ts.map +1 -0
  112. package/dist/core/llm/index.js +16 -0
  113. package/dist/core/llm/index.js.map +1 -0
  114. package/dist/core/llm/introspection.d.ts +73 -0
  115. package/dist/core/llm/introspection.d.ts.map +1 -0
  116. package/dist/core/llm/introspection.js +90 -0
  117. package/dist/core/llm/introspection.js.map +1 -0
  118. package/dist/core/llm/mcp-client.d.ts +80 -0
  119. package/dist/core/llm/mcp-client.d.ts.map +1 -0
  120. package/dist/core/llm/mcp-client.js +270 -0
  121. package/dist/core/llm/mcp-client.js.map +1 -0
  122. package/dist/core/llm/mcp-registry.d.ts +57 -0
  123. package/dist/core/llm/mcp-registry.d.ts.map +1 -0
  124. package/dist/core/llm/mcp-registry.js +155 -0
  125. package/dist/core/llm/mcp-registry.js.map +1 -0
  126. package/dist/core/llm/openai-compat-provider.d.ts +65 -0
  127. package/dist/core/llm/openai-compat-provider.d.ts.map +1 -0
  128. package/dist/core/llm/openai-compat-provider.js +451 -0
  129. package/dist/core/llm/openai-compat-provider.js.map +1 -0
  130. package/dist/core/llm/policy-approval-gate.d.ts +30 -0
  131. package/dist/core/llm/policy-approval-gate.d.ts.map +1 -0
  132. package/dist/core/llm/policy-approval-gate.js +86 -0
  133. package/dist/core/llm/policy-approval-gate.js.map +1 -0
  134. package/dist/core/llm/provider-base.d.ts +302 -0
  135. package/dist/core/llm/provider-base.d.ts.map +1 -0
  136. package/dist/core/llm/provider-base.js +222 -0
  137. package/dist/core/llm/provider-base.js.map +1 -0
  138. package/dist/core/llm/registry.d.ts +44 -0
  139. package/dist/core/llm/registry.d.ts.map +1 -0
  140. package/dist/core/llm/registry.js +160 -0
  141. package/dist/core/llm/registry.js.map +1 -0
  142. package/dist/core/llm/secrets.d.ts +46 -0
  143. package/dist/core/llm/secrets.d.ts.map +1 -0
  144. package/dist/core/llm/secrets.js +157 -0
  145. package/dist/core/llm/secrets.js.map +1 -0
  146. package/dist/core/llm/tool-dispatcher.d.ts +37 -0
  147. package/dist/core/llm/tool-dispatcher.d.ts.map +1 -0
  148. package/dist/core/llm/tool-dispatcher.js +85 -0
  149. package/dist/core/llm/tool-dispatcher.js.map +1 -0
  150. package/dist/core/memory-consolidate.d.ts.map +1 -1
  151. package/dist/core/memory-consolidate.js +38 -23
  152. package/dist/core/memory-consolidate.js.map +1 -1
  153. package/dist/core/memory-distill.d.ts.map +1 -1
  154. package/dist/core/memory-distill.js +51 -25
  155. package/dist/core/memory-distill.js.map +1 -1
  156. package/dist/core/memory-rpc.d.ts.map +1 -1
  157. package/dist/core/memory-rpc.js +6 -0
  158. package/dist/core/memory-rpc.js.map +1 -1
  159. package/dist/core/message-sink.d.ts.map +1 -1
  160. package/dist/core/message-sink.js +76 -0
  161. package/dist/core/message-sink.js.map +1 -1
  162. package/dist/core/notification-evaluator.d.ts +49 -0
  163. package/dist/core/notification-evaluator.d.ts.map +1 -0
  164. package/dist/core/notification-evaluator.js +232 -0
  165. package/dist/core/notification-evaluator.js.map +1 -0
  166. package/dist/core/onboarding.d.ts.map +1 -1
  167. package/dist/core/onboarding.js +10 -0
  168. package/dist/core/onboarding.js.map +1 -1
  169. package/dist/core/persona.d.ts +10 -0
  170. package/dist/core/persona.d.ts.map +1 -1
  171. package/dist/core/persona.js +28 -14
  172. package/dist/core/persona.js.map +1 -1
  173. package/dist/core/push-rpc.d.ts +8 -0
  174. package/dist/core/push-rpc.d.ts.map +1 -1
  175. package/dist/core/push-rpc.js +41 -1
  176. package/dist/core/push-rpc.js.map +1 -1
  177. package/dist/core/registry.d.ts.map +1 -1
  178. package/dist/core/registry.js +11 -0
  179. package/dist/core/registry.js.map +1 -1
  180. package/dist/core/render-router.d.ts.map +1 -1
  181. package/dist/core/render-router.js +23 -6
  182. package/dist/core/render-router.js.map +1 -1
  183. package/dist/core/router-compare.d.ts +76 -0
  184. package/dist/core/router-compare.d.ts.map +1 -0
  185. package/dist/core/router-compare.js +253 -0
  186. package/dist/core/router-compare.js.map +1 -0
  187. package/dist/core/router.d.ts.map +1 -1
  188. package/dist/core/router.js +25 -1
  189. package/dist/core/router.js.map +1 -1
  190. package/dist/core/skills/builtin/agim-self/SKILL.md +81 -0
  191. package/dist/core/skills/loader.d.ts +120 -0
  192. package/dist/core/skills/loader.d.ts.map +1 -0
  193. package/dist/core/skills/loader.js +577 -0
  194. package/dist/core/skills/loader.js.map +1 -0
  195. package/dist/core/skills-rpc.d.ts +44 -0
  196. package/dist/core/skills-rpc.d.ts.map +1 -0
  197. package/dist/core/skills-rpc.js +71 -0
  198. package/dist/core/skills-rpc.js.map +1 -0
  199. package/dist/core/types.d.ts +35 -0
  200. package/dist/core/types.d.ts.map +1 -1
  201. package/dist/core/util/format-age.d.ts +20 -0
  202. package/dist/core/util/format-age.d.ts.map +1 -0
  203. package/dist/core/util/format-age.js +86 -0
  204. package/dist/core/util/format-age.js.map +1 -0
  205. package/dist/plugins/agents/acp/acp-adapter.d.ts +3 -0
  206. package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -1
  207. package/dist/plugins/agents/acp/acp-adapter.js +12 -0
  208. package/dist/plugins/agents/acp/acp-adapter.js.map +1 -1
  209. package/dist/plugins/agents/antigravity/index.d.ts +1 -0
  210. package/dist/plugins/agents/antigravity/index.d.ts.map +1 -1
  211. package/dist/plugins/agents/antigravity/index.js +1 -0
  212. package/dist/plugins/agents/antigravity/index.js.map +1 -1
  213. package/dist/plugins/agents/claude-code/index.d.ts +1 -0
  214. package/dist/plugins/agents/claude-code/index.d.ts.map +1 -1
  215. package/dist/plugins/agents/claude-code/index.js +1 -0
  216. package/dist/plugins/agents/claude-code/index.js.map +1 -1
  217. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +22 -0
  218. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
  219. package/dist/plugins/agents/claude-code/mcp-approval-server.js +157 -0
  220. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
  221. package/dist/plugins/agents/codex/index.d.ts +1 -0
  222. package/dist/plugins/agents/codex/index.d.ts.map +1 -1
  223. package/dist/plugins/agents/codex/index.js +1 -0
  224. package/dist/plugins/agents/codex/index.js.map +1 -1
  225. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts +43 -0
  226. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -0
  227. package/dist/plugins/agents/cursor/ensure-mcp-config.js +99 -0
  228. package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -0
  229. package/dist/plugins/agents/cursor/index.d.ts +28 -0
  230. package/dist/plugins/agents/cursor/index.d.ts.map +1 -0
  231. package/dist/plugins/agents/cursor/index.js +290 -0
  232. package/dist/plugins/agents/cursor/index.js.map +1 -0
  233. package/dist/plugins/agents/native/index.d.ts +34 -0
  234. package/dist/plugins/agents/native/index.d.ts.map +1 -0
  235. package/dist/plugins/agents/native/index.js +598 -0
  236. package/dist/plugins/agents/native/index.js.map +1 -0
  237. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +1 -0
  238. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
  239. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +1 -0
  240. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
  241. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +4 -0
  242. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
  243. package/dist/plugins/messengers/wechat/ilink-adapter.js +26 -1
  244. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
  245. package/dist/web/agim-skills-api.d.ts +4 -0
  246. package/dist/web/agim-skills-api.d.ts.map +1 -0
  247. package/dist/web/agim-skills-api.js +150 -0
  248. package/dist/web/agim-skills-api.js.map +1 -0
  249. package/dist/web/background-tasks-api.d.ts +7 -0
  250. package/dist/web/background-tasks-api.d.ts.map +1 -0
  251. package/dist/web/background-tasks-api.js +225 -0
  252. package/dist/web/background-tasks-api.js.map +1 -0
  253. package/dist/web/llm-api.d.ts +8 -0
  254. package/dist/web/llm-api.d.ts.map +1 -0
  255. package/dist/web/llm-api.js +300 -0
  256. package/dist/web/llm-api.js.map +1 -0
  257. package/dist/web/mcp-api.d.ts +8 -0
  258. package/dist/web/mcp-api.d.ts.map +1 -0
  259. package/dist/web/mcp-api.js +205 -0
  260. package/dist/web/mcp-api.js.map +1 -0
  261. package/dist/web/public/assets/{a2a-Cdl8iY0e.js → a2a-06bnQicA.js} +3 -3
  262. package/dist/web/public/assets/{a2a-Cdl8iY0e.js.map → a2a-06bnQicA.js.map} +1 -1
  263. package/dist/web/public/assets/{activity-DXahuK1C.js → activity-Bhc6Esfy.js} +2 -2
  264. package/dist/web/public/assets/{activity-DXahuK1C.js.map → activity-Bhc6Esfy.js.map} +1 -1
  265. package/dist/web/public/assets/{admins-C8fJsuHC.js → admins-BVpnOw3o.js} +3 -3
  266. package/dist/web/public/assets/{admins-C8fJsuHC.js.map → admins-BVpnOw3o.js.map} +1 -1
  267. package/dist/web/public/assets/agents-Cn7D3UMz.js +7 -0
  268. package/dist/web/public/assets/agents-Cn7D3UMz.js.map +1 -0
  269. package/dist/web/public/assets/{approvals-CpyL90ef.js → approvals-BJiLyoLf.js} +3 -3
  270. package/dist/web/public/assets/{approvals-CpyL90ef.js.map → approvals-BJiLyoLf.js.map} +1 -1
  271. package/dist/web/public/assets/asks-C7gKbna1.js +7 -0
  272. package/dist/web/public/assets/asks-C7gKbna1.js.map +1 -0
  273. package/dist/web/public/assets/{audit-DDqpiC3z.js → audit-DgWZD8l5.js} +2 -2
  274. package/dist/web/public/assets/{audit-DDqpiC3z.js.map → audit-DgWZD8l5.js.map} +1 -1
  275. package/dist/web/public/assets/bell-pWZT2wlM.js +7 -0
  276. package/dist/web/public/assets/bell-pWZT2wlM.js.map +1 -0
  277. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js → bgjobs-DkAJdzHf.js} +2 -2
  278. package/dist/web/public/assets/{bgjobs-CAFV-I4I.js.map → bgjobs-DkAJdzHf.js.map} +1 -1
  279. package/dist/web/public/assets/{brain-CJyZe3Oa.js → brain-B0mM-ro_.js} +2 -2
  280. package/dist/web/public/assets/{brain-CJyZe3Oa.js.map → brain-B0mM-ro_.js.map} +1 -1
  281. package/dist/web/public/assets/{briefcase-DcLbQF2I.js → briefcase-CUQlj33_.js} +2 -2
  282. package/dist/web/public/assets/{briefcase-DcLbQF2I.js.map → briefcase-CUQlj33_.js.map} +1 -1
  283. package/dist/web/public/assets/{chevron-right-BhKELKvM.js → chevron-right-CJuDP_fx.js} +2 -2
  284. package/dist/web/public/assets/{chevron-right-BhKELKvM.js.map → chevron-right-CJuDP_fx.js.map} +1 -1
  285. package/dist/web/public/assets/{circle-check-D1qST9RS.js → circle-check-CYse8LRx.js} +2 -2
  286. package/dist/web/public/assets/{circle-check-D1qST9RS.js.map → circle-check-CYse8LRx.js.map} +1 -1
  287. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js → circle-check-big-9NpJLA1Z.js} +2 -2
  288. package/dist/web/public/assets/{circle-check-big-EKe3o9y1.js.map → circle-check-big-9NpJLA1Z.js.map} +1 -1
  289. package/dist/web/public/assets/{circle-x-DtePUX5x.js → circle-x-BxZ24SVG.js} +2 -2
  290. package/dist/web/public/assets/{circle-x-DtePUX5x.js.map → circle-x-BxZ24SVG.js.map} +1 -1
  291. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js → confirm-dialog-CmHeZ7ei.js} +2 -2
  292. package/dist/web/public/assets/{confirm-dialog-CCfCf6BG.js.map → confirm-dialog-CmHeZ7ei.js.map} +1 -1
  293. package/dist/web/public/assets/{data-table-BRLUxacD.js → data-table-tu4BIahS.js} +5 -5
  294. package/dist/web/public/assets/{data-table-BRLUxacD.js.map → data-table-tu4BIahS.js.map} +1 -1
  295. package/dist/web/public/assets/{dialog-By4YA8bm.js → dialog-D8QAkLhI.js} +3 -3
  296. package/dist/web/public/assets/{dialog-By4YA8bm.js.map → dialog-D8QAkLhI.js.map} +1 -1
  297. package/dist/web/public/assets/{download-CiTB2sCh.js → download-DBS0ZPTh.js} +2 -2
  298. package/dist/web/public/assets/{download-CiTB2sCh.js.map → download-DBS0ZPTh.js.map} +1 -1
  299. package/dist/web/public/assets/{email-H-b2AExg.js → email-DgbAEEvZ.js} +3 -3
  300. package/dist/web/public/assets/{email-H-b2AExg.js.map → email-DgbAEEvZ.js.map} +1 -1
  301. package/dist/web/public/assets/{empty-state-DZJTUlvz.js → empty-state-B1S_EYNJ.js} +2 -2
  302. package/dist/web/public/assets/{empty-state-DZJTUlvz.js.map → empty-state-B1S_EYNJ.js.map} +1 -1
  303. package/dist/web/public/assets/{external-link-CfU6Rttn.js → external-link-Dkmwlv6p.js} +2 -2
  304. package/dist/web/public/assets/{external-link-CfU6Rttn.js.map → external-link-Dkmwlv6p.js.map} +1 -1
  305. package/dist/web/public/assets/{eye-BvWcd0pJ.js → eye-Ch0DLviZ.js} +4 -4
  306. package/dist/web/public/assets/{eye-BvWcd0pJ.js.map → eye-Ch0DLviZ.js.map} +1 -1
  307. package/dist/web/public/assets/{facts-BRDbQLSI.js → facts-C3YV1Mkp.js} +2 -2
  308. package/dist/web/public/assets/{facts-BRDbQLSI.js.map → facts-C3YV1Mkp.js.map} +1 -1
  309. package/dist/web/public/assets/goals-DEt5gGry.js +17 -0
  310. package/dist/web/public/assets/goals-DEt5gGry.js.map +1 -0
  311. package/dist/web/public/assets/{health-DJPFOiKw.js → health-DuB9uNiZ.js} +2 -2
  312. package/dist/web/public/assets/{health-DJPFOiKw.js.map → health-DuB9uNiZ.js.map} +1 -1
  313. package/dist/web/public/assets/heart-pulse-CD8xNAGs.js +7 -0
  314. package/dist/web/public/assets/heart-pulse-CD8xNAGs.js.map +1 -0
  315. package/dist/web/public/assets/heartbeat-DbR8VwmG.js +7 -0
  316. package/dist/web/public/assets/heartbeat-DbR8VwmG.js.map +1 -0
  317. package/dist/web/public/assets/hot-izk3vGQB.js +17 -0
  318. package/dist/web/public/assets/hot-izk3vGQB.js.map +1 -0
  319. package/dist/web/public/assets/index-B7QRVy9N.css +1 -0
  320. package/dist/web/public/assets/index-BY1vfCja.js +166 -0
  321. package/dist/web/public/assets/index-BY1vfCja.js.map +1 -0
  322. package/dist/web/public/assets/installed-BXB3-YIy.js +31 -0
  323. package/dist/web/public/assets/installed-BXB3-YIy.js.map +1 -0
  324. package/dist/web/public/assets/{jobs-DdWaBgOh.js → jobs-DkbM4mIQ.js} +2 -2
  325. package/dist/web/public/assets/{jobs-DdWaBgOh.js.map → jobs-DkbM4mIQ.js.map} +1 -1
  326. package/dist/web/public/assets/{layout-Dr12u0W_.js → layout-5ePj6Bek.js} +2 -2
  327. package/dist/web/public/assets/{layout-Dr12u0W_.js.map → layout-5ePj6Bek.js.map} +1 -1
  328. package/dist/web/public/assets/layout-B5Dzy_Zc.js +2 -0
  329. package/dist/web/public/assets/layout-B5Dzy_Zc.js.map +1 -0
  330. package/dist/web/public/assets/layout-BZpbNQFb.js +2 -0
  331. package/dist/web/public/assets/layout-BZpbNQFb.js.map +1 -0
  332. package/dist/web/public/assets/layout-DY9Xq34u.js +2 -0
  333. package/dist/web/public/assets/layout-DY9Xq34u.js.map +1 -0
  334. package/dist/web/public/assets/{layout-BybpkTy0.js → layout-DxzBaeTv.js} +2 -2
  335. package/dist/web/public/assets/{layout-BybpkTy0.js.map → layout-DxzBaeTv.js.map} +1 -1
  336. package/dist/web/public/assets/llm-Dg4W7eRM.js +7 -0
  337. package/dist/web/public/assets/llm-Dg4W7eRM.js.map +1 -0
  338. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js → loader-circle-pGNYdPoE.js} +2 -2
  339. package/dist/web/public/assets/{loader-circle-BiR4Xs-3.js.map → loader-circle-pGNYdPoE.js.map} +1 -1
  340. package/dist/web/public/assets/{map-pin-B8hea8yW.js → map-pin-D1UX9mg7.js} +2 -2
  341. package/dist/web/public/assets/{map-pin-B8hea8yW.js.map → map-pin-D1UX9mg7.js.map} +1 -1
  342. package/dist/web/public/assets/mcp-uoOzu4_J.js +7 -0
  343. package/dist/web/public/assets/mcp-uoOzu4_J.js.map +1 -0
  344. package/dist/web/public/assets/{memos-C0_I1Uzt.js → memos-CAWASHg5.js} +2 -2
  345. package/dist/web/public/assets/{memos-C0_I1Uzt.js.map → memos-CAWASHg5.js.map} +1 -1
  346. package/dist/web/public/assets/{messengers-DuS5_JlE.js → messengers-B1-mZms8.js} +3 -3
  347. package/dist/web/public/assets/{messengers-DuS5_JlE.js.map → messengers-B1-mZms8.js.map} +1 -1
  348. package/dist/web/public/assets/native-agent-UuVvvzsW.js +7 -0
  349. package/dist/web/public/assets/native-agent-UuVvvzsW.js.map +1 -0
  350. package/dist/web/public/assets/{network-CpkocMHV.js → network-DpjSgAwW.js} +2 -2
  351. package/dist/web/public/assets/{network-CpkocMHV.js.map → network-DpjSgAwW.js.map} +1 -1
  352. package/dist/web/public/assets/{outbox-mGqTV2Ex.js → outbox-DeAgiXkY.js} +3 -3
  353. package/dist/web/public/assets/{outbox-mGqTV2Ex.js.map → outbox-DeAgiXkY.js.map} +1 -1
  354. package/dist/web/public/assets/{pagination-BAYvy11u.js → pagination-5GD_he3L.js} +3 -3
  355. package/dist/web/public/assets/{pagination-BAYvy11u.js.map → pagination-5GD_he3L.js.map} +1 -1
  356. package/dist/web/public/assets/{persona-CM0TLPJa.js → persona-BhkDCmeB.js} +2 -2
  357. package/dist/web/public/assets/{persona-CM0TLPJa.js.map → persona-BhkDCmeB.js.map} +1 -1
  358. package/dist/web/public/assets/{play-DMgMpe7N.js → play-B7o6cJ8W.js} +2 -2
  359. package/dist/web/public/assets/{play-DMgMpe7N.js.map → play-B7o6cJ8W.js.map} +1 -1
  360. package/dist/web/public/assets/plus-C5d4C6Zp.js +7 -0
  361. package/dist/web/public/assets/plus-C5d4C6Zp.js.map +1 -0
  362. package/dist/web/public/assets/policy-Ct_sKm3Y.js +2 -0
  363. package/dist/web/public/assets/{policy-Ch-xirrA.js.map → policy-Ct_sKm3Y.js.map} +1 -1
  364. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js → refresh-ccw-BlXMN3UX.js} +2 -2
  365. package/dist/web/public/assets/{refresh-ccw-D8mc4hxU.js.map → refresh-ccw-BlXMN3UX.js.map} +1 -1
  366. package/dist/web/public/assets/{reminders-Dbe7Rc4h.js → reminders-gb1Y0S3t.js} +4 -9
  367. package/dist/web/public/assets/reminders-gb1Y0S3t.js.map +1 -0
  368. package/dist/web/public/assets/{save-1aALBaZc.js → save-DAFuApnY.js} +2 -2
  369. package/dist/web/public/assets/{save-1aALBaZc.js.map → save-DAFuApnY.js.map} +1 -1
  370. package/dist/web/public/assets/{schedules-BBQ2wcnS.js → schedules-CtFumT2B.js} +3 -3
  371. package/dist/web/public/assets/{schedules-BBQ2wcnS.js.map → schedules-CtFumT2B.js.map} +1 -1
  372. package/dist/web/public/assets/{search-DDYjsJ7-.js → search-BWuZE0YD.js} +2 -2
  373. package/dist/web/public/assets/{search-DDYjsJ7-.js.map → search-BWuZE0YD.js.map} +1 -1
  374. package/dist/web/public/assets/{service-DMp11TKF.js → service-lah7RWEc.js} +3 -3
  375. package/dist/web/public/assets/{service-DMp11TKF.js.map → service-lah7RWEc.js.map} +1 -1
  376. package/dist/web/public/assets/{status-badge-Cvj81JKi.js → status-badge-BgmFa_8z.js} +2 -2
  377. package/dist/web/public/assets/{status-badge-Cvj81JKi.js.map → status-badge-BgmFa_8z.js.map} +1 -1
  378. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js → subtasks-CgqrOGhl.js} +3 -3
  379. package/dist/web/public/assets/{subtasks-BC3Pf7OZ.js.map → subtasks-CgqrOGhl.js.map} +1 -1
  380. package/dist/web/public/assets/{table-B6nK6k3L.js → table-BhDzIBvB.js} +2 -2
  381. package/dist/web/public/assets/{table-B6nK6k3L.js.map → table-BhDzIBvB.js.map} +1 -1
  382. package/dist/web/public/assets/{topn-BwFh2jKv.js → topn-DXgTCdM_.js} +3 -3
  383. package/dist/web/public/assets/{topn-BwFh2jKv.js.map → topn-DXgTCdM_.js.map} +1 -1
  384. package/dist/web/public/assets/{trash-2-CqpMjbu5.js → trash-2-i4F_Rzh3.js} +3 -3
  385. package/dist/web/public/assets/{trash-2-CqpMjbu5.js.map → trash-2-i4F_Rzh3.js.map} +1 -1
  386. package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js +2 -0
  387. package/dist/web/public/assets/use-background-tasks-Cq2D7JQJ.js.map +1 -0
  388. package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js +2 -0
  389. package/dist/web/public/assets/use-llm-admin-BzOVXSjz.js.map +1 -0
  390. package/dist/web/public/assets/{use-memory-jxZdt-RL.js → use-memory-B_RQWQyG.js} +2 -2
  391. package/dist/web/public/assets/{use-memory-jxZdt-RL.js.map → use-memory-B_RQWQyG.js.map} +1 -1
  392. package/dist/web/public/assets/{use-observability-9TDgLO9y.js → use-observability-CCTN-a71.js} +2 -2
  393. package/dist/web/public/assets/{use-observability-9TDgLO9y.js.map → use-observability-CCTN-a71.js.map} +1 -1
  394. package/dist/web/public/assets/{use-settings-DFB_c2pr.js → use-settings-D4EdDLiK.js} +2 -2
  395. package/dist/web/public/assets/{use-settings-DFB_c2pr.js.map → use-settings-D4EdDLiK.js.map} +1 -1
  396. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js → use-workspace-BhTEp_QH.js} +2 -2
  397. package/dist/web/public/assets/{use-workspace-C-Eg6yWa.js.map → use-workspace-BhTEp_QH.js.map} +1 -1
  398. package/dist/web/public/assets/useQuery-DmoWKLw3.js +2 -0
  399. package/dist/web/public/assets/{useQuery-rLmHxFp4.js.map → useQuery-DmoWKLw3.js.map} +1 -1
  400. package/dist/web/public/assets/{vector-D9UqmLi6.js → vector-By-cheMu.js} +2 -2
  401. package/dist/web/public/assets/{vector-D9UqmLi6.js.map → vector-By-cheMu.js.map} +1 -1
  402. package/dist/web/public/assets/{viewer-_OpObeWr.js → viewer-CJNrz2iw.js} +3 -3
  403. package/dist/web/public/assets/{viewer-_OpObeWr.js.map → viewer-CJNrz2iw.js.map} +1 -1
  404. package/dist/web/public/assets/{workspace-DSHRdspq.js → workspace-DvYlIAhu.js} +4 -4
  405. package/dist/web/public/assets/{workspace-DSHRdspq.js.map → workspace-DvYlIAhu.js.map} +1 -1
  406. package/dist/web/public/assets/{workspaces-CsBdhbXz.js → workspaces-2pn73O-K.js} +3 -3
  407. package/dist/web/public/assets/{workspaces-CsBdhbXz.js.map → workspaces-2pn73O-K.js.map} +1 -1
  408. package/dist/web/public/assets/{x-D1re-vBd.js → x-5Z_de5zo.js} +2 -2
  409. package/dist/web/public/assets/{x-D1re-vBd.js.map → x-5Z_de5zo.js.map} +1 -1
  410. package/dist/web/public/index.html +2 -2
  411. package/dist/web/server.d.ts.map +1 -1
  412. package/dist/web/server.js +45 -0
  413. package/dist/web/server.js.map +1 -1
  414. package/package.json +2 -2
  415. package/dist/web/public/assets/agents-lrzFDGgX.js +0 -12
  416. package/dist/web/public/assets/agents-lrzFDGgX.js.map +0 -1
  417. package/dist/web/public/assets/hot-CFGHGkqL.js +0 -17
  418. package/dist/web/public/assets/hot-CFGHGkqL.js.map +0 -1
  419. package/dist/web/public/assets/index-C4hk1i67.js +0 -166
  420. package/dist/web/public/assets/index-C4hk1i67.js.map +0 -1
  421. package/dist/web/public/assets/index-Cvacw7Jg.css +0 -1
  422. package/dist/web/public/assets/installed-UONWfKHS.js +0 -7
  423. package/dist/web/public/assets/installed-UONWfKHS.js.map +0 -1
  424. package/dist/web/public/assets/layout-C8_IQRGM.js +0 -2
  425. package/dist/web/public/assets/layout-C8_IQRGM.js.map +0 -1
  426. package/dist/web/public/assets/layout-CxRHLqvi.js +0 -2
  427. package/dist/web/public/assets/layout-CxRHLqvi.js.map +0 -1
  428. package/dist/web/public/assets/layout-LC5zjw1h.js +0 -2
  429. package/dist/web/public/assets/layout-LC5zjw1h.js.map +0 -1
  430. package/dist/web/public/assets/policy-Ch-xirrA.js +0 -2
  431. package/dist/web/public/assets/reminders-Dbe7Rc4h.js.map +0 -1
  432. package/dist/web/public/assets/use-skills-OZKB5x-S.js +0 -2
  433. package/dist/web/public/assets/use-skills-OZKB5x-S.js.map +0 -1
  434. package/dist/web/public/assets/useQuery-rLmHxFp4.js +0 -2
@@ -0,0 +1,598 @@
1
+ // Native AgentAdapter — agim's first in-process LLM agent (Stage 2 sub-PR #4).
2
+ //
3
+ // The native adapter is the **opt-in backup** path: the CLI agents
4
+ // (Claude Code / Codex / OpenCode) keep being the main route for IM
5
+ // users, but operators can now ALSO register a native agent that runs
6
+ // entirely inside agim — no subprocess spawn, no claude.json, just
7
+ // LLM API call + the agent loop from sub-PR #3.
8
+ //
9
+ // Concrete shape of one IM turn driven by this adapter:
10
+ //
11
+ // user message
12
+ // ↓
13
+ // AgentAdapter.sendPrompt(sessionId, prompt, history, opts)
14
+ // ↓
15
+ // 1. resolveProvider(role) ← pick the LLM (role-based)
16
+ // 2. build LlmMessage[] from history+prompt
17
+ // 3. assemble dispatcher
18
+ // = combineDispatchers(builtin, mcp)
19
+ // 4. assemble approval gate (from operator policy config)
20
+ // 5. runAgentLoop(...) — multi-iter tool loop
21
+ // 6. yield the final text as a SINGLE chunk (buffered) back to the
22
+ // adapter's AsyncGenerator contract
23
+ //
24
+ // Stage 2 sub-PR #4 deliberately ships:
25
+ // - one LLM call per IM turn (no streaming of incremental thinking
26
+ // to IM; that's a separate feature)
27
+ // - sequential tool execution within each iteration (matches
28
+ // agent-loop's current contract)
29
+ // - policy-based approval (mode=allow-list by default; operators
30
+ // opt into looser modes via env)
31
+ // - the existing tryIntrospect-style usage / cost audit accounting
32
+ //
33
+ // Out of scope here (covered later):
34
+ // - IM-interactive approval cards (button taps / y-n IM reply); the
35
+ // policy gate is sufficient for the initial release
36
+ // - Streaming partial responses to IM (we already accumulate the
37
+ // final text; partial streaming wants viewer-routing support too)
38
+ // - Session persistence specific to native (we reuse the caller-
39
+ // supplied history; agim's regular session manager handles
40
+ // persistence across turns)
41
+ import { logger as rootLogger } from '../../../core/logger.js';
42
+ import { logInvocation } from '../../../core/audit-log.js';
43
+ import { runAgentLoop, buildMcpDispatcher, combineDispatchers, getProvider, getAllMcpTools, } from '../../../core/llm/index.js';
44
+ import { buildBuiltinDispatcher, getBuiltinTools, } from '../../../core/llm/builtin-dispatcher.js';
45
+ import { buildPolicyApprovalGate, describePolicy, } from '../../../core/llm/policy-approval-gate.js';
46
+ import { buildImhubDispatcher, getImhubTools, } from '../../../core/llm/imhub-dispatcher.js';
47
+ import { listSkills } from '../../../core/skills/loader.js';
48
+ import { describeRegistry as describeMcpRegistry } from '../../../core/llm/mcp-registry.js';
49
+ import { resolveAgentCwd, defaultAgentCwd } from '../../../core/agent-cwd.js';
50
+ import { handlePushOp } from '../../../core/push-rpc.js';
51
+ import { maybeCompactHistory } from '../../../core/llm/auto-compact.js';
52
+ import { existsSync as fsExistsSync, statSync as fsStatSync, readFileSync as fsReadFileSync } from 'node:fs';
53
+ import { resolve as pathResolve, sep as pathSep, join as pathJoin } from 'node:path';
54
+ import { sanitizeForInjection, scanForInjectionAttempts } from '../../../core/prompt-injection-guard.js';
55
+ const log = rootLogger.child({ component: 'native-agent' });
56
+ /**
57
+ * v1.2.47 — system prompt is rebuilt per IM turn so the model sees:
58
+ * - which LLM backend + role it's actually running on
59
+ * - the agim process working directory (no per-thread cwd today)
60
+ * - the live skill roster (names + one-line descriptions), with the
61
+ * hint to call mcp__imhub__read_skill for full bodies
62
+ * - external MCP servers currently connected
63
+ *
64
+ * Before v1.2.47 the prompt was a 4-line generic string; users
65
+ * complained that asking "what model are you" / "what skills do you
66
+ * have" got non-answers ("I don't know; ask the operator"). The
67
+ * builder closes that information gap without leaking secrets — every
68
+ * field surfaced here is operator-configured and non-sensitive.
69
+ */
70
+ function buildSystemPrompt(provider, role, cwd) {
71
+ const skills = listSkills();
72
+ const skillsBlock = skills.length
73
+ ? skills.map((s) => ` - ${s.name}: ${s.description}`).join('\n')
74
+ : ' (no skill cards loaded; see docs/skills.md to add one)';
75
+ const mcpReg = describeMcpRegistry();
76
+ const externalMcp = mcpReg.servers.length
77
+ ? mcpReg.servers
78
+ .map((s) => ` - ${s.name} (${s.connected ? `${s.toolCount} tools` : `disconnected${s.error ? ': ' + s.error : ''}`})`)
79
+ .join('\n')
80
+ : ' (none configured)';
81
+ const lines = [];
82
+ // Operator-supplied role definition. Reads <cwd>/AGENTS.md (seeded by
83
+ // bootstrapAgentWorkspaces) and prepends it as a role block. Lets
84
+ // operators customise the agent's identity, tone, and house rules
85
+ // without touching code. Sanitised + scanned for prompt-injection
86
+ // patterns (best-effort warn; never blocks turn).
87
+ const opRole = readOperatorRole(cwd);
88
+ if (opRole) {
89
+ lines.push('[operator role definition]');
90
+ lines.push(opRole);
91
+ lines.push('[/operator role definition]');
92
+ lines.push('');
93
+ }
94
+ lines.push(`You are agim native — agim's in-process LLM agent talking to a user over an IM platform.`, ``, `Runtime:`, ` Backend: ${provider.providerType}:${provider.name}`, ` Role: ${role}`, ` Working directory: ${cwd}`, ``, `Tools available beyond the four native built-ins (echo / now / sleep / random_uuid):`, ` - agim built-in MCP tools (mcp__imhub__*): read_skill, list_skills, save_memo, search_memos, update_memo, delete_memo, push_message, ask_user, call_agent`, ` - External MCP servers configured by the operator:`, externalMcp, ``, `Available skill cards (call mcp__imhub__read_skill('<name>') for the full body):`, skillsBlock, ``, `Guidance:`, ` - Be terse; avoid filler. Prefer tool use over guessing.`, ` - When uncertain, call mcp__imhub__ask_user(question, choices[]) instead of free-form back-and-forth.`, ` - When the user references something they told the bot before, search memos via mcp__imhub__search_memos.`, ` - When a heavy task fits another agent better (e.g. code editing → claude-code), use mcp__imhub__call_agent.`);
95
+ return lines.join('\n');
96
+ }
97
+ /** Read <cwd>/AGENTS.md (if present) and prepare it for injection into
98
+ * the system prompt. Returns '' on missing file / read failure / empty
99
+ * content. Sanitises text length (8000 char cap) and scans for the
100
+ * classic prompt-injection signals ("ignore previous instructions",
101
+ * "always allow", etc.); when matches are found we still inject (the
102
+ * operator likely wrote them deliberately) but log a warn + audit
103
+ * hit so post-incident forensics can correlate. Honours
104
+ * IMHUB_NATIVE_AGENT_ROLE_FILE for a non-default location. */
105
+ export function readOperatorRole(cwd) {
106
+ const override = process.env.IMHUB_NATIVE_AGENT_ROLE_FILE;
107
+ const path = override && override.length > 0 ? override : pathJoin(cwd, 'AGENTS.md');
108
+ if (!fsExistsSync(path))
109
+ return '';
110
+ let raw = '';
111
+ try {
112
+ raw = fsReadFileSync(path, 'utf-8');
113
+ }
114
+ catch {
115
+ return '';
116
+ }
117
+ const trimmed = raw.trim();
118
+ if (!trimmed)
119
+ return '';
120
+ try {
121
+ const scan = scanForInjectionAttempts(trimmed);
122
+ if (scan.suspicious) {
123
+ log.warn({
124
+ event: 'native.role_file.injection_signals',
125
+ file: path,
126
+ matched: scan.matched,
127
+ }, `${path} contains prompt-injection-style language; injecting anyway — operator review recommended`);
128
+ }
129
+ }
130
+ catch { /* scan is best-effort */ }
131
+ return sanitizeForInjection(trimmed, 8000);
132
+ }
133
+ /** Role priority for picking which LLM backend powers the native chat
134
+ * turn. First found wins. Operators can override the role via
135
+ * `IMHUB_NATIVE_AGENT_ROLE`. */
136
+ const DEFAULT_ROLE_FALLBACK = ['native-chat', 'cheap'];
137
+ function resolveRole() {
138
+ const raw = process.env.IMHUB_NATIVE_AGENT_ROLE;
139
+ if (raw?.trim())
140
+ return [raw.trim(), ...DEFAULT_ROLE_FALLBACK];
141
+ return DEFAULT_ROLE_FALLBACK.slice();
142
+ }
143
+ function pickProvider() {
144
+ for (const role of resolveRole()) {
145
+ const p = getProvider(role);
146
+ if (p)
147
+ return { provider: p, role };
148
+ }
149
+ return null;
150
+ }
151
+ /**
152
+ * Build the ordered fallback chain of (provider, role) pairs the agent
153
+ * loop will retry against. The chain begins with whatever pickProvider
154
+ * picks (operator's primary), then appends each remaining role that has
155
+ * a registered provider — de-duplicated by provider name so we never
156
+ * retry the exact same backend.
157
+ *
158
+ * The loop driver in sendPrompt walks this chain when an iteration ends
159
+ * with a TRANSIENT provider error (HTTP 5xx / network reset / 408).
160
+ * Non-transient errors (4xx misconfig, schema validation) end the turn
161
+ * immediately — retrying won't help and just multiplies cost.
162
+ */
163
+ function pickProviderChain() {
164
+ const chain = [];
165
+ const seen = new Set();
166
+ for (const role of resolveRole()) {
167
+ const p = getProvider(role);
168
+ if (!p)
169
+ continue;
170
+ if (seen.has(p.name))
171
+ continue;
172
+ seen.add(p.name);
173
+ chain.push({ provider: p, role });
174
+ }
175
+ return chain;
176
+ }
177
+ /** Resolve the operator's approval policy from env. Defaults to
178
+ * `allow-list` mode with NO allow entries — equivalent to "no tool
179
+ * calls". Operators that want native to actually call tools must
180
+ * configure at least one of these env vars:
181
+ *
182
+ * IMHUB_NATIVE_AGENT_MODE=allow-all|read-only|allow-list|deny-all
183
+ * IMHUB_NATIVE_AGENT_AUTOALLOW=tool1,tool2,...
184
+ * IMHUB_NATIVE_AGENT_DENYLIST=tool1,...
185
+ *
186
+ * The `read-only` mode is the recommended starter — it accepts every
187
+ * tool whose name starts/ends with a read-only verb (`read_*` /
188
+ * `list_*` / `get_*` / etc.) and the four built-ins
189
+ * (`native_echo`/`now`/`random_uuid` — `sleep_ms` excluded).
190
+ */
191
+ function resolvePolicy() {
192
+ const mode = (process.env.IMHUB_NATIVE_AGENT_MODE || 'allow-list').toLowerCase();
193
+ const autoAllow = splitEnvList(process.env.IMHUB_NATIVE_AGENT_AUTOALLOW);
194
+ const denyList = splitEnvList(process.env.IMHUB_NATIVE_AGENT_DENYLIST);
195
+ // Allow the 3 safe native builtins + all first-party imhub MCP tools by
196
+ // default. The imhub tools are in-process (no external API cost, no
197
+ // network side-effects beyond what the IM bridge would do anyway) and
198
+ // are part of agim's own surface — denying them by default is the same
199
+ // class of misconfiguration as denying agim itself. Operators can
200
+ // remove individual entries via IMHUB_NATIVE_AGENT_DENYLIST.
201
+ const defaultBuiltins = [
202
+ 'native_echo', 'native_now', 'native_random_uuid',
203
+ 'mcp__imhub__read_skill', 'mcp__imhub__list_skills',
204
+ 'mcp__imhub__save_memo', 'mcp__imhub__search_memos',
205
+ 'mcp__imhub__update_memo', 'mcp__imhub__delete_memo',
206
+ 'mcp__imhub__push_message', 'mcp__imhub__ask_user',
207
+ 'mcp__imhub__call_agent',
208
+ ];
209
+ const effectiveAllow = mode === 'allow-list'
210
+ ? Array.from(new Set([...autoAllow, ...defaultBuiltins]))
211
+ : autoAllow;
212
+ return { mode, autoAllow: effectiveAllow, denyList };
213
+ }
214
+ function splitEnvList(raw) {
215
+ if (!raw)
216
+ return [];
217
+ return raw.split(',').map((s) => s.trim()).filter(Boolean);
218
+ }
219
+ /** Are we configured AT ALL to make tool calls? Reflected in startup
220
+ * log + onboarding hints so the operator notices when they ship
221
+ * `agents:['native']` without configuring a backend. */
222
+ function isConfigured() {
223
+ return pickProvider() !== null;
224
+ }
225
+ /**
226
+ * Extract media attachments from a prompt string. Messenger adapters
227
+ * (telegram / wechat / discord / feishu / dingtalk) inline a marker like
228
+ * `[图片附件:/abs/path/to/file.jpg]` or `[image attachment: ...]` when a
229
+ * user message carries a media payload. The path is already downloaded
230
+ * to `~/.agim/media/<platform>/...` by the adapter, so we only need to
231
+ * surface it to vision-capable providers; non-vision providers see the
232
+ * original text and can still acknowledge the attachment.
233
+ *
234
+ * Heuristic-safe: matches absolute paths under common image extensions
235
+ * + a path-safety check that the file exists. Anything ambiguous (no
236
+ * extension, file missing, points outside ~/.agim/media) is silently
237
+ * skipped so we never leak random filesystem paths into a vision call.
238
+ */
239
+ export function parsePromptMedia(prompt) {
240
+ if (!prompt)
241
+ return [];
242
+ // Match both Chinese 图片附件 marker and English "image attachment".
243
+ // Capture group is the path between `:`/`: ` and `]`.
244
+ const re = /\[(?:图片附件|image attachment)[::]\s*([^\]]+)\]/g;
245
+ const out = [];
246
+ const home = process.env.HOME || '/root';
247
+ const mediaRootRaw = process.env.IMHUB_MEDIA_ROOT || `${home}/.agim/media`;
248
+ // Normalise media root once so the prefix check works regardless of
249
+ // trailing slashes / dotted segments in the env override.
250
+ const mediaRoot = pathResolve(mediaRootRaw);
251
+ const mediaPrefix = mediaRoot.endsWith(pathSep) ? mediaRoot : mediaRoot + pathSep;
252
+ let m;
253
+ while ((m = re.exec(prompt)) !== null) {
254
+ const rawPath = (m[1] || '').trim();
255
+ if (!rawPath)
256
+ continue;
257
+ // Path-safety: must be absolute AND resolve to a real file UNDER
258
+ // the media root. Use path.resolve + sep-aware prefix check so
259
+ // siblings like `/root/.agim/media-evil/x` and traversals like
260
+ // `/root/.agim/media/../etc/x` are rejected.
261
+ if (!rawPath.startsWith('/'))
262
+ continue;
263
+ const normalised = pathResolve(rawPath);
264
+ if (normalised !== mediaRoot && !normalised.startsWith(mediaPrefix))
265
+ continue;
266
+ try {
267
+ if (!fsExistsSync(normalised))
268
+ continue;
269
+ if (!fsStatSync(normalised).isFile())
270
+ continue;
271
+ }
272
+ catch {
273
+ continue;
274
+ }
275
+ // Image-only for v1; ignore other extensions to keep providers happy.
276
+ const lower = normalised.toLowerCase();
277
+ if (!/\.(jpg|jpeg|png|webp|gif)$/.test(lower))
278
+ continue;
279
+ out.push({ path: normalised });
280
+ }
281
+ return out;
282
+ }
283
+ /**
284
+ * Tool-call heartbeat helper. Solves the "agim 没反应" anxiety during
285
+ * long tool calls (research-shaped tools / call_agent A2A turns can
286
+ * run > 10s under the 30-minute hard timeout).
287
+ *
288
+ * Behaviour:
289
+ * - When a tool call's onToolStart fires, schedule a one-shot push
290
+ * to the IM thread after IMHUB_NATIVE_HEARTBEAT_MS (default 6000).
291
+ * - When the call's onToolEnd fires first, cancel the pending push.
292
+ * - shutdown() clears any still-pending timers (turn finished cleanly).
293
+ *
294
+ * Suppression: handlePushOp uses the standard notification-evaluator
295
+ * gate + the per-user rate limit (10/min default). The heartbeat is
296
+ * intentionally short ("🔧 调用工具 X 中…") so the gate's "low signal"
297
+ * rule rarely drops it; if operators want them muted entirely, set
298
+ * IMHUB_NATIVE_HEARTBEAT_MS=0.
299
+ */
300
+ function buildHeartbeats(runCtx) {
301
+ // Tool-level pulse: tools that take longer than IMHUB_NATIVE_HEARTBEAT_MS
302
+ // (default 6000) push a one-shot "🔧 调用工具 X 中…" so the user knows
303
+ // why the bot has gone quiet. Cancelled on tool end. Set 0 to disable.
304
+ const rawDelay = parseInt(process.env.IMHUB_NATIVE_HEARTBEAT_MS || '6000', 10);
305
+ const toolDelayMs = Number.isFinite(rawDelay) && rawDelay > 0 ? rawDelay : 0;
306
+ // Turn-level pulse: every IMHUB_NATIVE_TURN_HEARTBEAT_MS (default 180_000
307
+ // = 3 min) since turn start, push a "⏳ 还在处理(已 Nm)..." so a multi-
308
+ // step research turn that runs many sub-agents reassures the user it's
309
+ // still alive even between tool calls. Set 0 to disable. The first
310
+ // pulse fires after delayMs, NOT immediately, so short turns stay silent.
311
+ const rawTurnMs = parseInt(process.env.IMHUB_NATIVE_TURN_HEARTBEAT_MS || '180000', 10);
312
+ const turnDelayMs = Number.isFinite(rawTurnMs) && rawTurnMs > 0 ? rawTurnMs : 0;
313
+ const pending = new Map();
314
+ const startedAt = Date.now();
315
+ let turnTimer = null;
316
+ if (turnDelayMs > 0) {
317
+ turnTimer = setInterval(() => {
318
+ const elapsedMin = Math.round((Date.now() - startedAt) / 60_000);
319
+ void handlePushOp({ text: `⏳ 还在处理(已 ${elapsedMin}m)…` }, runCtx).catch(() => { });
320
+ }, turnDelayMs);
321
+ }
322
+ const shutdown = () => {
323
+ for (const t of pending.values())
324
+ clearTimeout(t);
325
+ pending.clear();
326
+ if (turnTimer) {
327
+ clearInterval(turnTimer);
328
+ turnTimer = null;
329
+ }
330
+ };
331
+ const noop = () => { };
332
+ if (toolDelayMs === 0)
333
+ return { hooks: { onToolStart: noop, onToolEnd: noop }, shutdown };
334
+ return {
335
+ hooks: {
336
+ onToolStart(call) {
337
+ const timer = setTimeout(() => {
338
+ void handlePushOp({ text: `🔧 调用工具 \`${call.name}\` 中…(已 ${Math.round(toolDelayMs / 1000)}s)` }, runCtx).catch(() => { });
339
+ pending.delete(call.id);
340
+ }, toolDelayMs);
341
+ pending.set(call.id, timer);
342
+ },
343
+ onToolEnd(call) {
344
+ const t = pending.get(call.id);
345
+ if (t) {
346
+ clearTimeout(t);
347
+ pending.delete(call.id);
348
+ }
349
+ },
350
+ },
351
+ shutdown,
352
+ };
353
+ }
354
+ // ─── AgentAdapter implementation ─────────────────────────────────────
355
+ class NativeAgentAdapter {
356
+ name = 'native';
357
+ aliases = ['llm', 'native-llm', 'na'];
358
+ kind = 'in-process';
359
+ /** One-line UI hint surfaced by `/agents`: which LLM role + backend
360
+ * currently powers this adapter. Returns undefined when not
361
+ * configured (caller renders 'NOT CONFIGURED' elsewhere). */
362
+ describe() {
363
+ const picked = pickProvider();
364
+ if (!picked)
365
+ return undefined;
366
+ // 'role -> vendor:backend' so a glance at /agents tells you which
367
+ // LLM is wired without opening config.json.
368
+ return `role=${picked.role} -> ${picked.provider.providerType}:${picked.provider.name}`;
369
+ }
370
+ async isAvailable() {
371
+ return isConfigured();
372
+ }
373
+ async *sendPrompt(sessionId, prompt, history = [], opts = {}) {
374
+ const picked = pickProvider();
375
+ if (!picked) {
376
+ const msg = '❌ native agent: no LLM backend configured for role `native-chat` or `cheap`. Add one in `~/.agim/config.json` `llmBackends`/`llmRoles` (see docs/llm-backends.md).';
377
+ yield msg;
378
+ return;
379
+ }
380
+ const { provider, role } = picked;
381
+ // Build the message array. The native loop accepts a system message
382
+ // either as the first element OR via systemPrompt; we go with the
383
+ // dedicated field so user-supplied history doesn't get clipped by
384
+ // a synthetic system message.
385
+ const messages = [];
386
+ for (const m of history) {
387
+ // ChatMessage role is 'user' | 'assistant'; both map straight
388
+ // through. Skip empty content to keep prompts compact.
389
+ if (!m.content)
390
+ continue;
391
+ messages.push({ role: m.role, content: m.content });
392
+ }
393
+ // Parse `[图片附件:/path/to/file]` / `[image attachment: ...]` markers
394
+ // that messenger adapters inline into the prompt. Vision-capable
395
+ // providers will encode them as image_url blocks; others just see
396
+ // the original text and the model can acknowledge "an image was
397
+ // attached at <path>" without inspecting bytes.
398
+ const userMedia = parsePromptMedia(prompt);
399
+ messages.push({ role: 'user', content: prompt, ...(userMedia.length > 0 ? { media: userMedia } : {}) });
400
+ // Auto-compact long chats before the provider call. Op-out via
401
+ // IMHUB_NATIVE_COMPACT_TRIGGER_CHARS=0. Failure mode is no-op.
402
+ const compact = await maybeCompactHistory(messages);
403
+ const effectiveMessages = compact.messages;
404
+ if (compact.compacted) {
405
+ log.info({
406
+ event: 'native.compact.applied',
407
+ sessionId,
408
+ originalChars: compact.originalChars,
409
+ summaryChars: compact.summaryChars,
410
+ collapsedCount: compact.collapsedCount,
411
+ });
412
+ }
413
+ // Compose dispatcher: built-in first (so a stray MCP server with
414
+ // a colliding tool name doesn't shadow `native_now` etc.), then
415
+ // imhub built-ins (skills / memo / push / ask_user / call_agent),
416
+ // then external MCP. v1.2.47 added the imhub layer so native sees
417
+ // exactly the same mcp__imhub__* surface claude-code does via the
418
+ // MCP sidecar.
419
+ const imhubCtx = {
420
+ platform: opts.platform || 'native-agent',
421
+ channelId: opts.channelId || 'default',
422
+ threadId: opts.threadId || sessionId,
423
+ userId: opts.userId || 'unknown',
424
+ callerAgent: 'native',
425
+ callerDepth: opts.callDepth ?? 0,
426
+ };
427
+ const dispatch = combineDispatchers(buildBuiltinDispatcher(), buildImhubDispatcher(imhubCtx), buildMcpDispatcher());
428
+ // Compose tool list the same way (built-in → imhub → external MCP).
429
+ // Provider tool roster wins on duplicate names via "later
430
+ // definition wins" semantics inside the provider, but our naming
431
+ // is namespaced (`native_*`, `mcp__imhub__*`, `mcp_<server>_*`)
432
+ // so collisions are not expected in practice.
433
+ const tools = [
434
+ ...getBuiltinTools(),
435
+ ...getImhubTools(),
436
+ ...getAllMcpTools(),
437
+ ];
438
+ const policy = resolvePolicy();
439
+ const approve = buildPolicyApprovalGate(policy);
440
+ const startedAt = Date.now();
441
+ log.info({
442
+ event: 'native.turn.start',
443
+ sessionId,
444
+ role,
445
+ backend: provider.name,
446
+ policy: describePolicy(policy),
447
+ tools: tools.length,
448
+ platform: opts.platform,
449
+ threadId: opts.threadId,
450
+ });
451
+ // Resolve native's working directory the same way claude-code does:
452
+ // IM calls (threadId + platform set) pin to ~/.agim-workspaces/native/
453
+ // so the agent has a stable, isolated home for any future filesystem
454
+ // tools and AGENTS.md guidance. Out-of-IM calls (web, scheduler) fall
455
+ // back to defaultAgentCwd so the prompt always reports a real path
456
+ // rather than systemd's '/'.
457
+ const cwd = resolveAgentCwd('native', opts) || defaultAgentCwd('native');
458
+ const traceId = `native-${sessionId}-${Date.now()}`;
459
+ // Wall-clock cap for the agent loop. agim's IM-layer enforces a 30-
460
+ // minute hard ceiling per turn (DEFAULT_TIMEOUT_MS in agent-base.ts);
461
+ // we set the inner loop a hair below so the loop's own abort fires
462
+ // with a clean `finishReason='aborted'` BEFORE the outer SIGTERM. The
463
+ // agent-loop default is a conservative 5 minutes which is far too
464
+ // short for native turns that orchestrate sub-agents via call_agent
465
+ // (each hop can run 1-3 minutes); without this override a multi-step
466
+ // research turn would abort mid-flight even with sub-tasks healthy.
467
+ // Operator can override via IMHUB_NATIVE_AGENT_TIMEOUT_MS.
468
+ const nativeTimeoutMs = (() => {
469
+ const raw = parseInt(process.env.IMHUB_NATIVE_AGENT_TIMEOUT_MS || '', 10);
470
+ if (Number.isFinite(raw) && raw > 0)
471
+ return raw;
472
+ return 28 * 60 * 1000; // 28 min — leaves 2 min of IM-layer headroom
473
+ })();
474
+ const heartbeats = buildHeartbeats(imhubCtx);
475
+ const chain = pickProviderChain();
476
+ // chain always starts with `picked` from above — index 0 is the
477
+ // primary; rest are fallbacks. We walk the chain only when the
478
+ // PREVIOUS attempt ended with a transient provider error and the
479
+ // turn produced no assistant text yet (so retrying is safe — no
480
+ // duplicate replies).
481
+ let result = null;
482
+ let usedRole = role;
483
+ let usedProvider = provider;
484
+ for (let i = 0; i < chain.length; i++) {
485
+ const candidate = chain[i];
486
+ usedProvider = candidate.provider;
487
+ usedRole = candidate.role;
488
+ result = await runAgentLoop({
489
+ provider: candidate.provider,
490
+ systemPrompt: buildSystemPrompt(candidate.provider, candidate.role, cwd),
491
+ messages: effectiveMessages,
492
+ tools,
493
+ dispatch,
494
+ approve,
495
+ callOptions: { model: opts.model },
496
+ timeoutMs: nativeTimeoutMs,
497
+ signal: opts.signal,
498
+ audit: {
499
+ agent: `llm:${candidate.provider.name}`,
500
+ intent: 'native.agent.iter',
501
+ userId: opts.userId,
502
+ platform: opts.platform || 'native-agent',
503
+ traceId,
504
+ },
505
+ hooks: heartbeats.hooks,
506
+ });
507
+ if (result.finishReason !== 'error')
508
+ break;
509
+ const errStr = String(result.error || '');
510
+ const isTransient = /5\d\d|timeout|ECONN|ETIMEDOUT|fetch failed|socket hang up|408|network/i.test(errStr);
511
+ const hasText = result.text && result.text.length > 0;
512
+ if (!isTransient || hasText || i === chain.length - 1)
513
+ break;
514
+ log.warn({
515
+ event: 'native.fallback.next',
516
+ from: candidate.provider.name,
517
+ nextIdx: i + 1,
518
+ err: errStr,
519
+ }, `provider ${candidate.provider.name} transient-failed; trying next fallback`);
520
+ }
521
+ heartbeats.shutdown();
522
+ if (!result) {
523
+ // Shouldn't happen — pickProvider above already returned the primary
524
+ // so the chain has at least one entry. Defensive belt-and-suspenders.
525
+ yield '❌ native agent: provider chain ended without any attempt';
526
+ return;
527
+ }
528
+ // Per-turn parent audit row that aggregates the iteration rows
529
+ // already written by runAgentLoop. Lets /tasks#cost sum cost per
530
+ // turn rather than per iteration.
531
+ try {
532
+ logInvocation({
533
+ traceId,
534
+ userId: opts.userId ?? '',
535
+ platform: opts.platform || 'native-agent',
536
+ agent: this.name,
537
+ intent: 'native.agent.turn',
538
+ promptLen: prompt.length,
539
+ responseLen: result.text.length,
540
+ durationMs: Date.now() - startedAt,
541
+ cost: typeof result.usage.costUsd === 'number' ? result.usage.costUsd : 0,
542
+ success: result.finishReason !== 'error' && result.finishReason !== 'aborted',
543
+ error: result.error,
544
+ });
545
+ }
546
+ catch { /* audit best-effort */ }
547
+ // Surface usage to cli's per-session accumulator the same way CLI
548
+ // adapters do (via opts.onUsage). agim's cost dashboard reads from
549
+ // the audit table either way, but the in-memory session usage panel
550
+ // wants it pushed here too.
551
+ if (opts.onUsage && typeof result.usage.costUsd === 'number') {
552
+ try {
553
+ opts.onUsage({ costUsd: result.usage.costUsd });
554
+ }
555
+ catch { /* best-effort */ }
556
+ }
557
+ log.info({
558
+ event: 'native.turn.done',
559
+ sessionId,
560
+ backend: usedProvider.name,
561
+ role: usedRole,
562
+ fellBack: usedProvider.name !== provider.name,
563
+ finishReason: result.finishReason,
564
+ iterations: result.iterations,
565
+ toolCalls: result.toolCalls.length,
566
+ elapsedMs: Date.now() - startedAt,
567
+ });
568
+ // Compose the user-facing reply. Failure modes surface as ASCII
569
+ // banners so the IM user sees something concrete rather than
570
+ // silence (and so logs in /tasks#cost have a non-empty
571
+ // response_len to filter on).
572
+ let body = result.text;
573
+ if (result.finishReason === 'error') {
574
+ body = `❌ native agent error: ${result.error ?? '(no detail)'}`;
575
+ }
576
+ else if (result.finishReason === 'max_iterations') {
577
+ body = '⚠️ native agent hit max iterations without finishing. Try a more focused prompt or raise IMHUB_NATIVE_AGENT_MAX_ITER.';
578
+ }
579
+ else if (result.finishReason === 'aborted') {
580
+ body = '⏹ native agent aborted before completion.';
581
+ }
582
+ else if (!body) {
583
+ body = '(native agent returned an empty response)';
584
+ }
585
+ yield body;
586
+ }
587
+ }
588
+ export const nativeAgentAdapter = new NativeAgentAdapter();
589
+ /** Lightweight banner for cli.ts boot log. Lets operators see at a
590
+ * glance whether `/cc native` will work before they try it in an IM
591
+ * thread. */
592
+ export function describeNativeAgent() {
593
+ const picked = pickProvider();
594
+ if (!picked)
595
+ return 'native agent: NOT CONFIGURED (no llmRoles.native-chat / .cheap)';
596
+ return `native agent: backend=${picked.provider.name} (role=${picked.role}); policy=${describePolicy(resolvePolicy())}`;
597
+ }
598
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/native/index.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import type { AgentSendOpts } from '../../../core/types.js';
3
3
  export declare class OpenCodeAdapter extends AgentBase {
4
4
  readonly name = "opencode";
5
5
  readonly aliases: string[];
6
+ readonly kind: "cli";
6
7
  protected buildArgs(prompt: string, opts: AgentSendOpts): string[];
7
8
  /**
8
9
  * opencode keys its per-project AGENTS.md and memory off the spawn cwd,
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-stdio-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/opencode-stdio-adapter.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA2B3D,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,QAAQ,CAAC,IAAI,cAAa;IAC1B,QAAQ,CAAC,OAAO,WAAuB;IAEvC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAelE;;;;;;;;;;;;;OAaG;cACa,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IAsCvF,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAO7C;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;CAiBlE"}
1
+ {"version":3,"file":"opencode-stdio-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/opencode/opencode-stdio-adapter.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AA2B3D,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,QAAQ,CAAC,IAAI,cAAa;IAC1B,QAAQ,CAAC,OAAO,WAAuB;IACvC,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAS;IAE9B,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAelE;;;;;;;;;;;;;OAaG;cACa,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IAsCvF,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAO7C;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;CAiBlE"}
@@ -32,6 +32,7 @@ const log = rootLogger.child({ component: 'agent.opencode' });
32
32
  export class OpenCodeAdapter extends AgentBase {
33
33
  name = 'opencode';
34
34
  aliases = ['oc', 'opencodeai'];
35
+ kind = 'cli';
35
36
  buildArgs(prompt, opts) {
36
37
  const args = ['run', '--format', 'json'];
37
38
  if (opts.agentSessionId)