agim-cli 1.3.10 → 1.4.0
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/dist/core/a2a.d.ts +1 -1
- package/dist/core/a2a.d.ts.map +1 -1
- package/dist/core/a2a.js +7 -12
- package/dist/core/a2a.js.map +1 -1
- package/dist/core/llm/fs-dispatcher.d.ts.map +1 -1
- package/dist/core/llm/fs-dispatcher.js +14 -13
- package/dist/core/llm/fs-dispatcher.js.map +1 -1
- package/dist/core/skills/builtin/agim-self/SKILL.md +4 -4
- package/dist/plugins/agents/native/index.js +1 -1
- package/dist/plugins/agents/native/index.js.map +1 -1
- package/dist/web/public/assets/{a2a-BJDnrQvr.js → a2a-DWibx2v1.js} +2 -2
- package/dist/web/public/assets/{a2a-BJDnrQvr.js.map → a2a-DWibx2v1.js.map} +1 -1
- package/dist/web/public/assets/{activity-ODVTDapn.js → activity-CSppRQoj.js} +2 -2
- package/dist/web/public/assets/{activity-ODVTDapn.js.map → activity-CSppRQoj.js.map} +1 -1
- package/dist/web/public/assets/{admins-DUDFhuCJ.js → admins-C9uvJ-ek.js} +2 -2
- package/dist/web/public/assets/{admins-DUDFhuCJ.js.map → admins-C9uvJ-ek.js.map} +1 -1
- package/dist/web/public/assets/{agents-DFrinQ8S.js → agents-rbtxCOzD.js} +2 -2
- package/dist/web/public/assets/{agents-DFrinQ8S.js.map → agents-rbtxCOzD.js.map} +1 -1
- package/dist/web/public/assets/{approvals-BBhAiOwe.js → approvals-CgRDzZZP.js} +2 -2
- package/dist/web/public/assets/{approvals-BBhAiOwe.js.map → approvals-CgRDzZZP.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-Czj6Xxqp.js → arrow-down-DfVXLyJ6.js} +2 -2
- package/dist/web/public/assets/{arrow-down-Czj6Xxqp.js.map → arrow-down-DfVXLyJ6.js.map} +1 -1
- package/dist/web/public/assets/{arrow-up-DMJEvzmu.js → arrow-up-CMHA89ux.js} +2 -2
- package/dist/web/public/assets/{arrow-up-DMJEvzmu.js.map → arrow-up-CMHA89ux.js.map} +1 -1
- package/dist/web/public/assets/{asks-p9bF8Q81.js → asks-9JCznWEb.js} +2 -2
- package/dist/web/public/assets/{asks-p9bF8Q81.js.map → asks-9JCznWEb.js.map} +1 -1
- package/dist/web/public/assets/{audit-D3Rwft_U.js → audit-DM5sKNA4.js} +2 -2
- package/dist/web/public/assets/{audit-D3Rwft_U.js.map → audit-DM5sKNA4.js.map} +1 -1
- package/dist/web/public/assets/{bell-BcfPrP44.js → bell-BzG0tUiv.js} +2 -2
- package/dist/web/public/assets/{bell-BcfPrP44.js.map → bell-BzG0tUiv.js.map} +1 -1
- package/dist/web/public/assets/{bgjobs-DI-G4o1P.js → bgjobs-dLxHKjQK.js} +2 -2
- package/dist/web/public/assets/{bgjobs-DI-G4o1P.js.map → bgjobs-dLxHKjQK.js.map} +1 -1
- package/dist/web/public/assets/{brain-j7MTWb2W.js → brain-9QmMQ6Ap.js} +2 -2
- package/dist/web/public/assets/{brain-j7MTWb2W.js.map → brain-9QmMQ6Ap.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-D6VTVxcr.js → briefcase-BehkRQvT.js} +2 -2
- package/dist/web/public/assets/{briefcase-D6VTVxcr.js.map → briefcase-BehkRQvT.js.map} +1 -1
- package/dist/web/public/assets/{chat-Sh71acST.js → chat-nfyoGDVp.js} +2 -2
- package/dist/web/public/assets/{chat-Sh71acST.js.map → chat-nfyoGDVp.js.map} +1 -1
- package/dist/web/public/assets/{chevron-left-CJRMeoEU.js → chevron-left-DHpm5XR1.js} +2 -2
- package/dist/web/public/assets/{chevron-left-CJRMeoEU.js.map → chevron-left-DHpm5XR1.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-D7RvBcn9.js → chevron-right-BIKADdPm.js} +2 -2
- package/dist/web/public/assets/{chevron-right-D7RvBcn9.js.map → chevron-right-BIKADdPm.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-DyXDqWS7.js → circle-check-BbAeV_k2.js} +2 -2
- package/dist/web/public/assets/{circle-check-DyXDqWS7.js.map → circle-check-BbAeV_k2.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-4AFRLlHX.js → circle-check-big-Cd4Eyz41.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-4AFRLlHX.js.map → circle-check-big-Cd4Eyz41.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-CKhp9N2v.js → circle-x-CrmHcrAS.js} +2 -2
- package/dist/web/public/assets/{circle-x-CKhp9N2v.js.map → circle-x-CrmHcrAS.js.map} +1 -1
- package/dist/web/public/assets/{clock-BFwIA0Jz.js → clock-jJtwqx8f.js} +2 -2
- package/dist/web/public/assets/{clock-BFwIA0Jz.js.map → clock-jJtwqx8f.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-Cm_B6a_Y.js → confirm-dialog-D4JCDxHT.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-Cm_B6a_Y.js.map → confirm-dialog-D4JCDxHT.js.map} +1 -1
- package/dist/web/public/assets/{copy-C2cKu0ar.js → copy-D9ljWg7b.js} +2 -2
- package/dist/web/public/assets/{copy-C2cKu0ar.js.map → copy-D9ljWg7b.js.map} +1 -1
- package/dist/web/public/assets/{data-table-DP1nlFsW.js → data-table-yUuGHUSG.js} +2 -2
- package/dist/web/public/assets/{data-table-DP1nlFsW.js.map → data-table-yUuGHUSG.js.map} +1 -1
- package/dist/web/public/assets/{download-PfYhaNlR.js → download-9zxV6ejH.js} +2 -2
- package/dist/web/public/assets/{download-PfYhaNlR.js.map → download-9zxV6ejH.js.map} +1 -1
- package/dist/web/public/assets/{email-CAS5_GZJ.js → email-C8Fx7GcZ.js} +2 -2
- package/dist/web/public/assets/{email-CAS5_GZJ.js.map → email-C8Fx7GcZ.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-CJm-vEmY.js → empty-state-B0sJBvsG.js} +2 -2
- package/dist/web/public/assets/{empty-state-CJm-vEmY.js.map → empty-state-B0sJBvsG.js.map} +1 -1
- package/dist/web/public/assets/{external-link-CBqMMl-X.js → external-link-C3fHPbrL.js} +2 -2
- package/dist/web/public/assets/{external-link-CBqMMl-X.js.map → external-link-C3fHPbrL.js.map} +1 -1
- package/dist/web/public/assets/{eye-CqZWsMY2.js → eye-BrcGR1Ln.js} +2 -2
- package/dist/web/public/assets/{eye-CqZWsMY2.js.map → eye-BrcGR1Ln.js.map} +1 -1
- package/dist/web/public/assets/{facts-DzePN4sU.js → facts-DNcekpR_.js} +2 -2
- package/dist/web/public/assets/{facts-DzePN4sU.js.map → facts-DNcekpR_.js.map} +1 -1
- package/dist/web/public/assets/{goals-B3nMxvT5.js → goals-BJ0I0rVU.js} +2 -2
- package/dist/web/public/assets/{goals-B3nMxvT5.js.map → goals-BJ0I0rVU.js.map} +1 -1
- package/dist/web/public/assets/{health-Br5o8-3r.js → health-DCFAQ615.js} +2 -2
- package/dist/web/public/assets/{health-Br5o8-3r.js.map → health-DCFAQ615.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-tKr9RbAP.js → heart-pulse-CiwiVY1D.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-tKr9RbAP.js.map → heart-pulse-CiwiVY1D.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-C1wrwDfB.js → heartbeat-CYIIkyqM.js} +2 -2
- package/dist/web/public/assets/{heartbeat-C1wrwDfB.js.map → heartbeat-CYIIkyqM.js.map} +1 -1
- package/dist/web/public/assets/{hot-Cg_tG6vW.js → hot-SjwVKjTN.js} +2 -2
- package/dist/web/public/assets/{hot-Cg_tG6vW.js.map → hot-SjwVKjTN.js.map} +1 -1
- package/dist/web/public/assets/{index-kq3mrzTq.js → index-BiXaJRfQ.js} +3 -3
- package/dist/web/public/assets/{index-kq3mrzTq.js.map → index-BiXaJRfQ.js.map} +1 -1
- package/dist/web/public/assets/{injection-DlagYMTW.js → injection-rK-nXEck.js} +2 -2
- package/dist/web/public/assets/{injection-DlagYMTW.js.map → injection-rK-nXEck.js.map} +1 -1
- package/dist/web/public/assets/{installed-1JZZhebV.js → installed-C3GsWhFt.js} +2 -2
- package/dist/web/public/assets/{installed-1JZZhebV.js.map → installed-C3GsWhFt.js.map} +1 -1
- package/dist/web/public/assets/{jobs-x1N93chr.js → jobs-Bu20ae1w.js} +2 -2
- package/dist/web/public/assets/{jobs-x1N93chr.js.map → jobs-Bu20ae1w.js.map} +1 -1
- package/dist/web/public/assets/{layout-vc5vV1Pk.js → layout-B4AOR7bx.js} +2 -2
- package/dist/web/public/assets/{layout-vc5vV1Pk.js.map → layout-B4AOR7bx.js.map} +1 -1
- package/dist/web/public/assets/{layout-x8HdhDD2.js → layout-BjiHbubM.js} +2 -2
- package/dist/web/public/assets/{layout-x8HdhDD2.js.map → layout-BjiHbubM.js.map} +1 -1
- package/dist/web/public/assets/{layout-B-1hwvUx.js → layout-C0eeaex1.js} +2 -2
- package/dist/web/public/assets/{layout-B-1hwvUx.js.map → layout-C0eeaex1.js.map} +1 -1
- package/dist/web/public/assets/{layout-BL59PdSJ.js → layout-CHFdMCNs.js} +2 -2
- package/dist/web/public/assets/{layout-BL59PdSJ.js.map → layout-CHFdMCNs.js.map} +1 -1
- package/dist/web/public/assets/{layout-BiPpIZhD.js → layout-e2mh2uBC.js} +2 -2
- package/dist/web/public/assets/{layout-BiPpIZhD.js.map → layout-e2mh2uBC.js.map} +1 -1
- package/dist/web/public/assets/{llm-BpQBNzJC.js → llm-CgMGyAjF.js} +2 -2
- package/dist/web/public/assets/{llm-BpQBNzJC.js.map → llm-CgMGyAjF.js.map} +1 -1
- package/dist/web/public/assets/{loader-circle-wNz3NK0s.js → loader-circle-D_dW2RUZ.js} +2 -2
- package/dist/web/public/assets/{loader-circle-wNz3NK0s.js.map → loader-circle-D_dW2RUZ.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-Cr5e7O3j.js → map-pin-jOOaGCmo.js} +2 -2
- package/dist/web/public/assets/{map-pin-Cr5e7O3j.js.map → map-pin-jOOaGCmo.js.map} +1 -1
- package/dist/web/public/assets/{mcp-rajqKYei.js → mcp-Ip_omrap.js} +2 -2
- package/dist/web/public/assets/{mcp-rajqKYei.js.map → mcp-Ip_omrap.js.map} +1 -1
- package/dist/web/public/assets/{memos-phDNldWv.js → memos-yOmAURiM.js} +2 -2
- package/dist/web/public/assets/{memos-phDNldWv.js.map → memos-yOmAURiM.js.map} +1 -1
- package/dist/web/public/assets/{messengers-DRUmbKlC.js → messengers-DdS6Tv_H.js} +2 -2
- package/dist/web/public/assets/{messengers-DRUmbKlC.js.map → messengers-DdS6Tv_H.js.map} +1 -1
- package/dist/web/public/assets/{mobile-DL7Gu4eC.js → mobile-7gRnqslc.js} +2 -2
- package/dist/web/public/assets/{mobile-DL7Gu4eC.js.map → mobile-7gRnqslc.js.map} +1 -1
- package/dist/web/public/assets/{network-CYY94XAD.js → network-ClaA9iUg.js} +2 -2
- package/dist/web/public/assets/{network-CYY94XAD.js.map → network-ClaA9iUg.js.map} +1 -1
- package/dist/web/public/assets/{outbox-DlK7zwpJ.js → outbox-YtiqLz-u.js} +2 -2
- package/dist/web/public/assets/{outbox-DlK7zwpJ.js.map → outbox-YtiqLz-u.js.map} +1 -1
- package/dist/web/public/assets/{pagination-CEtERXmh.js → pagination-DU9Lf0rD.js} +2 -2
- package/dist/web/public/assets/{pagination-CEtERXmh.js.map → pagination-DU9Lf0rD.js.map} +1 -1
- package/dist/web/public/assets/{persona-BAKPqEFa.js → persona-C9vZYuJJ.js} +2 -2
- package/dist/web/public/assets/{persona-BAKPqEFa.js.map → persona-C9vZYuJJ.js.map} +1 -1
- package/dist/web/public/assets/{plans-B6HmsMZO.js → plans-doYYvgG_.js} +2 -2
- package/dist/web/public/assets/{plans-B6HmsMZO.js.map → plans-doYYvgG_.js.map} +1 -1
- package/dist/web/public/assets/{play-CcC6v05z.js → play-C5MgP1qM.js} +2 -2
- package/dist/web/public/assets/{play-CcC6v05z.js.map → play-C5MgP1qM.js.map} +1 -1
- package/dist/web/public/assets/{plus-8qdCcw3J.js → plus-BFi9eVCl.js} +2 -2
- package/dist/web/public/assets/{plus-8qdCcw3J.js.map → plus-BFi9eVCl.js.map} +1 -1
- package/dist/web/public/assets/{policy-Cs-i-TJY.js → policy-DS3IIL78.js} +2 -2
- package/dist/web/public/assets/{policy-Cs-i-TJY.js.map → policy-DS3IIL78.js.map} +1 -1
- package/dist/web/public/assets/{qr-code-D37cggaF.js → qr-code-BL039OK7.js} +2 -2
- package/dist/web/public/assets/{qr-code-D37cggaF.js.map → qr-code-BL039OK7.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-BKRs7nNV.js → refresh-ccw-DBNikooZ.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-BKRs7nNV.js.map → refresh-ccw-DBNikooZ.js.map} +1 -1
- package/dist/web/public/assets/{reminders-D4Y9FJy5.js → reminders-BcymTbK9.js} +2 -2
- package/dist/web/public/assets/{reminders-D4Y9FJy5.js.map → reminders-BcymTbK9.js.map} +1 -1
- package/dist/web/public/assets/{save-BkYBfkO0.js → save-DZiTNYpH.js} +2 -2
- package/dist/web/public/assets/{save-BkYBfkO0.js.map → save-DZiTNYpH.js.map} +1 -1
- package/dist/web/public/assets/{schedules-DFywK1ml.js → schedules-C47XYMM0.js} +2 -2
- package/dist/web/public/assets/{schedules-DFywK1ml.js.map → schedules-C47XYMM0.js.map} +1 -1
- package/dist/web/public/assets/{search-k6ZRvy1D.js → search-DSXC_EYz.js} +2 -2
- package/dist/web/public/assets/{search-k6ZRvy1D.js.map → search-DSXC_EYz.js.map} +1 -1
- package/dist/web/public/assets/{search-Dd1xSL9p.js → search-DbPfPYg8.js} +2 -2
- package/dist/web/public/assets/{search-Dd1xSL9p.js.map → search-DbPfPYg8.js.map} +1 -1
- package/dist/web/public/assets/{security-DAMeDugi.js → security-D7z1GPFd.js} +2 -2
- package/dist/web/public/assets/{security-DAMeDugi.js.map → security-D7z1GPFd.js.map} +1 -1
- package/dist/web/public/assets/{service-COQVoStD.js → service-7mISPUwf.js} +2 -2
- package/dist/web/public/assets/{service-COQVoStD.js.map → service-7mISPUwf.js.map} +1 -1
- package/dist/web/public/assets/{shield-alert-CqDAxRHU.js → shield-alert-C3F8izo0.js} +2 -2
- package/dist/web/public/assets/{shield-alert-CqDAxRHU.js.map → shield-alert-C3F8izo0.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-Dgws2vye.js → status-badge-CvmA1Y93.js} +2 -2
- package/dist/web/public/assets/{status-badge-Dgws2vye.js.map → status-badge-CvmA1Y93.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-Chl5tnyq.js → subtasks-Bkgb9Pkm.js} +2 -2
- package/dist/web/public/assets/{subtasks-Chl5tnyq.js.map → subtasks-Bkgb9Pkm.js.map} +1 -1
- package/dist/web/public/assets/{table-BwEvaqRa.js → table-z7CVpKMe.js} +2 -2
- package/dist/web/public/assets/{table-BwEvaqRa.js.map → table-z7CVpKMe.js.map} +1 -1
- package/dist/web/public/assets/{topn-Bphz3dp-.js → topn-B7GHdOiE.js} +2 -2
- package/dist/web/public/assets/{topn-Bphz3dp-.js.map → topn-B7GHdOiE.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-CqlgSEso.js → trash-2-DdjC6QH7.js} +2 -2
- package/dist/web/public/assets/{trash-2-CqlgSEso.js.map → trash-2-DdjC6QH7.js.map} +1 -1
- package/dist/web/public/assets/{use-agim-skills-itOpYud_.js → use-agim-skills-CZkKns-g.js} +2 -2
- package/dist/web/public/assets/{use-agim-skills-itOpYud_.js.map → use-agim-skills-CZkKns-g.js.map} +1 -1
- package/dist/web/public/assets/{use-background-tasks-DSsDsdbz.js → use-background-tasks-CVdojnmx.js} +2 -2
- package/dist/web/public/assets/{use-background-tasks-DSsDsdbz.js.map → use-background-tasks-CVdojnmx.js.map} +1 -1
- package/dist/web/public/assets/{use-memory-Bf43EjHT.js → use-memory-CHARtjQ-.js} +2 -2
- package/dist/web/public/assets/{use-memory-Bf43EjHT.js.map → use-memory-CHARtjQ-.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-DNpZkKkn.js → use-observability-BtZPZLvB.js} +2 -2
- package/dist/web/public/assets/{use-observability-DNpZkKkn.js.map → use-observability-BtZPZLvB.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-C10E-yWx.js → use-settings-DHEiuHAv.js} +2 -2
- package/dist/web/public/assets/{use-settings-C10E-yWx.js.map → use-settings-DHEiuHAv.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-D48X-jjW.js → use-workspace-C1gInLvF.js} +2 -2
- package/dist/web/public/assets/{use-workspace-D48X-jjW.js.map → use-workspace-C1gInLvF.js.map} +1 -1
- package/dist/web/public/assets/{vector-LvPxtapk.js → vector-CLlo9px7.js} +2 -2
- package/dist/web/public/assets/{vector-LvPxtapk.js.map → vector-CLlo9px7.js.map} +1 -1
- package/dist/web/public/assets/{viewer-BTSQ5Kiy.js → viewer-BGdrQoJC.js} +2 -2
- package/dist/web/public/assets/{viewer-BTSQ5Kiy.js.map → viewer-BGdrQoJC.js.map} +1 -1
- package/dist/web/public/assets/{workspace-vy7c8qMt.js → workspace-zG8AgTev.js} +2 -2
- package/dist/web/public/assets/{workspace-vy7c8qMt.js.map → workspace-zG8AgTev.js.map} +1 -1
- package/dist/web/public/assets/{workspaces-BL_1nr0f.js → workspaces-DT2xLs5G.js} +2 -2
- package/dist/web/public/assets/{workspaces-BL_1nr0f.js.map → workspaces-DT2xLs5G.js.map} +1 -1
- package/dist/web/public/index.html +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subtasks-Chl5tnyq.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-Bkgb9Pkm.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-BiXaJRfQ.js";import{r as o}from"./react-DlP5eolq.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-z7CVpKMe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-
|
|
1
|
+
{"version":3,"file":"table-z7CVpKMe.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{o as S,u as w,f as M,j as e,B as L,L as p,S as j,g as u,h as f,i as N,k as b}from"./index-
|
|
1
|
+
import{o as S,u as w,f as M,j as e,B as L,L as p,S as j,g as u,h as f,i as N,k as b}from"./index-BiXaJRfQ.js";import{E as R}from"./empty-state-B0sJBvsG.js";import{T as V,a as $,b as g,c as t,d as E,e as c}from"./table-z7CVpKMe.js";import{a as F}from"./use-observability-BtZPZLvB.js";import{L as I}from"./loader-circle-D_dW2RUZ.js";import{R as P}from"./refresh-ccw-DBNikooZ.js";import"./react-DlP5eolq.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 J(){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 l=new URLSearchParams(n);for(const[x,h]of Object.entries(s))h==null?l.delete(x):l.set(x,h);y(l,{replace:!0})}const{data:k,isLoading:C,isFetching:o,refetch:T}=F({dim:i,by:r,days:v,limit:20}),d=k?.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:()=>T(),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))})]})]})]}),C?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(t,{className:"w-12",children:a("topn.col.rank")}),e.jsx(t,{children:a("topn.col.key")}),e.jsx(t,{className:"w-24",children:a("topn.col.calls")}),e.jsx(t,{className:"w-24",children:a("topn.col.cost")}),e.jsx(t,{className:"w-24",children:a("topn.col.errors")}),e.jsx(t,{className:"w-32",children:a("topn.col.avgLatencyMs")})]})}),e.jsx(E,{children:d.map((s,l)=>e.jsxs(g,{children:[e.jsx(c,{className:"tabular-nums text-text-dim",children:l+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}-${l}`))})]})]})}export{J as default};
|
|
7
|
-
//# sourceMappingURL=topn-
|
|
7
|
+
//# sourceMappingURL=topn-B7GHdOiE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topn-Bphz3dp-.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-B7GHdOiE.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{o as e}from"./index-
|
|
1
|
+
import{o as e}from"./index-BiXaJRfQ.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-DdjC6QH7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trash-2-
|
|
1
|
+
{"version":3,"file":"trash-2-DdjC6QH7.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]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as u,p as i,a as s,e as t}from"./index-
|
|
2
|
-
//# sourceMappingURL=use-agim-skills-
|
|
1
|
+
import{b as u,p as i,a as s,e as t}from"./index-BiXaJRfQ.js";const l={all:["agim-skills"],list:["agim-skills","list"],one:e=>["agim-skills","one",e]};function r(){return u({queryKey:l.list,queryFn:()=>i.get("/api/agim-skills")})}function m(e){return u({queryKey:e?l.one(e):["agim-skills","one","__none__"],queryFn:()=>i.get(`/api/agim-skills/${encodeURIComponent(e)}`),enabled:!!e})}function y(){const e=s();return t({mutationFn:n=>i.post("/api/agim-skills",{body:n}),onSuccess:()=>e.invalidateQueries({queryKey:l.all})})}function g(){const e=s();return t({mutationFn:({name:n,body:o})=>i.put(`/api/agim-skills/${encodeURIComponent(n)}`,{body:{body:o}}),onSuccess:()=>e.invalidateQueries({queryKey:l.all})})}function k(){const e=s();return t({mutationFn:n=>i.delete(`/api/agim-skills/${encodeURIComponent(n)}`),onSuccess:()=>e.invalidateQueries({queryKey:l.all})})}function p(){const e=s();return t({mutationFn:()=>i.post("/api/agim-skills/refresh"),onSuccess:()=>e.invalidateQueries({queryKey:l.all})})}const a=["agim-skills","injection"];function q(){return u({queryKey:a,queryFn:()=>i.get("/api/agim-skills/injection")})}function d(){const e=s();return t({mutationFn:n=>i.put("/api/agim-skills/injection",{body:{body:n}}),onSuccess:()=>e.invalidateQueries({queryKey:a})})}function S(){const e=s();return t({mutationFn:()=>i.delete("/api/agim-skills/injection"),onSuccess:()=>e.invalidateQueries({queryKey:a})})}export{p as a,y as b,m as c,g as d,k as e,q as f,d as g,S as h,r as u};
|
|
2
|
+
//# sourceMappingURL=use-agim-skills-CZkKns-g.js.map
|
package/dist/web/public/assets/{use-agim-skills-itOpYud_.js.map → use-agim-skills-CZkKns-g.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-agim-skills-
|
|
1
|
+
{"version":3,"file":"use-agim-skills-CZkKns-g.js","sources":["../../src/hooks/use-agim-skills.ts"],"sourcesContent":["/**\n * use-agim-skills — react-query wrappers for the agim SKILL.md\n * editor (`/api/agim-skills/*`).\n *\n * Distinct from the pre-existing `useSkills*` hooks against\n * `/api/skills` (which lists per-agent workspace CLI skills);\n * this set targets the in-process loader from\n * src/core/skills/loader.ts.\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { client } from '@/lib/api/client'\n\nexport interface AgimSkillMeta {\n name: string\n description: string\n source: 'workspace' | 'builtin'\n always: boolean\n available: boolean\n unavailableReason?: string\n requiresBins: string[]\n requiresEnv: string[]\n dir: string\n /** v1.2.152 — system-prompt injection bucket (0–4). See loader.ts\n * `rankSkillBucket`. SPA uses this to group + collapse the installed\n * list. Optional for backward compat with older agim builds. */\n bucket?: 0 | 1 | 2 | 3 | 4\n}\n\nexport interface AgimSkillsListResponse {\n skills: AgimSkillMeta[]\n count: number\n maxBodyChars: number\n}\n\nexport interface AgimSkillDetailResponse {\n meta: AgimSkillMeta\n body: string\n}\n\nconst skillKeys = {\n all: ['agim-skills'] as const,\n list: ['agim-skills', 'list'] as const,\n one: (name: string) => ['agim-skills', 'one', name] as const,\n}\n\nexport function useAgimSkillsList() {\n return useQuery<AgimSkillsListResponse>({\n queryKey: skillKeys.list,\n queryFn: () => client.get<AgimSkillsListResponse>('/api/agim-skills'),\n })\n}\n\nexport function useAgimSkill(name: string | null) {\n return useQuery<AgimSkillDetailResponse>({\n queryKey: name ? skillKeys.one(name) : ['agim-skills', 'one', '__none__'],\n queryFn: () => client.get<AgimSkillDetailResponse>(`/api/agim-skills/${encodeURIComponent(name!)}`),\n enabled: !!name,\n })\n}\n\nexport function useAgimSkillCreate() {\n const qc = useQueryClient()\n return useMutation<{ meta: AgimSkillMeta }, Error, { name: string; body: string }>({\n mutationFn: (body) => client.post('/api/agim-skills', { body }),\n onSuccess: () => qc.invalidateQueries({ queryKey: skillKeys.all }),\n })\n}\n\nexport function useAgimSkillUpdate() {\n const qc = useQueryClient()\n return useMutation<{ meta: AgimSkillMeta }, Error, { name: string; body: string }>({\n mutationFn: ({ name, body }) => client.put(\n `/api/agim-skills/${encodeURIComponent(name)}`, { body: { body } },\n ),\n onSuccess: () => qc.invalidateQueries({ queryKey: skillKeys.all }),\n })\n}\n\nexport function useAgimSkillDelete() {\n const qc = useQueryClient()\n return useMutation<unknown, Error, string>({\n mutationFn: (name) => client.delete(`/api/agim-skills/${encodeURIComponent(name)}`),\n onSuccess: () => qc.invalidateQueries({ queryKey: skillKeys.all }),\n })\n}\n\nexport function useAgimSkillsRefresh() {\n const qc = useQueryClient()\n return useMutation<{ count: number }, Error, void>({\n mutationFn: () => client.post('/api/agim-skills/refresh'),\n onSuccess: () => qc.invalidateQueries({ queryKey: skillKeys.all }),\n })\n}\n\n// ─── v1.2.151 — injection-block override editor (operator-facing) ──────\n\nexport interface AgimSkillsInjectionResponse {\n /** The auto-generated tier-1 skill block from the live loader state.\n * Read-only preview the SPA shows on the left. */\n auto: string\n autoChars: number\n /** Current override file content (null when no override is active). */\n override: string | null\n overrideChars: number\n /** Absolute filesystem path of the override file (display-only). */\n overridePath: string\n /** True when the loader is currently using the override instead of\n * the auto block. */\n overrideActive: boolean\n /** Server-enforced character cap on the override body. */\n maxOverrideChars: number\n}\n\nconst injectionKey = ['agim-skills', 'injection'] as const\n\nexport function useSkillInjection() {\n return useQuery<AgimSkillsInjectionResponse>({\n queryKey: injectionKey,\n queryFn: () => client.get<AgimSkillsInjectionResponse>('/api/agim-skills/injection'),\n })\n}\n\nexport function useSkillInjectionSave() {\n const qc = useQueryClient()\n return useMutation<{ saved: boolean; deleted?: boolean; length?: number }, Error, string>({\n mutationFn: (body) => client.put('/api/agim-skills/injection', { body: { body } }),\n onSuccess: () => qc.invalidateQueries({ queryKey: injectionKey }),\n })\n}\n\nexport function useSkillInjectionDelete() {\n const qc = useQueryClient()\n return useMutation<{ deleted: boolean }, Error, void>({\n mutationFn: () => client.delete('/api/agim-skills/injection'),\n onSuccess: () => qc.invalidateQueries({ queryKey: injectionKey }),\n })\n}\n"],"names":["skillKeys","name","useAgimSkillsList","useQuery","client","useAgimSkill","useAgimSkillCreate","qc","useQueryClient","useMutation","body","useAgimSkillUpdate","useAgimSkillDelete","useAgimSkillsRefresh","injectionKey","useSkillInjection","useSkillInjectionSave","useSkillInjectionDelete"],"mappings":"6DAwCA,MAAMA,EAAY,CAChB,IAAM,CAAC,aAAa,EACpB,KAAM,CAAC,cAAe,MAAM,EAC5B,IAAOC,GAAiB,CAAC,cAAe,MAAOA,CAAI,CACrD,EAEO,SAASC,GAAoB,CAClC,OAAOC,EAAiC,CACtC,SAAUH,EAAU,KACpB,QAAS,IAAMI,EAAO,IAA4B,kBAAkB,CAAA,CACrE,CACH,CAEO,SAASC,EAAaJ,EAAqB,CAChD,OAAOE,EAAkC,CACvC,SAAUF,EAAOD,EAAU,IAAIC,CAAI,EAAI,CAAC,cAAe,MAAO,UAAU,EACxE,QAAS,IAAMG,EAAO,IAA6B,oBAAoB,mBAAmBH,CAAK,CAAC,EAAE,EAClG,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASK,GAAqB,CACnC,MAAMC,EAAKC,EAAA,EACX,OAAOC,EAA4E,CACjF,WAAaC,GAASN,EAAO,KAAK,mBAAoB,CAAE,KAAAM,EAAM,EAC9D,UAAW,IAAMH,EAAG,kBAAkB,CAAE,SAAUP,EAAU,IAAK,CAAA,CAClE,CACH,CAEO,SAASW,GAAqB,CACnC,MAAMJ,EAAKC,EAAA,EACX,OAAOC,EAA4E,CACjF,WAAY,CAAC,CAAE,KAAAR,EAAM,KAAAS,CAAA,IAAWN,EAAO,IACrC,oBAAoB,mBAAmBH,CAAI,CAAC,GAAI,CAAE,KAAM,CAAE,KAAAS,CAAA,CAAK,CAAE,EAEnE,UAAW,IAAMH,EAAG,kBAAkB,CAAE,SAAUP,EAAU,IAAK,CAAA,CAClE,CACH,CAEO,SAASY,GAAqB,CACnC,MAAML,EAAKC,EAAA,EACX,OAAOC,EAAoC,CACzC,WAAaR,GAASG,EAAO,OAAO,oBAAoB,mBAAmBH,CAAI,CAAC,EAAE,EAClF,UAAW,IAAMM,EAAG,kBAAkB,CAAE,SAAUP,EAAU,IAAK,CAAA,CAClE,CACH,CAEO,SAASa,GAAuB,CACrC,MAAMN,EAAKC,EAAA,EACX,OAAOC,EAA4C,CACjD,WAAY,IAAML,EAAO,KAAK,0BAA0B,EACxD,UAAW,IAAMG,EAAG,kBAAkB,CAAE,SAAUP,EAAU,IAAK,CAAA,CAClE,CACH,CAqBA,MAAMc,EAAe,CAAC,cAAe,WAAW,EAEzC,SAASC,GAAoB,CAClC,OAAOZ,EAAsC,CAC3C,SAAUW,EACV,QAAS,IAAMV,EAAO,IAAiC,4BAA4B,CAAA,CACpF,CACH,CAEO,SAASY,GAAwB,CACtC,MAAMT,EAAKC,EAAA,EACX,OAAOC,EAAmF,CACxF,WAAaC,GAASN,EAAO,IAAI,6BAA8B,CAAE,KAAM,CAAE,KAAAM,CAAA,EAAQ,EACjF,UAAW,IAAMH,EAAG,kBAAkB,CAAE,SAAUO,EAAc,CAAA,CACjE,CACH,CAEO,SAASG,GAA0B,CACxC,MAAMV,EAAKC,EAAA,EACX,OAAOC,EAA+C,CACpD,WAAY,IAAML,EAAO,OAAO,4BAA4B,EAC5D,UAAW,IAAMG,EAAG,kBAAkB,CAAE,SAAUO,EAAc,CAAA,CACjE,CACH"}
|
package/dist/web/public/assets/{use-background-tasks-DSsDsdbz.js → use-background-tasks-CVdojnmx.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as s,p as a,a as i,e as l}from"./index-
|
|
2
|
-
//# sourceMappingURL=use-background-tasks-
|
|
1
|
+
import{b as s,p as a,a as i,e as l}from"./index-BiXaJRfQ.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 f(){return s({queryKey:u.list,queryFn:()=>a.get("/api/goals"),refetchInterval:3e4})}function h(){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 m(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,f as b,h as c,q as d,K as e,m as f,g as u};
|
|
2
|
+
//# sourceMappingURL=use-background-tasks-CVdojnmx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-background-tasks-
|
|
1
|
+
{"version":3,"file":"use-background-tasks-CVdojnmx.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":"6DAoCA,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{b as u,d as r,a as t,e as o,a6 as i}from"./index-
|
|
2
|
-
//# sourceMappingURL=use-memory-
|
|
1
|
+
import{b as u,d as r,a as t,e as o,a6 as i}from"./index-BiXaJRfQ.js";const n={all:["memory"],users:["memory","users"],facts:e=>["memory","facts",e],persona:e=>["memory","persona",e],consolidate:["memory","consolidate"]};function l(){return u({queryKey:n.users,queryFn:()=>r.listMemoryUsers()})}function y(e,s={}){return u({queryKey:n.facts(e),queryFn:()=>r.listMemoryFacts(e),enabled:s.enabled!==!1&&!!e.user_key})}function d(){const e=t();return o({mutationFn:({id:s,user_key:a})=>r.deleteMemoryFactById(s,{user_key:a}),onSuccess:()=>e.invalidateQueries({queryKey:n.all})})}function m(){const e=t();return o({mutationFn:({user_key:s,body:a})=>r.deleteMemoryFacts({user_key:s},a),onSuccess:()=>e.invalidateQueries({queryKey:n.all})})}function f(e,s={}){return u({queryKey:n.persona(e),queryFn:async()=>{try{return await r.getMemoryPersona({user_key:e})}catch(a){if(a instanceof i&&a.status===404)return null;throw a}},enabled:s.enabled!==!1&&!!e})}function q(){const e=t();return o({mutationFn:({user_key:s,body:a})=>r.updateMemoryPersona({user_key:s},a),onSuccess:(s,a)=>{e.invalidateQueries({queryKey:n.persona(a.user_key)}),e.invalidateQueries({queryKey:n.users})}})}function F(){const e=t();return o({mutationFn:s=>r.deleteMemoryPersona({user_key:s}),onSuccess:(s,a)=>{e.invalidateQueries({queryKey:n.persona(a)}),e.invalidateQueries({queryKey:n.users})}})}function K(e={}){return u({queryKey:n.consolidate,queryFn:()=>r.getMemoryConsolidateStatus(),refetchInterval:3e3,refetchIntervalInBackground:!1,enabled:e.enabled!==!1})}function M(){const e=t();return o({mutationFn:()=>r.consolidateMemory(),onSuccess:()=>{e.invalidateQueries({queryKey:n.consolidate}),e.invalidateQueries({queryKey:n.all})}})}export{y as a,d as b,m as c,f as d,M as e,K as f,q as g,F as h,n as m,l as u};
|
|
2
|
+
//# sourceMappingURL=use-memory-CHARtjQ-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-memory-
|
|
1
|
+
{"version":3,"file":"use-memory-CHARtjQ-.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-DNpZkKkn.js → use-observability-BtZPZLvB.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as r,d as n}from"./index-
|
|
2
|
-
//# sourceMappingURL=use-observability-
|
|
1
|
+
import{b as r,d as n}from"./index-BiXaJRfQ.js";const i={all:["observability"],health:e=>["observability","health",e],topN:(e,t,a,u)=>["observability","topn",e,t,a,u],audit:e=>["observability","audit",e]};function y(e){return r({queryKey:i.health(e),queryFn:()=>n.getHealthSummary({days:e}),refetchInterval:3e4,refetchIntervalInBackground:!1})}function o(e){const t=e.days??7,a=e.limit??10;return r({queryKey:i.topN(e.dim,e.by,t,a),queryFn:()=>n.getHealthTopN({dim:e.dim,by:e.by,days:t,limit:a}),refetchInterval:6e4,refetchIntervalInBackground:!1})}function s(e){return r({queryKey:i.audit(e),queryFn:()=>n.getAudit(e),refetchInterval:1e4,refetchIntervalInBackground:!1})}export{o as a,s as b,y as u};
|
|
2
|
+
//# sourceMappingURL=use-observability-BtZPZLvB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-observability-
|
|
1
|
+
{"version":3,"file":"use-observability-BtZPZLvB.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":"+CA0BO,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{b as u,d as n,a as i,e as s}from"./index-
|
|
2
|
-
//# sourceMappingURL=use-settings-
|
|
1
|
+
import{b as u,d as n,a as i,e as s}from"./index-BiXaJRfQ.js";const r={all:["settings"],env:e=>["settings","env",e],service:["settings","service"],admins:["settings","admins"],config:["settings","config"],workspaces:["settings","workspaces"]};function o(e={}){const t=!!e.reveal;return u({queryKey:r.env(t),queryFn:()=>n.getEnv({reveal:t})})}function v(){const e=i();return s({mutationFn:t=>n.updateEnv(t),onSuccess:()=>e.invalidateQueries({queryKey:["settings","env"]})})}function l(){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 f(){const e=i();return a(()=>n.stopService(),e)}function d(){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 m(){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 p(){const e=i();return s({mutationFn:t=>n.updateConfig(t),onSuccess:()=>e.invalidateQueries({queryKey:r.config})})}function F(){return u({queryKey:r.workspaces,queryFn:()=>n.listWorkspacesFull()})}function A(){const e=i();return s({mutationFn:t=>n.upsertWorkspace(t),onSuccess:()=>e.invalidateQueries({queryKey:r.workspaces})})}function h(){return s({mutationFn:()=>n.startWechatQr()})}function K(e){return u({queryKey:["settings","wechat-qr",e??""],queryFn:()=>n.getWechatQrStatus({token:e}),enabled:!!e,refetchInterval:2e3,refetchIntervalInBackground:!1})}function w(){return s({mutationFn:e=>n.testAcpAgent(e)})}function Q(){return s({mutationFn:e=>n.discoverAcpAgents(e)})}function k(){return s({mutationFn:()=>n.testEmail()})}function W(){return u({queryKey:["settings","search","providers"],queryFn:()=>n.getSearchProviders()})}function E(){return s({mutationFn:e=>n.testSearchProvider(e)})}function I(){return u({queryKey:["settings","viewer-tunnel"],queryFn:()=>n.getViewerTunnel()})}export{v as a,S as b,p as c,h as d,K as e,k as f,I as g,w as h,Q as i,l as j,y as k,f as l,d as m,q as n,g as o,m as p,F as q,A as r,W as s,E as t,o as u};
|
|
2
|
+
//# sourceMappingURL=use-settings-DHEiuHAv.js.map
|
package/dist/web/public/assets/{use-settings-C10E-yWx.js.map → use-settings-DHEiuHAv.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-settings-C10E-yWx.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-DHEiuHAv.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{b as r,d as u,a as i,e as o}from"./index-
|
|
2
|
-
//# sourceMappingURL=use-workspace-
|
|
1
|
+
import{b as r,d as u,a as i,e as o}from"./index-BiXaJRfQ.js";const t={all:["workspace"],files:(e,s)=>["workspace","files",e,s]};function c(){return r({queryKey:["agents","status"],queryFn:()=>u.getAgentsStatus()})}function y(e,s,a={}){return r({queryKey:t.files(e,s),queryFn:()=>u.getWorkspaceFiles({agent:e,...s?{path:s}:{}}),enabled:a.enabled!==!1&&!!e})}function f(){const e=i();return o({mutationFn:({agent:s,path:a,body:n})=>u.writeWorkspaceFile({agent:s,path:a},n),onSuccess:()=>e.invalidateQueries({queryKey:t.all})})}export{y as a,f as b,c as u};
|
|
2
|
+
//# sourceMappingURL=use-workspace-C1gInLvF.js.map
|
package/dist/web/public/assets/{use-workspace-D48X-jjW.js.map → use-workspace-C1gInLvF.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-workspace-
|
|
1
|
+
{"version":3,"file":"use-workspace-C1gInLvF.js","sources":["../../src/hooks/use-workspace.ts"],"sourcesContent":["/**\n * useWorkspace — agent picker source + per-agent file browser +\n * write mutation.\n *\n * useAgentsStatus() — populate the picker\n * useWorkspaceFiles(agent, path) — dir listing or file\n * content (discriminated\n * by `type`)\n * useWriteWorkspaceFile() — PUT a file\n *\n * Both reads stay cached at the default 30s staleTime; the write\n * invalidates so the saved size/mtime re-paint immediately.\n */\n\nimport { useQueryClient, useQuery, useMutation } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type {\n WorkspaceFilesResponse,\n WriteWorkspaceFileBody,\n WriteWorkspaceFileResponse,\n} from '@/types/api'\n\nexport const workspaceKeys = {\n all: ['workspace'] as const,\n files: (agent: string, path: string) =>\n ['workspace', 'files', agent, path] as const,\n}\n\nexport function useAgentsStatus() {\n return useQuery<Record<string, boolean>>({\n queryKey: ['agents', 'status'],\n queryFn: () => api.getAgentsStatus(),\n })\n}\n\nexport function useWorkspaceFiles(\n agent: string,\n path: string,\n opts: { enabled?: boolean } = {},\n) {\n return useQuery<WorkspaceFilesResponse>({\n queryKey: workspaceKeys.files(agent, path),\n queryFn: () => api.getWorkspaceFiles({ agent, ...(path ? { path } : {}) }),\n enabled: opts.enabled !== false && Boolean(agent),\n })\n}\n\nexport function useInvalidateWorkspace() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: workspaceKeys.all })\n}\n\nexport function useWriteWorkspaceFile() {\n const qc = useQueryClient()\n return useMutation<\n WriteWorkspaceFileResponse,\n Error,\n { agent: string; path: string; body: WriteWorkspaceFileBody }\n >({\n mutationFn: ({ agent, path, body }) =>\n api.writeWorkspaceFile({ agent, path }, body),\n onSuccess: () => qc.invalidateQueries({ queryKey: workspaceKeys.all }),\n })\n}\n"],"names":["workspaceKeys","agent","path","useAgentsStatus","useQuery","api","useWorkspaceFiles","opts","useWriteWorkspaceFile","qc","useQueryClient","useMutation","body"],"mappings":"6DAsBO,MAAMA,EAAgB,CAC3B,IAAO,CAAC,WAAW,EACnB,MAAO,CAACC,EAAeC,IACrB,CAAC,YAAa,QAASD,EAAOC,CAAI,CACtC,EAEO,SAASC,GAAkB,CAChC,OAAOC,EAAkC,CACvC,SAAU,CAAC,SAAU,QAAQ,EAC7B,QAAS,IAAMC,EAAI,gBAAA,CAAgB,CACpC,CACH,CAEO,SAASC,EACdL,EACAC,EACAK,EAA8B,CAAA,EAC9B,CACA,OAAOH,EAAiC,CACtC,SAAUJ,EAAc,MAAMC,EAAOC,CAAI,EACzC,QAAS,IAAMG,EAAI,kBAAkB,CAAE,MAAAJ,EAAO,GAAIC,EAAO,CAAE,KAAAA,GAAS,CAAA,EAAK,EACzE,QAASK,EAAK,UAAY,IAAS,EAAQN,CAAK,CACjD,CACH,CAOO,SAASO,GAAwB,CACtC,MAAMC,EAAKC,EAAA,EACX,OAAOC,EAIL,CACA,WAAY,CAAC,CAAE,MAAAV,EAAO,KAAAC,EAAM,KAAAU,CAAA,IAC1BP,EAAI,mBAAmB,CAAE,MAAAJ,EAAO,KAAAC,CAAA,EAAQU,CAAI,EAC9C,UAAW,IAAMH,EAAG,kBAAkB,CAAE,SAAUT,EAAc,IAAK,CAAA,CACtE,CACH"}
|