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
@@ -1,233 +1,267 @@
1
- // Admin allowlistgates service-management commands (`/restart`, `/stop`,
2
- // natural-language "重启服务", web /api/service/* mutating endpoints).
1
+ // IM admin registry single source of truth for:
2
+ // 1) Who can run admin-only IM commands (/restart, /stop, ...)
3
+ // 2) Which IM identities have talked to agim (for Web settings selection)
3
4
  //
4
- // Source: IMHUB_ADMIN_USERS env, comma-separated `platform:userId` pairs.
5
- // Examples:
6
- // IMHUB_ADMIN_USERS=wechat-ilink:wxid_abc123,telegram:456789
7
- // IMHUB_ADMIN_USERS=feishu:ou_xxx
5
+ // v2 model:
6
+ // - No IM admin bootstrap token
7
+ // - No IMHUB_ADMIN_USERS runtime dependency
8
+ // - Web admin token operators manage IM admins in Settings → Admins
8
9
  //
9
- // Platform matching is case-insensitive (telegram == Telegram). userId is
10
- // case-sensitive (most IMs use case-sensitive ids).
11
- //
12
- // Default policy when the env is unset: DENY. The previous "open access"
13
- // default was fine for a console at 127.0.0.1, but service-control commands
14
- // can take the bot offline — small users opening their bot to friends would
15
- // otherwise expose `/restart` to anyone. Operators get a clear error message
16
- // telling them how to enable themselves.
10
+ // Back-compat:
11
+ // - If legacy IMHUB_ADMIN_USERS is present, we import it once into the
12
+ // file store on first load, then continue using the file as source of truth.
13
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync } from 'node:fs';
14
+ import { join, dirname } from 'node:path';
15
+ import { AGIM_HOME } from './agim-paths.js';
17
16
  import { logger as rootLogger } from './logger.js';
18
17
  const log = rootLogger.child({ component: 'admin-allowlist' });
19
- let cachedEntries = null;
20
- let cachedRaw = '';
21
- /** Runtime-added admins (from `/setup admin <token>` or web UI). Survives
22
- * this process but not restart — `promoteAdmin()` ALSO writes to the env
23
- * file so a restart picks them up. */
24
- const runtimeEntries = [];
25
- /** Read IMHUB_ADMIN_USERS directly from ~/.agim/env, bypassing systemd's
26
- * EnvironmentFile parser. systemd's parser is strict about quoting +
27
- * silently drops lines it can't make sense of, so when an operator adds
28
- * an admin via /setup admin the env-file write may succeed but the
29
- * next service restart loads a partial value (observed 2026-05-25:
30
- * env file has wechat,telegram but process.env only sees wechat).
31
- * This file-direct fallback runs once per process and merges any
32
- * entries the systemd-passed value missed. Returns '' when the file
33
- * is missing, unreadable, or has no ADMIN_USERS line. */
34
- let cachedFileRaw = null;
35
- function readFileAdminUsers() {
36
- if (cachedFileRaw !== null)
37
- return cachedFileRaw;
38
- cachedFileRaw = '';
39
- // Test opt-out: IMHUB_ENV_FILE_PATH='' disables file fallback entirely
40
- // so unit tests aren't polluted by the operator's real allowlist. A
41
- // non-empty value overrides the default path.
42
- const overridePath = process.env.IMHUB_ENV_FILE_PATH;
43
- if (overridePath === '')
44
- return cachedFileRaw;
45
- try {
46
- // Lazy import so unit tests that don't touch admin code don't pay
47
- // the disk lookup. ENV_FILE is the same path systemd reads.
48
- // eslint-disable-next-line @typescript-eslint/no-require-imports
49
- const fs = require('node:fs');
50
- const { ENV_FILE } = require('../cli-ui/env-file.js');
51
- const filePath = overridePath && overridePath.length > 0 ? overridePath : ENV_FILE;
52
- if (!fs.existsSync(filePath))
53
- return cachedFileRaw;
54
- const raw = fs.readFileSync(filePath, 'utf-8');
55
- // Take the LAST IMHUB_ADMIN_USERS= line (matches systemd's
56
- // last-wins semantics + agim's own readEnvFile object overwrite).
57
- const lines = raw.split('\n');
58
- for (let i = lines.length - 1; i >= 0; i--) {
59
- const line = lines[i].trim();
60
- if (line.startsWith('IMHUB_ADMIN_USERS=')) {
61
- cachedFileRaw = line.slice('IMHUB_ADMIN_USERS='.length).trim();
62
- // Strip surrounding quotes if present (systemd-style).
63
- if ((cachedFileRaw.startsWith('"') && cachedFileRaw.endsWith('"'))
64
- || (cachedFileRaw.startsWith("'") && cachedFileRaw.endsWith("'"))) {
65
- cachedFileRaw = cachedFileRaw.slice(1, -1);
66
- }
67
- break;
68
- }
18
+ function storeFilePath() {
19
+ return join(process.env.AGIM_HOME || process.env.IMHUB_HOME || AGIM_HOME, 'im-admins.json');
20
+ }
21
+ function emptyStore() {
22
+ return { version: 1, admins: [], knownUsers: [] };
23
+ }
24
+ let cachedStore = null;
25
+ let loggedOnce = false;
26
+ function normalizeEntry(platform, userId) {
27
+ const p = platform.trim().toLowerCase();
28
+ const u = (userId ?? '').trim();
29
+ if (!p || !u)
30
+ return null;
31
+ return { platform: p, userId: u };
32
+ }
33
+ function keyOf(entry) {
34
+ return `${entry.platform}:${entry.userId}`;
35
+ }
36
+ function dedupeEntries(entries) {
37
+ const m = new Map();
38
+ for (const e of entries)
39
+ m.set(keyOf(e), e);
40
+ return [...m.values()].sort((a, b) => keyOf(a).localeCompare(keyOf(b)));
41
+ }
42
+ function dedupeKnownUsers(rows) {
43
+ const m = new Map();
44
+ for (const row of rows) {
45
+ const norm = normalizeEntry(row.platform, row.userId);
46
+ if (!norm)
47
+ continue;
48
+ const existing = m.get(keyOf(norm));
49
+ if (!existing || existing.lastSeenAt < row.lastSeenAt) {
50
+ m.set(keyOf(norm), {
51
+ platform: norm.platform,
52
+ userId: norm.userId,
53
+ firstSeenAt: row.firstSeenAt || row.lastSeenAt,
54
+ lastSeenAt: row.lastSeenAt || row.firstSeenAt,
55
+ lastChannelId: row.lastChannelId,
56
+ lastThreadId: row.lastThreadId,
57
+ });
69
58
  }
70
59
  }
71
- catch { /* best-effort */ }
72
- return cachedFileRaw;
60
+ return [...m.values()].sort((a, b) => b.lastSeenAt.localeCompare(a.lastSeenAt));
73
61
  }
74
- function parseEnv(raw) {
62
+ function parseLegacyAdminEnv(raw) {
75
63
  const out = [];
76
64
  for (const pair of raw.split(',')) {
77
65
  const trimmed = pair.trim();
78
66
  if (!trimmed)
79
67
  continue;
80
68
  const idx = trimmed.indexOf(':');
81
- if (idx <= 0 || idx === trimmed.length - 1) {
82
- log.warn({ event: 'admin.allowlist.malformed_entry', entry: trimmed }, 'IMHUB_ADMIN_USERS entry must be platform:userId — skipping');
69
+ if (idx <= 0 || idx === trimmed.length - 1)
83
70
  continue;
84
- }
85
- out.push({
86
- platform: trimmed.slice(0, idx).toLowerCase(),
87
- userId: trimmed.slice(idx + 1),
88
- });
71
+ const norm = normalizeEntry(trimmed.slice(0, idx), trimmed.slice(idx + 1));
72
+ if (norm)
73
+ out.push(norm);
89
74
  }
90
- return out;
91
- }
92
- function getEntries() {
93
- // Two sources of truth, both consulted: process.env (systemd's parse
94
- // of EnvironmentFile + any Environment= override) and the env file
95
- // read directly via Node fs (sidesteps systemd parser quirks). We
96
- // dedupe by (platform, userId) so a value present in both doesn't
97
- // double-count. Runtime entries from promoteAdmin() are layered on
98
- // top so an in-session add is visible even if the file write race'd.
99
- const envRaw = process.env.IMHUB_ADMIN_USERS ?? '';
100
- const fileRaw = readFileAdminUsers();
101
- // Cache invalidation: re-parse when the env value (process or file)
102
- // changes. File contents don't change without a restart of this
103
- // process so cachedFileRaw is one-shot; only process.env can shift
104
- // (admin-allowlist itself mutates process.env? — no, it doesn't.
105
- // updateEnvFile DOES touch process.env elsewhere, so be defensive).
106
- const composite = `${envRaw}${fileRaw}`;
107
- if (composite !== cachedRaw) {
108
- cachedRaw = composite;
109
- const dedup = new Map();
110
- for (const e of [...parseEnv(envRaw), ...parseEnv(fileRaw)]) {
111
- dedup.set(`${e.platform}:${e.userId}`, e);
75
+ return dedupeEntries(out);
76
+ }
77
+ function normalizeStore(store) {
78
+ return {
79
+ version: 1,
80
+ admins: dedupeEntries((store?.admins ?? [])
81
+ .map((e) => normalizeEntry(e.platform, e.userId))
82
+ .filter((e) => e !== null)),
83
+ knownUsers: dedupeKnownUsers(store?.knownUsers ?? []),
84
+ };
85
+ }
86
+ function readStoreFromDisk() {
87
+ const storeFile = storeFilePath();
88
+ if (!existsSync(storeFile))
89
+ return emptyStore();
90
+ try {
91
+ const raw = JSON.parse(readFileSync(storeFile, 'utf-8'));
92
+ return normalizeStore(raw);
93
+ }
94
+ catch (err) {
95
+ log.warn({
96
+ event: 'admin.allowlist.read_failed',
97
+ err: err instanceof Error ? err.message : String(err),
98
+ }, 'failed to read admin store; using empty state');
99
+ return emptyStore();
100
+ }
101
+ }
102
+ function writeStoreToDisk(store) {
103
+ const storeFile = storeFilePath();
104
+ mkdirSync(dirname(storeFile), { recursive: true });
105
+ writeFileSync(storeFile, JSON.stringify(store, null, 2), 'utf-8');
106
+ try {
107
+ chmodSync(storeFile, 0o600);
108
+ }
109
+ catch { /* ignore */ }
110
+ }
111
+ function ensureStoreLoaded() {
112
+ if (cachedStore)
113
+ return cachedStore;
114
+ const loaded = readStoreFromDisk();
115
+ const legacy = parseLegacyAdminEnv(process.env.IMHUB_ADMIN_USERS ?? '');
116
+ if (legacy.length > 0) {
117
+ const before = loaded.admins.length;
118
+ loaded.admins = dedupeEntries([...loaded.admins, ...legacy]);
119
+ if (loaded.admins.length !== before) {
120
+ writeStoreToDisk(loaded);
121
+ log.warn({
122
+ event: 'admin.allowlist.legacy_env_migrated',
123
+ fromEnvCount: legacy.length,
124
+ mergedCount: loaded.admins.length,
125
+ }, 'migrated IMHUB_ADMIN_USERS into im-admins.json; env value is now legacy-only');
112
126
  }
113
- cachedEntries = [...dedup.values()];
114
127
  }
115
- return [...(cachedEntries ?? []), ...runtimeEntries];
128
+ cachedStore = loaded;
129
+ return cachedStore;
130
+ }
131
+ function commitStore(next) {
132
+ const normalized = normalizeStore(next);
133
+ cachedStore = normalized;
134
+ writeStoreToDisk(normalized);
116
135
  }
117
- /** Returns `true` iff there is at least one admin entry, whether from env
118
- * or runtime-added via `/setup admin`. When false, the system has no
119
- * admin and service-control commands are blanket denied. */
136
+ /** Returns true iff at least one IM admin is configured. */
120
137
  export function isAllowlistConfigured() {
121
- return getEntries().length > 0;
138
+ return ensureStoreLoaded().admins.length > 0;
122
139
  }
123
- /** Returns `true` iff (platform, userId) appears in the combined env +
124
- * runtime allowlist. */
140
+ /** Returns true iff the caller is in IM admin list. */
125
141
  export function isAdmin(platform, userId) {
126
- if (!userId)
142
+ const norm = normalizeEntry(platform, userId);
143
+ if (!norm)
127
144
  return false;
128
- const p = platform.toLowerCase();
129
- return getEntries().some((e) => e.platform === p && e.userId === userId);
145
+ return ensureStoreLoaded().admins.some((e) => e.platform === norm.platform && e.userId === norm.userId);
130
146
  }
131
- /** Return a copy of the current admin list (env + runtime). For UI display. */
147
+ /** List configured IM admins. */
132
148
  export function listAdmins() {
133
- return getEntries().map((e) => ({ platform: e.platform, userId: e.userId }));
149
+ return ensureStoreLoaded().admins.map((e) => ({ platform: e.platform, userId: e.userId }));
134
150
  }
135
- /** Add an admin at runtime: in-memory immediately + persist to env file so
136
- * the next restart still has them. Idempotent — duplicates are skipped.
137
- * Returns true if added, false if already present. */
151
+ /** List known IM users discovered from real inbound messages. */
152
+ export function listKnownImUsers() {
153
+ return ensureStoreLoaded().knownUsers.map((u) => ({ ...u }));
154
+ }
155
+ /** Record that an IM user has interacted with agim. */
156
+ export function recordSeenImUser(platform, userId, meta) {
157
+ const norm = normalizeEntry(platform, userId);
158
+ if (!norm)
159
+ return false;
160
+ const store = ensureStoreLoaded();
161
+ const now = new Date().toISOString();
162
+ const idx = store.knownUsers.findIndex((u) => u.platform === norm.platform && u.userId === norm.userId);
163
+ if (idx >= 0) {
164
+ const row = store.knownUsers[idx];
165
+ const changed = row.lastSeenAt !== now
166
+ || row.lastChannelId !== meta?.channelId
167
+ || row.lastThreadId !== meta?.threadId;
168
+ row.lastSeenAt = now;
169
+ if (meta?.channelId)
170
+ row.lastChannelId = meta.channelId;
171
+ if (meta?.threadId)
172
+ row.lastThreadId = meta.threadId;
173
+ if (changed)
174
+ commitStore(store);
175
+ return changed;
176
+ }
177
+ store.knownUsers.push({
178
+ platform: norm.platform,
179
+ userId: norm.userId,
180
+ firstSeenAt: now,
181
+ lastSeenAt: now,
182
+ ...(meta?.channelId ? { lastChannelId: meta.channelId } : {}),
183
+ ...(meta?.threadId ? { lastThreadId: meta.threadId } : {}),
184
+ });
185
+ commitStore(store);
186
+ return true;
187
+ }
188
+ /** Promote an IM identity to admin (idempotent). */
138
189
  export async function promoteAdmin(platform, userId, opts) {
139
- if (!userId)
140
- throw new Error('userId required');
141
- const p = platform.toLowerCase();
142
- if (getEntries().some((e) => e.platform === p && e.userId === userId))
190
+ const norm = normalizeEntry(platform, userId);
191
+ if (!norm)
192
+ throw new Error('platform and userId required');
193
+ const store = ensureStoreLoaded();
194
+ if (store.admins.some((e) => e.platform === norm.platform && e.userId === norm.userId))
143
195
  return false;
144
- runtimeEntries.push({ platform: p, userId });
145
- // Persist to ~/.agim/env (combined env-string of every current entry).
196
+ store.admins.push(norm);
197
+ // Ensure admin target always appears in known list.
198
+ recordSeenImUser(norm.platform, norm.userId);
199
+ commitStore(store);
146
200
  try {
147
- const { updateEnvFile } = await import('../cli-ui/env-file.js');
148
- const combined = getEntries().map((e) => `${e.platform}:${e.userId}`).join(',');
149
- updateEnvFile({ IMHUB_ADMIN_USERS: combined });
150
- log.info({
151
- event: 'admin.allowlist.promoted',
152
- platform: p,
153
- userId,
154
- total: getEntries().length,
155
- }, 'admin promoted at runtime + persisted to env file');
156
- }
157
- catch (err) {
158
- log.warn({
159
- event: 'admin.allowlist.persist_failed',
160
- err: err instanceof Error ? err.message : String(err),
161
- }, 'in-memory admin add succeeded but env-file write failed; will be lost on restart');
201
+ const { logAuditEvent } = await import('./audit-log.js');
202
+ logAuditEvent({
203
+ traceId: opts?.traceId,
204
+ eventType: 'admin.elevate',
205
+ actor: opts?.actor ?? 'system',
206
+ target: `${norm.platform}:${norm.userId}`,
207
+ outcome: 'ok',
208
+ details: { total: store.admins.length },
209
+ });
162
210
  }
163
- // R12 persistent audit row. Tracks who got admin'd, by whom, when.
211
+ catch { /* best-effort */ }
212
+ return true;
213
+ }
214
+ /** Revoke admin permission from an IM identity (idempotent false on missing). */
215
+ export async function revokeAdmin(platform, userId, opts) {
216
+ const norm = normalizeEntry(platform, userId);
217
+ if (!norm)
218
+ throw new Error('platform and userId required');
219
+ const store = ensureStoreLoaded();
220
+ const before = store.admins.length;
221
+ store.admins = store.admins.filter((e) => !(e.platform === norm.platform && e.userId === norm.userId));
222
+ if (store.admins.length === before)
223
+ return false;
224
+ commitStore(store);
164
225
  try {
165
226
  const { logAuditEvent } = await import('./audit-log.js');
166
227
  logAuditEvent({
167
228
  traceId: opts?.traceId,
168
- eventType: 'admin.elevate',
229
+ eventType: 'admin.revoke',
169
230
  actor: opts?.actor ?? 'system',
170
- target: `${p}:${userId}`,
231
+ target: `${norm.platform}:${norm.userId}`,
171
232
  outcome: 'ok',
172
- details: { total: getEntries().length },
233
+ details: { total: store.admins.length },
173
234
  });
174
235
  }
175
- catch { /* audit best-effort */ }
236
+ catch { /* best-effort */ }
176
237
  return true;
177
238
  }
178
- /** Localized denial message. Three cases:
179
- * A. No admins at all → "首次部署",引导查 setup token
180
- * B. Admins exist, you're not one → 礼貌拒绝,建议联系部署者
181
- * C. (handled in setup-command path) bootstrap token consumable → A 已覆盖
182
- */
183
239
  export function denialMessage(platform, userId) {
240
+ const me = `${platform.toLowerCase()}:${userId ?? '<unknown>'}`;
184
241
  if (!isAllowlistConfigured()) {
185
- // Case A no admin yet. Most likely the operator hasn't onboarded
186
- // themselves. Tell them where to find the bootstrap token.
187
- return ('🛑 这个 bot 还没配置管理员。\n' +
188
- '\n' +
189
- ' 如果你是部署者:\n' +
190
- ' 1. 在服务器终端运行 `journalctl -u agim | grep "setup admin"` 查看一次性 token\n' +
191
- ' (或 `cat ~/.agim/admin-bootstrap-token`)\n' +
192
- ' 2. 在 IM 里发: /setup admin <token>\n' +
193
- ' 即可把当前账号 (' + platform.toLowerCase() + ':' + (userId ?? '<your-id>') + ') 设为管理员。\n' +
194
- '\n' +
195
- ' 如果你不是部署者,请联系部署本 bot 的人。');
242
+ return ('🛑 这个 bot 还没有配置任何 IM 管理员。\n' +
243
+ ' 请让 Web 后台管理员在“设置 管理员”把你加入管理员名单。\n' +
244
+ ` 你的账号:${me}`);
196
245
  }
197
- // Case B — bot has admins, you're not one. Don't reveal current admin
198
- // list / internal id format.
199
246
  return ('🛑 你没有权限执行此操作。\n' +
200
- ' 如果你是这个 bot 的管理员,请用同一个 IM 账号重试;否则请联系部署者。');
247
+ ' 如果你认为应当有权限,请联系 Web 后台管理员把你的 IM 账号加入管理员名单。');
201
248
  }
202
- /** One-shot startup log: how many admins agim resolved from env vs file
203
- * vs runtime. Call from cli boot once messengers / web are up so the
204
- * line lands in journal with a recognisable event tag. Idempotent. */
205
- let loggedOnce = false;
249
+ /** Startup diagnostics. */
206
250
  export function logStartupResolution() {
207
251
  if (loggedOnce)
208
252
  return;
209
253
  loggedOnce = true;
210
- const envRaw = process.env.IMHUB_ADMIN_USERS ?? '';
211
- const fileRaw = readFileAdminUsers();
212
- const envCount = parseEnv(envRaw).length;
213
- const fileCount = parseEnv(fileRaw).length;
214
- const finalCount = getEntries().length;
254
+ const store = ensureStoreLoaded();
215
255
  log.info({
216
256
  event: 'admin.allowlist.loaded',
217
- fromProcessEnv: envCount,
218
- fromEnvFile: fileCount,
219
- merged: finalCount,
220
- fileFallbackActive: fileCount > envCount,
221
- }, fileCount > envCount
222
- ? `admin allowlist: process.env had ${envCount}, env file had ${fileCount} — file-fallback recovered ${fileCount - envCount} entries lost by systemd's EnvironmentFile parser`
223
- : `admin allowlist: ${finalCount} entries loaded`);
224
- }
225
- /** Test-only — reset all state so tests can fully isolate. */
257
+ admins: store.admins.length,
258
+ knownUsers: store.knownUsers.length,
259
+ store: storeFilePath(),
260
+ }, `admin registry loaded: ${store.admins.length} admin(s), ${store.knownUsers.length} known IM user(s)`);
261
+ }
262
+ /** Test-only reset. */
226
263
  export function _resetCache() {
227
- cachedEntries = null;
228
- cachedRaw = '';
229
- cachedFileRaw = null;
264
+ cachedStore = null;
230
265
  loggedOnce = false;
231
- runtimeEntries.length = 0;
232
266
  }
233
267
  //# sourceMappingURL=admin-allowlist.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin-allowlist.js","sourceRoot":"","sources":["../../src/core/admin-allowlist.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-allowlist.js","sourceRoot":"","sources":["../../src/core/admin-allowlist.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"approval-router.d.ts","sourceRoot":"","sources":["../../src/core/approval-router.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,gBAAgB,EAIjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EAGd,MAAM,mBAAmB,CAAA;AA+B1B;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAehE;AA6JD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAqBpE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB,GAAG,SAAS,CAAA;IACpE;;;uEAGmE;IACnE,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAA;CACnC;AAeD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAiHlD;AAED,wBAAgB,SAAS,IAAI,IAAI,CAQhC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMnE;AAqCD;;;;;;;;;;;;;;;;GAgBG;AACH;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAqCzE;AAuID;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;CAAE,GAAG,IAAI,CAUjG;AAkDD,6CAA6C;AAC7C,wBAAgB,YAAY,IAAI,OAAO,CAA8B"}
1
+ {"version":3,"file":"approval-router.d.ts","sourceRoot":"","sources":["../../src/core/approval-router.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,gBAAgB,EAIjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EAGd,MAAM,mBAAmB,CAAA;AA+B1B;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAehE;AA6JD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAqBpE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB,GAAG,SAAS,CAAA;IACpE;;;uEAGmE;IACnE,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAA;CACnC;AAeD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAiHlD;AAED,wBAAgB,SAAS,IAAI,IAAI,CAQhC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMnE;AAqCD;;;;;;;;;;;;;;;;GAgBG;AACH;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAqCzE;AA2JD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;CAAE,GAAG,IAAI,CAUjG;AAkDD,6CAA6C;AAC7C,wBAAgB,YAAY,IAAI,OAAO,CAA8B"}
@@ -554,6 +554,29 @@ async function handleButtonCallback(platform, cb) {
554
554
  catch (err) {
555
555
  log.warn({ event: 'approval.router.recovery_dispatch_failed', err: String(err) });
556
556
  }
557
+ // ask_user choice cards currently share the same messenger callback
558
+ // channel as approvals. Route `ask:<reqId>:<index>` here so ask and
559
+ // approval cards can coexist on Telegram without callback-handler
560
+ // overwrites between routers.
561
+ if (cb.data?.startsWith('ask:')) {
562
+ try {
563
+ const { tryResolvePendingAskByButton } = await import('./ask-user-rpc.js');
564
+ const resolved = tryResolvePendingAskByButton(cb.data);
565
+ await cb.ack(resolved ? '✓' : '已失效');
566
+ log.info({
567
+ event: resolved ? 'approval.router.ask_button_resolved' : 'approval.router.ask_button_unmatched',
568
+ platform, data: cb.data,
569
+ });
570
+ }
571
+ catch (err) {
572
+ log.warn({ event: 'approval.router.ask_button_failed', err: String(err) });
573
+ try {
574
+ await cb.ack('处理失败');
575
+ }
576
+ catch { /* best-effort */ }
577
+ }
578
+ return;
579
+ }
557
580
  const parsed = parseCallbackData(cb.data);
558
581
  if (!parsed) {
559
582
  await cb.ack('未识别的按钮');