agim-cli 1.2.151 → 1.2.153
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 +80 -0
- package/dist/web/agim-skills-api.d.ts.map +1 -1
- package/dist/web/agim-skills-api.js +6 -1
- package/dist/web/agim-skills-api.js.map +1 -1
- package/dist/web/public/assets/{a2a-BJ4YL13Y.js → a2a-CIxNaIdE.js} +2 -2
- package/dist/web/public/assets/{a2a-BJ4YL13Y.js.map → a2a-CIxNaIdE.js.map} +1 -1
- package/dist/web/public/assets/{activity-Dzy3LsL8.js → activity-CrnWHC2j.js} +2 -2
- package/dist/web/public/assets/{activity-Dzy3LsL8.js.map → activity-CrnWHC2j.js.map} +1 -1
- package/dist/web/public/assets/{admins-CUAm5mP9.js → admins-5BTRCU9u.js} +2 -2
- package/dist/web/public/assets/{admins-CUAm5mP9.js.map → admins-5BTRCU9u.js.map} +1 -1
- package/dist/web/public/assets/{agents-CyDJ89HA.js → agents-B-s9gngh.js} +2 -2
- package/dist/web/public/assets/{agents-CyDJ89HA.js.map → agents-B-s9gngh.js.map} +1 -1
- package/dist/web/public/assets/{approvals-i39FaOuk.js → approvals-BSX2lsqu.js} +2 -2
- package/dist/web/public/assets/{approvals-i39FaOuk.js.map → approvals-BSX2lsqu.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-BQ-kUumo.js → arrow-down-D3lWOftw.js} +2 -2
- package/dist/web/public/assets/{arrow-down-BQ-kUumo.js.map → arrow-down-D3lWOftw.js.map} +1 -1
- package/dist/web/public/assets/{arrow-up-C8L1uMX_.js → arrow-up-BGsin7FN.js} +2 -2
- package/dist/web/public/assets/{arrow-up-C8L1uMX_.js.map → arrow-up-BGsin7FN.js.map} +1 -1
- package/dist/web/public/assets/{asks-D20T9unh.js → asks-DfLaW3gA.js} +2 -2
- package/dist/web/public/assets/{asks-D20T9unh.js.map → asks-DfLaW3gA.js.map} +1 -1
- package/dist/web/public/assets/{audit-DLENxEeu.js → audit-BWlwMCTk.js} +2 -2
- package/dist/web/public/assets/{audit-DLENxEeu.js.map → audit-BWlwMCTk.js.map} +1 -1
- package/dist/web/public/assets/{bell-IZMkMv1H.js → bell-Bf-FDztO.js} +2 -2
- package/dist/web/public/assets/{bell-IZMkMv1H.js.map → bell-Bf-FDztO.js.map} +1 -1
- package/dist/web/public/assets/{bgjobs-B1lhvGco.js → bgjobs-6dDxfEi7.js} +2 -2
- package/dist/web/public/assets/{bgjobs-B1lhvGco.js.map → bgjobs-6dDxfEi7.js.map} +1 -1
- package/dist/web/public/assets/{brain-R_LZjZV8.js → brain-Dl0NIztX.js} +2 -2
- package/dist/web/public/assets/{brain-R_LZjZV8.js.map → brain-Dl0NIztX.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-BdiZ_zkr.js → briefcase-Bl6rZAmJ.js} +2 -2
- package/dist/web/public/assets/{briefcase-BdiZ_zkr.js.map → briefcase-Bl6rZAmJ.js.map} +1 -1
- package/dist/web/public/assets/{chat-CLZP47Tv.js → chat-Cu8-EeJt.js} +2 -2
- package/dist/web/public/assets/{chat-CLZP47Tv.js.map → chat-Cu8-EeJt.js.map} +1 -1
- package/dist/web/public/assets/{chevron-left-Y59fTozP.js → chevron-left-BtG3MZQX.js} +2 -2
- package/dist/web/public/assets/{chevron-left-Y59fTozP.js.map → chevron-left-BtG3MZQX.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-x790nj7i.js → chevron-right-FytmF5Sd.js} +2 -2
- package/dist/web/public/assets/{chevron-right-x790nj7i.js.map → chevron-right-FytmF5Sd.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-DFYX85pc.js → circle-check-DggvG9Xs.js} +2 -2
- package/dist/web/public/assets/{circle-check-DFYX85pc.js.map → circle-check-DggvG9Xs.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-CSJIRIBe.js → circle-check-big-J5lVPTDz.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-CSJIRIBe.js.map → circle-check-big-J5lVPTDz.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-Bb8WBDc7.js → circle-x-pYYyY1z2.js} +2 -2
- package/dist/web/public/assets/{circle-x-Bb8WBDc7.js.map → circle-x-pYYyY1z2.js.map} +1 -1
- package/dist/web/public/assets/{clock-CjFbXxT9.js → clock-CQy6p5uP.js} +2 -2
- package/dist/web/public/assets/{clock-CjFbXxT9.js.map → clock-CQy6p5uP.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-BxRHoNWb.js → confirm-dialog-B3jno5Pb.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-BxRHoNWb.js.map → confirm-dialog-B3jno5Pb.js.map} +1 -1
- package/dist/web/public/assets/{copy-MTv1G7jQ.js → copy-BK_JexVU.js} +2 -2
- package/dist/web/public/assets/{copy-MTv1G7jQ.js.map → copy-BK_JexVU.js.map} +1 -1
- package/dist/web/public/assets/{data-table-CyskwqK3.js → data-table-C3oIPQ_B.js} +2 -2
- package/dist/web/public/assets/{data-table-CyskwqK3.js.map → data-table-C3oIPQ_B.js.map} +1 -1
- package/dist/web/public/assets/dialog-nb4ANHd4.js +2 -0
- package/dist/web/public/assets/dialog-nb4ANHd4.js.map +1 -0
- package/dist/web/public/assets/{download-Cuz5HSTK.js → download-DtvF6Ngb.js} +2 -2
- package/dist/web/public/assets/{download-Cuz5HSTK.js.map → download-DtvF6Ngb.js.map} +1 -1
- package/dist/web/public/assets/{email-JVBTD9Cm.js → email-6PldVxPe.js} +2 -2
- package/dist/web/public/assets/{email-JVBTD9Cm.js.map → email-6PldVxPe.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-mrWiD3Ah.js → empty-state-esNZG4Xa.js} +2 -2
- package/dist/web/public/assets/{empty-state-mrWiD3Ah.js.map → empty-state-esNZG4Xa.js.map} +1 -1
- package/dist/web/public/assets/{external-link-B08yOP0L.js → external-link-Bzl-4lM6.js} +2 -2
- package/dist/web/public/assets/{external-link-B08yOP0L.js.map → external-link-Bzl-4lM6.js.map} +1 -1
- package/dist/web/public/assets/{eye-BSA7oBlI.js → eye-Cpc4c8vR.js} +2 -2
- package/dist/web/public/assets/{eye-BSA7oBlI.js.map → eye-Cpc4c8vR.js.map} +1 -1
- package/dist/web/public/assets/{facts-IPC6o6jR.js → facts-CAc-sdKE.js} +2 -2
- package/dist/web/public/assets/{facts-IPC6o6jR.js.map → facts-CAc-sdKE.js.map} +1 -1
- package/dist/web/public/assets/{goals-CQiFEtCu.js → goals-iarR52LZ.js} +2 -2
- package/dist/web/public/assets/{goals-CQiFEtCu.js.map → goals-iarR52LZ.js.map} +1 -1
- package/dist/web/public/assets/{health-C2wwtDRS.js → health-DPiNRwJP.js} +2 -2
- package/dist/web/public/assets/{health-C2wwtDRS.js.map → health-DPiNRwJP.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-l8ycLqPJ.js → heart-pulse-DTcvh4ER.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-l8ycLqPJ.js.map → heart-pulse-DTcvh4ER.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-CxeGyQ1p.js → heartbeat-B8tcKFzJ.js} +2 -2
- package/dist/web/public/assets/{heartbeat-CxeGyQ1p.js.map → heartbeat-B8tcKFzJ.js.map} +1 -1
- package/dist/web/public/assets/{hot-CqahuXWL.js → hot-CqLT7AGh.js} +2 -2
- package/dist/web/public/assets/{hot-CqahuXWL.js.map → hot-CqLT7AGh.js.map} +1 -1
- package/dist/web/public/assets/{index-1mxdI2Ts.js → index-BjUyDXLb.js} +30 -30
- package/dist/web/public/assets/index-BjUyDXLb.js.map +1 -0
- package/dist/web/public/assets/{index-B5zx5382.css → index-uKzGZ_Df.css} +1 -1
- package/dist/web/public/assets/injection-U1ms-Jjs.js +2 -0
- package/dist/web/public/assets/injection-U1ms-Jjs.js.map +1 -0
- package/dist/web/public/assets/installed-8FN6LLKG.js +31 -0
- package/dist/web/public/assets/installed-8FN6LLKG.js.map +1 -0
- package/dist/web/public/assets/{jobs-DGKn7wsS.js → jobs-B-MU_dkD.js} +2 -2
- package/dist/web/public/assets/{jobs-DGKn7wsS.js.map → jobs-B-MU_dkD.js.map} +1 -1
- package/dist/web/public/assets/{layout-BRwzzJRD.js → layout-BVI4tkRG.js} +2 -2
- package/dist/web/public/assets/{layout-BRwzzJRD.js.map → layout-BVI4tkRG.js.map} +1 -1
- package/dist/web/public/assets/{layout-BNsrCbDd.js → layout-BgmJrSOb.js} +2 -2
- package/dist/web/public/assets/{layout-BNsrCbDd.js.map → layout-BgmJrSOb.js.map} +1 -1
- package/dist/web/public/assets/{layout-5GOGK7pX.js → layout-CnddsqFT.js} +2 -2
- package/dist/web/public/assets/{layout-5GOGK7pX.js.map → layout-CnddsqFT.js.map} +1 -1
- package/dist/web/public/assets/{layout-Bov7xJjG.js → layout-DMOpWAPw.js} +2 -2
- package/dist/web/public/assets/{layout-Bov7xJjG.js.map → layout-DMOpWAPw.js.map} +1 -1
- package/dist/web/public/assets/{layout-CxlJCe_U.js → layout-DfE74Z47.js} +2 -2
- package/dist/web/public/assets/{layout-CxlJCe_U.js.map → layout-DfE74Z47.js.map} +1 -1
- package/dist/web/public/assets/{llm-pv7DKMXd.js → llm-5HpT83y2.js} +2 -2
- package/dist/web/public/assets/{llm-pv7DKMXd.js.map → llm-5HpT83y2.js.map} +1 -1
- package/dist/web/public/assets/{loader-circle-D-_gvYI1.js → loader-circle-MnTMknNl.js} +2 -2
- package/dist/web/public/assets/{loader-circle-D-_gvYI1.js.map → loader-circle-MnTMknNl.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-B0I4Ww6U.js → map-pin-BA0GTiIe.js} +2 -2
- package/dist/web/public/assets/{map-pin-B0I4Ww6U.js.map → map-pin-BA0GTiIe.js.map} +1 -1
- package/dist/web/public/assets/{mcp-B4NfRtYe.js → mcp-C71xI5JH.js} +2 -2
- package/dist/web/public/assets/{mcp-B4NfRtYe.js.map → mcp-C71xI5JH.js.map} +1 -1
- package/dist/web/public/assets/memos-BAuv2jwD.js +12 -0
- package/dist/web/public/assets/memos-BAuv2jwD.js.map +1 -0
- package/dist/web/public/assets/{messengers-BRtpzgyO.js → messengers-CmW1ts2s.js} +2 -2
- package/dist/web/public/assets/{messengers-BRtpzgyO.js.map → messengers-CmW1ts2s.js.map} +1 -1
- package/dist/web/public/assets/{mobile-Csr4VGd9.js → mobile-DpxLpRIf.js} +2 -2
- package/dist/web/public/assets/{mobile-Csr4VGd9.js.map → mobile-DpxLpRIf.js.map} +1 -1
- package/dist/web/public/assets/{native-agent-BBgHqG48.js → native-agent-CNUBixLm.js} +2 -2
- package/dist/web/public/assets/{native-agent-BBgHqG48.js.map → native-agent-CNUBixLm.js.map} +1 -1
- package/dist/web/public/assets/{network-D-_C1Id9.js → network-DVRgX5Mm.js} +2 -2
- package/dist/web/public/assets/{network-D-_C1Id9.js.map → network-DVRgX5Mm.js.map} +1 -1
- package/dist/web/public/assets/{outbox-D-k0S4z0.js → outbox-C8Gc0aa0.js} +2 -2
- package/dist/web/public/assets/{outbox-D-k0S4z0.js.map → outbox-C8Gc0aa0.js.map} +1 -1
- package/dist/web/public/assets/{pagination-H9_6NsCl.js → pagination-BWgXaluu.js} +2 -2
- package/dist/web/public/assets/{pagination-H9_6NsCl.js.map → pagination-BWgXaluu.js.map} +1 -1
- package/dist/web/public/assets/{persona-C_8JNYfR.js → persona--zQXx4oA.js} +2 -2
- package/dist/web/public/assets/{persona-C_8JNYfR.js.map → persona--zQXx4oA.js.map} +1 -1
- package/dist/web/public/assets/{plans-D6YmQW_N.js → plans-mluEj2nt.js} +2 -2
- package/dist/web/public/assets/{plans-D6YmQW_N.js.map → plans-mluEj2nt.js.map} +1 -1
- package/dist/web/public/assets/{play-CzbLMGqe.js → play-BLIwYTvQ.js} +2 -2
- package/dist/web/public/assets/{play-CzbLMGqe.js.map → play-BLIwYTvQ.js.map} +1 -1
- package/dist/web/public/assets/{plus-DHmf4GJ2.js → plus-BOfhZkjh.js} +2 -2
- package/dist/web/public/assets/{plus-DHmf4GJ2.js.map → plus-BOfhZkjh.js.map} +1 -1
- package/dist/web/public/assets/{policy-BN_bs6Io.js → policy-C8CPYuH5.js} +2 -2
- package/dist/web/public/assets/{policy-BN_bs6Io.js.map → policy-C8CPYuH5.js.map} +1 -1
- package/dist/web/public/assets/{qr-code-DnK1SL3l.js → qr-code-CfdRXZZD.js} +2 -2
- package/dist/web/public/assets/{qr-code-DnK1SL3l.js.map → qr-code-CfdRXZZD.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-DSNfamTD.js → refresh-ccw--XT-lrCo.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-DSNfamTD.js.map → refresh-ccw--XT-lrCo.js.map} +1 -1
- package/dist/web/public/assets/{reminders-BCfQpyhh.js → reminders-DJkMBSTZ.js} +2 -2
- package/dist/web/public/assets/{reminders-BCfQpyhh.js.map → reminders-DJkMBSTZ.js.map} +1 -1
- package/dist/web/public/assets/{save-B6RwcyoS.js → save-9sLkRauh.js} +2 -2
- package/dist/web/public/assets/{save-B6RwcyoS.js.map → save-9sLkRauh.js.map} +1 -1
- package/dist/web/public/assets/{schedules-Djaw4gdH.js → schedules-BEqyQYLb.js} +2 -2
- package/dist/web/public/assets/{schedules-Djaw4gdH.js.map → schedules-BEqyQYLb.js.map} +1 -1
- package/dist/web/public/assets/{search-DW9n3_SF.js → search-D4CzBwIp.js} +2 -2
- package/dist/web/public/assets/{search-DW9n3_SF.js.map → search-D4CzBwIp.js.map} +1 -1
- package/dist/web/public/assets/{search-Dyl0DQcw.js → search-aWQWrzh3.js} +2 -2
- package/dist/web/public/assets/{search-Dyl0DQcw.js.map → search-aWQWrzh3.js.map} +1 -1
- package/dist/web/public/assets/{security-BLuVCXkh.js → security-B7KXMgM3.js} +2 -2
- package/dist/web/public/assets/{security-BLuVCXkh.js.map → security-B7KXMgM3.js.map} +1 -1
- package/dist/web/public/assets/{service-DBpd7pkl.js → service-1ZeT0cRY.js} +2 -2
- package/dist/web/public/assets/{service-DBpd7pkl.js.map → service-1ZeT0cRY.js.map} +1 -1
- package/dist/web/public/assets/{shield-alert-CdF1C1OF.js → shield-alert-BJKgUDEG.js} +2 -2
- package/dist/web/public/assets/{shield-alert-CdF1C1OF.js.map → shield-alert-BJKgUDEG.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-BCIoenPM.js → status-badge-DJgvgFQk.js} +2 -2
- package/dist/web/public/assets/{status-badge-BCIoenPM.js.map → status-badge-DJgvgFQk.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-ZimmkSar.js → subtasks-Cq0R4U6Z.js} +2 -2
- package/dist/web/public/assets/{subtasks-ZimmkSar.js.map → subtasks-Cq0R4U6Z.js.map} +1 -1
- package/dist/web/public/assets/{table-Bm0gEvxM.js → table-CVYTRwUs.js} +2 -2
- package/dist/web/public/assets/{table-Bm0gEvxM.js.map → table-CVYTRwUs.js.map} +1 -1
- package/dist/web/public/assets/{topn-CIqrKIEG.js → topn--vv790Oy.js} +2 -2
- package/dist/web/public/assets/{topn-CIqrKIEG.js.map → topn--vv790Oy.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-C5e_ChRg.js → trash-2-CeN2btBl.js} +2 -2
- package/dist/web/public/assets/{trash-2-C5e_ChRg.js.map → trash-2-CeN2btBl.js.map} +1 -1
- package/dist/web/public/assets/{use-agim-skills-DpOfgXTF.js → use-agim-skills-D5JvyrxB.js} +2 -2
- package/dist/web/public/assets/use-agim-skills-D5JvyrxB.js.map +1 -0
- package/dist/web/public/assets/{use-background-tasks-P7MRkIjy.js → use-background-tasks-C6zGANI5.js} +2 -2
- package/dist/web/public/assets/{use-background-tasks-P7MRkIjy.js.map → use-background-tasks-C6zGANI5.js.map} +1 -1
- package/dist/web/public/assets/{use-llm-admin-5KWvGX-n.js → use-llm-admin-CdqRAs0I.js} +2 -2
- package/dist/web/public/assets/{use-llm-admin-5KWvGX-n.js.map → use-llm-admin-CdqRAs0I.js.map} +1 -1
- package/dist/web/public/assets/{use-memory-D1oAiAgA.js → use-memory-Bg-C6FxV.js} +2 -2
- package/dist/web/public/assets/{use-memory-D1oAiAgA.js.map → use-memory-Bg-C6FxV.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-DmZsQEH6.js → use-observability-CiyMLYeG.js} +2 -2
- package/dist/web/public/assets/{use-observability-DmZsQEH6.js.map → use-observability-CiyMLYeG.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-C35Hb-qN.js → use-settings-S6mSC9nP.js} +2 -2
- package/dist/web/public/assets/{use-settings-C35Hb-qN.js.map → use-settings-S6mSC9nP.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-CMhnIsjv.js → use-workspace-DRkCOO8P.js} +2 -2
- package/dist/web/public/assets/{use-workspace-CMhnIsjv.js.map → use-workspace-DRkCOO8P.js.map} +1 -1
- package/dist/web/public/assets/{useQuery-qIxOSePS.js → useQuery-CvEVNuvH.js} +2 -2
- package/dist/web/public/assets/{useQuery-qIxOSePS.js.map → useQuery-CvEVNuvH.js.map} +1 -1
- package/dist/web/public/assets/{vector-DpAG-MwT.js → vector-BlXq3jJE.js} +2 -2
- package/dist/web/public/assets/{vector-DpAG-MwT.js.map → vector-BlXq3jJE.js.map} +1 -1
- package/dist/web/public/assets/{viewer-oV2bNGun.js → viewer-Daxh0dV4.js} +2 -2
- package/dist/web/public/assets/{viewer-oV2bNGun.js.map → viewer-Daxh0dV4.js.map} +1 -1
- package/dist/web/public/assets/{workspace-ndMN69ms.js → workspace-BO51vrkT.js} +2 -2
- package/dist/web/public/assets/{workspace-ndMN69ms.js.map → workspace-BO51vrkT.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-CQd3UL8p.js → workspaces-Chonjr-v.js} +2 -2
- package/dist/web/public/assets/{workspaces-CQd3UL8p.js.map → workspaces-Chonjr-v.js.map} +1 -1
- package/dist/web/public/assets/{x-BbSX_WMw.js → x-Dv1gbRhw.js} +2 -2
- package/dist/web/public/assets/{x-BbSX_WMw.js.map → x-Dv1gbRhw.js.map} +1 -1
- package/dist/web/public/index.html +2 -2
- package/dist/web/server.d.ts +2 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +11 -1
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/public/assets/dialog-CbUUUyma.js +0 -6
- package/dist/web/public/assets/dialog-CbUUUyma.js.map +0 -1
- package/dist/web/public/assets/index-1mxdI2Ts.js.map +0 -1
- package/dist/web/public/assets/injection-DTlETF-9.js +0 -2
- package/dist/web/public/assets/injection-DTlETF-9.js.map +0 -1
- package/dist/web/public/assets/installed-BYrIRWsr.js +0 -31
- package/dist/web/public/assets/installed-BYrIRWsr.js.map +0 -1
- package/dist/web/public/assets/memos-C0kKjNm0.js +0 -12
- package/dist/web/public/assets/memos-C0kKjNm0.js.map +0 -1
- package/dist/web/public/assets/use-agim-skills-DpOfgXTF.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,86 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.2.153] - 2026-06-19
|
|
8
|
+
|
|
9
|
+
### Fixed (P0:会话过期后整个后台白屏,连登陆页都进不去)
|
|
10
|
+
|
|
11
|
+
`src/web/server.ts:77` 的 `PUBLIC_PREFIX_PATHS` 漏列 `/assets/`。结果:
|
|
12
|
+
|
|
13
|
+
- 浏览器 GET `/login` → 公开路径放行 → 200 返回 v2 SPA shell
|
|
14
|
+
- SPA shell 引用 `/assets/index-*.js`
|
|
15
|
+
- 浏览器 GET `/assets/index-*.js` → checkAuth 撤销 loopback 豁免(反代请求带 X-Forwarded-*)→ 无 token cookie → **302 跳 /login**
|
|
16
|
+
- 浏览器拿到 HTML 当 JS 解析 → MIME 错误 → React 永远 boot 不起来 → 白屏
|
|
17
|
+
- 用户看到的是空 SPA shell,**连重登陆的入口都不存在**
|
|
18
|
+
|
|
19
|
+
cookie 有效时不触发(路径鉴权直接通过),所以 v1.2.140 起这个坑一直存在但没被发现,cookie 一过期就暴雷。
|
|
20
|
+
|
|
21
|
+
修复:把 `/assets/` 加进 `PUBLIC_PREFIX_PATHS`。SPA bundle 是 vite hash 命名的纯 app 代码(无密钥),跟已经公开的 `/vendor/`(chart.js 等第三方 CDN 资产)同性质。
|
|
22
|
+
|
|
23
|
+
### Files
|
|
24
|
+
|
|
25
|
+
- `src/web/server.ts` — `PUBLIC_PREFIX_PATHS` 加 `/assets/` + 注释说明;export `isPublicPath` 供测试
|
|
26
|
+
- `test/unit/web-auth-guards.test.ts` — 新增 3 case:/assets/* 公开 / /api/* 仍 gated / 老公开集 regression
|
|
27
|
+
|
|
28
|
+
### Tests
|
|
29
|
+
|
|
30
|
+
- `web-auth-guards.test.ts` 8/8 全过(5 老 + 3 新)
|
|
31
|
+
- backend typecheck 干净
|
|
32
|
+
|
|
33
|
+
### 操作员升级
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
npm i -g agim-cli@1.2.153
|
|
37
|
+
agim restart
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
老进程跑 5 天的 agim 升级后所有 cookie-expired 用户都能直接看到登陆框。
|
|
41
|
+
|
|
42
|
+
## [1.2.152] - 2026-06-15
|
|
43
|
+
|
|
44
|
+
### Changed (后台 skills 管理体验)
|
|
45
|
+
|
|
46
|
+
针对 v1.2.151 后两个反馈做体验优化:
|
|
47
|
+
|
|
48
|
+
#### Q1 — installed 页按 5 bucket 分组 + 默认折叠 + 顶部搜索
|
|
49
|
+
|
|
50
|
+
364 个 skill 一根长 list 渲染太重;改成 loader 已有的 5 bucket 分组,
|
|
51
|
+
大组默认折叠:
|
|
52
|
+
|
|
53
|
+
- **Framework**(agim-* 4 条,默认展开)
|
|
54
|
+
- **Agim builtin**(github / weather / 等 8 条,默认展开)
|
|
55
|
+
- **Workspace**(运营者亲装 ~122 条,默认折叠)
|
|
56
|
+
- **ECC 推荐池**(20 条,默认展开)
|
|
57
|
+
- **ECC 余下**(~210 条,默认折叠)
|
|
58
|
+
|
|
59
|
+
顶部加搜索框(按 name + description 模糊匹配)。搜索激活时所有匹配桶
|
|
60
|
+
强制展开,并在每个桶头显示命中数 badge。
|
|
61
|
+
|
|
62
|
+
#### Q2 — injection 页 Refresh 升级为"重建默认注入词"
|
|
63
|
+
|
|
64
|
+
v1.2.151 的 Refresh 按钮只 refetch React Query,没真正失效 loader 5min cache
|
|
65
|
+
——运营者刚新增 skill 后看到的 auto 还是旧的。改成两步:
|
|
66
|
+
1. POST `/api/agim-skills/refresh`(loader 重扫磁盘 + invalidate cache)
|
|
67
|
+
2. refetch `/api/agim-skills/injection`(拿到 fresh auto block)
|
|
68
|
+
|
|
69
|
+
不影响 override(覆盖文件不动)。
|
|
70
|
+
|
|
71
|
+
按钮文案:中文"重建默认注入词" / 英文"Rebuild auto block"。
|
|
72
|
+
|
|
73
|
+
### Files
|
|
74
|
+
|
|
75
|
+
- `src/web/agim-skills-api.ts` — `handleList` 返回多加 `bucket: 0..4`(复用 `rankSkillBucket`)
|
|
76
|
+
- `src/web-app/src/hooks/use-agim-skills.ts` — `AgimSkillMeta.bucket?: 0|1|2|3|4`
|
|
77
|
+
- `src/web-app/src/routes/settings/agim-skills/installed.tsx` — `SkillsList` 重构为 bucket 分组 + 折叠 + 顶部搜索;导入 ChevronDown / ChevronRight / Search 图标
|
|
78
|
+
- `src/web-app/src/routes/settings/agim-skills/injection.tsx` — 新增 `useAgimSkillsRefresh` 依赖;`onRefresh` 改两步语义;按钮文案改成"重建"
|
|
79
|
+
- `src/web-app/src/i18n/locales/{zh,en}/settings.json` — 新增 `agimSkills.group.*` / `searchPlaceholder` / `searchEmpty` + `skillInjection.rebuild*` / `rebuiltToast`
|
|
80
|
+
|
|
81
|
+
### Tests
|
|
82
|
+
|
|
83
|
+
- API list 测试 (`agim-skills-api.test.ts` 13/13 旧 + 6 v1.2.151) + loader (42/42) → 61/61 全过
|
|
84
|
+
- backend typecheck 干净;SPA typecheck 仅遗留 search.tsx 错误(不在本 PR)
|
|
85
|
+
- SPA build 干净
|
|
86
|
+
|
|
7
87
|
## [1.2.151] - 2026-06-13
|
|
8
88
|
|
|
9
89
|
### Changed (skills injection — workspace 完整注入铁律 + 编辑入口)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agim-skills-api.d.ts","sourceRoot":"","sources":["../../src/web/agim-skills-api.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"agim-skills-api.d.ts","sourceRoot":"","sources":["../../src/web/agim-skills-api.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAyBhE,6CAA6C;AAC7C,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,GAClD,OAAO,CAAC,OAAO,CAAC,CAkClB"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// All endpoints are admin-gated upstream in server.ts because SKILL.md
|
|
16
16
|
// bodies are injected into every agent prompt — malicious content
|
|
17
17
|
// here goes straight to every CLI agent + the native agent.
|
|
18
|
-
import { listSkills, getSkillByName, readSkillBody, invalidateSkillsCache, writeSkillFile, deleteSkill, MAX_SKILL_BODY_CHARS, buildAutoInjectionBlock, readInjectionOverride, writeInjectionOverride, deleteInjectionOverride, injectionOverridePath, } from '../core/skills/loader.js';
|
|
18
|
+
import { listSkills, getSkillByName, readSkillBody, invalidateSkillsCache, writeSkillFile, deleteSkill, MAX_SKILL_BODY_CHARS, buildAutoInjectionBlock, readInjectionOverride, writeInjectionOverride, deleteInjectionOverride, injectionOverridePath, rankSkillBucket, } from '../core/skills/loader.js';
|
|
19
19
|
function send(res, code, body) {
|
|
20
20
|
res.statusCode = code;
|
|
21
21
|
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
@@ -96,6 +96,11 @@ async function handleList(res) {
|
|
|
96
96
|
requiresBins: s.requiresBins,
|
|
97
97
|
requiresEnv: s.requiresEnv,
|
|
98
98
|
dir: s.dir,
|
|
99
|
+
// v1.2.152 — system-prompt injection bucket (0=agim framework /
|
|
100
|
+
// 1=non-ECC builtin / 2=ECC top picks / 3=workspace / 4=ECC remainder).
|
|
101
|
+
// SPA uses this to group + collapse the installed list so operators
|
|
102
|
+
// with 300+ skills don't render one giant flat list.
|
|
103
|
+
bucket: rankSkillBucket(s),
|
|
99
104
|
}));
|
|
100
105
|
send(res, 200, { skills, count: skills.length, maxBodyChars: MAX_SKILL_BODY_CHARS });
|
|
101
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agim-skills-api.js","sourceRoot":"","sources":["../../src/web/agim-skills-api.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,wDAAwD;AACxD,oEAAoE;AACpE,kEAAkE;AAClE,kCAAkC;AAClC,EAAE;AACF,aAAa;AACb,uEAAuE;AACvE,oEAAoE;AACpE,sFAAsF;AACtF,gFAAgF;AAChF,+DAA+D;AAC/D,mEAAmE;AACnE,EAAE;AACF,uEAAuE;AACvE,kEAAkE;AAClE,4DAA4D;AAG5D,OAAO,EACL,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,qBAAqB,EAChE,cAAc,EAAE,WAAW,EAC3B,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EAAE,sBAAsB,EAAE,uBAAuB,EACtE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"agim-skills-api.js","sourceRoot":"","sources":["../../src/web/agim-skills-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -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-BjUyDXLb.js";import{r as N}from"./react-DlP5eolq.js";import{D as y}from"./data-table-C3oIPQ_B.js";import{E as b}from"./empty-state-esNZG4Xa.js";import{S as w}from"./status-badge-DJgvgFQk.js";import{u as x}from"./useQuery-CvEVNuvH.js";import{u as v}from"./use-event-stream-I1lMFEfh.js";import{L as A}from"./loader-circle-MnTMknNl.js";import{R as S}from"./refresh-ccw--XT-lrCo.js";import"./table-CVYTRwUs.js";import"./arrow-up-BGsin7FN.js";import"./arrow-down-D3lWOftw.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-CIxNaIdE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2a-BJ4YL13Y.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-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":"4hBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAYC,EAAiB,YAAa,CAC9C,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,KAAM,IAAK,QAAQ,CAAE,EAC/D,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,IAAK,EAAG,IAAK,IAAK,SAAU,EACvD,CAAC,SAAU,CAAE,GAAI,IAAK,GAAI,KAAM,EAAG,IAAK,IAAK,SAAU,EACvD,CAAC,OAAQ,CAAE,EAAG,sBAAuB,IAAK,QAAQ,CAAE,CACtD,CAAC,ECCYC,EAAU,CACrB,IAAQ,CAAC,KAAK,EACd,MAAQ,CAAC,MAAO,OAAO,EACvB,OAASC,GAA0B,CAAC,MAAO,SAAUA,CAAC,CACxD,EAEO,SAASC,GAAc,CAC5B,OAAOC,EAAmB,CACxB,SAAUH,EAAQ,MAClB,QAAS,IAAMI,EAAI,YAAA,CAAY,CAChC,CACH,CAEO,SAASC,EAAaC,EAA2B,CACtD,OAAOH,EAAgC,CACrC,SAAUH,EAAQ,OAAOM,CAAK,EAC9B,QAAS,IAAMF,EAAI,aAAaE,CAAK,CAAA,CACtC,CACH,CAEO,SAASC,GAAmB,CACjC,MAAMC,EAAKC,EAAA,EACX,MAAO,IAAMD,EAAG,kBAAkB,CAAE,SAAUR,EAAQ,IAAK,CAC7D,CCjBA,MAAMU,EAA+C,CACnD,UAAc,eACd,WAAc,gBACd,aAAc,eACd,OAAc,iBAChB,EAEA,SAAwBC,GAAwB,CAC9C,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAe,CAAC,QAAS,QAAQ,CAAC,EAC1CC,EAAaP,EAAA,EAEbQ,EAAab,EAAA,EACbc,EAAcX,EAAa,CAAE,MAAO,GAAI,EACxCY,EAAOD,EAAY,MAAM,MAAQ,CAAA,EACjCE,EAAQH,EAAW,KAEnBI,EAAOC,EAAe,CAC1B,IAAK,IAAMN,EAAA,CAAW,CACvB,EAEKO,EAAqCC,EAAAA,QACzC,IAAM,CACJ,CACE,GAAI,KACJ,OAAQV,EAAE,YAAY,EACtB,KAAOW,GAAMC,EAAAA,KAAC,OAAA,CAAK,UAAU,6BAA6B,SAAA,CAAA,IAAED,EAAE,EAAA,EAAG,EACjE,cAAe,MAAA,EAEjB,CACE,GAAI,QACJ,OAAQX,EAAE,eAAe,EACzB,KAAOW,GAAME,EAAAA,IAAC,QAAK,UAAU,cAAe,WAAE,MAAM,EACpD,cAAe,MAAA,EAEjB,CACE,GAAI,SACJ,OAAQb,EAAE,gBAAgB,EAC1B,KAAOW,GACLA,EAAE,WAAa,KACbC,EAAAA,KAAC,OAAA,CAAK,UAAU,6BAA6B,SAAA,CAAA,IAAED,EAAE,SAAA,EAAU,EAE3DE,EAAAA,IAAC,OAAA,CAAK,UAAU,kBAAkB,SAAA,IAAC,EAEvC,cAAe,MAAA,EAEjB,CACE,GAAI,QACJ,OAAQb,EAAE,eAAe,EACzB,KAAOW,GAAME,EAAAA,IAAC,QAAK,UAAU,6BAA8B,WAAE,WAAW,EACxE,cAAe,OACf,aAAc,EAAA,EAEhB,CACE,GAAI,SACJ,OAAQb,EAAE,gBAAgB,EAC1B,KAAOW,GAAME,EAAAA,IAACC,GAAY,OAAQH,EAAE,OAAS,SAAAA,EAAE,MAAA,CAAO,EACtD,cAAe,MAAA,EAEjB,CACE,GAAI,SACJ,OAAQX,EAAE,gBAAgB,EAC1B,KAAOW,GACLE,EAAAA,IAAC,QAAK,UAAU,6BAA8B,SAAAF,EAAE,QAAU,GAAA,CAAI,EAEhE,YAAa,EAAA,EAEf,CACE,GAAI,YACJ,OAAQX,EAAE,mBAAmB,EAC7B,KAAOW,GAAME,EAAAA,IAAC,OAAA,CAAK,UAAU,gBAAiB,SAAAE,EAAWJ,EAAE,UAAU,CAAA,CAAE,EACvE,cAAe,OACf,aAAc,EAAA,CAChB,EAEF,CAACX,CAAC,CAAA,EAGJ,OACEY,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,sBAChB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAb,EAAE,WAAW,EAAE,EACtDa,EAAAA,IAAC,OAAA,CAAK,UAAWG,EAAG,mCAAoClB,EAAkBS,CAAI,CAAC,EAC5E,SAAAP,EAAE,aAAaO,CAAI,EAAE,EACxB,EACAK,EAAAA,KAACK,EAAA,CACC,QAAQ,QACR,KAAK,KACL,UAAU,UACV,QAAS,IAAM,CACRb,EAAY,QAAA,EACZD,EAAW,QAAA,CAClB,EACA,SAAUC,EAAY,YAAcD,EAAW,WAC/C,aAAYH,EAAE,kBAAmB,CAAE,GAAI,SAAU,EAEhD,SAAA,CAAAI,EAAY,iBAAcc,EAAA,CAAQ,UAAU,uBAAuB,EAAKL,EAAAA,IAACM,EAAA,CAAW,UAAU,SAAA,CAAU,EACzGN,EAAAA,IAAC,OAAA,CAAK,UAAU,mBAAoB,SAAAb,EAAE,kBAAmB,CAAE,GAAI,QAAA,CAAU,CAAA,CAAE,CAAA,CAAA,CAAA,CAC7E,EACF,QACC,IAAA,CAAE,UAAU,wBAAyB,SAAAA,EAAE,cAAc,CAAA,CAAE,CAAA,EAC1D,EAECM,GACCM,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAC,EAAAA,IAACO,EAAA,CAAS,MAAOpB,EAAE,iBAAiB,EAAO,MAAOM,EAAM,MAAW,KAAK,MAAA,CAAO,EAC/EO,EAAAA,IAACO,EAAA,CAAS,MAAOpB,EAAE,qBAAqB,EAAG,MAAOM,EAAM,UAAW,KAAK,SAAA,CAAU,EAClFO,EAAAA,IAACO,EAAA,CAAS,MAAOpB,EAAE,oBAAoB,EAAI,MAAOM,EAAM,SAAW,KAAK,SAAA,CAAU,CAAA,EACpF,EAGFO,EAAAA,IAACQ,EAAA,CACC,QAAAZ,EACA,KAAAJ,EACA,SAAWM,GAAM,OAAOA,EAAE,EAAE,EAC5B,QAASP,EAAY,UACrB,WACES,EAAAA,IAACS,EAAA,CACC,WAAOpC,EAAA,EAAU,EACjB,MAAOc,EAAE,iBAAiB,EAC1B,YAAaA,EAAE,uBAAuB,CAAA,CAAA,CACxC,CAAA,CAEJ,EACF,CAEJ,CAQA,MAAMuB,EAAqD,CACzD,KAAS,8BACT,QAAS,iCACT,QAAS,iCACT,OAAS,+BACX,EAEA,SAASH,EAAS,CAAE,MAAAI,EAAO,MAAAC,EAAO,KAAAC,GAAoC,CACpE,OACEd,EAAAA,KAAC,MAAA,CACC,UAAWI,EACT,yCACAO,EAAYG,CAAI,CAAA,EAGlB,SAAA,CAAAb,EAAAA,IAAC,MAAA,CAAI,UAAU,gDAAiD,SAAAW,EAAM,EACtEX,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAuC,SAAAY,CAAA,CAAM,CAAA,CAAA,CAAA,CAGlE,CAEA,SAASV,EAAWY,EAAqB,CACvC,GAAI,CACF,MAAMC,EAAI,IAAI,KAAKD,CAAG,EACtB,OAAI,OAAO,MAAMC,EAAE,QAAA,CAAS,EAAUD,EAC/BC,EAAE,eAAe,OAAW,CAAE,MAAO,QAAS,IAAK,UAAW,KAAM,UAAW,OAAQ,SAAA,CAAW,CAC3G,MAAQ,CACN,OAAOD,CACT,CACF","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{n as t}from"./index-
|
|
1
|
+
import{n as t}from"./index-BjUyDXLb.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-CrnWHC2j.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-
|
|
1
|
+
{"version":3,"file":"activity-CrnWHC2j.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-BjUyDXLb.js";import{r as x}from"./react-DlP5eolq.js";import{C as L}from"./confirm-dialog-B3jno5Pb.js";import{E as P}from"./empty-state-esNZG4Xa.js";import{T as E,a as z,b as C,c as h,d as B,e as u}from"./table-CVYTRwUs.js";import{n as F,o as D,p as H}from"./use-settings-S6mSC9nP.js";import{L as T}from"./loader-circle-MnTMknNl.js";import{R as U}from"./refresh-ccw--XT-lrCo.js";import{T as _}from"./trash-2-CeN2btBl.js";import"./dialog-nb4ANHd4.js";import"./x-Dv1gbRhw.js";import"./useQuery-CvEVNuvH.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-5BTRCU9u.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admins-CUAm5mP9.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-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,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-BjUyDXLb.js";import{r as h}from"./react-DlP5eolq.js";import{E as re}from"./empty-state-esNZG4Xa.js";import{u as oe}from"./use-workspace-DRkCOO8P.js";import{b as de,c as me,h as xe,i as ue}from"./use-settings-S6mSC9nP.js";import{L as D}from"./loader-circle-MnTMknNl.js";import{R as pe}from"./refresh-ccw--XT-lrCo.js";import{X as he}from"./x-Dv1gbRhw.js";import{S as ge}from"./save-9sLkRauh.js";import{N as G}from"./network-DVRgX5Mm.js";import{S as I}from"./search-aWQWrzh3.js";import{P as fe}from"./plus-BOfhZkjh.js";import{T as je}from"./trash-2-CeN2btBl.js";import"./useQuery-CvEVNuvH.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-B-s9gngh.js.map
|