agim-cli 1.2.134 → 1.2.136
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 +96 -0
- package/dist/core/plan-intent.d.ts +14 -0
- package/dist/core/plan-intent.d.ts.map +1 -0
- package/dist/core/plan-intent.js +114 -0
- package/dist/core/plan-intent.js.map +1 -0
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +27 -1
- package/dist/core/router.js.map +1 -1
- package/dist/plugins/agents/native/index.d.ts.map +1 -1
- package/dist/plugins/agents/native/index.js +8 -3
- package/dist/plugins/agents/native/index.js.map +1 -1
- package/dist/web/public/assets/{a2a-TmaKRhXV.js → a2a-COCxV3Cc.js} +2 -2
- package/dist/web/public/assets/{a2a-TmaKRhXV.js.map → a2a-COCxV3Cc.js.map} +1 -1
- package/dist/web/public/assets/{activity-Cckc7fGG.js → activity-lssr7XnJ.js} +2 -2
- package/dist/web/public/assets/{activity-Cckc7fGG.js.map → activity-lssr7XnJ.js.map} +1 -1
- package/dist/web/public/assets/{admins-1hMCDolP.js → admins-DSW8IUl9.js} +2 -2
- package/dist/web/public/assets/{admins-1hMCDolP.js.map → admins-DSW8IUl9.js.map} +1 -1
- package/dist/web/public/assets/{agents-3sUHlKzx.js → agents-0IMyFVui.js} +2 -2
- package/dist/web/public/assets/{agents-3sUHlKzx.js.map → agents-0IMyFVui.js.map} +1 -1
- package/dist/web/public/assets/{approvals-CY-_Lg4Y.js → approvals-ClzA_Sl1.js} +2 -2
- package/dist/web/public/assets/{approvals-CY-_Lg4Y.js.map → approvals-ClzA_Sl1.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-BkZ50IzL.js → arrow-down-B6b32UC0.js} +2 -2
- package/dist/web/public/assets/{arrow-down-BkZ50IzL.js.map → arrow-down-B6b32UC0.js.map} +1 -1
- package/dist/web/public/assets/{arrow-up-NWC5K6Jw.js → arrow-up-B-nP5kYY.js} +2 -2
- package/dist/web/public/assets/{arrow-up-NWC5K6Jw.js.map → arrow-up-B-nP5kYY.js.map} +1 -1
- package/dist/web/public/assets/{asks-VzAmpsEh.js → asks-DyXhQTTK.js} +2 -2
- package/dist/web/public/assets/{asks-VzAmpsEh.js.map → asks-DyXhQTTK.js.map} +1 -1
- package/dist/web/public/assets/{audit-fOn2LH4D.js → audit-BI7SCouF.js} +2 -2
- package/dist/web/public/assets/{audit-fOn2LH4D.js.map → audit-BI7SCouF.js.map} +1 -1
- package/dist/web/public/assets/{bell-FF7PJo1N.js → bell-B3N02OLo.js} +2 -2
- package/dist/web/public/assets/{bell-FF7PJo1N.js.map → bell-B3N02OLo.js.map} +1 -1
- package/dist/web/public/assets/{bgjobs-L0v-UwPW.js → bgjobs-CicZiNip.js} +2 -2
- package/dist/web/public/assets/{bgjobs-L0v-UwPW.js.map → bgjobs-CicZiNip.js.map} +1 -1
- package/dist/web/public/assets/{brain-CdkDpFr1.js → brain-C6ukvGuf.js} +2 -2
- package/dist/web/public/assets/{brain-CdkDpFr1.js.map → brain-C6ukvGuf.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-BXbOdl7E.js → briefcase-hn1X3B5h.js} +2 -2
- package/dist/web/public/assets/{briefcase-BXbOdl7E.js.map → briefcase-hn1X3B5h.js.map} +1 -1
- package/dist/web/public/assets/{chat-BazMi-ik.js → chat-BDQj16Vz.js} +2 -2
- package/dist/web/public/assets/{chat-BazMi-ik.js.map → chat-BDQj16Vz.js.map} +1 -1
- package/dist/web/public/assets/{chevron-left-Di1Tz64J.js → chevron-left-RxNVjq1Y.js} +2 -2
- package/dist/web/public/assets/{chevron-left-Di1Tz64J.js.map → chevron-left-RxNVjq1Y.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-BLjhBkqs.js → chevron-right-BUp0DVnl.js} +2 -2
- package/dist/web/public/assets/{chevron-right-BLjhBkqs.js.map → chevron-right-BUp0DVnl.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-BaxzYLlE.js → circle-check-Bm4WZ21u.js} +2 -2
- package/dist/web/public/assets/{circle-check-BaxzYLlE.js.map → circle-check-Bm4WZ21u.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-C4BGLUvw.js → circle-check-big-BIrgy-jJ.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-C4BGLUvw.js.map → circle-check-big-BIrgy-jJ.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-THl-PO3_.js → circle-x-D3x0-M6I.js} +2 -2
- package/dist/web/public/assets/{circle-x-THl-PO3_.js.map → circle-x-D3x0-M6I.js.map} +1 -1
- package/dist/web/public/assets/{clock-iitpdQjZ.js → clock-DS7DQ1w2.js} +2 -2
- package/dist/web/public/assets/{clock-iitpdQjZ.js.map → clock-DS7DQ1w2.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-r9HgkIYf.js → confirm-dialog-C68_XUSd.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-r9HgkIYf.js.map → confirm-dialog-C68_XUSd.js.map} +1 -1
- package/dist/web/public/assets/{copy-DwyF4MOL.js → copy-Bzjhsg1p.js} +2 -2
- package/dist/web/public/assets/{copy-DwyF4MOL.js.map → copy-Bzjhsg1p.js.map} +1 -1
- package/dist/web/public/assets/{data-table-B80M8zdu.js → data-table-DEXi61Ud.js} +2 -2
- package/dist/web/public/assets/{data-table-B80M8zdu.js.map → data-table-DEXi61Ud.js.map} +1 -1
- package/dist/web/public/assets/{dialog-fGS0IXOo.js → dialog-gd2B3olO.js} +2 -2
- package/dist/web/public/assets/{dialog-fGS0IXOo.js.map → dialog-gd2B3olO.js.map} +1 -1
- package/dist/web/public/assets/{download-5ihiF2Gj.js → download-DCcaTdc6.js} +2 -2
- package/dist/web/public/assets/{download-5ihiF2Gj.js.map → download-DCcaTdc6.js.map} +1 -1
- package/dist/web/public/assets/{email-LmRMqLRU.js → email-Bp4hAFCc.js} +2 -2
- package/dist/web/public/assets/{email-LmRMqLRU.js.map → email-Bp4hAFCc.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-CrPnUC6d.js → empty-state-Bzkp-ADK.js} +2 -2
- package/dist/web/public/assets/{empty-state-CrPnUC6d.js.map → empty-state-Bzkp-ADK.js.map} +1 -1
- package/dist/web/public/assets/{external-link-DIJK1MAH.js → external-link-Deer-Lh8.js} +2 -2
- package/dist/web/public/assets/{external-link-DIJK1MAH.js.map → external-link-Deer-Lh8.js.map} +1 -1
- package/dist/web/public/assets/{eye-DJJw0Ald.js → eye-aJAK4qYW.js} +2 -2
- package/dist/web/public/assets/{eye-DJJw0Ald.js.map → eye-aJAK4qYW.js.map} +1 -1
- package/dist/web/public/assets/{facts-BzImxpJD.js → facts-CX8Slc_J.js} +2 -2
- package/dist/web/public/assets/{facts-BzImxpJD.js.map → facts-CX8Slc_J.js.map} +1 -1
- package/dist/web/public/assets/{goals-C6p21B9N.js → goals-CoO5qR3l.js} +2 -2
- package/dist/web/public/assets/{goals-C6p21B9N.js.map → goals-CoO5qR3l.js.map} +1 -1
- package/dist/web/public/assets/{health-D-ugz2Gp.js → health-QRL6KLLZ.js} +2 -2
- package/dist/web/public/assets/{health-D-ugz2Gp.js.map → health-QRL6KLLZ.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-DlZXcdL0.js → heart-pulse-DTuy4Tma.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-DlZXcdL0.js.map → heart-pulse-DTuy4Tma.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-DSasg-3y.js → heartbeat-BLutWB3t.js} +2 -2
- package/dist/web/public/assets/{heartbeat-DSasg-3y.js.map → heartbeat-BLutWB3t.js.map} +1 -1
- package/dist/web/public/assets/{hot-D67pYtaV.js → hot-B96_1Z-G.js} +2 -2
- package/dist/web/public/assets/{hot-D67pYtaV.js.map → hot-B96_1Z-G.js.map} +1 -1
- package/dist/web/public/assets/{index-CqwhfPlr.js → index-wVLKSZpI.js} +23 -23
- package/dist/web/public/assets/{index-CqwhfPlr.js.map → index-wVLKSZpI.js.map} +1 -1
- package/dist/web/public/assets/{installed-CrIsSoQE.js → installed-5bpbtNzF.js} +2 -2
- package/dist/web/public/assets/{installed-CrIsSoQE.js.map → installed-5bpbtNzF.js.map} +1 -1
- package/dist/web/public/assets/{jobs-yAwphb1W.js → jobs-CPLjCaI5.js} +2 -2
- package/dist/web/public/assets/{jobs-yAwphb1W.js.map → jobs-CPLjCaI5.js.map} +1 -1
- package/dist/web/public/assets/{layout-cacmfseo.js → layout-CN-hNeUX.js} +2 -2
- package/dist/web/public/assets/{layout-cacmfseo.js.map → layout-CN-hNeUX.js.map} +1 -1
- package/dist/web/public/assets/{layout-CL5HFvHN.js → layout-Cdi09rZy.js} +2 -2
- package/dist/web/public/assets/{layout-CL5HFvHN.js.map → layout-Cdi09rZy.js.map} +1 -1
- package/dist/web/public/assets/{layout-BXZKGQAk.js → layout-DOvroJYL.js} +2 -2
- package/dist/web/public/assets/{layout-BXZKGQAk.js.map → layout-DOvroJYL.js.map} +1 -1
- package/dist/web/public/assets/{layout-awbFImGg.js → layout-K_oWND8q.js} +2 -2
- package/dist/web/public/assets/{layout-awbFImGg.js.map → layout-K_oWND8q.js.map} +1 -1
- package/dist/web/public/assets/{layout-CrtmlC8G.js → layout-nYKX1VY4.js} +2 -2
- package/dist/web/public/assets/{layout-CrtmlC8G.js.map → layout-nYKX1VY4.js.map} +1 -1
- package/dist/web/public/assets/{llm-C19AX6q2.js → llm-BDW-Xpvk.js} +2 -2
- package/dist/web/public/assets/{llm-C19AX6q2.js.map → llm-BDW-Xpvk.js.map} +1 -1
- package/dist/web/public/assets/{loader-circle-U-jPjmeD.js → loader-circle-DPc6botW.js} +2 -2
- package/dist/web/public/assets/{loader-circle-U-jPjmeD.js.map → loader-circle-DPc6botW.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-4rE1NK87.js → map-pin-ECh-25H3.js} +2 -2
- package/dist/web/public/assets/{map-pin-4rE1NK87.js.map → map-pin-ECh-25H3.js.map} +1 -1
- package/dist/web/public/assets/{mcp-B94wc6Vi.js → mcp-BV-k5VFD.js} +2 -2
- package/dist/web/public/assets/{mcp-B94wc6Vi.js.map → mcp-BV-k5VFD.js.map} +1 -1
- package/dist/web/public/assets/{memos-CrG4zgfI.js → memos-BTsHVXah.js} +2 -2
- package/dist/web/public/assets/{memos-CrG4zgfI.js.map → memos-BTsHVXah.js.map} +1 -1
- package/dist/web/public/assets/{messengers-UWarJd_C.js → messengers-fyjNQwDX.js} +2 -2
- package/dist/web/public/assets/{messengers-UWarJd_C.js.map → messengers-fyjNQwDX.js.map} +1 -1
- package/dist/web/public/assets/{mobile-QhAUKqcJ.js → mobile-CeRuQZ-W.js} +2 -2
- package/dist/web/public/assets/{mobile-QhAUKqcJ.js.map → mobile-CeRuQZ-W.js.map} +1 -1
- package/dist/web/public/assets/native-agent-Cg-Sab4t.js +22 -0
- package/dist/web/public/assets/native-agent-Cg-Sab4t.js.map +1 -0
- package/dist/web/public/assets/{network-l6l5gLHO.js → network-FK3KNI1a.js} +2 -2
- package/dist/web/public/assets/{network-l6l5gLHO.js.map → network-FK3KNI1a.js.map} +1 -1
- package/dist/web/public/assets/{outbox-BenX_yUQ.js → outbox-DhlxB8l0.js} +2 -2
- package/dist/web/public/assets/{outbox-BenX_yUQ.js.map → outbox-DhlxB8l0.js.map} +1 -1
- package/dist/web/public/assets/{pagination-B4g1CBsi.js → pagination-DzNnFLlI.js} +2 -2
- package/dist/web/public/assets/{pagination-B4g1CBsi.js.map → pagination-DzNnFLlI.js.map} +1 -1
- package/dist/web/public/assets/{persona--3cjtl9q.js → persona-B_EkauQB.js} +2 -2
- package/dist/web/public/assets/{persona--3cjtl9q.js.map → persona-B_EkauQB.js.map} +1 -1
- package/dist/web/public/assets/{plans-DsHtDRlS.js → plans-D4aczyt4.js} +2 -2
- package/dist/web/public/assets/{plans-DsHtDRlS.js.map → plans-D4aczyt4.js.map} +1 -1
- package/dist/web/public/assets/{play-BG0hyTnO.js → play-BdTIFReu.js} +2 -2
- package/dist/web/public/assets/{play-BG0hyTnO.js.map → play-BdTIFReu.js.map} +1 -1
- package/dist/web/public/assets/{plus-Dof9AQvU.js → plus-CjK8x5Ta.js} +2 -2
- package/dist/web/public/assets/{plus-Dof9AQvU.js.map → plus-CjK8x5Ta.js.map} +1 -1
- package/dist/web/public/assets/{policy-BzHy4WbV.js → policy-D7vnZQeQ.js} +2 -2
- package/dist/web/public/assets/{policy-BzHy4WbV.js.map → policy-D7vnZQeQ.js.map} +1 -1
- package/dist/web/public/assets/{qr-code-yD_ztCf6.js → qr-code-CpmzdYE3.js} +2 -2
- package/dist/web/public/assets/{qr-code-yD_ztCf6.js.map → qr-code-CpmzdYE3.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-CBiHL1tY.js → refresh-ccw-C2Q06LWj.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-CBiHL1tY.js.map → refresh-ccw-C2Q06LWj.js.map} +1 -1
- package/dist/web/public/assets/{reminders-CDJlFR2Y.js → reminders-BW3VfYCD.js} +2 -2
- package/dist/web/public/assets/{reminders-CDJlFR2Y.js.map → reminders-BW3VfYCD.js.map} +1 -1
- package/dist/web/public/assets/{save-DVHI3V6o.js → save-3XXDgdfD.js} +2 -2
- package/dist/web/public/assets/{save-DVHI3V6o.js.map → save-3XXDgdfD.js.map} +1 -1
- package/dist/web/public/assets/{schedules-DYf64Fpr.js → schedules-Bg5oBl6i.js} +2 -2
- package/dist/web/public/assets/{schedules-DYf64Fpr.js.map → schedules-Bg5oBl6i.js.map} +1 -1
- package/dist/web/public/assets/{search-BYPDbBkC.js → search-BjW_KGfJ.js} +2 -2
- package/dist/web/public/assets/{search-BYPDbBkC.js.map → search-BjW_KGfJ.js.map} +1 -1
- package/dist/web/public/assets/{search-aw0y39Qs.js → search-oQrctQNZ.js} +2 -2
- package/dist/web/public/assets/{search-aw0y39Qs.js.map → search-oQrctQNZ.js.map} +1 -1
- package/dist/web/public/assets/{security-DhN1kRac.js → security-ongR2bsH.js} +2 -2
- package/dist/web/public/assets/{security-DhN1kRac.js.map → security-ongR2bsH.js.map} +1 -1
- package/dist/web/public/assets/{service-BhvI7Mb5.js → service-CNTTFkAV.js} +2 -2
- package/dist/web/public/assets/{service-BhvI7Mb5.js.map → service-CNTTFkAV.js.map} +1 -1
- package/dist/web/public/assets/{shield-alert-DjqqnTMk.js → shield-alert-DW0flso9.js} +2 -2
- package/dist/web/public/assets/{shield-alert-DjqqnTMk.js.map → shield-alert-DW0flso9.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-nSFUUEfy.js → status-badge-CnqMu-7R.js} +2 -2
- package/dist/web/public/assets/{status-badge-nSFUUEfy.js.map → status-badge-CnqMu-7R.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-C_x1RLJA.js → subtasks-ChtI7jpP.js} +2 -2
- package/dist/web/public/assets/{subtasks-C_x1RLJA.js.map → subtasks-ChtI7jpP.js.map} +1 -1
- package/dist/web/public/assets/{table-BNqo2xb8.js → table-DVQPjWsi.js} +2 -2
- package/dist/web/public/assets/{table-BNqo2xb8.js.map → table-DVQPjWsi.js.map} +1 -1
- package/dist/web/public/assets/{topn-NGtwNz38.js → topn-Cs-wP6Tf.js} +2 -2
- package/dist/web/public/assets/{topn-NGtwNz38.js.map → topn-Cs-wP6Tf.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-BoFq2ZOF.js → trash-2-BXhBc6TL.js} +2 -2
- package/dist/web/public/assets/{trash-2-BoFq2ZOF.js.map → trash-2-BXhBc6TL.js.map} +1 -1
- package/dist/web/public/assets/{use-background-tasks-CY2gWPBZ.js → use-background-tasks-DWe_iYgk.js} +2 -2
- package/dist/web/public/assets/{use-background-tasks-CY2gWPBZ.js.map → use-background-tasks-DWe_iYgk.js.map} +1 -1
- package/dist/web/public/assets/{use-llm-admin-CA5tUbEU.js → use-llm-admin-SE-2iSIe.js} +2 -2
- package/dist/web/public/assets/{use-llm-admin-CA5tUbEU.js.map → use-llm-admin-SE-2iSIe.js.map} +1 -1
- package/dist/web/public/assets/{use-memory-CxasvYqR.js → use-memory-tCgpqYla.js} +2 -2
- package/dist/web/public/assets/{use-memory-CxasvYqR.js.map → use-memory-tCgpqYla.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-BOepIjX5.js → use-observability-CMUSiy5z.js} +2 -2
- package/dist/web/public/assets/{use-observability-BOepIjX5.js.map → use-observability-CMUSiy5z.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-DBXvAYm9.js → use-settings-BUM0BmtA.js} +2 -2
- package/dist/web/public/assets/{use-settings-DBXvAYm9.js.map → use-settings-BUM0BmtA.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-dw_69jpb.js → use-workspace-BOUxEbaB.js} +2 -2
- package/dist/web/public/assets/{use-workspace-dw_69jpb.js.map → use-workspace-BOUxEbaB.js.map} +1 -1
- package/dist/web/public/assets/{useQuery-Ds6-WURB.js → useQuery-II-YwTUw.js} +2 -2
- package/dist/web/public/assets/{useQuery-Ds6-WURB.js.map → useQuery-II-YwTUw.js.map} +1 -1
- package/dist/web/public/assets/{vector-C5WBAtlL.js → vector-C83bHtEW.js} +2 -2
- package/dist/web/public/assets/{vector-C5WBAtlL.js.map → vector-C83bHtEW.js.map} +1 -1
- package/dist/web/public/assets/{viewer-DQG9P7-t.js → viewer-rMDo9pIb.js} +2 -2
- package/dist/web/public/assets/{viewer-DQG9P7-t.js.map → viewer-rMDo9pIb.js.map} +1 -1
- package/dist/web/public/assets/{workspace-Dku83Qqr.js → workspace-tVixiuWJ.js} +2 -2
- package/dist/web/public/assets/{workspace-Dku83Qqr.js.map → workspace-tVixiuWJ.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-ClLQ253x.js → workspaces-CsLKDstm.js} +2 -2
- package/dist/web/public/assets/{workspaces-ClLQ253x.js.map → workspaces-CsLKDstm.js.map} +1 -1
- package/dist/web/public/assets/{x-ClXUlQDe.js → x-B0lqsHGi.js} +2 -2
- package/dist/web/public/assets/{x-ClXUlQDe.js.map → x-B0lqsHGi.js.map} +1 -1
- package/dist/web/public/index.html +1 -1
- package/dist/web/server.js +3 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/public/assets/native-agent-DMf0u4dm.js +0 -22
- package/dist/web/public/assets/native-agent-DMf0u4dm.js.map +0 -1
package/dist/web/public/assets/{status-badge-nSFUUEfy.js.map → status-badge-CnqMu-7R.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-badge-
|
|
1
|
+
{"version":3,"file":"status-badge-CnqMu-7R.js","sources":["../../src/components/common/status-badge.tsx"],"sourcesContent":["/**\n * StatusBadge — domain status string → Badge variant + label.\n *\n * Single source of truth for the color mapping across the 4 M2 pages\n * (jobs / approvals / reminders / memos) plus the M3 observability\n * page. Without this every page would invent its own (job status\n * \"running\" mapped to \"warning\" on tasks.html, \"info\" on approvals.\n * html, \"secondary\" on observability — the kind of drift the v2\n * rewrite is supposed to eliminate).\n *\n * The label slot is intentionally a child rather than a prop: callers\n * pass i18n'd strings via `<StatusBadge status=\"running\">{t('jobs.\n * status.running')}</StatusBadge>` so the badge stays language-aware\n * without needing useTranslation here.\n *\n * Unknown status falls back to `default` variant (neutral gray pill)\n * so a backend that introduces a new state doesn't crash the page.\n */\n\nimport * as React from 'react'\nimport { Badge, type BadgeProps } from '@/components/ui/badge'\n\n/**\n * Status palette shared across domain entities. The mapping is\n * deliberately broad — both \"succeeded\" and \"completed\" land on\n * success; both \"running\" and \"in_progress\" land on info, etc. —\n * because the backend hasn't been canonicalised yet (memory.ts uses\n * one set, jobs.ts another).\n */\nconst STATUS_VARIANT: Record<string, BadgeProps['variant']> = {\n // Success-family\n succeeded: 'success',\n completed: 'success',\n done: 'success',\n approved: 'success',\n allowed: 'success',\n delivered: 'success',\n active: 'success',\n\n // In-flight\n running: 'info',\n in_progress:'info',\n pending: 'info',\n queued: 'info',\n scheduled: 'info',\n open: 'info',\n\n // Warnings (operator may need to look)\n paused: 'warning',\n awaiting: 'warning',\n timeout: 'warning',\n expired: 'warning',\n\n // Failed / errored\n failed: 'danger',\n error: 'danger',\n denied: 'danger',\n rejected: 'danger',\n cancelled: 'danger',\n canceled: 'danger',\n\n // Terminal-neutral\n finished: 'default',\n closed: 'default',\n archived: 'default',\n}\n\nexport interface StatusBadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {\n status: string\n children?: React.ReactNode\n /** Force-override the auto-mapped variant. */\n variant?: BadgeProps['variant']\n}\n\nfunction StatusBadge({\n status,\n variant,\n children,\n ...rest\n}: StatusBadgeProps): JSX.Element {\n const resolved = variant ?? STATUS_VARIANT[status.toLowerCase()] ?? 'default'\n return (\n <Badge variant={resolved} {...rest}>\n {children ?? status}\n </Badge>\n )\n}\nStatusBadge.displayName = 'StatusBadge'\n\nexport { StatusBadge, STATUS_VARIANT }\n"],"names":["STATUS_VARIANT","StatusBadge","status","variant","children","rest","resolved","Badge"],"mappings":"+CA6BA,MAAMA,EAAwD,CAE5D,UAAY,UACZ,UAAY,UACZ,KAAY,UACZ,SAAY,UACZ,QAAY,UACZ,UAAY,UACZ,OAAY,UAGZ,QAAY,OACZ,YAAY,OACZ,QAAY,OACZ,OAAY,OACZ,UAAY,OACZ,KAAY,OAGZ,OAAY,UACZ,SAAY,UACZ,QAAY,UACZ,QAAY,UAGZ,OAAY,SACZ,MAAY,SACZ,OAAY,SACZ,SAAY,SACZ,UAAY,SACZ,SAAY,SAGZ,SAAY,UACZ,OAAY,UACZ,SAAY,SACd,EASA,SAASC,EAAY,CACnB,OAAAC,EACA,QAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EAAkC,CAChC,MAAMC,EAAWH,GAAWH,EAAeE,EAAO,YAAA,CAAa,GAAK,UACpE,aACGK,EAAA,CAAM,QAASD,EAAW,GAAGD,EAC3B,YAAYH,EACf,CAEJ,CACAD,EAAY,YAAc"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{n as g,a as b,d as j,u as k,e as N,j as s,c as y,B as w,L as S,I as v}from"./index-
|
|
1
|
+
import{n as g,a as b,d as j,u as k,e as N,j as s,c as y,B as w,L as S,I as v}from"./index-wVLKSZpI.js";import{r as C}from"./react-Cb2sDjhD.js";import{D as L}from"./data-table-DEXi61Ud.js";import{E as T}from"./empty-state-Bzkp-ADK.js";import{S as I}from"./status-badge-CnqMu-7R.js";import{u as A}from"./useQuery-II-YwTUw.js";import{u as D}from"./use-event-stream-DgGpGKop.js";import{L as M}from"./loader-circle-DPc6botW.js";import{R as E}from"./refresh-ccw-C2Q06LWj.js";import"./table-DVQPjWsi.js";import"./arrow-up-B-nP5kYY.js";import"./arrow-down-B6b32UC0.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 R=g("ListTree",[["path",{d:"M21 12h-8",key:"1bmf0i"}],["path",{d:"M21 6H8",key:"1pqkrb"}],["path",{d:"M21 18h-8",key:"1tm79t"}],["path",{d:"M3 6v4c0 1.1.9 2 2 2h3",key:"1ywdgy"}],["path",{d:"M3 10v6c0 1.1.9 2 2 2h3",key:"2wc746"}]]),m={all:["subtasks"],list:e=>["subtasks","list",e]};function q(e){return A({queryKey:m.list(e),queryFn:()=>j.listSubtasks(e)})}function F(){const e=b();return()=>e.invalidateQueries({queryKey:m.all})}const $={connected:"text-success",connecting:"text-text-dim",reconnecting:"text-warning",closed:"text-text-muted"};function X(){const{t:e}=k(["tasks","common"]),[a,n]=N(),r=F(),i=a.get("agent")??"",{data:d,isLoading:u,isFetching:c,refetch:x}=q(i?{agent:i}:{}),p=d?.subtasks??[],o=D({job:()=>r()});function h(t){const l=new URLSearchParams(a);t?l.set("agent",t):l.delete("agent"),n(l,{replace:!0})}const f=C.useMemo(()=>[{id:"id",header:e("subtasks.col.id"),cell:t=>s.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",t.id]}),headClassName:"w-16"},{id:"agent",header:e("subtasks.col.agent"),cell:t=>s.jsx("span",{className:"font-medium",children:t.agent}),headClassName:"w-32"},{id:"prompt",header:e("subtasks.col.prompt"),cell:t=>s.jsx("span",{className:"line-clamp-2 text-text-dim",children:t.prompt}),asCardTitle:!0},{id:"status",header:e("subtasks.col.status"),cell:t=>s.jsx(I,{status:t.status,children:e(`subtasks.status.${t.status}`,{defaultValue:t.status})}),headClassName:"w-32"},{id:"parent",header:e("subtasks.col.parent"),cell:t=>s.jsxs("span",{className:"text-text-dim",children:[s.jsx("span",{className:"font-medium text-text",children:t.parentAgent}),s.jsx("span",{className:"text-text-muted",children:" / "}),s.jsx("span",{title:t.parentSessionId,children:t.parentSessionId.slice(0,8)})]}),headClassName:"w-40"},{id:"platform",header:e("subtasks.col.platform"),cell:t=>s.jsx("span",{className:"text-text-dim",children:t.platform}),headClassName:"w-28",hideOnMobile:!0},{id:"createdAt",header:e("subtasks.col.createdAt"),cell:t=>s.jsx("span",{className:"text-text-dim",children:B(t.createdAt)}),headClassName:"w-40",hideOnMobile:!0}],[e]);return s.jsxs("div",{className:"mx-auto flex max-w-7xl 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("subtasks.title")}),s.jsx("span",{className:y("text-xs font-medium tabular-nums",$[o]),children:e(`jobs.live.${o}`)}),s.jsxs(w,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>x(),disabled:c,"aria-label":e("actions.refresh",{ns:"common"}),children:[c?s.jsx(M,{className:"h-4 w-4 animate-spin"}):s.jsx(E,{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("subtasks.subtitle")})]}),s.jsx("div",{className:"flex flex-wrap items-end gap-2",children:s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsx(S,{htmlFor:"agent-filter",className:"text-xs text-text-dim",children:e("subtasks.filter.agent")}),s.jsx(v,{id:"agent-filter",value:i,onChange:t=>h(t.target.value),placeholder:e("subtasks.filter.agentAny"),className:"w-48"})]})}),s.jsx(L,{columns:f,rows:p,getRowId:t=>`${t.parentSessionId}:${t.id}`,loading:u,emptyState:s.jsx(T,{icon:s.jsx(R,{}),title:e("subtasks.empty.title"),description:e("subtasks.empty.description")})})]})}function B(e){try{const a=new Date(e);if(Number.isNaN(a.getTime()))return e;const n=new Date;return a.toDateString()===n.toDateString()?a.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}):a.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}export{X as default};
|
|
7
|
-
//# sourceMappingURL=subtasks-
|
|
7
|
+
//# sourceMappingURL=subtasks-ChtI7jpP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subtasks-C_x1RLJA.js","sources":["../../node_modules/lucide-react/dist/esm/icons/list-tree.js","../../src/hooks/use-subtasks.ts","../../src/routes/tasks/subtasks.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 ListTree = createLucideIcon(\"ListTree\", [\n [\"path\", { d: \"M21 12h-8\", key: \"1bmf0i\" }],\n [\"path\", { d: \"M21 6H8\", key: \"1pqkrb\" }],\n [\"path\", { d: \"M21 18h-8\", key: \"1tm79t\" }],\n [\"path\", { d: \"M3 6v4c0 1.1.9 2 2 2h3\", key: \"1ywdgy\" }],\n [\"path\", { d: \"M3 10v6c0 1.1.9 2 2 2h3\", key: \"2wc746\" }]\n]);\n\nexport { ListTree as default };\n//# sourceMappingURL=list-tree.js.map\n","/**\n * useSubtasks — react-query wrapper for /api/subtasks.\n *\n * Subtasks are a flattened view of session.subtasks across every\n * conversation file in ~/.agim/sessions/. The endpoint is read-only\n * — no cancel / re-run mutation surface (yet). Live refresh rides on\n * the same SSE 'job' event (subtask state changes piggy-back on the\n * parent job's lifecycle).\n */\n\nimport { useQueryClient, useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { ListSubtasksQuery, ListSubtasksResponse } from '@/types/api'\n\nexport const subtasksKeys = {\n all: ['subtasks'] as const,\n list: (q: ListSubtasksQuery) => ['subtasks', 'list', q] as const,\n}\n\nexport function useSubtasks(query: ListSubtasksQuery) {\n return useQuery<ListSubtasksResponse>({\n queryKey: subtasksKeys.list(query),\n queryFn: () => api.listSubtasks(query),\n })\n}\n\nexport function useInvalidateSubtasks() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: subtasksKeys.all })\n}\n","/**\n * /tasks/subtasks — flattened view of per-conversation child tasks\n * spawned by parent agents.\n *\n * Read-only: the backend doesn't expose cancel / re-run for subtasks\n * separately from the parent session. The page mirrors the columns\n * of /tasks/jobs but adds parent context (agent + platform) and\n * drops the duration / cost columns (which session.subtasks doesn't\n * track per-subtask).\n *\n * SSE: subscribes to the same `job` event as /tasks/jobs — subtask\n * status changes piggy-back on the parent job lifecycle in the\n * backend's event-bus.\n */\n\nimport { useMemo } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Loader2, ListTree, 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 { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { useSubtasks, useInvalidateSubtasks } from '@/hooks/use-subtasks'\nimport { useEventStream, type SseStatus } from '@/hooks/use-event-stream'\nimport type { Subtask } 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 SubtasksRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const [params, setParams] = useSearchParams()\n const invalidate = useInvalidateSubtasks()\n const agent = params.get('agent') ?? ''\n\n const { data, isLoading, isFetching, refetch } = useSubtasks(\n agent ? { agent } : {},\n )\n const subtasks = data?.subtasks ?? []\n\n const live = useEventStream({\n job: () => invalidate(),\n })\n\n function setAgentFilter(v: string): void {\n const next = new URLSearchParams(params)\n if (!v) next.delete('agent')\n else next.set('agent', v)\n setParams(next, { replace: true })\n }\n\n const columns: DataTableColumn<Subtask>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('subtasks.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('subtasks.col.agent'),\n cell: (r) => <span className=\"font-medium\">{r.agent}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'prompt',\n header: t('subtasks.col.prompt'),\n cell: (r) => <span className=\"line-clamp-2 text-text-dim\">{r.prompt}</span>,\n asCardTitle: true,\n },\n {\n id: 'status',\n header: t('subtasks.col.status'),\n cell: (r) => (\n <StatusBadge status={r.status}>\n {t(`subtasks.status.${r.status}`, { defaultValue: r.status })}\n </StatusBadge>\n ),\n headClassName: 'w-32',\n },\n {\n id: 'parent',\n header: t('subtasks.col.parent'),\n cell: (r) => (\n <span className=\"text-text-dim\">\n <span className=\"font-medium text-text\">{r.parentAgent}</span>\n <span className=\"text-text-muted\"> / </span>\n <span title={r.parentSessionId}>{r.parentSessionId.slice(0, 8)}</span>\n </span>\n ),\n headClassName: 'w-40',\n },\n {\n id: 'platform',\n header: t('subtasks.col.platform'),\n cell: (r) => <span className=\"text-text-dim\">{r.platform}</span>,\n headClassName: 'w-28',\n hideOnMobile: true,\n },\n {\n id: 'createdAt',\n header: t('subtasks.col.createdAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.createdAt)}</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('subtasks.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={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {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('subtasks.subtitle')}</p>\n </header>\n\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"agent-filter\" className=\"text-xs text-text-dim\">\n {t('subtasks.filter.agent')}\n </Label>\n <Input\n id=\"agent-filter\"\n value={agent}\n onChange={(e) => setAgentFilter(e.target.value)}\n placeholder={t('subtasks.filter.agentAny')}\n className=\"w-48\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n rows={subtasks}\n getRowId={(r) => `${r.parentSessionId}:${r.id}`}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<ListTree />}\n title={t('subtasks.empty.title')}\n description={t('subtasks.empty.description')}\n />\n }\n />\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 const now = new Date()\n const sameDay = d.toDateString() === now.toDateString()\n if (sameDay) {\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n }\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["ListTree","createLucideIcon","subtasksKeys","q","useSubtasks","query","useQuery","api","useInvalidateSubtasks","qc","useQueryClient","LIVE_STATUS_CLASS","SubtasksRoute","t","useTranslation","params","setParams","useSearchParams","invalidate","agent","data","isLoading","isFetching","refetch","subtasks","live","useEventStream","setAgentFilter","v","next","columns","useMemo","r","jsxs","jsx","StatusBadge","formatTime","cn","Button","Loader2","RefreshCcw","Label","Input","e","DataTable","EmptyState","iso","d","now"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"subtasks-ChtI7jpP.js","sources":["../../node_modules/lucide-react/dist/esm/icons/list-tree.js","../../src/hooks/use-subtasks.ts","../../src/routes/tasks/subtasks.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 ListTree = createLucideIcon(\"ListTree\", [\n [\"path\", { d: \"M21 12h-8\", key: \"1bmf0i\" }],\n [\"path\", { d: \"M21 6H8\", key: \"1pqkrb\" }],\n [\"path\", { d: \"M21 18h-8\", key: \"1tm79t\" }],\n [\"path\", { d: \"M3 6v4c0 1.1.9 2 2 2h3\", key: \"1ywdgy\" }],\n [\"path\", { d: \"M3 10v6c0 1.1.9 2 2 2h3\", key: \"2wc746\" }]\n]);\n\nexport { ListTree as default };\n//# sourceMappingURL=list-tree.js.map\n","/**\n * useSubtasks — react-query wrapper for /api/subtasks.\n *\n * Subtasks are a flattened view of session.subtasks across every\n * conversation file in ~/.agim/sessions/. The endpoint is read-only\n * — no cancel / re-run mutation surface (yet). Live refresh rides on\n * the same SSE 'job' event (subtask state changes piggy-back on the\n * parent job's lifecycle).\n */\n\nimport { useQueryClient, useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { ListSubtasksQuery, ListSubtasksResponse } from '@/types/api'\n\nexport const subtasksKeys = {\n all: ['subtasks'] as const,\n list: (q: ListSubtasksQuery) => ['subtasks', 'list', q] as const,\n}\n\nexport function useSubtasks(query: ListSubtasksQuery) {\n return useQuery<ListSubtasksResponse>({\n queryKey: subtasksKeys.list(query),\n queryFn: () => api.listSubtasks(query),\n })\n}\n\nexport function useInvalidateSubtasks() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: subtasksKeys.all })\n}\n","/**\n * /tasks/subtasks — flattened view of per-conversation child tasks\n * spawned by parent agents.\n *\n * Read-only: the backend doesn't expose cancel / re-run for subtasks\n * separately from the parent session. The page mirrors the columns\n * of /tasks/jobs but adds parent context (agent + platform) and\n * drops the duration / cost columns (which session.subtasks doesn't\n * track per-subtask).\n *\n * SSE: subscribes to the same `job` event as /tasks/jobs — subtask\n * status changes piggy-back on the parent job lifecycle in the\n * backend's event-bus.\n */\n\nimport { useMemo } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Loader2, ListTree, 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 { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { useSubtasks, useInvalidateSubtasks } from '@/hooks/use-subtasks'\nimport { useEventStream, type SseStatus } from '@/hooks/use-event-stream'\nimport type { Subtask } 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 SubtasksRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const [params, setParams] = useSearchParams()\n const invalidate = useInvalidateSubtasks()\n const agent = params.get('agent') ?? ''\n\n const { data, isLoading, isFetching, refetch } = useSubtasks(\n agent ? { agent } : {},\n )\n const subtasks = data?.subtasks ?? []\n\n const live = useEventStream({\n job: () => invalidate(),\n })\n\n function setAgentFilter(v: string): void {\n const next = new URLSearchParams(params)\n if (!v) next.delete('agent')\n else next.set('agent', v)\n setParams(next, { replace: true })\n }\n\n const columns: DataTableColumn<Subtask>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('subtasks.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('subtasks.col.agent'),\n cell: (r) => <span className=\"font-medium\">{r.agent}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'prompt',\n header: t('subtasks.col.prompt'),\n cell: (r) => <span className=\"line-clamp-2 text-text-dim\">{r.prompt}</span>,\n asCardTitle: true,\n },\n {\n id: 'status',\n header: t('subtasks.col.status'),\n cell: (r) => (\n <StatusBadge status={r.status}>\n {t(`subtasks.status.${r.status}`, { defaultValue: r.status })}\n </StatusBadge>\n ),\n headClassName: 'w-32',\n },\n {\n id: 'parent',\n header: t('subtasks.col.parent'),\n cell: (r) => (\n <span className=\"text-text-dim\">\n <span className=\"font-medium text-text\">{r.parentAgent}</span>\n <span className=\"text-text-muted\"> / </span>\n <span title={r.parentSessionId}>{r.parentSessionId.slice(0, 8)}</span>\n </span>\n ),\n headClassName: 'w-40',\n },\n {\n id: 'platform',\n header: t('subtasks.col.platform'),\n cell: (r) => <span className=\"text-text-dim\">{r.platform}</span>,\n headClassName: 'w-28',\n hideOnMobile: true,\n },\n {\n id: 'createdAt',\n header: t('subtasks.col.createdAt'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.createdAt)}</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('subtasks.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={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {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('subtasks.subtitle')}</p>\n </header>\n\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"agent-filter\" className=\"text-xs text-text-dim\">\n {t('subtasks.filter.agent')}\n </Label>\n <Input\n id=\"agent-filter\"\n value={agent}\n onChange={(e) => setAgentFilter(e.target.value)}\n placeholder={t('subtasks.filter.agentAny')}\n className=\"w-48\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n rows={subtasks}\n getRowId={(r) => `${r.parentSessionId}:${r.id}`}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<ListTree />}\n title={t('subtasks.empty.title')}\n description={t('subtasks.empty.description')}\n />\n }\n />\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 const now = new Date()\n const sameDay = d.toDateString() === now.toDateString()\n if (sameDay) {\n return d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n }\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["ListTree","createLucideIcon","subtasksKeys","q","useSubtasks","query","useQuery","api","useInvalidateSubtasks","qc","useQueryClient","LIVE_STATUS_CLASS","SubtasksRoute","t","useTranslation","params","setParams","useSearchParams","invalidate","agent","data","isLoading","isFetching","refetch","subtasks","live","useEventStream","setAgentFilter","v","next","columns","useMemo","r","jsxs","jsx","StatusBadge","formatTime","cn","Button","Loader2","RefreshCcw","Label","Input","e","DataTable","EmptyState","iso","d","now"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as s,c as t}from"./index-
|
|
2
|
-
//# sourceMappingURL=table-
|
|
1
|
+
import{j as s,c as t}from"./index-wVLKSZpI.js";import{r as o}from"./react-Cb2sDjhD.js";const l=o.forwardRef(({className:e,...a},r)=>s.jsx("div",{className:"w-full overflow-x-auto",children:s.jsx("table",{ref:r,className:t("w-full caption-bottom text-sm",e),...a})}));l.displayName="Table";const d=o.forwardRef(({className:e,...a},r)=>s.jsx("thead",{ref:r,className:t("[&_tr]:border-b [&_tr]:border-border bg-surface-2",e),...a}));d.displayName="TableHeader";const b=o.forwardRef(({className:e,...a},r)=>s.jsx("tbody",{ref:r,className:t("[&_tr:last-child]:border-0",e),...a}));b.displayName="TableBody";const c=o.forwardRef(({className:e,...a},r)=>s.jsx("tfoot",{ref:r,className:t("border-t border-border bg-surface-2 font-medium [&>tr]:last:border-b-0",e),...a}));c.displayName="TableFooter";const m=o.forwardRef(({className:e,...a},r)=>s.jsx("tr",{ref:r,className:t("border-b border-border transition-colors","hover:bg-surface-hover data-[state=selected]:bg-accent-bg",e),...a}));m.displayName="TableRow";const i=o.forwardRef(({className:e,...a},r)=>s.jsx("th",{ref:r,className:t("h-10 px-4 text-left align-middle","text-xs font-semibold uppercase tracking-wide text-text-dim","[&:has([role=checkbox])]:pr-0",e),...a}));i.displayName="TableHead";const f=o.forwardRef(({className:e,...a},r)=>s.jsx("td",{ref:r,className:t("p-3 align-middle [&:has([role=checkbox])]:pr-0",e),...a}));f.displayName="TableCell";const x=o.forwardRef(({className:e,...a},r)=>s.jsx("caption",{ref:r,className:t("mt-4 text-sm text-text-dim",e),...a}));x.displayName="TableCaption";export{l as T,d as a,m as b,i as c,b as d,f as e};
|
|
2
|
+
//# sourceMappingURL=table-DVQPjWsi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-
|
|
1
|
+
{"version":3,"file":"table-DVQPjWsi.js","sources":["../../src/components/ui/table.tsx"],"sourcesContent":["/**\n * Table — accessible HTML table primitives. No 3rd-party dep; the\n * sortable / paginated / virtualised DataTable that wraps this lives\n * at components/common/data-table.tsx (PR-8).\n *\n * Mobile fallback strategy: the DataTable wrapper detects `< md` and\n * renders cards instead of rows. The primitives here keep a `min-w`\n * + overflow-x-auto wrapper as the fallback fallback (degrade to\n * horizontal scroll) so even raw `<Table>` usage is usable on phone.\n */\n\nimport * as React from 'react'\nimport { cn } from '@/lib/utils'\n\nconst Table = React.forwardRef<HTMLTableElement, React.HTMLAttributes<HTMLTableElement>>(\n ({ className, ...props }, ref) => (\n <div className=\"w-full overflow-x-auto\">\n <table\n ref={ref}\n className={cn('w-full caption-bottom text-sm', className)}\n {...props}\n />\n </div>\n ),\n)\nTable.displayName = 'Table'\n\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b [&_tr]:border-border bg-surface-2', className)} {...props} />\n ),\n)\nTableHeader.displayName = 'TableHeader'\n\nconst TableBody = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n ),\n)\nTableBody.displayName = 'TableBody'\n\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n 'border-t border-border bg-surface-2 font-medium [&>tr]:last:border-b-0',\n className,\n )}\n {...props}\n />\n ),\n)\nTableFooter.displayName = 'TableFooter'\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n ({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b border-border transition-colors',\n 'hover:bg-surface-hover data-[state=selected]:bg-accent-bg',\n className,\n )}\n {...props}\n />\n ),\n)\nTableRow.displayName = 'TableRow'\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, React.ThHTMLAttributes<HTMLTableCellElement>>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-4 text-left align-middle',\n 'text-xs font-semibold uppercase tracking-wide text-text-dim',\n '[&:has([role=checkbox])]:pr-0',\n className,\n )}\n {...props}\n />\n ),\n)\nTableHead.displayName = 'TableHead'\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn('p-3 align-middle [&:has([role=checkbox])]:pr-0', className)}\n {...props}\n />\n ),\n)\nTableCell.displayName = 'TableCell'\n\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption ref={ref} className={cn('mt-4 text-sm text-text-dim', className)} {...props} />\n ),\n)\nTableCaption.displayName = 'TableCaption'\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }\n"],"names":["Table","React.forwardRef","className","props","ref","jsx","cn","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption"],"mappings":"uFAcA,MAAMA,EAAQC,EAAAA,WACZ,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,MAAC,MAAA,CAAI,UAAU,yBACb,SAAAA,EAAAA,IAAC,QAAA,CACC,IAAAD,EACA,UAAWE,EAAG,gCAAiCJ,CAAS,EACvD,GAAGC,CAAA,CAAA,CACN,CACF,CAEJ,EACAH,EAAM,YAAc,QAEpB,MAAMO,EAAcN,EAAAA,WAClB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,QAAA,CAAM,IAAAD,EAAU,UAAWE,EAAG,oDAAqDJ,CAAS,EAAI,GAAGC,CAAA,CAAO,CAE/G,EACAI,EAAY,YAAc,cAE1B,MAAMC,EAAYP,EAAAA,WAChB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,QAAA,CAAM,IAAAD,EAAU,UAAWE,EAAG,6BAA8BJ,CAAS,EAAI,GAAGC,CAAA,CAAO,CAExF,EACAK,EAAU,YAAc,YAExB,MAAMC,EAAcR,EAAAA,WAClB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,QAAA,CACC,IAAAD,EACA,UAAWE,EACT,yEACAJ,CAAA,EAED,GAAGC,CAAA,CAAA,CAGV,EACAM,EAAY,YAAc,cAE1B,MAAMC,EAAWT,EAAAA,WACf,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,KAAA,CACC,IAAAD,EACA,UAAWE,EACT,2CACA,4DACAJ,CAAA,EAED,GAAGC,CAAA,CAAA,CAGV,EACAO,EAAS,YAAc,WAEvB,MAAMC,EAAYV,EAAAA,WAChB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,KAAA,CACC,IAAAD,EACA,UAAWE,EACT,mCACA,8DACA,gCACAJ,CAAA,EAED,GAAGC,CAAA,CAAA,CAGV,EACAQ,EAAU,YAAc,YAExB,MAAMC,EAAYX,EAAAA,WAChB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,KAAA,CACC,IAAAD,EACA,UAAWE,EAAG,iDAAkDJ,CAAS,EACxE,GAAGC,CAAA,CAAA,CAGV,EACAS,EAAU,YAAc,YAExB,MAAMC,EAAeZ,EAAAA,WACnB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IACxBC,EAAAA,IAAC,UAAA,CAAQ,IAAAD,EAAU,UAAWE,EAAG,6BAA8BJ,CAAS,EAAI,GAAGC,CAAA,CAAO,CAE1F,EACAU,EAAa,YAAc"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{n as S,u as w,e as M,j as e,B as L,L as p,S as j,f as u,g as f,h as N,i as b}from"./index-
|
|
1
|
+
import{n as S,u as w,e as M,j as e,B as L,L as p,S as j,f as u,g as f,h as N,i as b}from"./index-wVLKSZpI.js";import{E as R}from"./empty-state-Bzkp-ADK.js";import{T as V,a as $,b as g,c as l,d as E,e as c}from"./table-DVQPjWsi.js";import{a as F}from"./use-observability-CMUSiy5z.js";import{L as I}from"./loader-circle-DPc6botW.js";import{R as P}from"./refresh-ccw-C2Q06LWj.js";import"./react-Cb2sDjhD.js";import"./useQuery-II-YwTUw.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 B=S("ChartColumn",[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]]),z=["user","agent","platform","intent"],H=["cost","calls","errors","avg_latency"];function K(){const{t:a}=w(["observability","common"]),[n,y]=M(),v=Math.max(1,Number(n.get("days"))||7),i=n.get("dim")??"agent",r=n.get("by")??"cost";function m(s){const t=new URLSearchParams(n);for(const[x,h]of Object.entries(s))h==null?t.delete(x):t.set(x,h);y(t,{replace:!0})}const{data:C,isLoading:T,isFetching:o,refetch:k}=F({dim:i,by:r,days:v,limit:20}),d=C?.items??[];return e.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[e.jsx("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:a("topn.title")}),e.jsxs(L,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>k(),disabled:o,"aria-label":a("actions.refresh",{ns:"common"}),children:[o?e.jsx(I,{className:"h-4 w-4 animate-spin"}):e.jsx(P,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:a("actions.refresh",{ns:"common"})})]})]})}),e.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(p,{htmlFor:"dim",className:"text-xs text-text-dim",children:a("topn.filter.dim")}),e.jsxs(j,{value:i,onValueChange:s=>m({dim:s==="agent"?null:s}),children:[e.jsx(u,{id:"dim",className:"w-32",children:e.jsx(f,{})}),e.jsx(N,{children:z.map(s=>e.jsx(b,{value:s,children:a(`topn.dim.${s}`)},s))})]})]}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(p,{htmlFor:"by",className:"text-xs text-text-dim",children:a("topn.filter.metric")}),e.jsxs(j,{value:r,onValueChange:s=>m({by:s==="cost"?null:s}),children:[e.jsx(u,{id:"by",className:"w-36",children:e.jsx(f,{})}),e.jsx(N,{children:H.map(s=>e.jsx(b,{value:s,children:a(`topn.metric.${s}`)},s))})]})]})]}),T?e.jsx("div",{className:"h-48 w-full rounded-md bg-surface-2 animate-pulse"}):d.length===0?e.jsx(R,{icon:e.jsx(B,{}),title:a("topn.empty.title"),description:a("topn.empty.description")}):e.jsxs(V,{children:[e.jsx($,{children:e.jsxs(g,{children:[e.jsx(l,{className:"w-12",children:a("topn.col.rank")}),e.jsx(l,{children:a("topn.col.key")}),e.jsx(l,{className:"w-24",children:a("topn.col.calls")}),e.jsx(l,{className:"w-24",children:a("topn.col.cost")}),e.jsx(l,{className:"w-24",children:a("topn.col.errors")}),e.jsx(l,{className:"w-32",children:a("topn.col.avgLatencyMs")})]})}),e.jsx(E,{children:d.map((s,t)=>e.jsxs(g,{children:[e.jsx(c,{className:"tabular-nums text-text-dim",children:t+1}),e.jsx(c,{className:"font-medium",children:s.key}),e.jsx(c,{className:"tabular-nums",children:s.calls}),e.jsxs(c,{className:"tabular-nums",children:["$",s.cost.toFixed(4)]}),e.jsx(c,{className:"tabular-nums",children:e.jsx("span",{className:s.errors>0?"text-danger":"text-text-dim",children:s.errors})}),e.jsxs(c,{className:"tabular-nums",children:[Math.round(s.avgLatencyMs),"ms"]})]},`${s.key}-${t}`))})]})]})}export{K as default};
|
|
7
|
-
//# sourceMappingURL=topn-
|
|
7
|
+
//# sourceMappingURL=topn-Cs-wP6Tf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topn-NGtwNz38.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chart-column.js","../../src/routes/observability/topn.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 ChartColumn = createLucideIcon(\"ChartColumn\", [\n [\"path\", { d: \"M3 3v16a2 2 0 0 0 2 2h16\", key: \"c24i48\" }],\n [\"path\", { d: \"M18 17V9\", key: \"2bz60n\" }],\n [\"path\", { d: \"M13 17V5\", key: \"1frdt8\" }],\n [\"path\", { d: \"M8 17v-3\", key: \"17ska0\" }]\n]);\n\nexport { ChartColumn as default };\n//# sourceMappingURL=chart-column.js.map\n","/**\n * /observability/topn — leaderboard grouped by a dimension, sorted\n * by a metric. Dim + metric live in URL state alongside the\n * layout's ?days= so the URL fully describes the view.\n */\n\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { BarChart3, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { EmptyState } from '@/components/common/empty-state'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table'\nimport { Button } from '@/components/ui/button'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useTopN } from '@/hooks/use-observability'\nimport type { TopNDim, TopNMetric } from '@/types/api'\n\nconst DIMS: TopNDim[] = ['user', 'agent', 'platform', 'intent']\nconst METRICS: TopNMetric[] = ['cost', 'calls', 'errors', 'avg_latency']\n\nexport default function ObservabilityTopNRoute(): JSX.Element {\n const { t } = useTranslation(['observability', 'common'])\n const [params, setParams] = useSearchParams()\n const days = Math.max(1, Number(params.get('days')) || 7)\n const dim = (params.get('dim') as TopNDim | null) ?? 'agent'\n const by = (params.get('by') as TopNMetric | null) ?? 'cost'\n\n function patchParams(patch: Record<string, string | null>): void {\n const next = new URLSearchParams(params)\n for (const [k, v] of Object.entries(patch)) {\n if (v == null) next.delete(k)\n else next.set(k, v)\n }\n setParams(next, { replace: true })\n }\n\n const { data, isLoading, isFetching, refetch } = useTopN({ dim, by, days, limit: 20 })\n const items = data?.items ?? []\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('topn.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {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 </header>\n\n {/* Filter row */}\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"dim\" className=\"text-xs text-text-dim\">{t('topn.filter.dim')}</Label>\n <Select value={dim} onValueChange={(v) => patchParams({ dim: v === 'agent' ? null : v })}>\n <SelectTrigger id=\"dim\" className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {DIMS.map((d) => (\n <SelectItem key={d} value={d}>{t(`topn.dim.${d}`)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"by\" className=\"text-xs text-text-dim\">{t('topn.filter.metric')}</Label>\n <Select value={by} onValueChange={(v) => patchParams({ by: v === 'cost' ? null : v })}>\n <SelectTrigger id=\"by\" className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {METRICS.map((m) => (\n <SelectItem key={m} value={m}>{t(`topn.metric.${m}`)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {isLoading ? (\n <div className=\"h-48 w-full rounded-md bg-surface-2 animate-pulse\" />\n ) : items.length === 0 ? (\n <EmptyState\n icon={<BarChart3 />}\n title={t('topn.empty.title')}\n description={t('topn.empty.description')}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-12\">{t('topn.col.rank')}</TableHead>\n <TableHead>{t('topn.col.key')}</TableHead>\n <TableHead className=\"w-24\">{t('topn.col.calls')}</TableHead>\n <TableHead className=\"w-24\">{t('topn.col.cost')}</TableHead>\n <TableHead className=\"w-24\">{t('topn.col.errors')}</TableHead>\n <TableHead className=\"w-32\">{t('topn.col.avgLatencyMs')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.map((row, i) => (\n <TableRow key={`${row.key}-${i}`}>\n <TableCell className=\"tabular-nums text-text-dim\">{i + 1}</TableCell>\n <TableCell className=\"font-medium\">{row.key}</TableCell>\n <TableCell className=\"tabular-nums\">{row.calls}</TableCell>\n <TableCell className=\"tabular-nums\">${row.cost.toFixed(4)}</TableCell>\n <TableCell className=\"tabular-nums\">\n <span className={row.errors > 0 ? 'text-danger' : 'text-text-dim'}>{row.errors}</span>\n </TableCell>\n <TableCell className=\"tabular-nums\">{Math.round(row.avgLatencyMs)}ms</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </div>\n )\n}\n"],"names":["ChartColumn","createLucideIcon","DIMS","METRICS","ObservabilityTopNRoute","t","useTranslation","params","setParams","useSearchParams","days","dim","by","patchParams","patch","next","k","v","data","isLoading","isFetching","refetch","useTopN","items","jsxs","jsx","Button","Loader2","RefreshCcw","Label","Select","SelectTrigger","SelectValue","SelectContent","d","SelectItem","m","EmptyState","BarChart3","Table","TableHeader","TableRow","TableHead","TableBody","row","i","TableCell"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"topn-Cs-wP6Tf.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chart-column.js","../../src/routes/observability/topn.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 ChartColumn = createLucideIcon(\"ChartColumn\", [\n [\"path\", { d: \"M3 3v16a2 2 0 0 0 2 2h16\", key: \"c24i48\" }],\n [\"path\", { d: \"M18 17V9\", key: \"2bz60n\" }],\n [\"path\", { d: \"M13 17V5\", key: \"1frdt8\" }],\n [\"path\", { d: \"M8 17v-3\", key: \"17ska0\" }]\n]);\n\nexport { ChartColumn as default };\n//# sourceMappingURL=chart-column.js.map\n","/**\n * /observability/topn — leaderboard grouped by a dimension, sorted\n * by a metric. Dim + metric live in URL state alongside the\n * layout's ?days= so the URL fully describes the view.\n */\n\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { BarChart3, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { EmptyState } from '@/components/common/empty-state'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table'\nimport { Button } from '@/components/ui/button'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useTopN } from '@/hooks/use-observability'\nimport type { TopNDim, TopNMetric } from '@/types/api'\n\nconst DIMS: TopNDim[] = ['user', 'agent', 'platform', 'intent']\nconst METRICS: TopNMetric[] = ['cost', 'calls', 'errors', 'avg_latency']\n\nexport default function ObservabilityTopNRoute(): JSX.Element {\n const { t } = useTranslation(['observability', 'common'])\n const [params, setParams] = useSearchParams()\n const days = Math.max(1, Number(params.get('days')) || 7)\n const dim = (params.get('dim') as TopNDim | null) ?? 'agent'\n const by = (params.get('by') as TopNMetric | null) ?? 'cost'\n\n function patchParams(patch: Record<string, string | null>): void {\n const next = new URLSearchParams(params)\n for (const [k, v] of Object.entries(patch)) {\n if (v == null) next.delete(k)\n else next.set(k, v)\n }\n setParams(next, { replace: true })\n }\n\n const { data, isLoading, isFetching, refetch } = useTopN({ dim, by, days, limit: 20 })\n const items = data?.items ?? []\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('topn.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => refetch()}\n disabled={isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {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 </header>\n\n {/* Filter row */}\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"dim\" className=\"text-xs text-text-dim\">{t('topn.filter.dim')}</Label>\n <Select value={dim} onValueChange={(v) => patchParams({ dim: v === 'agent' ? null : v })}>\n <SelectTrigger id=\"dim\" className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {DIMS.map((d) => (\n <SelectItem key={d} value={d}>{t(`topn.dim.${d}`)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"by\" className=\"text-xs text-text-dim\">{t('topn.filter.metric')}</Label>\n <Select value={by} onValueChange={(v) => patchParams({ by: v === 'cost' ? null : v })}>\n <SelectTrigger id=\"by\" className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {METRICS.map((m) => (\n <SelectItem key={m} value={m}>{t(`topn.metric.${m}`)}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {isLoading ? (\n <div className=\"h-48 w-full rounded-md bg-surface-2 animate-pulse\" />\n ) : items.length === 0 ? (\n <EmptyState\n icon={<BarChart3 />}\n title={t('topn.empty.title')}\n description={t('topn.empty.description')}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-12\">{t('topn.col.rank')}</TableHead>\n <TableHead>{t('topn.col.key')}</TableHead>\n <TableHead className=\"w-24\">{t('topn.col.calls')}</TableHead>\n <TableHead className=\"w-24\">{t('topn.col.cost')}</TableHead>\n <TableHead className=\"w-24\">{t('topn.col.errors')}</TableHead>\n <TableHead className=\"w-32\">{t('topn.col.avgLatencyMs')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.map((row, i) => (\n <TableRow key={`${row.key}-${i}`}>\n <TableCell className=\"tabular-nums text-text-dim\">{i + 1}</TableCell>\n <TableCell className=\"font-medium\">{row.key}</TableCell>\n <TableCell className=\"tabular-nums\">{row.calls}</TableCell>\n <TableCell className=\"tabular-nums\">${row.cost.toFixed(4)}</TableCell>\n <TableCell className=\"tabular-nums\">\n <span className={row.errors > 0 ? 'text-danger' : 'text-text-dim'}>{row.errors}</span>\n </TableCell>\n <TableCell className=\"tabular-nums\">{Math.round(row.avgLatencyMs)}ms</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </div>\n )\n}\n"],"names":["ChartColumn","createLucideIcon","DIMS","METRICS","ObservabilityTopNRoute","t","useTranslation","params","setParams","useSearchParams","days","dim","by","patchParams","patch","next","k","v","data","isLoading","isFetching","refetch","useTopN","items","jsxs","jsx","Button","Loader2","RefreshCcw","Label","Select","SelectTrigger","SelectValue","SelectContent","d","SelectItem","m","EmptyState","BarChart3","Table","TableHeader","TableRow","TableHead","TableBody","row","i","TableCell"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{n as e}from"./index-
|
|
1
|
+
import{n as e}from"./index-wVLKSZpI.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 t=e("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);export{t as T};
|
|
7
|
-
//# sourceMappingURL=trash-2-
|
|
7
|
+
//# sourceMappingURL=trash-2-BXhBc6TL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trash-2-
|
|
1
|
+
{"version":3,"file":"trash-2-BXhBc6TL.js","sources":["../../node_modules/lucide-react/dist/esm/icons/trash-2.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 Trash2 = createLucideIcon(\"Trash2\", [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n]);\n\nexport { Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n"],"names":["Trash2","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,wCAAyC,IAAK,QAAQ,CAAE,EACtE,CAAC,OAAQ,CAAE,EAAG,qCAAsC,IAAK,QAAQ,CAAE,EACnE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,QAAQ,CAAE,EAClE,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,OAAO,CAAE,CACnE,CAAC","x_google_ignoreList":[0]}
|
package/dist/web/public/assets/{use-background-tasks-CY2gWPBZ.js → use-background-tasks-DWe_iYgk.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as s}from"./useQuery-
|
|
2
|
-
//# sourceMappingURL=use-background-tasks-
|
|
1
|
+
import{u as s}from"./useQuery-II-YwTUw.js";import{a as i,b as l,o as a}from"./index-wVLKSZpI.js";const r={all:["heartbeat"],list:["heartbeat","list"]};function c(e){return`${e.platform}:${e.channelId}:${e.threadId}`}function g(){return s({queryKey:r.list,queryFn:()=>a.get("/api/heartbeat/bindings"),refetchInterval:1e4,refetchIntervalInBackground:!1})}function p(){const e=i();return l({mutationFn:({row:t,op:n})=>a.post(`/api/heartbeat/bindings/${encodeURIComponent(c(t))}/${n}`),onSuccess:()=>e.invalidateQueries({queryKey:r.all})})}const u={all:["goals"],list:["goals","list"]};function h(){return s({queryKey:u.list,queryFn:()=>a.get("/api/goals"),refetchInterval:3e4})}function m(){const e=i();return l({mutationFn:({id:t,status:n})=>a.put(`/api/goals/${t}/status`,{body:{status:n}}),onSuccess:()=>e.invalidateQueries({queryKey:u.all})})}const o={all:["asks"],list:["asks","list"]};function q(){return s({queryKey:o.list,queryFn:()=>a.get("/api/asks/pending"),refetchInterval:5e3})}function K(){const e=i();return l({mutationFn:t=>a.post(`/api/asks/pending/${encodeURIComponent(t)}/cancel`),onSuccess:()=>e.invalidateQueries({queryKey:o.all})})}const y={all:["plans"],list:(e,t)=>["plans","list",e??null,t??null]};function b(e={}){const t=new URLSearchParams;e.threadKey&&t.set("thread_key",e.threadKey),e.limit!=null&&t.set("limit",String(e.limit));const n=t.toString();return s({queryKey:y.list(e.threadKey,e.limit),queryFn:()=>a.get(`/api/plans${n?`?${n}`:""}`)})}export{p as a,h as b,m as c,q as d,K as e,b as f,g as u};
|
|
2
|
+
//# sourceMappingURL=use-background-tasks-DWe_iYgk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-background-tasks-
|
|
1
|
+
{"version":3,"file":"use-background-tasks-DWe_iYgk.js","sources":["../../src/hooks/use-background-tasks.ts"],"sourcesContent":["/**\n * use-background-tasks — react-query hooks for the P1 follow-up\n * admin panels (heartbeat / goals / asks).\n *\n * All three sit under the same `/tasks/*` SPA group + share polling\n * intervals because operators tend to flip between them. Each list\n * polls every 10s while foreground so live activity (a new ask\n * landing, a heartbeat tick completing) shows up without a manual\n * refresh.\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { client } from '@/lib/api/client'\n\n// ─── Heartbeat ──────────────────────────────────────────────────\n\nexport interface HeartbeatRow {\n platform: string\n channelId: string\n threadId: string\n userId: string\n body: string\n intervalMinutes: number\n enabled: boolean\n lastTickAt: string | null\n lastStatus: string\n lastReason: string\n lastTextPreview: string\n createdAt: string\n}\n\nexport interface HeartbeatListResponse {\n bindings: HeartbeatRow[]\n count: number\n}\n\nconst hbKeys = {\n all: ['heartbeat'] as const,\n list: ['heartbeat', 'list'] as const,\n}\n\nfunction bindingKey(r: { platform: string; channelId: string; threadId: string }): string {\n return `${r.platform}:${r.channelId}:${r.threadId}`\n}\n\nexport function useHeartbeatList() {\n return useQuery<HeartbeatListResponse>({\n queryKey: hbKeys.list,\n queryFn: () => client.get<HeartbeatListResponse>('/api/heartbeat/bindings'),\n refetchInterval: 10_000,\n refetchIntervalInBackground: false,\n })\n}\n\nexport function useHeartbeatToggle() {\n const qc = useQueryClient()\n return useMutation<unknown, Error, { row: HeartbeatRow; op: 'enable' | 'disable' }>({\n mutationFn: ({ row, op }) => client.post(\n `/api/heartbeat/bindings/${encodeURIComponent(bindingKey(row))}/${op}`,\n ),\n onSuccess: () => qc.invalidateQueries({ queryKey: hbKeys.all }),\n })\n}\n\n// ─── Goals ──────────────────────────────────────────────────────\n\nexport interface GoalRow {\n id: number\n platform: string\n channelId: string\n threadId: string\n userId: string\n title: string\n body: string\n status: 'active' | 'paused' | 'completed' | 'cancelled'\n progressLog: Array<{ ts: string; by: string; text: string }>\n progressCount: number\n createdAt: string\n updatedAt: string\n closedAt: string | null\n}\n\nexport interface GoalsListResponse {\n goals: GoalRow[]\n count: number\n scope: 'all-active' | 'thread'\n}\n\nconst goalKeys = {\n all: ['goals'] as const,\n list: ['goals', 'list'] as const,\n}\n\nexport function useGoalsList() {\n return useQuery<GoalsListResponse>({\n queryKey: goalKeys.list,\n queryFn: () => client.get<GoalsListResponse>('/api/goals'),\n refetchInterval: 30_000,\n })\n}\n\nexport function useGoalUpdateStatus() {\n const qc = useQueryClient()\n return useMutation<unknown, Error, { id: number; status: GoalRow['status'] }>({\n mutationFn: ({ id, status }) => client.put(\n `/api/goals/${id}/status`, { body: { status } },\n ),\n onSuccess: () => qc.invalidateQueries({ queryKey: goalKeys.all }),\n })\n}\n\n// ─── Pending asks ───────────────────────────────────────────────\n\nexport interface PendingAskRow {\n reqId: string\n platform: string\n threadId: string\n question: string\n choices: number\n ageMs: number\n}\n\nexport interface AsksListResponse {\n pending: PendingAskRow[]\n count: number\n}\n\nconst askKeys = {\n all: ['asks'] as const,\n list: ['asks', 'list'] as const,\n}\n\nexport function useAsksList() {\n return useQuery<AsksListResponse>({\n queryKey: askKeys.list,\n queryFn: () => client.get<AsksListResponse>('/api/asks/pending'),\n refetchInterval: 5_000, // asks are short-lived; poll faster\n })\n}\n\nexport function useAskCancel() {\n const qc = useQueryClient()\n return useMutation<unknown, Error, string>({\n mutationFn: (reqId) => client.post(`/api/asks/pending/${encodeURIComponent(reqId)}/cancel`),\n onSuccess: () => qc.invalidateQueries({ queryKey: askKeys.all }),\n })\n}\n\n// ─── Plan history (v1.2.133) ────────────────────────────────────\n\nexport type PlanOutcome = 'approved' | 'rejected' | 'edited' | 'expired'\n\nexport interface PlanHistoryRow {\n id: number\n threadKey: string\n planMd: string\n outcome: PlanOutcome\n detail: string | null\n resolvedAt: string\n pendingMs: number | null\n}\n\nexport interface PlansListResponse {\n plans: PlanHistoryRow[]\n total: number\n}\n\nconst planKeys = {\n all: ['plans'] as const,\n list: (threadKey?: string, limit?: number) =>\n ['plans', 'list', threadKey ?? null, limit ?? null] as const,\n}\n\n/** GET /api/plans — admin list of native_exit_plan_mode handshakes\n * with outcome + pending duration + the plan markdown. Filters on\n * thread_key (optional) and limit (clamped 1..500 server-side). */\nexport function usePlansList(opts: { threadKey?: string; limit?: number } = {}) {\n const params = new URLSearchParams()\n if (opts.threadKey) params.set('thread_key', opts.threadKey)\n if (opts.limit != null) params.set('limit', String(opts.limit))\n const qs = params.toString()\n return useQuery<PlansListResponse>({\n queryKey: planKeys.list(opts.threadKey, opts.limit),\n queryFn: () => client.get<PlansListResponse>(`/api/plans${qs ? `?${qs}` : ''}`),\n })\n}\n"],"names":["hbKeys","bindingKey","r","useHeartbeatList","useQuery","client","useHeartbeatToggle","qc","useQueryClient","useMutation","row","op","goalKeys","useGoalsList","useGoalUpdateStatus","id","status","askKeys","useAsksList","useAskCancel","reqId","planKeys","threadKey","limit","usePlansList","opts","params","qs"],"mappings":"iGAoCA,MAAMA,EAAS,CACb,IAAM,CAAC,WAAW,EAClB,KAAM,CAAC,YAAa,MAAM,CAC5B,EAEA,SAASC,EAAWC,EAAsE,CACxF,MAAO,GAAGA,EAAE,QAAQ,IAAIA,EAAE,SAAS,IAAIA,EAAE,QAAQ,EACnD,CAEO,SAASC,GAAmB,CACjC,OAAOC,EAAgC,CACrC,SAAUJ,EAAO,KACjB,QAAS,IAAMK,EAAO,IAA2B,yBAAyB,EAC1E,gBAAiB,IACjB,4BAA6B,EAAA,CAC9B,CACH,CAEO,SAASC,GAAqB,CACnC,MAAMC,EAAKC,EAAA,EACX,OAAOC,EAA6E,CAClF,WAAY,CAAC,CAAE,IAAAC,EAAK,GAAAC,CAAA,IAASN,EAAO,KAClC,2BAA2B,mBAAmBJ,EAAWS,CAAG,CAAC,CAAC,IAAIC,CAAE,EAAA,EAEtE,UAAW,IAAMJ,EAAG,kBAAkB,CAAE,SAAUP,EAAO,IAAK,CAAA,CAC/D,CACH,CA0BA,MAAMY,EAAW,CACf,IAAM,CAAC,OAAO,EACd,KAAM,CAAC,QAAS,MAAM,CACxB,EAEO,SAASC,GAAe,CAC7B,OAAOT,EAA4B,CACjC,SAAUQ,EAAS,KACnB,QAAS,IAAMP,EAAO,IAAuB,YAAY,EACzD,gBAAiB,GAAA,CAClB,CACH,CAEO,SAASS,GAAsB,CACpC,MAAMP,EAAKC,EAAA,EACX,OAAOC,EAAuE,CAC5E,WAAY,CAAC,CAAE,GAAAM,EAAI,OAAAC,CAAA,IAAaX,EAAO,IACrC,cAAcU,CAAE,UAAW,CAAE,KAAM,CAAE,OAAAC,CAAA,CAAO,CAAE,EAEhD,UAAW,IAAMT,EAAG,kBAAkB,CAAE,SAAUK,EAAS,IAAK,CAAA,CACjE,CACH,CAkBA,MAAMK,EAAU,CACd,IAAM,CAAC,MAAM,EACb,KAAM,CAAC,OAAQ,MAAM,CACvB,EAEO,SAASC,GAAc,CAC5B,OAAOd,EAA2B,CAChC,SAAUa,EAAQ,KAClB,QAAS,IAAMZ,EAAO,IAAsB,mBAAmB,EAC/D,gBAAiB,GAAA,CAClB,CACH,CAEO,SAASc,GAAe,CAC7B,MAAMZ,EAAKC,EAAA,EACX,OAAOC,EAAoC,CACzC,WAAaW,GAAUf,EAAO,KAAK,qBAAqB,mBAAmBe,CAAK,CAAC,SAAS,EAC1F,UAAW,IAAMb,EAAG,kBAAkB,CAAE,SAAUU,EAAQ,IAAK,CAAA,CAChE,CACH,CAqBA,MAAMI,EAAW,CACf,IAAM,CAAC,OAAO,EACd,KAAM,CAACC,EAAoBC,IACzB,CAAC,QAAS,OAAQD,GAAa,KAAMC,GAAS,IAAI,CACtD,EAKO,SAASC,EAAaC,EAA+C,GAAI,CAC9E,MAAMC,EAAS,IAAI,gBACfD,EAAK,WAAWC,EAAO,IAAI,aAAcD,EAAK,SAAS,EACvDA,EAAK,OAAS,MAAMC,EAAO,IAAI,QAAS,OAAOD,EAAK,KAAK,CAAC,EAC9D,MAAME,EAAKD,EAAO,SAAA,EAClB,OAAOtB,EAA4B,CACjC,SAAUiB,EAAS,KAAKI,EAAK,UAAWA,EAAK,KAAK,EAClD,QAAS,IAAMpB,EAAO,IAAuB,aAAasB,EAAK,IAAIA,CAAE,GAAK,EAAE,EAAE,CAAA,CAC/E,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as c}from"./useQuery-
|
|
2
|
-
//# sourceMappingURL=use-llm-admin-
|
|
1
|
+
import{u as c}from"./useQuery-II-YwTUw.js";import{a as u,b as s,o as t}from"./index-wVLKSZpI.js";const a={all:["llm"],list:["llm","list"]};function r(){return c({queryKey:a.list,queryFn:()=>t.get("/api/llm")})}function m(){const e=u();return s({mutationFn:n=>t.post("/api/llm/backends",{body:n}),onSuccess:()=>e.invalidateQueries({queryKey:a.all})})}function p(){const e=u();return s({mutationFn:n=>t.delete(`/api/llm/backends/${encodeURIComponent(n)}`),onSuccess:()=>e.invalidateQueries({queryKey:a.all})})}function d(){const e=u();return s({mutationFn:n=>t.put("/api/llm/roles",{body:n}),onSuccess:()=>e.invalidateQueries({queryKey:a.all})})}function y(){return s({mutationFn:e=>t.post(`/api/llm/backends/${encodeURIComponent(e)}/ping`)})}const i={all:["mcp"],list:["mcp","list"]};function q(){return c({queryKey:i.list,queryFn:()=>t.get("/api/mcp")})}function v(){const e=u();return s({mutationFn:n=>t.post("/api/mcp/servers",{body:n}),onSuccess:()=>e.invalidateQueries({queryKey:i.all})})}function f(){const e=u();return s({mutationFn:n=>t.delete(`/api/mcp/servers/${encodeURIComponent(n)}`),onSuccess:()=>e.invalidateQueries({queryKey:i.all})})}function K(){const e=u();return s({mutationFn:n=>t.post(`/api/mcp/servers/${encodeURIComponent(n)}/health`),onSuccess:()=>e.invalidateQueries({queryKey:i.all})})}export{p as a,y as b,d as c,m as d,q as e,f,K as g,v as h,r as u};
|
|
2
|
+
//# sourceMappingURL=use-llm-admin-SE-2iSIe.js.map
|
package/dist/web/public/assets/{use-llm-admin-CA5tUbEU.js.map → use-llm-admin-SE-2iSIe.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-llm-admin-
|
|
1
|
+
{"version":3,"file":"use-llm-admin-SE-2iSIe.js","sources":["../../src/hooks/use-llm-admin.ts"],"sourcesContent":["/**\n * use-llm-admin / use-mcp-admin — react-query wrappers for the\n * Stage 6 LLM + MCP configuration REST surfaces.\n *\n * Intentionally NOT generated through endpoints.json — the panels are\n * the only consumers, the shapes are small, and a hand-written hook\n * keeps the diff manageable without churning the generated endpoints\n * file. When the panels stabilize we can promote them to endpoints.json\n * for type-checked round-tripping.\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { client } from '@/lib/api/client'\n\n// ─── LLM types (mirror the backend wire shapes) ──────────────────\n\nexport interface LlmBackendRow {\n name: string\n provider: 'openai-compat' | 'anthropic'\n baseUrl?: string\n model: string\n secret: { source: 'env' | 'file' | 'none'; envKey: string }\n}\n\nexport interface LlmListResponse {\n backends: LlmBackendRow[]\n roles: Record<string, string>\n}\n\nexport interface LlmAddBody {\n name: string\n provider: 'openai-compat' | 'anthropic'\n baseUrl: string\n model: string\n apiKey?: string\n}\n\nexport interface LlmPingResponse {\n name: string\n ok: boolean\n durationMs?: number\n tokensIn?: number\n tokensOut?: number\n sampleText?: string\n error?: string\n}\n\nconst llmKeys = {\n all: ['llm'] as const,\n list: ['llm', 'list'] as const,\n}\n\nexport function useLlmList() {\n return useQuery<LlmListResponse>({\n queryKey: llmKeys.list,\n queryFn: () => client.get<LlmListResponse>('/api/llm'),\n })\n}\n\nexport function useLlmAddBackend() {\n const qc = useQueryClient()\n return useMutation<{ name: string; secretStored: boolean }, Error, LlmAddBody>({\n mutationFn: (body) => client.post('/api/llm/backends', { body }),\n onSuccess: () => qc.invalidateQueries({ queryKey: llmKeys.all }),\n })\n}\n\nexport function useLlmRemoveBackend() {\n const qc = useQueryClient()\n return useMutation<{ removedRoles: number }, Error, string>({\n mutationFn: (name) => client.delete(`/api/llm/backends/${encodeURIComponent(name)}`),\n onSuccess: () => qc.invalidateQueries({ queryKey: llmKeys.all }),\n })\n}\n\nexport function useLlmPutRoles() {\n const qc = useQueryClient()\n return useMutation<{ roles: Record<string, string> }, Error, Record<string, string | null>>({\n mutationFn: (body) => client.put('/api/llm/roles', { body }),\n onSuccess: () => qc.invalidateQueries({ queryKey: llmKeys.all }),\n })\n}\n\nexport function useLlmSetSecret() {\n const qc = useQueryClient()\n return useMutation<{ name: string; source: 'env' | 'file' | 'none' }, Error, { name: string; apiKey: string }>({\n mutationFn: ({ name, apiKey }) => client.post(\n `/api/llm/secrets/${encodeURIComponent(name)}`, { body: { apiKey } },\n ),\n onSuccess: () => qc.invalidateQueries({ queryKey: llmKeys.all }),\n })\n}\n\nexport function useLlmPing() {\n return useMutation<LlmPingResponse, Error, string>({\n mutationFn: (name) => client.post(`/api/llm/backends/${encodeURIComponent(name)}/ping`),\n })\n}\n\n// ─── MCP types (mirror the backend wire shapes) ──────────────────\n\nexport interface McpServerRow {\n name: string\n command?: string\n args?: string[]\n url?: string\n enabled?: boolean\n}\n\nexport interface McpRuntime {\n servers: Array<{ name: string; connected: boolean; toolCount: number; error?: string }>\n totalTools: number\n}\n\nexport interface McpListResponse {\n servers: McpServerRow[]\n runtime: McpRuntime\n}\n\nexport interface McpAddBody {\n name: string\n command?: string\n args?: string[]\n env?: Record<string, string>\n url?: string\n headers?: Record<string, string>\n enabled?: boolean\n}\n\nexport interface McpHealthResponse {\n name: string\n connected: boolean\n toolCount: number\n lastError?: string\n}\n\nconst mcpKeys = {\n all: ['mcp'] as const,\n list: ['mcp', 'list'] as const,\n}\n\nexport function useMcpList() {\n return useQuery<McpListResponse>({\n queryKey: mcpKeys.list,\n queryFn: () => client.get<McpListResponse>('/api/mcp'),\n })\n}\n\nexport function useMcpAddServer() {\n const qc = useQueryClient()\n return useMutation<{ name: string }, Error, McpAddBody>({\n mutationFn: (body) => client.post('/api/mcp/servers', { body }),\n onSuccess: () => qc.invalidateQueries({ queryKey: mcpKeys.all }),\n })\n}\n\nexport function useMcpRemoveServer() {\n const qc = useQueryClient()\n return useMutation<{ name: string }, Error, string>({\n mutationFn: (name) => client.delete(`/api/mcp/servers/${encodeURIComponent(name)}`),\n onSuccess: () => qc.invalidateQueries({ queryKey: mcpKeys.all }),\n })\n}\n\nexport function useMcpHealth() {\n const qc = useQueryClient()\n return useMutation<McpHealthResponse, Error, string>({\n mutationFn: (name) => client.post(`/api/mcp/servers/${encodeURIComponent(name)}/health`),\n onSuccess: () => qc.invalidateQueries({ queryKey: mcpKeys.all }),\n })\n}\n"],"names":["llmKeys","useLlmList","useQuery","client","useLlmAddBackend","qc","useQueryClient","useMutation","body","useLlmRemoveBackend","name","useLlmPutRoles","useLlmPing","mcpKeys","useMcpList","useMcpAddServer","useMcpRemoveServer","useMcpHealth"],"mappings":"iGA+CA,MAAMA,EAAU,CACd,IAAM,CAAC,KAAK,EACZ,KAAM,CAAC,MAAO,MAAM,CACtB,EAEO,SAASC,GAAa,CAC3B,OAAOC,EAA0B,CAC/B,SAAUF,EAAQ,KAClB,QAAS,IAAMG,EAAO,IAAqB,UAAU,CAAA,CACtD,CACH,CAEO,SAASC,GAAmB,CACjC,MAAMC,EAAKC,EAAA,EACX,OAAOC,EAAwE,CAC7E,WAAaC,GAASL,EAAO,KAAK,oBAAqB,CAAE,KAAAK,EAAM,EAC/D,UAAW,IAAMH,EAAG,kBAAkB,CAAE,SAAUL,EAAQ,IAAK,CAAA,CAChE,CACH,CAEO,SAASS,GAAsB,CACpC,MAAMJ,EAAKC,EAAA,EACX,OAAOC,EAAqD,CAC1D,WAAaG,GAASP,EAAO,OAAO,qBAAqB,mBAAmBO,CAAI,CAAC,EAAE,EACnF,UAAW,IAAML,EAAG,kBAAkB,CAAE,SAAUL,EAAQ,IAAK,CAAA,CAChE,CACH,CAEO,SAASW,GAAiB,CAC/B,MAAMN,EAAKC,EAAA,EACX,OAAOC,EAAqF,CAC1F,WAAaC,GAASL,EAAO,IAAI,iBAAkB,CAAE,KAAAK,EAAM,EAC3D,UAAW,IAAMH,EAAG,kBAAkB,CAAE,SAAUL,EAAQ,IAAK,CAAA,CAChE,CACH,CAYO,SAASY,GAAa,CAC3B,OAAOL,EAA4C,CACjD,WAAaG,GAASP,EAAO,KAAK,qBAAqB,mBAAmBO,CAAI,CAAC,OAAO,CAAA,CACvF,CACH,CAuCA,MAAMG,EAAU,CACd,IAAM,CAAC,KAAK,EACZ,KAAM,CAAC,MAAO,MAAM,CACtB,EAEO,SAASC,GAAa,CAC3B,OAAOZ,EAA0B,CAC/B,SAAUW,EAAQ,KAClB,QAAS,IAAMV,EAAO,IAAqB,UAAU,CAAA,CACtD,CACH,CAEO,SAASY,GAAkB,CAChC,MAAMV,EAAKC,EAAA,EACX,OAAOC,EAAiD,CACtD,WAAaC,GAASL,EAAO,KAAK,mBAAoB,CAAE,KAAAK,EAAM,EAC9D,UAAW,IAAMH,EAAG,kBAAkB,CAAE,SAAUQ,EAAQ,IAAK,CAAA,CAChE,CACH,CAEO,SAASG,GAAqB,CACnC,MAAMX,EAAKC,EAAA,EACX,OAAOC,EAA6C,CAClD,WAAaG,GAASP,EAAO,OAAO,oBAAoB,mBAAmBO,CAAI,CAAC,EAAE,EAClF,UAAW,IAAML,EAAG,kBAAkB,CAAE,SAAUQ,EAAQ,IAAK,CAAA,CAChE,CACH,CAEO,SAASI,GAAe,CAC7B,MAAMZ,EAAKC,EAAA,EACX,OAAOC,EAA8C,CACnD,WAAaG,GAASP,EAAO,KAAK,oBAAoB,mBAAmBO,CAAI,CAAC,SAAS,EACvF,UAAW,IAAML,EAAG,kBAAkB,CAAE,SAAUQ,EAAQ,IAAK,CAAA,CAChE,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u}from"./useQuery-
|
|
2
|
-
//# sourceMappingURL=use-memory-
|
|
1
|
+
import{u}from"./useQuery-II-YwTUw.js";import{a as t,b as o,d as n,Z as i}from"./index-wVLKSZpI.js";const r={all:["memory"],users:["memory","users"],facts:e=>["memory","facts",e],persona:e=>["memory","persona",e],consolidate:["memory","consolidate"]};function y(){return u({queryKey:r.users,queryFn:()=>n.listMemoryUsers()})}function d(e,s={}){return u({queryKey:r.facts(e),queryFn:()=>n.listMemoryFacts(e),enabled:s.enabled!==!1&&!!e.user_key})}function m(){const e=t();return o({mutationFn:({id:s,user_key:a})=>n.deleteMemoryFactById(s,{user_key:a}),onSuccess:()=>e.invalidateQueries({queryKey:r.all})})}function f(){const e=t();return o({mutationFn:({user_key:s,body:a})=>n.deleteMemoryFacts({user_key:s},a),onSuccess:()=>e.invalidateQueries({queryKey:r.all})})}function q(e,s={}){return u({queryKey:r.persona(e),queryFn:async()=>{try{return await n.getMemoryPersona({user_key:e})}catch(a){if(a instanceof i&&a.status===404)return null;throw a}},enabled:s.enabled!==!1&&!!e})}function F(){const e=t();return o({mutationFn:({user_key:s,body:a})=>n.updateMemoryPersona({user_key:s},a),onSuccess:(s,a)=>{e.invalidateQueries({queryKey:r.persona(a.user_key)}),e.invalidateQueries({queryKey:r.users})}})}function K(){const e=t();return o({mutationFn:s=>n.deleteMemoryPersona({user_key:s}),onSuccess:(s,a)=>{e.invalidateQueries({queryKey:r.persona(a)}),e.invalidateQueries({queryKey:r.users})}})}function M(e={}){return u({queryKey:r.consolidate,queryFn:()=>n.getMemoryConsolidateStatus(),refetchInterval:3e3,refetchIntervalInBackground:!1,enabled:e.enabled!==!1})}function p(){const e=t();return o({mutationFn:()=>n.consolidateMemory(),onSuccess:()=>{e.invalidateQueries({queryKey:r.consolidate}),e.invalidateQueries({queryKey:r.all})}})}export{d as a,m as b,f as c,q as d,p as e,M as f,F as g,K as h,r as m,y as u};
|
|
2
|
+
//# sourceMappingURL=use-memory-tCgpqYla.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-memory-
|
|
1
|
+
{"version":3,"file":"use-memory-tCgpqYla.js","sources":["../../src/hooks/use-memory.ts"],"sourcesContent":["/**\n * useMemory — react-query wrappers for the agent long-term memory.\n *\n * useMemoryUsers() — pick list of users that have\n * facts in the bank\n * useMemoryFacts(query) — pageable facts for one user\n * useDeleteFactById() — single-row delete\n * useBulkDeleteFacts() — multi / category / threshold\n *\n * No SSE channel; memory mutations are operator-driven and the\n * react-query 30s staleTime is enough. Mutations invalidate the\n * full ['memory'] tree so adjacent views (e.g. the user summary's\n * fact_count) stay in sync.\n */\n\nimport { useQueryClient, useQuery, useMutation } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport { ApiClientError } from '@/lib/api/client'\nimport type {\n ConsolidateMemoryResponse,\n ConsolidateStatusResponse,\n DeleteMemoryFactsBody,\n DeleteMemoryFactsResponse,\n ListMemoryFactsQuery,\n ListMemoryFactsResponse,\n ListMemoryUsersResponse,\n OkResponse,\n Persona,\n UpdatePersonaBody,\n} from '@/types/api'\n\nexport const memoryKeys = {\n all: ['memory'] as const,\n users: ['memory', 'users'] as const,\n facts: (q: ListMemoryFactsQuery) => ['memory', 'facts', q] as const,\n persona: (user_key: string) => ['memory', 'persona', user_key] as const,\n consolidate: ['memory', 'consolidate'] as const,\n}\n\nexport function useMemoryUsers() {\n return useQuery<ListMemoryUsersResponse>({\n queryKey: memoryKeys.users,\n queryFn: () => api.listMemoryUsers(),\n })\n}\n\nexport function useMemoryFacts(query: ListMemoryFactsQuery, opts: { enabled?: boolean } = {}) {\n return useQuery<ListMemoryFactsResponse>({\n queryKey: memoryKeys.facts(query),\n queryFn: () => api.listMemoryFacts(query),\n // Caller passes enabled=false until a user_key is chosen so the\n // hook doesn't fire with an empty key.\n enabled: opts.enabled !== false && Boolean(query.user_key),\n })\n}\n\nexport function useInvalidateMemory() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: memoryKeys.all })\n}\n\nexport function useDeleteFactById() {\n const qc = useQueryClient()\n return useMutation<\n OkResponse & { id: number },\n Error,\n { id: number; user_key: string }\n >({\n mutationFn: ({ id, user_key }) => api.deleteMemoryFactById(id, { user_key }),\n onSuccess: () => qc.invalidateQueries({ queryKey: memoryKeys.all }),\n })\n}\n\nexport function useBulkDeleteFacts() {\n const qc = useQueryClient()\n return useMutation<\n DeleteMemoryFactsResponse,\n Error,\n { user_key: string; body: DeleteMemoryFactsBody }\n >({\n mutationFn: ({ user_key, body }) => api.deleteMemoryFacts({ user_key }, body),\n onSuccess: () => qc.invalidateQueries({ queryKey: memoryKeys.all }),\n })\n}\n\n/* ─────────────── Persona ─────────────── */\n\n/** Fetch the persona for a user. The backend returns 404 when the\n * user has no persona yet — we map that to `data: null` so the\n * route can render the \"not set yet\" state without a try/catch. */\nexport function useMemoryPersona(user_key: string, opts: { enabled?: boolean } = {}) {\n return useQuery<Persona | null>({\n queryKey: memoryKeys.persona(user_key),\n queryFn: async () => {\n try {\n return await api.getMemoryPersona({ user_key })\n } catch (err) {\n if (err instanceof ApiClientError && err.status === 404) return null\n throw err\n }\n },\n enabled: opts.enabled !== false && Boolean(user_key),\n })\n}\n\nexport function useUpdatePersona() {\n const qc = useQueryClient()\n return useMutation<\n { ok: boolean },\n Error,\n { user_key: string; body: UpdatePersonaBody }\n >({\n mutationFn: ({ user_key, body }) => api.updateMemoryPersona({ user_key }, body),\n onSuccess: (_data, vars) => {\n qc.invalidateQueries({ queryKey: memoryKeys.persona(vars.user_key) })\n qc.invalidateQueries({ queryKey: memoryKeys.users })\n },\n })\n}\n\nexport function useDeletePersona() {\n const qc = useQueryClient()\n return useMutation<{ ok: boolean }, Error, string>({\n mutationFn: (user_key) => api.deleteMemoryPersona({ user_key }),\n onSuccess: (_data, user_key) => {\n qc.invalidateQueries({ queryKey: memoryKeys.persona(user_key) })\n qc.invalidateQueries({ queryKey: memoryKeys.users })\n },\n })\n}\n\n/* ─────────────── Consolidate ─────────────── */\n\n/** Status of the in-flight + recent consolidation jobs. Polls while\n * the page is open since consolidate runs asynchronously and we\n * want the operator to see when it completes without manual\n * refresh. */\nexport function useConsolidateStatus(opts: { enabled?: boolean } = {}) {\n return useQuery<ConsolidateStatusResponse>({\n queryKey: memoryKeys.consolidate,\n queryFn: () => api.getMemoryConsolidateStatus(),\n refetchInterval: 3000,\n refetchIntervalInBackground: false,\n enabled: opts.enabled !== false,\n })\n}\n\nexport function useTriggerConsolidate() {\n const qc = useQueryClient()\n return useMutation<ConsolidateMemoryResponse, Error, void>({\n mutationFn: () => api.consolidateMemory(),\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: memoryKeys.consolidate })\n qc.invalidateQueries({ queryKey: memoryKeys.all })\n },\n })\n}\n"],"names":["memoryKeys","q","user_key","useMemoryUsers","useQuery","api","useMemoryFacts","query","opts","useDeleteFactById","qc","useQueryClient","useMutation","id","useBulkDeleteFacts","body","useMemoryPersona","err","ApiClientError","useUpdatePersona","_data","vars","useDeletePersona","useConsolidateStatus","useTriggerConsolidate"],"mappings":"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"}
|
package/dist/web/public/assets/{use-observability-BOepIjX5.js → use-observability-CMUSiy5z.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as a}from"./useQuery-
|
|
2
|
-
//# sourceMappingURL=use-observability-
|
|
1
|
+
import{u as a}from"./useQuery-II-YwTUw.js";import{d as i}from"./index-wVLKSZpI.js";const n={all:["observability"],health:e=>["observability","health",e],topN:(e,t,r,u)=>["observability","topn",e,t,r,u],audit:e=>["observability","audit",e]};function o(e){return a({queryKey:n.health(e),queryFn:()=>i.getHealthSummary({days:e}),refetchInterval:3e4,refetchIntervalInBackground:!1})}function s(e){const t=e.days??7,r=e.limit??10;return a({queryKey:n.topN(e.dim,e.by,t,r),queryFn:()=>i.getHealthTopN({dim:e.dim,by:e.by,days:t,limit:r}),refetchInterval:6e4,refetchIntervalInBackground:!1})}function c(e){return a({queryKey:n.audit(e),queryFn:()=>i.getAudit(e),refetchInterval:1e4,refetchIntervalInBackground:!1})}export{s as a,c as b,o as u};
|
|
2
|
+
//# sourceMappingURL=use-observability-CMUSiy5z.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-observability-
|
|
1
|
+
{"version":3,"file":"use-observability-CMUSiy5z.js","sources":["../../src/hooks/use-observability.ts"],"sourcesContent":["/**\n * useObservability — react-query wrappers for the operational\n * dashboard.\n *\n * useHealthSummary({ days }) — totals + byDay roll-up\n * useTopN({ dim, by, days, limit }) — leaderboard by dimension\n * useAudit(query) — recent invocations\n *\n * All three are read-only; observability stays a passive view.\n * Refetch intervals are tuned to match operator expectations:\n * health summary every 30s (background sweep latency); audit\n * every 10s (fresher); TopN every 60s (the leaderboard moves\n * slowly enough).\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type {\n AuditResponse,\n HealthSummary,\n ListAuditQuery,\n TopNDim,\n TopNMetric,\n TopNResponse,\n} from '@/types/api'\n\nexport const observabilityKeys = {\n all: ['observability'] as const,\n health: (days: number) => ['observability', 'health', days] as const,\n topN: (dim: TopNDim, by: TopNMetric, days: number, limit: number) =>\n ['observability', 'topn', dim, by, days, limit] as const,\n audit: (q: ListAuditQuery) => ['observability', 'audit', q] as const,\n}\n\nexport function useHealthSummary(days: number) {\n return useQuery<HealthSummary>({\n queryKey: observabilityKeys.health(days),\n queryFn: () => api.getHealthSummary({ days }),\n refetchInterval: 30_000,\n refetchIntervalInBackground: false,\n })\n}\n\nexport function useTopN(opts: { dim: TopNDim; by: TopNMetric; days?: number; limit?: number }) {\n const days = opts.days ?? 7\n const limit = opts.limit ?? 10\n return useQuery<TopNResponse>({\n queryKey: observabilityKeys.topN(opts.dim, opts.by, days, limit),\n queryFn: () => api.getHealthTopN({ dim: opts.dim, by: opts.by, days, limit }),\n refetchInterval: 60_000,\n refetchIntervalInBackground: false,\n })\n}\n\nexport function useAudit(query: ListAuditQuery) {\n return useQuery<AuditResponse>({\n queryKey: observabilityKeys.audit(query),\n queryFn: () => api.getAudit(query),\n refetchInterval: 10_000,\n refetchIntervalInBackground: false,\n })\n}\n"],"names":["observabilityKeys","days","dim","by","limit","q","useHealthSummary","useQuery","api","useTopN","opts","useAudit","query"],"mappings":"mFA0BO,MAAMA,EAAoB,CAC/B,IAAS,CAAC,eAAe,EACzB,OAAUC,GAAiB,CAAC,gBAAiB,SAAUA,CAAI,EAC3D,KAAS,CAACC,EAAcC,EAAgBF,EAAcG,IACpD,CAAC,gBAAiB,OAAQF,EAAKC,EAAIF,EAAMG,CAAK,EAChD,MAAUC,GAAsB,CAAC,gBAAiB,QAASA,CAAC,CAC9D,EAEO,SAASC,EAAiBL,EAAc,CAC7C,OAAOM,EAAwB,CAC7B,SAAUP,EAAkB,OAAOC,CAAI,EACvC,QAAS,IAAMO,EAAI,iBAAiB,CAAE,KAAAP,EAAM,EAC5C,gBAAiB,IACjB,4BAA6B,EAAA,CAC9B,CACH,CAEO,SAASQ,EAAQC,EAAuE,CAC7F,MAAMT,EAAOS,EAAK,MAAQ,EACpBN,EAAQM,EAAK,OAAS,GAC5B,OAAOH,EAAuB,CAC5B,SAAUP,EAAkB,KAAKU,EAAK,IAAKA,EAAK,GAAIT,EAAMG,CAAK,EAC/D,QAAS,IAAMI,EAAI,cAAc,CAAE,IAAKE,EAAK,IAAK,GAAIA,EAAK,GAAI,KAAAT,EAAM,MAAAG,EAAO,EAC5E,gBAAiB,IACjB,4BAA6B,EAAA,CAC9B,CACH,CAEO,SAASO,EAASC,EAAuB,CAC9C,OAAOL,EAAwB,CAC7B,SAAUP,EAAkB,MAAMY,CAAK,EACvC,QAAS,IAAMJ,EAAI,SAASI,CAAK,EACjC,gBAAiB,IACjB,4BAA6B,EAAA,CAC9B,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u}from"./useQuery-
|
|
2
|
-
//# sourceMappingURL=use-settings-
|
|
1
|
+
import{u}from"./useQuery-II-YwTUw.js";import{a as i,b as s,d as n}from"./index-wVLKSZpI.js";const r={all:["settings"],env:e=>["settings","env",e],service:["settings","service"],admins:["settings","admins"],config:["settings","config"],workspaces:["settings","workspaces"]};function v(e={}){const t=!!e.reveal;return u({queryKey:r.env(t),queryFn:()=>n.getEnv({reveal:t})})}function l(){const e=i();return s({mutationFn:t=>n.updateEnv(t),onSuccess:()=>e.invalidateQueries({queryKey:["settings","env"]})})}function f(){return u({queryKey:r.service,queryFn:()=>n.getServiceStatus(),refetchInterval:5e3,refetchIntervalInBackground:!1})}function a(e,t){return s({mutationFn:e,onSuccess:()=>t.invalidateQueries({queryKey:r.service})})}function y(){const e=i();return a(()=>n.startService(),e)}function d(){const e=i();return a(()=>n.stopService(),e)}function m(){const e=i();return a(()=>n.restartService(),e)}function q(){return u({queryKey:r.admins,queryFn:()=>n.listAdminAllowlist()})}function g(){const e=i();return s({mutationFn:t=>n.addAdminAllowlist(t),onSuccess:()=>e.invalidateQueries({queryKey:r.admins})})}function p(){const e=i();return s({mutationFn:t=>n.removeAdminAllowlist(t),onSuccess:()=>e.invalidateQueries({queryKey:r.admins})})}function S(){return u({queryKey:r.config,queryFn:()=>n.getConfig()})}function F(){const e=i();return s({mutationFn:t=>n.updateConfig(t),onSuccess:()=>e.invalidateQueries({queryKey:r.config})})}function A(){return u({queryKey:r.workspaces,queryFn:()=>n.listWorkspacesFull()})}function h(){const e=i();return s({mutationFn:t=>n.upsertWorkspace(t),onSuccess:()=>e.invalidateQueries({queryKey:r.workspaces})})}function K(){return s({mutationFn:()=>n.startWechatQr()})}function w(e){return u({queryKey:["settings","wechat-qr",e??""],queryFn:()=>n.getWechatQrStatus({token:e}),enabled:!!e,refetchInterval:2e3,refetchIntervalInBackground:!1})}function Q(){return s({mutationFn:e=>n.testAcpAgent(e)})}function k(){return s({mutationFn:e=>n.discoverAcpAgents(e)})}function W(){return s({mutationFn:()=>n.testEmail()})}function E(){return u({queryKey:["settings","search","providers"],queryFn:()=>n.getSearchProviders()})}function I(){return s({mutationFn:e=>n.testSearchProvider(e)})}function C(){return u({queryKey:["settings","viewer-tunnel"],queryFn:()=>n.getViewerTunnel()})}export{l as a,S as b,F as c,K as d,w as e,W as f,C as g,Q as h,k as i,f as j,y as k,d as l,m,q as n,g as o,p,A as q,h as r,E as s,I as t,v as u};
|
|
2
|
+
//# sourceMappingURL=use-settings-BUM0BmtA.js.map
|
package/dist/web/public/assets/{use-settings-DBXvAYm9.js.map → use-settings-BUM0BmtA.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-settings-DBXvAYm9.js","sources":["../../src/hooks/use-settings.ts"],"sourcesContent":["/**\n * useSettings — react-query wrappers for the env editor + service\n * control surfaces.\n *\n * useEnv({ reveal }) — env file values (masked when\n * reveal is false)\n * useUpdateEnv() — bulk update\n * useServiceStatus() — pid / mode / uptime\n * useStart/Stop/Restart() — service lifecycle\n *\n * Service status polls every 5s while the page is foreground so\n * the operator sees restart progress live.\n */\n\nimport { useQueryClient, useQuery, useMutation } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type {\n ACPDiscoverBody,\n ACPDiscoverResponse,\n ACPTestBody,\n ACPTestResponse,\n EmailTestResponse,\n ViewerTunnelStatusResponse,\n AddAdminBody,\n AdminAllowlistResponse,\n AdminMutationResponse,\n AppConfig,\n EnvResponse,\n RemoveAdminBody,\n SearchProvidersResponse,\n SearchTestBody,\n SearchTestResponse,\n ServiceActionResponse,\n ServiceStatus,\n UpdateEnvBody,\n WechatQrStartResponse,\n WechatQrStatusResponse,\n WorkspaceConfig,\n} from '@/types/api'\n\nexport const settingsKeys = {\n all: ['settings'] as const,\n env: (reveal: boolean) => ['settings', 'env', reveal] as const,\n service: ['settings', 'service'] as const,\n admins: ['settings', 'admins'] as const,\n config: ['settings', 'config'] as const,\n workspaces: ['settings', 'workspaces'] as const,\n}\n\nexport function useEnv(opts: { reveal?: boolean } = {}) {\n const reveal = !!opts.reveal\n return useQuery<EnvResponse>({\n queryKey: settingsKeys.env(reveal),\n queryFn: () => api.getEnv({ reveal }),\n })\n}\n\nexport function useUpdateEnv() {\n const qc = useQueryClient()\n return useMutation<EnvResponse, Error, UpdateEnvBody>({\n mutationFn: (body) => api.updateEnv(body),\n onSuccess: () => qc.invalidateQueries({ queryKey: ['settings', 'env'] }),\n })\n}\n\nexport function useServiceStatus() {\n return useQuery<ServiceStatus>({\n queryKey: settingsKeys.service,\n queryFn: () => api.getServiceStatus(),\n refetchInterval: 5000,\n refetchIntervalInBackground: false,\n })\n}\n\nfunction makeServiceMutation(\n fn: () => Promise<ServiceActionResponse>,\n qc: ReturnType<typeof useQueryClient>,\n) {\n return useMutation<ServiceActionResponse, Error, void>({\n mutationFn: fn,\n onSuccess: () => qc.invalidateQueries({ queryKey: settingsKeys.service }),\n })\n}\n\nexport function useStartService() {\n const qc = useQueryClient()\n return makeServiceMutation(() => api.startService(), qc)\n}\n\nexport function useStopService() {\n const qc = useQueryClient()\n return makeServiceMutation(() => api.stopService(), qc)\n}\n\nexport function useRestartService() {\n const qc = useQueryClient()\n return makeServiceMutation(() => api.restartService(), qc)\n}\n\n/* ─────────────── Admin allowlist ─────────────── */\n\nexport function useAdminAllowlist() {\n return useQuery<AdminAllowlistResponse>({\n queryKey: settingsKeys.admins,\n queryFn: () => api.listAdminAllowlist(),\n })\n}\n\nexport function useAddAdmin() {\n const qc = useQueryClient()\n return useMutation<AdminMutationResponse, Error, AddAdminBody>({\n mutationFn: (body) => api.addAdminAllowlist(body),\n onSuccess: () => qc.invalidateQueries({ queryKey: settingsKeys.admins }),\n })\n}\n\nexport function useRemoveAdmin() {\n const qc = useQueryClient()\n return useMutation<AdminMutationResponse, Error, RemoveAdminBody>({\n mutationFn: (body) => api.removeAdminAllowlist(body),\n onSuccess: () => qc.invalidateQueries({ queryKey: settingsKeys.admins }),\n })\n}\n\n/* ─────────────── App config ─────────────── */\n\nexport function useConfig() {\n return useQuery<AppConfig>({\n queryKey: settingsKeys.config,\n queryFn: () => api.getConfig(),\n })\n}\n\nexport function useUpdateConfig() {\n const qc = useQueryClient()\n return useMutation<AppConfig, Error, Partial<AppConfig>>({\n mutationFn: (body) => api.updateConfig(body),\n onSuccess: () => qc.invalidateQueries({ queryKey: settingsKeys.config }),\n })\n}\n\n/* ─────────────── Workspaces ─────────────── */\n\nexport function useWorkspaces() {\n return useQuery<{ workspaces: WorkspaceConfig[] }>({\n queryKey: settingsKeys.workspaces,\n queryFn: () => api.listWorkspacesFull(),\n })\n}\n\nexport function useUpsertWorkspace() {\n const qc = useQueryClient()\n return useMutation<\n { ok: boolean; workspace: WorkspaceConfig },\n Error,\n WorkspaceConfig\n >({\n mutationFn: (body) => api.upsertWorkspace(body),\n onSuccess: () => qc.invalidateQueries({ queryKey: settingsKeys.workspaces }),\n })\n}\n\n/* ─────────────── WeChat QR ─────────────── */\n\nexport function useStartWechatQr() {\n return useMutation<WechatQrStartResponse, Error, void>({\n mutationFn: () => api.startWechatQr(),\n })\n}\n\n/** Poll the QR status every 2s while the modal is open. Caller\n * passes `token` once it has it from the start mutation; passing\n * null disables the polling. On status='confirmed' the backend\n * persists wechat-ilink → re-fetch config to update the toggle. */\nexport function useWechatQrStatus(token: string | null) {\n return useQuery<WechatQrStatusResponse>({\n queryKey: ['settings', 'wechat-qr', token ?? ''],\n queryFn: () => api.getWechatQrStatus({ token: token as string }),\n enabled: Boolean(token),\n refetchInterval: 2000,\n refetchIntervalInBackground: false,\n })\n}\n\n/** Probe a single ACP endpoint by fetching its manifest. Used by\n * the \"Test\" buttons in /settings/agents to validate an entry\n * before saving it to config. Errors flow back as ApiError. */\nexport function useTestAcp() {\n return useMutation<ACPTestResponse, Error, ACPTestBody>({\n mutationFn: (body) => api.testAcpAgent(body),\n })\n}\n\n/** Probe a `<baseUrl>/.well-known/acp` doc for an agent list. Used\n * by the \"Discover\" form in /settings/agents to bulk-import. The\n * caller still has to PUT /api/config { acpAgents } to persist. */\nexport function useDiscoverAcp() {\n return useMutation<ACPDiscoverResponse, Error, ACPDiscoverBody>({\n mutationFn: (body) => api.discoverAcpAgents(body),\n })\n}\n\n/** Verify SMTP creds in the running env. Doesn't actually send mail —\n * just `nodemailer.verify()`. Returns `{ ok, message }` on success or\n * throws ApiError otherwise (the route catches + toasts the message). */\nexport function useTestEmail() {\n return useMutation<EmailTestResponse, Error, void>({\n mutationFn: () => api.testEmail(),\n })\n}\n\n/** v1.2.126 — registered web_search providers + their current\n * availability + the resolved chain. Used by /settings/search to\n * paint per-provider rows and the chain preview at the top. Polls\n * once on mount; manual refetch after Save. */\nexport function useSearchProviders() {\n return useQuery<SearchProvidersResponse>({\n queryKey: ['settings', 'search', 'providers'],\n queryFn: () => api.getSearchProviders(),\n })\n}\n\n/** Ping one provider. Always resolves (no throw on provider error —\n * the response carries `{ ok, error }`); throws only on transport\n * error. The page renders the result inline beside the row. */\nexport function useTestSearchProvider() {\n return useMutation<SearchTestResponse, Error, SearchTestBody>({\n mutationFn: (body) => api.testSearchProvider(body),\n })\n}\n\n/** Live viewer config + cloudflared tunnel state. Used by the Viewer\n * card on /settings/viewer to render the \"Tunnel: running / URL: X /\n * binary: …\" panel. Operators click a manual Refresh button to\n * re-fetch — no auto-polling because tunnel state is essentially\n * static between operator actions (start / stop / link expiry). */\nexport function useViewerTunnel() {\n return useQuery<ViewerTunnelStatusResponse>({\n queryKey: ['settings', 'viewer-tunnel'],\n queryFn: () => api.getViewerTunnel(),\n })\n}\n"],"names":["settingsKeys","reveal","useEnv","opts","useQuery","api","useUpdateEnv","qc","useQueryClient","useMutation","body","useServiceStatus","makeServiceMutation","fn","useStartService","useStopService","useRestartService","useAdminAllowlist","useAddAdmin","useRemoveAdmin","useConfig","useUpdateConfig","useWorkspaces","useUpsertWorkspace","useStartWechatQr","useWechatQrStatus","token","useTestAcp","useDiscoverAcp","useTestEmail","useSearchProviders","useTestSearchProvider","useViewerTunnel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-settings-BUM0BmtA.js","sources":["../../src/hooks/use-settings.ts"],"sourcesContent":["/**\n * useSettings — react-query wrappers for the env editor + service\n * control surfaces.\n *\n * useEnv({ reveal }) — env file values (masked when\n * reveal is false)\n * useUpdateEnv() — bulk update\n * useServiceStatus() — pid / mode / uptime\n * useStart/Stop/Restart() — service lifecycle\n *\n * Service status polls every 5s while the page is foreground so\n * the operator sees restart progress live.\n */\n\nimport { useQueryClient, useQuery, useMutation } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type {\n ACPDiscoverBody,\n ACPDiscoverResponse,\n ACPTestBody,\n ACPTestResponse,\n EmailTestResponse,\n ViewerTunnelStatusResponse,\n AddAdminBody,\n AdminAllowlistResponse,\n AdminMutationResponse,\n AppConfig,\n EnvResponse,\n RemoveAdminBody,\n SearchProvidersResponse,\n SearchTestBody,\n SearchTestResponse,\n ServiceActionResponse,\n ServiceStatus,\n UpdateEnvBody,\n WechatQrStartResponse,\n WechatQrStatusResponse,\n WorkspaceConfig,\n} from '@/types/api'\n\nexport const settingsKeys = {\n all: ['settings'] as const,\n env: (reveal: boolean) => ['settings', 'env', reveal] as const,\n service: ['settings', 'service'] as const,\n admins: ['settings', 'admins'] as const,\n config: ['settings', 'config'] as const,\n workspaces: ['settings', 'workspaces'] as const,\n}\n\nexport function useEnv(opts: { reveal?: boolean } = {}) {\n const reveal = !!opts.reveal\n return useQuery<EnvResponse>({\n queryKey: settingsKeys.env(reveal),\n queryFn: () => api.getEnv({ reveal }),\n })\n}\n\nexport function useUpdateEnv() {\n const qc = useQueryClient()\n return useMutation<EnvResponse, Error, UpdateEnvBody>({\n mutationFn: (body) => api.updateEnv(body),\n onSuccess: () => qc.invalidateQueries({ queryKey: ['settings', 'env'] }),\n })\n}\n\nexport function useServiceStatus() {\n return useQuery<ServiceStatus>({\n queryKey: settingsKeys.service,\n queryFn: () => api.getServiceStatus(),\n refetchInterval: 5000,\n refetchIntervalInBackground: false,\n })\n}\n\nfunction makeServiceMutation(\n fn: () => Promise<ServiceActionResponse>,\n qc: ReturnType<typeof useQueryClient>,\n) {\n return useMutation<ServiceActionResponse, Error, void>({\n mutationFn: fn,\n onSuccess: () => qc.invalidateQueries({ queryKey: settingsKeys.service }),\n })\n}\n\nexport function useStartService() {\n const qc = useQueryClient()\n return makeServiceMutation(() => api.startService(), qc)\n}\n\nexport function useStopService() {\n const qc = useQueryClient()\n return makeServiceMutation(() => api.stopService(), qc)\n}\n\nexport function useRestartService() {\n const qc = useQueryClient()\n return makeServiceMutation(() => api.restartService(), qc)\n}\n\n/* ─────────────── Admin allowlist ─────────────── */\n\nexport function useAdminAllowlist() {\n return useQuery<AdminAllowlistResponse>({\n queryKey: settingsKeys.admins,\n queryFn: () => api.listAdminAllowlist(),\n })\n}\n\nexport function useAddAdmin() {\n const qc = useQueryClient()\n return useMutation<AdminMutationResponse, Error, AddAdminBody>({\n mutationFn: (body) => api.addAdminAllowlist(body),\n onSuccess: () => qc.invalidateQueries({ queryKey: settingsKeys.admins }),\n })\n}\n\nexport function useRemoveAdmin() {\n const qc = useQueryClient()\n return useMutation<AdminMutationResponse, Error, RemoveAdminBody>({\n mutationFn: (body) => api.removeAdminAllowlist(body),\n onSuccess: () => qc.invalidateQueries({ queryKey: settingsKeys.admins }),\n })\n}\n\n/* ─────────────── App config ─────────────── */\n\nexport function useConfig() {\n return useQuery<AppConfig>({\n queryKey: settingsKeys.config,\n queryFn: () => api.getConfig(),\n })\n}\n\nexport function useUpdateConfig() {\n const qc = useQueryClient()\n return useMutation<AppConfig, Error, Partial<AppConfig>>({\n mutationFn: (body) => api.updateConfig(body),\n onSuccess: () => qc.invalidateQueries({ queryKey: settingsKeys.config }),\n })\n}\n\n/* ─────────────── Workspaces ─────────────── */\n\nexport function useWorkspaces() {\n return useQuery<{ workspaces: WorkspaceConfig[] }>({\n queryKey: settingsKeys.workspaces,\n queryFn: () => api.listWorkspacesFull(),\n })\n}\n\nexport function useUpsertWorkspace() {\n const qc = useQueryClient()\n return useMutation<\n { ok: boolean; workspace: WorkspaceConfig },\n Error,\n WorkspaceConfig\n >({\n mutationFn: (body) => api.upsertWorkspace(body),\n onSuccess: () => qc.invalidateQueries({ queryKey: settingsKeys.workspaces }),\n })\n}\n\n/* ─────────────── WeChat QR ─────────────── */\n\nexport function useStartWechatQr() {\n return useMutation<WechatQrStartResponse, Error, void>({\n mutationFn: () => api.startWechatQr(),\n })\n}\n\n/** Poll the QR status every 2s while the modal is open. Caller\n * passes `token` once it has it from the start mutation; passing\n * null disables the polling. On status='confirmed' the backend\n * persists wechat-ilink → re-fetch config to update the toggle. */\nexport function useWechatQrStatus(token: string | null) {\n return useQuery<WechatQrStatusResponse>({\n queryKey: ['settings', 'wechat-qr', token ?? ''],\n queryFn: () => api.getWechatQrStatus({ token: token as string }),\n enabled: Boolean(token),\n refetchInterval: 2000,\n refetchIntervalInBackground: false,\n })\n}\n\n/** Probe a single ACP endpoint by fetching its manifest. Used by\n * the \"Test\" buttons in /settings/agents to validate an entry\n * before saving it to config. Errors flow back as ApiError. */\nexport function useTestAcp() {\n return useMutation<ACPTestResponse, Error, ACPTestBody>({\n mutationFn: (body) => api.testAcpAgent(body),\n })\n}\n\n/** Probe a `<baseUrl>/.well-known/acp` doc for an agent list. Used\n * by the \"Discover\" form in /settings/agents to bulk-import. The\n * caller still has to PUT /api/config { acpAgents } to persist. */\nexport function useDiscoverAcp() {\n return useMutation<ACPDiscoverResponse, Error, ACPDiscoverBody>({\n mutationFn: (body) => api.discoverAcpAgents(body),\n })\n}\n\n/** Verify SMTP creds in the running env. Doesn't actually send mail —\n * just `nodemailer.verify()`. Returns `{ ok, message }` on success or\n * throws ApiError otherwise (the route catches + toasts the message). */\nexport function useTestEmail() {\n return useMutation<EmailTestResponse, Error, void>({\n mutationFn: () => api.testEmail(),\n })\n}\n\n/** v1.2.126 — registered web_search providers + their current\n * availability + the resolved chain. Used by /settings/search to\n * paint per-provider rows and the chain preview at the top. Polls\n * once on mount; manual refetch after Save. */\nexport function useSearchProviders() {\n return useQuery<SearchProvidersResponse>({\n queryKey: ['settings', 'search', 'providers'],\n queryFn: () => api.getSearchProviders(),\n })\n}\n\n/** Ping one provider. Always resolves (no throw on provider error —\n * the response carries `{ ok, error }`); throws only on transport\n * error. The page renders the result inline beside the row. */\nexport function useTestSearchProvider() {\n return useMutation<SearchTestResponse, Error, SearchTestBody>({\n mutationFn: (body) => api.testSearchProvider(body),\n })\n}\n\n/** Live viewer config + cloudflared tunnel state. Used by the Viewer\n * card on /settings/viewer to render the \"Tunnel: running / URL: X /\n * binary: …\" panel. Operators click a manual Refresh button to\n * re-fetch — no auto-polling because tunnel state is essentially\n * static between operator actions (start / stop / link expiry). */\nexport function useViewerTunnel() {\n return useQuery<ViewerTunnelStatusResponse>({\n queryKey: ['settings', 'viewer-tunnel'],\n queryFn: () => api.getViewerTunnel(),\n })\n}\n"],"names":["settingsKeys","reveal","useEnv","opts","useQuery","api","useUpdateEnv","qc","useQueryClient","useMutation","body","useServiceStatus","makeServiceMutation","fn","useStartService","useStopService","useRestartService","useAdminAllowlist","useAddAdmin","useRemoveAdmin","useConfig","useUpdateConfig","useWorkspaces","useUpsertWorkspace","useStartWechatQr","useWechatQrStatus","token","useTestAcp","useDiscoverAcp","useTestEmail","useSearchProviders","useTestSearchProvider","useViewerTunnel"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as a}from"./useQuery-
|
|
2
|
-
//# sourceMappingURL=use-workspace-
|
|
1
|
+
import{u as a}from"./useQuery-II-YwTUw.js";import{a as o,b as i,d as u}from"./index-wVLKSZpI.js";const t={all:["workspace"],files:(e,s)=>["workspace","files",e,s]};function y(){return a({queryKey:["agents","status"],queryFn:()=>u.getAgentsStatus()})}function f(e,s,r={}){return a({queryKey:t.files(e,s),queryFn:()=>u.getWorkspaceFiles({agent:e,...s?{path:s}:{}}),enabled:r.enabled!==!1&&!!e})}function p(){const e=o();return i({mutationFn:({agent:s,path:r,body:n})=>u.writeWorkspaceFile({agent:s,path:r},n),onSuccess:()=>e.invalidateQueries({queryKey:t.all})})}export{f as a,p as b,y as u};
|
|
2
|
+
//# sourceMappingURL=use-workspace-BOUxEbaB.js.map
|