agim-cli 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/README.md +39 -3
- package/README.zh-CN.md +42 -7
- package/dist/cli-ui/cmd-handlers.d.ts +22 -1
- package/dist/cli-ui/cmd-handlers.d.ts.map +1 -1
- package/dist/cli-ui/cmd-handlers.js +304 -40
- package/dist/cli-ui/cmd-handlers.js.map +1 -1
- package/dist/cli-ui/config-wizard.d.ts +13 -1
- package/dist/cli-ui/config-wizard.d.ts.map +1 -1
- package/dist/cli-ui/config-wizard.js +93 -21
- package/dist/cli-ui/config-wizard.js.map +1 -1
- package/dist/cli-ui/doctor.d.ts +15 -0
- package/dist/cli-ui/doctor.d.ts.map +1 -0
- package/dist/cli-ui/doctor.js +151 -0
- package/dist/cli-ui/doctor.js.map +1 -0
- package/dist/cli-ui/entry-menu.d.ts +6 -0
- package/dist/cli-ui/entry-menu.d.ts.map +1 -1
- package/dist/cli-ui/entry-menu.js +67 -30
- package/dist/cli-ui/entry-menu.js.map +1 -1
- package/dist/cli-ui/i18n.d.ts +15 -6
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +30 -12
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/quickstart.d.ts +3 -0
- package/dist/cli-ui/quickstart.d.ts.map +1 -0
- package/dist/cli-ui/quickstart.js +108 -0
- package/dist/cli-ui/quickstart.js.map +1 -0
- package/dist/cli-ui/readiness.d.ts +10 -0
- package/dist/cli-ui/readiness.d.ts.map +1 -0
- package/dist/cli-ui/readiness.js +75 -0
- package/dist/cli-ui/readiness.js.map +1 -0
- package/dist/cli-ui/service.d.ts +23 -0
- package/dist/cli-ui/service.d.ts.map +1 -1
- package/dist/cli-ui/service.js +114 -5
- package/dist/cli-ui/service.js.map +1 -1
- package/dist/cli.js +99 -396
- package/dist/cli.js.map +1 -1
- package/dist/core/acp-server.d.ts.map +1 -1
- package/dist/core/acp-server.js +16 -2
- package/dist/core/acp-server.js.map +1 -1
- package/dist/core/agent-cwd.d.ts +8 -0
- package/dist/core/agent-cwd.d.ts.map +1 -1
- package/dist/core/agent-cwd.js +57 -7
- package/dist/core/agent-cwd.js.map +1 -1
- package/dist/core/commands/builtin.d.ts.map +1 -1
- package/dist/core/commands/builtin.js +12 -2
- package/dist/core/commands/builtin.js.map +1 -1
- package/dist/core/commands/model.d.ts.map +1 -1
- package/dist/core/commands/model.js +31 -2
- package/dist/core/commands/model.js.map +1 -1
- package/dist/core/llm/anthropic-provider.js +2 -1
- package/dist/core/llm/anthropic-provider.js.map +1 -1
- package/dist/core/llm/openai-compat-provider.js +3 -2
- package/dist/core/llm/openai-compat-provider.js.map +1 -1
- package/dist/core/llm/provider-base.d.ts +4 -4
- package/dist/core/llm/provider-base.d.ts.map +1 -1
- package/dist/core/llm/provider-base.js +1 -1
- package/dist/core/llm/provider-base.js.map +1 -1
- package/dist/plugins/agents/native/index.d.ts +1 -0
- package/dist/plugins/agents/native/index.d.ts.map +1 -1
- package/dist/plugins/agents/native/index.js +14 -0
- package/dist/plugins/agents/native/index.js.map +1 -1
- package/dist/plugins/agents/pi-native/factory.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/factory.js +19 -3
- package/dist/plugins/agents/pi-native/factory.js.map +1 -1
- package/dist/plugins/agents/pi-native/index.d.ts +11 -0
- package/dist/plugins/agents/pi-native/index.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/index.js +56 -2
- package/dist/plugins/agents/pi-native/index.js.map +1 -1
- package/dist/plugins/agents/pi-native/provider-resolver.d.ts +2 -0
- package/dist/plugins/agents/pi-native/provider-resolver.d.ts.map +1 -1
- package/dist/plugins/agents/pi-native/provider-resolver.js +9 -1
- package/dist/plugins/agents/pi-native/provider-resolver.js.map +1 -1
- package/dist/web/public/assets/a2a-CTsDMefo.js +7 -0
- package/dist/web/public/assets/a2a-CTsDMefo.js.map +1 -0
- package/dist/web/public/assets/{activity-BAgb2WZC.js → activity-ul8Os7Pz.js} +2 -2
- package/dist/web/public/assets/{activity-BAgb2WZC.js.map → activity-ul8Os7Pz.js.map} +1 -1
- package/dist/web/public/assets/{admins-CZYANmhn.js → admins-ByMAuquy.js} +3 -3
- package/dist/web/public/assets/{admins-CZYANmhn.js.map → admins-ByMAuquy.js.map} +1 -1
- package/dist/web/public/assets/agents-Ds1zyxBj.js +2 -0
- package/dist/web/public/assets/{agents-BXThDW6f.js.map → agents-Ds1zyxBj.js.map} +1 -1
- package/dist/web/public/assets/{approvals-ByPXIYVl.js → approvals-DOWlWI7Z.js} +3 -3
- package/dist/web/public/assets/{approvals-ByPXIYVl.js.map → approvals-DOWlWI7Z.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-B8DkdbEY.js → arrow-down-7i0xwCI2.js} +2 -2
- package/dist/web/public/assets/{arrow-down-B8DkdbEY.js.map → arrow-down-7i0xwCI2.js.map} +1 -1
- package/dist/web/public/assets/arrow-right-A889Wof8.js +7 -0
- package/dist/web/public/assets/arrow-right-A889Wof8.js.map +1 -0
- package/dist/web/public/assets/{arrow-up-i_dEdXkz.js → arrow-up-Dm0U4-6U.js} +2 -2
- package/dist/web/public/assets/{arrow-up-i_dEdXkz.js.map → arrow-up-Dm0U4-6U.js.map} +1 -1
- package/dist/web/public/assets/{asks-yD_inOnM.js → asks-DGuBsrJ7.js} +3 -3
- package/dist/web/public/assets/{asks-yD_inOnM.js.map → asks-DGuBsrJ7.js.map} +1 -1
- package/dist/web/public/assets/{audit-teCIRtgN.js → audit-BRXsplJ2.js} +2 -2
- package/dist/web/public/assets/{audit-teCIRtgN.js.map → audit-BRXsplJ2.js.map} +1 -1
- package/dist/web/public/assets/{bell-CeWDMs8_.js → bell-B-UdeJsp.js} +2 -2
- package/dist/web/public/assets/{bell-CeWDMs8_.js.map → bell-B-UdeJsp.js.map} +1 -1
- package/dist/web/public/assets/bgjobs-CcRiffyJ.js +2 -0
- package/dist/web/public/assets/bgjobs-CcRiffyJ.js.map +1 -0
- package/dist/web/public/assets/book-open-CSCq5cjL.js +7 -0
- package/dist/web/public/assets/book-open-CSCq5cjL.js.map +1 -0
- package/dist/web/public/assets/{brain-BQqv0Zhc.js → brain-Dl4DF5kX.js} +2 -2
- package/dist/web/public/assets/{brain-BQqv0Zhc.js.map → brain-Dl4DF5kX.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-DUXbR4xs.js → briefcase-CeKUkFSq.js} +2 -2
- package/dist/web/public/assets/{briefcase-DUXbR4xs.js.map → briefcase-CeKUkFSq.js.map} +1 -1
- package/dist/web/public/assets/chat-rLJMdJBk.js +12 -0
- package/dist/web/public/assets/chat-rLJMdJBk.js.map +1 -0
- package/dist/web/public/assets/{chevron-left-RC6mMSiX.js → chevron-left-01fAFVpo.js} +2 -2
- package/dist/web/public/assets/{chevron-left-RC6mMSiX.js.map → chevron-left-01fAFVpo.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-DrkYVi19.js → chevron-right-CFRb-SM_.js} +3 -3
- package/dist/web/public/assets/{chevron-right-DrkYVi19.js.map → chevron-right-CFRb-SM_.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-BC8ntMsz.js → circle-check-big-DBg2BD6o.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-BC8ntMsz.js.map → circle-check-big-DBg2BD6o.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-DHK7ypFY.js → circle-x-CqFMzO-x.js} +2 -2
- package/dist/web/public/assets/{circle-x-DHK7ypFY.js.map → circle-x-CqFMzO-x.js.map} +1 -1
- package/dist/web/public/assets/clipboard-list-lnqdk2_J.js +7 -0
- package/dist/web/public/assets/clipboard-list-lnqdk2_J.js.map +1 -0
- package/dist/web/public/assets/{clock-DXHhWqJH.js → clock-4hd1joQe.js} +3 -3
- package/dist/web/public/assets/{clock-DXHhWqJH.js.map → clock-4hd1joQe.js.map} +1 -1
- package/dist/web/public/assets/confirm-dialog-BDb0NLny.js +2 -0
- package/dist/web/public/assets/{confirm-dialog-gPKJnvEW.js.map → confirm-dialog-BDb0NLny.js.map} +1 -1
- package/dist/web/public/assets/{copy-DtQxgcR0.js → copy-CD4A7VD8.js} +3 -3
- package/dist/web/public/assets/{copy-DtQxgcR0.js.map → copy-CD4A7VD8.js.map} +1 -1
- package/dist/web/public/assets/dashboard-CG3WiG7h.js +2 -0
- package/dist/web/public/assets/dashboard-CG3WiG7h.js.map +1 -0
- package/dist/web/public/assets/{data-table-DOKUic1J.js → data-table-BkUshOZz.js} +2 -2
- package/dist/web/public/assets/{data-table-DOKUic1J.js.map → data-table-BkUshOZz.js.map} +1 -1
- package/dist/web/public/assets/database-lQzk64rV.js +7 -0
- package/dist/web/public/assets/database-lQzk64rV.js.map +1 -0
- package/dist/web/public/assets/{distill-p6P7-1UR.js → distill-CPurVW3v.js} +3 -3
- package/dist/web/public/assets/{distill-p6P7-1UR.js.map → distill-CPurVW3v.js.map} +1 -1
- package/dist/web/public/assets/{download-CqNiIHa8.js → download-CVZnHcwj.js} +2 -2
- package/dist/web/public/assets/{download-CqNiIHa8.js.map → download-CVZnHcwj.js.map} +1 -1
- package/dist/web/public/assets/dropdown-menu-BNH5SrVb.js +7 -0
- package/dist/web/public/assets/dropdown-menu-BNH5SrVb.js.map +1 -0
- package/dist/web/public/assets/{email-DwbfTUlV.js → email-YlI4MWLp.js} +3 -3
- package/dist/web/public/assets/{email-DwbfTUlV.js.map → email-YlI4MWLp.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-CTwOQemt.js → empty-state-CuiqdZiB.js} +2 -2
- package/dist/web/public/assets/{empty-state-CTwOQemt.js.map → empty-state-CuiqdZiB.js.map} +1 -1
- package/dist/web/public/assets/{external-link-BY7Ye8yi.js → external-link-1WPpVvdu.js} +2 -2
- package/dist/web/public/assets/{external-link-BY7Ye8yi.js.map → external-link-1WPpVvdu.js.map} +1 -1
- package/dist/web/public/assets/{eye-6RUADoDS.js → eye-BfPyNFzk.js} +2 -2
- package/dist/web/public/assets/{eye-6RUADoDS.js.map → eye-BfPyNFzk.js.map} +1 -1
- package/dist/web/public/assets/{facts-DXE0aJmb.js → facts-xT_24pH8.js} +2 -2
- package/dist/web/public/assets/{facts-DXE0aJmb.js.map → facts-xT_24pH8.js.map} +1 -1
- package/dist/web/public/assets/file-text-BxfdLM0-.js +7 -0
- package/dist/web/public/assets/file-text-BxfdLM0-.js.map +1 -0
- package/dist/web/public/assets/{goals-C1LCm3qL.js → goals-C8ZQfbhj.js} +3 -3
- package/dist/web/public/assets/{goals-C1LCm3qL.js.map → goals-C8ZQfbhj.js.map} +1 -1
- package/dist/web/public/assets/health-A2StNEfn.js +2 -0
- package/dist/web/public/assets/{health-wqCp-K_o.js.map → health-A2StNEfn.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-DfqI4GF7.js → heart-pulse-DXlE9oic.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-DfqI4GF7.js.map → heart-pulse-DXlE9oic.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-Bumv4XtQ.js → heartbeat-ClO5gJrj.js} +3 -3
- package/dist/web/public/assets/{heartbeat-Bumv4XtQ.js.map → heartbeat-ClO5gJrj.js.map} +1 -1
- package/dist/web/public/assets/hot-bfTA-V_z.js +7 -0
- package/dist/web/public/assets/{hot-B-CMjQIr.js.map → hot-bfTA-V_z.js.map} +1 -1
- package/dist/web/public/assets/index-Bi2qWb-u.css +1 -0
- package/dist/web/public/assets/index-DCfdN5R7.js +244 -0
- package/dist/web/public/assets/index-DCfdN5R7.js.map +1 -0
- package/dist/web/public/assets/{injection-Dn_XqgLG.js → injection-omvCR6-p.js} +2 -2
- package/dist/web/public/assets/{injection-Dn_XqgLG.js.map → injection-omvCR6-p.js.map} +1 -1
- package/dist/web/public/assets/{installed-Cet-1M2Q.js → installed-DL6r3ktm.js} +4 -9
- package/dist/web/public/assets/installed-DL6r3ktm.js.map +1 -0
- package/dist/web/public/assets/jobs-Biy5lYd4.js +2 -0
- package/dist/web/public/assets/jobs-Biy5lYd4.js.map +1 -0
- package/dist/web/public/assets/layout-BLm6NJ3V.js +2 -0
- package/dist/web/public/assets/layout-BLm6NJ3V.js.map +1 -0
- package/dist/web/public/assets/layout-BTKafRVZ.js +2 -0
- package/dist/web/public/assets/layout-BTKafRVZ.js.map +1 -0
- package/dist/web/public/assets/layout-Bm-2s2fp.js +2 -0
- package/dist/web/public/assets/layout-Bm-2s2fp.js.map +1 -0
- package/dist/web/public/assets/layout-DsZ8eR4i.js +2 -0
- package/dist/web/public/assets/layout-DsZ8eR4i.js.map +1 -0
- package/dist/web/public/assets/{layout-D_3ZcVG7.js → layout-sxvovjEH.js} +2 -2
- package/dist/web/public/assets/{layout-D_3ZcVG7.js.map → layout-sxvovjEH.js.map} +1 -1
- package/dist/web/public/assets/llm-JjZDbBvJ.js +37 -0
- package/dist/web/public/assets/llm-JjZDbBvJ.js.map +1 -0
- package/dist/web/public/assets/loader-circle-DDdmcH0k.js +7 -0
- package/dist/web/public/assets/{loader-circle-DgdBWYl0.js.map → loader-circle-DDdmcH0k.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-3QS1A0-I.js → map-pin-C_jAxukI.js} +2 -2
- package/dist/web/public/assets/{map-pin-3QS1A0-I.js.map → map-pin-C_jAxukI.js.map} +1 -1
- package/dist/web/public/assets/{mcp-DwKZULET.js → mcp-vKajK1F8.js} +3 -3
- package/dist/web/public/assets/{mcp-DwKZULET.js.map → mcp-vKajK1F8.js.map} +1 -1
- package/dist/web/public/assets/memos-DAt4k3DO.js +7 -0
- package/dist/web/public/assets/memos-DAt4k3DO.js.map +1 -0
- package/dist/web/public/assets/messengers-GYVTFlAj.js +2 -0
- package/dist/web/public/assets/messengers-GYVTFlAj.js.map +1 -0
- package/dist/web/public/assets/{mobile-Bq0FH9JV.js → mobile-VUyTo40E.js} +3 -3
- package/dist/web/public/assets/{mobile-Bq0FH9JV.js.map → mobile-VUyTo40E.js.map} +1 -1
- package/dist/web/public/assets/{network--s113Jkm.js → network-BUeWK3bs.js} +2 -2
- package/dist/web/public/assets/{network--s113Jkm.js.map → network-BUeWK3bs.js.map} +1 -1
- package/dist/web/public/assets/outbox-CEE0rwN3.js +2 -0
- package/dist/web/public/assets/outbox-CEE0rwN3.js.map +1 -0
- package/dist/web/public/assets/overview-BSOZ5gTD.js +12 -0
- package/dist/web/public/assets/overview-BSOZ5gTD.js.map +1 -0
- package/dist/web/public/assets/overview-COop5K2Y.js +12 -0
- package/dist/web/public/assets/overview-COop5K2Y.js.map +1 -0
- package/dist/web/public/assets/overview-DeH5ud6d.js +2 -0
- package/dist/web/public/assets/overview-DeH5ud6d.js.map +1 -0
- package/dist/web/public/assets/{pagination-DkdCTctJ.js → pagination-BBicLzXP.js} +3 -3
- package/dist/web/public/assets/{pagination-DkdCTctJ.js.map → pagination-BBicLzXP.js.map} +1 -1
- package/dist/web/public/assets/persona-CElXQZ4p.js +2 -0
- package/dist/web/public/assets/{persona-BvtcZh6G.js.map → persona-CElXQZ4p.js.map} +1 -1
- package/dist/web/public/assets/{plans-i3a6lrqF.js → plans-Bo5LlLeH.js} +3 -8
- package/dist/web/public/assets/plans-Bo5LlLeH.js.map +1 -0
- package/dist/web/public/assets/{play-CPoE_JnS.js → play-DX5wp4WH.js} +2 -2
- package/dist/web/public/assets/{play-CPoE_JnS.js.map → play-DX5wp4WH.js.map} +1 -1
- package/dist/web/public/assets/{plus-CfzKV_0u.js → plus-DH4J_YhN.js} +2 -2
- package/dist/web/public/assets/{plus-CfzKV_0u.js.map → plus-DH4J_YhN.js.map} +1 -1
- package/dist/web/public/assets/policy-BrgOuDt_.js +2 -0
- package/dist/web/public/assets/{policy-Cm88P8LO.js.map → policy-BrgOuDt_.js.map} +1 -1
- package/dist/web/public/assets/{qr-code-DMkV8nv2.js → qr-code-YrEuhMPC.js} +2 -2
- package/dist/web/public/assets/{qr-code-DMkV8nv2.js.map → qr-code-YrEuhMPC.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-nBMm5Xal.js → refresh-ccw-DlAd-eTQ.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-nBMm5Xal.js.map → refresh-ccw-DlAd-eTQ.js.map} +1 -1
- package/dist/web/public/assets/{reminders-DjEujanC.js → reminders-DBEE0zXG.js} +3 -3
- package/dist/web/public/assets/{reminders-DjEujanC.js.map → reminders-DBEE0zXG.js.map} +1 -1
- package/dist/web/public/assets/{save-DbrrCFDM.js → save-BDOtZrfp.js} +2 -2
- package/dist/web/public/assets/{save-DbrrCFDM.js.map → save-BDOtZrfp.js.map} +1 -1
- package/dist/web/public/assets/schedules-DAyhVI8-.js +2 -0
- package/dist/web/public/assets/schedules-DAyhVI8-.js.map +1 -0
- package/dist/web/public/assets/{search-5q3dkINm.js → search-55mtgHrB.js} +3 -3
- package/dist/web/public/assets/{search-5q3dkINm.js.map → search-55mtgHrB.js.map} +1 -1
- package/dist/web/public/assets/{search-DbE4VEm9.js → search-CAICU3aU.js} +2 -2
- package/dist/web/public/assets/{search-DbE4VEm9.js.map → search-CAICU3aU.js.map} +1 -1
- package/dist/web/public/assets/security-CbP4QgVp.js +2 -0
- package/dist/web/public/assets/security-CbP4QgVp.js.map +1 -0
- package/dist/web/public/assets/server-Dg4e8pvm.js +7 -0
- package/dist/web/public/assets/server-Dg4e8pvm.js.map +1 -0
- package/dist/web/public/assets/service-gWZa3sup.js +7 -0
- package/dist/web/public/assets/service-gWZa3sup.js.map +1 -0
- package/dist/web/public/assets/{shield-alert-WOa69jy3.js → shield-alert-DOKK9EnJ.js} +2 -2
- package/dist/web/public/assets/{shield-alert-WOa69jy3.js.map → shield-alert-DOKK9EnJ.js.map} +1 -1
- package/dist/web/public/assets/sparkles-G0QIs9nP.js +7 -0
- package/dist/web/public/assets/sparkles-G0QIs9nP.js.map +1 -0
- package/dist/web/public/assets/start-D-abhl3q.js +2 -0
- package/dist/web/public/assets/start-D-abhl3q.js.map +1 -0
- package/dist/web/public/assets/{status-badge-D5xhwquL.js → status-badge-CyLdpsXq.js} +2 -2
- package/dist/web/public/assets/{status-badge-D5xhwquL.js.map → status-badge-CyLdpsXq.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-DMRyk6YS.js → subtasks-BnEjSGUR.js} +3 -3
- package/dist/web/public/assets/{subtasks-DMRyk6YS.js.map → subtasks-BnEjSGUR.js.map} +1 -1
- package/dist/web/public/assets/{table-Dx65w6V0.js → table-sCMZBe_Z.js} +2 -2
- package/dist/web/public/assets/{table-Dx65w6V0.js.map → table-sCMZBe_Z.js.map} +1 -1
- package/dist/web/public/assets/terminal-_pXeEjXG.js +7 -0
- package/dist/web/public/assets/terminal-_pXeEjXG.js.map +1 -0
- package/dist/web/public/assets/{topn-L7Juczp3.js → topn-D1B-gS1M.js} +3 -3
- package/dist/web/public/assets/{topn-L7Juczp3.js.map → topn-D1B-gS1M.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-7xrfqd-v.js → trash-2-D2x2UPuZ.js} +2 -2
- package/dist/web/public/assets/{trash-2-7xrfqd-v.js.map → trash-2-D2x2UPuZ.js.map} +1 -1
- package/dist/web/public/assets/use-a2a-C98e2Via.js +2 -0
- package/dist/web/public/assets/use-a2a-C98e2Via.js.map +1 -0
- package/dist/web/public/assets/{use-agim-skills-pFjfgqMF.js → use-agim-skills-BbuJP3NT.js} +2 -2
- package/dist/web/public/assets/{use-agim-skills-pFjfgqMF.js.map → use-agim-skills-BbuJP3NT.js.map} +1 -1
- package/dist/web/public/assets/use-background-tasks-CwFmOokw.js +2 -0
- package/dist/web/public/assets/{use-background-tasks-D1--hHjp.js.map → use-background-tasks-CwFmOokw.js.map} +1 -1
- package/dist/web/public/assets/use-jobs-BJjeJ5lh.js +2 -0
- package/dist/web/public/assets/use-jobs-BJjeJ5lh.js.map +1 -0
- package/dist/web/public/assets/use-memory-CXDwKCco.js +2 -0
- package/dist/web/public/assets/{use-memory-Bz1Zao7g.js.map → use-memory-CXDwKCco.js.map} +1 -1
- package/dist/web/public/assets/use-observability-CY5ZUPrC.js +2 -0
- package/dist/web/public/assets/{use-observability-DtqSWVjM.js.map → use-observability-CY5ZUPrC.js.map} +1 -1
- package/dist/web/public/assets/use-outbox-DT_XWB_7.js +7 -0
- package/dist/web/public/assets/use-outbox-DT_XWB_7.js.map +1 -0
- package/dist/web/public/assets/use-schedules-D4W8fMwo.js +7 -0
- package/dist/web/public/assets/use-schedules-D4W8fMwo.js.map +1 -0
- package/dist/web/public/assets/use-settings-DGIjmUX0.js +2 -0
- package/dist/web/public/assets/use-settings-DGIjmUX0.js.map +1 -0
- package/dist/web/public/assets/use-skills-D2bMM580.js +7 -0
- package/dist/web/public/assets/use-skills-D2bMM580.js.map +1 -0
- package/dist/web/public/assets/use-vector-BYOFwjU0.js +2 -0
- package/dist/web/public/assets/use-vector-BYOFwjU0.js.map +1 -0
- package/dist/web/public/assets/use-workspace-CuytyHwb.js +2 -0
- package/dist/web/public/assets/{use-workspace-CConjEx0.js.map → use-workspace-CuytyHwb.js.map} +1 -1
- package/dist/web/public/assets/vector-CL8ezpSR.js +2 -0
- package/dist/web/public/assets/vector-CL8ezpSR.js.map +1 -0
- package/dist/web/public/assets/viewer-CD0iEfPU.js +7 -0
- package/dist/web/public/assets/viewer-CD0iEfPU.js.map +1 -0
- package/dist/web/public/assets/workspace-BA1_hso3.js +17 -0
- package/dist/web/public/assets/workspace-BA1_hso3.js.map +1 -0
- package/dist/web/public/assets/workspaces-DyGLJUgB.js +7 -0
- package/dist/web/public/assets/workspaces-DyGLJUgB.js.map +1 -0
- package/dist/web/public/index.html +2 -2
- package/dist/web/server.d.ts +0 -3
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +138 -3
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/public/assets/a2a-D7MoJ1iT.js +0 -7
- package/dist/web/public/assets/a2a-D7MoJ1iT.js.map +0 -1
- package/dist/web/public/assets/agents-BXThDW6f.js +0 -7
- package/dist/web/public/assets/bgjobs-Rc05aEy9.js +0 -7
- package/dist/web/public/assets/bgjobs-Rc05aEy9.js.map +0 -1
- package/dist/web/public/assets/chat-DQpQLW9j.js +0 -17
- package/dist/web/public/assets/chat-DQpQLW9j.js.map +0 -1
- package/dist/web/public/assets/circle-check-DZnkaUdk.js +0 -7
- package/dist/web/public/assets/circle-check-DZnkaUdk.js.map +0 -1
- package/dist/web/public/assets/confirm-dialog-gPKJnvEW.js +0 -2
- package/dist/web/public/assets/health-wqCp-K_o.js +0 -2
- package/dist/web/public/assets/hot-B-CMjQIr.js +0 -12
- package/dist/web/public/assets/index-DHh1LYlA.js +0 -209
- package/dist/web/public/assets/index-DHh1LYlA.js.map +0 -1
- package/dist/web/public/assets/index-DknVjPYB.css +0 -1
- package/dist/web/public/assets/installed-Cet-1M2Q.js.map +0 -1
- package/dist/web/public/assets/jobs-CfEzOOAC.js +0 -2
- package/dist/web/public/assets/jobs-CfEzOOAC.js.map +0 -1
- package/dist/web/public/assets/layout-BX43KyXM.js +0 -2
- package/dist/web/public/assets/layout-BX43KyXM.js.map +0 -1
- package/dist/web/public/assets/layout-BcYZlaqf.js +0 -2
- package/dist/web/public/assets/layout-BcYZlaqf.js.map +0 -1
- package/dist/web/public/assets/layout-Cb7looUv.js +0 -2
- package/dist/web/public/assets/layout-Cb7looUv.js.map +0 -1
- package/dist/web/public/assets/layout-D7xH78OU.js +0 -2
- package/dist/web/public/assets/layout-D7xH78OU.js.map +0 -1
- package/dist/web/public/assets/llm-BZ9qqp-D.js +0 -27
- package/dist/web/public/assets/llm-BZ9qqp-D.js.map +0 -1
- package/dist/web/public/assets/loader-circle-DgdBWYl0.js +0 -7
- package/dist/web/public/assets/memos-BBtqFcoH.js +0 -12
- package/dist/web/public/assets/memos-BBtqFcoH.js.map +0 -1
- package/dist/web/public/assets/messengers-i7WvNT3o.js +0 -2
- package/dist/web/public/assets/messengers-i7WvNT3o.js.map +0 -1
- package/dist/web/public/assets/outbox-BbfC5kuG.js +0 -7
- package/dist/web/public/assets/outbox-BbfC5kuG.js.map +0 -1
- package/dist/web/public/assets/persona-BvtcZh6G.js +0 -2
- package/dist/web/public/assets/plans-i3a6lrqF.js.map +0 -1
- package/dist/web/public/assets/policy-Cm88P8LO.js +0 -2
- package/dist/web/public/assets/schedules-DzwDWykc.js +0 -7
- package/dist/web/public/assets/schedules-DzwDWykc.js.map +0 -1
- package/dist/web/public/assets/security-BIcnUrAs.js +0 -2
- package/dist/web/public/assets/security-BIcnUrAs.js.map +0 -1
- package/dist/web/public/assets/service-CnorFHzZ.js +0 -7
- package/dist/web/public/assets/service-CnorFHzZ.js.map +0 -1
- package/dist/web/public/assets/use-background-tasks-D1--hHjp.js +0 -2
- package/dist/web/public/assets/use-memory-Bz1Zao7g.js +0 -2
- package/dist/web/public/assets/use-observability-DtqSWVjM.js +0 -2
- package/dist/web/public/assets/use-settings-DKbDqCEJ.js +0 -2
- package/dist/web/public/assets/use-settings-DKbDqCEJ.js.map +0 -1
- package/dist/web/public/assets/use-workspace-CConjEx0.js +0 -2
- package/dist/web/public/assets/vector-D8sEa2W-.js +0 -2
- package/dist/web/public/assets/vector-D8sEa2W-.js.map +0 -1
- package/dist/web/public/assets/viewer-aSIjAKVA.js +0 -12
- package/dist/web/public/assets/viewer-aSIjAKVA.js.map +0 -1
- package/dist/web/public/assets/workspace-BqwWoinI.js +0 -17
- package/dist/web/public/assets/workspace-BqwWoinI.js.map +0 -1
- package/dist/web/public/assets/workspaces-ChsJcrav.js +0 -7
- package/dist/web/public/assets/workspaces-ChsJcrav.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as p,f as k,j as e,B as u,l as j,n as N,m,L as F,c as z}from"./index-DHh1LYlA.js";import{r as y}from"./react-DlP5eolq.js";import{E as P}from"./empty-state-CTwOQemt.js";import{C as A}from"./confirm-dialog-gPKJnvEW.js";import{d as R,e as U,f as _,g as M,h as J}from"./use-memory-Bz1Zao7g.js";import{B as D}from"./brain-BQqv0Zhc.js";import{L as x}from"./loader-circle-DgdBWYl0.js";import{R as O}from"./refresh-ccw-nBMm5Xal.js";import{P as Q}from"./play-CPoE_JnS.js";import{C as X}from"./circle-check-big-BC8ntMsz.js";import{C as q}from"./circle-x-DHK7ypFY.js";import{T as G}from"./trash-2-7xrfqd-v.js";function oe(){const{t}=p(["memory","common"]),[s]=k(),r=s.get("user")??"";return r?e.jsx(H,{userKey:r}):e.jsx("div",{className:"mx-auto max-w-3xl",children:e.jsx(P,{icon:e.jsx(D,{}),title:t("noUserSelected.title"),description:t("noUserSelected.description")})})}function H({userKey:t}){const{t:s}=p(["memory","common"]),r=R(t),n=r.data,o=U(),a=_().data?.jobs[0],i=M(),f=J(),[E,h]=y.useState(!1),[d,g]=y.useState(n?.summary??"");y.useEffect(()=>{g(n?.summary??"")},[n?.summary]);const b=d!==(n?.summary??"");async function w(){const c=d.trim();if(c)try{await i.mutateAsync({user_key:t,body:{summary:c}}),m.success(s("persona.saved"))}catch(l){const{message:T}=N(l,s);m.error(T)}}async function L(){try{await f.mutateAsync(t),m.success(s("common:actions.delete"))}catch(c){const{message:l}=N(c,s);throw m.error(l),c}}async function B(){try{await o.mutateAsync()}catch(c){const{message:l}=N(c,s);m.error(l)}}return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("persona.title")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>r.refetch(),disabled:r.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[r.isFetching?e.jsx(x,{className:"h-4 w-4 animate-spin"}):e.jsx(O,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("persona.subtitle")})]}),e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("span",{className:"font-medium text-sm text-text",children:s("persona.consolidate.trigger")}),e.jsx(I,{job:a}),e.jsxs(u,{variant:"default",size:"sm",onClick:()=>void B(),disabled:o.isPending||a?.phase==="running",className:"ml-auto",children:[o.isPending?e.jsx(x,{className:"h-4 w-4 animate-spin"}):e.jsx(Q,{className:"h-4 w-4"}),o.isPending?s("persona.consolidate.triggering"):s("persona.consolidate.trigger")]})]}),a?.phase==="done"&&(a.result.users!=null||a.result.updated!=null)&&e.jsx("p",{className:"mt-2 text-xs text-text-dim",children:s("persona.consolidate.result",{users:a.result.users??0,updated:a.result.updated??0})}),a?.phase==="failed"&&a.result.error&&e.jsx("p",{className:"mt-2 text-xs text-danger",children:a.result.error})]}),r.isLoading?e.jsx("div",{className:"h-48 w-full rounded-md bg-surface-2 animate-pulse"}):n?e.jsxs(e.Fragment,{children:[n.updated_at>0&&e.jsx("div",{className:"text-xs text-text-dim",children:s("persona.updated",{at:S(n.updated_at)})}),e.jsx(C,{draft:d,onChange:g,onSave:()=>void w(),saving:i.isPending,dirty:b,canDelete:!0,onDelete:()=>h(!0)})]}):e.jsxs(e.Fragment,{children:[e.jsx(P,{icon:e.jsx(D,{}),title:s("persona.empty.title"),description:s("persona.empty.description")}),e.jsx(C,{draft:d,onChange:g,onSave:()=>void w(),saving:i.isPending,dirty:b,canDelete:!1,onDelete:()=>h(!0)})]}),e.jsx(A,{open:E,onOpenChange:h,title:s("persona.confirmDelete"),description:s("persona.confirmDeleteDesc"),intent:"danger",confirmLabel:s("persona.delete"),onConfirm:L})]})}function C({draft:t,onChange:s,onSave:r,saving:n,dirty:o,canDelete:v,onDelete:a}){const{t:i}=p("memory");return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(F,{htmlFor:"persona-editor",className:"text-sm text-text-dim",children:i("persona.editorLabel")}),e.jsx("textarea",{id:"persona-editor",value:t,onChange:f=>s(f.target.value),rows:12,className:z("w-full resize-y rounded-md border bg-bg px-3 py-2","font-mono text-sm leading-6","focus:outline-none focus:ring-2 focus:ring-accent focus:ring-offset-1 focus:ring-offset-bg",o?"border-accent":"border-border")}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[v&&e.jsxs(u,{type:"button",variant:"outline",size:"sm",onClick:a,children:[e.jsx(G,{className:"h-3 w-3"}),i("persona.delete")]}),e.jsxs(u,{type:"button",size:"sm",className:"ml-auto",disabled:!o||n||t.trim().length===0,onClick:r,children:[n?e.jsx(x,{className:"h-4 w-4 animate-spin"}):null,i("persona.save")]})]})]})}function I({job:t}){const{t:s}=p("memory");return t?t.phase==="running"?e.jsxs(j,{variant:"info",children:[e.jsx(x,{className:"h-3 w-3 animate-spin"}),s("persona.consolidate.running")]}):t.phase==="done"?e.jsxs(j,{variant:"success",children:[e.jsx(X,{className:"h-3 w-3"}),s("persona.consolidate.lastRun",{at:S(t.finishedAt??t.startedAt)})]}):e.jsxs(j,{variant:"danger",children:[e.jsx(q,{className:"h-3 w-3"}),s("persona.consolidate.doneFailed")]}):null}function S(t){try{const s=new Date(t);return Number.isNaN(s.getTime())?String(t):s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return String(t)}}export{oe as default};
|
|
2
|
-
//# sourceMappingURL=persona-BvtcZh6G.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plans-i3a6lrqF.js","sources":["../../node_modules/lucide-react/dist/esm/icons/clipboard-list.js","../../node_modules/lucide-react/dist/esm/icons/pen-line.js","../../src/routes/tasks/plans.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 ClipboardList = createLucideIcon(\"ClipboardList\", [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\n \"path\",\n {\n d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\n key: \"116196\"\n }\n ],\n [\"path\", { d: \"M12 11h4\", key: \"1jrz19\" }],\n [\"path\", { d: \"M12 16h4\", key: \"n85exb\" }],\n [\"path\", { d: \"M8 11h.01\", key: \"1dfujw\" }],\n [\"path\", { d: \"M8 16h.01\", key: \"18s6g9\" }]\n]);\n\nexport { ClipboardList as default };\n//# sourceMappingURL=clipboard-list.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst PenLine = createLucideIcon(\"PenLine\", [\n [\"path\", { d: \"M12 20h9\", key: \"t2du7b\" }],\n [\n \"path\",\n {\n d: \"M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z\",\n key: \"1ykcvy\"\n }\n ]\n]);\n\nexport { PenLine as default };\n//# sourceMappingURL=pen-line.js.map\n","/**\n * /tasks/plans — admin view of native_exit_plan_mode handshakes\n * (v1.2.133).\n *\n * Surfaces the plan_history sqlite table populated by v1.2.131's\n * exit-plan-mode dispatcher. Each row shows what plan the model\n * proposed, what outcome the user picked (approved / rejected /\n * edited / expired), how long the operator took to decide, and\n * the rejection / edit reason if any.\n *\n * Layout mirrors /tasks/asks: header with title + count + refresh +\n * optional thread filter, then a table. Each row's plan markdown\n * is collapsed by default — click to expand into a fenced markdown\n * block (no live render; that's a v1.2.134 idea once we know\n * operators actually use this surface).\n */\n\nimport { useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport {\n CheckCircle2, ChevronDown, ChevronRight, ClipboardList,\n Edit3, Loader2, RefreshCcw, XCircle, Clock,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Table, TableBody, TableCell, TableHead, TableHeader, TableRow,\n} from '@/components/ui/table'\nimport { usePlansList, type PlanHistoryRow, type PlanOutcome } from '@/hooks/use-background-tasks'\n\nconst OUTCOME_ICONS: Record<PlanOutcome, JSX.Element> = {\n approved: <CheckCircle2 className=\"h-3 w-3\" />,\n rejected: <XCircle className=\"h-3 w-3\" />,\n edited: <Edit3 className=\"h-3 w-3\" />,\n expired: <Clock className=\"h-3 w-3\" />,\n}\n\nconst OUTCOME_VARIANT: Record<PlanOutcome, 'success' | 'warning' | 'info' | 'outline'> = {\n approved: 'success',\n rejected: 'warning',\n edited: 'info',\n expired: 'outline',\n}\n\nfunction fmtPending(ms: number | null): string {\n if (ms == null) return '—'\n if (ms < 1000) return `${ms}ms`\n const s = ms / 1000\n if (s < 60) return `${s.toFixed(1)}s`\n return `${(s / 60).toFixed(1)}min`\n}\n\nexport default function TasksPlansRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const [filter, setFilter] = useState('')\n const [appliedFilter, setAppliedFilter] = useState('')\n const listQuery = usePlansList({ threadKey: appliedFilter || undefined, limit: 200 })\n\n const rows = useMemo(() => listQuery.data?.plans ?? [], [listQuery.data])\n\n function applyFilter(): void {\n setAppliedFilter(filter.trim())\n }\n\n return (\n <div className=\"mx-auto flex max-w-6xl flex-col gap-4 p-4\">\n <header className=\"flex items-center gap-3\">\n <ClipboardList className=\"h-5 w-5 text-text-dim\" />\n <h1 className=\"text-xl font-semibold\">{t('plans.title')}</h1>\n <Badge variant=\"info\">{rows.length}</Badge>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('plans.refresh')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">\n {t('plans.subtitle')}\n </p>\n\n <section className=\"flex items-end gap-2 rounded-md border border-border bg-surface p-3\">\n <div className=\"flex flex-1 flex-col gap-1\">\n <Label className=\"text-xs font-medium\">\n {t('plans.filterLabel')}\n </Label>\n <Input\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') applyFilter() }}\n placeholder=\"tg:8754479311:default\"\n className=\"font-mono text-xs\"\n />\n </div>\n <Button size=\"sm\" onClick={applyFilter} disabled={listQuery.isFetching}>\n {t('plans.applyFilter')}\n </Button>\n {appliedFilter && (\n <Button\n size=\"sm\" variant=\"ghost\"\n onClick={() => { setFilter(''); setAppliedFilter('') }}\n >\n {t('plans.clearFilter')}\n </Button>\n )}\n </section>\n\n {listQuery.isLoading ? (\n <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n ) : rows.length === 0 ? (\n <section className=\"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim\">\n {appliedFilter\n ? t('plans.emptyFiltered')\n : t('plans.empty')}\n </section>\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-8\" />\n <TableHead>{t('plans.col.outcome')}</TableHead>\n <TableHead>{t('plans.col.thread')}</TableHead>\n <TableHead>{t('plans.col.resolvedAt')}</TableHead>\n <TableHead>{t('plans.col.pending')}</TableHead>\n <TableHead>{t('plans.col.detail')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((r) => <PlanRow key={r.id} row={r} />)}\n </TableBody>\n </Table>\n )}\n </div>\n )\n}\n\nfunction PlanRow({ row }: { row: PlanHistoryRow }): JSX.Element {\n const { t } = useTranslation(['tasks'])\n const [open, setOpen] = useState(false)\n return (\n <>\n <TableRow className=\"cursor-pointer hover:bg-surface-hover\" onClick={() => setOpen((v) => !v)}>\n <TableCell className=\"p-1 align-top text-text-dim\">\n {open ? <ChevronDown className=\"h-4 w-4\" /> : <ChevronRight className=\"h-4 w-4\" />}\n </TableCell>\n <TableCell className=\"align-top\">\n <Badge variant={OUTCOME_VARIANT[row.outcome]}>\n {OUTCOME_ICONS[row.outcome]}\n <span className=\"ml-1\">{t(`plans.outcome.${row.outcome}`, { defaultValue: row.outcome })}</span>\n </Badge>\n </TableCell>\n <TableCell className=\"align-top\">\n <code className=\"text-[11px]\">{row.threadKey}</code>\n </TableCell>\n <TableCell className=\"align-top text-[11px] text-text-dim\">{row.resolvedAt}</TableCell>\n <TableCell className=\"align-top text-[11px] text-text-dim\">{fmtPending(row.pendingMs)}</TableCell>\n <TableCell className=\"align-top text-xs\">\n {row.detail\n ? <span title={row.detail}>{row.detail.slice(0, 80)}{row.detail.length > 80 ? '…' : ''}</span>\n : <span className=\"text-text-dim\">—</span>}\n </TableCell>\n </TableRow>\n {open && (\n <TableRow>\n <TableCell colSpan={6} className=\"bg-surface-2 p-3\">\n <div className=\"text-[11px] text-text-dim\">\n {t('plans.planMdLabel')}\n </div>\n <pre className=\"mt-1 max-h-96 overflow-y-auto whitespace-pre-wrap rounded border border-border bg-surface p-3 text-[12px]\">\n {row.planMd}\n </pre>\n </TableCell>\n </TableRow>\n )}\n </>\n )\n}\n"],"names":["ClipboardList","createLucideIcon","PenLine","OUTCOME_ICONS","jsx","CheckCircle2","XCircle","Edit3","Clock","OUTCOME_VARIANT","fmtPending","ms","s","TasksPlansRoute","t","useTranslation","filter","setFilter","useState","appliedFilter","setAppliedFilter","listQuery","usePlansList","rows","useMemo","applyFilter","jsxs","Badge","Button","Loader2","RefreshCcw","Label","Input","e","Table","TableHeader","TableRow","TableHead","TableBody","r","PlanRow","row","open","setOpen","Fragment","v","TableCell","ChevronDown","ChevronRight"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as r,j as e,B as d,m,n as E,l as u,q as A,c as x,S as w,g as _,h as I,i as M,k as c}from"./index-DHh1LYlA.js";import{u as C,b as S}from"./use-settings-DKbDqCEJ.js";import{L as O}from"./loader-circle-DgdBWYl0.js";import{R as L}from"./refresh-ccw-nBMm5Xal.js";import"./react-DlP5eolq.js";function o(s){if(s==null)return!1;const a=s.toLowerCase();return a==="1"||a==="true"||a==="yes"||a==="on"}function U(){const{t:s}=r(["settings","common"]),a=C(),i=S();async function t(n,v){try{await i.mutateAsync({updates:{[n]:v}}),m.success(s("policy.savingToast"))}catch(y){m.error(E(y,s).message)}}const l=a.data?.env??{},h=o(l.AGIM_DANGEROUSLY_SKIP_PERMISSIONS),g=o(l.AGIM_MEMORY_ENABLED),j=o(l.AGIM_VIEWER_ENABLED),N=(l.AGIM_TIMEOUT_DEFAULT??"").toLowerCase()==="allow",b=(l.AGIM_A2A_NOTIFY_MODE??"essential").toLowerCase();return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("policy.title")}),e.jsxs(d,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>a.refetch(),disabled:a.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[a.isFetching?e.jsx(O,{className:"h-4 w-4 animate-spin"}):e.jsx(L,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("policy.subtitle")})]}),a.isLoading?e.jsx("div",{className:"h-96 rounded-md bg-surface-2 animate-pulse"}):e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(T,{value:h,disabled:i.isPending,onChange:n=>void t("AGIM_DANGEROUSLY_SKIP_PERMISSIONS",n?"1":"0")}),e.jsx(k,{allowOnTimeout:N,disabled:i.isPending,onChange:n=>void t("AGIM_TIMEOUT_DEFAULT",n)}),e.jsx(p,{sectionKey:"memory",value:g,disabled:i.isPending,onChange:n=>void t("AGIM_MEMORY_ENABLED",n?"1":"0")}),e.jsx(p,{sectionKey:"viewer",value:j,disabled:i.isPending,onChange:n=>void t("AGIM_VIEWER_ENABLED",n?"1":"0")}),e.jsx(G,{value:b,disabled:i.isPending,onChange:n=>void t("AGIM_A2A_NOTIFY_MODE",n)})]})]})}function T({value:s,disabled:a,onChange:i}){const{t}=r("settings");return e.jsx("section",{className:x("rounded-md border p-4",s?"border-danger/60 bg-danger-bg/30":"border-border bg-surface"),children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:t("policy.safety.title")}),s&&e.jsxs(u,{variant:"danger",children:[e.jsx(A,{className:"h-3 w-3"}),"ON"]})]}),e.jsx("p",{className:"mt-1 text-sm text-text-dim",children:t("policy.safety.description")}),!s&&e.jsx("p",{className:"mt-1 text-xs text-text-muted",children:t("policy.safety.tagWarn")}),e.jsx("code",{className:"mt-2 inline-block rounded bg-surface-2 px-1.5 py-0.5 text-xs text-text-muted",children:t("policy.safety.envKey")})]}),e.jsx(f,{value:s,disabled:a,onChange:i})]})})}function k({allowOnTimeout:s,disabled:a,onChange:i}){const{t}=r("settings");return e.jsx("section",{className:"rounded-md border border-border bg-surface p-4",children:e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:t("policy.approval.title")}),e.jsx("p",{className:"text-sm text-text-dim",children:t("policy.approval.description")}),e.jsx("code",{className:"self-start rounded bg-surface-2 px-1.5 py-0.5 text-xs text-text-muted",children:t("policy.approval.envKey")}),e.jsxs("div",{className:"mt-2 flex flex-wrap gap-2",children:[e.jsx(d,{type:"button",variant:s?"outline":"default",size:"sm",disabled:a,onClick:()=>i("deny"),children:t("policy.approval.valDeny")}),e.jsx(d,{type:"button",variant:s?"default":"outline",size:"sm",disabled:a,onClick:()=>i("allow"),children:t("policy.approval.valAllow")})]})]})})}function p({sectionKey:s,value:a,disabled:i,onChange:t}){const{t:l}=r("settings");return e.jsx("section",{className:"rounded-md border border-border bg-surface p-4",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"font-medium text-text",children:l(`policy.${s}.title`)}),e.jsx(u,{variant:a?"success":"outline",children:a?"ON":"OFF"})]}),e.jsx("p",{className:"mt-1 text-sm text-text-dim",children:l(`policy.${s}.description`)}),e.jsx("code",{className:"mt-2 inline-block rounded bg-surface-2 px-1.5 py-0.5 text-xs text-text-muted",children:l(`policy.${s}.envKey`)})]}),e.jsx(f,{value:a,disabled:i,onChange:t})]})})}function G({value:s,disabled:a,onChange:i}){const{t}=r("settings");return e.jsx("section",{className:"rounded-md border border-border bg-surface p-4",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsxs("div",{className:"flex-1",children:[e.jsx("span",{className:"font-medium text-text",children:t("policy.a2aNotify.title")}),e.jsx("p",{className:"mt-1 text-sm text-text-dim",children:t("policy.a2aNotify.description")}),e.jsx("code",{className:"mt-2 inline-block rounded bg-surface-2 px-1.5 py-0.5 text-xs text-text-muted",children:t("policy.a2aNotify.envKey")})]}),e.jsxs(w,{value:s,onValueChange:i,disabled:a,children:[e.jsx(_,{className:"w-36",children:e.jsx(I,{})}),e.jsxs(M,{children:[e.jsx(c,{value:"essential",children:t("policy.a2aNotify.valEssential")}),e.jsx(c,{value:"verbose",children:t("policy.a2aNotify.valVerbose")}),e.jsx(c,{value:"off",children:t("policy.a2aNotify.valOff")})]})]})]})})}function f({value:s,disabled:a,onChange:i}){return e.jsx("button",{type:"button",role:"switch","aria-checked":s,disabled:a,onClick:()=>i(!s),className:x("relative inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-bg","disabled:cursor-not-allowed disabled:opacity-50",s?"bg-accent":"bg-surface-2 border border-border"),children:e.jsx("span",{className:x("inline-block h-5 w-5 rounded-full bg-white shadow transition-transform",s?"translate-x-5":"translate-x-0.5")})})}export{U as default};
|
|
2
|
-
//# sourceMappingURL=policy-Cm88P8LO.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{o as f,b as g,d as N,u as j,f as y,j as s,l as d,B as b,L as w,I as C}from"./index-DHh1LYlA.js";import{r as v}from"./react-DlP5eolq.js";import{D as k}from"./data-table-DOKUic1J.js";import{E as R}from"./empty-state-CTwOQemt.js";import{L as S}from"./loader-circle-DgdBWYl0.js";import{R as L}from"./refresh-ccw-nBMm5Xal.js";import"./table-Dx65w6V0.js";import"./arrow-up-i_dEdXkz.js";import"./arrow-down-B8DkdbEY.js";/**
|
|
2
|
-
* @license lucide-react v0.469.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const M=f("CalendarClock",[["path",{d:"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5",key:"1osxxc"}],["path",{d:"M16 2v4",key:"4m81vk"}],["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M3 10h5",key:"r794hk"}],["path",{d:"M17.5 17.5 16 16.3V14",key:"akvzfd"}],["circle",{cx:"16",cy:"16",r:"6",key:"qoo3c4"}]]),T={all:["schedules"],list:e=>["schedules","list",e]};function E(e){return g({queryKey:T.list(e),queryFn:()=>N.listSchedules(e)})}function O(){const{t:e}=j(["tasks","common"]),[t,i]=y(),l=t.get("agent")??"",{data:m,isLoading:o,isFetching:n,refetch:h}=E(l?{agent:l}:{}),u=m?.schedules??[];function x(a){const c=new URLSearchParams(t);a?c.set("agent",a):c.delete("agent"),i(c,{replace:!0})}const p=v.useMemo(()=>[{id:"id",header:e("schedules.col.id"),cell:a=>s.jsxs("span",{className:"tabular-nums text-text-dim",children:["#",a.id]}),headClassName:"w-16"},{id:"name",header:e("schedules.col.name"),cell:a=>s.jsx("span",{className:"font-medium",children:a.name}),asCardTitle:!0},{id:"agent",header:e("schedules.col.agent"),cell:a=>s.jsx("span",{className:"text-text-dim",children:a.agent}),headClassName:"w-32"},{id:"cron",header:e("schedules.col.cron"),cell:a=>s.jsx("code",{className:"rounded bg-surface-2 px-1.5 py-0.5 text-xs",children:a.cron}),headClassName:"w-32"},{id:"prompt",header:e("schedules.col.prompt"),cell:a=>s.jsx("span",{className:"line-clamp-2 text-text-dim",children:a.prompt}),hideOnMobile:!0},{id:"enabled",header:e("schedules.col.enabled"),cell:a=>a.enabled?s.jsx(d,{variant:"success",children:e("schedules.enabled")}):s.jsx(d,{variant:"outline",children:e("schedules.disabled")}),headClassName:"w-20"},{id:"nextRun",header:e("schedules.col.nextRun"),cell:a=>s.jsx("span",{className:"text-text-dim",children:r(a.next_run)}),headClassName:"w-40"},{id:"lastRun",header:e("schedules.col.lastRun"),cell:a=>s.jsx("span",{className:"text-text-dim",children:r(a.last_run)}),headClassName:"w-40",hideOnMobile:!0}],[e]);return s.jsxs("div",{className:"mx-auto flex max-w-7xl flex-col gap-4",children:[s.jsxs("header",{className:"flex flex-col gap-1",children:[s.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[s.jsx("h1",{className:"text-xl font-semibold",children:e("schedules.title")}),s.jsxs(b,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>h(),disabled:n,"aria-label":e("actions.refresh",{ns:"common"}),children:[n?s.jsx(S,{className:"h-4 w-4 animate-spin"}):s.jsx(L,{className:"h-4 w-4"}),s.jsx("span",{className:"hidden sm:inline",children:e("actions.refresh",{ns:"common"})})]})]}),s.jsx("p",{className:"text-sm text-text-dim",children:e("schedules.subtitle")})]}),s.jsx("div",{className:"flex flex-wrap items-end gap-2",children:s.jsxs("div",{className:"flex flex-col gap-1",children:[s.jsx(w,{htmlFor:"agent-filter",className:"text-xs text-text-dim",children:e("schedules.filter.agent")}),s.jsx(C,{id:"agent-filter",value:l,onChange:a=>x(a.target.value),placeholder:e("schedules.filter.agentAny"),className:"w-48"})]})}),s.jsx(k,{columns:p,rows:u,getRowId:a=>String(a.id),loading:o,emptyState:s.jsx(R,{icon:s.jsx(M,{}),title:e("schedules.empty.title"),description:e("schedules.empty.description")})})]})}function r(e){if(e==null)return"—";try{const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}export{O as default};
|
|
7
|
-
//# sourceMappingURL=schedules-DzwDWykc.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schedules-DzwDWykc.js","sources":["../../node_modules/lucide-react/dist/esm/icons/calendar-clock.js","../../src/hooks/use-schedules.ts","../../src/routes/tasks/schedules.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 CalendarClock = createLucideIcon(\"CalendarClock\", [\n [\"path\", { d: \"M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5\", key: \"1osxxc\" }],\n [\"path\", { d: \"M16 2v4\", key: \"4m81vk\" }],\n [\"path\", { d: \"M8 2v4\", key: \"1cmpym\" }],\n [\"path\", { d: \"M3 10h5\", key: \"r794hk\" }],\n [\"path\", { d: \"M17.5 17.5 16 16.3V14\", key: \"akvzfd\" }],\n [\"circle\", { cx: \"16\", cy: \"16\", r: \"6\", key: \"qoo3c4\" }]\n]);\n\nexport { CalendarClock as default };\n//# sourceMappingURL=calendar-clock.js.map\n","/**\n * useSchedules — react-query wrapper for /api/schedules.\n *\n * Read-only: schedule create / delete / toggle isn't exposed via\n * /api today (only via CLI). When that lands the mutations slot in\n * here next to useSchedules.\n */\n\nimport { useQueryClient, useQuery } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport type { ListSchedulesQuery, ListSchedulesResponse } from '@/types/api'\n\nexport const schedulesKeys = {\n all: ['schedules'] as const,\n list: (q: ListSchedulesQuery) => ['schedules', 'list', q] as const,\n}\n\nexport function useSchedules(query: ListSchedulesQuery) {\n return useQuery<ListSchedulesResponse>({\n queryKey: schedulesKeys.list(query),\n queryFn: () => api.listSchedules(query),\n })\n}\n\nexport function useInvalidateSchedules() {\n const qc = useQueryClient()\n return () => qc.invalidateQueries({ queryKey: schedulesKeys.all })\n}\n","/**\n * /tasks/schedules — cron-style triggers list. Read-only; mutations\n * (create / delete / toggle) only exist via CLI today; the page\n * shows what's scheduled and when the next run lands.\n */\n\nimport { useMemo } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { CalendarClock, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { DataTable, type DataTableColumn } from '@/components/common/data-table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport { useSchedules } from '@/hooks/use-schedules'\nimport type { Schedule } from '@/types/api'\n\nexport default function SchedulesRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const [params, setParams] = useSearchParams()\n const agent = params.get('agent') ?? ''\n\n const { data, isLoading, isFetching, refetch } = useSchedules(\n agent ? { agent } : {},\n )\n const schedules = data?.schedules ?? []\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<Schedule>[] = useMemo(\n () => [\n {\n id: 'id',\n header: t('schedules.col.id'),\n cell: (r) => <span className=\"tabular-nums text-text-dim\">#{r.id}</span>,\n headClassName: 'w-16',\n },\n {\n id: 'name',\n header: t('schedules.col.name'),\n cell: (r) => <span className=\"font-medium\">{r.name}</span>,\n asCardTitle: true,\n },\n {\n id: 'agent',\n header: t('schedules.col.agent'),\n cell: (r) => <span className=\"text-text-dim\">{r.agent}</span>,\n headClassName: 'w-32',\n },\n {\n id: 'cron',\n header: t('schedules.col.cron'),\n cell: (r) => <code className=\"rounded bg-surface-2 px-1.5 py-0.5 text-xs\">{r.cron}</code>,\n headClassName: 'w-32',\n },\n {\n id: 'prompt',\n header: t('schedules.col.prompt'),\n cell: (r) => <span className=\"line-clamp-2 text-text-dim\">{r.prompt}</span>,\n hideOnMobile: true,\n },\n {\n id: 'enabled',\n header: t('schedules.col.enabled'),\n cell: (r) =>\n r.enabled ? (\n <Badge variant=\"success\">{t('schedules.enabled')}</Badge>\n ) : (\n <Badge variant=\"outline\">{t('schedules.disabled')}</Badge>\n ),\n headClassName: 'w-20',\n },\n {\n id: 'nextRun',\n header: t('schedules.col.nextRun'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.next_run)}</span>,\n headClassName: 'w-40',\n },\n {\n id: 'lastRun',\n header: t('schedules.col.lastRun'),\n cell: (r) => <span className=\"text-text-dim\">{formatTime(r.last_run)}</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('schedules.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 <p className=\"text-sm text-text-dim\">{t('schedules.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('schedules.filter.agent')}\n </Label>\n <Input\n id=\"agent-filter\"\n value={agent}\n onChange={(e) => setAgentFilter(e.target.value)}\n placeholder={t('schedules.filter.agentAny')}\n className=\"w-48\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n rows={schedules}\n getRowId={(r) => String(r.id)}\n loading={isLoading}\n emptyState={\n <EmptyState\n icon={<CalendarClock />}\n title={t('schedules.empty.title')}\n description={t('schedules.empty.description')}\n />\n }\n />\n </div>\n )\n}\n\nfunction formatTime(iso: string | undefined | null): string {\n if (iso == null) return '—'\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n"],"names":["CalendarClock","createLucideIcon","schedulesKeys","q","useSchedules","query","useQuery","api","SchedulesRoute","t","useTranslation","params","setParams","useSearchParams","agent","data","isLoading","isFetching","refetch","schedules","setAgentFilter","v","next","columns","useMemo","r","jsxs","jsx","Badge","formatTime","Button","Loader2","RefreshCcw","Label","Input","e","DataTable","EmptyState","iso","d"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as I,j as e,B as T,I as d,S as h,g as _,h as f,i as p,k as u,p as M,m as j,n as y,q as w,c as S,l as B}from"./index-DHh1LYlA.js";import{r as A}from"./react-DlP5eolq.js";import{u as L,b as C}from"./use-settings-DKbDqCEJ.js";import{L as O}from"./loader-circle-DgdBWYl0.js";import{R as G}from"./refresh-ccw-nBMm5Xal.js";import{S as R}from"./shield-alert-WOa69jy3.js";import{C as V}from"./circle-check-DZnkaUdk.js";function k(s){if(s==null)return!1;const a=s.toLowerCase();return a==="1"||a==="true"||a==="yes"||a==="on"}function H(){const{t:s}=I(["settings","common"]),a=L(),o=C(),[i,E]=A.useState(null),[v,b]=A.useState(!1);async function g(){b(!0);try{const t=await M.get("/api/security/diagnostics");E(t.diagnostics)}catch(t){j.error(y(t,s).message)}finally{b(!1)}}A.useEffect(()=>{g()},[]);async function r(t,l){try{await o.mutateAsync({updates:{[t]:l}}),j.success(s("security.savingToast")),await g()}catch(N){j.error(y(N,s).message)}}const n=a.data?.env??{};return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("security.title")}),e.jsx(T,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{a.refetch(),g()},disabled:a.isFetching||v,"aria-label":s("actions.refresh",{ns:"common"}),children:a.isFetching||v?e.jsx(O,{className:"h-4 w-4 animate-spin"}):e.jsx(G,{className:"h-4 w-4"})})]}),e.jsx("p",{className:"text-sm text-muted",children:s("security.subtitle")})]}),e.jsxs("section",{className:"rounded-lg border border-border bg-card p-4",children:[e.jsxs("h2",{className:"mb-3 flex items-center gap-2 text-sm font-semibold",children:[e.jsx(R,{className:"h-4 w-4"}),s("security.diagnostics.title")]}),i?e.jsxs("ul",{className:"grid gap-2 text-sm sm:grid-cols-2",children:[e.jsx(x,{label:s("security.diagnostics.runningAsRoot"),ok:i.runningAsRoot===!1,text:i.runningAsRoot===!0?s("security.diagnostics.runningAsRootHelp"):"OK"}),e.jsx(x,{label:s("security.diagnostics.envFilePerms"),ok:i.envFile.exists&&!i.envFile.tooPermissive,text:i.envFile.exists?i.envFile.tooPermissive?`${i.envFile.mode} — ${s("security.diagnostics.envFilePermsLax")}`:s("security.diagnostics.envFilePermsOk"):"—"}),e.jsx(x,{label:s("security.diagnostics.bwrapAvailable"),ok:i.bwrapAvailable,text:i.bwrapAvailable?"/usr/bin/bwrap":s("security.diagnostics.bwrapMissing")}),e.jsx(x,{label:s("security.diagnostics.senderAllowlist"),ok:i.senderAllowlistConfigured,text:i.senderAllowlistConfigured?s("security.diagnostics.senderAllowlistOn"):s("security.diagnostics.senderAllowlistOff")}),e.jsx(x,{label:s("security.diagnostics.adminAllowlist"),ok:i.adminAllowlistConfigured,text:i.adminAllowlistConfigured?s("security.diagnostics.adminAllowlistOn"):s("security.diagnostics.adminAllowlistOff")}),e.jsx(x,{label:s("security.diagnosticsPlatformBlacklist"),ok:i.platformBlacklist.length===0,text:i.platformBlacklist.length===0?"—":i.platformBlacklist.join(", ")})]}):e.jsx("p",{className:"text-sm text-muted",children:"…"})]}),e.jsx(m,{title:s("security.sender.title"),description:s("security.sender.description"),envKey:"AGIM_ALLOWED_USERS",children:e.jsx(d,{defaultValue:n.AGIM_ALLOWED_USERS??"",placeholder:s("security.sender.placeholder"),onBlur:t=>{const l=t.target.value.trim();r("AGIM_ALLOWED_USERS",l===""?null:l)}})}),e.jsx(m,{title:s("security.exec.title"),description:s("security.exec.description"),children:e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(c,{label:s("security.exec.sandbox"),children:e.jsxs(h,{value:(n.AGIM_EXEC_SANDBOX??"").toLowerCase()==="bwrap"?"bwrap":"__none__",onValueChange:t=>void r("AGIM_EXEC_SANDBOX",t==="__none__"?null:t),children:[e.jsx(_,{children:e.jsx(f,{})}),e.jsxs(p,{children:[e.jsx(u,{value:"__none__",children:s("security.exec.sandboxNone")}),e.jsxs(u,{value:"bwrap",disabled:!i?.bwrapAvailable,children:[s("security.exec.sandboxBwrap"),!i?.bwrapAvailable&&e.jsxs("span",{className:"ml-2 text-xs text-muted",children:["(",s("security.exec.sandboxBwrapMissing"),")"]})]})]})]})}),e.jsx(c,{label:s("security.exec.sandboxNet"),children:e.jsxs(h,{value:(n.AGIM_EXEC_SANDBOX_NET??"").toLowerCase()==="off"?"off":"on",onValueChange:t=>void r("AGIM_EXEC_SANDBOX_NET",t==="off"?"off":null),children:[e.jsx(_,{children:e.jsx(f,{})}),e.jsxs(p,{children:[e.jsx(u,{value:"on",children:s("security.exec.sandboxNetOn")}),e.jsx(u,{value:"off",children:s("security.exec.sandboxNetOff")})]})]})}),e.jsx(c,{label:s("security.exec.timeoutMs"),children:e.jsx(d,{type:"number",defaultValue:n.AGIM_EXEC_TIMEOUT_MS??"",placeholder:"60000",onBlur:t=>{const l=t.target.value.trim();r("AGIM_EXEC_TIMEOUT_MS",l===""?null:l)}})}),e.jsx(c,{label:s("security.exec.maxOutput"),children:e.jsx(d,{type:"number",defaultValue:n.AGIM_EXEC_MAX_OUTPUT??"",placeholder:"32768",onBlur:t=>{const l=t.target.value.trim();r("AGIM_EXEC_MAX_OUTPUT",l===""?null:l)}})})]})}),e.jsx(m,{title:s("security.web.title"),description:s("security.web.description"),children:e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(c,{label:s("security.web.allowPrivate"),hint:s("security.web.allowPrivateHelp"),children:e.jsxs(h,{value:k(n.AGIM_NATIVE_WEB_ALLOW_PRIVATE)?"1":"0",onValueChange:t=>void r("AGIM_NATIVE_WEB_ALLOW_PRIVATE",t==="1"?"1":null),children:[e.jsx(_,{children:e.jsx(f,{})}),e.jsxs(p,{children:[e.jsx(u,{value:"0",children:"OFF"}),e.jsx(u,{value:"1",children:"ON"})]})]})}),e.jsx(c,{label:s("security.web.timeoutMs"),children:e.jsx(d,{type:"number",defaultValue:n.AGIM_NATIVE_WEB_TIMEOUT_MS??"",placeholder:"30000",onBlur:t=>{const l=t.target.value.trim();r("AGIM_NATIVE_WEB_TIMEOUT_MS",l===""?null:l)}})}),e.jsx("div",{className:"sm:col-span-2",children:e.jsx(c,{label:s("security.web.ssrfWhitelist"),children:e.jsx(d,{defaultValue:n.AGIM_NATIVE_WEB_SSRF_WHITELIST??"",placeholder:s("security.web.ssrfWhitelistPlaceholder"),onBlur:t=>{const l=t.target.value.trim();r("AGIM_NATIVE_WEB_SSRF_WHITELIST",l===""?null:l)}})})})]})}),e.jsx(m,{title:s("security.fs.title"),description:s("security.fs.description"),children:e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(c,{label:s("security.fs.restrict"),children:e.jsxs(h,{value:(n.AGIM_NATIVE_FS_RESTRICT??"0")==="1"?"1":"0",onValueChange:t=>void r("AGIM_NATIVE_FS_RESTRICT",t==="1"?"1":null),children:[e.jsx(_,{children:e.jsx(f,{})}),e.jsxs(p,{children:[e.jsx(u,{value:"1",children:s("security.fs.restrictOn")}),e.jsx(u,{value:"0",children:s("security.fs.restrictOff")})]})]})}),e.jsx(c,{label:s("security.fs.timeoutMs"),children:e.jsx(d,{type:"number",defaultValue:n.AGIM_NATIVE_FS_TIMEOUT_MS??"",placeholder:"60000",onBlur:t=>{const l=t.target.value.trim();r("AGIM_NATIVE_FS_TIMEOUT_MS",l===""?null:l)}})})]})}),e.jsx(m,{title:s("security.delegation.title"),description:s("security.delegation.description"),envKey:"AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN",children:e.jsx(d,{type:"number",defaultValue:n.AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN??"",placeholder:"2",onBlur:t=>{const l=t.target.value.trim();r("AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN",l===""?null:l)}})}),e.jsxs(m,{title:s("security.platformBlacklist.title"),description:s("security.platformBlacklist.description"),envKey:"AGIM_PLATFORM_BLACKLIST",children:[e.jsx(d,{defaultValue:n.AGIM_PLATFORM_BLACKLIST??"",placeholder:s("security.platformBlacklist.placeholder"),onBlur:t=>{const l=t.target.value.trim();r("AGIM_PLATFORM_BLACKLIST",l===""?null:l)}}),i?.platformBlacklist&&i.platformBlacklist.length>0&&e.jsxs("p",{className:"mt-2 text-[10px] text-muted",children:[s("security.platformBlacklist.currentLabel"),": ",i.platformBlacklist.join(", ")]})]})]})}function x({label:s,ok:a,text:o}){return e.jsxs("li",{className:"flex items-start gap-2",children:[a?e.jsx(V,{className:"mt-0.5 h-4 w-4 shrink-0 text-success"}):e.jsx(w,{className:"mt-0.5 h-4 w-4 shrink-0 text-warning"}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"font-medium",children:s}),e.jsx("div",{className:S("text-xs",a?"text-muted":"text-warning"),children:o})]})]})}function m({title:s,description:a,envKey:o,children:i}){return e.jsxs("section",{className:"rounded-lg border border-border bg-card p-4",children:[e.jsxs("div",{className:"mb-2 flex flex-wrap items-baseline gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold",children:s}),o&&e.jsx(B,{variant:"outline",className:"font-mono text-[10px]",children:o})]}),e.jsx("p",{className:"mb-3 text-xs text-muted",children:a}),i]})}function c({label:s,hint:a,children:o}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{className:"text-xs font-medium text-muted",children:s}),o,a&&e.jsx("p",{className:"text-[10px] text-muted",children:a})]})}export{H as default};
|
|
2
|
-
//# sourceMappingURL=security-BIcnUrAs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"security-BIcnUrAs.js","sources":["../../src/routes/settings/security.tsx"],"sourcesContent":["/**\n * /settings/security — central console for v1.2.66 security controls.\n *\n * Lays out:\n * • Diagnostics card (read-only) — uid 0? env file perms? bwrap? allowlists configured?\n * • Sender allowlist (AGIM_ALLOWED_USERS)\n * • Native exec (AGIM_EXEC_SANDBOX, AGIM_EXEC_SANDBOX_NET, AGIM_EXEC_TIMEOUT_MS, AGIM_EXEC_MAX_OUTPUT)\n * • Native web (AGIM_NATIVE_WEB_ALLOW_PRIVATE, AGIM_NATIVE_WEB_SSRF_WHITELIST, AGIM_NATIVE_WEB_TIMEOUT_MS)\n * • Native fs (AGIM_NATIVE_FS_RESTRICT, AGIM_NATIVE_FS_TIMEOUT_MS)\n * • Delegation (AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN)\n *\n * All writes go through PUT /api/env (admin-gated). Most knobs are\n * hot-reloaded (read process.env per tool call); the exec sandbox +\n * sender allowlist apply at boot — service restart required.\n */\n\nimport { useEffect, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { AlertTriangle, CheckCircle2, Loader2, RefreshCcw, ShieldAlert } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useEnv, useUpdateEnv } from '@/hooks/use-settings'\nimport { client } from '@/lib/api/client'\nimport { describeError } from '@/lib/api/errors'\nimport { cn } from '@/lib/utils'\n\ninterface Diagnostics {\n runningAsRoot: boolean | null\n envFile: { exists: boolean; mode: string | null; tooPermissive: boolean }\n bwrapAvailable: boolean\n senderAllowlistConfigured: boolean\n adminAllowlistConfigured: boolean\n platformBlacklist: string[]\n liveEnv: Record<string, string | null>\n}\n\nfunction envBool(v: string | undefined): boolean {\n if (v == null) return false\n const t = v.toLowerCase()\n return t === '1' || t === 'true' || t === 'yes' || t === 'on'\n}\n\nexport default function SettingsSecurityRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const envQuery = useEnv()\n const updateEnv = useUpdateEnv()\n const [diagnostics, setDiagnostics] = useState<Diagnostics | null>(null)\n const [diagLoading, setDiagLoading] = useState(false)\n\n async function loadDiagnostics(): Promise<void> {\n setDiagLoading(true)\n try {\n const res = await client.get<{ diagnostics: Diagnostics }>('/api/security/diagnostics')\n setDiagnostics(res.diagnostics)\n } catch (err) {\n toast.error(describeError(err, t).message)\n } finally {\n setDiagLoading(false)\n }\n }\n\n useEffect(() => { void loadDiagnostics() }, [])\n\n async function setValue(key: string, value: string | null): Promise<void> {\n try {\n await updateEnv.mutateAsync({ updates: { [key]: value } })\n toast.success(t('security.savingToast'))\n await loadDiagnostics()\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n const env = envQuery.data?.env ?? {}\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('security.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => { void envQuery.refetch(); void loadDiagnostics() }}\n disabled={envQuery.isFetching || diagLoading}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {envQuery.isFetching || diagLoading\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />\n }\n </Button>\n </div>\n <p className=\"text-sm text-muted\">{t('security.subtitle')}</p>\n </header>\n\n {/* Diagnostics card */}\n <section className=\"rounded-lg border border-border bg-card p-4\">\n <h2 className=\"mb-3 flex items-center gap-2 text-sm font-semibold\">\n <ShieldAlert className=\"h-4 w-4\" />\n {t('security.diagnostics.title')}\n </h2>\n {diagnostics ? (\n <ul className=\"grid gap-2 text-sm sm:grid-cols-2\">\n <DiagRow\n label={t('security.diagnostics.runningAsRoot')}\n ok={diagnostics.runningAsRoot === false}\n text={diagnostics.runningAsRoot === true ? t('security.diagnostics.runningAsRootHelp') : 'OK'}\n />\n <DiagRow\n label={t('security.diagnostics.envFilePerms')}\n ok={diagnostics.envFile.exists && !diagnostics.envFile.tooPermissive}\n text={\n !diagnostics.envFile.exists\n ? '—'\n : diagnostics.envFile.tooPermissive\n ? `${diagnostics.envFile.mode} — ${t('security.diagnostics.envFilePermsLax')}`\n : t('security.diagnostics.envFilePermsOk')\n }\n />\n <DiagRow\n label={t('security.diagnostics.bwrapAvailable')}\n ok={diagnostics.bwrapAvailable}\n text={diagnostics.bwrapAvailable ? '/usr/bin/bwrap' : t('security.diagnostics.bwrapMissing')}\n />\n <DiagRow\n label={t('security.diagnostics.senderAllowlist')}\n ok={diagnostics.senderAllowlistConfigured}\n text={diagnostics.senderAllowlistConfigured\n ? t('security.diagnostics.senderAllowlistOn')\n : t('security.diagnostics.senderAllowlistOff')\n }\n />\n <DiagRow\n label={t('security.diagnostics.adminAllowlist')}\n ok={diagnostics.adminAllowlistConfigured}\n text={diagnostics.adminAllowlistConfigured\n ? t('security.diagnostics.adminAllowlistOn')\n : t('security.diagnostics.adminAllowlistOff')\n }\n />\n <DiagRow\n label={t('security.diagnosticsPlatformBlacklist')}\n ok={diagnostics.platformBlacklist.length === 0}\n text={diagnostics.platformBlacklist.length === 0\n ? '—'\n : diagnostics.platformBlacklist.join(', ')\n }\n />\n </ul>\n ) : (\n <p className=\"text-sm text-muted\">…</p>\n )}\n </section>\n\n {/* Sender allowlist */}\n <ControlCard\n title={t('security.sender.title')}\n description={t('security.sender.description')}\n envKey=\"AGIM_ALLOWED_USERS\"\n >\n <Input\n defaultValue={env.AGIM_ALLOWED_USERS ?? ''}\n placeholder={t('security.sender.placeholder')}\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_ALLOWED_USERS', v === '' ? null : v)\n }}\n />\n </ControlCard>\n\n {/* Exec sandbox */}\n <ControlCard\n title={t('security.exec.title')}\n description={t('security.exec.description')}\n >\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <LabeledField label={t('security.exec.sandbox')}>\n <Select\n value={(env.AGIM_EXEC_SANDBOX ?? '').toLowerCase() === 'bwrap' ? 'bwrap' : '__none__'}\n onValueChange={(v) => void setValue('AGIM_EXEC_SANDBOX', v === '__none__' ? null : v)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__none__\">{t('security.exec.sandboxNone')}</SelectItem>\n <SelectItem\n value=\"bwrap\"\n disabled={!diagnostics?.bwrapAvailable}\n >\n {t('security.exec.sandboxBwrap')}\n {!diagnostics?.bwrapAvailable && (\n <span className=\"ml-2 text-xs text-muted\">\n ({t('security.exec.sandboxBwrapMissing')})\n </span>\n )}\n </SelectItem>\n </SelectContent>\n </Select>\n </LabeledField>\n\n <LabeledField label={t('security.exec.sandboxNet')}>\n <Select\n value={(env.AGIM_EXEC_SANDBOX_NET ?? '').toLowerCase() === 'off' ? 'off' : 'on'}\n onValueChange={(v) => void setValue('AGIM_EXEC_SANDBOX_NET', v === 'off' ? 'off' : null)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"on\">{t('security.exec.sandboxNetOn')}</SelectItem>\n <SelectItem value=\"off\">{t('security.exec.sandboxNetOff')}</SelectItem>\n </SelectContent>\n </Select>\n </LabeledField>\n\n <LabeledField label={t('security.exec.timeoutMs')}>\n <Input\n type=\"number\"\n defaultValue={env.AGIM_EXEC_TIMEOUT_MS ?? ''}\n placeholder=\"60000\"\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_EXEC_TIMEOUT_MS', v === '' ? null : v)\n }}\n />\n </LabeledField>\n\n <LabeledField label={t('security.exec.maxOutput')}>\n <Input\n type=\"number\"\n defaultValue={env.AGIM_EXEC_MAX_OUTPUT ?? ''}\n placeholder=\"32768\"\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_EXEC_MAX_OUTPUT', v === '' ? null : v)\n }}\n />\n </LabeledField>\n </div>\n </ControlCard>\n\n {/* Web SSRF */}\n <ControlCard\n title={t('security.web.title')}\n description={t('security.web.description')}\n >\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <LabeledField label={t('security.web.allowPrivate')} hint={t('security.web.allowPrivateHelp')}>\n <Select\n value={envBool(env.AGIM_NATIVE_WEB_ALLOW_PRIVATE) ? '1' : '0'}\n onValueChange={(v) => void setValue('AGIM_NATIVE_WEB_ALLOW_PRIVATE', v === '1' ? '1' : null)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"0\">OFF</SelectItem>\n <SelectItem value=\"1\">ON</SelectItem>\n </SelectContent>\n </Select>\n </LabeledField>\n\n <LabeledField label={t('security.web.timeoutMs')}>\n <Input\n type=\"number\"\n defaultValue={env.AGIM_NATIVE_WEB_TIMEOUT_MS ?? ''}\n placeholder=\"30000\"\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_NATIVE_WEB_TIMEOUT_MS', v === '' ? null : v)\n }}\n />\n </LabeledField>\n\n <div className=\"sm:col-span-2\">\n <LabeledField label={t('security.web.ssrfWhitelist')}>\n <Input\n defaultValue={env.AGIM_NATIVE_WEB_SSRF_WHITELIST ?? ''}\n placeholder={t('security.web.ssrfWhitelistPlaceholder')}\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_NATIVE_WEB_SSRF_WHITELIST', v === '' ? null : v)\n }}\n />\n </LabeledField>\n </div>\n </div>\n </ControlCard>\n\n {/* FS */}\n <ControlCard\n title={t('security.fs.title')}\n description={t('security.fs.description')}\n >\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <LabeledField label={t('security.fs.restrict')}>\n <Select\n value={(env.AGIM_NATIVE_FS_RESTRICT ?? '0') === '1' ? '1' : '0'}\n onValueChange={(v) => void setValue('AGIM_NATIVE_FS_RESTRICT', v === '1' ? '1' : null)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"1\">{t('security.fs.restrictOn')}</SelectItem>\n <SelectItem value=\"0\">{t('security.fs.restrictOff')}</SelectItem>\n </SelectContent>\n </Select>\n </LabeledField>\n\n <LabeledField label={t('security.fs.timeoutMs')}>\n <Input\n type=\"number\"\n defaultValue={env.AGIM_NATIVE_FS_TIMEOUT_MS ?? ''}\n placeholder=\"60000\"\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_NATIVE_FS_TIMEOUT_MS', v === '' ? null : v)\n }}\n />\n </LabeledField>\n </div>\n </ControlCard>\n\n {/* Delegation cap */}\n <ControlCard\n title={t('security.delegation.title')}\n description={t('security.delegation.description')}\n envKey=\"AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN\"\n >\n <Input\n type=\"number\"\n defaultValue={env.AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN ?? ''}\n placeholder=\"2\"\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN', v === '' ? null : v)\n }}\n />\n </ControlCard>\n\n {/* IM platform blacklist */}\n <ControlCard\n title={t('security.platformBlacklist.title')}\n description={t('security.platformBlacklist.description')}\n envKey=\"AGIM_PLATFORM_BLACKLIST\"\n >\n <Input\n defaultValue={env.AGIM_PLATFORM_BLACKLIST ?? ''}\n placeholder={t('security.platformBlacklist.placeholder')}\n onBlur={(e) => {\n const v = e.target.value.trim()\n void setValue('AGIM_PLATFORM_BLACKLIST', v === '' ? null : v)\n }}\n />\n {diagnostics?.platformBlacklist && diagnostics.platformBlacklist.length > 0 && (\n <p className=\"mt-2 text-[10px] text-muted\">\n {t('security.platformBlacklist.currentLabel')}: {diagnostics.platformBlacklist.join(', ')}\n </p>\n )}\n </ControlCard>\n </div>\n )\n}\n\nfunction DiagRow({ label, ok, text }: { label: string; ok: boolean; text: string }): JSX.Element {\n return (\n <li className=\"flex items-start gap-2\">\n {ok\n ? <CheckCircle2 className=\"mt-0.5 h-4 w-4 shrink-0 text-success\" />\n : <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0 text-warning\" />\n }\n <div className=\"flex-1\">\n <div className=\"font-medium\">{label}</div>\n <div className={cn('text-xs', ok ? 'text-muted' : 'text-warning')}>{text}</div>\n </div>\n </li>\n )\n}\n\nfunction ControlCard({\n title, description, envKey, children,\n}: { title: string; description: string; envKey?: string; children: React.ReactNode }): JSX.Element {\n return (\n <section className=\"rounded-lg border border-border bg-card p-4\">\n <div className=\"mb-2 flex flex-wrap items-baseline gap-2\">\n <h2 className=\"text-sm font-semibold\">{title}</h2>\n {envKey && <Badge variant=\"outline\" className=\"font-mono text-[10px]\">{envKey}</Badge>}\n </div>\n <p className=\"mb-3 text-xs text-muted\">{description}</p>\n {children}\n </section>\n )\n}\n\nfunction LabeledField({\n label, hint, children,\n}: { label: string; hint?: string; children: React.ReactNode }): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <label className=\"text-xs font-medium text-muted\">{label}</label>\n {children}\n {hint && <p className=\"text-[10px] text-muted\">{hint}</p>}\n </div>\n )\n}\n"],"names":["envBool","v","t","SettingsSecurityRoute","useTranslation","envQuery","useEnv","updateEnv","useUpdateEnv","diagnostics","setDiagnostics","useState","diagLoading","setDiagLoading","loadDiagnostics","res","client","err","toast","describeError","useEffect","setValue","key","value","env","jsxs","jsx","Button","Loader2","RefreshCcw","ShieldAlert","DiagRow","ControlCard","Input","e","LabeledField","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","label","ok","text","CheckCircle2","AlertTriangle","cn","title","description","envKey","children","Badge","hint"],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{o as z,u as P,j as e,B as f,l as L,R as T,c as w,m,n as v,X as U,L as _,I as O}from"./index-DHh1LYlA.js";import{r as p}from"./react-DlP5eolq.js";import{C as y}from"./confirm-dialog-gPKJnvEW.js";import{j as B,k as W,l as q,m as M,a as H,c as Q}from"./use-settings-DKbDqCEJ.js";import{L as S}from"./loader-circle-DgdBWYl0.js";import{R as V}from"./refresh-ccw-nBMm5Xal.js";import{P as X}from"./play-CPoE_JnS.js";import{N as $}from"./network--s113Jkm.js";import{S as G}from"./save-DbrrCFDM.js";/**
|
|
2
|
-
* @license lucide-react v0.469.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const J=z("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]),K={systemd:"success",background:"info",foreground:"warning",none:"default"},C=3e3,k=9090;function oe(){const{t:s}=P(["settings","common"]),r=B(),t=r.data,a=t&&t.mode!=="none",i=W(),n=q(),o=M(),[u,x]=p.useState(!1),[h,g]=p.useState(!1);async function b(){try{await i.mutateAsync(),m.success(s("service.toast.started"))}catch(c){m.error(v(c,s).message)}}async function d(){try{await n.mutateAsync(),m.success(s("service.toast.stopped"))}catch(c){throw m.error(v(c,s).message),c}}async function l(){try{await o.mutateAsync(),m.success(s("service.toast.restarted"))}catch(c){throw m.error(v(c,s).message),c}}return e.jsxs("div",{className:"mx-auto flex max-w-3xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("service.title")}),e.jsxs(f,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>r.refetch(),disabled:r.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[r.isFetching?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(V,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("service.subtitle")})]}),e.jsx(Y,{}),r.isLoading?e.jsx("div",{className:"h-48 rounded-md bg-surface-2 animate-pulse"}):t?e.jsxs("div",{className:"rounded-md border border-border bg-surface p-4",children:[e.jsxs("dl",{className:"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 text-sm",children:[e.jsx("dt",{className:"text-text-dim",children:s("service.modeLabel")}),e.jsx("dd",{children:e.jsx(L,{variant:K[t.mode],children:s(`service.mode.${t.mode}`)})}),t.pid!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:s("service.pidLabel")}),e.jsx("dd",{className:"tabular-nums font-mono",children:t.pid})]}),t.uptime&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:s("service.uptimeLabel")}),e.jsx("dd",{className:"tabular-nums",children:t.uptime})]}),t.web&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:s("service.webLabel")}),e.jsxs("dd",{className:"font-mono text-xs",children:[t.web.bind,":",t.web.port]})]}),e.jsx("dt",{className:"text-text-dim",children:s("service.bootPhaseLabel")}),e.jsx("dd",{children:e.jsx("code",{className:"rounded bg-surface-2 px-1.5 py-0.5 text-xs",children:t.bootPhase})})]}),e.jsxs("div",{className:"mt-4 flex flex-wrap gap-2",children:[e.jsxs(f,{type:"button",variant:"default",size:"sm",disabled:a||i.isPending,onClick:()=>void b(),children:[i.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(X,{className:"h-4 w-4"}),s("service.actions.start")]}),e.jsxs(f,{type:"button",variant:"outline",size:"sm",disabled:!a||o.isPending,onClick:()=>g(!0),children:[e.jsx(T,{className:w("h-4 w-4",o.isPending&&"animate-spin")}),s("service.actions.restart")]}),e.jsxs(f,{type:"button",variant:"destructive",size:"sm",disabled:!a||n.isPending,onClick:()=>x(!0),children:[e.jsx(J,{className:"h-4 w-4"}),s("service.actions.stop")]})]})]}):null,e.jsx(y,{open:u,onOpenChange:x,title:s("service.actions.confirmStop"),description:s("service.actions.confirmStopDesc"),intent:"danger",confirmLabel:s("service.actions.stop"),onConfirm:d}),e.jsx(y,{open:h,onOpenChange:g,title:s("service.actions.confirmRestart"),description:s("service.actions.confirmRestartDesc"),intent:"danger",confirmLabel:s("service.actions.restart"),onConfirm:l})]})}function A(s){const r=s.trim();if(!r)return{ok:!0,value:void 0};const t=Number.parseInt(r,10);return!Number.isFinite(t)||t<1||t>65535?{ok:!1}:{ok:!0,value:t}}function Y(){const{t:s}=P(["settings","common"]),r=H(),t=Q(),a=r.data,i=a?.webPort,n=a?.acpPort,[o,u]=p.useState(""),[x,h]=p.useState(""),[g,b]=p.useState(0);p.useEffect(()=>{a&&r.dataUpdatedAt!==g&&(u(i!=null?String(i):""),h(n!=null?String(n):""),b(r.dataUpdatedAt))},[a,r.dataUpdatedAt,i,n,g]);const d=A(o),l=A(x),c=!d.ok,j=!l.ok,D=p.useMemo(()=>{if(!a)return!1;const N=d.ok?d.value:void 0,I=l.ok?l.value:void 0;return N!==i||I!==n},[a,d,l,i,n]);function F(){u(i!=null?String(i):""),h(n!=null?String(n):"")}async function E(){if(!(!a||c||j))try{await t.mutateAsync({...a,webPort:d.ok?d.value:void 0,acpPort:l.ok?l.value:void 0}),m.success(s("service.ports.toast.saved"))}catch(N){m.error(v(N,s).message)}}return r.isLoading?e.jsx("div",{className:"h-32 rounded-md bg-surface-2 animate-pulse"}):e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx($,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:s("service.ports.title")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:s("service.ports.subtitle")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 px-4 py-3 sm:grid-cols-2",children:[e.jsx(R,{id:"web-port",label:s("service.ports.webPort"),hint:s("service.ports.webPortHint",{default:C}),value:o,onChange:u,invalid:c,placeholder:String(C)}),a?.features?.remoteAgent?e.jsx(R,{id:"acp-port",label:s("service.ports.acpPort"),hint:s("service.ports.acpPortHint",{default:k}),value:x,onChange:h,invalid:j,placeholder:String(k)}):null]}),D&&e.jsxs("div",{className:"flex items-center gap-2 border-t border-border px-4 py-3",children:[e.jsx(L,{variant:"warning",children:s("service.ports.restartRequired")}),e.jsxs(f,{variant:"ghost",size:"sm",className:"ml-auto",onClick:F,disabled:t.isPending,children:[e.jsx(U,{className:"h-4 w-4"}),s("service.ports.discard")]}),e.jsxs(f,{size:"sm",onClick:()=>void E(),disabled:t.isPending||c||j,children:[t.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(G,{className:"h-4 w-4"}),t.isPending?s("service.ports.saving"):s("service.ports.save")]})]})]})}function R({id:s,label:r,hint:t,value:a,onChange:i,invalid:n,placeholder:o}){const{t:u}=P("settings");return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(_,{htmlFor:s,className:"text-xs font-medium",children:r}),e.jsx(O,{id:s,type:"number",inputMode:"numeric",min:1,max:65535,value:a,onChange:x=>i(x.target.value),placeholder:o,"aria-invalid":n,className:w("font-mono",n&&"border-danger focus:ring-danger")}),e.jsx("p",{className:w("text-[11px]",n?"text-danger":"text-text-dim"),children:n?u("service.ports.invalidPort"):t})]})}export{oe as default};
|
|
7
|
-
//# sourceMappingURL=service-CnorFHzZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-CnorFHzZ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/square.js","../../src/routes/settings/service.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 Square = createLucideIcon(\"Square\", [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }]\n]);\n\nexport { Square as default };\n//# sourceMappingURL=square.js.map\n","/**\n * /settings/service — operator-facing process control: see the\n * running agim daemon's mode/pid/uptime + start, stop, or restart it.\n *\n * R8 (this round) added a dedicated \"Ports\" card at the top covering\n * webPort + acpPort. They live in `~/.agim/config.json` (PUT /api/config),\n * and take effect on the next service restart — handled by the\n * Start/Restart buttons immediately below.\n *\n * Stop and restart go through ConfirmDialog because they\n * permanently interrupt every messenger adapter + in-flight job;\n * Start is one-click since it's safe to invoke even when already\n * running (backend short-circuits to alreadyRunning:true).\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n Loader2, Network, Play, RefreshCcw, RotateCcw, Save, Square, X,\n} from 'lucide-react'\n\nimport { ConfirmDialog } from '@/components/common/confirm-dialog'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n useConfig,\n useRestartService,\n useServiceStatus,\n useStartService,\n useStopService,\n useUpdateConfig,\n} from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport type { ServiceMode } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nconst MODE_VARIANT: Record<ServiceMode, 'success' | 'info' | 'warning' | 'default'> = {\n systemd: 'success',\n background: 'info',\n foreground: 'warning',\n none: 'default',\n}\n\nconst DEFAULT_WEB_PORT = 3000\nconst DEFAULT_ACP_PORT = 9090\n\nexport default function SettingsServiceRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const status = useServiceStatus()\n const data = status.data\n const isRunning = data && data.mode !== 'none'\n\n const start = useStartService()\n const stop = useStopService()\n const restart = useRestartService()\n\n const [confirmStop, setConfirmStop] = useState(false)\n const [confirmRestart, setConfirmRestart] = useState(false)\n\n async function onStart(): Promise<void> {\n try {\n await start.mutateAsync()\n toast.success(t('service.toast.started'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n async function onConfirmStop(): Promise<void> {\n try {\n await stop.mutateAsync()\n toast.success(t('service.toast.stopped'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n throw err\n }\n }\n async function onConfirmRestart(): Promise<void> {\n try {\n await restart.mutateAsync()\n toast.success(t('service.toast.restarted'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n throw err\n }\n }\n\n return (\n <div className=\"mx-auto flex max-w-3xl 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('service.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => status.refetch()}\n disabled={status.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {status.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('service.subtitle')}</p>\n </header>\n\n <PortsCard />\n\n {status.isLoading ? (\n <div className=\"h-48 rounded-md bg-surface-2 animate-pulse\" />\n ) : data ? (\n <div className=\"rounded-md border border-border bg-surface p-4\">\n <dl className=\"grid grid-cols-[max-content_1fr] gap-x-4 gap-y-2 text-sm\">\n <dt className=\"text-text-dim\">{t('service.modeLabel')}</dt>\n <dd>\n <Badge variant={MODE_VARIANT[data.mode]}>\n {t(`service.mode.${data.mode}`)}\n </Badge>\n </dd>\n {data.pid != null && (\n <>\n <dt className=\"text-text-dim\">{t('service.pidLabel')}</dt>\n <dd className=\"tabular-nums font-mono\">{data.pid}</dd>\n </>\n )}\n {data.uptime && (\n <>\n <dt className=\"text-text-dim\">{t('service.uptimeLabel')}</dt>\n <dd className=\"tabular-nums\">{data.uptime}</dd>\n </>\n )}\n {data.web && (\n <>\n <dt className=\"text-text-dim\">{t('service.webLabel')}</dt>\n <dd className=\"font-mono text-xs\">{data.web.bind}:{data.web.port}</dd>\n </>\n )}\n <dt className=\"text-text-dim\">{t('service.bootPhaseLabel')}</dt>\n <dd>\n <code className=\"rounded bg-surface-2 px-1.5 py-0.5 text-xs\">{data.bootPhase}</code>\n </dd>\n </dl>\n\n {/* Action buttons */}\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"sm\"\n disabled={isRunning || start.isPending}\n onClick={() => void onStart()}\n >\n {start.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Play className=\"h-4 w-4\" />}\n {t('service.actions.start')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={!isRunning || restart.isPending}\n onClick={() => setConfirmRestart(true)}\n >\n <RotateCcw className={cn('h-4 w-4', restart.isPending && 'animate-spin')} />\n {t('service.actions.restart')}\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n disabled={!isRunning || stop.isPending}\n onClick={() => setConfirmStop(true)}\n >\n <Square className=\"h-4 w-4\" />\n {t('service.actions.stop')}\n </Button>\n </div>\n </div>\n ) : null}\n\n <ConfirmDialog\n open={confirmStop}\n onOpenChange={setConfirmStop}\n title={t('service.actions.confirmStop')}\n description={t('service.actions.confirmStopDesc')}\n intent=\"danger\"\n confirmLabel={t('service.actions.stop')}\n onConfirm={onConfirmStop}\n />\n <ConfirmDialog\n open={confirmRestart}\n onOpenChange={setConfirmRestart}\n title={t('service.actions.confirmRestart')}\n description={t('service.actions.confirmRestartDesc')}\n intent=\"danger\"\n confirmLabel={t('service.actions.restart')}\n onConfirm={onConfirmRestart}\n />\n </div>\n )\n}\n\n/* ─────────────── Ports card (webPort + acpPort) ─────────────── */\n\n/** Validate a port string. Empty = \"use the default\", which we\n * represent on the wire as `undefined` (omitted field). Non-empty\n * must parse to 1..65535. */\nfunction parsePort(s: string): { ok: true; value: number | undefined } | { ok: false } {\n const trimmed = s.trim()\n if (!trimmed) return { ok: true, value: undefined }\n const n = Number.parseInt(trimmed, 10)\n if (!Number.isFinite(n) || n < 1 || n > 65535) return { ok: false }\n return { ok: true, value: n }\n}\n\nfunction PortsCard(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const cfgQuery = useConfig()\n const updateCfg = useUpdateConfig()\n\n const cfg = cfgQuery.data\n const currentWeb = cfg?.webPort\n const currentAcp = cfg?.acpPort\n\n const [webDraft, setWebDraft] = useState<string>('')\n const [acpDraft, setAcpDraft] = useState<string>('')\n // Tracks the cfg snapshot we last synced from, so post-save refetch\n // re-hydrates the drafts cleanly (and so local edits don't get\n // clobbered by background refetches).\n const [syncedAt, setSyncedAt] = useState<number>(0)\n\n useEffect(() => {\n if (!cfg) return\n if (cfgQuery.dataUpdatedAt === syncedAt) return\n setWebDraft(currentWeb != null ? String(currentWeb) : '')\n setAcpDraft(currentAcp != null ? String(currentAcp) : '')\n setSyncedAt(cfgQuery.dataUpdatedAt)\n }, [cfg, cfgQuery.dataUpdatedAt, currentWeb, currentAcp, syncedAt])\n\n const webParsed = parsePort(webDraft)\n const acpParsed = parsePort(acpDraft)\n const webInvalid = !webParsed.ok\n const acpInvalid = !acpParsed.ok\n\n const isDirty = useMemo(() => {\n if (!cfg) return false\n const nextWeb = webParsed.ok ? webParsed.value : undefined\n const nextAcp = acpParsed.ok ? acpParsed.value : undefined\n return nextWeb !== currentWeb || nextAcp !== currentAcp\n }, [cfg, webParsed, acpParsed, currentWeb, currentAcp])\n\n function onDiscard(): void {\n setWebDraft(currentWeb != null ? String(currentWeb) : '')\n setAcpDraft(currentAcp != null ? String(currentAcp) : '')\n }\n\n async function onSave(): Promise<void> {\n if (!cfg || webInvalid || acpInvalid) return\n try {\n await updateCfg.mutateAsync({\n ...cfg,\n webPort: webParsed.ok ? webParsed.value : undefined,\n acpPort: acpParsed.ok ? acpParsed.value : undefined,\n })\n toast.success(t('service.ports.toast.saved'))\n } catch (err) {\n toast.error(describeError(err, t).message)\n }\n }\n\n if (cfgQuery.isLoading) {\n return <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <Network className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('service.ports.title')}</h2>\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('service.ports.subtitle')}</p>\n\n <div className=\"grid grid-cols-1 gap-3 px-4 py-3 sm:grid-cols-2\">\n <PortField\n id=\"web-port\"\n label={t('service.ports.webPort')}\n hint={t('service.ports.webPortHint', { default: DEFAULT_WEB_PORT })}\n value={webDraft}\n onChange={setWebDraft}\n invalid={webInvalid}\n placeholder={String(DEFAULT_WEB_PORT)}\n />\n {/* R15 — acpPort hidden when remote-agent feature is off (same\n gate as the ACP card in /settings/agents). Server already\n strips acpPort from GET /api/config and drops it from\n incoming PUT in the off state. */}\n {cfg?.features?.remoteAgent ? (\n <PortField\n id=\"acp-port\"\n label={t('service.ports.acpPort')}\n hint={t('service.ports.acpPortHint', { default: DEFAULT_ACP_PORT })}\n value={acpDraft}\n onChange={setAcpDraft}\n invalid={acpInvalid}\n placeholder={String(DEFAULT_ACP_PORT)}\n />\n ) : null}\n </div>\n\n {isDirty && (\n <div className=\"flex items-center gap-2 border-t border-border px-4 py-3\">\n <Badge variant=\"warning\">{t('service.ports.restartRequired')}</Badge>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={onDiscard}\n disabled={updateCfg.isPending}\n >\n <X className=\"h-4 w-4\" />\n {t('service.ports.discard')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateCfg.isPending || webInvalid || acpInvalid}\n >\n {updateCfg.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Save className=\"h-4 w-4\" />}\n {updateCfg.isPending ? t('service.ports.saving') : t('service.ports.save')}\n </Button>\n </div>\n )}\n </section>\n )\n}\n\ninterface PortFieldProps {\n id: string\n label: string\n hint: string\n value: string\n onChange: (v: string) => void\n invalid: boolean\n placeholder: string\n}\n\nfunction PortField({\n id, label, hint, value, onChange, invalid, placeholder,\n}: PortFieldProps): JSX.Element {\n const { t } = useTranslation('settings')\n return (\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={id} className=\"text-xs font-medium\">{label}</Label>\n <Input\n id={id}\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n max={65535}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n aria-invalid={invalid}\n className={cn('font-mono', invalid && 'border-danger focus:ring-danger')}\n />\n <p className={cn('text-[11px]', invalid ? 'text-danger' : 'text-text-dim')}>\n {invalid ? t('service.ports.invalidPort') : hint}\n </p>\n </div>\n )\n}\n"],"names":["Square","createLucideIcon","MODE_VARIANT","DEFAULT_WEB_PORT","DEFAULT_ACP_PORT","SettingsServiceRoute","t","useTranslation","status","useServiceStatus","data","isRunning","start","useStartService","stop","useStopService","restart","useRestartService","confirmStop","setConfirmStop","useState","confirmRestart","setConfirmRestart","onStart","toast","err","describeError","onConfirmStop","onConfirmRestart","jsxs","jsx","Button","Loader2","RefreshCcw","PortsCard","Badge","Fragment","Play","RotateCcw","cn","ConfirmDialog","parsePort","trimmed","n","cfgQuery","useConfig","updateCfg","useUpdateConfig","cfg","currentWeb","currentAcp","webDraft","setWebDraft","acpDraft","setAcpDraft","syncedAt","setSyncedAt","useEffect","webParsed","acpParsed","webInvalid","acpInvalid","isDirty","useMemo","nextWeb","nextAcp","onDiscard","onSave","Network","PortField","X","Save","id","label","hint","value","onChange","invalid","placeholder","Label","Input","e"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as s,p as a,a as i,e as l}from"./index-DHh1LYlA.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-D1--hHjp.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as o,d as a,a as n,e as u,a9 as i}from"./index-DHh1LYlA.js";const s={all:["memory"],users:["memory","users"],facts:e=>["memory","facts",e],persona:e=>["memory","persona",e],consolidate:["memory","consolidate"],distill:["memory","distill"]};function c(){return o({queryKey:s.users,queryFn:()=>a.listMemoryUsers()})}function y(e,t={}){return o({queryKey:s.facts(e),queryFn:()=>a.listMemoryFacts(e),enabled:t.enabled!==!1&&!!e.user_key})}function d(){const e=n();return u({mutationFn:({id:t,user_key:r})=>a.deleteMemoryFactById(t,{user_key:r}),onSuccess:()=>e.invalidateQueries({queryKey:s.all})})}function m(){const e=n();return u({mutationFn:({user_key:t,body:r})=>a.deleteMemoryFacts({user_key:t},r),onSuccess:()=>e.invalidateQueries({queryKey:s.all})})}function f(e,t={}){return o({queryKey:s.persona(e),queryFn:async()=>{try{return await a.getMemoryPersona({user_key:e})}catch(r){if(r instanceof i&&r.status===404)return null;throw r}},enabled:t.enabled!==!1&&!!e})}function q(){const e=n();return u({mutationFn:({user_key:t,body:r})=>a.updateMemoryPersona({user_key:t},r),onSuccess:(t,r)=>{e.invalidateQueries({queryKey:s.persona(r.user_key)}),e.invalidateQueries({queryKey:s.users})}})}function F(){const e=n();return u({mutationFn:t=>a.deleteMemoryPersona({user_key:t}),onSuccess:(t,r)=>{e.invalidateQueries({queryKey:s.persona(r)}),e.invalidateQueries({queryKey:s.users})}})}function K(e={}){return o({queryKey:s.consolidate,queryFn:()=>a.getMemoryConsolidateStatus(),refetchInterval:3e3,refetchIntervalInBackground:!1,enabled:e.enabled!==!1})}function M(){const e=n();return u({mutationFn:()=>a.consolidateMemory(),onSuccess:()=>{e.invalidateQueries({queryKey:s.consolidate}),e.invalidateQueries({queryKey:s.all})}})}function v(e={}){return o({queryKey:s.distill,queryFn:()=>a.getMemoryDistillStatus(),refetchInterval:3e3,refetchIntervalInBackground:!1,enabled:e.enabled!==!1})}function g(){const e=n();return u({mutationFn:()=>a.triggerMemoryDistill(),onSuccess:()=>{e.invalidateQueries({queryKey:s.distill}),e.invalidateQueries({queryKey:s.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,v as i,g as j,s as m,c as u};
|
|
2
|
-
//# sourceMappingURL=use-memory-Bz1Zao7g.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as r,d as n}from"./index-DHh1LYlA.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-DtqSWVjM.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as u,d as n,a as i,e as s}from"./index-DHh1LYlA.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{S as a,v 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-DKbDqCEJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-settings-DKbDqCEJ.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 +0,0 @@
|
|
|
1
|
-
import{b as r,d as u,a as i,e as o}from"./index-DHh1LYlA.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-CConjEx0.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as q,d as k,e as R,a as z,u as P,j as e,l as A,B as p,S as Q,g as X,h as Z,i as J,k as V,I as y,m as c,n as j,L as $,f as ee,c as U}from"./index-DHh1LYlA.js";import{r as g}from"./react-DlP5eolq.js";import{u as te,b as se}from"./use-settings-DKbDqCEJ.js";import{m as ae}from"./use-memory-Bz1Zao7g.js";import{L as M}from"./loader-circle-DgdBWYl0.js";import{S as re}from"./save-DbrrCFDM.js";import{E as oe,a as ne}from"./eye-6RUADoDS.js";import{C as ie}from"./confirm-dialog-gPKJnvEW.js";import{E as ce}from"./empty-state-CTwOQemt.js";import{C as D}from"./circle-x-DHK7ypFY.js";import{R as le}from"./refresh-ccw-nBMm5Xal.js";import{P as F}from"./play-CPoE_JnS.js";import{D as de}from"./download-CqNiIHa8.js";import{T as me}from"./trash-2-7xrfqd-v.js";import{C as ue}from"./circle-check-big-BC8ntMsz.js";const G={all:["memory","vector"],status:t=>["memory","vector","status",t??null]};function xe(t={}){return q({queryKey:G.status(t.user_key),queryFn:()=>k.getMemoryVectorStatus(t),refetchInterval:3e3,refetchIntervalInBackground:!1})}function Y(t){return()=>{t.invalidateQueries({queryKey:G.all}),t.invalidateQueries({queryKey:ae.all})}}function he(){const t=z(),s=Y(t);return R({mutationFn:n=>k.backfillMemoryVector({user_key:n?.user_key},n?.max_rows?{max_rows:n.max_rows}:void 0),onSuccess:s})}function fe(){const t=z();return R({mutationFn:()=>k.downloadMemoryVector(),onSuccess:Y(t)})}function pe(){const t=z();return R({mutationFn:s=>k.clearMemoryVector({user_key:s?.user_key}),onSuccess:Y(t)})}function W(){return R({mutationFn:()=>k.testMemoryVector()})}const m={backend:"off",localModel:"Xenova/bge-base-zh-v1.5",openaiBaseUrl:"https://api.openai.com/v1",openaiModel:"text-embedding-3-small",openaiApiKey:"",batchSize:"32",hybridWeight:"0.5"};function ve(t){const s=(t.AGIM_MEMORY_VECTOR_BACKEND||"").toLowerCase();return{backend:s==="local"||s==="openai"?s:"off",localModel:t.AGIM_MEMORY_VECTOR_LOCAL_MODEL||"",openaiBaseUrl:t.AGIM_MEMORY_VECTOR_OPENAI_BASE_URL||"",openaiModel:t.AGIM_MEMORY_VECTOR_OPENAI_MODEL||"",openaiApiKey:"",batchSize:t.AGIM_MEMORY_VECTOR_BATCH_SIZE||"",hybridWeight:t.AGIM_MEMORY_VECTOR_HYBRID_WEIGHT||""}}function ge({onSaved:t}){const{t:s}=P(["memory","common"]),n=te({reveal:!1}),l=g.useMemo(()=>n.data?.env??{},[n.data?.env]),[r,h]=g.useState(m),[N,_]=g.useState(!1),f=g.useRef(m);g.useEffect(()=>{if(!n.data)return;const a=ve(l);h(a),f.current=a},[l,n.data]);const b=se(),E=W(),w=g.useMemo(()=>{const a=f.current;return Object.keys(r).some(d=>r[d]!==a[d])},[r]);function x(a,d){h(o=>({...o,[a]:d}))}function S(a){h(d=>{const o={...d,backend:a};return a==="local"&&!o.localModel.trim()&&(o.localModel=m.localModel),a==="openai"&&(o.openaiBaseUrl.trim()||(o.openaiBaseUrl=m.openaiBaseUrl),o.openaiModel.trim()||(o.openaiModel=m.openaiModel)),a!=="off"&&(o.batchSize.trim()||(o.batchSize=m.batchSize),o.hybridWeight.trim()||(o.hybridWeight=m.hybridWeight)),o})}function I(){if(r.backend==="openai"){if(!r.openaiBaseUrl.trim())return s("vector.form.errors.baseUrlRequired");try{new URL(r.openaiBaseUrl.trim())}catch{return s("vector.form.errors.baseUrlInvalid")}if(!r.openaiModel.trim())return s("vector.form.errors.openaiModelRequired");if(!!!l.AGIM_MEMORY_VECTOR_OPENAI_API_KEY&&!r.openaiApiKey.trim())return s("vector.form.errors.apiKeyRequired")}if(r.backend==="local"&&!r.localModel.trim())return s("vector.form.errors.localModelRequired");if(r.batchSize.trim()){const a=Number(r.batchSize);if(!Number.isFinite(a)||a<1||a>1024)return s("vector.form.errors.batchSizeRange")}if(r.hybridWeight.trim()){const a=Number(r.hybridWeight);if(!Number.isFinite(a)||a<0||a>1)return s("vector.form.errors.hybridWeightRange")}return null}function T(){const a=f.current,d={},o=(C,K,H)=>{K!==H&&(d[C]=K.trim()===""?null:K.trim())};return o("AGIM_MEMORY_VECTOR_BACKEND",r.backend,a.backend),o("AGIM_MEMORY_VECTOR_LOCAL_MODEL",r.localModel,a.localModel),o("AGIM_MEMORY_VECTOR_OPENAI_BASE_URL",r.openaiBaseUrl,a.openaiBaseUrl),o("AGIM_MEMORY_VECTOR_OPENAI_MODEL",r.openaiModel,a.openaiModel),o("AGIM_MEMORY_VECTOR_BATCH_SIZE",r.batchSize,a.batchSize),o("AGIM_MEMORY_VECTOR_HYBRID_WEIGHT",r.hybridWeight,a.hybridWeight),r.openaiApiKey.trim()&&(d.AGIM_MEMORY_VECTOR_OPENAI_API_KEY=r.openaiApiKey.trim()),d}async function B(){const a=I();if(a){c.error(a);return}const d=T();if(Object.keys(d).length===0){c.info(s("vector.form.nothingChanged"));return}try{await b.mutateAsync({updates:d}),c.success(s("vector.form.savedToast"));try{const o=await E.mutateAsync();o.ok?c.success(s("vector.actions.testOk")):c.error(s("vector.actions.testFail",{detail:o.error??""}))}catch(o){const{message:C}=j(o,s);c.error(s("vector.actions.testFail",{detail:C}))}t?.()}catch(o){const{message:C}=j(o,s);c.error(C)}}function O(){h(f.current)}const i=b.isPending||E.isPending,u=!!l.AGIM_MEMORY_VECTOR_OPENAI_API_KEY;return e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("h2",{className:"text-sm font-medium",children:s("vector.form.title")}),w&&e.jsx(A,{variant:"info",children:s("vector.form.dirty")}),e.jsxs("div",{className:"ml-auto flex items-center gap-2",children:[w&&e.jsx(p,{type:"button",variant:"secondary",size:"sm",onClick:O,disabled:i,children:s("vector.form.discard")}),e.jsxs(p,{type:"button",size:"sm",onClick:()=>void B(),disabled:!w||i,children:[i?e.jsx(M,{className:"h-4 w-4 animate-spin"}):e.jsx(re,{className:"h-4 w-4"}),s("vector.form.saveAndTest")]})]})]}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:s("vector.form.hint")}),n.isLoading?e.jsx("div",{className:"mt-3 h-32 w-full rounded-md bg-surface-2 animate-pulse"}):e.jsxs("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:[e.jsx(v,{label:s("vector.form.backend"),help:s("vector.form.backendHelp"),children:e.jsxs(Q,{value:r.backend,onValueChange:a=>S(a),children:[e.jsx(X,{children:e.jsx(Z,{})}),e.jsxs(J,{children:[e.jsx(V,{value:"off",children:s("vector.form.backendOff")}),e.jsx(V,{value:"local",children:s("vector.form.backendLocal")}),e.jsx(V,{value:"openai",children:s("vector.form.backendOpenai")})]})]})}),r.backend==="local"&&e.jsx(v,{label:s("vector.form.localModel"),help:s("vector.form.localModelHelp"),children:e.jsx(y,{value:r.localModel,placeholder:m.localModel,onChange:a=>x("localModel",a.target.value),className:"font-mono text-xs"})}),r.backend==="openai"&&e.jsxs(e.Fragment,{children:[e.jsx(v,{label:s("vector.form.openaiBaseUrl"),help:s("vector.form.openaiBaseUrlHelp"),children:e.jsx(y,{value:r.openaiBaseUrl,placeholder:m.openaiBaseUrl,onChange:a=>x("openaiBaseUrl",a.target.value),className:"font-mono text-xs"})}),e.jsx(v,{label:s("vector.form.openaiModel"),help:s("vector.form.openaiModelHelp"),children:e.jsx(y,{value:r.openaiModel,placeholder:m.openaiModel,onChange:a=>x("openaiModel",a.target.value),className:"font-mono text-xs"})}),e.jsx(v,{label:s("vector.form.openaiApiKey"),help:s(u?"vector.form.apiKeyKeepHint":"vector.form.apiKeyNewHint"),children:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(y,{type:N?"text":"password",value:r.openaiApiKey,placeholder:u?l.AGIM_MEMORY_VECTOR_OPENAI_API_KEY||"••••":"sk-…",onChange:a=>x("openaiApiKey",a.target.value),className:"font-mono text-xs",autoComplete:"off"}),e.jsx(p,{type:"button",variant:"ghost",size:"icon",onClick:()=>_(a=>!a),"aria-label":s("vector.form.toggleApiKey"),children:N?e.jsx(oe,{className:"h-4 w-4"}):e.jsx(ne,{className:"h-4 w-4"})})]})})]}),r.backend!=="off"&&e.jsxs(e.Fragment,{children:[e.jsx(v,{label:s("vector.form.batchSize"),help:s("vector.form.batchSizeHelp"),children:e.jsx(y,{type:"number",min:1,max:1024,step:1,value:r.batchSize,placeholder:m.batchSize,onChange:a=>x("batchSize",a.target.value),className:"font-mono text-xs"})}),e.jsx(v,{label:s("vector.form.hybridWeight"),help:s("vector.form.hybridWeightHelp"),children:e.jsx(y,{type:"number",min:0,max:1,step:.05,value:r.hybridWeight,placeholder:m.hybridWeight,onChange:a=>x("hybridWeight",a.target.value),className:"font-mono text-xs"})})]})]})]})}function v({label:t,help:s,children:n}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx($,{className:"text-xs text-text-dim",children:t}),n,s&&e.jsx("p",{className:"text-[11px] text-text-muted",children:s})]})}function Ve(){const{t}=P(["memory","common"]),[s]=ee(),n=s.get("user")??"",l=xe(n?{user_key:n}:{}),r=l.data?.status,h=l.data?.coverage,N=l.data?.jobs??[],_=W(),f=fe(),b=he(),E=pe(),[w,x]=g.useState(!1);async function S(){try{const i=await _.mutateAsync();i.ok?c.success(t("vector.actions.testOk")):c.error(t("vector.actions.testFail",{detail:i.error??""}))}catch(i){const{message:u}=j(i,t);c.error(u)}}async function I(){try{const i=await f.mutateAsync();c.success(i.alreadyReady?t("vector.actions.downloadAlreadyReady"):t("vector.actions.downloadStarted"))}catch(i){const{message:u}=j(i,t);c.error(u)}}async function T(){try{await b.mutateAsync(n?{user_key:n}:void 0),c.success(t("vector.actions.backfillStarted"))}catch(i){const{message:u}=j(i,t);c.error(u)}}async function B(){try{const i=await E.mutateAsync(n?{user_key:n}:void 0);c.success(t("vector.actions.clearStarted",{count:i.cleared}))}catch(i){const{message:u}=j(i,t);throw c.error(u),i}}if(l.isLoading)return e.jsx("div",{className:"h-48 w-full rounded-md bg-surface-2 animate-pulse"});if(!r)return e.jsx(ce,{icon:e.jsx(D,{}),title:t("common:states.error"),description:l.error?.message??""});const O=n?t("vector.coverage.scope_user",{userKey:n}):t("vector.coverage.scope_global");return e.jsxs("div",{className:"mx-auto flex max-w-5xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:t("vector.title")}),e.jsxs(p,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>l.refetch(),disabled:l.isFetching,"aria-label":t("actions.refresh",{ns:"common"}),children:[l.isFetching?e.jsx(M,{className:"h-4 w-4 animate-spin"}):e.jsx(le,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:t("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:t("vector.subtitle")})]}),e.jsx(ge,{onSaved:()=>void l.refetch()}),e.jsxs("div",{className:"grid gap-3 md:grid-cols-2",children:[e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[e.jsx("span",{className:"font-medium",children:t("vector.backendLabel")}),e.jsx(A,{variant:"secondary",children:r.backend}),e.jsx(A,{variant:r.ready?"success":"warning",children:r.ready?t("vector.readyTrue"):t("vector.readyFalse")}),r.downloaded&&e.jsx(A,{variant:"info",children:t("vector.downloadedTrue")})]}),e.jsxs("dl",{className:"mt-3 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-sm",children:[e.jsx("dt",{className:"text-text-dim",children:t("vector.modelLabel")}),e.jsx("dd",{className:"font-mono text-text",children:r.modelId||"—"}),e.jsx("dt",{className:"text-text-dim",children:t("vector.dimsLabel")}),e.jsx("dd",{className:"tabular-nums text-text",children:r.dims||"—"}),r.lastError&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:t("vector.lastError")}),e.jsx("dd",{className:"text-danger text-xs break-all",children:r.lastError})]})]})]}),e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsx("div",{className:"text-sm font-medium",children:t("vector.coverage.title")}),e.jsx("div",{className:"mt-1 text-xs text-text-dim",children:O}),e.jsxs("div",{className:"mt-3 grid grid-cols-3 gap-2",children:[e.jsx(L,{label:t("vector.coverage.total"),value:h?.total??0,tone:"info"}),e.jsx(L,{label:t("vector.coverage.withEmbedding"),value:h?.withEmbedding??0,tone:"success"}),e.jsx(L,{label:t("vector.coverage.withDifferentModel"),value:h?.withDifferentModel??0,tone:"warning"})]})]})]}),e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsx("div",{className:"text-sm font-medium",children:t("vector.actions.title")}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[e.jsxs(p,{variant:"secondary",size:"sm",onClick:()=>void S(),disabled:_.isPending,children:[_.isPending?e.jsx(M,{className:"h-4 w-4 animate-spin"}):e.jsx(F,{className:"h-4 w-4"}),t("vector.actions.test")]}),r.backend==="local"&&e.jsxs(p,{variant:"secondary",size:"sm",onClick:()=>void I(),disabled:f.isPending,children:[f.isPending?e.jsx(M,{className:"h-4 w-4 animate-spin"}):e.jsx(de,{className:"h-4 w-4"}),t("vector.actions.download")]}),e.jsxs(p,{variant:"default",size:"sm",onClick:()=>void T(),disabled:b.isPending||!r.ready,children:[b.isPending?e.jsx(M,{className:"h-4 w-4 animate-spin"}):e.jsx(F,{className:"h-4 w-4"}),t("vector.actions.backfill")]}),e.jsxs(p,{variant:"destructive",size:"sm",onClick:()=>x(!0),disabled:E.isPending,children:[e.jsx(me,{className:"h-4 w-4"}),t("vector.actions.clear")]})]})]}),e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3",children:[e.jsx("div",{className:"text-sm font-medium",children:t("vector.jobs.title")}),N.length===0?e.jsx("div",{className:"mt-2 text-sm text-text-muted",children:t("vector.jobs.empty")}):e.jsx("ul",{className:"mt-2 flex flex-col gap-1.5 text-sm",children:N.map(i=>e.jsx("li",{children:e.jsx(ye,{job:i})},i.id))})]}),e.jsx(ie,{open:w,onOpenChange:x,title:t("vector.actions.confirmClear"),description:t("vector.actions.confirmClearDesc",{scope:O}),intent:"danger",confirmLabel:t("vector.actions.clear"),onConfirm:B})]})}const be={info:"border-info/30 text-info",success:"border-success/30 text-success",warning:"border-warning/30 text-warning",danger:"border-danger/30 text-danger"};function L({label:t,value:s,tone:n}){return e.jsxs("div",{className:U("rounded-md border bg-bg px-2 py-2",be[n]),children:[e.jsx("div",{className:"text-[10px] uppercase tracking-wide text-text-dim",children:t}),e.jsx("div",{className:"text-xl font-semibold tabular-nums",children:s})]})}function ye({job:t}){const{t:s}=P("memory"),n=t.phase==="done"?"text-success":t.phase==="failed"?"text-danger":"text-info";return e.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[e.jsx(A,{variant:"outline",children:t.kind}),e.jsxs("span",{className:U("font-medium",n),children:[t.phase==="running"&&e.jsx(M,{className:"inline h-3 w-3 animate-spin"}),t.phase==="done"&&e.jsx(ue,{className:"inline h-3 w-3"}),t.phase==="failed"&&e.jsx(D,{className:"inline h-3 w-3"})," ",s(`vector.jobs.phase.${t.phase}`)]}),e.jsx("span",{className:"text-text-dim",children:t.message}),e.jsx("span",{className:"ml-auto text-text-muted tabular-nums",children:je(t.finishedAt??t.startedAt)})]})}function je(t){try{const s=new Date(t);return Number.isNaN(s.getTime())?String(t):s.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return String(t)}}export{Ve as default};
|
|
2
|
-
//# sourceMappingURL=vector-D8sEa2W-.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vector-D8sEa2W-.js","sources":["../../src/hooks/use-vector.ts","../../src/routes/memory/vector-backend-form.tsx","../../src/routes/memory/vector.tsx"],"sourcesContent":["/**\n * useVector — react-query wrappers for the embedding/vector backend.\n *\n * useVectorStatus({ user_key }) — status + coverage + jobs\n * (polls every 3s; jobs\n * are async)\n * useTriggerVectorBackfill()\n * useTriggerVectorDownload()\n * useTriggerVectorClear() — DESTRUCTIVE; route gates\n * with ConfirmDialog\n * useTriggerVectorTest()\n *\n * Status polling stops backgrounded (refetchIntervalInBackground:\n * false) so an idle tab on a phone doesn't drain battery.\n */\n\nimport { useQueryClient, useQuery, useMutation } from '@tanstack/react-query'\nimport { api } from '@/lib/api/endpoints'\nimport { memoryKeys } from './use-memory'\nimport type {\n VectorActionResponse,\n VectorClearResponse,\n VectorStatus,\n VectorTestResponse,\n} from '@/types/api'\n\nexport const vectorKeys = {\n all: ['memory', 'vector'] as const,\n status: (user_key?: string) => ['memory', 'vector', 'status', user_key ?? null] as const,\n}\n\nexport function useVectorStatus(query: { user_key?: string } = {}) {\n return useQuery<VectorStatus>({\n queryKey: vectorKeys.status(query.user_key),\n queryFn: () => api.getMemoryVectorStatus(query),\n refetchInterval: 3000,\n refetchIntervalInBackground: false,\n })\n}\n\nfunction invalidateAfter(qc: ReturnType<typeof useQueryClient>): () => void {\n return () => {\n qc.invalidateQueries({ queryKey: vectorKeys.all })\n qc.invalidateQueries({ queryKey: memoryKeys.all })\n }\n}\n\nexport function useTriggerVectorBackfill() {\n const qc = useQueryClient()\n const invalidate = invalidateAfter(qc)\n return useMutation<\n VectorActionResponse,\n Error,\n { user_key?: string; max_rows?: number } | undefined\n >({\n mutationFn: (vars) => api.backfillMemoryVector(\n { user_key: vars?.user_key },\n vars?.max_rows ? { max_rows: vars.max_rows } : undefined,\n ),\n onSuccess: invalidate,\n })\n}\n\nexport function useTriggerVectorDownload() {\n const qc = useQueryClient()\n return useMutation<VectorActionResponse, Error, void>({\n mutationFn: () => api.downloadMemoryVector(),\n onSuccess: invalidateAfter(qc),\n })\n}\n\nexport function useTriggerVectorClear() {\n const qc = useQueryClient()\n return useMutation<VectorClearResponse, Error, { user_key?: string } | undefined>({\n mutationFn: (vars) => api.clearMemoryVector({ user_key: vars?.user_key }),\n onSuccess: invalidateAfter(qc),\n })\n}\n\nexport function useTriggerVectorTest() {\n return useMutation<VectorTestResponse, Error, void>({\n mutationFn: () => api.testMemoryVector(),\n })\n}\n","/**\n * VectorBackendForm — inline, form-based editor for the seven\n * AGIM_MEMORY_VECTOR_* keys that drive the embedding backend.\n *\n * Replaces the older \"Edit in env\" link path: operators no longer\n * have to know which env var maps to which knob, and the on-the-wire\n * format (numbers, OpenAI URL shape) is enforced by the widget.\n *\n * Save flow: PUT /api/env (backend-side allowlist filters to just\n * these keys), then auto-trigger a single `vector/test` so the user\n * sees in toast whether the new config produces an embedding.\n *\n * API key: the GET /api/env response returns secrets masked (e.g.\n * \"sk-1***...abcd\"). The widget shows the mask as placeholder and\n * leaves the input empty by default — typing a value sends it as a\n * real update, leaving it empty sends nothing for that key (the\n * server already rejects masked echoes as \"no change\").\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { Eye, EyeOff, Loader2, Save } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useEnv, useUpdateEnv } from '@/hooks/use-settings'\nimport { useTriggerVectorTest } from '@/hooks/use-vector'\nimport { describeError } from '@/lib/api/errors'\n\ntype BackendName = 'off' | 'local' | 'openai'\n\ninterface FormState {\n backend: BackendName\n localModel: string\n openaiBaseUrl: string\n openaiModel: string\n openaiApiKey: string // empty = \"keep existing\"\n batchSize: string\n hybridWeight: string\n}\n\nconst DEFAULTS: FormState = {\n backend: 'off',\n localModel: 'Xenova/bge-base-zh-v1.5',\n openaiBaseUrl: 'https://api.openai.com/v1',\n openaiModel: 'text-embedding-3-small',\n openaiApiKey: '',\n batchSize: '32',\n hybridWeight: '0.5',\n}\n\nfunction readFormFromEnv(env: Record<string, string>): FormState {\n const raw = (env.AGIM_MEMORY_VECTOR_BACKEND || '').toLowerCase()\n const backend: BackendName = raw === 'local' || raw === 'openai' ? raw : 'off'\n return {\n backend,\n localModel: env.AGIM_MEMORY_VECTOR_LOCAL_MODEL || '',\n openaiBaseUrl: env.AGIM_MEMORY_VECTOR_OPENAI_BASE_URL || '',\n openaiModel: env.AGIM_MEMORY_VECTOR_OPENAI_MODEL || '',\n openaiApiKey: '',\n batchSize: env.AGIM_MEMORY_VECTOR_BATCH_SIZE || '',\n hybridWeight: env.AGIM_MEMORY_VECTOR_HYBRID_WEIGHT || '',\n }\n}\n\nexport interface VectorBackendFormProps {\n /** Called after a successful save + test cycle so the parent page can\n * refresh status + coverage. */\n onSaved?: () => void\n}\n\nexport function VectorBackendForm({ onSaved }: VectorBackendFormProps): JSX.Element {\n const { t } = useTranslation(['memory', 'common'])\n\n // Pull masked env (we never need real key on the client; the masked\n // value is shown as placeholder so the operator can tell a value is\n // configured without revealing it).\n const envQuery = useEnv({ reveal: false })\n const env = useMemo(() => envQuery.data?.env ?? {}, [envQuery.data?.env])\n\n const [form, setForm] = useState<FormState>(DEFAULTS)\n const [showApiKey, setShowApiKey] = useState(false)\n const initialRef = useRef<FormState>(DEFAULTS)\n\n // Reset from server only when the underlying env object identity\n // changes (after refetch). useEffect avoids stomping on local edits\n // mid-typing.\n useEffect(() => {\n if (!envQuery.data) return\n const next = readFormFromEnv(env)\n setForm(next)\n initialRef.current = next\n }, [env, envQuery.data])\n\n const updateEnv = useUpdateEnv()\n const test = useTriggerVectorTest()\n\n const dirty = useMemo(() => {\n const initial = initialRef.current\n return (Object.keys(form) as Array<keyof FormState>).some((k) => form[k] !== initial[k])\n }, [form])\n\n function set<K extends keyof FormState>(k: K, v: FormState[K]): void {\n setForm((prev) => ({ ...prev, [k]: v }))\n }\n\n // v1.2.75 — when the operator switches backend off→local / off→openai\n // and the per-backend fields are still empty, auto-prefill defaults so\n // they don't have to look up the BGE model id by hand. They can still\n // edit afterwards. Also fills shared numeric knobs (batch / weight)\n // since those have well-known sensible defaults too.\n function selectBackend(next: BackendName): void {\n setForm((prev) => {\n const out = { ...prev, backend: next }\n if (next === 'local' && !out.localModel.trim()) {\n out.localModel = DEFAULTS.localModel\n }\n if (next === 'openai') {\n if (!out.openaiBaseUrl.trim()) out.openaiBaseUrl = DEFAULTS.openaiBaseUrl\n if (!out.openaiModel.trim()) out.openaiModel = DEFAULTS.openaiModel\n }\n if (next !== 'off') {\n if (!out.batchSize.trim()) out.batchSize = DEFAULTS.batchSize\n if (!out.hybridWeight.trim()) out.hybridWeight = DEFAULTS.hybridWeight\n }\n return out\n })\n }\n\n function validate(): string | null {\n if (form.backend === 'openai') {\n if (!form.openaiBaseUrl.trim()) return t('vector.form.errors.baseUrlRequired')\n try { new URL(form.openaiBaseUrl.trim()) } catch { return t('vector.form.errors.baseUrlInvalid') }\n if (!form.openaiModel.trim()) return t('vector.form.errors.openaiModelRequired')\n const hasExistingKey = !!env.AGIM_MEMORY_VECTOR_OPENAI_API_KEY\n if (!hasExistingKey && !form.openaiApiKey.trim()) {\n return t('vector.form.errors.apiKeyRequired')\n }\n }\n if (form.backend === 'local' && !form.localModel.trim()) {\n return t('vector.form.errors.localModelRequired')\n }\n if (form.batchSize.trim()) {\n const n = Number(form.batchSize)\n if (!Number.isFinite(n) || n < 1 || n > 1024) return t('vector.form.errors.batchSizeRange')\n }\n if (form.hybridWeight.trim()) {\n const n = Number(form.hybridWeight)\n if (!Number.isFinite(n) || n < 0 || n > 1) return t('vector.form.errors.hybridWeightRange')\n }\n return null\n }\n\n function buildUpdates(): Record<string, string | null> {\n const initial = initialRef.current\n const out: Record<string, string | null> = {}\n const diff = (key: string, current: string, prev: string): void => {\n if (current === prev) return\n out[key] = current.trim() === '' ? null : current.trim()\n }\n diff('AGIM_MEMORY_VECTOR_BACKEND', form.backend, initial.backend)\n diff('AGIM_MEMORY_VECTOR_LOCAL_MODEL', form.localModel, initial.localModel)\n diff('AGIM_MEMORY_VECTOR_OPENAI_BASE_URL', form.openaiBaseUrl, initial.openaiBaseUrl)\n diff('AGIM_MEMORY_VECTOR_OPENAI_MODEL', form.openaiModel, initial.openaiModel)\n diff('AGIM_MEMORY_VECTOR_BATCH_SIZE', form.batchSize, initial.batchSize)\n diff('AGIM_MEMORY_VECTOR_HYBRID_WEIGHT', form.hybridWeight, initial.hybridWeight)\n // API key: only send if the user actually typed a non-empty new value.\n // Empty input = keep current (which is the whole point of the placeholder UX).\n if (form.openaiApiKey.trim()) {\n out.AGIM_MEMORY_VECTOR_OPENAI_API_KEY = form.openaiApiKey.trim()\n }\n return out\n }\n\n async function onSave(): Promise<void> {\n const err = validate()\n if (err) {\n toast.error(err)\n return\n }\n const updates = buildUpdates()\n if (Object.keys(updates).length === 0) {\n toast.info(t('vector.form.nothingChanged'))\n return\n }\n try {\n await updateEnv.mutateAsync({ updates })\n toast.success(t('vector.form.savedToast'))\n // Auto-test against the freshly applied config. We don't await\n // the parent's refresh — the toast is the source of truth for the\n // operator; the status card behind it picks up dims / lastError\n // on its next 3s poll anyway.\n try {\n const r = await test.mutateAsync()\n if (r.ok) toast.success(t('vector.actions.testOk'))\n else toast.error(t('vector.actions.testFail', { detail: r.error ?? '' }))\n } catch (terr) {\n const { message } = describeError(terr, t)\n toast.error(t('vector.actions.testFail', { detail: message }))\n }\n onSaved?.()\n } catch (serr) {\n const { message } = describeError(serr, t)\n toast.error(message)\n }\n }\n\n function onDiscard(): void {\n setForm(initialRef.current)\n }\n\n const busy = updateEnv.isPending || test.isPending\n const hasExistingKey = !!env.AGIM_MEMORY_VECTOR_OPENAI_API_KEY\n\n return (\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"text-sm font-medium\">{t('vector.form.title')}</h2>\n {dirty && <Badge variant=\"info\">{t('vector.form.dirty')}</Badge>}\n <div className=\"ml-auto flex items-center gap-2\">\n {dirty && (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onDiscard}\n disabled={busy}\n >\n {t('vector.form.discard')}\n </Button>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={!dirty || busy}\n >\n {busy ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Save className=\"h-4 w-4\" />}\n {t('vector.form.saveAndTest')}\n </Button>\n </div>\n </div>\n <p className=\"mt-1 text-xs text-text-dim\">{t('vector.form.hint')}</p>\n\n {envQuery.isLoading ? (\n <div className=\"mt-3 h-32 w-full rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {/* Backend selector — full row on mobile, half on desktop */}\n <Field label={t('vector.form.backend')} help={t('vector.form.backendHelp')}>\n <Select value={form.backend} onValueChange={(v) => selectBackend(v as BackendName)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"off\">{t('vector.form.backendOff')}</SelectItem>\n <SelectItem value=\"local\">{t('vector.form.backendLocal')}</SelectItem>\n <SelectItem value=\"openai\">{t('vector.form.backendOpenai')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n\n {/* Local-only field */}\n {form.backend === 'local' && (\n <Field label={t('vector.form.localModel')} help={t('vector.form.localModelHelp')}>\n <Input\n value={form.localModel}\n placeholder={DEFAULTS.localModel}\n onChange={(e) => set('localModel', e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n )}\n\n {/* OpenAI-only fields */}\n {form.backend === 'openai' && (\n <>\n <Field label={t('vector.form.openaiBaseUrl')} help={t('vector.form.openaiBaseUrlHelp')}>\n <Input\n value={form.openaiBaseUrl}\n placeholder={DEFAULTS.openaiBaseUrl}\n onChange={(e) => set('openaiBaseUrl', e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field label={t('vector.form.openaiModel')} help={t('vector.form.openaiModelHelp')}>\n <Input\n value={form.openaiModel}\n placeholder={DEFAULTS.openaiModel}\n onChange={(e) => set('openaiModel', e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('vector.form.openaiApiKey')}\n help={hasExistingKey ? t('vector.form.apiKeyKeepHint') : t('vector.form.apiKeyNewHint')}\n >\n <div className=\"flex items-center gap-1\">\n <Input\n type={showApiKey ? 'text' : 'password'}\n value={form.openaiApiKey}\n placeholder={hasExistingKey\n ? (env.AGIM_MEMORY_VECTOR_OPENAI_API_KEY || '••••')\n : 'sk-…'}\n onChange={(e) => set('openaiApiKey', e.target.value)}\n className=\"font-mono text-xs\"\n autoComplete=\"off\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setShowApiKey((v) => !v)}\n aria-label={t('vector.form.toggleApiKey')}\n >\n {showApiKey ? <EyeOff className=\"h-4 w-4\" /> : <Eye className=\"h-4 w-4\" />}\n </Button>\n </div>\n </Field>\n </>\n )}\n\n {/* Shared numeric knobs (hidden when off so they don't visually\n suggest the operator can tune anything without picking a\n backend first). */}\n {form.backend !== 'off' && (\n <>\n <Field label={t('vector.form.batchSize')} help={t('vector.form.batchSizeHelp')}>\n <Input\n type=\"number\"\n min={1}\n max={1024}\n step={1}\n value={form.batchSize}\n placeholder={DEFAULTS.batchSize}\n onChange={(e) => set('batchSize', e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field label={t('vector.form.hybridWeight')} help={t('vector.form.hybridWeightHelp')}>\n <Input\n type=\"number\"\n min={0}\n max={1}\n step={0.05}\n value={form.hybridWeight}\n placeholder={DEFAULTS.hybridWeight}\n onChange={(e) => set('hybridWeight', e.target.value)}\n className=\"font-mono text-xs\"\n />\n </Field>\n </>\n )}\n </div>\n )}\n </div>\n )\n}\n\nfunction Field({\n label,\n help,\n children,\n}: {\n label: string\n help?: string\n children: React.ReactNode\n}): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label className=\"text-xs text-text-dim\">{label}</Label>\n {children}\n {help && <p className=\"text-[11px] text-text-muted\">{help}</p>}\n </div>\n )\n}\n","/**\n * /memory/vector — backend status + maintenance actions.\n *\n * Status (left): backend name + ready badge + model + dims + last\n * error. Coverage (right): three KPI tiles (total / embedded /\n * mismatched). Actions (bottom): test, download, backfill, clear\n * (destructive — ConfirmDialog). Recent-job strip pulls from the\n * shared in-memory tracker via the status endpoint.\n *\n * The clear action picks up the ?user= filter from the layout, so\n * clearing scoped to a single user is a one-click operation.\n */\n\nimport { useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { CheckCircle, Download, Loader2, Play, RefreshCcw, Trash2, XCircle } from 'lucide-react'\n\nimport { VectorBackendForm } from './vector-backend-form'\n\nimport { ConfirmDialog } from '@/components/common/confirm-dialog'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n useVectorStatus,\n useTriggerVectorBackfill,\n useTriggerVectorClear,\n useTriggerVectorDownload,\n useTriggerVectorTest,\n} from '@/hooks/use-vector'\nimport { describeError } from '@/lib/api/errors'\nimport type { VectorJob } from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nexport default function MemoryVectorRoute(): JSX.Element {\n const { t } = useTranslation(['memory', 'common'])\n const [params] = useSearchParams()\n const userKey = params.get('user') ?? ''\n\n const statusQuery = useVectorStatus(userKey ? { user_key: userKey } : {})\n const status = statusQuery.data?.status\n const coverage = statusQuery.data?.coverage\n const jobs = statusQuery.data?.jobs ?? []\n\n const test = useTriggerVectorTest()\n const download = useTriggerVectorDownload()\n const backfill = useTriggerVectorBackfill()\n const clear = useTriggerVectorClear()\n const [confirmClear, setConfirmClear] = useState(false)\n\n async function onTest(): Promise<void> {\n try {\n const r = await test.mutateAsync()\n if (r.ok) toast.success(t('vector.actions.testOk'))\n else toast.error(t('vector.actions.testFail', { detail: r.error ?? '' }))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n }\n }\n\n async function onDownload(): Promise<void> {\n try {\n const r = await download.mutateAsync()\n toast.success(r.alreadyReady ? t('vector.actions.downloadAlreadyReady') : t('vector.actions.downloadStarted'))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n }\n }\n\n async function onBackfill(): Promise<void> {\n try {\n await backfill.mutateAsync(userKey ? { user_key: userKey } : undefined)\n toast.success(t('vector.actions.backfillStarted'))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n }\n }\n\n async function onConfirmClear(): Promise<void> {\n try {\n const r = await clear.mutateAsync(userKey ? { user_key: userKey } : undefined)\n toast.success(t('vector.actions.clearStarted', { count: r.cleared }))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n throw err\n }\n }\n\n if (statusQuery.isLoading) {\n return <div className=\"h-48 w-full rounded-md bg-surface-2 animate-pulse\" />\n }\n if (!status) {\n return (\n <EmptyState\n icon={<XCircle />}\n title={t('common:states.error')}\n description={statusQuery.error?.message ?? ''}\n />\n )\n }\n\n const coverageScope = userKey\n ? t('vector.coverage.scope_user', { userKey })\n : t('vector.coverage.scope_global')\n\n return (\n <div className=\"mx-auto flex max-w-5xl 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('vector.title')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => statusQuery.refetch()}\n disabled={statusQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {statusQuery.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('vector.subtitle')}</p>\n </header>\n\n {/* Backend configuration — inline form replaces the older\n \"Edit in env\" link. Saving runs PUT /api/env + an auto\n vector test against the freshly applied config. */}\n <VectorBackendForm onSaved={() => void statusQuery.refetch()} />\n\n {/* Status + Coverage */}\n <div className=\"grid gap-3 md:grid-cols-2\">\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n <span className=\"font-medium\">{t('vector.backendLabel')}</span>\n <Badge variant=\"secondary\">{status.backend}</Badge>\n <Badge variant={status.ready ? 'success' : 'warning'}>\n {status.ready ? t('vector.readyTrue') : t('vector.readyFalse')}\n </Badge>\n {status.downloaded && <Badge variant=\"info\">{t('vector.downloadedTrue')}</Badge>}\n </div>\n <dl className=\"mt-3 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-sm\">\n <dt className=\"text-text-dim\">{t('vector.modelLabel')}</dt>\n <dd className=\"font-mono text-text\">{status.modelId || '—'}</dd>\n <dt className=\"text-text-dim\">{t('vector.dimsLabel')}</dt>\n <dd className=\"tabular-nums text-text\">{status.dims || '—'}</dd>\n {status.lastError && (\n <>\n <dt className=\"text-text-dim\">{t('vector.lastError')}</dt>\n <dd className=\"text-danger text-xs break-all\">{status.lastError}</dd>\n </>\n )}\n </dl>\n </div>\n\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"text-sm font-medium\">{t('vector.coverage.title')}</div>\n <div className=\"mt-1 text-xs text-text-dim\">{coverageScope}</div>\n <div className=\"mt-3 grid grid-cols-3 gap-2\">\n <CoverageTile label={t('vector.coverage.total')} value={coverage?.total ?? 0} tone=\"info\" />\n <CoverageTile label={t('vector.coverage.withEmbedding')} value={coverage?.withEmbedding ?? 0} tone=\"success\" />\n <CoverageTile label={t('vector.coverage.withDifferentModel')} value={coverage?.withDifferentModel ?? 0} tone=\"warning\" />\n </div>\n </div>\n </div>\n\n {/* Maintenance actions */}\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"text-sm font-medium\">{t('vector.actions.title')}</div>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => void onTest()}\n disabled={test.isPending}\n >\n {test.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Play className=\"h-4 w-4\" />}\n {t('vector.actions.test')}\n </Button>\n {status.backend === 'local' && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => void onDownload()}\n disabled={download.isPending}\n >\n {download.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Download className=\"h-4 w-4\" />}\n {t('vector.actions.download')}\n </Button>\n )}\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => void onBackfill()}\n disabled={backfill.isPending || !status.ready}\n >\n {backfill.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Play className=\"h-4 w-4\" />}\n {t('vector.actions.backfill')}\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => setConfirmClear(true)}\n disabled={clear.isPending}\n >\n <Trash2 className=\"h-4 w-4\" />\n {t('vector.actions.clear')}\n </Button>\n </div>\n </div>\n\n {/* Jobs strip */}\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"text-sm font-medium\">{t('vector.jobs.title')}</div>\n {jobs.length === 0 ? (\n <div className=\"mt-2 text-sm text-text-muted\">{t('vector.jobs.empty')}</div>\n ) : (\n <ul className=\"mt-2 flex flex-col gap-1.5 text-sm\">\n {jobs.map((j) => <li key={j.id}><JobRow job={j} /></li>)}\n </ul>\n )}\n </div>\n\n <ConfirmDialog\n open={confirmClear}\n onOpenChange={setConfirmClear}\n title={t('vector.actions.confirmClear')}\n description={t('vector.actions.confirmClearDesc', { scope: coverageScope })}\n intent=\"danger\"\n confirmLabel={t('vector.actions.clear')}\n onConfirm={onConfirmClear}\n />\n </div>\n )\n}\n\ninterface CoverageTileProps {\n label: string\n value: number\n tone: 'info' | 'success' | 'warning' | 'danger'\n}\n\nconst TONE_STYLES: Record<CoverageTileProps['tone'], string> = {\n info: 'border-info/30 text-info',\n success: 'border-success/30 text-success',\n warning: 'border-warning/30 text-warning',\n danger: 'border-danger/30 text-danger',\n}\n\nfunction CoverageTile({ label, value, tone }: CoverageTileProps): JSX.Element {\n return (\n <div className={cn('rounded-md border bg-bg px-2 py-2', TONE_STYLES[tone])}>\n <div className=\"text-[10px] uppercase tracking-wide text-text-dim\">{label}</div>\n <div className=\"text-xl font-semibold tabular-nums\">{value}</div>\n </div>\n )\n}\n\nfunction JobRow({ job }: { job: VectorJob }): JSX.Element {\n const { t } = useTranslation('memory')\n const phaseClass =\n job.phase === 'done' ? 'text-success' :\n job.phase === 'failed' ? 'text-danger' :\n 'text-info'\n return (\n <div className=\"flex flex-wrap items-center gap-2 text-xs\">\n <Badge variant=\"outline\">{job.kind}</Badge>\n <span className={cn('font-medium', phaseClass)}>\n {job.phase === 'running' && <Loader2 className=\"inline h-3 w-3 animate-spin\" />}\n {job.phase === 'done' && <CheckCircle className=\"inline h-3 w-3\" />}\n {job.phase === 'failed' && <XCircle className=\"inline h-3 w-3\" />}\n {' '}\n {t(`vector.jobs.phase.${job.phase}`)}\n </span>\n <span className=\"text-text-dim\">{job.message}</span>\n <span className=\"ml-auto text-text-muted tabular-nums\">{formatEpoch(job.finishedAt ?? job.startedAt)}</span>\n </div>\n )\n}\n\nfunction formatEpoch(ms: number): string {\n try {\n const d = new Date(ms)\n if (Number.isNaN(d.getTime())) return String(ms)\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return String(ms)\n }\n}\n"],"names":["vectorKeys","user_key","useVectorStatus","query","useQuery","api","invalidateAfter","qc","memoryKeys","useTriggerVectorBackfill","useQueryClient","invalidate","useMutation","vars","useTriggerVectorDownload","useTriggerVectorClear","useTriggerVectorTest","DEFAULTS","readFormFromEnv","env","raw","VectorBackendForm","onSaved","t","useTranslation","envQuery","useEnv","useMemo","form","setForm","useState","showApiKey","setShowApiKey","initialRef","useRef","useEffect","next","updateEnv","useUpdateEnv","test","dirty","initial","k","set","v","prev","selectBackend","out","validate","n","buildUpdates","diff","key","current","onSave","err","toast","updates","r","terr","message","describeError","serr","onDiscard","busy","hasExistingKey","jsxs","jsx","Badge","Button","Loader2","Save","Field","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","e","Fragment","EyeOff","Eye","label","help","children","Label","MemoryVectorRoute","params","useSearchParams","userKey","statusQuery","status","coverage","jobs","download","backfill","clear","confirmClear","setConfirmClear","onTest","onDownload","onBackfill","onConfirmClear","EmptyState","XCircle","coverageScope","RefreshCcw","CoverageTile","Play","Download","Trash2","j","JobRow","ConfirmDialog","TONE_STYLES","value","tone","cn","job","phaseClass","CheckCircle","formatEpoch","ms","d"],"mappings":"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"}
|