agim-cli 1.2.159 → 1.3.1

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 (301) hide show
  1. package/CHANGELOG.md +56 -53
  2. package/README.md +87 -426
  3. package/README.zh-CN.md +85 -416
  4. package/dist/cli-ui/cmd-handlers.d.ts.map +1 -1
  5. package/dist/cli-ui/cmd-handlers.js +1 -0
  6. package/dist/cli-ui/cmd-handlers.js.map +1 -1
  7. package/dist/cli-ui/entry-menu.d.ts +0 -2
  8. package/dist/cli-ui/entry-menu.d.ts.map +1 -1
  9. package/dist/cli-ui/entry-menu.js +0 -1
  10. package/dist/cli-ui/entry-menu.js.map +1 -1
  11. package/dist/cli-ui/i18n.d.ts +3 -8
  12. package/dist/cli-ui/i18n.d.ts.map +1 -1
  13. package/dist/cli-ui/i18n.js +6 -16
  14. package/dist/cli-ui/i18n.js.map +1 -1
  15. package/dist/cli-ui/tui/app.d.ts +5 -1
  16. package/dist/cli-ui/tui/app.d.ts.map +1 -1
  17. package/dist/cli-ui/tui/app.js +243 -63
  18. package/dist/cli-ui/tui/app.js.map +1 -1
  19. package/dist/cli-ui/tui/index.d.ts.map +1 -1
  20. package/dist/cli-ui/tui/index.js +23 -5
  21. package/dist/cli-ui/tui/index.js.map +1 -1
  22. package/dist/cli-ui/tui/sessions.d.ts +2 -0
  23. package/dist/cli-ui/tui/sessions.d.ts.map +1 -1
  24. package/dist/cli-ui/tui/sessions.js +13 -3
  25. package/dist/cli-ui/tui/sessions.js.map +1 -1
  26. package/dist/cli.js +39 -70
  27. package/dist/cli.js.map +1 -1
  28. package/dist/core/acp-server.d.ts.map +1 -1
  29. package/dist/core/acp-server.js +23 -44
  30. package/dist/core/acp-server.js.map +1 -1
  31. package/dist/core/admin-allowlist.d.ts +26 -15
  32. package/dist/core/admin-allowlist.d.ts.map +1 -1
  33. package/dist/core/admin-allowlist.js +213 -179
  34. package/dist/core/admin-allowlist.js.map +1 -1
  35. package/dist/core/approval-router.d.ts.map +1 -1
  36. package/dist/core/approval-router.js +23 -0
  37. package/dist/core/approval-router.js.map +1 -1
  38. package/dist/core/ask-user-rpc.d.ts.map +1 -1
  39. package/dist/core/ask-user-rpc.js +2 -3
  40. package/dist/core/ask-user-rpc.js.map +1 -1
  41. package/dist/core/commands/builtin.js +2 -2
  42. package/dist/core/commands/builtin.js.map +1 -1
  43. package/dist/core/commands/outbox.d.ts +1 -1
  44. package/dist/core/commands/outbox.d.ts.map +1 -1
  45. package/dist/core/commands/outbox.js +5 -1
  46. package/dist/core/commands/outbox.js.map +1 -1
  47. package/dist/core/commands/service.js +2 -2
  48. package/dist/core/commands/service.js.map +1 -1
  49. package/dist/core/commands/setup.d.ts.map +1 -1
  50. package/dist/core/commands/setup.js +11 -60
  51. package/dist/core/commands/setup.js.map +1 -1
  52. package/dist/core/llm/index.d.ts +1 -1
  53. package/dist/core/llm/index.d.ts.map +1 -1
  54. package/dist/core/llm/index.js +1 -1
  55. package/dist/core/llm/index.js.map +1 -1
  56. package/dist/core/llm/registry.d.ts +6 -0
  57. package/dist/core/llm/registry.d.ts.map +1 -1
  58. package/dist/core/llm/registry.js +12 -0
  59. package/dist/core/llm/registry.js.map +1 -1
  60. package/dist/core/llm/secrets.js +2 -2
  61. package/dist/core/llm/secrets.js.map +1 -1
  62. package/dist/core/onboarding.js +1 -1
  63. package/dist/core/onboarding.js.map +1 -1
  64. package/dist/core/registry.js +3 -3
  65. package/dist/core/registry.js.map +1 -1
  66. package/dist/core/router.js +2 -2
  67. package/dist/core/router.js.map +1 -1
  68. package/dist/core/sender-allowlist.js +1 -1
  69. package/dist/core/sender-allowlist.js.map +1 -1
  70. package/dist/plugins/agents/native/index.d.ts.map +1 -1
  71. package/dist/plugins/agents/native/index.js +17 -4
  72. package/dist/plugins/agents/native/index.js.map +1 -1
  73. package/dist/plugins/agents/pi-native/factory.d.ts.map +1 -1
  74. package/dist/plugins/agents/pi-native/factory.js +9 -3
  75. package/dist/plugins/agents/pi-native/factory.js.map +1 -1
  76. package/dist/plugins/agents/pi-native/index.js +2 -2
  77. package/dist/plugins/agents/pi-native/index.js.map +1 -1
  78. package/dist/plugins/agents/pi-native/provider-resolver.d.ts +2 -0
  79. package/dist/plugins/agents/pi-native/provider-resolver.d.ts.map +1 -1
  80. package/dist/plugins/agents/pi-native/provider-resolver.js +6 -1
  81. package/dist/plugins/agents/pi-native/provider-resolver.js.map +1 -1
  82. package/dist/plugins/agents/pi-native/tool-bridge.js +1 -1
  83. package/dist/plugins/agents/pi-native/tool-bridge.js.map +1 -1
  84. package/dist/web/llm-api.d.ts.map +1 -1
  85. package/dist/web/llm-api.js +12 -0
  86. package/dist/web/llm-api.js.map +1 -1
  87. package/dist/web/public/assets/{a2a-CK_McNBZ.js → a2a-Dtc6AKjx.js} +3 -3
  88. package/dist/web/public/assets/{a2a-CK_McNBZ.js.map → a2a-Dtc6AKjx.js.map} +1 -1
  89. package/dist/web/public/assets/{activity-SXgxjjhd.js → activity-CWFI_ke7.js} +2 -2
  90. package/dist/web/public/assets/{activity-SXgxjjhd.js.map → activity-CWFI_ke7.js.map} +1 -1
  91. package/dist/web/public/assets/admins-CeQorJdU.js +17 -0
  92. package/dist/web/public/assets/admins-CeQorJdU.js.map +1 -0
  93. package/dist/web/public/assets/{agents-BhuZPnjf.js → agents-DnJruPrS.js} +3 -3
  94. package/dist/web/public/assets/{agents-BhuZPnjf.js.map → agents-DnJruPrS.js.map} +1 -1
  95. package/dist/web/public/assets/{approvals-CUsF6htp.js → approvals-BEPKSyrL.js} +3 -3
  96. package/dist/web/public/assets/{approvals-CUsF6htp.js.map → approvals-BEPKSyrL.js.map} +1 -1
  97. package/dist/web/public/assets/{arrow-down-Dhsj-A0i.js → arrow-down-CzWGZc48.js} +2 -2
  98. package/dist/web/public/assets/{arrow-down-Dhsj-A0i.js.map → arrow-down-CzWGZc48.js.map} +1 -1
  99. package/dist/web/public/assets/{arrow-up-Byeo8HHt.js → arrow-up-CXy94NPi.js} +2 -2
  100. package/dist/web/public/assets/{arrow-up-Byeo8HHt.js.map → arrow-up-CXy94NPi.js.map} +1 -1
  101. package/dist/web/public/assets/{asks-BkwfCOfj.js → asks-BszsbhPn.js} +3 -3
  102. package/dist/web/public/assets/{asks-BkwfCOfj.js.map → asks-BszsbhPn.js.map} +1 -1
  103. package/dist/web/public/assets/audit-ACrwMizd.js +2 -0
  104. package/dist/web/public/assets/{audit-DshxCHuP.js.map → audit-ACrwMizd.js.map} +1 -1
  105. package/dist/web/public/assets/{bell-CgQQygG1.js → bell-BLwNOhXO.js} +2 -2
  106. package/dist/web/public/assets/{bell-CgQQygG1.js.map → bell-BLwNOhXO.js.map} +1 -1
  107. package/dist/web/public/assets/{bgjobs-qYRbEcQY.js → bgjobs-Cwp0PmTF.js} +3 -3
  108. package/dist/web/public/assets/{bgjobs-qYRbEcQY.js.map → bgjobs-Cwp0PmTF.js.map} +1 -1
  109. package/dist/web/public/assets/{brain-V9r2NcZc.js → brain-5AJBYzXX.js} +2 -2
  110. package/dist/web/public/assets/{brain-V9r2NcZc.js.map → brain-5AJBYzXX.js.map} +1 -1
  111. package/dist/web/public/assets/{briefcase-CC-yM9eZ.js → briefcase-BTDurkZz.js} +2 -2
  112. package/dist/web/public/assets/{briefcase-CC-yM9eZ.js.map → briefcase-BTDurkZz.js.map} +1 -1
  113. package/dist/web/public/assets/chat-D7jjr-Rn.js +17 -0
  114. package/dist/web/public/assets/chat-D7jjr-Rn.js.map +1 -0
  115. package/dist/web/public/assets/{chevron-left-CTwCYqyt.js → chevron-left-CnLOhWHE.js} +2 -2
  116. package/dist/web/public/assets/{chevron-left-CTwCYqyt.js.map → chevron-left-CnLOhWHE.js.map} +1 -1
  117. package/dist/web/public/assets/chevron-right-CpWYrqTa.js +7 -0
  118. package/dist/web/public/assets/{chevron-right-CDiFYKGo.js.map → chevron-right-CpWYrqTa.js.map} +1 -1
  119. package/dist/web/public/assets/{circle-check-CWttT2Af.js → circle-check-DhcTh_uP.js} +2 -2
  120. package/dist/web/public/assets/{circle-check-CWttT2Af.js.map → circle-check-DhcTh_uP.js.map} +1 -1
  121. package/dist/web/public/assets/{circle-check-big-Cf2odn4o.js → circle-check-big-CcknUEHz.js} +2 -2
  122. package/dist/web/public/assets/{circle-check-big-Cf2odn4o.js.map → circle-check-big-CcknUEHz.js.map} +1 -1
  123. package/dist/web/public/assets/{circle-x-CMJqo4Pi.js → circle-x-QODE2UcL.js} +2 -2
  124. package/dist/web/public/assets/{circle-x-CMJqo4Pi.js.map → circle-x-QODE2UcL.js.map} +1 -1
  125. package/dist/web/public/assets/{clock-DUKggKlF.js → clock-BPBx4QWT.js} +3 -3
  126. package/dist/web/public/assets/{clock-DUKggKlF.js.map → clock-BPBx4QWT.js.map} +1 -1
  127. package/dist/web/public/assets/confirm-dialog-HsyBgWxC.js +2 -0
  128. package/dist/web/public/assets/{confirm-dialog-CMWuyC3w.js.map → confirm-dialog-HsyBgWxC.js.map} +1 -1
  129. package/dist/web/public/assets/{copy-D8mIKuYJ.js → copy-VJNELMp7.js} +3 -3
  130. package/dist/web/public/assets/{copy-D8mIKuYJ.js.map → copy-VJNELMp7.js.map} +1 -1
  131. package/dist/web/public/assets/{data-table-CHGndGOY.js → data-table-C0yaCeSS.js} +2 -2
  132. package/dist/web/public/assets/{data-table-CHGndGOY.js.map → data-table-C0yaCeSS.js.map} +1 -1
  133. package/dist/web/public/assets/{download-CgEI28s6.js → download-EUh-RXv5.js} +3 -3
  134. package/dist/web/public/assets/{download-CgEI28s6.js.map → download-EUh-RXv5.js.map} +1 -1
  135. package/dist/web/public/assets/{email-BLZQOZnx.js → email-YUzrp4Tf.js} +3 -3
  136. package/dist/web/public/assets/{email-BLZQOZnx.js.map → email-YUzrp4Tf.js.map} +1 -1
  137. package/dist/web/public/assets/{empty-state-D8kx-FwO.js → empty-state-DoiBKL4l.js} +2 -2
  138. package/dist/web/public/assets/{empty-state-D8kx-FwO.js.map → empty-state-DoiBKL4l.js.map} +1 -1
  139. package/dist/web/public/assets/{external-link-BM6n9mwt.js → external-link-Bf2430Ji.js} +2 -2
  140. package/dist/web/public/assets/{external-link-BM6n9mwt.js.map → external-link-Bf2430Ji.js.map} +1 -1
  141. package/dist/web/public/assets/{eye-Dk27zHD5.js → eye-vE4k-Us-.js} +2 -2
  142. package/dist/web/public/assets/{eye-Dk27zHD5.js.map → eye-vE4k-Us-.js.map} +1 -1
  143. package/dist/web/public/assets/facts-BPVTGzM4.js +2 -0
  144. package/dist/web/public/assets/{facts-CoWF4O82.js.map → facts-BPVTGzM4.js.map} +1 -1
  145. package/dist/web/public/assets/{goals-CuiFswaR.js → goals-HsKzf-PG.js} +3 -3
  146. package/dist/web/public/assets/{goals-CuiFswaR.js.map → goals-HsKzf-PG.js.map} +1 -1
  147. package/dist/web/public/assets/health-CSMAArAj.js +2 -0
  148. package/dist/web/public/assets/{health-C3lSUr_r.js.map → health-CSMAArAj.js.map} +1 -1
  149. package/dist/web/public/assets/{heart-pulse-D34iW_OF.js → heart-pulse-8RDC8GWv.js} +2 -2
  150. package/dist/web/public/assets/{heart-pulse-D34iW_OF.js.map → heart-pulse-8RDC8GWv.js.map} +1 -1
  151. package/dist/web/public/assets/{heartbeat-Z5gPGZhm.js → heartbeat-BzHZy7Mx.js} +3 -3
  152. package/dist/web/public/assets/{heartbeat-Z5gPGZhm.js.map → heartbeat-BzHZy7Mx.js.map} +1 -1
  153. package/dist/web/public/assets/{hot-CZJeO9Mj.js → hot-DkFvD3H4.js} +3 -3
  154. package/dist/web/public/assets/{hot-CZJeO9Mj.js.map → hot-DkFvD3H4.js.map} +1 -1
  155. package/dist/web/public/assets/index-Bc0H0I1S.css +1 -0
  156. package/dist/web/public/assets/index-D7BuMEIr.js +204 -0
  157. package/dist/web/public/assets/index-D7BuMEIr.js.map +1 -0
  158. package/dist/web/public/assets/injection-a2kkgRbT.js +2 -0
  159. package/dist/web/public/assets/{injection-BTDjIbkn.js.map → injection-a2kkgRbT.js.map} +1 -1
  160. package/dist/web/public/assets/{installed-B5IGYO0m.js → installed-XQQEPKh8.js} +3 -3
  161. package/dist/web/public/assets/{installed-B5IGYO0m.js.map → installed-XQQEPKh8.js.map} +1 -1
  162. package/dist/web/public/assets/jobs-Cby1Eq4o.js +2 -0
  163. package/dist/web/public/assets/{jobs-9YLeiSVG.js.map → jobs-Cby1Eq4o.js.map} +1 -1
  164. package/dist/web/public/assets/{layout-5cLpIeb4.js → layout-0rDvqHCV.js} +2 -2
  165. package/dist/web/public/assets/{layout-5cLpIeb4.js.map → layout-0rDvqHCV.js.map} +1 -1
  166. package/dist/web/public/assets/{layout-BdCXtDqk.js → layout-BRnEPnky.js} +2 -2
  167. package/dist/web/public/assets/{layout-BdCXtDqk.js.map → layout-BRnEPnky.js.map} +1 -1
  168. package/dist/web/public/assets/layout-BdtJtlu5.js +2 -0
  169. package/dist/web/public/assets/{layout-CgeijAPB.js.map → layout-BdtJtlu5.js.map} +1 -1
  170. package/dist/web/public/assets/{layout-DLtODZx_.js → layout-CbqldDRj.js} +2 -2
  171. package/dist/web/public/assets/{layout-DLtODZx_.js.map → layout-CbqldDRj.js.map} +1 -1
  172. package/dist/web/public/assets/layout-Gh29ouFO.js +2 -0
  173. package/dist/web/public/assets/{layout-DviZj3TJ.js.map → layout-Gh29ouFO.js.map} +1 -1
  174. package/dist/web/public/assets/{llm-BXhp_nmW.js → llm-COWnMdB9.js} +3 -3
  175. package/dist/web/public/assets/llm-COWnMdB9.js.map +1 -0
  176. package/dist/web/public/assets/loader-circle-DO3Ni2RJ.js +7 -0
  177. package/dist/web/public/assets/{loader-circle-Bgi0H_iI.js.map → loader-circle-DO3Ni2RJ.js.map} +1 -1
  178. package/dist/web/public/assets/{map-pin-o5p1iOoH.js → map-pin-BsL35E1s.js} +2 -2
  179. package/dist/web/public/assets/{map-pin-o5p1iOoH.js.map → map-pin-BsL35E1s.js.map} +1 -1
  180. package/dist/web/public/assets/{mcp-kSwFcRcU.js → mcp-CWMdxcBf.js} +3 -3
  181. package/dist/web/public/assets/{mcp-kSwFcRcU.js.map → mcp-CWMdxcBf.js.map} +1 -1
  182. package/dist/web/public/assets/{memos-uAcJzXoQ.js → memos-BYQa4d2t.js} +3 -3
  183. package/dist/web/public/assets/{memos-uAcJzXoQ.js.map → memos-BYQa4d2t.js.map} +1 -1
  184. package/dist/web/public/assets/messengers-CebazAJ1.js +2 -0
  185. package/dist/web/public/assets/{messengers-CkfyROty.js.map → messengers-CebazAJ1.js.map} +1 -1
  186. package/dist/web/public/assets/{mobile-ClKdRpd9.js → mobile-CMJRNHs2.js} +3 -3
  187. package/dist/web/public/assets/{mobile-ClKdRpd9.js.map → mobile-CMJRNHs2.js.map} +1 -1
  188. package/dist/web/public/assets/{native-agent-yfdrcTaK.js → native-agent-MGgMeTHN.js} +3 -3
  189. package/dist/web/public/assets/{native-agent-yfdrcTaK.js.map → native-agent-MGgMeTHN.js.map} +1 -1
  190. package/dist/web/public/assets/{network-BlQWIsIc.js → network-pNcx_slv.js} +2 -2
  191. package/dist/web/public/assets/{network-BlQWIsIc.js.map → network-pNcx_slv.js.map} +1 -1
  192. package/dist/web/public/assets/{outbox-CYwJu6AR.js → outbox-87hzZQLn.js} +3 -3
  193. package/dist/web/public/assets/{outbox-CYwJu6AR.js.map → outbox-87hzZQLn.js.map} +1 -1
  194. package/dist/web/public/assets/{pagination-C6qu72mB.js → pagination-C4edFAqf.js} +2 -2
  195. package/dist/web/public/assets/{pagination-C6qu72mB.js.map → pagination-C4edFAqf.js.map} +1 -1
  196. package/dist/web/public/assets/persona-BcOT3Wms.js +2 -0
  197. package/dist/web/public/assets/{persona-DnuFOp64.js.map → persona-BcOT3Wms.js.map} +1 -1
  198. package/dist/web/public/assets/{plans-DUg3JDwQ.js → plans-Ddz5qwqp.js} +3 -3
  199. package/dist/web/public/assets/{plans-DUg3JDwQ.js.map → plans-Ddz5qwqp.js.map} +1 -1
  200. package/dist/web/public/assets/{play-BGXpdCxa.js → play-Bzdymasn.js} +2 -2
  201. package/dist/web/public/assets/{play-BGXpdCxa.js.map → play-Bzdymasn.js.map} +1 -1
  202. package/dist/web/public/assets/{plus-2MZ7TkP3.js → plus-BxjzY9Wh.js} +2 -2
  203. package/dist/web/public/assets/{plus-2MZ7TkP3.js.map → plus-BxjzY9Wh.js.map} +1 -1
  204. package/dist/web/public/assets/policy-Be-tMZZc.js +2 -0
  205. package/dist/web/public/assets/{policy-C4xe2rWm.js.map → policy-Be-tMZZc.js.map} +1 -1
  206. package/dist/web/public/assets/{qr-code-BVHNR5Zs.js → qr-code-D1V5cA_X.js} +2 -2
  207. package/dist/web/public/assets/{qr-code-BVHNR5Zs.js.map → qr-code-D1V5cA_X.js.map} +1 -1
  208. package/dist/web/public/assets/{refresh-ccw-MHrCmmSv.js → refresh-ccw-BhPAzZAa.js} +2 -2
  209. package/dist/web/public/assets/{refresh-ccw-MHrCmmSv.js.map → refresh-ccw-BhPAzZAa.js.map} +1 -1
  210. package/dist/web/public/assets/{reminders-CmV_JNt5.js → reminders-DEWtrlH_.js} +3 -3
  211. package/dist/web/public/assets/{reminders-CmV_JNt5.js.map → reminders-DEWtrlH_.js.map} +1 -1
  212. package/dist/web/public/assets/{save-DhFewuZL.js → save-Cye8Vlu5.js} +2 -2
  213. package/dist/web/public/assets/{save-DhFewuZL.js.map → save-Cye8Vlu5.js.map} +1 -1
  214. package/dist/web/public/assets/{schedules-Cp63TJGf.js → schedules-CuqRy3t8.js} +3 -3
  215. package/dist/web/public/assets/{schedules-Cp63TJGf.js.map → schedules-CuqRy3t8.js.map} +1 -1
  216. package/dist/web/public/assets/{search-wZEXSmcX.js → search-BQqVArrW.js} +2 -2
  217. package/dist/web/public/assets/{search-wZEXSmcX.js.map → search-BQqVArrW.js.map} +1 -1
  218. package/dist/web/public/assets/{search-wUAqWxXK.js → search-Dot_W5Eu.js} +3 -3
  219. package/dist/web/public/assets/{search-wUAqWxXK.js.map → search-Dot_W5Eu.js.map} +1 -1
  220. package/dist/web/public/assets/security-BB-YnetQ.js +2 -0
  221. package/dist/web/public/assets/{security-BoMdDyCY.js.map → security-BB-YnetQ.js.map} +1 -1
  222. package/dist/web/public/assets/{service-C_KqtWwn.js → service-DgkqlAtM.js} +3 -3
  223. package/dist/web/public/assets/{service-C_KqtWwn.js.map → service-DgkqlAtM.js.map} +1 -1
  224. package/dist/web/public/assets/{shield-alert-CplKlUGS.js → shield-alert-CBOmgn9W.js} +2 -2
  225. package/dist/web/public/assets/{shield-alert-CplKlUGS.js.map → shield-alert-CBOmgn9W.js.map} +1 -1
  226. package/dist/web/public/assets/{status-badge-q2WooCma.js → status-badge-9sMFH4uP.js} +2 -2
  227. package/dist/web/public/assets/{status-badge-q2WooCma.js.map → status-badge-9sMFH4uP.js.map} +1 -1
  228. package/dist/web/public/assets/{subtasks-CBi4c6FD.js → subtasks-BrqdQxw_.js} +3 -3
  229. package/dist/web/public/assets/{subtasks-CBi4c6FD.js.map → subtasks-BrqdQxw_.js.map} +1 -1
  230. package/dist/web/public/assets/{table-Bmwe7n4n.js → table-CSHCu7pz.js} +2 -2
  231. package/dist/web/public/assets/{table-Bmwe7n4n.js.map → table-CSHCu7pz.js.map} +1 -1
  232. package/dist/web/public/assets/{topn-CMRS4ApA.js → topn-DZWbwDge.js} +3 -3
  233. package/dist/web/public/assets/{topn-CMRS4ApA.js.map → topn-DZWbwDge.js.map} +1 -1
  234. package/dist/web/public/assets/{trash-2-CT_B0mSH.js → trash-2-Cco09tAA.js} +2 -2
  235. package/dist/web/public/assets/{trash-2-CT_B0mSH.js.map → trash-2-Cco09tAA.js.map} +1 -1
  236. package/dist/web/public/assets/use-agim-skills-CJOJKeOZ.js +2 -0
  237. package/dist/web/public/assets/{use-agim-skills-C0HdvMQj.js.map → use-agim-skills-CJOJKeOZ.js.map} +1 -1
  238. package/dist/web/public/assets/use-background-tasks-D77bcfrq.js +2 -0
  239. package/dist/web/public/assets/{use-background-tasks-Co9CtmcD.js.map → use-background-tasks-D77bcfrq.js.map} +1 -1
  240. package/dist/web/public/assets/use-memory-CX4B1SYC.js +2 -0
  241. package/dist/web/public/assets/{use-memory-BHYuPOc9.js.map → use-memory-CX4B1SYC.js.map} +1 -1
  242. package/dist/web/public/assets/use-observability-rcc7fRmj.js +2 -0
  243. package/dist/web/public/assets/{use-observability-CHv6H0zQ.js.map → use-observability-rcc7fRmj.js.map} +1 -1
  244. package/dist/web/public/assets/use-settings-DQnJkPXp.js +2 -0
  245. package/dist/web/public/assets/{use-settings-Bx0ZTOsd.js.map → use-settings-DQnJkPXp.js.map} +1 -1
  246. package/dist/web/public/assets/use-workspace-J5eeVxw9.js +2 -0
  247. package/dist/web/public/assets/{use-workspace-zFEfqUCo.js.map → use-workspace-J5eeVxw9.js.map} +1 -1
  248. package/dist/web/public/assets/vector-xRphJ8hW.js +2 -0
  249. package/dist/web/public/assets/{vector-B9v7zTvA.js.map → vector-xRphJ8hW.js.map} +1 -1
  250. package/dist/web/public/assets/{viewer-CeD55ZLu.js → viewer-Bq7l2kE8.js} +3 -3
  251. package/dist/web/public/assets/{viewer-CeD55ZLu.js.map → viewer-Bq7l2kE8.js.map} +1 -1
  252. package/dist/web/public/assets/{workspace-Ci21xBqp.js → workspace-BqMuxPFF.js} +3 -3
  253. package/dist/web/public/assets/{workspace-Ci21xBqp.js.map → workspace-BqMuxPFF.js.map} +1 -1
  254. package/dist/web/public/assets/{workspaces-C8mT-jmj.js → workspaces-D0pYJfxI.js} +3 -3
  255. package/dist/web/public/assets/{workspaces-C8mT-jmj.js.map → workspaces-D0pYJfxI.js.map} +1 -1
  256. package/dist/web/public/index.html +2 -2
  257. package/dist/web/server.d.ts.map +1 -1
  258. package/dist/web/server.js +85 -54
  259. package/dist/web/server.js.map +1 -1
  260. package/package.json +4 -6
  261. package/dist/core/admin-bootstrap.d.ts +0 -42
  262. package/dist/core/admin-bootstrap.d.ts.map +0 -1
  263. package/dist/core/admin-bootstrap.js +0 -156
  264. package/dist/core/admin-bootstrap.js.map +0 -1
  265. package/dist/web/public/assets/admins-aofsuukT.js +0 -12
  266. package/dist/web/public/assets/admins-aofsuukT.js.map +0 -1
  267. package/dist/web/public/assets/audit-DshxCHuP.js +0 -2
  268. package/dist/web/public/assets/chat-CY4JriM5.js +0 -7
  269. package/dist/web/public/assets/chat-CY4JriM5.js.map +0 -1
  270. package/dist/web/public/assets/chevron-right-CDiFYKGo.js +0 -7
  271. package/dist/web/public/assets/confirm-dialog-CMWuyC3w.js +0 -2
  272. package/dist/web/public/assets/dialog-xeyu8dCf.js +0 -2
  273. package/dist/web/public/assets/dialog-xeyu8dCf.js.map +0 -1
  274. package/dist/web/public/assets/facts-CoWF4O82.js +0 -2
  275. package/dist/web/public/assets/health-C3lSUr_r.js +0 -2
  276. package/dist/web/public/assets/index-D1ulN_24.js +0 -199
  277. package/dist/web/public/assets/index-D1ulN_24.js.map +0 -1
  278. package/dist/web/public/assets/index-uKzGZ_Df.css +0 -1
  279. package/dist/web/public/assets/injection-BTDjIbkn.js +0 -2
  280. package/dist/web/public/assets/jobs-9YLeiSVG.js +0 -2
  281. package/dist/web/public/assets/layout-CgeijAPB.js +0 -2
  282. package/dist/web/public/assets/layout-DviZj3TJ.js +0 -2
  283. package/dist/web/public/assets/llm-BXhp_nmW.js.map +0 -1
  284. package/dist/web/public/assets/loader-circle-Bgi0H_iI.js +0 -7
  285. package/dist/web/public/assets/messengers-CkfyROty.js +0 -2
  286. package/dist/web/public/assets/persona-DnuFOp64.js +0 -2
  287. package/dist/web/public/assets/policy-C4xe2rWm.js +0 -2
  288. package/dist/web/public/assets/security-BoMdDyCY.js +0 -2
  289. package/dist/web/public/assets/use-agim-skills-C0HdvMQj.js +0 -2
  290. package/dist/web/public/assets/use-background-tasks-Co9CtmcD.js +0 -2
  291. package/dist/web/public/assets/use-llm-admin-Bd0XAQpx.js +0 -2
  292. package/dist/web/public/assets/use-llm-admin-Bd0XAQpx.js.map +0 -1
  293. package/dist/web/public/assets/use-memory-BHYuPOc9.js +0 -2
  294. package/dist/web/public/assets/use-observability-CHv6H0zQ.js +0 -2
  295. package/dist/web/public/assets/use-settings-Bx0ZTOsd.js +0 -2
  296. package/dist/web/public/assets/use-workspace-zFEfqUCo.js +0 -2
  297. package/dist/web/public/assets/useQuery-Bt7Ty7IO.js +0 -2
  298. package/dist/web/public/assets/useQuery-Bt7Ty7IO.js.map +0 -1
  299. package/dist/web/public/assets/vector-B9v7zTvA.js +0 -2
  300. package/dist/web/public/assets/x-DXACg96C.js +0 -7
  301. package/dist/web/public/assets/x-DXACg96C.js.map +0 -1
package/README.md CHANGED
@@ -1,475 +1,136 @@
1
- # Agim · 阿吉姆
2
-
3
- [中文文档](README.zh-CN.md)
4
-
5
- **Universal messenger-to-agent bridge** — connect WeChat / Feishu / DingTalk / Email to Claude Code / Codex / OpenCode, or any custom agent via ACP. Single Node.js process, no Docker, no Redis.
6
-
7
- > **Naming**: Agim ⟵ Agent + IM (with a hint of "agile"). Chinese name 阿吉姆.
8
- > npm package: **`agim-cli`** (the unscoped `agim` is reserved by npm's
9
- > anti-typosquat policy); the installed binary is **`agim`** — that's what
10
- > you type. The legacy `im-hub-pro` bin name is kept as an alias so existing
11
- > systemd units / shell aliases keep working unchanged.
12
- > On-disk paths default to **`~/.agim/`** for fresh installs but auto-detect
13
- > and continue using a pre-existing **`~/.agim/`** if one is present.
14
- > Env vars (`IMHUB_*`), HTTP headers (`X-IM-Hub-Token`), and the systemd
15
- > unit `im-hub.service` retain their legacy names for drop-in compatibility
16
- > with installations from the 0.x line — see [Migrating](#migrating).
17
-
18
- ## Highlights
19
-
20
- - **3 messengers + email, 6 agents** — WeChat (image / file / voice), Feishu, DingTalk (image / voice with server-side ASR), Email (SMTP); Claude Code, Codex, OpenCode, Antigravity, **Cursor (v1.2.49+ · `/cs`)**, and the in-process `native` LLM agent (DeepSeek / Kimi / Qwen / OpenAI / Anthropic compat — `/na`). Plus any ACP endpoint.
21
- - **Native LLM stack (v1.3.0+, hardened in v1.2.48)** — built-in in-process agent loop (`native` adapter) that talks directly to any OpenAI- / Anthropic-compatible API (DeepSeek, Kimi, GLM, Qwen, Ollama, vLLM, OpenAI, Anthropic). v1.2.48 makes native production-ready: **operator role definition** via `~/.agim-workspaces/native/AGENTS.md` (hot-reloaded, no restart), **multimodal vision** (image attachments → openai-compat `image_url` blocks), **auto-compact** long histories (>60k chars summarised by cheap role), **provider fallback chain** on transient 5xx/timeout, **turn-level heartbeat** every 3 min so multi-hop research turns never look dead, **28-min agent-loop timeout** (was 5-min default, killed long `call_agent` chains). Use it as a cheap router for `memory-distill` / `memory-consolidate` / `intent-llm`, as a local-first chat agent (`/na`), or as a peer in A2A. See [`docs/llm-backends.md`](docs/llm-backends.md) + [`docs/architecture-bridge-and-native.md`](docs/architecture-bridge-and-native.md).
22
- - **Skills multi-root scan (v1.2.48+)** — `IMHUB_SKILLS_MODE=auto` (default) merges `~/.agim/skills/` (write target) with `~/.claude/skills/`, `~/.config/opencode/skills/`, `~/.codex/skills/` so a fresh install sees every skill you already have from CLI agents. Workspace skills shadow same-named inherited entries. Settings → 技能 has 2 subtabs (Installed editor + skillhub 热门); top-level `/skills` nav merged into Settings.
23
- - **Cross-channel outbox alert (v1.2.48+)** — when a thread's outbox is dead (e.g. wechat session expired), agim auto-invalidates the stale context-token + pushes a "⚠️ outbox 告警" to your configured backup channel (`IMHUB_OPERATOR_ALERT_PLATFORM` / `IMHUB_OPERATOR_ALERT_THREAD_ID`) so you find out before the user does.
24
- - **Per-thread sustained goals (v1.3.0+ · `/goal`)** — one active multi-turn objective per IM thread, auto-injected into every prompt so the agent stays on-mission across many user turns. Lifecycle: `set / body / progress / pause / resume / complete / cancel / list`. Cross-thread admin at `/tasks/goals`. See [`docs/goals.md`](docs/goals.md).
25
- - **Heartbeat scheduler (v1.3.0+ · `/heartbeat`)** — bind a thread to a periodic "anything to do right now?" tick. Each tick runs DECIDE (cheap LLM) → EXECUTE (the agent does the work) → EVALUATE (notification gate decides whether to ping the user). Cross-thread admin at `/tasks/heartbeat`.
26
- - **Structured agent → user choice (v1.3.0+ · `mcp__imhub__ask_user`)** — agents present an N-way multiple-choice question and reliably get a typed answer back (button + text reply, configurable timeout). Avoids the "free-form chat" ambiguity for disambiguation. Pending-queue admin at `/tasks/asks`. See [`docs/ask-user.md`](docs/ask-user.md).
27
- - **agim Skills engine (v1.3.0+ · `/skill`)** — drop a `SKILL.md` into `~/.agim/skills/<name>/`, every CLI agent + native sees it. 3-tier progressive disclosure (name+desc always-on, body on-demand via `mcp__imhub__read_skill`, scripts/refs via normal file-read). Web editor at `/settings/agim-skills`. See [`docs/skills.md`](docs/skills.md).
28
- - **`/router compare` A/B evaluator (v1.3.0+)** — run the same prompt against two backends side-by-side (any combo of CLI and native), get latency + tokens + outputs in one card so you can pick a winner before changing `defaultAgent`.
29
- - **Compliance-first defaults (v1.2.23+)** — global IM adapters (Discord, Telegram) and the remote-ACP-agent surface are **hidden** by default; no installer prompt or web-admin card exposes them. Mainland-China deployments should leave them disabled. For cross-border setups, opt-in via `IMHUB_ENABLE_GLOBAL_IM=1` / `IMHUB_ENABLE_REMOTE_AGENT=1`. See [`docs/security-hardening.md`](docs/security-hardening.md) for the full security control catalogue (~30 env vars / sensitive-path denylist / outbound secret scrubber / audit-events table / admin role on tokens / R14 systemctl-aware lifecycle).
30
- - **Agent-to-Agent (A2A)** — agents call other agents inline via `mcp__imhub__call_agent`. Just say *"用 codex 帮我跑 git status"* / *"ask opencode to run the tests"* — the active agent hands off, waits, integrates the reply. Guardrails: depth limit (default 3), self-call ban, workspace whitelist, per-user budget. Observability: `/a2a stats | recent | tree <id>`. Disable with `IMHUB_A2A_ENABLED=0`.
31
- - **A2A shared artifacts (v1.1.3+)** — caller drops files into the callee's workspace via `inputs[]` (`fromAbsolutePath` / `fromCallerOutput` / inline `content`), and callee writes products to `~/.agim/artifacts/<jobId>/_agim-output/`. Returned `outputs[]` lets the caller read files on demand. Hard-link first, copy fallback. Size caps configurable.
32
- - **IM long-message viewer (v1.1.6+)** — WeChat / Feishu and friends render rich markdown poorly. When an agent's reply exceeds the size threshold (or contains a markdown table / large code block), agim stashes the full markdown in `~/.agim/viewer.db` (permanent, local-only — content never leaves your host) and sends the IM a short summary + a link `https://<your-host>/v/<uuid>`. The link is served by agim's own web console — operator exposes the web port (cloudflared / caddy / tailscale of choice). Agents can opt in explicitly by wrapping long answers in `<im-summary>…</im-summary><full-md>…</full-md>`. Enable with `IMHUB_VIEWER_ENABLED=1` + `IMHUB_VIEWER_PUBLIC_BASE_URL=https://your-host`.
33
- - **Crash-safe delivery** — every outbound message (replies, reminders, approvals, restart notices) flows through a SQLite outbox; a worker drains pending rows with exponential backoff. IM glitches and brief disconnects no longer drop replies. `/outbox status | list | failed | retry <id>`.
34
- - **In-flight job recovery** — every inbound message becomes a tracked inline job. When agim is restarted mid-flight, the next startup notifies each affected thread within 10 min. **v1.2.0+** uses native inline-button cards (`🔁 重发 / ✖ 取消`) on Feishu and other platforms that support inline buttons, falling back to text on adapters without buttons. Bystander-safe: only the original requester can resolve in group chats.
35
- - **Long-term memory (v1.2.0+)** — per-user fact store + auto-distilled "persona" summary injected into every prompt. SQLite + FTS5 default; optional vector retrieval (local BGE via `@xenova/transformers` ONNX, or any OpenAI-compatible `/v1/embeddings` endpoint) with reciprocal-rank fusion. Default OFF; enable in Settings → 自动化记忆. Web admin tab `/tasks#memory` exposes per-user persona editor + paginated facts table + JSON export. All data stays in `~/.agim/memory.db` locally.
36
- - **Cost & Health dashboard (v1.2.0+)** — `/tasks#cost` aggregates per-day spend / calls / errors / p95 latency from the audit log. Filter 1 / 7 / 30 / 90 days; top-N by user / agent / platform; daily trend chart with metric toggle. Claude per-run cost extracted from `--output-format json`.
37
- - **Agent-initiated push (v1.2.0+)** — `mcp__imhub__push_message` MCP tool lets a running agent push a follow-up message back into the IM thread without an inbound trigger (long-running jobs, schedule-aware notifications). `POST /api/notify` exposes the same primitive to webhooks / cron. Per-user rate limit + cross-thread gating.
38
- - **Admin invite (v1.2.2+)** — `agim admin invite` (or the entry-menu's "邀请新管理员" option) generates a single-use IM token; the invitee runs `/setup admin <token>` to onboard without ever touching `~/.agim/env`. `agim admin list` shows the current allowlist.
39
- - **`/remind` reminders subsystem** — one-shot + recurring (`每天8点喝水`); LLM auto-detects reminder intent in casual chat; LLM polishes delivery; agent MCP tools; web `/reminders` page; email + IM delivery
40
- - **`/memo` 5W1H persistent memory** — generic "what / who / when / where / how / why" notes with optional GPS capture (browser geolocation H5 + Baidu geocoder); permanent by default, transient bucket for parking spots / today's meeting; agents store + retrieve via MCP tools so casual mentions get remembered automatically
41
- - **Browser dashboard** — chat UI; Tasks panel with 12 tabs (jobs / background / subtasks / schedules / approvals / health / files / audit / outbox / a2a / **cost / memory**); reminders panel; memos panel; settings page with workspace CRUD + admin allowlist + Safety card (restart / stop). Bilingual (EN / 中文) with per-page lang switcher and contextual `(?)` help tooltips on jargon (v1.1.4+)
42
- - **Human-in-the-loop tool approval** — Claude tool calls pause for `y`/`n` in IM or in-page card; works across all platforms
43
- - **Rich media in WeChat / DingTalk** — receive images, files, videos; voice messages transcribed via WeChat STT, DingTalk's server-side ASR, OpenAI Whisper, or whisper.cpp (per-platform fallback chain)
44
- - **Smart routing** — intent classifier (CJK + ASCII), sticky sessions, circuit breaker, rate limiter
45
- - **Multi-tenant workspaces** — per-workspace agent whitelist, rate limits, command-level ACL
46
- - **Persistent jobs & cron** — SQLite-backed, survives restarts, 30-day retention (24h for auto-tracked inline jobs)
47
- - **Observability** — structured logging (pino + traceId), Prometheus metrics, audit log
48
- - **Security** — token-based admin/user roles (R13), sensitive-path hard-deny + outbound secret scrubber (R13), prompt-injection guard on memory + AGENTS.md (R13), per-IP WS rate limit, timing-safe auth, SSRF guards, credential file permissions, approval socket entropy, persistent `audit_events` table with 180-day retention (R12 ⑤), 25s graceful shutdown + reap (R14), startup PID self-check (R14)
49
-
50
- See [CHANGELOG.md](CHANGELOG.md) for the full version history.
51
-
52
- ## Quick Start
1
+ # Agim · Universal IM-to-Agent Bridge
53
2
 
54
- ```bash
55
- npm install -g agim-cli # Requires Node.js ≥ 18 (≥ 22 LTS recommended)
56
-
57
- # Configure at least one messenger
58
- agim # arrow-key wizard (recommended) — picks language,
59
- # then per-component setup for every messenger / agent
60
- # — or use the legacy per-component commands below:
61
- agim config wechat # QR-code login
62
- agim config feishu # App ID + Secret (no webhook needed)
63
- agim config dingtalk # ClientID + ClientSecret (Stream-mode bot)
3
+ [中文说明](README.zh-CN.md)
64
4
 
65
- # (Optional) Connect a custom remote agent over ACP
66
- agim config agent
5
+ Agim connects IM channels to AI agents with one Node.js process.
6
+ It is designed for production use: persistent delivery, session continuity, human approval, and observable operations.
67
7
 
68
- # Start the bridge
69
- agim start
70
- ```
8
+ ## What matters
71
9
 
72
- Web UI at `http://localhost:3000` chat at `/`, tasks at `/tasks`, settings at `/settings`.
10
+ - **Bridge first**: WeChat / Feishu / DingTalk / Email to multiple agent backends.
11
+ - **Agent flexibility**: Claude Code, Codex, OpenCode, Cursor, Antigravity, native LLM, and ACP remote agents.
12
+ - **AI workflows built-in**: memory, skills, goals, heartbeat scheduler, reminders, memos, ask-user.
13
+ - **Reliable runtime**: SQLite outbox, restart recovery, job board, structured audit.
14
+ - **Safety by default**: token auth, approval gate, sensitive-path denylist, optional global-IM disable.
73
15
 
74
- ### Migrating
16
+ ## Quick start
75
17
 
76
- #### From the original `agim`
77
18
  ```bash
78
- npm uninstall -g im-hub
79
19
  npm install -g agim-cli
80
- agim start # config, env vars, headers all unchanged
81
- ```
82
-
83
- #### From `agim` (0.x → 1.0)
84
- ```bash
85
- npm uninstall -g im-hub-pro
86
- npm install -g agim-cli
87
- agim start # same config dir, same env vars, same headers
88
- ```
89
-
90
- The npm package is named `agim-cli` (the unscoped name `agim` is reserved
91
- by npm's anti-typosquat policy); the **binary** it installs is `agim`,
92
- which is what you'll actually type. `agim` is also retained as a
93
- binary alias inside the package, so previous shell aliases and systemd
94
- units that call `agim` continue to work without any extra setup.
95
-
96
- ## Features
97
-
98
- | Category | Details |
99
- |----------|---------|
100
- | **Messengers** | WeChat (iLink — image / file / voice / video), Feishu (WebSocket), DingTalk (Stream mode — image / voice with built-in ASR), Email (SMTP, push-only) |
101
- | **Agents** | 6 built-in: Claude Code, Codex, OpenCode, Antigravity, Cursor (CLI via shared `AgentBase`), and **`native`** (in-process LLM loop, OpenAI/Anthropic compat). Any HTTP agent via ACP — all 7 share one `AgentAdapter` interface |
102
- | **Native LLM** | OpenAI- + Anthropic-compatible providers, external MCP server attach, multi-iteration agent loop with policy approval gate, role bindings (`cheap` / `evaluator` / `native-chat`) |
103
- | **Reminders** | `/remind` slash, LLM intent detection, LLM-polished delivery, MCP tools for agents (claude-code + opencode), web `/reminders` UI |
104
- | **Goals + Heartbeat + Ask** | `/goal` per-thread objective, `/heartbeat` periodic DECIDE/EXECUTE/EVALUATE tick, `mcp__imhub__ask_user` structured multi-choice with `/tasks/{goals,heartbeat,asks}` cross-thread admin |
105
- | **Skills** | `~/.agim/skills/<name>/SKILL.md` discovered by every agent (CLI + native); 3-tier progressive disclosure; web editor at `/settings/agim-skills` |
106
- | **Web UI** | Chat with streaming, three-state theme (light / dark / system), bilingual (EN / 中文 — every new v1.3.0 page included), SSE dashboard, settings tabs for LLM / MCP / Native Agent / Skills |
107
- | **Tool Approval** | Human-in-the-loop over IM + in-page cards; MCP sidecar for Claude; allow-list policy gate for native |
108
- | **Jobs** | Persistent SQLite job board + cron scheduler; batch ops; background task reader |
109
- | **Routing** | Intent classifier, circuit breaker, rate limiter, sticky sessions, LLM judge fallback; `/router compare` A/B evaluator |
110
- | **Workspaces** | Multi-tenant; agent whitelist + rate limits; command-level ACL |
111
- | **Observability** | pino structured logs, traceId, Prometheus `/api/metrics`, SQLite audit log |
112
- | **ACP** | Client (connect to remote agents) + Server (Agim itself as an ACP agent) with token-gated `~/.agim/acp-token` (legacy fallback `~/.agim/web-token`) |
113
-
114
- ## CLI Commands
115
-
116
- ```
117
- agim # Arrow-key wizard (bilingual zh/en) — recommended entry
118
- agim start # Start the bridge + web UI (foreground)
119
- agim start --bg # Start as a background daemon
120
- agim status # Show service status (systemd / bg / fg)
121
- agim restart # Restart the running service
122
- agim stop # Stop the running service
123
- agim uninstall # Uninstall (keeps ~/.agim-workspaces/)
124
- agim config wechat # Configure WeChat
125
- agim config feishu # Configure Feishu
126
- agim config dingtalk # Configure DingTalk (Stream-mode internal app)
127
- agim config claude # Configure Claude Code
128
- agim config agent # Connect a custom ACP agent
129
- agim agents # List available agents
130
- agim messengers # List available messengers
131
-
132
- # v1.3.0+ — native LLM stack & diagnostics
133
- agim setup llm # Wizard: add/list/remove LLM backends, bind roles, set secrets
134
- agim setup llm native-enable # One-shot: enable `native` agent if a backend is configured
135
- agim setup mcp # Wizard: add/list/remove external MCP servers (stdio / HTTP / SSE)
136
- agim setup mcp health # Probe every configured MCP server
137
- agim diag llm # Ping every backend + show which role binds to what
138
- agim diag mcp # Connect-and-list-tools per MCP server
139
-
140
- # v1.1.10+ — Web/ACP token management
141
- agim token create [name] # Mint a new user/admin token for /api/* + /acp/*
142
- agim token list # List tokens (last 4 chars only)
143
- agim token revoke <id> # Revoke a token by id
144
- agim token bootstrap # Print one-shot web-bootstrap token (`~/.agim/admin-bootstrap-token`)
145
-
146
- # (`im-hub-pro …` continues to work as a deprecated alias)
147
- ```
148
-
149
- ## Chat Commands
150
-
151
- | Command | What it does |
152
- |---------|-------------|
153
- | any text | Route to agent (sticky session, intent-classified) |
154
- | `/<agent> <prompt>` | Switch agent — `/cc`, `/oc`, `/cx`, `/co` |
155
- | `/new` | New conversation (clear context) |
156
- | `/model [id]` / `/models [filter]` | View / list / switch the active agent's model. Works for opencode (`provider/model`) and cursor (flat names like `gpt-5.2`, `sonnet-4-thinking`). v1.2.50+ |
157
- | `/think on\|off` | Toggle extended thinking |
158
- | `/remind …` | Reminders — see [Reminders](#reminders) below |
159
- | `/memo …` | 5W1H persistent memory — see [Memos](#memos) below (aliases `/记`, `/note`) |
160
- | `/job`, `/cron`, `/audit`, `/stats` | Manage jobs, cron schedules, audit, stats (`/schedule` aliases `/cron` until v0.4.0) |
161
- | `/outbox status\|list\|failed\|retry <id>` | Inspect & operate the persistent IM delivery queue (v1.1.2+) |
162
- | `/a2a stats\|recent\|tree <id>` | Agent-to-Agent observability — chain, latency, callee histogram (v1.1.2+) |
163
- | `/router status\|explain` | Inspect routing decisions |
164
- | `/router compare agent:<a> agent:<b> "<prompt>"` | A/B evaluator — run the same prompt against two backends, side-by-side card with latency / tokens / outputs (v1.3.0+) |
165
- | `/goal …` | Sustained per-thread objective — `set / body / progress / pause / resume / complete / cancel / list / show` (v1.3.0+) |
166
- | `/heartbeat …` | Periodic DECIDE→EXECUTE→EVALUATE tick — `bind / unbind / show / pause / resume / status` (v1.3.0+) |
167
- | `/skill list\|show <name>\|refresh` | Inspect agim Skills loaded from `~/.agim/skills/` (v1.3.0+) |
168
- | `/cc native …` / `/na …` / `/llm …` | Route to the in-process native LLM agent (v1.3.0+) |
169
- | `/cs …` / `/cur …` / `/cc cursor …` | Route to Cursor CLI agent (v1.2.49+); `/cs plan` enters plan mode for one turn |
170
- | `/agy …` / `/cc antigravity …` | Route to Google Antigravity (agy) CLI agent |
171
- | `y` / `n` / `批准` / `拒绝` | Approve / deny Claude tool call (or reminder confirmation card) |
172
- | `1` / `2` | After a service restart, reply `1` to redo the interrupted message or `2` to cancel (10 min window) |
173
-
174
- ## Human-in-the-loop Tool Approval
175
-
176
- When a Claude run tries to use a tool, Agim pauses and sends an approval card:
177
-
178
- ```
179
- 🔐 Tool approval request
180
- Tool: Bash
181
- Input: {"command":"rm -rf node_modules"}
182
- Reply y to approve / n to deny (auto-deny in 5 min)
183
- ```
184
-
185
- Reply `y` / `n` in IM, or click Allow / Deny in the web UI. Works identically across WeChat, Feishu, and DingTalk. Disable with `IMHUB_APPROVAL_DISABLED=1`.
186
-
187
- ## Reminders
188
-
189
- Built-in `/remind` subsystem — one-shot or recurring, with three creation paths and three delivery enhancements.
190
-
191
- ```bash
192
- # One-shot
193
- /remind 2m drink water
194
- /remind 40秒喝水
195
- /remind 下午6点下班
196
- /remind 18:30 出门
197
-
198
- # Recurring 🔁
199
- /remind 每5分钟看屏幕外
200
- /remind 每天早上8点喝水
201
- /remind 每周一三五9点站会
202
- /remind 每个工作日18:00下班
203
-
204
- # Email delivery ✉️ (requires SMTP — see Configuration)
205
- /remind email me@x.com 8:00 morning briefing
206
- /remind bindemail me@x.com # bind default → /remind email 每天8点 早安
207
- /remind unbindemail
208
-
209
- # Manage
210
- /remind list
211
- /remind cancel <id>
212
- /remind clear
213
- /remind snooze <id> 5m
214
- /remind aiwatch on|off # toggle the LLM intent detector
215
-
216
- # Disable LLM polish for one reminder
217
- /remind literal 每5分钟 喝水
20
+ agim # interactive setup wizard
21
+ agim start
218
22
  ```
219
23
 
220
- **Three creation paths** (all land in the same `~/.agim/reminders.db`):
221
-
222
- 1. **`/remind` slash** — explicit, structured input
223
- 2. **LLM intent detection** (default-on) — say "明天早上8点提醒我开会" without `/remind`, the bot pops a confirmation card; reply `y` to create
224
- 3. **Agent MCP tools** — claude-code and opencode (stdio) auto-call `create_reminder` when you mention future commitments in chat. Works with opencode (http) too via single-user agent-asserted context
225
-
226
- **Two delivery enhancements**:
227
-
228
- - **LLM polish** (default-on): at fire time the active agent rewrites the literal seed text into a natural one-liner ("早上好,记得喝杯水"). Tone constrained: *no flattery, no over-humor, no exaggeration*. Falls back to literal text on agent failure / timeout
229
- - **Late-delivery tag**: > 1 h overdue gets `⏰ 延迟投递` prefix so users know the bot was offline
24
+ Web console: `http://localhost:3000`
230
25
 
231
- Manage reminders in the web UI at `/reminders` (status filters, snooze, cancel).
26
+ - Chat: `/`
27
+ - Tasks: `/tasks`
28
+ - Settings: `/settings`
232
29
 
233
- Full design: [`docs/architecture/reminders.md`](docs/architecture/reminders.md).
30
+ ## Choose your AI backend
234
31
 
235
- ## Memos
32
+ | Scenario | Recommended path |
33
+ |---|---|
34
+ | Strong coding agent loop | `claude-code` / `codex` / `opencode` / `cursor` |
35
+ | API-only, low-cost native mode | `native` + `llmBackends` |
36
+ | Bring your own remote agent | ACP (`acpAgents`) |
236
37
 
237
- `/memo` is a 5W1H persistent memory database. Every memo can carry any subset of `what` / `who` / `when_at` / `where (lat/lng/label)` / `how` / `why` plus an optional `expires_at` lifecycle. Locations are just one axis — the same store also remembers "我爸生日 5月8日" or "苹果发了 AVP2".
38
+ Native setup details: `docs/llm-backends.md`
238
39
 
239
- ```bash
240
- # Slash
241
- /memo # search hint + recent memos
242
- /memo list # last 10
243
- /memo show <id>
244
- /memo delete <id>
245
- /memo search 茶馆
246
- /memo here [备注] # one-shot HTTPS link → browser GPS capture
247
- /memo 39.9,116.4 家 # raw coords + label
248
-
249
- # Aliases: /记, /note
250
- ```
40
+ ## Core AI workflows
251
41
 
252
- The agent (claude-code / opencode) sees 5 MCP tools and uses them automatically when you mention something worth remembering — no need to invoke a slash:
42
+ | Capability | Description | Docs |
43
+ |---|---|---|
44
+ | Long-term memory | facts + persona, optional vector retrieval | `docs/memory-and-vector.md` |
45
+ | Skills | shared `SKILL.md` capability layer across agents | `docs/skills.md` |
46
+ | Goals | sustained objective per thread (`/goal`) | `docs/goals.md` |
47
+ | Heartbeat | periodic proactive loop (`/heartbeat`) | `docs/architecture/reminders.md` |
48
+ | Ask user | structured agent->user choices | `docs/ask-user.md` |
49
+ | Reminders | one-shot / recurring reminders | `docs/architecture/reminders.md` |
50
+ | Memos | 5W1H persistent notes with optional location | `docs/im-workspaces-guide.md` |
51
+ | A2A | agent-to-agent calls with traceability | `CHANGELOG.md` |
253
52
 
254
- - `save_memo` — extract 5W1H from natural language and store; `address` arg triggers Baidu geocoder
255
- - `request_location_capture` — return a one-shot H5 link so the user can authorize browser geolocation
256
- - `search_memos` — multi-field AND-combined retrieval ("我的车在哪")
257
- - `update_memo` — patch existing entry (e.g. add `where_*` later, or pass `address` to geocode)
258
- - `delete_memo`
53
+ ## Security defaults
259
54
 
260
- **Lifecycle**: memos default to permanent. Agents only set `expires_in_hours` when content is clearly transient ("我把车停这了" / "今天下午3点开会"). A background sweep deletes expired rows.
55
+ - Web token auth enabled by default.
56
+ - Approval gate enabled by default.
57
+ - Sensitive files/paths are denied by policy.
58
+ - Global IM connectors can stay disabled in domestic deployments.
261
59
 
262
- **Time zone**: all times are interpreted as Asia/Shanghai (UTC+8) and stored as bare-local `YYYY-MM-DD HH:MM:SS`. Override with `IMHUB_TZ_OFFSET_HOURS` if your deployment is elsewhere.
60
+ Security reference: `docs/security-hardening.md`
263
61
 
264
- **Browser GPS capture**: `/memo here` and `request_location_capture` send a one-shot 10-min HTTPS link. Default base URL is `https://agent.iclaw.host`; override with `IMHUB_LOC_BASE_URL=https://your-host` if you want to keep H5 traffic on your own domain.
62
+ ## Essential IM commands
265
63
 
266
- **Address geocoding (optional)**: set `IMHUB_BAIDU_MAP_AK` to a Baidu Maps AK to enable `address: "中关村大街27号"` style inputs in `save_memo` / `update_memo`. Without it, those calls return "geocoding not configured" but raw coords + browser GPS still work. Get a free AK at [lbsyun.baidu.com](https://lbsyun.baidu.com/) → Console → 应用管理 → 创建应用 → 服务端 API. The default key flow doesn't need SN signing; if you enable SN校验 in the console, see notes in `src/core/locations.ts`.
64
+ | Command | Purpose |
65
+ |---|---|
66
+ | `/cc ...` `/oc ...` `/cx ...` `/cs ...` `/na ...` | Route to a target agent |
67
+ | `/new` | Start a new conversation session |
68
+ | `/model` `/models` | Inspect/switch model (where supported) |
69
+ | `/goal ...` | Manage per-thread long goal |
70
+ | `/heartbeat ...` | Manage heartbeat schedule |
71
+ | `/remind ...` | Manage reminders |
72
+ | `/memo ...` | Manage memo records |
73
+ | `/job ...` `/cron ...` `/audit ...` `/stats` | Runtime operations |
74
+ | `/outbox ...` | Delivery queue operations |
75
+ | `/a2a ...` | A2A runtime visibility |
267
76
 
268
- ## Configuration
77
+ ## Minimal config shape
269
78
 
270
- ### Config file
271
- `~/.agim/config.json` (validated by zod at startup):
79
+ `~/.agim/config.json`
272
80
 
273
81
  ```json
274
82
  {
275
- "messengers": ["wechat-ilink", "feishu"],
276
- "agents": ["claude-code", "opencode"],
83
+ "messengers": ["wechat-ilink"],
84
+ "agents": ["claude-code", "native"],
277
85
  "defaultAgent": "claude-code",
278
- "feishu": { "appId": "cli_***", "appSecret": "***" },
279
- "acpAgents": [
86
+ "llmBackends": [
280
87
  {
281
- "name": "my-agent",
282
- "endpoint": "https://api.example.com",
283
- "auth": { "type": "bearer", "token": "***" }
88
+ "name": "default-native",
89
+ "provider": "openai-compat",
90
+ "baseUrl": "https://api.openai.com/v1",
91
+ "model": "gpt-4o-mini"
284
92
  }
285
93
  ],
286
- "workspaces": [
287
- {
288
- "id": "team-data",
289
- "name": "Data team",
290
- "agents": ["opencode", "my-agent"],
291
- "members": ["user-123"],
292
- "rateLimit": { "rate": 30, "intervalSec": 60, "burst": 60 }
293
- }
294
- ]
94
+ "llmRoles": {
95
+ "cheap": "default-native"
96
+ }
295
97
  }
296
98
  ```
297
99
 
298
- ### Email reminders (SMTP)
299
-
300
- To enable `/remind email …`, set these environment variables before starting:
301
-
302
- ```bash
303
- # Required
304
- export IMHUB_SMTP_HOST=smtp.gmail.com
305
- export IMHUB_SMTP_USER=you@gmail.com
306
- export IMHUB_SMTP_PASS=<16-char-app-password> # NOT your normal password
307
-
308
- # Optional
309
- export IMHUB_SMTP_PORT=465 # default 465
310
- export IMHUB_SMTP_FROM=you@gmail.com # default = USER
311
- export IMHUB_SMTP_SECURE=auto # auto | true | false
312
- ```
313
-
314
- **Provider quick reference**:
315
-
316
- | Provider | HOST | PORT | Notes |
317
- |----------|------|------|-------|
318
- | Gmail | `smtp.gmail.com` | 465 | Use [App Password](https://myaccount.google.com/apppasswords) — 2-Step Verification required |
319
- | QQ Mail | `smtp.qq.com` | 465 | "授权码" (account → POP3/SMTP service) |
320
- | 163 Mail | `smtp.163.com` | 465 | "授权码" (account → POP3/SMTP/IMAP service) |
321
- | Outlook | `smtp-mail.outlook.com` | 587 | Set `IMHUB_SMTP_SECURE=false` (STARTTLS) |
322
- | Custom | any host | any port | Set `SECURE` per provider docs |
100
+ Secrets are stored separately from this file.
323
101
 
324
- Without these env vars, the email adapter still loads but `/remind email …` returns "Email adapter not configured" — IM reminders keep working.
102
+ ## Operations
325
103
 
326
- For systemd, put env in your unit file:
327
- ```ini
328
- [Service]
329
- Environment="IMHUB_SMTP_HOST=smtp.gmail.com"
330
- Environment="IMHUB_SMTP_USER=you@gmail.com"
331
- Environment="IMHUB_SMTP_PASS=xxxxxxxxxxxxxxxx"
332
- ```
104
+ - Deployment guide: `docs/deployment.md`
105
+ - Runbook: `docs/runbook.md`
106
+ - Architecture stance: `docs/architecture-bridge-and-native.md`
107
+ - Full changelog: `CHANGELOG.md`
333
108
 
334
- ### Other env vars
335
-
336
- | Env | Default | What it does |
337
- |-----|---------|-------------|
338
- | `IMHUB_WEB_BIND` | `127.0.0.1` | Web UI bind address (set `0.0.0.0` to expose; front with HTTPS reverse proxy) |
339
- | `IMHUB_APPROVAL_DISABLED` | unset | Set `=1` to skip the human-in-the-loop tool approval gate |
340
- | `IMHUB_OPENCODE_DRIVER` | `stdio` | `http` selects the HTTP driver (faster, but reminder MCP path uses single-user agent-asserted context) |
341
- | `IMHUB_OPENCODE_GATE` | `medium` | `strict` / `loose` / `none` — opencode permission gate |
342
- | `IM_HUB_LLM_JUDGE_AGENT` | unset | Agent name used as LLM router fallback judge |
343
- | `OPENAI_API_KEY` | unset | Enables OpenAI Whisper for voice transcription |
344
- | `IMHUB_WHISPERCPP_BIN` + `IMHUB_WHISPERCPP_MODEL` | unset | Local Whisper.cpp for voice transcription (no cloud) |
345
- | `IMHUB_BAIDU_MAP_AK` | unset | Baidu Maps AK; enables `/memo` address-based geocoding. Without it, raw coords + browser GPS still work. |
346
- | `IMHUB_LOC_BASE_URL` | `https://agent.iclaw.host` | Public HTTPS base URL the `/memo here` H5 capture link points at. Override for self-hosted deployments. |
347
- | `IMHUB_TZ_OFFSET_HOURS` | `8` | Hours offset from UTC for memo timestamps (Asia/Shanghai default). Change only if your deployment is elsewhere. |
348
- | `IMHUB_TELEGRAM_COORDS_GCJ02` | unset | Set to `1` to apply GCJ-02 → WGS-84 to Telegram native location/venue messages. Default off (WGS-84 pass-through). Turn on if your Telegram clients are Apple devices in mainland China — iOS Core Location applies the GCJ offset before handing coords to Telegram. |
349
- | `IMHUB_H5_COORDS_GCJ02` | unset | Set to `1` to apply GCJ-02 → WGS-84 to coords POSTed from `/memo here` H5 capture pages. Default off (WGS-84 pass-through, fits WeChat X5 webview + Android Chrome). Turn on if your users open the H5 link in iOS Safari / iOS WebKit in mainland China. See [`src/core/coord-systems.ts`](src/core/coord-systems.ts) for the full per-platform policy. |
350
- | `AGIM_HOME` | auto | Per-user state directory. By default Agim picks `~/.agim/` on a fresh install and `~/.im-hub/` on a legacy 0.x install (auto-detected). Set explicitly if you want to pin a location — e.g. on shared machines or for tests. `IMHUB_HOME` is also honored. |
351
- | `AGIM_WORKSPACES` | auto | Per-agent workspace root. Same dual-detect logic as `AGIM_HOME` (`~/.agim-workspaces/` preferred, `~/.im-hub-workspaces/` if it exists). `IMHUB_WORKSPACES` also honored. |
352
-
353
- ## Architecture
109
+ ## Docs index
354
110
 
355
- ```
356
- ┌─ IM ingress ─────────────────────────────────────┐
357
- │ WeChat iLink (long-poll + image/voice/file) │
358
- │ Telegram (grammy + photo/voice/audio) │
359
- │ Feishu (Lark SDK WebSocket) │
360
- │ DingTalk (Stream WebSocket + ASR baked in) │
361
- │ Discord (discord.js Gateway) │
362
- │ Web Chat (browser WebSocket) │
363
- └───────────────────────┬──────────────────────────┘
364
- │ MessageContext
365
-
366
- ┌── Pre-route gates ────────────────┐
367
- │ workspace · rate limiter · traceId │
368
- └────────────────┬──────────────────┘
369
-
370
- ┌── Intent router ──────────────────┐
371
- │ command → builtin │
372
- │ /agent → explicit switch │
373
- │ default → classify (regex/keyword/ │
374
- │ sticky/LLM judge) │
375
- └────────────────┬──────────────────┘
376
-
377
- ┌── Agent invocation ───────────────┐
378
- │ circuit breaker + spawn stream │
379
- └───┬──────┬──────┬──────┬───┘
380
- ▼ ▼ ▼ ▼
381
- claude opencode codex ACP
382
-
383
- ▼ (tool approval)
384
- MCP sidecar → approvalBus → IM thread
385
-
386
- ┌─ Cross-cutting ──────────────────────────────────┐
387
- │ SQLite (audit · jobs · schedules) │
388
- │ session (append-only JSONL) │
389
- │ Prometheus metrics · pino structured logging │
390
- └──────────────────────────────────────────────────┘
391
- ```
111
+ Start from: `docs/README.md`
392
112
 
393
- Single process, zero external dependencies — SQLite + session files are the entire persistence layer.
113
+ ## Migration notes
394
114
 
395
- For the full deep-dive see [`docs/architecture/current.md`](docs/architecture/current.md).
396
- For the native LLM stack and the peer-`AgentAdapter` design that lets CLI agents and the in-process loop share one router / approval bus / A2A / skills pipeline, see [`docs/architecture-bridge-and-native.md`](docs/architecture-bridge-and-native.md) and the PR-by-PR landing order in [`docs/nanobot-comparison-rollout.md`](docs/nanobot-comparison-rollout.md).
115
+ Legacy installs remain compatible:
397
116
 
398
- ## Requirements
399
-
400
- - **Node.js 18** (≥ 22 LTS recommended)
401
- - At least one agent CLI or ACP endpoint:
402
- - `npm i -g @anthropic-ai/claude-code`
403
- - `npm i -g @openai/codex`
404
- - `npm i -g opencode-ai`
117
+ - command alias compatibility retained
118
+ - legacy env naming retained
119
+ - old data path autodetected
405
120
 
406
121
  ## Development
407
122
 
408
123
  ```bash
409
- git clone https://github.com/benking007/imhub.git && cd imhub
410
- npm install
411
- npm run build # tsc + copy public/
412
- npm run dev # tsc --watch
413
- npm test # bun test
414
- npm run lint # biome lint
415
- npm run typecheck # tsc --noEmit
124
+ git clone https://github.com/benking007/agim.git
125
+ cd agim
126
+ npm install --no-package-lock
127
+ npm --prefix src/web-app install
128
+ npm run build
129
+ npm run lint
130
+ npm run typecheck
131
+ npm test
416
132
  ```
417
133
 
418
- ## Deployment
419
-
420
- See [`docs/deployment.md`](docs/deployment.md) for systemd, Docker, nginx, monitoring, admin-allowlist management, backup, and upgrade instructions. For long-term memory + vector retrieval setup / tuning / privacy, see [`docs/memory-and-vector.md`](docs/memory-and-vector.md).
421
-
422
- ## Roadmap
423
-
424
- ### Done
425
-
426
- | Version | Theme |
427
- |---------|-------|
428
- | v0.1.x | MVP — WeChat + 4 agents + command routing |
429
- | v0.2.0 | Multi-IM — Feishu, Telegram, sessions, ACP |
430
- | v0.2.13 | Foundations — logging, audit, intent, jobs, metrics, workspaces |
431
- | v0.2.14 | Human-in-the-loop tool approval |
432
- | v0.2.15 | Discord adapter + tasks dashboard |
433
- | v0.2.16–17 | Security hardening + observability |
434
- | v0.2.18–19 | IM reconnect backoff, Codex sandbox, dashboard filters |
435
- | v0.2.20–23 | Web console — theme, approvals, SSE, files, batch ops |
436
- | v0.2.30 | Production hardening — session isolation, serial WS, loopback bind |
437
- | v0.2.35 | WeChat & Telegram rich media — image / file / voice / video |
438
- | v0.2.37 | Reminders subsystem — `/remind`, LLM intent + polish, agent MCP tools, email channel, web `/reminders`, WeChat context_token persistence |
439
- | v0.3.0 | `/memo` 5W1H persistent memory — `/location` → `/memo` rename, address geocoding via Baidu Maps, opencode HTTP driver SSE drain |
440
- | v0.3.1 | Native location messages on Telegram + Feishu, GCJ-02 → WGS-84 fix across all ingest paths, `memo` column + LLM/heuristic `what` extractor |
441
- | v0.4.0 | codex agent now sees the full imhub MCP toolset (reminder + memo); Telegram + Feishu location messages routed through agent-driven decision making (matches WeChat H5 architecture) |
442
- | v0.5.0–0.5.2 | Bilingual arrow-key `agim` wizard (then `im-hub-pro` pre-rename); per-component flows (QR for WeChat, credentials prompts for Feishu / Telegram / Discord; live install detection for agents); systemd-unit env fallback for SMTP / Baidu prefill; full service lifecycle commands (`status / start --bg / restart / stop / uninstall`) |
443
- | v0.6.0 | DingTalk Stream-mode adapter — bidirectional bot bridge via WebSocket, image inbound (`messageFiles/download` → claude-code multimodal Read), voice inbound (server-side ASR `recognition` field, whisper.cpp fallback) |
444
- | v0.6.3 | Per-platform coord-system handling for native location messages (Telegram defaults WGS pass-through; H5 WGS pass-through fixes WeChat-X5 markers; DingTalk routes Baidu link URLs through BD-09→WGS) |
445
- | **v1.0.0** | Brand rename to **Agim · 阿吉姆**. New canonical bin `agim`; `im-hub-pro` retained as deprecation alias. On-disk paths / env vars / HTTP headers / systemd unit name kept stable for drop-in compat with 0.x installs. |
446
- | v1.1.2–1.1.3 | A2A L1 (call chain visualization) + L2 (shared artifact pool between agents) |
447
- | v1.1.4 | Web dashboard bilingual + jargon tooltips |
448
- | v1.1.6–1.1.8 | IM long-message viewer + cloudflared auto-tunnel |
449
- | v1.1.10 | Web console token authentication (cookie + Bearer + loopback bypass), restart message-order fix |
450
- | v1.1.11 | Viewer dark-mode readability |
451
- | **v1.2.0** | **Long-term memory** (SQLite + FTS5 + persona + 4 MCP tools + auto-distillation + Web admin tab); **vector retrieval** (local BGE / OpenAI-compatible, RRF fusion); **Cost & Health dashboard**; **agent-initiated push** (`mcp__imhub__push_message`); recovery card with native inline buttons. |
452
- | v1.2.1 | Vector backend auto-warm on restart; Memory + Cost tab i18n. |
453
- | v1.2.2 | `agim admin invite` for onboarding additional admins via IM; vector eager-warm at boot; async consolidate (jobId + polling). |
454
- | v1.2.27–v1.2.32 | R14/R15 lifecycle hardening — 25s graceful-shutdown hard cap, port-first teardown, reap stray agim processes, argv-strict /proc scan in `findAgimProcesses`, PID file on every successful start, CLI wizard "Web bind+port" section, ACP port gate (`IMHUB_ENABLE_REMOTE_AGENT`). |
455
- | **v1.3.0** | **nanobot-vs-agim comparison rollout** — `native` in-process AgentAdapter (LLM client + agent loop + MCP attach + policy approval gate, OpenAI/Anthropic-compatible); `llmBackends` + `llmRoles` + `~/.agim/llm-secrets.json` config; `/goal` per-thread sustained objective (P0 #2); `/heartbeat` 3-phase scheduler (P0 #1); `mcp__imhub__ask_user` structured choice (P0 #5); agim Skills 3-tier engine (Stage 3 + P0 #3); inline row-age annotations on memory facts (P0 #4); notification evaluator for `mcp__imhub__push_message` (P0 #9); `/router compare` A/B evaluator (Stage 5); `tryIntrospectChain` fallback helper; Web admin pages `/settings/{llm,mcp,native-agent,agim-skills}` + `/tasks/{heartbeat,goals,asks}`; CLI wizards `agim setup {llm,mcp}` + diagnostics `agim diag {llm,mcp}` + `agim setup llm native-enable` quick path; CLI + Web full i18n (en/zh) for every new surface; `acp-token` separation from `web-token`; `agim token bootstrap` printer; `gen-endpoints --check` drift guard. See [`docs/nanobot-comparison-rollout.md`](docs/nanobot-comparison-rollout.md). |
456
-
457
- ### Next
458
-
459
- - [ ] Slack adapter
460
- - [ ] DingTalk button-style approval cards (Feishu done)
461
- - [ ] Multi-instance event bus (Redis Streams / NATS)
462
- - [ ] Workspace member picker UI
463
- - [ ] Memory consolidation: scheduled boot+5min first run (currently waits a full 24h)
464
-
465
- ## Community
466
-
467
- <p align="center">
468
- <a href="https://deepseek.club/community/imhub">
469
- <img src="https://deepseek.club/assets/logo-DH6LfKkF.png" style="width: 150px; height: auto;" alt="DeepSeek">
470
- </a>
471
- </p>
472
-
473
134
  ## License
474
135
 
475
136
  MIT