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.
- package/CHANGELOG.md +56 -53
- package/README.md +87 -426
- package/README.zh-CN.md +85 -416
- package/dist/cli-ui/cmd-handlers.d.ts.map +1 -1
- package/dist/cli-ui/cmd-handlers.js +1 -0
- package/dist/cli-ui/cmd-handlers.js.map +1 -1
- package/dist/cli-ui/entry-menu.d.ts +0 -2
- package/dist/cli-ui/entry-menu.d.ts.map +1 -1
- package/dist/cli-ui/entry-menu.js +0 -1
- package/dist/cli-ui/entry-menu.js.map +1 -1
- package/dist/cli-ui/i18n.d.ts +3 -8
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +6 -16
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/tui/app.d.ts +5 -1
- package/dist/cli-ui/tui/app.d.ts.map +1 -1
- package/dist/cli-ui/tui/app.js +243 -63
- package/dist/cli-ui/tui/app.js.map +1 -1
- package/dist/cli-ui/tui/index.d.ts.map +1 -1
- package/dist/cli-ui/tui/index.js +23 -5
- package/dist/cli-ui/tui/index.js.map +1 -1
- package/dist/cli-ui/tui/sessions.d.ts +2 -0
- package/dist/cli-ui/tui/sessions.d.ts.map +1 -1
- package/dist/cli-ui/tui/sessions.js +13 -3
- package/dist/cli-ui/tui/sessions.js.map +1 -1
- package/dist/cli.js +39 -70
- package/dist/cli.js.map +1 -1
- package/dist/core/acp-server.d.ts.map +1 -1
- package/dist/core/acp-server.js +23 -44
- package/dist/core/acp-server.js.map +1 -1
- package/dist/core/admin-allowlist.d.ts +26 -15
- package/dist/core/admin-allowlist.d.ts.map +1 -1
- package/dist/core/admin-allowlist.js +213 -179
- package/dist/core/admin-allowlist.js.map +1 -1
- package/dist/core/approval-router.d.ts.map +1 -1
- package/dist/core/approval-router.js +23 -0
- package/dist/core/approval-router.js.map +1 -1
- package/dist/core/ask-user-rpc.d.ts.map +1 -1
- package/dist/core/ask-user-rpc.js +2 -3
- package/dist/core/ask-user-rpc.js.map +1 -1
- package/dist/core/commands/builtin.js +2 -2
- package/dist/core/commands/builtin.js.map +1 -1
- package/dist/core/commands/outbox.d.ts +1 -1
- package/dist/core/commands/outbox.d.ts.map +1 -1
- package/dist/core/commands/outbox.js +5 -1
- package/dist/core/commands/outbox.js.map +1 -1
- package/dist/core/commands/service.js +2 -2
- package/dist/core/commands/service.js.map +1 -1
- package/dist/core/commands/setup.d.ts.map +1 -1
- package/dist/core/commands/setup.js +11 -60
- package/dist/core/commands/setup.js.map +1 -1
- package/dist/core/llm/index.d.ts +1 -1
- package/dist/core/llm/index.d.ts.map +1 -1
- package/dist/core/llm/index.js +1 -1
- package/dist/core/llm/index.js.map +1 -1
- package/dist/core/llm/registry.d.ts +6 -0
- package/dist/core/llm/registry.d.ts.map +1 -1
- package/dist/core/llm/registry.js +12 -0
- package/dist/core/llm/registry.js.map +1 -1
- package/dist/core/llm/secrets.js +2 -2
- package/dist/core/llm/secrets.js.map +1 -1
- package/dist/core/onboarding.js +1 -1
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/registry.js +3 -3
- package/dist/core/registry.js.map +1 -1
- package/dist/core/router.js +2 -2
- package/dist/core/router.js.map +1 -1
- package/dist/core/sender-allowlist.js +1 -1
- package/dist/core/sender-allowlist.js.map +1 -1
- package/dist/plugins/agents/native/index.d.ts.map +1 -1
- package/dist/plugins/agents/native/index.js +17 -4
- package/dist/plugins/agents/native/index.js.map +1 -1
- package/dist/plugins/agents/pi-native/factory.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/factory.js +9 -3
- package/dist/plugins/agents/pi-native/factory.js.map +1 -1
- package/dist/plugins/agents/pi-native/index.js +2 -2
- package/dist/plugins/agents/pi-native/index.js.map +1 -1
- package/dist/plugins/agents/pi-native/provider-resolver.d.ts +2 -0
- package/dist/plugins/agents/pi-native/provider-resolver.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/provider-resolver.js +6 -1
- package/dist/plugins/agents/pi-native/provider-resolver.js.map +1 -1
- package/dist/plugins/agents/pi-native/tool-bridge.js +1 -1
- package/dist/plugins/agents/pi-native/tool-bridge.js.map +1 -1
- package/dist/web/llm-api.d.ts.map +1 -1
- package/dist/web/llm-api.js +12 -0
- package/dist/web/llm-api.js.map +1 -1
- package/dist/web/public/assets/{a2a-CK_McNBZ.js → a2a-Dtc6AKjx.js} +3 -3
- package/dist/web/public/assets/{a2a-CK_McNBZ.js.map → a2a-Dtc6AKjx.js.map} +1 -1
- package/dist/web/public/assets/{activity-SXgxjjhd.js → activity-CWFI_ke7.js} +2 -2
- package/dist/web/public/assets/{activity-SXgxjjhd.js.map → activity-CWFI_ke7.js.map} +1 -1
- package/dist/web/public/assets/admins-CeQorJdU.js +17 -0
- package/dist/web/public/assets/admins-CeQorJdU.js.map +1 -0
- package/dist/web/public/assets/{agents-BhuZPnjf.js → agents-DnJruPrS.js} +3 -3
- package/dist/web/public/assets/{agents-BhuZPnjf.js.map → agents-DnJruPrS.js.map} +1 -1
- package/dist/web/public/assets/{approvals-CUsF6htp.js → approvals-BEPKSyrL.js} +3 -3
- package/dist/web/public/assets/{approvals-CUsF6htp.js.map → approvals-BEPKSyrL.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-Dhsj-A0i.js → arrow-down-CzWGZc48.js} +2 -2
- package/dist/web/public/assets/{arrow-down-Dhsj-A0i.js.map → arrow-down-CzWGZc48.js.map} +1 -1
- package/dist/web/public/assets/{arrow-up-Byeo8HHt.js → arrow-up-CXy94NPi.js} +2 -2
- package/dist/web/public/assets/{arrow-up-Byeo8HHt.js.map → arrow-up-CXy94NPi.js.map} +1 -1
- package/dist/web/public/assets/{asks-BkwfCOfj.js → asks-BszsbhPn.js} +3 -3
- package/dist/web/public/assets/{asks-BkwfCOfj.js.map → asks-BszsbhPn.js.map} +1 -1
- package/dist/web/public/assets/audit-ACrwMizd.js +2 -0
- package/dist/web/public/assets/{audit-DshxCHuP.js.map → audit-ACrwMizd.js.map} +1 -1
- package/dist/web/public/assets/{bell-CgQQygG1.js → bell-BLwNOhXO.js} +2 -2
- package/dist/web/public/assets/{bell-CgQQygG1.js.map → bell-BLwNOhXO.js.map} +1 -1
- package/dist/web/public/assets/{bgjobs-qYRbEcQY.js → bgjobs-Cwp0PmTF.js} +3 -3
- package/dist/web/public/assets/{bgjobs-qYRbEcQY.js.map → bgjobs-Cwp0PmTF.js.map} +1 -1
- package/dist/web/public/assets/{brain-V9r2NcZc.js → brain-5AJBYzXX.js} +2 -2
- package/dist/web/public/assets/{brain-V9r2NcZc.js.map → brain-5AJBYzXX.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-CC-yM9eZ.js → briefcase-BTDurkZz.js} +2 -2
- package/dist/web/public/assets/{briefcase-CC-yM9eZ.js.map → briefcase-BTDurkZz.js.map} +1 -1
- package/dist/web/public/assets/chat-D7jjr-Rn.js +17 -0
- package/dist/web/public/assets/chat-D7jjr-Rn.js.map +1 -0
- package/dist/web/public/assets/{chevron-left-CTwCYqyt.js → chevron-left-CnLOhWHE.js} +2 -2
- package/dist/web/public/assets/{chevron-left-CTwCYqyt.js.map → chevron-left-CnLOhWHE.js.map} +1 -1
- package/dist/web/public/assets/chevron-right-CpWYrqTa.js +7 -0
- package/dist/web/public/assets/{chevron-right-CDiFYKGo.js.map → chevron-right-CpWYrqTa.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-CWttT2Af.js → circle-check-DhcTh_uP.js} +2 -2
- package/dist/web/public/assets/{circle-check-CWttT2Af.js.map → circle-check-DhcTh_uP.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-Cf2odn4o.js → circle-check-big-CcknUEHz.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-Cf2odn4o.js.map → circle-check-big-CcknUEHz.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-CMJqo4Pi.js → circle-x-QODE2UcL.js} +2 -2
- package/dist/web/public/assets/{circle-x-CMJqo4Pi.js.map → circle-x-QODE2UcL.js.map} +1 -1
- package/dist/web/public/assets/{clock-DUKggKlF.js → clock-BPBx4QWT.js} +3 -3
- package/dist/web/public/assets/{clock-DUKggKlF.js.map → clock-BPBx4QWT.js.map} +1 -1
- package/dist/web/public/assets/confirm-dialog-HsyBgWxC.js +2 -0
- package/dist/web/public/assets/{confirm-dialog-CMWuyC3w.js.map → confirm-dialog-HsyBgWxC.js.map} +1 -1
- package/dist/web/public/assets/{copy-D8mIKuYJ.js → copy-VJNELMp7.js} +3 -3
- package/dist/web/public/assets/{copy-D8mIKuYJ.js.map → copy-VJNELMp7.js.map} +1 -1
- package/dist/web/public/assets/{data-table-CHGndGOY.js → data-table-C0yaCeSS.js} +2 -2
- package/dist/web/public/assets/{data-table-CHGndGOY.js.map → data-table-C0yaCeSS.js.map} +1 -1
- package/dist/web/public/assets/{download-CgEI28s6.js → download-EUh-RXv5.js} +3 -3
- package/dist/web/public/assets/{download-CgEI28s6.js.map → download-EUh-RXv5.js.map} +1 -1
- package/dist/web/public/assets/{email-BLZQOZnx.js → email-YUzrp4Tf.js} +3 -3
- package/dist/web/public/assets/{email-BLZQOZnx.js.map → email-YUzrp4Tf.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-D8kx-FwO.js → empty-state-DoiBKL4l.js} +2 -2
- package/dist/web/public/assets/{empty-state-D8kx-FwO.js.map → empty-state-DoiBKL4l.js.map} +1 -1
- package/dist/web/public/assets/{external-link-BM6n9mwt.js → external-link-Bf2430Ji.js} +2 -2
- package/dist/web/public/assets/{external-link-BM6n9mwt.js.map → external-link-Bf2430Ji.js.map} +1 -1
- package/dist/web/public/assets/{eye-Dk27zHD5.js → eye-vE4k-Us-.js} +2 -2
- package/dist/web/public/assets/{eye-Dk27zHD5.js.map → eye-vE4k-Us-.js.map} +1 -1
- package/dist/web/public/assets/facts-BPVTGzM4.js +2 -0
- package/dist/web/public/assets/{facts-CoWF4O82.js.map → facts-BPVTGzM4.js.map} +1 -1
- package/dist/web/public/assets/{goals-CuiFswaR.js → goals-HsKzf-PG.js} +3 -3
- package/dist/web/public/assets/{goals-CuiFswaR.js.map → goals-HsKzf-PG.js.map} +1 -1
- package/dist/web/public/assets/health-CSMAArAj.js +2 -0
- package/dist/web/public/assets/{health-C3lSUr_r.js.map → health-CSMAArAj.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-D34iW_OF.js → heart-pulse-8RDC8GWv.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-D34iW_OF.js.map → heart-pulse-8RDC8GWv.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-Z5gPGZhm.js → heartbeat-BzHZy7Mx.js} +3 -3
- package/dist/web/public/assets/{heartbeat-Z5gPGZhm.js.map → heartbeat-BzHZy7Mx.js.map} +1 -1
- package/dist/web/public/assets/{hot-CZJeO9Mj.js → hot-DkFvD3H4.js} +3 -3
- package/dist/web/public/assets/{hot-CZJeO9Mj.js.map → hot-DkFvD3H4.js.map} +1 -1
- package/dist/web/public/assets/index-Bc0H0I1S.css +1 -0
- package/dist/web/public/assets/index-D7BuMEIr.js +204 -0
- package/dist/web/public/assets/index-D7BuMEIr.js.map +1 -0
- package/dist/web/public/assets/injection-a2kkgRbT.js +2 -0
- package/dist/web/public/assets/{injection-BTDjIbkn.js.map → injection-a2kkgRbT.js.map} +1 -1
- package/dist/web/public/assets/{installed-B5IGYO0m.js → installed-XQQEPKh8.js} +3 -3
- package/dist/web/public/assets/{installed-B5IGYO0m.js.map → installed-XQQEPKh8.js.map} +1 -1
- package/dist/web/public/assets/jobs-Cby1Eq4o.js +2 -0
- package/dist/web/public/assets/{jobs-9YLeiSVG.js.map → jobs-Cby1Eq4o.js.map} +1 -1
- package/dist/web/public/assets/{layout-5cLpIeb4.js → layout-0rDvqHCV.js} +2 -2
- package/dist/web/public/assets/{layout-5cLpIeb4.js.map → layout-0rDvqHCV.js.map} +1 -1
- package/dist/web/public/assets/{layout-BdCXtDqk.js → layout-BRnEPnky.js} +2 -2
- package/dist/web/public/assets/{layout-BdCXtDqk.js.map → layout-BRnEPnky.js.map} +1 -1
- package/dist/web/public/assets/layout-BdtJtlu5.js +2 -0
- package/dist/web/public/assets/{layout-CgeijAPB.js.map → layout-BdtJtlu5.js.map} +1 -1
- package/dist/web/public/assets/{layout-DLtODZx_.js → layout-CbqldDRj.js} +2 -2
- package/dist/web/public/assets/{layout-DLtODZx_.js.map → layout-CbqldDRj.js.map} +1 -1
- package/dist/web/public/assets/layout-Gh29ouFO.js +2 -0
- package/dist/web/public/assets/{layout-DviZj3TJ.js.map → layout-Gh29ouFO.js.map} +1 -1
- package/dist/web/public/assets/{llm-BXhp_nmW.js → llm-COWnMdB9.js} +3 -3
- package/dist/web/public/assets/llm-COWnMdB9.js.map +1 -0
- package/dist/web/public/assets/loader-circle-DO3Ni2RJ.js +7 -0
- package/dist/web/public/assets/{loader-circle-Bgi0H_iI.js.map → loader-circle-DO3Ni2RJ.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-o5p1iOoH.js → map-pin-BsL35E1s.js} +2 -2
- package/dist/web/public/assets/{map-pin-o5p1iOoH.js.map → map-pin-BsL35E1s.js.map} +1 -1
- package/dist/web/public/assets/{mcp-kSwFcRcU.js → mcp-CWMdxcBf.js} +3 -3
- package/dist/web/public/assets/{mcp-kSwFcRcU.js.map → mcp-CWMdxcBf.js.map} +1 -1
- package/dist/web/public/assets/{memos-uAcJzXoQ.js → memos-BYQa4d2t.js} +3 -3
- package/dist/web/public/assets/{memos-uAcJzXoQ.js.map → memos-BYQa4d2t.js.map} +1 -1
- package/dist/web/public/assets/messengers-CebazAJ1.js +2 -0
- package/dist/web/public/assets/{messengers-CkfyROty.js.map → messengers-CebazAJ1.js.map} +1 -1
- package/dist/web/public/assets/{mobile-ClKdRpd9.js → mobile-CMJRNHs2.js} +3 -3
- package/dist/web/public/assets/{mobile-ClKdRpd9.js.map → mobile-CMJRNHs2.js.map} +1 -1
- package/dist/web/public/assets/{native-agent-yfdrcTaK.js → native-agent-MGgMeTHN.js} +3 -3
- package/dist/web/public/assets/{native-agent-yfdrcTaK.js.map → native-agent-MGgMeTHN.js.map} +1 -1
- package/dist/web/public/assets/{network-BlQWIsIc.js → network-pNcx_slv.js} +2 -2
- package/dist/web/public/assets/{network-BlQWIsIc.js.map → network-pNcx_slv.js.map} +1 -1
- package/dist/web/public/assets/{outbox-CYwJu6AR.js → outbox-87hzZQLn.js} +3 -3
- package/dist/web/public/assets/{outbox-CYwJu6AR.js.map → outbox-87hzZQLn.js.map} +1 -1
- package/dist/web/public/assets/{pagination-C6qu72mB.js → pagination-C4edFAqf.js} +2 -2
- package/dist/web/public/assets/{pagination-C6qu72mB.js.map → pagination-C4edFAqf.js.map} +1 -1
- package/dist/web/public/assets/persona-BcOT3Wms.js +2 -0
- package/dist/web/public/assets/{persona-DnuFOp64.js.map → persona-BcOT3Wms.js.map} +1 -1
- package/dist/web/public/assets/{plans-DUg3JDwQ.js → plans-Ddz5qwqp.js} +3 -3
- package/dist/web/public/assets/{plans-DUg3JDwQ.js.map → plans-Ddz5qwqp.js.map} +1 -1
- package/dist/web/public/assets/{play-BGXpdCxa.js → play-Bzdymasn.js} +2 -2
- package/dist/web/public/assets/{play-BGXpdCxa.js.map → play-Bzdymasn.js.map} +1 -1
- package/dist/web/public/assets/{plus-2MZ7TkP3.js → plus-BxjzY9Wh.js} +2 -2
- package/dist/web/public/assets/{plus-2MZ7TkP3.js.map → plus-BxjzY9Wh.js.map} +1 -1
- package/dist/web/public/assets/policy-Be-tMZZc.js +2 -0
- package/dist/web/public/assets/{policy-C4xe2rWm.js.map → policy-Be-tMZZc.js.map} +1 -1
- package/dist/web/public/assets/{qr-code-BVHNR5Zs.js → qr-code-D1V5cA_X.js} +2 -2
- package/dist/web/public/assets/{qr-code-BVHNR5Zs.js.map → qr-code-D1V5cA_X.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-MHrCmmSv.js → refresh-ccw-BhPAzZAa.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-MHrCmmSv.js.map → refresh-ccw-BhPAzZAa.js.map} +1 -1
- package/dist/web/public/assets/{reminders-CmV_JNt5.js → reminders-DEWtrlH_.js} +3 -3
- package/dist/web/public/assets/{reminders-CmV_JNt5.js.map → reminders-DEWtrlH_.js.map} +1 -1
- package/dist/web/public/assets/{save-DhFewuZL.js → save-Cye8Vlu5.js} +2 -2
- package/dist/web/public/assets/{save-DhFewuZL.js.map → save-Cye8Vlu5.js.map} +1 -1
- package/dist/web/public/assets/{schedules-Cp63TJGf.js → schedules-CuqRy3t8.js} +3 -3
- package/dist/web/public/assets/{schedules-Cp63TJGf.js.map → schedules-CuqRy3t8.js.map} +1 -1
- package/dist/web/public/assets/{search-wZEXSmcX.js → search-BQqVArrW.js} +2 -2
- package/dist/web/public/assets/{search-wZEXSmcX.js.map → search-BQqVArrW.js.map} +1 -1
- package/dist/web/public/assets/{search-wUAqWxXK.js → search-Dot_W5Eu.js} +3 -3
- package/dist/web/public/assets/{search-wUAqWxXK.js.map → search-Dot_W5Eu.js.map} +1 -1
- package/dist/web/public/assets/security-BB-YnetQ.js +2 -0
- package/dist/web/public/assets/{security-BoMdDyCY.js.map → security-BB-YnetQ.js.map} +1 -1
- package/dist/web/public/assets/{service-C_KqtWwn.js → service-DgkqlAtM.js} +3 -3
- package/dist/web/public/assets/{service-C_KqtWwn.js.map → service-DgkqlAtM.js.map} +1 -1
- package/dist/web/public/assets/{shield-alert-CplKlUGS.js → shield-alert-CBOmgn9W.js} +2 -2
- package/dist/web/public/assets/{shield-alert-CplKlUGS.js.map → shield-alert-CBOmgn9W.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-q2WooCma.js → status-badge-9sMFH4uP.js} +2 -2
- package/dist/web/public/assets/{status-badge-q2WooCma.js.map → status-badge-9sMFH4uP.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-CBi4c6FD.js → subtasks-BrqdQxw_.js} +3 -3
- package/dist/web/public/assets/{subtasks-CBi4c6FD.js.map → subtasks-BrqdQxw_.js.map} +1 -1
- package/dist/web/public/assets/{table-Bmwe7n4n.js → table-CSHCu7pz.js} +2 -2
- package/dist/web/public/assets/{table-Bmwe7n4n.js.map → table-CSHCu7pz.js.map} +1 -1
- package/dist/web/public/assets/{topn-CMRS4ApA.js → topn-DZWbwDge.js} +3 -3
- package/dist/web/public/assets/{topn-CMRS4ApA.js.map → topn-DZWbwDge.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-CT_B0mSH.js → trash-2-Cco09tAA.js} +2 -2
- package/dist/web/public/assets/{trash-2-CT_B0mSH.js.map → trash-2-Cco09tAA.js.map} +1 -1
- package/dist/web/public/assets/use-agim-skills-CJOJKeOZ.js +2 -0
- package/dist/web/public/assets/{use-agim-skills-C0HdvMQj.js.map → use-agim-skills-CJOJKeOZ.js.map} +1 -1
- package/dist/web/public/assets/use-background-tasks-D77bcfrq.js +2 -0
- package/dist/web/public/assets/{use-background-tasks-Co9CtmcD.js.map → use-background-tasks-D77bcfrq.js.map} +1 -1
- package/dist/web/public/assets/use-memory-CX4B1SYC.js +2 -0
- package/dist/web/public/assets/{use-memory-BHYuPOc9.js.map → use-memory-CX4B1SYC.js.map} +1 -1
- package/dist/web/public/assets/use-observability-rcc7fRmj.js +2 -0
- package/dist/web/public/assets/{use-observability-CHv6H0zQ.js.map → use-observability-rcc7fRmj.js.map} +1 -1
- package/dist/web/public/assets/use-settings-DQnJkPXp.js +2 -0
- package/dist/web/public/assets/{use-settings-Bx0ZTOsd.js.map → use-settings-DQnJkPXp.js.map} +1 -1
- package/dist/web/public/assets/use-workspace-J5eeVxw9.js +2 -0
- package/dist/web/public/assets/{use-workspace-zFEfqUCo.js.map → use-workspace-J5eeVxw9.js.map} +1 -1
- package/dist/web/public/assets/vector-xRphJ8hW.js +2 -0
- package/dist/web/public/assets/{vector-B9v7zTvA.js.map → vector-xRphJ8hW.js.map} +1 -1
- package/dist/web/public/assets/{viewer-CeD55ZLu.js → viewer-Bq7l2kE8.js} +3 -3
- package/dist/web/public/assets/{viewer-CeD55ZLu.js.map → viewer-Bq7l2kE8.js.map} +1 -1
- package/dist/web/public/assets/{workspace-Ci21xBqp.js → workspace-BqMuxPFF.js} +3 -3
- package/dist/web/public/assets/{workspace-Ci21xBqp.js.map → workspace-BqMuxPFF.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-C8mT-jmj.js → workspaces-D0pYJfxI.js} +3 -3
- package/dist/web/public/assets/{workspaces-C8mT-jmj.js.map → workspaces-D0pYJfxI.js.map} +1 -1
- package/dist/web/public/index.html +2 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +85 -54
- package/dist/web/server.js.map +1 -1
- package/package.json +4 -6
- package/dist/core/admin-bootstrap.d.ts +0 -42
- package/dist/core/admin-bootstrap.d.ts.map +0 -1
- package/dist/core/admin-bootstrap.js +0 -156
- package/dist/core/admin-bootstrap.js.map +0 -1
- package/dist/web/public/assets/admins-aofsuukT.js +0 -12
- package/dist/web/public/assets/admins-aofsuukT.js.map +0 -1
- package/dist/web/public/assets/audit-DshxCHuP.js +0 -2
- package/dist/web/public/assets/chat-CY4JriM5.js +0 -7
- package/dist/web/public/assets/chat-CY4JriM5.js.map +0 -1
- package/dist/web/public/assets/chevron-right-CDiFYKGo.js +0 -7
- package/dist/web/public/assets/confirm-dialog-CMWuyC3w.js +0 -2
- package/dist/web/public/assets/dialog-xeyu8dCf.js +0 -2
- package/dist/web/public/assets/dialog-xeyu8dCf.js.map +0 -1
- package/dist/web/public/assets/facts-CoWF4O82.js +0 -2
- package/dist/web/public/assets/health-C3lSUr_r.js +0 -2
- package/dist/web/public/assets/index-D1ulN_24.js +0 -199
- package/dist/web/public/assets/index-D1ulN_24.js.map +0 -1
- package/dist/web/public/assets/index-uKzGZ_Df.css +0 -1
- package/dist/web/public/assets/injection-BTDjIbkn.js +0 -2
- package/dist/web/public/assets/jobs-9YLeiSVG.js +0 -2
- package/dist/web/public/assets/layout-CgeijAPB.js +0 -2
- package/dist/web/public/assets/layout-DviZj3TJ.js +0 -2
- package/dist/web/public/assets/llm-BXhp_nmW.js.map +0 -1
- package/dist/web/public/assets/loader-circle-Bgi0H_iI.js +0 -7
- package/dist/web/public/assets/messengers-CkfyROty.js +0 -2
- package/dist/web/public/assets/persona-DnuFOp64.js +0 -2
- package/dist/web/public/assets/policy-C4xe2rWm.js +0 -2
- package/dist/web/public/assets/security-BoMdDyCY.js +0 -2
- package/dist/web/public/assets/use-agim-skills-C0HdvMQj.js +0 -2
- package/dist/web/public/assets/use-background-tasks-Co9CtmcD.js +0 -2
- package/dist/web/public/assets/use-llm-admin-Bd0XAQpx.js +0 -2
- package/dist/web/public/assets/use-llm-admin-Bd0XAQpx.js.map +0 -1
- package/dist/web/public/assets/use-memory-BHYuPOc9.js +0 -2
- package/dist/web/public/assets/use-observability-CHv6H0zQ.js +0 -2
- package/dist/web/public/assets/use-settings-Bx0ZTOsd.js +0 -2
- package/dist/web/public/assets/use-workspace-zFEfqUCo.js +0 -2
- package/dist/web/public/assets/useQuery-Bt7Ty7IO.js +0 -2
- package/dist/web/public/assets/useQuery-Bt7Ty7IO.js.map +0 -1
- package/dist/web/public/assets/vector-B9v7zTvA.js +0 -2
- package/dist/web/public/assets/x-DXACg96C.js +0 -7
- package/dist/web/public/assets/x-DXACg96C.js.map +0 -1
|
@@ -1,233 +1,267 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
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
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// IMHUB_ADMIN_USERS
|
|
7
|
-
//
|
|
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
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
72
|
-
return cachedFileRaw;
|
|
60
|
+
return [...m.values()].sort((a, b) => b.lastSeenAt.localeCompare(a.lastSeenAt));
|
|
73
61
|
}
|
|
74
|
-
function
|
|
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
|
-
|
|
86
|
-
|
|
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
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
138
|
+
return ensureStoreLoaded().admins.length > 0;
|
|
122
139
|
}
|
|
123
|
-
/** Returns
|
|
124
|
-
* runtime allowlist. */
|
|
140
|
+
/** Returns true iff the caller is in IM admin list. */
|
|
125
141
|
export function isAdmin(platform, userId) {
|
|
126
|
-
|
|
142
|
+
const norm = normalizeEntry(platform, userId);
|
|
143
|
+
if (!norm)
|
|
127
144
|
return false;
|
|
128
|
-
|
|
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
|
-
/**
|
|
147
|
+
/** List configured IM admins. */
|
|
132
148
|
export function listAdmins() {
|
|
133
|
-
return
|
|
149
|
+
return ensureStoreLoaded().admins.map((e) => ({ platform: e.platform, userId: e.userId }));
|
|
134
150
|
}
|
|
135
|
-
/**
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
145
|
-
//
|
|
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 {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
total:
|
|
155
|
-
}
|
|
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
|
-
|
|
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.
|
|
229
|
+
eventType: 'admin.revoke',
|
|
169
230
|
actor: opts?.actor ?? 'system',
|
|
170
|
-
target: `${
|
|
231
|
+
target: `${norm.platform}:${norm.userId}`,
|
|
171
232
|
outcome: 'ok',
|
|
172
|
-
details: { total:
|
|
233
|
+
details: { total: store.admins.length },
|
|
173
234
|
});
|
|
174
235
|
}
|
|
175
|
-
catch { /*
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
'
|
|
247
|
+
' 如果你认为应当有权限,请联系 Web 后台管理员把你的 IM 账号加入管理员名单。');
|
|
201
248
|
}
|
|
202
|
-
/**
|
|
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
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
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":"AAAA,4EAA4E;AAC5E,
|
|
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;
|
|
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('未识别的按钮');
|