agim-cli 1.2.154 → 1.2.155
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 +23 -0
- package/dist/core/llm/imhub-dispatcher.d.ts +6 -0
- package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -1
- package/dist/core/llm/imhub-dispatcher.js +12 -2
- package/dist/core/llm/imhub-dispatcher.js.map +1 -1
- package/dist/core/llm/registry.d.ts +21 -0
- package/dist/core/llm/registry.d.ts.map +1 -1
- package/dist/core/llm/registry.js +25 -0
- package/dist/core/llm/registry.js.map +1 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/registry.js +15 -2
- package/dist/core/registry.js.map +1 -1
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +21 -1
- package/dist/core/router.js.map +1 -1
- package/dist/plugins/agents/native/index.d.ts +17 -0
- package/dist/plugins/agents/native/index.d.ts.map +1 -1
- package/dist/plugins/agents/native/index.js +6 -1
- package/dist/plugins/agents/native/index.js.map +1 -1
- package/dist/plugins/agents/pi-native/approval.d.ts +4 -0
- package/dist/plugins/agents/pi-native/approval.d.ts.map +1 -0
- package/dist/plugins/agents/pi-native/approval.js +25 -0
- package/dist/plugins/agents/pi-native/approval.js.map +1 -0
- package/dist/plugins/agents/pi-native/factory.d.ts +5 -0
- package/dist/plugins/agents/pi-native/factory.d.ts.map +1 -0
- package/dist/plugins/agents/pi-native/factory.js +77 -0
- package/dist/plugins/agents/pi-native/factory.js.map +1 -0
- package/dist/plugins/agents/pi-native/index.d.ts +61 -0
- package/dist/plugins/agents/pi-native/index.d.ts.map +1 -0
- package/dist/plugins/agents/pi-native/index.js +199 -0
- package/dist/plugins/agents/pi-native/index.js.map +1 -0
- package/dist/plugins/agents/pi-native/provider-resolver.d.ts +7 -0
- package/dist/plugins/agents/pi-native/provider-resolver.d.ts.map +1 -0
- package/dist/plugins/agents/pi-native/provider-resolver.js +51 -0
- package/dist/plugins/agents/pi-native/provider-resolver.js.map +1 -0
- package/dist/plugins/agents/pi-native/tool-bridge.d.ts +17 -0
- package/dist/plugins/agents/pi-native/tool-bridge.d.ts.map +1 -0
- package/dist/plugins/agents/pi-native/tool-bridge.js +37 -0
- package/dist/plugins/agents/pi-native/tool-bridge.js.map +1 -0
- package/dist/plugins/agents/pi-native/tools.d.ts +12 -0
- package/dist/plugins/agents/pi-native/tools.d.ts.map +1 -0
- package/dist/plugins/agents/pi-native/tools.js +52 -0
- package/dist/plugins/agents/pi-native/tools.js.map +1 -0
- package/dist/web/public/assets/{a2a-CIxNaIdE.js → a2a-CK_McNBZ.js} +2 -2
- package/dist/web/public/assets/{a2a-CIxNaIdE.js.map → a2a-CK_McNBZ.js.map} +1 -1
- package/dist/web/public/assets/{activity-CrnWHC2j.js → activity-SXgxjjhd.js} +2 -2
- package/dist/web/public/assets/{activity-CrnWHC2j.js.map → activity-SXgxjjhd.js.map} +1 -1
- package/dist/web/public/assets/{admins-5BTRCU9u.js → admins-aofsuukT.js} +2 -2
- package/dist/web/public/assets/{admins-5BTRCU9u.js.map → admins-aofsuukT.js.map} +1 -1
- package/dist/web/public/assets/{agents-B-s9gngh.js → agents-BhuZPnjf.js} +2 -2
- package/dist/web/public/assets/{agents-B-s9gngh.js.map → agents-BhuZPnjf.js.map} +1 -1
- package/dist/web/public/assets/{approvals-BSX2lsqu.js → approvals-CUsF6htp.js} +2 -2
- package/dist/web/public/assets/{approvals-BSX2lsqu.js.map → approvals-CUsF6htp.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-D3lWOftw.js → arrow-down-Dhsj-A0i.js} +2 -2
- package/dist/web/public/assets/{arrow-down-D3lWOftw.js.map → arrow-down-Dhsj-A0i.js.map} +1 -1
- package/dist/web/public/assets/{arrow-up-BGsin7FN.js → arrow-up-Byeo8HHt.js} +2 -2
- package/dist/web/public/assets/{arrow-up-BGsin7FN.js.map → arrow-up-Byeo8HHt.js.map} +1 -1
- package/dist/web/public/assets/{asks-DfLaW3gA.js → asks-BkwfCOfj.js} +2 -2
- package/dist/web/public/assets/{asks-DfLaW3gA.js.map → asks-BkwfCOfj.js.map} +1 -1
- package/dist/web/public/assets/{audit-BWlwMCTk.js → audit-DshxCHuP.js} +2 -2
- package/dist/web/public/assets/{audit-BWlwMCTk.js.map → audit-DshxCHuP.js.map} +1 -1
- package/dist/web/public/assets/{bell-Bf-FDztO.js → bell-CgQQygG1.js} +2 -2
- package/dist/web/public/assets/{bell-Bf-FDztO.js.map → bell-CgQQygG1.js.map} +1 -1
- package/dist/web/public/assets/{bgjobs-6dDxfEi7.js → bgjobs-qYRbEcQY.js} +2 -2
- package/dist/web/public/assets/{bgjobs-6dDxfEi7.js.map → bgjobs-qYRbEcQY.js.map} +1 -1
- package/dist/web/public/assets/{brain-Dl0NIztX.js → brain-V9r2NcZc.js} +2 -2
- package/dist/web/public/assets/{brain-Dl0NIztX.js.map → brain-V9r2NcZc.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-Bl6rZAmJ.js → briefcase-CC-yM9eZ.js} +2 -2
- package/dist/web/public/assets/{briefcase-Bl6rZAmJ.js.map → briefcase-CC-yM9eZ.js.map} +1 -1
- package/dist/web/public/assets/{chat-Cu8-EeJt.js → chat-CY4JriM5.js} +2 -2
- package/dist/web/public/assets/{chat-Cu8-EeJt.js.map → chat-CY4JriM5.js.map} +1 -1
- package/dist/web/public/assets/{chevron-left-BtG3MZQX.js → chevron-left-CTwCYqyt.js} +2 -2
- package/dist/web/public/assets/{chevron-left-BtG3MZQX.js.map → chevron-left-CTwCYqyt.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-FytmF5Sd.js → chevron-right-CDiFYKGo.js} +2 -2
- package/dist/web/public/assets/{chevron-right-FytmF5Sd.js.map → chevron-right-CDiFYKGo.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-DggvG9Xs.js → circle-check-CWttT2Af.js} +2 -2
- package/dist/web/public/assets/{circle-check-DggvG9Xs.js.map → circle-check-CWttT2Af.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-J5lVPTDz.js → circle-check-big-Cf2odn4o.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-J5lVPTDz.js.map → circle-check-big-Cf2odn4o.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-pYYyY1z2.js → circle-x-CMJqo4Pi.js} +2 -2
- package/dist/web/public/assets/{circle-x-pYYyY1z2.js.map → circle-x-CMJqo4Pi.js.map} +1 -1
- package/dist/web/public/assets/{clock-CQy6p5uP.js → clock-DUKggKlF.js} +2 -2
- package/dist/web/public/assets/{clock-CQy6p5uP.js.map → clock-DUKggKlF.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-B3jno5Pb.js → confirm-dialog-CMWuyC3w.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-B3jno5Pb.js.map → confirm-dialog-CMWuyC3w.js.map} +1 -1
- package/dist/web/public/assets/{copy-BK_JexVU.js → copy-D8mIKuYJ.js} +2 -2
- package/dist/web/public/assets/{copy-BK_JexVU.js.map → copy-D8mIKuYJ.js.map} +1 -1
- package/dist/web/public/assets/{data-table-C3oIPQ_B.js → data-table-CHGndGOY.js} +2 -2
- package/dist/web/public/assets/{data-table-C3oIPQ_B.js.map → data-table-CHGndGOY.js.map} +1 -1
- package/dist/web/public/assets/{dialog-nb4ANHd4.js → dialog-xeyu8dCf.js} +2 -2
- package/dist/web/public/assets/{dialog-nb4ANHd4.js.map → dialog-xeyu8dCf.js.map} +1 -1
- package/dist/web/public/assets/{download-DtvF6Ngb.js → download-CgEI28s6.js} +2 -2
- package/dist/web/public/assets/{download-DtvF6Ngb.js.map → download-CgEI28s6.js.map} +1 -1
- package/dist/web/public/assets/{email-6PldVxPe.js → email-BLZQOZnx.js} +2 -2
- package/dist/web/public/assets/{email-6PldVxPe.js.map → email-BLZQOZnx.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-esNZG4Xa.js → empty-state-D8kx-FwO.js} +2 -2
- package/dist/web/public/assets/{empty-state-esNZG4Xa.js.map → empty-state-D8kx-FwO.js.map} +1 -1
- package/dist/web/public/assets/{external-link-Bzl-4lM6.js → external-link-BM6n9mwt.js} +2 -2
- package/dist/web/public/assets/{external-link-Bzl-4lM6.js.map → external-link-BM6n9mwt.js.map} +1 -1
- package/dist/web/public/assets/{eye-Cpc4c8vR.js → eye-Dk27zHD5.js} +2 -2
- package/dist/web/public/assets/{eye-Cpc4c8vR.js.map → eye-Dk27zHD5.js.map} +1 -1
- package/dist/web/public/assets/{facts-CAc-sdKE.js → facts-CoWF4O82.js} +2 -2
- package/dist/web/public/assets/{facts-CAc-sdKE.js.map → facts-CoWF4O82.js.map} +1 -1
- package/dist/web/public/assets/{goals-iarR52LZ.js → goals-CuiFswaR.js} +2 -2
- package/dist/web/public/assets/{goals-iarR52LZ.js.map → goals-CuiFswaR.js.map} +1 -1
- package/dist/web/public/assets/{health-DPiNRwJP.js → health-C3lSUr_r.js} +2 -2
- package/dist/web/public/assets/{health-DPiNRwJP.js.map → health-C3lSUr_r.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-DTcvh4ER.js → heart-pulse-D34iW_OF.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-DTcvh4ER.js.map → heart-pulse-D34iW_OF.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-B8tcKFzJ.js → heartbeat-Z5gPGZhm.js} +2 -2
- package/dist/web/public/assets/{heartbeat-B8tcKFzJ.js.map → heartbeat-Z5gPGZhm.js.map} +1 -1
- package/dist/web/public/assets/{hot-CqLT7AGh.js → hot-CZJeO9Mj.js} +2 -2
- package/dist/web/public/assets/{hot-CqLT7AGh.js.map → hot-CZJeO9Mj.js.map} +1 -1
- package/dist/web/public/assets/{index-BjUyDXLb.js → index-D1ulN_24.js} +30 -30
- package/dist/web/public/assets/index-D1ulN_24.js.map +1 -0
- package/dist/web/public/assets/{injection-U1ms-Jjs.js → injection-BTDjIbkn.js} +2 -2
- package/dist/web/public/assets/{injection-U1ms-Jjs.js.map → injection-BTDjIbkn.js.map} +1 -1
- package/dist/web/public/assets/{installed-8FN6LLKG.js → installed-B5IGYO0m.js} +2 -2
- package/dist/web/public/assets/{installed-8FN6LLKG.js.map → installed-B5IGYO0m.js.map} +1 -1
- package/dist/web/public/assets/{jobs-B-MU_dkD.js → jobs-9YLeiSVG.js} +2 -2
- package/dist/web/public/assets/{jobs-B-MU_dkD.js.map → jobs-9YLeiSVG.js.map} +1 -1
- package/dist/web/public/assets/{layout-CnddsqFT.js → layout-5cLpIeb4.js} +2 -2
- package/dist/web/public/assets/{layout-CnddsqFT.js.map → layout-5cLpIeb4.js.map} +1 -1
- package/dist/web/public/assets/{layout-BVI4tkRG.js → layout-BdCXtDqk.js} +2 -2
- package/dist/web/public/assets/{layout-BVI4tkRG.js.map → layout-BdCXtDqk.js.map} +1 -1
- package/dist/web/public/assets/{layout-DfE74Z47.js → layout-CgeijAPB.js} +2 -2
- package/dist/web/public/assets/{layout-DfE74Z47.js.map → layout-CgeijAPB.js.map} +1 -1
- package/dist/web/public/assets/{layout-DMOpWAPw.js → layout-DLtODZx_.js} +2 -2
- package/dist/web/public/assets/{layout-DMOpWAPw.js.map → layout-DLtODZx_.js.map} +1 -1
- package/dist/web/public/assets/{layout-BgmJrSOb.js → layout-DviZj3TJ.js} +2 -2
- package/dist/web/public/assets/{layout-BgmJrSOb.js.map → layout-DviZj3TJ.js.map} +1 -1
- package/dist/web/public/assets/{llm-5HpT83y2.js → llm-BXhp_nmW.js} +2 -2
- package/dist/web/public/assets/{llm-5HpT83y2.js.map → llm-BXhp_nmW.js.map} +1 -1
- package/dist/web/public/assets/{loader-circle-MnTMknNl.js → loader-circle-Bgi0H_iI.js} +2 -2
- package/dist/web/public/assets/{loader-circle-MnTMknNl.js.map → loader-circle-Bgi0H_iI.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-BA0GTiIe.js → map-pin-o5p1iOoH.js} +2 -2
- package/dist/web/public/assets/{map-pin-BA0GTiIe.js.map → map-pin-o5p1iOoH.js.map} +1 -1
- package/dist/web/public/assets/{mcp-C71xI5JH.js → mcp-kSwFcRcU.js} +2 -2
- package/dist/web/public/assets/{mcp-C71xI5JH.js.map → mcp-kSwFcRcU.js.map} +1 -1
- package/dist/web/public/assets/{memos-BAuv2jwD.js → memos-uAcJzXoQ.js} +2 -2
- package/dist/web/public/assets/{memos-BAuv2jwD.js.map → memos-uAcJzXoQ.js.map} +1 -1
- package/dist/web/public/assets/{messengers-CmW1ts2s.js → messengers-CkfyROty.js} +2 -2
- package/dist/web/public/assets/{messengers-CmW1ts2s.js.map → messengers-CkfyROty.js.map} +1 -1
- package/dist/web/public/assets/{mobile-DpxLpRIf.js → mobile-ClKdRpd9.js} +2 -2
- package/dist/web/public/assets/{mobile-DpxLpRIf.js.map → mobile-ClKdRpd9.js.map} +1 -1
- package/dist/web/public/assets/{native-agent-CNUBixLm.js → native-agent-yfdrcTaK.js} +2 -2
- package/dist/web/public/assets/{native-agent-CNUBixLm.js.map → native-agent-yfdrcTaK.js.map} +1 -1
- package/dist/web/public/assets/{network-DVRgX5Mm.js → network-BlQWIsIc.js} +2 -2
- package/dist/web/public/assets/{network-DVRgX5Mm.js.map → network-BlQWIsIc.js.map} +1 -1
- package/dist/web/public/assets/{outbox-C8Gc0aa0.js → outbox-CYwJu6AR.js} +2 -2
- package/dist/web/public/assets/{outbox-C8Gc0aa0.js.map → outbox-CYwJu6AR.js.map} +1 -1
- package/dist/web/public/assets/{pagination-BWgXaluu.js → pagination-C6qu72mB.js} +2 -2
- package/dist/web/public/assets/{pagination-BWgXaluu.js.map → pagination-C6qu72mB.js.map} +1 -1
- package/dist/web/public/assets/{persona--zQXx4oA.js → persona-DnuFOp64.js} +2 -2
- package/dist/web/public/assets/{persona--zQXx4oA.js.map → persona-DnuFOp64.js.map} +1 -1
- package/dist/web/public/assets/{plans-mluEj2nt.js → plans-DUg3JDwQ.js} +2 -2
- package/dist/web/public/assets/{plans-mluEj2nt.js.map → plans-DUg3JDwQ.js.map} +1 -1
- package/dist/web/public/assets/{play-BLIwYTvQ.js → play-BGXpdCxa.js} +2 -2
- package/dist/web/public/assets/{play-BLIwYTvQ.js.map → play-BGXpdCxa.js.map} +1 -1
- package/dist/web/public/assets/{plus-BOfhZkjh.js → plus-2MZ7TkP3.js} +2 -2
- package/dist/web/public/assets/{plus-BOfhZkjh.js.map → plus-2MZ7TkP3.js.map} +1 -1
- package/dist/web/public/assets/{policy-C8CPYuH5.js → policy-C4xe2rWm.js} +2 -2
- package/dist/web/public/assets/{policy-C8CPYuH5.js.map → policy-C4xe2rWm.js.map} +1 -1
- package/dist/web/public/assets/{qr-code-CfdRXZZD.js → qr-code-BVHNR5Zs.js} +2 -2
- package/dist/web/public/assets/{qr-code-CfdRXZZD.js.map → qr-code-BVHNR5Zs.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw--XT-lrCo.js → refresh-ccw-MHrCmmSv.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw--XT-lrCo.js.map → refresh-ccw-MHrCmmSv.js.map} +1 -1
- package/dist/web/public/assets/{reminders-DJkMBSTZ.js → reminders-CmV_JNt5.js} +2 -2
- package/dist/web/public/assets/{reminders-DJkMBSTZ.js.map → reminders-CmV_JNt5.js.map} +1 -1
- package/dist/web/public/assets/{save-9sLkRauh.js → save-DhFewuZL.js} +2 -2
- package/dist/web/public/assets/{save-9sLkRauh.js.map → save-DhFewuZL.js.map} +1 -1
- package/dist/web/public/assets/{schedules-BEqyQYLb.js → schedules-Cp63TJGf.js} +2 -2
- package/dist/web/public/assets/{schedules-BEqyQYLb.js.map → schedules-Cp63TJGf.js.map} +1 -1
- package/dist/web/public/assets/search-wUAqWxXK.js +17 -0
- package/dist/web/public/assets/search-wUAqWxXK.js.map +1 -0
- package/dist/web/public/assets/{search-aWQWrzh3.js → search-wZEXSmcX.js} +2 -2
- package/dist/web/public/assets/{search-aWQWrzh3.js.map → search-wZEXSmcX.js.map} +1 -1
- package/dist/web/public/assets/{security-B7KXMgM3.js → security-BoMdDyCY.js} +2 -2
- package/dist/web/public/assets/{security-B7KXMgM3.js.map → security-BoMdDyCY.js.map} +1 -1
- package/dist/web/public/assets/{service-1ZeT0cRY.js → service-C_KqtWwn.js} +2 -2
- package/dist/web/public/assets/{service-1ZeT0cRY.js.map → service-C_KqtWwn.js.map} +1 -1
- package/dist/web/public/assets/{shield-alert-BJKgUDEG.js → shield-alert-CplKlUGS.js} +2 -2
- package/dist/web/public/assets/{shield-alert-BJKgUDEG.js.map → shield-alert-CplKlUGS.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-DJgvgFQk.js → status-badge-q2WooCma.js} +2 -2
- package/dist/web/public/assets/{status-badge-DJgvgFQk.js.map → status-badge-q2WooCma.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-Cq0R4U6Z.js → subtasks-CBi4c6FD.js} +2 -2
- package/dist/web/public/assets/{subtasks-Cq0R4U6Z.js.map → subtasks-CBi4c6FD.js.map} +1 -1
- package/dist/web/public/assets/{table-CVYTRwUs.js → table-Bmwe7n4n.js} +2 -2
- package/dist/web/public/assets/{table-CVYTRwUs.js.map → table-Bmwe7n4n.js.map} +1 -1
- package/dist/web/public/assets/{topn--vv790Oy.js → topn-CMRS4ApA.js} +2 -2
- package/dist/web/public/assets/{topn--vv790Oy.js.map → topn-CMRS4ApA.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-CeN2btBl.js → trash-2-CT_B0mSH.js} +2 -2
- package/dist/web/public/assets/{trash-2-CeN2btBl.js.map → trash-2-CT_B0mSH.js.map} +1 -1
- package/dist/web/public/assets/{use-agim-skills-D5JvyrxB.js → use-agim-skills-C0HdvMQj.js} +2 -2
- package/dist/web/public/assets/{use-agim-skills-D5JvyrxB.js.map → use-agim-skills-C0HdvMQj.js.map} +1 -1
- package/dist/web/public/assets/{use-background-tasks-C6zGANI5.js → use-background-tasks-Co9CtmcD.js} +2 -2
- package/dist/web/public/assets/{use-background-tasks-C6zGANI5.js.map → use-background-tasks-Co9CtmcD.js.map} +1 -1
- package/dist/web/public/assets/{use-llm-admin-CdqRAs0I.js → use-llm-admin-Bd0XAQpx.js} +2 -2
- package/dist/web/public/assets/{use-llm-admin-CdqRAs0I.js.map → use-llm-admin-Bd0XAQpx.js.map} +1 -1
- package/dist/web/public/assets/{use-memory-Bg-C6FxV.js → use-memory-BHYuPOc9.js} +2 -2
- package/dist/web/public/assets/{use-memory-Bg-C6FxV.js.map → use-memory-BHYuPOc9.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-CiyMLYeG.js → use-observability-CHv6H0zQ.js} +2 -2
- package/dist/web/public/assets/{use-observability-CiyMLYeG.js.map → use-observability-CHv6H0zQ.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-S6mSC9nP.js → use-settings-Bx0ZTOsd.js} +2 -2
- package/dist/web/public/assets/{use-settings-S6mSC9nP.js.map → use-settings-Bx0ZTOsd.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-DRkCOO8P.js → use-workspace-zFEfqUCo.js} +2 -2
- package/dist/web/public/assets/{use-workspace-DRkCOO8P.js.map → use-workspace-zFEfqUCo.js.map} +1 -1
- package/dist/web/public/assets/{useQuery-CvEVNuvH.js → useQuery-Bt7Ty7IO.js} +2 -2
- package/dist/web/public/assets/{useQuery-CvEVNuvH.js.map → useQuery-Bt7Ty7IO.js.map} +1 -1
- package/dist/web/public/assets/{vector-BlXq3jJE.js → vector-B9v7zTvA.js} +2 -2
- package/dist/web/public/assets/{vector-BlXq3jJE.js.map → vector-B9v7zTvA.js.map} +1 -1
- package/dist/web/public/assets/{viewer-Daxh0dV4.js → viewer-CeD55ZLu.js} +2 -2
- package/dist/web/public/assets/{viewer-Daxh0dV4.js.map → viewer-CeD55ZLu.js.map} +1 -1
- package/dist/web/public/assets/{workspace-BO51vrkT.js → workspace-Ci21xBqp.js} +2 -2
- package/dist/web/public/assets/{workspace-BO51vrkT.js.map → workspace-Ci21xBqp.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-Chonjr-v.js → workspaces-C8mT-jmj.js} +2 -2
- package/dist/web/public/assets/{workspaces-Chonjr-v.js.map → workspaces-C8mT-jmj.js.map} +1 -1
- package/dist/web/public/assets/{x-Dv1gbRhw.js → x-DXACg96C.js} +2 -2
- package/dist/web/public/assets/{x-Dv1gbRhw.js.map → x-DXACg96C.js.map} +1 -1
- package/dist/web/public/index.html +1 -1
- package/dist/web/server.js +12 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +3 -1
- package/dist/web/public/assets/index-BjUyDXLb.js.map +0 -1
- package/dist/web/public/assets/search-D4CzBwIp.js +0 -17
- package/dist/web/public/assets/search-D4CzBwIp.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/agents/pi-native/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,yEAAyE;AACzE,+EAA+E;AAC/E,0EAA0E;AAC1E,6EAA6E;AAC7E,4CAA4C;AAC5C,EAAE;AACF,sEAAsE;AACtE,8EAA8E;AAC9E,8EAA8E;AAC9E,oDAAoD;AACpD,2DAA2D;AAC3D,wEAAwE;AACxE,2EAA2E;AAC3E,gFAAgF;AAEhF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAMrE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AA2ChD,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAE3B,SAAS,QAAQ,CAAC,CAAU;IAC1B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAA;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAA;AAEvF,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;AACrG,CAAC;AACD,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO;QACL,IAAI,EAAE,WAAoB;QAC1B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;QAC1C,GAAG,EAAE,oBAAoB;QACzB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjJ,UAAU,EAAE,MAAe;QAC3B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAA;AACH,CAAC;AAED,MAAM,OAAO,oBAAoB;IAUX;IATX,IAAI,CAAQ;IACZ,OAAO,CAAU;IACjB,IAAI,GAAqB,YAAY,CAAA;IAE9C,0EAA0E;IAC1E,wEAAwE;IACxE,gCAAgC;IACf,WAAW,GAAG,IAAI,GAAG,EAAiE,CAAA;IAEvG,YAAoB,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;QACpC,wEAAwE;QACxE,oEAAoE;QACpE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAA;QACpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,IAAI,CAAA;IAClD,CAAC;IAED,QAAQ;QACN,OAAO,uBAAuB,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CACf,SAAiB,EACjB,MAAc,EACd,OAAuB,EACvB,IAAoB;QAEpB,IAAI,CAAC;YACH,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,wEAAwE;YACxE,qEAAqE;YACrE,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACjE,gFAAgF;YAChF,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YACjF,MAAM,uBAAuB,GAAG,8CAA8C,CAAA;QAChF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,CAAC,OAAO,CACpB,SAAiB,EACjB,MAAc,EACd,OAAkC,EAClC,IAA+B;QAE/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,0EAA0E,CAAA;YAChF,OAAM;QACR,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;QACjE,MAAM,IAAI,GAAG,IAAI,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;QAEpF,uEAAuE;QACvE,wEAAwE;QACxE,sEAAsE;QACtE,IAAI,KAAK,GAAG,KAAK,CAAA;QACjB,IAAI,OAA8C,CAAA;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAClD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;YACjE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YACxC,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC3E,KAAK,GAAG,IAAI,CAAA;gBACZ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;YAC9D,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,CAAA;QACrE,MAAM,KAAK,GAAG,WAAW;YACvB,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE;gBACrD,OAAO,EAAE,IAAI,EAAE,OAAO;gBACtB,YAAY,EAAE,WAAW,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY;aACjE,CAAC;YACJ,CAAC,CAAC,EAAE,CAAA;QAEN,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QACrE,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,GAAG;YACH,OAAO;YACP,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;YAChD,KAAK;YACL,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,CAAA;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,IAAI,iBAAiB,CAAA;QACrE,IAAI,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC3B,OAAO,CAAC,EAAE,CACR,WAAW,EACX,KAAK,EAAE,EAA4D,EAAE,EAAE;gBACrE,oEAAoE;gBACpE,6CAA6C;gBAC7C,IAAI,IAAI,EAAE,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAChD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,sCAAsC,EAAE,CAAA;gBACxE,CAAC;gBACD,qEAAqE;gBACrE,uCAAuC;gBACvC,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,QAAQ,GAAG,MAAM,IAAI,CACzB,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAA4B,EAAE,EAChG,CAAC,CACF,CAAA;oBACD,IAAI,QAAQ,KAAK,MAAM;wBAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAA;gBAC7F,CAAC;gBACD,OAAO,SAAS,CAAA;YAClB,CAAC,CACF,CAAA;QACH,CAAC;QAED,mEAAmE;QACnE,oEAAoE;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAA;QACvF,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,IAAI,UAAU,GAAqC,IAAI,CAAA;QACvD,MAAM,UAAU,GAAa,EAAE,CAAA;QAC/B,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,EAA6D,EAAE,EAAE;YAC1F,UAAU,IAAI,CAAC,CAAA;YACf,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;gBAC1B,UAAU,GAAG,UAAU,CAAA;gBACvB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;YAC5B,CAAC;YACD,sEAAsE;YACtE,mEAAmE;YACnE,iEAAiE;YACjE,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAC7E,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACpB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;gBAAE,UAAU,CAAC,KAAK,EAAE,CAAA;YAC7C,IAAI,EAAE,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBAChF,UAAU,GAAG,YAAY,CAAA;gBACzB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;YAC5B,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC,CAAC,CAAA;QAEF,IAAI,KAAK,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;YAC/G,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAE3C,IAAI,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC;gBACX,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK;gBAC/B,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;gBACjC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK;aAClC,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO;aACxB,MAAM,CAAC,CAAC,CAAC,EAAuC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aACrE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,EAAE,CAAC,CAAA;QACX,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/B,MAAM,UAAU,KAAK,YAAY;gBAC/B,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,aAAa,OAAO,4CAA4C,CAAA;YACpE,OAAM;QACR,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,MAAM,uCAAuC,CAAA;YAC7C,OAAM;QACR,CAAC;QACD,MAAM,IAAI,CAAA;IACZ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type LlmBackendBinding, type LlmRole } from '../../../core/llm/registry.js';
|
|
2
|
+
import type { PiModelBinding } from './index.js';
|
|
3
|
+
export declare function bindingToPiModel(b: LlmBackendBinding): PiModelBinding | null;
|
|
4
|
+
/** Resolve a pi model binding for an agim LLM role, or null when no usable
|
|
5
|
+
* backend (or an unsupported provider type) is configured. */
|
|
6
|
+
export declare function resolvePiModelForRole(role: LlmRole): PiModelBinding | null;
|
|
7
|
+
//# sourceMappingURL=provider-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-resolver.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/pi-native/provider-resolver.ts"],"names":[],"mappings":"AAcA,OAAO,EAA4B,KAAK,iBAAiB,EAAE,KAAK,OAAO,EAAE,MAAM,+BAA+B,CAAA;AAC9G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAchD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,iBAAiB,GAAG,cAAc,GAAG,IAAI,CAmB5E;AAED;+DAC+D;AAC/D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAG1E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Maps agim's resolved LLM backend binding (provider type / model / baseUrl /
|
|
2
|
+
// key) onto a pi-ai Model + auth, so the pi-native engine drives real LLMs
|
|
3
|
+
// using agim's existing backend config + secrets (no new key plumbing).
|
|
4
|
+
//
|
|
5
|
+
// pi-ai facts (probed against the installed package):
|
|
6
|
+
// - registered stream apis include 'openai-completions' and 'anthropic-messages'
|
|
7
|
+
// - agim's openai-compat backends (deepseek / qwen / …) speak the chat
|
|
8
|
+
// completions wire format → 'openai-completions'
|
|
9
|
+
// - the openai-completions client uses model.baseUrl verbatim (provider.js:391),
|
|
10
|
+
// so a hand-built Model pointed at agim's baseUrl reaches the right endpoint
|
|
11
|
+
// - model.baseUrl must be a string (the provider calls .includes on it)
|
|
12
|
+
// - auth flows via getApiKeyAndHeaders → stream options.apiKey/headers
|
|
13
|
+
import { getBackendBindingForRole } from '../../../core/llm/registry.js';
|
|
14
|
+
/** agim providerType → pi-ai stream api id. Unmapped types are unsupported
|
|
15
|
+
* by the pi engine (resolver returns null → adapter reports unavailable). */
|
|
16
|
+
const API_BY_PROVIDER_TYPE = {
|
|
17
|
+
'openai-compat': 'openai-completions',
|
|
18
|
+
anthropic: 'anthropic-messages',
|
|
19
|
+
};
|
|
20
|
+
const DEFAULT_BASE_URL = {
|
|
21
|
+
'openai-completions': 'https://api.openai.com/v1',
|
|
22
|
+
'anthropic-messages': 'https://api.anthropic.com',
|
|
23
|
+
};
|
|
24
|
+
export function bindingToPiModel(b) {
|
|
25
|
+
const api = API_BY_PROVIDER_TYPE[b.providerType];
|
|
26
|
+
if (!api)
|
|
27
|
+
return null;
|
|
28
|
+
const model = {
|
|
29
|
+
id: b.model,
|
|
30
|
+
name: b.model,
|
|
31
|
+
api,
|
|
32
|
+
provider: b.name,
|
|
33
|
+
baseUrl: b.baseUrl ?? DEFAULT_BASE_URL[api] ?? 'https://api.openai.com/v1',
|
|
34
|
+
reasoning: false,
|
|
35
|
+
input: ['text'],
|
|
36
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
37
|
+
contextWindow: 128000,
|
|
38
|
+
maxTokens: b.maxTokens ?? 8192,
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
model,
|
|
42
|
+
getApiKeyAndHeaders: async () => ({ apiKey: b.apiKey ?? '', headers: b.extraHeaders ?? {} }),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Resolve a pi model binding for an agim LLM role, or null when no usable
|
|
46
|
+
* backend (or an unsupported provider type) is configured. */
|
|
47
|
+
export function resolvePiModelForRole(role) {
|
|
48
|
+
const binding = getBackendBindingForRole(role);
|
|
49
|
+
return binding ? bindingToPiModel(binding) : null;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=provider-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-resolver.js","sourceRoot":"","sources":["../../../../src/plugins/agents/pi-native/provider-resolver.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,wEAAwE;AACxE,EAAE;AACF,sDAAsD;AACtD,mFAAmF;AACnF,yEAAyE;AACzE,qDAAqD;AACrD,mFAAmF;AACnF,iFAAiF;AACjF,0EAA0E;AAC1E,yEAAyE;AAGzE,OAAO,EAAE,wBAAwB,EAAwC,MAAM,+BAA+B,CAAA;AAG9G;8EAC8E;AAC9E,MAAM,oBAAoB,GAA2B;IACnD,eAAe,EAAE,oBAAoB;IACrC,SAAS,EAAE,oBAAoB;CAChC,CAAA;AAED,MAAM,gBAAgB,GAA2B;IAC/C,oBAAoB,EAAE,2BAA2B;IACjD,oBAAoB,EAAE,2BAA2B;CAClD,CAAA;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAoB;IACnD,MAAM,GAAG,GAAG,oBAAoB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,KAAK,GAAG;QACZ,EAAE,EAAE,CAAC,CAAC,KAAK;QACX,IAAI,EAAE,CAAC,CAAC,KAAK;QACb,GAAG;QACH,QAAQ,EAAE,CAAC,CAAC,IAAI;QAChB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,2BAA2B;QAC1E,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,CAAC,MAAM,CAAyB;QACvC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;QAC1D,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;KACd,CAAA;IAClB,OAAO;QACL,KAAK;QACL,mBAAmB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;KAC7F,CAAA;AACH,CAAC;AAED;+DAC+D;AAC/D,MAAM,UAAU,qBAAqB,CAAC,IAAa;IACjD,MAAM,OAAO,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAA;IAC9C,OAAO,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACnD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
|
+
import type { ToolDef } from '../../../core/llm/provider-base.js';
|
|
3
|
+
import type { ToolDispatcher } from '../../../core/llm/tool-dispatcher.js';
|
|
4
|
+
export interface ToolBridgeOptions {
|
|
5
|
+
/** Forwarded into ToolDispatcherContext so dispatchers can correlate audit
|
|
6
|
+
* rows back to the originating turn. */
|
|
7
|
+
traceId?: string;
|
|
8
|
+
/** agim's parallel-safe verdict per tool name (read-only tools may run
|
|
9
|
+
* concurrently). Defaults to sequential — the safe choice for mutating /
|
|
10
|
+
* stateful tools. */
|
|
11
|
+
parallelSafe?: (toolName: string) => boolean;
|
|
12
|
+
}
|
|
13
|
+
/** Wrap one agim ToolDef + the shared dispatcher into a pi AgentTool. */
|
|
14
|
+
export declare function agimToolToPi(def: ToolDef, dispatch: ToolDispatcher, opts?: ToolBridgeOptions): AgentTool;
|
|
15
|
+
/** Bridge a whole agim tool surface at once. */
|
|
16
|
+
export declare function agimToolsToPi(tools: ToolDef[], dispatch: ToolDispatcher, opts?: ToolBridgeOptions): AgentTool[];
|
|
17
|
+
//# sourceMappingURL=tool-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-bridge.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/pi-native/tool-bridge.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAA;AAM1E,MAAM,WAAW,iBAAiB;IAChC;6CACyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;0BAEsB;IACtB,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;CAC7C;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,GAAE,iBAAsB,GAAG,SAAS,CAmB5G;AAED,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,GAAE,iBAAsB,GAAG,SAAS,EAAE,CAEnH"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Bridges agim's tool surface (ToolDef[] schemas + a ToolDispatcher) onto pi's
|
|
2
|
+
// AgentTool[] so the pi-native engine reuses agim's existing builtin / imhub /
|
|
3
|
+
// MCP dispatchers unchanged.
|
|
4
|
+
//
|
|
5
|
+
// Two facts (validated against pi source, see PROJECTS/pi-native-migration.md):
|
|
6
|
+
// - pi accepts a plain JSON Schema as AgentTool.parameters (it reads only
|
|
7
|
+
// .properties / .required). agim's ToolDef.parameters is already that.
|
|
8
|
+
// - pi has NO isError field on a tool result; a tool signals an error by
|
|
9
|
+
// THROWING. agim's DispatcherResult returns { isError }. The bridge
|
|
10
|
+
// translates an isError result into a throw so pi marks the tool result as
|
|
11
|
+
// an error and the dispatcher's text still reaches the model.
|
|
12
|
+
/** A never-aborted signal for when pi invokes execute without one. The agim
|
|
13
|
+
* ToolDispatcher contract requires a non-optional AbortSignal. */
|
|
14
|
+
const NEVER_ABORT = new AbortController().signal;
|
|
15
|
+
/** Wrap one agim ToolDef + the shared dispatcher into a pi AgentTool. */
|
|
16
|
+
export function agimToolToPi(def, dispatch, opts = {}) {
|
|
17
|
+
return {
|
|
18
|
+
label: def.name,
|
|
19
|
+
name: def.name,
|
|
20
|
+
description: def.description,
|
|
21
|
+
// pi reads only .properties/.required off this; agim's JSON Schema is fine.
|
|
22
|
+
parameters: def.parameters,
|
|
23
|
+
executionMode: opts.parallelSafe?.(def.name) ? 'parallel' : 'sequential',
|
|
24
|
+
execute: async (toolCallId, args, signal) => {
|
|
25
|
+
const result = await dispatch({ id: toolCallId, name: def.name, arguments: (args ?? {}) }, signal ?? NEVER_ABORT, opts.traceId ? { traceId: opts.traceId } : undefined);
|
|
26
|
+
// pi marks errors via throw (no isError field on its result shape).
|
|
27
|
+
if (result.isError)
|
|
28
|
+
throw new Error(result.text);
|
|
29
|
+
return { content: [{ type: 'text', text: result.text }], details: undefined };
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Bridge a whole agim tool surface at once. */
|
|
34
|
+
export function agimToolsToPi(tools, dispatch, opts = {}) {
|
|
35
|
+
return tools.map((def) => agimToolToPi(def, dispatch, opts));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=tool-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-bridge.js","sourceRoot":"","sources":["../../../../src/plugins/agents/pi-native/tool-bridge.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,+EAA+E;AAC/E,6BAA6B;AAC7B,EAAE;AACF,gFAAgF;AAChF,4EAA4E;AAC5E,2EAA2E;AAC3E,2EAA2E;AAC3E,wEAAwE;AACxE,+EAA+E;AAC/E,kEAAkE;AAMlE;mEACmE;AACnE,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC,MAAM,CAAA;AAYhD,yEAAyE;AACzE,MAAM,UAAU,YAAY,CAAC,GAAY,EAAE,QAAwB,EAAE,OAA0B,EAAE;IAC/F,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,IAAI;QACf,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,4EAA4E;QAC5E,UAAU,EAAE,GAAG,CAAC,UAAqC;QACrD,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;QACxE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,IAAI,EAAE,CAA4B,EAAE,EACtF,MAAM,IAAI,WAAW,EACrB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CACrD,CAAA;YACD,oEAAoE;YACpE,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAChD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;QAC/E,CAAC;KACF,CAAA;AACH,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,QAAwB,EAAE,OAA0B,EAAE;IACpG,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;AAC9D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ToolDef } from '../../../core/llm/provider-base.js';
|
|
2
|
+
import type { ToolDispatcher } from '../../../core/llm/tool-dispatcher.js';
|
|
3
|
+
import type { AgentSendOpts } from '../../../core/types.js';
|
|
4
|
+
export interface PiToolSurface {
|
|
5
|
+
tools: ToolDef[];
|
|
6
|
+
dispatch: ToolDispatcher;
|
|
7
|
+
parallelSafe: (toolName: string) => boolean;
|
|
8
|
+
}
|
|
9
|
+
/** Build the per-turn agim tool surface for a pi-native run. Mirrors the
|
|
10
|
+
* context the legacy native adapter passes to assembleNativeTools. */
|
|
11
|
+
export declare function assembleToolsForPi(opts: AgentSendOpts | undefined, sessionId: string): PiToolSurface;
|
|
12
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../src/plugins/agents/pi-native/tools.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAA;AAE1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAG3D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,QAAQ,EAAE,cAAc,CAAA;IACxB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;CAC5C;AAED;uEACuE;AACvE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,CA8CpG"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Assembles the SAME tool surface agim's legacy native engine exposes
|
|
2
|
+
// (builtin / fs / web / exec / todo / plan-exit / imhub / external-MCP) for a
|
|
3
|
+
// pi-native turn, by reusing native's single-source assembleNativeTools. The
|
|
4
|
+
// pi adapter then bridges these ToolDef[] + dispatcher onto pi AgentTool[].
|
|
5
|
+
import { resolveAgentCwd, defaultAgentCwd } from '../../../core/agent-cwd.js';
|
|
6
|
+
import { threadKey as makeThreadKey } from '../../../core/approval-bus.js';
|
|
7
|
+
import { effectivePlanModeOn } from '../../../core/plan-mode-state.js';
|
|
8
|
+
import { assembleNativeTools } from '../native/tool-registry.js';
|
|
9
|
+
/** Build the per-turn agim tool surface for a pi-native run. Mirrors the
|
|
10
|
+
* context the legacy native adapter passes to assembleNativeTools. */
|
|
11
|
+
export function assembleToolsForPi(opts, sessionId) {
|
|
12
|
+
const o = opts ?? {};
|
|
13
|
+
const planThreadKey = o.platform && o.threadId ? makeThreadKey(o.platform, o.channelId ?? '', o.threadId) : undefined;
|
|
14
|
+
const imhubCtx = {
|
|
15
|
+
platform: o.platform || 'native-agent',
|
|
16
|
+
channelId: o.channelId || 'default',
|
|
17
|
+
threadId: o.threadId || sessionId,
|
|
18
|
+
userId: o.userId || 'unknown',
|
|
19
|
+
callerAgent: 'pi-native',
|
|
20
|
+
callerDepth: o.callDepth ?? 0,
|
|
21
|
+
// Link A2A callee rows to the parent turn so the web A2A views can see them.
|
|
22
|
+
...(typeof o.parentJobId === 'number' ? { parentJobId: o.parentJobId } : {}),
|
|
23
|
+
// Propagate plan-mode to any call_agent the imhub dispatcher fires, so a
|
|
24
|
+
// plan-mode parent can't delegate a write task at full access (mirrors the
|
|
25
|
+
// v1.2.154 approval-bus fix on the legacy path).
|
|
26
|
+
callerPlanMode: (planThreadKey ? effectivePlanModeOn(planThreadKey) : false) || o.planMode === true,
|
|
27
|
+
};
|
|
28
|
+
const cwd = resolveAgentCwd('native', o) || defaultAgentCwd('native');
|
|
29
|
+
const assembled = assembleNativeTools({
|
|
30
|
+
cwd,
|
|
31
|
+
rpcCtx: o.platform && o.threadId
|
|
32
|
+
? { platform: o.platform, channelId: o.channelId ?? '', threadId: o.threadId, userId: o.userId ?? '' }
|
|
33
|
+
: undefined,
|
|
34
|
+
todoThreadKey: planThreadKey ?? `pi-native:${sessionId}`,
|
|
35
|
+
planExitCtx: {
|
|
36
|
+
threadKey: planThreadKey ?? `pi-native:${sessionId}`,
|
|
37
|
+
runId: sessionId,
|
|
38
|
+
platform: o.platform,
|
|
39
|
+
channelId: o.channelId,
|
|
40
|
+
threadId: o.threadId,
|
|
41
|
+
userId: o.userId,
|
|
42
|
+
},
|
|
43
|
+
advertisePlanExit: !!(planThreadKey && effectivePlanModeOn(planThreadKey)),
|
|
44
|
+
imhubCtx,
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
tools: assembled.tools,
|
|
48
|
+
dispatch: assembled.dispatch,
|
|
49
|
+
parallelSafe: (name) => assembled.isParallelSafe({ id: '', name, arguments: {} }),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../src/plugins/agents/pi-native/tools.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,8EAA8E;AAC9E,6EAA6E;AAC7E,4EAA4E;AAE5E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC7E,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAG1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAQhE;uEACuE;AACvE,MAAM,UAAU,kBAAkB,CAAC,IAA+B,EAAE,SAAiB;IACnF,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAA;IACpB,MAAM,aAAa,GACjB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAEjG,MAAM,QAAQ,GAAG;QACf,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,cAAc;QACtC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,SAAS;QACnC,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,SAAS;QACjC,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;QAC7B,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC;QAC7B,6EAA6E;QAC7E,GAAG,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,yEAAyE;QACzE,2EAA2E;QAC3E,iDAAiD;QACjD,cAAc,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI;KACpG,CAAA;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAA;IAErE,MAAM,SAAS,GAAG,mBAAmB,CAAC;QACpC,GAAG;QACH,MAAM,EACJ,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ;YACtB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE;YACtG,CAAC,CAAC,SAAS;QACf,aAAa,EAAE,aAAa,IAAI,aAAa,SAAS,EAAE;QACxD,WAAW,EAAE;YACX,SAAS,EAAE,aAAa,IAAI,aAAa,SAAS,EAAE;YACpD,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB;QACD,iBAAiB,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAC1E,QAAQ;KACT,CAAC,CAAA;IAEF,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,YAAY,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;KAC1F,CAAA;AACH,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{n as p,a as f,d as o,u as g,j as t,c as m,B as j}from"./index-
|
|
1
|
+
import{n as p,a as f,d as o,u as g,j as t,c as m,B as j}from"./index-D1ulN_24.js";import{r as N}from"./react-DlP5eolq.js";import{D as y}from"./data-table-CHGndGOY.js";import{E as b}from"./empty-state-D8kx-FwO.js";import{S as w}from"./status-badge-q2WooCma.js";import{u as x}from"./useQuery-Bt7Ty7IO.js";import{u as v}from"./use-event-stream-I1lMFEfh.js";import{L as A}from"./loader-circle-Bgi0H_iI.js";import{R as S}from"./refresh-ccw-MHrCmmSv.js";import"./table-Bmwe7n4n.js";import"./arrow-up-Byeo8HHt.js";import"./arrow-down-Dhsj-A0i.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const C=p("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]),l={all:["a2a"],stats:["a2a","stats"],recent:e=>["a2a","recent",e]};function T(){return x({queryKey:l.stats,queryFn:()=>o.getA2AStats()})}function q(e){return x({queryKey:l.recent(e),queryFn:()=>o.getA2ARecent(e)})}function E(){const e=f();return()=>e.invalidateQueries({queryKey:l.all})}const L={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function V(){const{t:e}=g(["tasks","common"]),s=E(),n=T(),r=q({limit:50}),u=r.data?.rows??[],i=n.data,d=v({job:()=>s()}),h=N.useMemo(()=>[{id:"id",header:e("a2a.col.id"),cell:a=>t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.id]}),headClassName:"w-16"},{id:"agent",header:e("a2a.col.agent"),cell:a=>t.jsx("span",{className:"font-medium",children:a.agent}),headClassName:"w-32"},{id:"parent",header:e("a2a.col.parent"),cell:a=>a.parent_id!=null?t.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.parent_id]}):t.jsx("span",{className:"text-text-muted",children:"—"}),headClassName:"w-20"},{id:"depth",header:e("a2a.col.depth"),cell:a=>t.jsx("span",{className:"tabular-nums text-text-dim",children:a.call_depth}),headClassName:"w-16",hideOnMobile:!0},{id:"status",header:e("a2a.col.status"),cell:a=>t.jsx(w,{status:a.status,children:a.status}),headClassName:"w-28"},{id:"prompt",header:e("a2a.col.prompt"),cell:a=>t.jsx("span",{className:"line-clamp-2 text-text-dim",children:a.prompt??"—"}),asCardTitle:!0},{id:"createdAt",header:e("a2a.col.createdAt"),cell:a=>t.jsx("span",{className:"text-text-dim",children:R(a.created_at)}),headClassName:"w-40",hideOnMobile:!0}],[e]);return t.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[t.jsxs("header",{className:"flex flex-col gap-1",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("h1",{className:"text-xl font-semibold",children:e("a2a.title")}),t.jsx("span",{className:m("text-xs font-medium tabular-nums",L[d]),children:e(`jobs.live.${d}`)}),t.jsxs(j,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{r.refetch(),n.refetch()},disabled:r.isFetching||n.isFetching,"aria-label":e("actions.refresh",{ns:"common"}),children:[r.isFetching?t.jsx(A,{className:"h-4 w-4 animate-spin"}):t.jsx(S,{className:"h-4 w-4"}),t.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),t.jsx("p",{className:"text-sm text-text-dim",children:e("a2a.subtitle")})]}),i&&t.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[t.jsx(c,{label:e("a2a.stats.total"),value:i.total,tone:"info"}),t.jsx(c,{label:e("a2a.stats.recent24h"),value:i.recent24h,tone:"success"}),t.jsx(c,{label:e("a2a.stats.maxDepth"),value:i.maxDepth,tone:"warning"})]}),t.jsx(y,{columns:h,rows:u,getRowId:a=>String(a.id),loading:r.isLoading,emptyState:t.jsx(b,{icon:t.jsx(C,{}),title:e("a2a.empty.title"),description:e("a2a.empty.description")})})]})}const k={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function c({label:e,value:s,tone:n}){return t.jsxs("div",{className:m("rounded-md border bg-surface px-3 py-2",k[n]),children:[t.jsx("div",{className:"text-xs uppercase tracking-wide text-text-dim",children:e}),t.jsx("div",{className:"text-2xl font-semibold tabular-nums",children:s})]})}function R(e){try{const s=new Date(e);return Number.isNaN(s.getTime())?e:s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}export{V as default};
|
|
7
|
-
//# sourceMappingURL=a2a-
|
|
7
|
+
//# sourceMappingURL=a2a-CK_McNBZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2a-CIxNaIdE.js","sources":["../../node_modules/lucide-react/dist/esm/icons/git-branch.js","../../src/hooks/use-a2a.ts","../../src/routes/tasks/a2a.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GitBranch = createLucideIcon(\"GitBranch\", [\n [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n]);\n\nexport { GitBranch as default };\n//# sourceMappingURL=git-branch.js.map\n","/**\n * useA2A* — react-query wrappers for the Agent-to-Agent inline-job\n * view. Read-only; data lives in jobs.db and is exposed via:\n *\n * GET /api/a2a/stats → totals, recent24h, maxDepth, byStatus/byAgent\n * GET /api/a2a/recent → recent rows (truncated prompt + result)\n *\n * SSE: subscribes to the `job` event so a freshly-completed inline\n * sub-invocation shows up without manual refresh.\n */\n\nimport { useQueryClient, useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { A2AStats, ListA2ARecentQuery, ListA2ARecentResponse } from '@/types/api'\n\nexport const a2aKeys = {\n all: ['a2a'] as const,\n stats: ['a2a', 'stats'] as const,\n recent: (q: ListA2ARecentQuery) => ['a2a', 'recent', q] as const,\n}\n\nexport function useA2AStats() {\n return useQuery<A2AStats>({\n queryKey: a2aKeys.stats,\n queryFn: () => api.getA2AStats(),\n })\n}\n\nexport function useA2ARecent(query: ListA2ARecentQuery) {\n return useQuery<ListA2ARecentResponse>({\n queryKey: a2aKeys.recent(query),\n queryFn: () => api.getA2ARecent(query),\n })\n}\n\nexport function useInvalidateA2A() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: a2aKeys.all })\n}\n","/**\n * /tasks/a2a — Agent ↔ Agent inline-call history.\n *\n * Splits into stats KPI cards (total / recent24h / maxDepth) +\n * recent-rows table. Subscribes to the SSE `job` event so a fresh\n * agent-to-agent call appears live.\n */\n\nimport { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GitBranch, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { StatusBadge } from '@/components/common/status-badge'\nimport { Button } from '@/components/ui/button'\nimport { useA2ARecent, useA2AStats, useInvalidateA2A } from '@/hooks/use-a2a'\nimport { useEventStream, type SseStatus } from '@/hooks/use-event-stream'\nimport type { A2ARow } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nconst LIVE_STATUS_CLASS: Record<SseStatus, string> = {\n connected: 'text-success',\n connecting: 'text-text-dim',\n reconnecting: 'text-warning',\n closed: 'text-text-muted',\n}\n\nexport default function A2ARoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const invalidate = useInvalidateA2A()\n\n const statsQuery = useA2AStats()\n const recentQuery = useA2ARecent({ limit: 50 })\n const rows = recentQuery.data?.rows ?? []\n const stats = statsQuery.data\n\n const live = useEventStream({\n job: () => invalidate(),\n })\n\n const columns: DataTableColumn<A2ARow>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('a2a.col.id'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">#{r.id}</span>,\n headClassName: 'w-16',\n },\n {\n id: 'agent',\n header: t('a2a.col.agent'),\n cell: (r) => <span className=\"font-medium\">{r.agent}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'parent',\n header: t('a2a.col.parent'),\n cell: (r) =>\n r.parent_id != null ? (\n <span className=\"tabular-nums text-text-dim\">#{r.parent_id}</span>\n ) : (\n <span className=\"text-text-muted\">—</span>\n ),\n headClassName: 'w-20',\n },\n {\n id: 'depth',\n header: t('a2a.col.depth'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">{r.call_depth}</span>,\n headClassName: 'w-16',\n hideOnMobile: true,\n },\n {\n id: 'status',\n header: t('a2a.col.status'),\n cell: (r) => <StatusBadge status={r.status}>{r.status}</StatusBadge>,\n headClassName: 'w-28',\n },\n {\n id: 'prompt',\n header: t('a2a.col.prompt'),\n cell: (r) => (\n <span className=\"line-clamp-2 text-text-dim\">{r.prompt ?? '—'}</span>\n ),\n asCardTitle: true,\n },\n {\n id: 'createdAt',\n header: t('a2a.col.createdAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.created_at)}</span>,\n headClassName: 'w-40',\n hideOnMobile: true,\n },\n ],\n [t],\n )\n\n return (\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('a2a.title')}</h1>\n <span className={cn('text-xs font-medium tabular-nums', LIVE_STATUS_CLASS[live])}>\n {t(`jobs.live.${live}`)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => {\n void recentQuery.refetch()\n void statsQuery.refetch()\n }}\n disabled={recentQuery.isFetching || statsQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {recentQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('a2a.subtitle')}</p>\n </header>\n\n {stats && (\n <div className=\"grid grid-cols-3 gap-2\">\n <StatCard label={t('a2a.stats.total')} value={stats.total} tone=\"info\" />\n <StatCard label={t('a2a.stats.recent24h')} value={stats.recent24h} tone=\"success\" />\n <StatCard label={t('a2a.stats.maxDepth')} value={stats.maxDepth} tone=\"warning\" />\n </div>\n )}\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => String(r.id)}\n loading={recentQuery.isLoading}\n emptyState={\n <EmptyState\n icon={<GitBranch />}\n title={t('a2a.empty.title')}\n description={t('a2a.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\ninterface StatCardProps {\n label: string\n value: number\n tone: 'info' | 'success' | 'warning' | 'danger'\n}\n\nconst TONE_STYLES: Record<StatCardProps['tone'], string> = {\n info: 'border-info/30 text-info',\n success: 'border-success/30 text-success',\n warning: 'border-warning/30 text-warning',\n danger: 'border-danger/30 text-danger',\n}\n\nfunction StatCard({ label, value, tone }: StatCardProps): JSX.Element {\n return (\n <div\n className={cn(\n 'rounded-md border bg-surface px-3 py-2',\n TONE_STYLES[tone],\n )}\n >\n <div className=\"text-xs uppercase tracking-wide text-text-dim\">{label}</div>\n <div className=\"text-2xl font-semibold tabular-nums\">{value}</div>\n </div>\n )\n}\n\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["GitBranch","createLucideIcon","a2aKeys","q","useA2AStats","useQuery","api","useA2ARecent","query","useInvalidateA2A","qc","useQueryClient","LIVE_STATUS_CLASS","A2ARoute","t","useTranslation","invalidate","statsQuery","recentQuery","rows","stats","live","useEventStream","columns","useMemo","r","jsxs","jsx","StatusBadge","formatTime","cn","Button","Loader2","RefreshCcw","StatCard","DataTable","EmptyState","TONE_STYLES","label","value","tone","iso","d"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"a2a-CK_McNBZ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/git-branch.js","../../src/hooks/use-a2a.ts","../../src/routes/tasks/a2a.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GitBranch = createLucideIcon(\"GitBranch\", [\n [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n]);\n\nexport { GitBranch as default };\n//# sourceMappingURL=git-branch.js.map\n","/**\n * useA2A* — react-query wrappers for the Agent-to-Agent inline-job\n * view. Read-only; data lives in jobs.db and is exposed via:\n *\n * GET /api/a2a/stats → totals, recent24h, maxDepth, byStatus/byAgent\n * GET /api/a2a/recent → recent rows (truncated prompt + result)\n *\n * SSE: subscribes to the `job` event so a freshly-completed inline\n * sub-invocation shows up without manual refresh.\n */\n\nimport { useQueryClient, useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { A2AStats, ListA2ARecentQuery, ListA2ARecentResponse } from '@/types/api'\n\nexport const a2aKeys = {\n all: ['a2a'] as const,\n stats: ['a2a', 'stats'] as const,\n recent: (q: ListA2ARecentQuery) => ['a2a', 'recent', q] as const,\n}\n\nexport function useA2AStats() {\n return useQuery<A2AStats>({\n queryKey: a2aKeys.stats,\n queryFn: () => api.getA2AStats(),\n })\n}\n\nexport function useA2ARecent(query: ListA2ARecentQuery) {\n return useQuery<ListA2ARecentResponse>({\n queryKey: a2aKeys.recent(query),\n queryFn: () => api.getA2ARecent(query),\n })\n}\n\nexport function useInvalidateA2A() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: a2aKeys.all })\n}\n","/**\n * /tasks/a2a — Agent ↔ Agent inline-call history.\n *\n * Splits into stats KPI cards (total / recent24h / maxDepth) +\n * recent-rows table. Subscribes to the SSE `job` event so a fresh\n * agent-to-agent call appears live.\n */\n\nimport { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { GitBranch, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { StatusBadge } from '@/components/common/status-badge'\nimport { Button } from '@/components/ui/button'\nimport { useA2ARecent, useA2AStats, useInvalidateA2A } from '@/hooks/use-a2a'\nimport { useEventStream, type SseStatus } from '@/hooks/use-event-stream'\nimport type { A2ARow } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nconst LIVE_STATUS_CLASS: Record<SseStatus, string> = {\n connected: 'text-success',\n connecting: 'text-text-dim',\n reconnecting: 'text-warning',\n closed: 'text-text-muted',\n}\n\nexport default function A2ARoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const invalidate = useInvalidateA2A()\n\n const statsQuery = useA2AStats()\n const recentQuery = useA2ARecent({ limit: 50 })\n const rows = recentQuery.data?.rows ?? []\n const stats = statsQuery.data\n\n const live = useEventStream({\n job: () => invalidate(),\n })\n\n const columns: DataTableColumn<A2ARow>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('a2a.col.id'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">#{r.id}</span>,\n headClassName: 'w-16',\n },\n {\n id: 'agent',\n header: t('a2a.col.agent'),\n cell: (r) => <span className=\"font-medium\">{r.agent}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'parent',\n header: t('a2a.col.parent'),\n cell: (r) =>\n r.parent_id != null ? (\n <span className=\"tabular-nums text-text-dim\">#{r.parent_id}</span>\n ) : (\n <span className=\"text-text-muted\">—</span>\n ),\n headClassName: 'w-20',\n },\n {\n id: 'depth',\n header: t('a2a.col.depth'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">{r.call_depth}</span>,\n headClassName: 'w-16',\n hideOnMobile: true,\n },\n {\n id: 'status',\n header: t('a2a.col.status'),\n cell: (r) => <StatusBadge status={r.status}>{r.status}</StatusBadge>,\n headClassName: 'w-28',\n },\n {\n id: 'prompt',\n header: t('a2a.col.prompt'),\n cell: (r) => (\n <span className=\"line-clamp-2 text-text-dim\">{r.prompt ?? '—'}</span>\n ),\n asCardTitle: true,\n },\n {\n id: 'createdAt',\n header: t('a2a.col.createdAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.created_at)}</span>,\n headClassName: 'w-40',\n hideOnMobile: true,\n },\n ],\n [t],\n )\n\n return (\n <div className=\"mx-auto flex max-w-7xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('a2a.title')}</h1>\n <span className={cn('text-xs font-medium tabular-nums', LIVE_STATUS_CLASS[live])}>\n {t(`jobs.live.${live}`)}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => {\n void recentQuery.refetch()\n void statsQuery.refetch()\n }}\n disabled={recentQuery.isFetching || statsQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {recentQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('a2a.subtitle')}</p>\n </header>\n\n {stats && (\n <div className=\"grid grid-cols-3 gap-2\">\n <StatCard label={t('a2a.stats.total')} value={stats.total} tone=\"info\" />\n <StatCard label={t('a2a.stats.recent24h')} value={stats.recent24h} tone=\"success\" />\n <StatCard label={t('a2a.stats.maxDepth')} value={stats.maxDepth} tone=\"warning\" />\n </div>\n )}\n\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(r) => String(r.id)}\n loading={recentQuery.isLoading}\n emptyState={\n <EmptyState\n icon={<GitBranch />}\n title={t('a2a.empty.title')}\n description={t('a2a.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\ninterface StatCardProps {\n label: string\n value: number\n tone: 'info' | 'success' | 'warning' | 'danger'\n}\n\nconst TONE_STYLES: Record<StatCardProps['tone'], string> = {\n info: 'border-info/30 text-info',\n success: 'border-success/30 text-success',\n warning: 'border-warning/30 text-warning',\n danger: 'border-danger/30 text-danger',\n}\n\nfunction StatCard({ label, value, tone }: StatCardProps): JSX.Element {\n return (\n <div\n className={cn(\n 'rounded-md border bg-surface px-3 py-2',\n TONE_STYLES[tone],\n )}\n >\n <div className=\"text-xs uppercase tracking-wide text-text-dim\">{label}</div>\n <div className=\"text-2xl font-semibold tabular-nums\">{value}</div>\n </div>\n )\n}\n\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["GitBranch","createLucideIcon","a2aKeys","q","useA2AStats","useQuery","api","useA2ARecent","query","useInvalidateA2A","qc","useQueryClient","LIVE_STATUS_CLASS","A2ARoute","t","useTranslation","invalidate","statsQuery","recentQuery","rows","stats","live","useEventStream","columns","useMemo","r","jsxs","jsx","StatusBadge","formatTime","cn","Button","Loader2","RefreshCcw","StatCard","DataTable","EmptyState","TONE_STYLES","label","value","tone","iso","d"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{n as t}from"./index-
|
|
1
|
+
import{n as t}from"./index-D1ulN_24.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const c=t("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);export{c as A};
|
|
7
|
-
//# sourceMappingURL=activity-
|
|
7
|
+
//# sourceMappingURL=activity-SXgxjjhd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-
|
|
1
|
+
{"version":3,"file":"activity-SXgxjjhd.js","sources":["../../node_modules/lucide-react/dist/esm/icons/activity.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Activity = createLucideIcon(\"Activity\", [\n [\n \"path\",\n {\n d: \"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\",\n key: \"169zse\"\n }\n ]\n]);\n\nexport { Activity as default };\n//# sourceMappingURL=activity.js.map\n"],"names":["Activity","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CACE,OACA,CACE,EAAG,6HACH,IAAK,QACX,CACA,CACA,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as A,u as S,j as s,B as d,k as c,L as N,I as y,l as n,m as w}from"./index-
|
|
1
|
+
import{n as A,u as S,j as s,B as d,k as c,L as N,I as y,l as n,m as w}from"./index-D1ulN_24.js";import{r as x}from"./react-DlP5eolq.js";import{C as L}from"./confirm-dialog-CMWuyC3w.js";import{E as P}from"./empty-state-D8kx-FwO.js";import{T as E,a as z,b as C,c as h,d as B,e as u}from"./table-Bmwe7n4n.js";import{n as F,o as D,p as H}from"./use-settings-Bx0ZTOsd.js";import{L as T}from"./loader-circle-Bgi0H_iI.js";import{R as U}from"./refresh-ccw-MHrCmmSv.js";import{T as _}from"./trash-2-CT_B0mSH.js";import"./dialog-xeyu8dCf.js";import"./x-DXACg96C.js";import"./useQuery-Bt7Ty7IO.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
@@ -9,4 +9,4 @@ import{n as A,u as S,j as s,B as d,k as c,L as N,I as y,l as n,m as w}from"./ind
|
|
|
9
9
|
* This source code is licensed under the ISC license.
|
|
10
10
|
* See the LICENSE file in the root directory of this source tree.
|
|
11
11
|
*/const $=A("UserPlus",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]]);function es(){const{t:e}=S(["settings","common"]),i=F(),t=i.data,r=D(),f=H(),[l,p]=x.useState(""),[m,j]=x.useState(""),[o,g]=x.useState(null);async function k(a){a.preventDefault();const b=l.trim(),v=m.trim();if(!(!b||!v))try{await r.mutateAsync({platform:b,userId:v}),n.success(e("admins.toast.added")),p(""),j("")}catch(R){n.error(w(R,e).message)}}async function I(){if(o)try{await f.mutateAsync(o),n.success(e("admins.toast.removed"))}catch(a){throw n.error(w(a,e).message),a}}return s.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[s.jsxs("header",{className:"flex flex-col gap-1",children:[s.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[s.jsx("h1",{className:"text-xl font-semibold",children:e("admins.title")}),s.jsxs(d,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>i.refetch(),disabled:i.isFetching,"aria-label":e("actions.refresh",{ns:"common"}),children:[i.isFetching?s.jsx(T,{className:"h-4 w-4 animate-spin"}):s.jsx(U,{className:"h-4 w-4"}),s.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),s.jsx("p",{className:"text-sm text-text-dim",children:e("admins.subtitle")})]}),t&&s.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.configured?s.jsx(c,{variant:"success",children:e("admins.configured")}):s.jsx(c,{variant:"warning",children:e("admins.notConfigured")}),t.bootstrapAvailable&&s.jsx(c,{variant:"info",title:t.bootstrapTokenPath,children:e("admins.bootstrapAvailable")})]}),i.isLoading?s.jsx("div",{className:"h-32 rounded-md bg-surface-2 animate-pulse"}):t&&t.admins.length===0?s.jsx(P,{icon:s.jsx(M,{}),title:e("admins.empty")}):t?s.jsxs(E,{children:[s.jsx(z,{children:s.jsxs(C,{children:[s.jsx(h,{className:"w-40",children:e("admins.col.platform")}),s.jsx(h,{children:e("admins.col.userId")}),s.jsx(h,{className:"w-24"})]})}),s.jsx(B,{children:t.admins.map(a=>s.jsxs(C,{children:[s.jsx(u,{className:"font-mono",children:a.platform}),s.jsx(u,{className:"font-mono text-xs",children:a.userId}),s.jsx(u,{children:s.jsxs(d,{variant:"ghost",size:"sm",onClick:()=>g(a),disabled:f.isPending,"aria-label":e("admins.remove.label"),children:[s.jsx(_,{className:"h-3 w-3"}),s.jsx("span",{className:"sr-only sm:not-sr-only sm:ml-1",children:e("admins.remove.label")})]})})]},`${a.platform}:${a.userId}`))})]}):null,s.jsxs("form",{onSubmit:a=>void k(a),className:"rounded-md border border-border bg-surface p-4",children:[s.jsx("div",{className:"mb-3 text-sm font-medium",children:e("admins.add.title")}),s.jsxs("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-[180px_1fr_auto] sm:items-end",children:[s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsx(N,{htmlFor:"admin-platform",className:"text-xs text-text-dim",children:e("admins.add.platform")}),s.jsx(y,{id:"admin-platform",value:l,onChange:a=>p(a.target.value),placeholder:"wechat",className:"font-mono text-xs"})]}),s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsx(N,{htmlFor:"admin-user",className:"text-xs text-text-dim",children:e("admins.add.userId")}),s.jsx(y,{id:"admin-user",value:m,onChange:a=>j(a.target.value),placeholder:"wxid_abc123",className:"font-mono text-xs"})]}),s.jsxs(d,{type:"submit",size:"sm",disabled:r.isPending||!l.trim()||!m.trim(),children:[r.isPending?s.jsx(T,{className:"h-4 w-4 animate-spin"}):s.jsx($,{className:"h-4 w-4"}),e("admins.add.submit")]})]})]}),s.jsx(L,{open:o!=null,onOpenChange:a=>{a||g(null)},title:e("admins.remove.confirmTitle"),description:e("admins.remove.confirmDescription"),intent:"danger",confirmLabel:e("admins.remove.label"),onConfirm:I})]})}export{es as default};
|
|
12
|
-
//# sourceMappingURL=admins-
|
|
12
|
+
//# sourceMappingURL=admins-aofsuukT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-5BTRCU9u.js","sources":["../../node_modules/lucide-react/dist/esm/icons/shield.js","../../node_modules/lucide-react/dist/esm/icons/user-plus.js","../../src/routes/settings/admins.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Shield = createLucideIcon(\"Shield\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n]);\n\nexport { Shield as default };\n//# sourceMappingURL=shield.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst UserPlus = createLucideIcon(\"UserPlus\", [\n [\"path\", { d: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\", key: \"1yyitq\" }],\n [\"circle\", { cx: \"9\", cy: \"7\", r: \"4\", key: \"nufk8\" }],\n [\"line\", { x1: \"19\", x2: \"19\", y1: \"8\", y2: \"14\", key: \"1bvyxn\" }],\n [\"line\", { x1: \"22\", x2: \"16\", y1: \"11\", y2: \"11\", key: \"1shjgl\" }]\n]);\n\nexport { UserPlus as default };\n//# sourceMappingURL=user-plus.js.map\n","/**\n * /settings/admins — manage `IMHUB_ADMIN_USERS` entries.\n *\n * Each entry is a `(platform, userId)` pair (e.g. `wechat:wxid_abc`).\n * Add via the inline form at the bottom; remove via per-row trash\n * button → ConfirmDialog. The backend's POST/DELETE handlers gate\n * on isLocalBind — if the operator is hitting agim from another\n * host the mutations 403; we surface that toast verbatim.\n */\n\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Loader2, RefreshCcw, Shield, Trash2, UserPlus } from 'lucide-react'\n\nimport { ConfirmDialog } from '@/components/common/confirm-dialog'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table'\nimport {\n useAddAdmin,\n useAdminAllowlist,\n useRemoveAdmin,\n} from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport type { AdminEntry } from '@/types/api'\n\nexport default function SettingsAdminsRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const listQuery = useAdminAllowlist()\n const data = listQuery.data\n\n const addAdmin = useAddAdmin()\n const removeAdmin = useRemoveAdmin()\n\n const [platform, setPlatform] = useState('')\n const [userId, setUserId] = useState('')\n const [removeTarget, setRemoveTarget] = useState<AdminEntry | null>(null)\n\n async function onAdd(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n const p = platform.trim()\n const u = userId.trim()\n if (!p || !u) return\n try {\n await addAdmin.mutateAsync({ platform: p, userId: u })\n toast.success(t('admins.toast.added'))\n setPlatform('')\n setUserId('')\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n async function onConfirmRemove(): Promise<void> {\n if (!removeTarget) return\n try {\n await removeAdmin.mutateAsync(removeTarget)\n toast.success(t('admins.toast.removed'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n throw err\n }\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('admins.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('admins.subtitle')}</p>\n </header>\n\n {data && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {data.configured ? (\n <Badge variant=\"success\">{t('admins.configured')}</Badge>\n ) : (\n <Badge variant=\"warning\">{t('admins.notConfigured')}</Badge>\n )}\n {data.bootstrapAvailable && (\n <Badge variant=\"info\" title={data.bootstrapTokenPath}>\n {t('admins.bootstrapAvailable')}\n </Badge>\n )}\n </div>\n )}\n\n {listQuery.isLoading ? (\n <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n ) : data && data.admins.length === 0 ? (\n <EmptyState icon={<Shield />} title={t('admins.empty')} />\n ) : data ? (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-40\">{t('admins.col.platform')}</TableHead>\n <TableHead>{t('admins.col.userId')}</TableHead>\n <TableHead className=\"w-24\" />\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.admins.map((a) => (\n <TableRow key={`${a.platform}:${a.userId}`}>\n <TableCell className=\"font-mono\">{a.platform}</TableCell>\n <TableCell className=\"font-mono text-xs\">{a.userId}</TableCell>\n <TableCell>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setRemoveTarget(a)}\n disabled={removeAdmin.isPending}\n aria-label={t('admins.remove.label')}\n >\n <Trash2 className=\"h-3 w-3\" />\n <span className=\"sr-only sm:not-sr-only sm:ml-1\">{t('admins.remove.label')}</span>\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n ) : null}\n\n {/* Add form */}\n <form\n onSubmit={(e) => void onAdd(e)}\n className=\"rounded-md border border-border bg-surface p-4\"\n >\n <div className=\"mb-3 text-sm font-medium\">{t('admins.add.title')}</div>\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-[180px_1fr_auto] sm:items-end\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"admin-platform\" className=\"text-xs text-text-dim\">\n {t('admins.add.platform')}\n </Label>\n <Input\n id=\"admin-platform\"\n value={platform}\n onChange={(e) => setPlatform(e.target.value)}\n placeholder=\"wechat\"\n className=\"font-mono text-xs\"\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"admin-user\" className=\"text-xs text-text-dim\">\n {t('admins.add.userId')}\n </Label>\n <Input\n id=\"admin-user\"\n value={userId}\n onChange={(e) => setUserId(e.target.value)}\n placeholder=\"wxid_abc123\"\n className=\"font-mono text-xs\"\n />\n </div>\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={addAdmin.isPending || !platform.trim() || !userId.trim()}\n >\n {addAdmin.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <UserPlus className=\"h-4 w-4\" />}\n {t('admins.add.submit')}\n </Button>\n </div>\n </form>\n\n <ConfirmDialog\n open={removeTarget != null}\n onOpenChange={(open) => { if (!open) setRemoveTarget(null) }}\n title={t('admins.remove.confirmTitle')}\n description={t('admins.remove.confirmDescription')}\n intent=\"danger\"\n confirmLabel={t('admins.remove.label')}\n onConfirm={onConfirmRemove}\n />\n </div>\n )\n}\n"],"names":["Shield","createLucideIcon","UserPlus","SettingsAdminsRoute","t","useTranslation","listQuery","useAdminAllowlist","data","addAdmin","useAddAdmin","removeAdmin","useRemoveAdmin","platform","setPlatform","useState","userId","setUserId","removeTarget","setRemoveTarget","onAdd","e","p","u","toast","err","describeError","onConfirmRemove","jsxs","jsx","Button","Loader2","RefreshCcw","Badge","EmptyState","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","Trash2","Label","Input","ConfirmDialog","open"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"admins-aofsuukT.js","sources":["../../node_modules/lucide-react/dist/esm/icons/shield.js","../../node_modules/lucide-react/dist/esm/icons/user-plus.js","../../src/routes/settings/admins.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Shield = createLucideIcon(\"Shield\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n]);\n\nexport { Shield as default };\n//# sourceMappingURL=shield.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst UserPlus = createLucideIcon(\"UserPlus\", [\n [\"path\", { d: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\", key: \"1yyitq\" }],\n [\"circle\", { cx: \"9\", cy: \"7\", r: \"4\", key: \"nufk8\" }],\n [\"line\", { x1: \"19\", x2: \"19\", y1: \"8\", y2: \"14\", key: \"1bvyxn\" }],\n [\"line\", { x1: \"22\", x2: \"16\", y1: \"11\", y2: \"11\", key: \"1shjgl\" }]\n]);\n\nexport { UserPlus as default };\n//# sourceMappingURL=user-plus.js.map\n","/**\n * /settings/admins — manage `IMHUB_ADMIN_USERS` entries.\n *\n * Each entry is a `(platform, userId)` pair (e.g. `wechat:wxid_abc`).\n * Add via the inline form at the bottom; remove via per-row trash\n * button → ConfirmDialog. The backend's POST/DELETE handlers gate\n * on isLocalBind — if the operator is hitting agim from another\n * host the mutations 403; we surface that toast verbatim.\n */\n\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Loader2, RefreshCcw, Shield, Trash2, UserPlus } from 'lucide-react'\n\nimport { ConfirmDialog } from '@/components/common/confirm-dialog'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table'\nimport {\n useAddAdmin,\n useAdminAllowlist,\n useRemoveAdmin,\n} from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport type { AdminEntry } from '@/types/api'\n\nexport default function SettingsAdminsRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const listQuery = useAdminAllowlist()\n const data = listQuery.data\n\n const addAdmin = useAddAdmin()\n const removeAdmin = useRemoveAdmin()\n\n const [platform, setPlatform] = useState('')\n const [userId, setUserId] = useState('')\n const [removeTarget, setRemoveTarget] = useState<AdminEntry | null>(null)\n\n async function onAdd(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n const p = platform.trim()\n const u = userId.trim()\n if (!p || !u) return\n try {\n await addAdmin.mutateAsync({ platform: p, userId: u })\n toast.success(t('admins.toast.added'))\n setPlatform('')\n setUserId('')\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n async function onConfirmRemove(): Promise<void> {\n if (!removeTarget) return\n try {\n await removeAdmin.mutateAsync(removeTarget)\n toast.success(t('admins.toast.removed'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n throw err\n }\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('admins.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('admins.subtitle')}</p>\n </header>\n\n {data && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {data.configured ? (\n <Badge variant=\"success\">{t('admins.configured')}</Badge>\n ) : (\n <Badge variant=\"warning\">{t('admins.notConfigured')}</Badge>\n )}\n {data.bootstrapAvailable && (\n <Badge variant=\"info\" title={data.bootstrapTokenPath}>\n {t('admins.bootstrapAvailable')}\n </Badge>\n )}\n </div>\n )}\n\n {listQuery.isLoading ? (\n <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n ) : data && data.admins.length === 0 ? (\n <EmptyState icon={<Shield />} title={t('admins.empty')} />\n ) : data ? (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-40\">{t('admins.col.platform')}</TableHead>\n <TableHead>{t('admins.col.userId')}</TableHead>\n <TableHead className=\"w-24\" />\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.admins.map((a) => (\n <TableRow key={`${a.platform}:${a.userId}`}>\n <TableCell className=\"font-mono\">{a.platform}</TableCell>\n <TableCell className=\"font-mono text-xs\">{a.userId}</TableCell>\n <TableCell>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setRemoveTarget(a)}\n disabled={removeAdmin.isPending}\n aria-label={t('admins.remove.label')}\n >\n <Trash2 className=\"h-3 w-3\" />\n <span className=\"sr-only sm:not-sr-only sm:ml-1\">{t('admins.remove.label')}</span>\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n ) : null}\n\n {/* Add form */}\n <form\n onSubmit={(e) => void onAdd(e)}\n className=\"rounded-md border border-border bg-surface p-4\"\n >\n <div className=\"mb-3 text-sm font-medium\">{t('admins.add.title')}</div>\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-[180px_1fr_auto] sm:items-end\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"admin-platform\" className=\"text-xs text-text-dim\">\n {t('admins.add.platform')}\n </Label>\n <Input\n id=\"admin-platform\"\n value={platform}\n onChange={(e) => setPlatform(e.target.value)}\n placeholder=\"wechat\"\n className=\"font-mono text-xs\"\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"admin-user\" className=\"text-xs text-text-dim\">\n {t('admins.add.userId')}\n </Label>\n <Input\n id=\"admin-user\"\n value={userId}\n onChange={(e) => setUserId(e.target.value)}\n placeholder=\"wxid_abc123\"\n className=\"font-mono text-xs\"\n />\n </div>\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={addAdmin.isPending || !platform.trim() || !userId.trim()}\n >\n {addAdmin.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <UserPlus className=\"h-4 w-4\" />}\n {t('admins.add.submit')}\n </Button>\n </div>\n </form>\n\n <ConfirmDialog\n open={removeTarget != null}\n onOpenChange={(open) => { if (!open) setRemoveTarget(null) }}\n title={t('admins.remove.confirmTitle')}\n description={t('admins.remove.confirmDescription')}\n intent=\"danger\"\n confirmLabel={t('admins.remove.label')}\n onConfirm={onConfirmRemove}\n />\n </div>\n )\n}\n"],"names":["Shield","createLucideIcon","UserPlus","SettingsAdminsRoute","t","useTranslation","listQuery","useAdminAllowlist","data","addAdmin","useAddAdmin","removeAdmin","useRemoveAdmin","platform","setPlatform","useState","userId","setUserId","removeTarget","setRemoveTarget","onAdd","e","p","u","toast","err","describeError","onConfirmRemove","jsxs","jsx","Button","Loader2","RefreshCcw","Badge","EmptyState","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","Trash2","Label","Input","ConfirmDialog","open"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{n as le,u as L,j as e,B as k,L as V,S as Z,f as X,g as Y,h as J,i as O,k as R,l as f,m as F,c as K,I as _}from"./index-
|
|
1
|
+
import{n as le,u as L,j as e,B as k,L as V,S as Z,f as X,g as Y,h as J,i as O,k as R,l as f,m as F,c as K,I as _}from"./index-D1ulN_24.js";import{r as h}from"./react-DlP5eolq.js";import{E as re}from"./empty-state-D8kx-FwO.js";import{u as oe}from"./use-workspace-zFEfqUCo.js";import{b as de,c as me,h as xe,i as ue}from"./use-settings-Bx0ZTOsd.js";import{L as D}from"./loader-circle-Bgi0H_iI.js";import{R as pe}from"./refresh-ccw-MHrCmmSv.js";import{X as he}from"./x-DXACg96C.js";import{S as ge}from"./save-DhFewuZL.js";import{N as G}from"./network-BlQWIsIc.js";import{S as I}from"./search-wZEXSmcX.js";import{P as fe}from"./plus-2MZ7TkP3.js";import{T as je}from"./trash-2-CT_B0mSH.js";import"./useQuery-Bt7Ty7IO.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const be=le("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]),$={"claude-code":{aliases:["cc","claude"],pkg:"@anthropic-ai/claude-code",kind:"cli"},codex:{aliases:["cx"],pkg:"@openai/codex",kind:"cli"},opencode:{aliases:["oc"],pkg:"opencode-ai",kind:"cli"},cursor:{aliases:["cs","cur"],pkg:"cursor-agent (curl https://cursor.com/install)",kind:"cli"},native:{aliases:["na","llm","native-llm"],pkg:"in-process",kind:"in-process"}},Q=Object.keys($);function Ue(){const{t}=L(["settings","common"]),r=de(),s=oe(),i=me(),n=r.data,d=s.data??{},[p,o]=h.useState(null),[m,x]=h.useState(null),[S,j]=h.useState(null);h.useEffect(()=>{n&&p==null&&o(n.agents??[]),n&&m==null&&x(n.defaultAgent??""),n&&S==null&&j(n.acpAgents??[])},[n,p,m,S]);const g=p??n?.agents??[],b=m??n?.defaultAgent??"",w=S??n?.acpAgents??[],U=h.useMemo(()=>{if(!n)return!1;const c=g.length===(n.agents?.length??0)&&g.every(y=>n.agents?.includes(y)),N=b===(n.defaultAgent??""),v=ye(w,n.acpAgents??[]);return!c||!N||!v},[n,g,b,w]),T=h.useMemo(()=>Q.filter(c=>($[c].kind==="in-process"?!0:g.includes(c))&&d[c]),[g,d]);function P(c,N){const v=N?Array.from(new Set([...g,c])):g.filter(y=>y!==c);o(v),!N&&c===b&&x("")}async function M(){if(n)try{await i.mutateAsync({...n,agents:g,defaultAgent:b||n.defaultAgent,acpAgents:w}),f.success(t("agents.toast.saved")),o(null),x(null),j(null)}catch(c){f.error(F(c,t).message)}}function C(){o(null),x(null),j(null)}function z(c){j(c)}return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:t("agents.title")}),e.jsxs(k,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{r.refetch(),s.refetch()},disabled:r.isFetching||s.isFetching,"aria-label":t("actions.refresh",{ns:"common"}),children:[r.isFetching||s.isFetching?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(pe,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:t("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:t("agents.subtitle")})]}),r.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex flex-col divide-y divide-border rounded-md border border-border bg-surface",children:Q.map(c=>{const N=$[c],v=!!d[c],y=g.includes(c);return e.jsx(Ne,{name:c,aliases:N.aliases,pkg:N.pkg,kind:N.kind,installed:v,enabled:y,onToggle:H=>P(c,H)},c)})}),e.jsxs("section",{className:"rounded-md border border-border bg-surface p-4",children:[e.jsx(V,{htmlFor:"default-agent",className:"text-sm font-medium",children:t("agents.defaultAgent")}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:t("agents.defaultAgentHint")}),e.jsxs(Z,{value:b||"__none__",onValueChange:c=>x(c==="__none__"?"":c),disabled:T.length===0,children:[e.jsx(X,{id:"default-agent",className:"mt-2 w-64",children:e.jsx(Y,{placeholder:t("agents.noEligible")})}),e.jsx(J,{children:T.length===0?e.jsx(O,{value:"__none__",disabled:!0,children:t("agents.noEligible")}):T.map(c=>e.jsx(O,{value:c,children:c},c))})]})]}),n?.features?.remoteAgent?e.jsx(we,{agents:w,onChange:z}):null,U&&e.jsxs("div",{className:"sticky bottom-0 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-2 shadow-md",children:[e.jsx(R,{variant:"info",children:t("agents.dirtyHint")}),e.jsxs(k,{variant:"secondary",size:"sm",onClick:C,disabled:i.isPending,children:[e.jsx(he,{className:"h-4 w-4"}),t("agents.discard")]}),e.jsxs(k,{size:"sm",onClick:()=>void M(),disabled:i.isPending,children:[i.isPending?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(ge,{className:"h-4 w-4"}),i.isPending?t("agents.saving"):t("agents.saveBtn")]})]})]})]})}function Ne({name:t,aliases:r,pkg:s,kind:i,installed:n,enabled:d,onToggle:p}){const{t:o}=L("settings"),m=i==="in-process";return e.jsxs("div",{className:"flex items-start gap-3 px-3 py-3",children:[e.jsx("div",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-surface-2 text-text-dim",children:e.jsx(be,{className:"h-4 w-4"})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:t}),e.jsxs(R,{variant:n?"success":"outline",className:"text-[10px]",children:[e.jsx("span",{className:K("inline-block h-1.5 w-1.5 rounded-full",n?"bg-success":"bg-text-muted")}),o(n?"agents.online":"agents.offline")]}),m&&e.jsx(R,{variant:"outline",className:"text-[10px]",title:o("agents.inProcessHint"),children:o("agents.inProcessBadge")})]}),e.jsxs("p",{className:"mt-0.5 text-xs text-text-dim",children:[e.jsxs("span",{className:"text-text-muted",children:[o("agents.aliasesLabel"),": "]}),e.jsx("span",{className:"font-mono",children:r.map(x=>`/${x}`).join(", ")})]}),!n&&e.jsx("p",{className:"mt-1 text-xs text-warning",children:m?o("agents.nativeInstallHint"):o("agents.installHint",{pkg:s})})]}),e.jsx("input",{type:"checkbox",checked:d,onChange:x=>p(x.target.checked),className:"h-4 w-4 mt-2 accent-accent cursor-pointer"})]})}const ve=["none","apikey","bearer"],ke=/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;function ye(t,r){if(t.length!==r.length)return!1;for(let s=0;s<t.length;s++){const i=t[s],n=r[s];if(i.name!==n.name||i.endpoint!==n.endpoint||(i.enabled??!0)!==(n.enabled??!0))return!1;const d=(i.aliases??[]).join(","),p=(n.aliases??[]).join(",");if(d!==p)return!1;const o=i.auth?.type??"none",m=n.auth?.type??"none";if(o!==m||(i.auth?.token??"")!==(n.auth?.token??""))return!1}return!0}function we({agents:t,onChange:r}){const{t:s}=L(["settings","common"]),i=xe(),n=ue(),[d,p]=h.useState(""),[o,m]=h.useState(""),[x,S]=h.useState(""),[j,g]=h.useState("none"),[b,w]=h.useState(""),[U,T]=h.useState(!1),[P,M]=h.useState(""),C=d.trim(),z=C.length>0&&ke.test(C),c=t.some(a=>a.name===C),v=!(j!=="none")||b.trim().length>0,y=z&&x.trim().length>0&&v&&!c,H=x.trim().length>0&&v;function W(){p(""),m(""),S(""),g("none"),w("")}function ee(a){return a.split(",").map(l=>l.trim()).filter(Boolean)}function q(a,l){if(a==="none")return{type:"none"};const u=l.trim();return u?{type:a,token:u}:{type:a}}async function se(){if(!y)return;const a={name:C,endpoint:x.trim(),aliases:ee(o),auth:q(j,b),enabled:!0};r([...t,a]),W(),f.success(s("agents.acp.toast.staged"))}async function te(){if(H)try{const a=await i.mutateAsync({endpoint:x.trim(),auth:q(j,b)});f.success(s("agents.acp.toast.testOk",{name:a.name}))}catch(a){f.error(F(a,s).message)}}async function ae(a){const l=t[a];if(l){if(l.auth?.type!=="none"&&l.auth?.token&&Se(l.auth.token)){f.error(s("agents.acp.toast.testMasked"));return}try{const u=await i.mutateAsync({endpoint:l.endpoint,auth:l.auth});f.success(s("agents.acp.toast.testOk",{name:u.name}))}catch(u){f.error(F(u,s).message)}}}function ne(a,l){const u=t.map((E,A)=>A===a?{...E,enabled:l}:E);r(u)}function ce(a){r(t.filter((l,u)=>u!==a))}async function ie(){const a=P.trim();if(a)try{const l=await n.mutateAsync({baseUrl:a,register:!1}),u=new Set(t.map(A=>A.name)),E=l.agents.filter(A=>!u.has(A.name));if(E.length===0){f.info(s("agents.acp.toast.discoverEmpty"));return}r([...t,...E.map(A=>({...A,enabled:!0}))]),f.success(s("agents.acp.toast.discoverAdded",{count:E.length})),M(""),T(!1)}catch(l){f.error(F(l,s).message)}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(G,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:s("agents.acp.title")}),e.jsx(R,{variant:"outline",className:"text-[10px]",children:t.length}),e.jsxs(k,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>T(a=>!a),children:[e.jsx(I,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("agents.acp.discoverBtn")})]})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:s("agents.acp.subtitle")}),U&&e.jsxs("div",{className:"border-t border-border bg-surface-2 px-4 py-3",children:[e.jsx(V,{htmlFor:"acp-baseurl",className:"text-xs font-medium",children:s("agents.acp.baseUrl")}),e.jsx("p",{className:"mt-1 text-[11px] text-text-dim",children:s("agents.acp.baseUrlHint")}),e.jsxs("div",{className:"mt-2 flex flex-wrap gap-2",children:[e.jsx(_,{id:"acp-baseurl",value:P,onChange:a=>M(a.target.value),placeholder:"https://agents.example.com",className:"flex-1 min-w-[200px] font-mono text-xs"}),e.jsxs(k,{variant:"secondary",size:"sm",onClick:()=>void ie(),disabled:!P.trim()||n.isPending,children:[n.isPending?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(I,{className:"h-4 w-4"}),s("agents.acp.runDiscover")]})]})]}),t.length===0?e.jsx("div",{className:"px-4 py-6",children:e.jsx(re,{icon:e.jsx(G,{}),title:s("agents.acp.empty.title"),description:s("agents.acp.empty.description")})}):e.jsx("ul",{className:"divide-y divide-border",children:t.map((a,l)=>e.jsx(Ae,{agent:a,onToggle:u=>ne(l,u),onTest:()=>void ae(l),onRemove:()=>ce(l),testing:i.isPending},`${a.name}-${l}`))}),e.jsxs("div",{className:"border-t border-border px-4 py-3",children:[e.jsx("h3",{className:"text-xs font-semibold uppercase tracking-wide text-text-dim",children:s("agents.acp.addTitle")}),e.jsxs("div",{className:"mt-2 grid grid-cols-1 gap-2 sm:grid-cols-2",children:[e.jsx(B,{label:s("agents.acp.name"),hint:s("agents.acp.nameHint"),children:e.jsx(_,{value:d,onChange:a=>p(a.target.value),placeholder:"my-agent","aria-invalid":d.length>0&&!z})}),e.jsx(B,{label:s("agents.acp.aliases"),hint:s("agents.acp.aliasesHint"),children:e.jsx(_,{value:o,onChange:a=>m(a.target.value),placeholder:"ma, agent1"})}),e.jsx(B,{label:s("agents.acp.endpoint"),hint:s("agents.acp.endpointHint"),children:e.jsx(_,{value:x,onChange:a=>S(a.target.value),placeholder:"https://example.com/agents/weather",className:"font-mono text-xs"})}),e.jsx(B,{label:s("agents.acp.authType"),children:e.jsxs(Z,{value:j,onValueChange:a=>g(a),children:[e.jsx(X,{children:e.jsx(Y,{})}),e.jsx(J,{children:ve.map(a=>e.jsx(O,{value:a,children:s(`agents.acp.auth.${a}`)},a))})]})}),j!=="none"&&e.jsx(B,{label:s("agents.acp.token"),className:"sm:col-span-2",children:e.jsx(_,{type:"password",value:b,onChange:a=>w(a.target.value),placeholder:s("agents.acp.tokenPlaceholder"),autoComplete:"new-password"})})]}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[e.jsxs(k,{variant:"secondary",size:"sm",onClick:()=>void te(),disabled:!H||i.isPending,children:[i.isPending?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(I,{className:"h-4 w-4"}),s("agents.acp.testBtn")]}),e.jsxs(k,{size:"sm",onClick:()=>void se(),disabled:!y,children:[e.jsx(fe,{className:"h-4 w-4"}),s("agents.acp.addBtn")]}),c&&e.jsx("span",{className:"self-center text-xs text-warning",children:s("agents.acp.dupName")})]})]})]})}function Ae({agent:t,onToggle:r,onTest:s,onRemove:i,testing:n}){const{t:d}=L("settings"),p=t.enabled!==!1,o=t.auth?.type??"none";return e.jsxs("li",{className:"flex flex-wrap items-center gap-3 px-4 py-3",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:t.name}),e.jsx(R,{variant:"outline",className:"text-[10px] uppercase",children:d(`agents.acp.auth.${o}`)}),t.aliases&&t.aliases.length>0&&e.jsx("span",{className:"text-xs text-text-muted font-mono",children:t.aliases.map(m=>`/${m}`).join(", ")})]}),e.jsx("p",{className:"mt-0.5 truncate font-mono text-xs text-text-dim",title:t.endpoint,children:t.endpoint})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-text-dim",children:[e.jsx("input",{type:"checkbox",checked:p,onChange:m=>r(m.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),d(p?"agents.acp.on":"agents.acp.off")]}),e.jsx(k,{variant:"ghost",size:"sm",onClick:s,disabled:n,"aria-label":d("agents.acp.testBtn"),children:n?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(I,{className:"h-4 w-4"})}),e.jsx(k,{variant:"ghost",size:"sm",onClick:i,"aria-label":d("agents.acp.removeBtn"),className:"text-danger hover:text-danger",children:e.jsx(je,{className:"h-4 w-4"})})]})}function B({label:t,hint:r,className:s,children:i}){return e.jsxs("div",{className:K("flex flex-col gap-1",s),children:[e.jsx(V,{className:"text-xs font-medium",children:t}),i,r&&e.jsx("p",{className:"text-[11px] text-text-dim",children:r})]})}function Se(t){return/\*{3,}/.test(t)}export{Ue as default};
|
|
7
|
-
//# sourceMappingURL=agents-
|
|
7
|
+
//# sourceMappingURL=agents-BhuZPnjf.js.map
|