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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-5q3dkINm.js","sources":["../../node_modules/lucide-react/dist/esm/icons/flask-conical.js","../../node_modules/lucide-react/dist/esm/icons/globe.js","../../node_modules/lucide-react/dist/esm/icons/key.js","../../src/routes/settings/search.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 FlaskConical = createLucideIcon(\"FlaskConical\", [\n [\n \"path\",\n {\n d: \"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2\",\n key: \"18mbvz\"\n }\n ],\n [\"path\", { d: \"M6.453 15h11.094\", key: \"3shlmq\" }],\n [\"path\", { d: \"M8.5 2h7\", key: \"csnxdl\" }]\n]);\n\nexport { FlaskConical as default };\n//# sourceMappingURL=flask-conical.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 Globe = createLucideIcon(\"Globe\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n]);\n\nexport { Globe as default };\n//# sourceMappingURL=globe.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 Key = createLucideIcon(\"Key\", [\n [\"path\", { d: \"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4\", key: \"g0fldk\" }],\n [\"path\", { d: \"m21 2-9.6 9.6\", key: \"1j0ho8\" }],\n [\"circle\", { cx: \"7.5\", cy: \"15.5\", r: \"5.5\", key: \"yqb3hr\" }]\n]);\n\nexport { Key as default };\n//# sourceMappingURL=key.js.map\n","/**\n * /settings/search — web_search provider config (v1.2.126).\n *\n * One row per registered provider (Tavily / Brave / Serper / Exa /\n * DuckDuckGo / Metaso): API-key input (masked-by-default), enable\n * toggle (= \"is this name in the chain?\"), reorder via up / down,\n * one-shot test button. The chain preview at the top shows what\n * AGIM_WEB_SEARCH_PROVIDERS resolves to right now.\n *\n * Persistence: API keys go via PUT /api/env (which masks GET +\n * refuses echoed masks on PUT); the chain order is a single CSV\n * env key — same endpoint. Save is one round-trip per dirty key.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n ArrowDown, ArrowUp, CheckCircle2, FlaskConical, Globe, Key,\n Loader2, RefreshCcw, Save, X, XCircle,\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 useEnv,\n useSearchProviders,\n useTestSearchProvider,\n useUpdateEnv,\n} from '@/hooks/use-settings'\nimport type { SearchProviderInfo } from '@/types/api'\n\ninterface ChainEntry {\n name: string\n enabled: boolean\n}\n\ninterface Draft {\n /** Provider chain — every known provider, with `enabled`\n * reflecting \"is name in the CSV\". Order is the row order. */\n chain: ChainEntry[]\n /** Each provider's API-key input. Keyed by envKey (e.g.\n * TAVILY_API_KEY). Holds either '' (clear) or the new plaintext\n * the operator typed. We never load values back from the server. */\n keys: Record<string, string>\n /** Tracks which key fields the operator actually touched — so\n * Save only sends the diff and untouched masked keys are left\n * alone. */\n keysTouched: Record<string, boolean>\n}\n\nfunction envChainOrder(envValue: string | undefined, providers: SearchProviderInfo[]): ChainEntry[] {\n // Parse the CSV chain; preserve operator order; tail-append any\n // provider not in the CSV as disabled so they remain renderable.\n const raw = (envValue ?? '').split(',').map((s) => s.trim()).filter(Boolean)\n const known = new Set(providers.map((p) => p.name))\n const seen = new Set<string>()\n const out: ChainEntry[] = []\n for (const name of raw) {\n if (!known.has(name) || seen.has(name)) continue\n out.push({ name, enabled: true })\n seen.add(name)\n }\n for (const p of providers) {\n if (seen.has(p.name)) continue\n out.push({ name: p.name, enabled: false })\n }\n return out\n}\n\nfunction chainToCsv(chain: ChainEntry[]): string {\n return chain.filter((c) => c.enabled).map((c) => c.name).join(',')\n}\n\nexport default function SettingsSearchRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const envQuery = useEnv({ reveal: false })\n const providersQuery = useSearchProviders()\n const updateEnv = useUpdateEnv()\n const testProvider = useTestSearchProvider()\n\n const envData = envQuery.data?.env ?? {}\n const providers = providersQuery.data?.providers ?? []\n const live = providersQuery.data?.chain ?? []\n\n const initial = useMemo<Draft>(\n () => ({\n chain: envChainOrder(envData.AGIM_WEB_SEARCH_PROVIDERS, providers),\n keys: {},\n keysTouched: {},\n }),\n [envData.AGIM_WEB_SEARCH_PROVIDERS, providers],\n )\n\n const [draft, setDraft] = useState<Draft>(initial)\n const [syncedHash, setSyncedHash] = useState('')\n\n useEffect(() => {\n const hash = JSON.stringify(initial)\n if (hash !== syncedHash) {\n setDraft(initial)\n setSyncedHash(hash)\n }\n }, [initial, syncedHash])\n\n const isDirty =\n JSON.stringify(draft.chain) !== JSON.stringify(initial.chain) ||\n Object.keys(draft.keysTouched).length > 0\n\n function moveRow(idx: number, delta: -1 | 1): void {\n setDraft((d) => {\n const next = [...d.chain]\n const swap = idx + delta\n if (swap < 0 || swap >= next.length) return d\n const a = next[idx]\n const b = next[swap]\n if (!a || !b) return d\n next[idx] = b\n next[swap] = a\n return { ...d, chain: next }\n })\n }\n\n function toggleRow(idx: number, enabled: boolean): void {\n setDraft((d) => {\n const next = [...d.chain]\n const row = next[idx]\n if (!row) return d\n next[idx] = { ...row, enabled }\n return { ...d, chain: next }\n })\n }\n\n function setKey(envKey: string, value: string): void {\n setDraft((d) => ({\n ...d,\n keys: { ...d.keys, [envKey]: value },\n keysTouched: { ...d.keysTouched, [envKey]: true },\n }))\n }\n\n function clearKey(envKey: string): void {\n setDraft((d) => ({\n ...d,\n keys: { ...d.keys, [envKey]: '' },\n keysTouched: { ...d.keysTouched, [envKey]: true },\n }))\n }\n\n async function onSave(): Promise<void> {\n const updates: Record<string, string | null> = {}\n const nextCsv = chainToCsv(draft.chain)\n const initialCsv = chainToCsv(initial.chain)\n if (nextCsv !== initialCsv) {\n updates.AGIM_WEB_SEARCH_PROVIDERS = nextCsv || null\n }\n for (const [envKey, touched] of Object.entries(draft.keysTouched)) {\n if (!touched) continue\n const v = draft.keys[envKey] ?? ''\n updates[envKey] = v.trim() === '' ? null : v\n }\n if (Object.keys(updates).length === 0) return\n try {\n await updateEnv.mutateAsync({ updates })\n // Refetch both — env keys changed availability, chain order changed.\n void providersQuery.refetch()\n toast.success(t('search.savedToast'))\n setDraft((d) => ({ ...d, keys: {}, keysTouched: {} }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n function onDiscard(): void {\n setDraft(initial)\n }\n\n async function onTest(provider: string): Promise<void> {\n try {\n const result = await testProvider.mutateAsync({\n provider,\n // Short, harmless probe — the dispatcher only needs to\n // verify the upstream auth + transport.\n query: 'agim ping',\n })\n if (result.ok) {\n toast.success(\n t('search.testOk', { provider, hits: result.hits, ms: result.latencyMs }),\n )\n } else {\n toast.error(\n t('search.testFail', { provider, error: result.error ?? 'unknown error' }),\n )\n }\n } catch (err) {\n toast.error((err as Error)?.message ?? String(err))\n }\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-6\">\n <header className=\"flex items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('search.title')}</h1>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => {\n void envQuery.refetch()\n void providersQuery.refetch()\n }}\n disabled={envQuery.isFetching || providersQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {envQuery.isFetching || providersQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('search.refresh')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('search.subtitle')}</p>\n\n <ChainPreview live={live} />\n\n {envQuery.isLoading || providersQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <section className=\"flex flex-col gap-2\">\n {draft.chain.map((entry, idx) => {\n const info = providers.find((p) => p.name === entry.name)\n return (\n <ProviderRow\n key={entry.name}\n info={info}\n entry={entry}\n idx={idx}\n count={draft.chain.length}\n keyValue={info?.envKey ? draft.keys[info.envKey] : undefined}\n keyTouched={info?.envKey ? !!draft.keysTouched[info.envKey] : false}\n onMove={(d) => moveRow(idx, d)}\n onToggle={(v) => toggleRow(idx, v)}\n onSetKey={(v) => info?.envKey && setKey(info.envKey, v)}\n onClearKey={() => info?.envKey && clearKey(info.envKey)}\n onTest={() => onTest(entry.name)}\n testing={testProvider.isPending}\n />\n )\n })}\n </section>\n )}\n\n {isDirty && (\n <div className=\"sticky bottom-2 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-3 shadow\">\n <Badge variant=\"info\">{t('search.unsaved')}</Badge>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={onDiscard}\n disabled={updateEnv.isPending}\n >\n <X className=\"h-4 w-4\" /> {t('search.discard')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateEnv.isPending}\n >\n {updateEnv.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Save className=\"h-4 w-4\" />}\n {t('search.save')}\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nfunction ChainPreview({ live }: { live: string[] }): JSX.Element {\n const { t } = useTranslation('settings')\n return (\n <section className=\"rounded-md border border-border bg-surface px-4 py-3\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Globe className=\"h-4 w-4 text-text-dim\" />\n <span className=\"text-text-dim\">{t('search.chainLabel')}</span>\n {live.length === 0 ? (\n <Badge variant=\"outline\">{t('search.chainEmpty')}</Badge>\n ) : (\n <span className=\"font-mono text-xs\">{live.join(' → ')}</span>\n )}\n </div>\n <p className=\"mt-1 text-[11px] text-text-dim\">{t('search.chainHint')}</p>\n </section>\n )\n}\n\ninterface ProviderRowProps {\n info: SearchProviderInfo | undefined\n entry: ChainEntry\n idx: number\n count: number\n keyValue: string | undefined\n keyTouched: boolean\n onMove: (delta: -1 | 1) => void\n onToggle: (v: boolean) => void\n onSetKey: (v: string) => void\n onClearKey: () => void\n onTest: () => void\n testing: boolean\n}\n\nfunction ProviderRow(props: ProviderRowProps): JSX.Element {\n const { t } = useTranslation('settings')\n const { info, entry, idx, count, keyValue, keyTouched, onMove, onToggle,\n onSetKey, onClearKey, onTest, testing } = props\n const needsKey = !!info?.envKey\n const available = !!info?.available || (keyTouched && !!keyValue)\n return (\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n className=\"h-5 w-5 rounded text-text-dim hover:bg-surface-hover disabled:opacity-30\"\n onClick={() => onMove(-1)}\n disabled={idx === 0}\n aria-label={t('search.moveUp')}\n >\n <ArrowUp className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n className=\"h-5 w-5 rounded text-text-dim hover:bg-surface-hover disabled:opacity-30\"\n onClick={() => onMove(1)}\n disabled={idx === count - 1}\n aria-label={t('search.moveDown')}\n >\n <ArrowDown className=\"h-4 w-4\" />\n </button>\n </div>\n\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={entry.enabled}\n onChange={(e) => onToggle(e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span className=\"font-mono text-sm\">{entry.name}</span>\n </label>\n\n {!needsKey ? (\n <Badge variant=\"outline\">{t('search.noKey')}</Badge>\n ) : available ? (\n <Badge variant=\"success\">\n <CheckCircle2 className=\"mr-1 h-3 w-3\" /> {t('search.configured')}\n </Badge>\n ) : (\n <Badge variant=\"warning\">\n <XCircle className=\"mr-1 h-3 w-3\" /> {t('search.missingKey')}\n </Badge>\n )}\n\n <div className=\"ml-auto flex items-center gap-1\">\n <Button\n size=\"sm\" variant=\"ghost\"\n onClick={onTest}\n disabled={testing || !entry.enabled}\n aria-label={t('search.testBtn')}\n >\n {testing\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <FlaskConical className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('search.testBtn')}</span>\n </Button>\n </div>\n </div>\n\n {needsKey && (\n <div className=\"mt-3 flex flex-col gap-1\">\n <Label className=\"text-xs font-medium\">\n <Key className=\"mr-1 inline h-3 w-3\" />\n {info?.envKey}\n </Label>\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"password\"\n value={keyValue ?? ''}\n onChange={(e) => onSetKey(e.target.value)}\n placeholder={\n info?.available && !keyTouched\n ? t('search.placeholderConfigured')\n : t('search.placeholderEnter')\n }\n className=\"font-mono text-xs\"\n />\n {info?.available && !keyTouched && (\n <Button\n size=\"sm\" variant=\"ghost\"\n onClick={onClearKey}\n aria-label={t('search.clearKey')}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n <p className=\"text-[11px] text-text-dim\">\n {t('search.keyHint', { envKey: info?.envKey })}\n </p>\n </div>\n )}\n </div>\n )\n}\n"],"names":["FlaskConical","createLucideIcon","Globe","Key","envChainOrder","envValue","providers","raw","s","known","p","seen","out","name","chainToCsv","chain","c","SettingsSearchRoute","t","useTranslation","envQuery","useEnv","providersQuery","useSearchProviders","updateEnv","useUpdateEnv","testProvider","useTestSearchProvider","envData","live","initial","useMemo","draft","setDraft","useState","syncedHash","setSyncedHash","useEffect","hash","isDirty","moveRow","idx","delta","d","next","swap","a","b","toggleRow","enabled","row","setKey","envKey","value","clearKey","onSave","updates","nextCsv","initialCsv","touched","toast","err","onDiscard","onTest","provider","result","jsxs","jsx","Button","Loader2","RefreshCcw","ChainPreview","entry","info","ProviderRow","v","Badge","X","Save","props","count","keyValue","keyTouched","onMove","onToggle","onSetKey","onClearKey","testing","needsKey","available","ArrowUp","ArrowDown","e","CheckCircle2","XCircle","Label","Input"],"mappings":"8fAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAeC,EAAiB,eAAgB,CACpD,CACE,OACA,CACE,EAAG,0GACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,mBAAoB,IAAK,QAAQ,CAAE,EACjD,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC,ECnBD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMC,EAAQD,EAAiB,QAAS,CACtC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,kDAAmD,IAAK,QAAQ,CAAE,EAChF,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC,ECbD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAME,EAAMF,EAAiB,MAAO,CAClC,CAAC,OAAQ,CAAE,EAAG,iEAAkE,IAAK,QAAQ,CAAE,EAC/F,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,EAC9C,CAAC,SAAU,CAAE,GAAI,MAAO,GAAI,OAAQ,EAAG,MAAO,IAAK,QAAQ,CAAE,CAC/D,CAAC,ECwCD,SAASG,EAAcC,EAA8BC,EAA+C,CAGlG,MAAMC,GAAOF,GAAY,IAAI,MAAM,GAAG,EAAE,IAAKG,GAAMA,EAAE,KAAA,CAAM,EAAE,OAAO,OAAO,EACrEC,EAAQ,IAAI,IAAIH,EAAU,IAAKI,GAAMA,EAAE,IAAI,CAAC,EAC5CC,MAAW,IACXC,EAAoB,CAAA,EAC1B,UAAWC,KAAQN,EACb,CAACE,EAAM,IAAII,CAAI,GAAKF,EAAK,IAAIE,CAAI,IACrCD,EAAI,KAAK,CAAE,KAAAC,EAAM,QAAS,GAAM,EAChCF,EAAK,IAAIE,CAAI,GAEf,UAAWH,KAAKJ,EACVK,EAAK,IAAID,EAAE,IAAI,GACnBE,EAAI,KAAK,CAAE,KAAMF,EAAE,KAAM,QAAS,GAAO,EAE3C,OAAOE,CACT,CAEA,SAASE,EAAWC,EAA6B,CAC/C,OAAOA,EAAM,OAAQC,GAAMA,EAAE,OAAO,EAAE,IAAKA,GAAMA,EAAE,IAAI,EAAE,KAAK,GAAG,CACnE,CAEA,SAAwBC,IAAmC,CACzD,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAe,CAAC,WAAY,QAAQ,CAAC,EAC7CC,EAAWC,EAAO,CAAE,OAAQ,GAAO,EACnCC,EAAiBC,EAAA,EACjBC,EAAYC,EAAA,EACZC,EAAeC,EAAA,EAEfC,EAAUR,EAAS,MAAM,KAAO,CAAA,EAChCd,EAAYgB,EAAe,MAAM,WAAa,CAAA,EAC9CO,EAAOP,EAAe,MAAM,OAAS,CAAA,EAErCQ,EAAUC,EAAAA,QACd,KAAO,CACL,MAAO3B,EAAcwB,EAAQ,0BAA2BtB,CAAS,EACjE,KAAM,CAAA,EACN,YAAa,CAAA,CAAC,GAEhB,CAACsB,EAAQ,0BAA2BtB,CAAS,CAAA,EAGzC,CAAC0B,EAAOC,CAAQ,EAAIC,EAAAA,SAAgBJ,CAAO,EAC3C,CAACK,EAAYC,CAAa,EAAIF,EAAAA,SAAS,EAAE,EAE/CG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAO,KAAK,UAAUR,CAAO,EAC/BQ,IAASH,IACXF,EAASH,CAAO,EAChBM,EAAcE,CAAI,EAEtB,EAAG,CAACR,EAASK,CAAU,CAAC,EAExB,MAAMI,EACJ,KAAK,UAAUP,EAAM,KAAK,IAAM,KAAK,UAAUF,EAAQ,KAAK,GAC5D,OAAO,KAAKE,EAAM,WAAW,EAAE,OAAS,EAE1C,SAASQ,EAAQC,EAAaC,EAAqB,CACjDT,EAAUU,GAAM,CACd,MAAMC,EAAO,CAAC,GAAGD,EAAE,KAAK,EAClBE,EAAOJ,EAAMC,EACnB,GAAIG,EAAO,GAAKA,GAAQD,EAAK,OAAQ,OAAOD,EAC5C,MAAMG,EAAIF,EAAKH,CAAG,EACZM,EAAIH,EAAKC,CAAI,EACnB,MAAI,CAACC,GAAK,CAACC,EAAUJ,GACrBC,EAAKH,CAAG,EAAIM,EACZH,EAAKC,CAAI,EAAIC,EACN,CAAE,GAAGH,EAAG,MAAOC,CAAA,EACxB,CAAC,CACH,CAEA,SAASI,EAAUP,EAAaQ,EAAwB,CACtDhB,EAAUU,GAAM,CACd,MAAMC,EAAO,CAAC,GAAGD,EAAE,KAAK,EAClBO,EAAMN,EAAKH,CAAG,EACpB,OAAKS,GACLN,EAAKH,CAAG,EAAI,CAAE,GAAGS,EAAK,QAAAD,CAAA,EACf,CAAE,GAAGN,EAAG,MAAOC,CAAA,GAFLD,CAGnB,CAAC,CACH,CAEA,SAASQ,EAAOC,EAAgBC,EAAqB,CACnDpB,EAAUU,IAAO,CACf,GAAGA,EACH,KAAM,CAAE,GAAGA,EAAE,KAAM,CAACS,CAAM,EAAGC,CAAA,EAC7B,YAAa,CAAE,GAAGV,EAAE,YAAa,CAACS,CAAM,EAAG,EAAA,CAAK,EAChD,CACJ,CAEA,SAASE,EAASF,EAAsB,CACtCnB,EAAUU,IAAO,CACf,GAAGA,EACH,KAAM,CAAE,GAAGA,EAAE,KAAM,CAACS,CAAM,EAAG,EAAA,EAC7B,YAAa,CAAE,GAAGT,EAAE,YAAa,CAACS,CAAM,EAAG,EAAA,CAAK,EAChD,CACJ,CAEA,eAAeG,GAAwB,CACrC,MAAMC,EAAyC,CAAA,EACzCC,EAAU3C,EAAWkB,EAAM,KAAK,EAChC0B,EAAa5C,EAAWgB,EAAQ,KAAK,EACvC2B,IAAYC,IACdF,EAAQ,0BAA4BC,GAAW,MAEjD,SAAW,CAACL,EAAQO,CAAO,IAAK,OAAO,QAAQ3B,EAAM,WAAW,EAAG,CACjE,GAAI,CAAC2B,EAAS,SACd,MAAM,EAAI3B,EAAM,KAAKoB,CAAM,GAAK,GAChCI,EAAQJ,CAAM,EAAI,EAAE,KAAA,IAAW,GAAK,KAAO,CAC7C,CACA,GAAI,OAAO,KAAKI,CAAO,EAAE,SAAW,EACpC,GAAI,CACF,MAAMhC,EAAU,YAAY,CAAE,QAAAgC,EAAS,EAElClC,EAAe,QAAA,EACpBsC,EAAM,QAAQ1C,EAAE,mBAAmB,CAAC,EACpCe,EAAUU,IAAO,CAAE,GAAGA,EAAG,KAAM,GAAI,YAAa,CAAA,CAAC,EAAI,CACvD,OAASkB,EAAK,CACZD,EAAM,MAAQC,GAAe,SAAW,OAAOA,CAAG,CAAE,CACtD,CACF,CAEA,SAASC,GAAkB,CACzB7B,EAASH,CAAO,CAClB,CAEA,eAAeiC,EAAOC,EAAiC,CACrD,GAAI,CACF,MAAMC,EAAS,MAAMvC,EAAa,YAAY,CAC5C,SAAAsC,EAGA,MAAO,WAAA,CACR,EACGC,EAAO,GACTL,EAAM,QACJ1C,EAAE,gBAAiB,CAAE,SAAA8C,EAAU,KAAMC,EAAO,KAAM,GAAIA,EAAO,SAAA,CAAW,CAAA,EAG1EL,EAAM,MACJ1C,EAAE,kBAAmB,CAAE,SAAA8C,EAAU,MAAOC,EAAO,OAAS,gBAAiB,CAAA,CAG/E,OAASJ,EAAK,CACZD,EAAM,MAAOC,GAAe,SAAW,OAAOA,CAAG,CAAC,CACpD,CACF,CAEA,OACEK,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,0BAChB,SAAA,CAAAC,MAAC,KAAA,CAAG,UAAU,wBAAyB,SAAAjD,EAAE,cAAc,EAAE,EACzDgD,EAAAA,KAACE,EAAA,CACC,QAAQ,QAAQ,KAAK,KAAK,UAAU,UACpC,QAAS,IAAM,CACRhD,EAAS,QAAA,EACTE,EAAe,QAAA,CACtB,EACA,SAAUF,EAAS,YAAcE,EAAe,WAChD,aAAYJ,EAAE,kBAAmB,CAAE,GAAI,SAAU,EAEhD,SAAA,CAAAE,EAAS,YAAcE,EAAe,WACnC6C,EAAAA,IAACE,EAAA,CAAQ,UAAU,sBAAA,CAAuB,EAC1CF,EAAAA,IAACG,EAAA,CAAW,UAAU,SAAA,CAAU,QACnC,OAAA,CAAK,UAAU,mBAAoB,SAAApD,EAAE,gBAAgB,CAAA,CAAE,CAAA,CAAA,CAAA,CAC1D,EACF,QACC,IAAA,CAAE,UAAU,wBAAyB,SAAAA,EAAE,iBAAiB,EAAE,EAE3DiD,MAACI,IAAa,KAAA1C,EAAY,EAEzBT,EAAS,WAAaE,EAAe,UACpC6C,EAAAA,IAAC,MAAA,CAAI,UAAU,4CAAA,CAA6C,EAE5DA,EAAAA,IAAC,UAAA,CAAQ,UAAU,sBAChB,SAAAnC,EAAM,MAAM,IAAI,CAACwC,EAAO/B,IAAQ,CAC/B,MAAMgC,EAAOnE,EAAU,KAAMI,GAAMA,EAAE,OAAS8D,EAAM,IAAI,EACxD,OACEL,EAAAA,IAACO,GAAA,CAEC,KAAAD,EACA,MAAAD,EACA,IAAA/B,EACA,MAAOT,EAAM,MAAM,OACnB,SAAUyC,GAAM,OAASzC,EAAM,KAAKyC,EAAK,MAAM,EAAI,OACnD,WAAYA,GAAM,OAAS,CAAC,CAACzC,EAAM,YAAYyC,EAAK,MAAM,EAAI,GAC9D,OAAS9B,GAAMH,EAAQC,EAAKE,CAAC,EAC7B,SAAWgC,GAAM3B,EAAUP,EAAKkC,CAAC,EACjC,SAAWA,GAAMF,GAAM,QAAUtB,EAAOsB,EAAK,OAAQE,CAAC,EACtD,WAAY,IAAMF,GAAM,QAAUnB,EAASmB,EAAK,MAAM,EACtD,OAAQ,IAAMV,EAAOS,EAAM,IAAI,EAC/B,QAAS9C,EAAa,SAAA,EAZjB8C,EAAM,IAAA,CAejB,CAAC,CAAA,CACH,EAGDjC,GACC2B,EAAAA,KAAC,MAAA,CAAI,UAAU,sGACb,SAAA,CAAAC,MAACS,EAAA,CAAM,QAAQ,OAAQ,SAAA1D,EAAE,gBAAgB,EAAE,EAC3CgD,EAAAA,KAACE,EAAA,CACC,QAAQ,QAAQ,KAAK,KAAK,UAAU,UACpC,QAASN,EACT,SAAUtC,EAAU,UAEpB,SAAA,CAAA2C,EAAAA,IAACU,EAAA,CAAE,UAAU,SAAA,CAAU,EAAE,IAAE3D,EAAE,gBAAgB,CAAA,CAAA,CAAA,EAE/CgD,EAAAA,KAACE,EAAA,CACC,KAAK,KACL,QAAS,IAAM,KAAKb,EAAA,EACpB,SAAU/B,EAAU,UAEnB,SAAA,CAAAA,EAAU,gBACN6C,EAAA,CAAQ,UAAU,uBAAuB,EAC1CF,EAAAA,IAACW,EAAA,CAAK,UAAU,SAAA,CAAU,EAC7B5D,EAAE,aAAa,CAAA,CAAA,CAAA,CAClB,CAAA,CACF,CAAA,EAEJ,CAEJ,CAEA,SAASqD,GAAa,CAAE,KAAA1C,GAAyC,CAC/D,KAAM,CAAE,EAAAX,CAAA,EAAMC,EAAe,UAAU,EACvC,OACE+C,EAAAA,KAAC,UAAA,CAAQ,UAAU,uDACjB,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAAC,EAAAA,IAACjE,EAAA,CAAM,UAAU,uBAAA,CAAwB,QACxC,OAAA,CAAK,UAAU,gBAAiB,SAAAgB,EAAE,mBAAmB,EAAE,EACvDW,EAAK,SAAW,QACd+C,EAAA,CAAM,QAAQ,UAAW,SAAA1D,EAAE,mBAAmB,CAAA,CAAE,QAEhD,OAAA,CAAK,UAAU,oBAAqB,SAAAW,EAAK,KAAK,KAAK,CAAA,CAAE,CAAA,EAE1D,QACC,IAAA,CAAE,UAAU,iCAAkC,SAAAX,EAAE,kBAAkB,CAAA,CAAE,CAAA,EACvE,CAEJ,CAiBA,SAASwD,GAAYK,EAAsC,CACzD,KAAM,CAAE,EAAA7D,CAAA,EAAMC,EAAe,UAAU,EACjC,CAAE,KAAAsD,EAAM,MAAAD,EAAO,IAAA/B,EAAK,MAAAuC,EAAO,SAAAC,EAAU,WAAAC,EAAY,OAAAC,EAAQ,SAAAC,EAC7D,SAAAC,EAAU,WAAAC,EAAY,OAAAvB,EAAQ,QAAAwB,CAAA,EAAYR,EACtCS,EAAW,CAAC,CAACf,GAAM,OACnBgB,EAAY,CAAC,CAAChB,GAAM,WAAcS,GAAc,CAAC,CAACD,EACxD,OACEf,EAAAA,KAAC,MAAA,CAAI,UAAU,iDACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,gBACb,SAAA,CAAAC,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,2EACV,QAAS,IAAMgB,EAAO,EAAE,EACxB,SAAU1C,IAAQ,EAClB,aAAYvB,EAAE,eAAe,EAE7B,SAAAiD,EAAAA,IAACuB,EAAA,CAAQ,UAAU,SAAA,CAAU,CAAA,CAAA,EAE/BvB,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,2EACV,QAAS,IAAMgB,EAAO,CAAC,EACvB,SAAU1C,IAAQuC,EAAQ,EAC1B,aAAY9D,EAAE,iBAAiB,EAE/B,SAAAiD,EAAAA,IAACwB,EAAA,CAAU,UAAU,SAAA,CAAU,CAAA,CAAA,CACjC,EACF,EAEAzB,EAAAA,KAAC,QAAA,CAAM,UAAU,kCACf,SAAA,CAAAC,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,QAASK,EAAM,QACf,SAAWoB,GAAMR,EAASQ,EAAE,OAAO,OAAO,EAC1C,UAAU,sCAAA,CAAA,EAEZzB,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAqB,WAAM,IAAA,CAAK,CAAA,EAClD,EAEEqB,EAEEC,EACFvB,EAAAA,KAACU,EAAA,CAAM,QAAQ,UACb,SAAA,CAAAT,EAAAA,IAAC0B,EAAA,CAAa,UAAU,cAAA,CAAe,EAAE,IAAE3E,EAAE,mBAAmB,CAAA,CAAA,CAClE,EAEAgD,EAAAA,KAACU,EAAA,CAAM,QAAQ,UACb,SAAA,CAAAT,EAAAA,IAAC2B,EAAA,CAAQ,UAAU,cAAA,CAAe,EAAE,IAAE5E,EAAE,mBAAmB,CAAA,EAC7D,EARAiD,EAAAA,IAACS,EAAA,CAAM,QAAQ,UAAW,SAAA1D,EAAE,cAAc,CAAA,CAAE,EAW9CiD,EAAAA,IAAC,MAAA,CAAI,UAAU,kCACb,SAAAD,EAAAA,KAACE,EAAA,CACC,KAAK,KAAK,QAAQ,QAClB,QAASL,EACT,SAAUwB,GAAW,CAACf,EAAM,QAC5B,aAAYtD,EAAE,gBAAgB,EAE7B,SAAA,CAAAqE,EACGpB,EAAAA,IAACE,GAAQ,UAAU,sBAAA,CAAuB,EAC1CF,EAAAA,IAACnE,EAAA,CAAa,UAAU,SAAA,CAAU,QACrC,OAAA,CAAK,UAAU,mBAAoB,SAAAkB,EAAE,gBAAgB,CAAA,CAAE,CAAA,CAAA,CAAA,CAC1D,CACF,CAAA,EACF,EAECsE,GACCtB,EAAAA,KAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAA,EAAAA,KAAC6B,EAAA,CAAM,UAAU,sBACf,SAAA,CAAA5B,EAAAA,IAAChE,EAAA,CAAI,UAAU,qBAAA,CAAsB,EACpCsE,GAAM,MAAA,EACT,EACAP,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC6B,EAAA,CACC,KAAK,WACL,MAAOf,GAAY,GACnB,SAAWW,GAAMP,EAASO,EAAE,OAAO,KAAK,EACxC,YACEnB,GAAM,WAAa,CAACS,EAChBhE,EAAE,8BAA8B,EAChCA,EAAE,yBAAyB,EAEjC,UAAU,mBAAA,CAAA,EAEXuD,GAAM,WAAa,CAACS,GACnBf,EAAAA,IAACC,EAAA,CACC,KAAK,KAAK,QAAQ,QAClB,QAASkB,EACT,aAAYpE,EAAE,iBAAiB,EAE/B,SAAAiD,EAAAA,IAACU,EAAA,CAAE,UAAU,SAAA,CAAU,CAAA,CAAA,CACzB,EAEJ,EACAV,EAAAA,IAAC,IAAA,CAAE,UAAU,4BACV,SAAAjD,EAAE,iBAAkB,CAAE,OAAQuD,GAAM,MAAA,CAAQ,CAAA,CAC/C,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ","x_google_ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"search-55mtgHrB.js","sources":["../../node_modules/lucide-react/dist/esm/icons/flask-conical.js","../../node_modules/lucide-react/dist/esm/icons/globe.js","../../node_modules/lucide-react/dist/esm/icons/key.js","../../src/routes/settings/search.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 FlaskConical = createLucideIcon(\"FlaskConical\", [\n [\n \"path\",\n {\n d: \"M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2\",\n key: \"18mbvz\"\n }\n ],\n [\"path\", { d: \"M6.453 15h11.094\", key: \"3shlmq\" }],\n [\"path\", { d: \"M8.5 2h7\", key: \"csnxdl\" }]\n]);\n\nexport { FlaskConical as default };\n//# sourceMappingURL=flask-conical.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 Globe = createLucideIcon(\"Globe\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n]);\n\nexport { Globe as default };\n//# sourceMappingURL=globe.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 Key = createLucideIcon(\"Key\", [\n [\"path\", { d: \"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4\", key: \"g0fldk\" }],\n [\"path\", { d: \"m21 2-9.6 9.6\", key: \"1j0ho8\" }],\n [\"circle\", { cx: \"7.5\", cy: \"15.5\", r: \"5.5\", key: \"yqb3hr\" }]\n]);\n\nexport { Key as default };\n//# sourceMappingURL=key.js.map\n","/**\n * /settings/search — web_search provider config (v1.2.126).\n *\n * One row per registered provider (Tavily / Brave / Serper / Exa /\n * DuckDuckGo / Metaso): API-key input (masked-by-default), enable\n * toggle (= \"is this name in the chain?\"), reorder via up / down,\n * one-shot test button. The chain preview at the top shows what\n * AGIM_WEB_SEARCH_PROVIDERS resolves to right now.\n *\n * Persistence: API keys go via PUT /api/env (which masks GET +\n * refuses echoed masks on PUT); the chain order is a single CSV\n * env key — same endpoint. Save is one round-trip per dirty key.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n ArrowDown, ArrowUp, CheckCircle2, FlaskConical, Globe, Key,\n Loader2, RefreshCcw, Save, X, XCircle,\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 useEnv,\n useSearchProviders,\n useTestSearchProvider,\n useUpdateEnv,\n} from '@/hooks/use-settings'\nimport type { SearchProviderInfo } from '@/types/api'\n\ninterface ChainEntry {\n name: string\n enabled: boolean\n}\n\ninterface Draft {\n /** Provider chain — every known provider, with `enabled`\n * reflecting \"is name in the CSV\". Order is the row order. */\n chain: ChainEntry[]\n /** Each provider's API-key input. Keyed by envKey (e.g.\n * TAVILY_API_KEY). Holds either '' (clear) or the new plaintext\n * the operator typed. We never load values back from the server. */\n keys: Record<string, string>\n /** Tracks which key fields the operator actually touched — so\n * Save only sends the diff and untouched masked keys are left\n * alone. */\n keysTouched: Record<string, boolean>\n}\n\nfunction envChainOrder(envValue: string | undefined, providers: SearchProviderInfo[]): ChainEntry[] {\n // Parse the CSV chain; preserve operator order; tail-append any\n // provider not in the CSV as disabled so they remain renderable.\n const raw = (envValue ?? '').split(',').map((s) => s.trim()).filter(Boolean)\n const known = new Set(providers.map((p) => p.name))\n const seen = new Set<string>()\n const out: ChainEntry[] = []\n for (const name of raw) {\n if (!known.has(name) || seen.has(name)) continue\n out.push({ name, enabled: true })\n seen.add(name)\n }\n for (const p of providers) {\n if (seen.has(p.name)) continue\n out.push({ name: p.name, enabled: false })\n }\n return out\n}\n\nfunction chainToCsv(chain: ChainEntry[]): string {\n return chain.filter((c) => c.enabled).map((c) => c.name).join(',')\n}\n\nexport default function SettingsSearchRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const envQuery = useEnv({ reveal: false })\n const providersQuery = useSearchProviders()\n const updateEnv = useUpdateEnv()\n const testProvider = useTestSearchProvider()\n\n const envData = envQuery.data?.env ?? {}\n const providers = providersQuery.data?.providers ?? []\n const live = providersQuery.data?.chain ?? []\n\n const initial = useMemo<Draft>(\n () => ({\n chain: envChainOrder(envData.AGIM_WEB_SEARCH_PROVIDERS, providers),\n keys: {},\n keysTouched: {},\n }),\n [envData.AGIM_WEB_SEARCH_PROVIDERS, providers],\n )\n\n const [draft, setDraft] = useState<Draft>(initial)\n const [syncedHash, setSyncedHash] = useState('')\n\n useEffect(() => {\n const hash = JSON.stringify(initial)\n if (hash !== syncedHash) {\n setDraft(initial)\n setSyncedHash(hash)\n }\n }, [initial, syncedHash])\n\n const isDirty =\n JSON.stringify(draft.chain) !== JSON.stringify(initial.chain) ||\n Object.keys(draft.keysTouched).length > 0\n\n function moveRow(idx: number, delta: -1 | 1): void {\n setDraft((d) => {\n const next = [...d.chain]\n const swap = idx + delta\n if (swap < 0 || swap >= next.length) return d\n const a = next[idx]\n const b = next[swap]\n if (!a || !b) return d\n next[idx] = b\n next[swap] = a\n return { ...d, chain: next }\n })\n }\n\n function toggleRow(idx: number, enabled: boolean): void {\n setDraft((d) => {\n const next = [...d.chain]\n const row = next[idx]\n if (!row) return d\n next[idx] = { ...row, enabled }\n return { ...d, chain: next }\n })\n }\n\n function setKey(envKey: string, value: string): void {\n setDraft((d) => ({\n ...d,\n keys: { ...d.keys, [envKey]: value },\n keysTouched: { ...d.keysTouched, [envKey]: true },\n }))\n }\n\n function clearKey(envKey: string): void {\n setDraft((d) => ({\n ...d,\n keys: { ...d.keys, [envKey]: '' },\n keysTouched: { ...d.keysTouched, [envKey]: true },\n }))\n }\n\n async function onSave(): Promise<void> {\n const updates: Record<string, string | null> = {}\n const nextCsv = chainToCsv(draft.chain)\n const initialCsv = chainToCsv(initial.chain)\n if (nextCsv !== initialCsv) {\n updates.AGIM_WEB_SEARCH_PROVIDERS = nextCsv || null\n }\n for (const [envKey, touched] of Object.entries(draft.keysTouched)) {\n if (!touched) continue\n const v = draft.keys[envKey] ?? ''\n updates[envKey] = v.trim() === '' ? null : v\n }\n if (Object.keys(updates).length === 0) return\n try {\n await updateEnv.mutateAsync({ updates })\n // Refetch both — env keys changed availability, chain order changed.\n void providersQuery.refetch()\n toast.success(t('search.savedToast'))\n setDraft((d) => ({ ...d, keys: {}, keysTouched: {} }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n function onDiscard(): void {\n setDraft(initial)\n }\n\n async function onTest(provider: string): Promise<void> {\n try {\n const result = await testProvider.mutateAsync({\n provider,\n // Short, harmless probe — the dispatcher only needs to\n // verify the upstream auth + transport.\n query: 'agim ping',\n })\n if (result.ok) {\n toast.success(\n t('search.testOk', { provider, hits: result.hits, ms: result.latencyMs }),\n )\n } else {\n toast.error(\n t('search.testFail', { provider, error: result.error ?? 'unknown error' }),\n )\n }\n } catch (err) {\n toast.error((err as Error)?.message ?? String(err))\n }\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-6\">\n <header className=\"flex items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('search.title')}</h1>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => {\n void envQuery.refetch()\n void providersQuery.refetch()\n }}\n disabled={envQuery.isFetching || providersQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {envQuery.isFetching || providersQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('search.refresh')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('search.subtitle')}</p>\n\n <ChainPreview live={live} />\n\n {envQuery.isLoading || providersQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <section className=\"flex flex-col gap-2\">\n {draft.chain.map((entry, idx) => {\n const info = providers.find((p) => p.name === entry.name)\n return (\n <ProviderRow\n key={entry.name}\n info={info}\n entry={entry}\n idx={idx}\n count={draft.chain.length}\n keyValue={info?.envKey ? draft.keys[info.envKey] : undefined}\n keyTouched={info?.envKey ? !!draft.keysTouched[info.envKey] : false}\n onMove={(d) => moveRow(idx, d)}\n onToggle={(v) => toggleRow(idx, v)}\n onSetKey={(v) => info?.envKey && setKey(info.envKey, v)}\n onClearKey={() => info?.envKey && clearKey(info.envKey)}\n onTest={() => onTest(entry.name)}\n testing={testProvider.isPending}\n />\n )\n })}\n </section>\n )}\n\n {isDirty && (\n <div className=\"sticky bottom-2 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-3 shadow\">\n <Badge variant=\"info\">{t('search.unsaved')}</Badge>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={onDiscard}\n disabled={updateEnv.isPending}\n >\n <X className=\"h-4 w-4\" /> {t('search.discard')}\n </Button>\n <Button\n size=\"sm\"\n onClick={() => void onSave()}\n disabled={updateEnv.isPending}\n >\n {updateEnv.isPending\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <Save className=\"h-4 w-4\" />}\n {t('search.save')}\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nfunction ChainPreview({ live }: { live: string[] }): JSX.Element {\n const { t } = useTranslation('settings')\n return (\n <section className=\"rounded-md border border-border bg-surface px-4 py-3\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Globe className=\"h-4 w-4 text-text-dim\" />\n <span className=\"text-text-dim\">{t('search.chainLabel')}</span>\n {live.length === 0 ? (\n <Badge variant=\"outline\">{t('search.chainEmpty')}</Badge>\n ) : (\n <span className=\"font-mono text-xs\">{live.join(' → ')}</span>\n )}\n </div>\n <p className=\"mt-1 text-[11px] text-text-dim\">{t('search.chainHint')}</p>\n </section>\n )\n}\n\ninterface ProviderRowProps {\n info: SearchProviderInfo | undefined\n entry: ChainEntry\n idx: number\n count: number\n keyValue: string | undefined\n keyTouched: boolean\n onMove: (delta: -1 | 1) => void\n onToggle: (v: boolean) => void\n onSetKey: (v: string) => void\n onClearKey: () => void\n onTest: () => void\n testing: boolean\n}\n\nfunction ProviderRow(props: ProviderRowProps): JSX.Element {\n const { t } = useTranslation('settings')\n const { info, entry, idx, count, keyValue, keyTouched, onMove, onToggle,\n onSetKey, onClearKey, onTest, testing } = props\n const needsKey = !!info?.envKey\n const available = !!info?.available || (keyTouched && !!keyValue)\n return (\n <div className=\"rounded-md border border-border bg-surface p-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n className=\"h-5 w-5 rounded text-text-dim hover:bg-surface-hover disabled:opacity-30\"\n onClick={() => onMove(-1)}\n disabled={idx === 0}\n aria-label={t('search.moveUp')}\n >\n <ArrowUp className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n className=\"h-5 w-5 rounded text-text-dim hover:bg-surface-hover disabled:opacity-30\"\n onClick={() => onMove(1)}\n disabled={idx === count - 1}\n aria-label={t('search.moveDown')}\n >\n <ArrowDown className=\"h-4 w-4\" />\n </button>\n </div>\n\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={entry.enabled}\n onChange={(e) => onToggle(e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span className=\"font-mono text-sm\">{entry.name}</span>\n </label>\n\n {!needsKey ? (\n <Badge variant=\"outline\">{t('search.noKey')}</Badge>\n ) : available ? (\n <Badge variant=\"success\">\n <CheckCircle2 className=\"mr-1 h-3 w-3\" /> {t('search.configured')}\n </Badge>\n ) : (\n <Badge variant=\"warning\">\n <XCircle className=\"mr-1 h-3 w-3\" /> {t('search.missingKey')}\n </Badge>\n )}\n\n <div className=\"ml-auto flex items-center gap-1\">\n <Button\n size=\"sm\" variant=\"ghost\"\n onClick={onTest}\n disabled={testing || !entry.enabled}\n aria-label={t('search.testBtn')}\n >\n {testing\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <FlaskConical className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('search.testBtn')}</span>\n </Button>\n </div>\n </div>\n\n {needsKey && (\n <div className=\"mt-3 flex flex-col gap-1\">\n <Label className=\"text-xs font-medium\">\n <Key className=\"mr-1 inline h-3 w-3\" />\n {info?.envKey}\n </Label>\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"password\"\n value={keyValue ?? ''}\n onChange={(e) => onSetKey(e.target.value)}\n placeholder={\n info?.available && !keyTouched\n ? t('search.placeholderConfigured')\n : t('search.placeholderEnter')\n }\n className=\"font-mono text-xs\"\n />\n {info?.available && !keyTouched && (\n <Button\n size=\"sm\" variant=\"ghost\"\n onClick={onClearKey}\n aria-label={t('search.clearKey')}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n <p className=\"text-[11px] text-text-dim\">\n {t('search.keyHint', { envKey: info?.envKey })}\n </p>\n </div>\n )}\n </div>\n )\n}\n"],"names":["FlaskConical","createLucideIcon","Globe","Key","envChainOrder","envValue","providers","raw","s","known","p","seen","out","name","chainToCsv","chain","c","SettingsSearchRoute","t","useTranslation","envQuery","useEnv","providersQuery","useSearchProviders","updateEnv","useUpdateEnv","testProvider","useTestSearchProvider","envData","live","initial","useMemo","draft","setDraft","useState","syncedHash","setSyncedHash","useEffect","hash","isDirty","moveRow","idx","delta","d","next","swap","a","b","toggleRow","enabled","row","setKey","envKey","value","clearKey","onSave","updates","nextCsv","initialCsv","touched","toast","err","onDiscard","onTest","provider","result","jsxs","jsx","Button","Loader2","RefreshCcw","ChainPreview","entry","info","ProviderRow","v","Badge","X","Save","props","count","keyValue","keyTouched","onMove","onToggle","onSetKey","onClearKey","testing","needsKey","available","ArrowUp","ArrowDown","e","CheckCircle2","XCircle","Label","Input"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{h as e}from"./index-DCfdN5R7.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const r=e("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);export{r as S};
|
|
7
|
-
//# sourceMappingURL=search-
|
|
7
|
+
//# sourceMappingURL=search-CAICU3aU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-
|
|
1
|
+
{"version":3,"file":"search-CAICU3aU.js","sources":["../../node_modules/lucide-react/dist/esm/icons/search.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Search = createLucideIcon(\"Search\", [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"path\", { d: \"m21 21-4.3-4.3\", key: \"1qie3q\" }]\n]);\n\nexport { Search as default };\n//# sourceMappingURL=search.js.map\n"],"names":["Search","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,SAAU,EACxD,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,CAAC","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as P,j as e,e as j,k as O,l as k,m as L,n as R,o as g,I as _,y as H,p as G,q as F,L as $,c as W,d as T,f as V,X as q,z as X,C as Q}from"./index-DCfdN5R7.js";import{r as f}from"./react-DlP5eolq.js";import{D as Y,a as J,b as Z,d as ee,e as se,f as te}from"./dropdown-menu-BNH5SrVb.js";import{b as ie,c as re,m as le}from"./use-settings-DGIjmUX0.js";import{L as D}from"./loader-circle-DDdmcH0k.js";import{R as ne}from"./refresh-ccw-DlAd-eTQ.js";import{S as z}from"./shield-alert-DOKK9EnJ.js";import{P as ae}from"./plus-DH4J_YhN.js";import"./chevron-right-CFRb-SM_.js";function B(s){if(s==null)return!1;const i=s.toLowerCase();return i==="1"||i==="true"||i==="yes"||i==="on"}function K(s){const i=(s??"").trim();return i==="*"?{mode:"open",members:[],explicitOpen:!0}:i?{mode:"restricted",members:M(i.split(",")),explicitOpen:!1}:{mode:"open",members:[],explicitOpen:!1}}function ce(s,i){if(s==="open")return"*";const r=M(i);return r.length>0?r.join(","):null}function U(s,i){return s==="open"?"*":M(i).join(",")}function Ne(){const{t:s}=P(["settings","common"]),i=ie(),r=re(),m=le(),[t,y]=f.useState(null),[p,b]=f.useState(!1),[x,o]=f.useState("open"),[d,w]=f.useState([]);async function E(){b(!0);try{const l=await H.get("/api/security/diagnostics");y(l.diagnostics)}catch(l){G.error(F(l,s).message)}finally{b(!1)}}f.useEffect(()=>{E()},[]);async function c(l,n){try{await r.mutateAsync({updates:{[l]:n}}),G.success(s("security.savingToast")),await E()}catch(A){G.error(F(A,s).message)}}const u=i.data?.env??{},h=f.useMemo(()=>K(u.AGIM_ALLOWED_USERS),[u.AGIM_ALLOWED_USERS]),C=f.useMemo(()=>{const l=new Map;for(const n of m.data?.knownUsers??[]){const A=me(n);l.set(A,{value:A,label:A,detail:s("security.sender.lastSeen",{time:xe(n.lastSeenAt)})})}for(const n of d)l.has(n)||l.set(n,{value:n,label:n,detail:s("security.sender.fromCurrentValue")});return[...l.values()].sort((n,A)=>n.label.localeCompare(A.label))},[m.data?.knownUsers,d,s]),a=x==="open"?h.mode!=="open"||!h.explicitOpen:U(x,d)!==U(h.mode,h.members);f.useEffect(()=>{o(h.mode),w(h.members)},[h.mode,h.members]);async function N(){const l=ce(x,d);if(x==="restricted"&&l===null){G.error(s("security.sender.emptyRestrictedToast"));return}await c("AGIM_ALLOWED_USERS",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("security.title")}),e.jsx(j,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>{i.refetch(),E()},disabled:i.isFetching||p,"aria-label":s("actions.refresh",{ns:"common"}),children:i.isFetching||p?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(ne,{className:"h-4 w-4"})})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("security.subtitle")})]}),e.jsx(oe,{diagnostics:t,env:u,loading:i.isLoading||p,onSetValue:(l,n)=>void c(l,n)}),e.jsx(S,{id:"sender-allowlist",title:s("security.sender.title"),description:s("security.sender.description"),children:e.jsx(ue,{mode:x,members:d,choices:C,loading:m.isLoading,explicitOpen:h.explicitOpen,dirty:a,saving:r.isPending,onModeChange:o,onMembersChange:w,onSave:()=>void N()})}),e.jsx(de,{diagnostics:t,loading:p}),e.jsx(S,{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(v,{label:s("security.exec.sandbox"),children:e.jsxs(O,{value:(u.AGIM_EXEC_SANDBOX??"").toLowerCase()==="bwrap"?"bwrap":"__none__",onValueChange:l=>void c("AGIM_EXEC_SANDBOX",l==="__none__"?null:l),children:[e.jsx(k,{children:e.jsx(L,{})}),e.jsxs(R,{children:[e.jsx(g,{value:"__none__",children:s("security.exec.sandboxNone")}),e.jsxs(g,{value:"bwrap",disabled:!t?.bwrapAvailable,children:[s("security.exec.sandboxBwrap"),!t?.bwrapAvailable&&e.jsxs("span",{className:"ml-2 text-xs text-text-muted",children:["(",s("security.exec.sandboxBwrapMissing"),")"]})]})]})]})}),e.jsx(v,{label:s("security.exec.sandboxNet"),children:e.jsxs(O,{value:(u.AGIM_EXEC_SANDBOX_NET??"").toLowerCase()==="off"?"off":"on",onValueChange:l=>void c("AGIM_EXEC_SANDBOX_NET",l==="off"?"off":null),children:[e.jsx(k,{children:e.jsx(L,{})}),e.jsxs(R,{children:[e.jsx(g,{value:"on",children:s("security.exec.sandboxNetOn")}),e.jsx(g,{value:"off",children:s("security.exec.sandboxNetOff")})]})]})}),e.jsx(v,{label:s("security.exec.timeoutMs"),children:e.jsx(_,{type:"number",defaultValue:u.AGIM_EXEC_TIMEOUT_MS??"",placeholder:"60000",onBlur:l=>{const n=l.target.value.trim();c("AGIM_EXEC_TIMEOUT_MS",n===""?null:n)}})}),e.jsx(v,{label:s("security.exec.maxOutput"),children:e.jsx(_,{type:"number",defaultValue:u.AGIM_EXEC_MAX_OUTPUT??"",placeholder:"32768",onBlur:l=>{const n=l.target.value.trim();c("AGIM_EXEC_MAX_OUTPUT",n===""?null:n)}})})]})}),e.jsx(S,{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(v,{label:s("security.web.allowPrivate"),hint:s("security.web.allowPrivateHelp"),children:e.jsxs(O,{value:B(u.AGIM_NATIVE_WEB_ALLOW_PRIVATE)?"1":"0",onValueChange:l=>void c("AGIM_NATIVE_WEB_ALLOW_PRIVATE",l==="1"?"1":null),children:[e.jsx(k,{children:e.jsx(L,{})}),e.jsxs(R,{children:[e.jsx(g,{value:"0",children:"OFF"}),e.jsx(g,{value:"1",children:"ON"})]})]})}),e.jsx(v,{label:s("security.web.timeoutMs"),children:e.jsx(_,{type:"number",defaultValue:u.AGIM_NATIVE_WEB_TIMEOUT_MS??"",placeholder:"30000",onBlur:l=>{const n=l.target.value.trim();c("AGIM_NATIVE_WEB_TIMEOUT_MS",n===""?null:n)}})}),e.jsx("div",{className:"sm:col-span-2",children:e.jsx(v,{label:s("security.web.ssrfWhitelist"),children:e.jsx(_,{defaultValue:u.AGIM_NATIVE_WEB_SSRF_WHITELIST??"",placeholder:s("security.web.ssrfWhitelistPlaceholder"),onBlur:l=>{const n=l.target.value.trim();c("AGIM_NATIVE_WEB_SSRF_WHITELIST",n===""?null:n)}})})})]})}),e.jsx(S,{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(v,{label:s("security.fs.restrict"),children:e.jsxs(O,{value:(u.AGIM_NATIVE_FS_RESTRICT??"0")==="1"?"1":"0",onValueChange:l=>void c("AGIM_NATIVE_FS_RESTRICT",l==="1"?"1":null),children:[e.jsx(k,{children:e.jsx(L,{})}),e.jsxs(R,{children:[e.jsx(g,{value:"1",children:s("security.fs.restrictOn")}),e.jsx(g,{value:"0",children:s("security.fs.restrictOff")})]})]})}),e.jsx(v,{label:s("security.fs.timeoutMs"),children:e.jsx(_,{type:"number",defaultValue:u.AGIM_NATIVE_FS_TIMEOUT_MS??"",placeholder:"60000",onBlur:l=>{const n=l.target.value.trim();c("AGIM_NATIVE_FS_TIMEOUT_MS",n===""?null:n)}})})]})}),e.jsx(S,{title:s("security.delegation.title"),description:s("security.delegation.description"),envKey:"AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN",children:e.jsx(_,{type:"number",defaultValue:u.AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN??"",placeholder:"2",onBlur:l=>{const n=l.target.value.trim();c("AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN",n===""?null:n)}})}),e.jsxs(S,{title:s("security.platformBlacklist.title"),description:s("security.platformBlacklist.description"),envKey:"AGIM_PLATFORM_BLACKLIST",children:[e.jsx(_,{defaultValue:u.AGIM_PLATFORM_BLACKLIST??"",placeholder:s("security.platformBlacklist.placeholder"),onBlur:l=>{const n=l.target.value.trim();c("AGIM_PLATFORM_BLACKLIST",n===""?null:n)}}),t?.platformBlacklist&&t.platformBlacklist.length>0&&e.jsxs("p",{className:"mt-2 text-[10px] text-text-muted",children:[s("security.platformBlacklist.currentLabel"),": ",t.platformBlacklist.join(", ")]})]})]})}function oe({diagnostics:s,env:i,loading:r,onSetValue:m}){const{t}=P("settings"),y=K(i.AGIM_ALLOWED_USERS),p=f.useMemo(()=>{const o=[];return B(i.AGIM_DANGEROUSLY_SKIP_PERMISSIONS)&&o.push({id:"skip-permissions",level:"danger",title:t("security.posture.issue.skipPermissions.title"),detail:t("security.posture.issue.skipPermissions.detail"),action:e.jsx(j,{type:"button",size:"sm",variant:"link",className:"h-auto p-0 text-xs text-danger",onClick:()=>m("AGIM_DANGEROUSLY_SKIP_PERMISSIONS","0"),children:t("security.posture.issue.skipPermissions.action")})}),y.mode==="open"&&o.push({id:"sender-open",level:"warn",title:y.explicitOpen?t("security.posture.issue.senderOpenExplicit.title"):t("security.posture.issue.senderOpenImplicit.title"),detail:y.explicitOpen?t("security.posture.issue.senderOpenExplicit.detail"):t("security.posture.issue.senderOpenImplicit.detail"),action:e.jsx(j,{type:"button",size:"sm",variant:"link",className:"h-auto p-0 text-xs",asChild:!0,children:e.jsx("a",{href:"#sender-allowlist",children:t("security.posture.issue.senderOpenImplicit.action")})})}),s&&!s.adminAllowlistConfigured&&o.push({id:"admin-empty",level:"warn",title:t("security.posture.issue.adminEmpty.title"),detail:t("security.posture.issue.adminEmpty.detail"),action:e.jsx(j,{type:"button",size:"sm",variant:"link",className:"h-auto p-0 text-xs",asChild:!0,children:e.jsx($,{to:"/settings/admins",children:t("security.posture.issue.adminEmpty.action")})})}),s?.envFile.exists&&s.envFile.tooPermissive&&o.push({id:"env-perms",level:"warn",title:t("security.posture.issue.envPerms.title"),detail:t("security.posture.issue.envPerms.detail",{mode:s.envFile.mode??"---"})}),s?.runningAsRoot===!0&&o.push({id:"root",level:"warn",title:t("security.posture.issue.root.title"),detail:t("security.posture.issue.root.detail")}),B(i.AGIM_NATIVE_WEB_ALLOW_PRIVATE)&&o.push({id:"private-web",level:"warn",title:t("security.posture.issue.privateWeb.title"),detail:t("security.posture.issue.privateWeb.detail"),action:e.jsx(j,{type:"button",size:"sm",variant:"link",className:"h-auto p-0 text-xs",onClick:()=>m("AGIM_NATIVE_WEB_ALLOW_PRIVATE",null),children:t("security.posture.issue.privateWeb.action")})}),B(i.AGIM_NATIVE_FS_RESTRICT)||o.push({id:"fs-open",level:"warn",title:t("security.posture.issue.fsOpen.title"),detail:t("security.posture.issue.fsOpen.detail"),action:e.jsx(j,{type:"button",size:"sm",variant:"link",className:"h-auto p-0 text-xs",onClick:()=>m("AGIM_NATIVE_FS_RESTRICT","1"),children:t("security.posture.issue.fsOpen.action")})}),o},[s,i,m,y.explicitOpen,y.mode,t]),b=p.filter(o=>o.level==="danger").length,x=!r&&p.length===0;return e.jsxs("section",{className:V("rounded-md border p-4 shadow-sm",b>0?"border-danger/60 bg-danger-bg/30":"border-border bg-surface"),children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[x?e.jsx(W,{className:"h-4 w-4 text-success"}):e.jsx(z,{className:"h-4 w-4 text-warning"}),e.jsx("h2",{className:"text-sm font-semibold",children:t("security.posture.title")}),e.jsx(T,{variant:x?"success":b>0?"danger":"warning",children:r?t("security.posture.loading"):x?t("security.posture.ready"):t("security.posture.needsAction",{count:p.length})}),e.jsx("p",{className:"basis-full text-xs text-text-dim sm:basis-auto sm:ml-2",children:t(x?"security.posture.readyDetail":"security.posture.detail")})]}),r?e.jsx("div",{className:"mt-3 h-10 rounded-md bg-surface-2 animate-pulse"}):p.length>0?e.jsx("ul",{className:"mt-3 grid gap-3 md:grid-cols-3",children:p.slice(0,5).map(o=>e.jsxs("li",{className:V("min-w-0 rounded-md border border-l-2 p-3",o.level==="danger"?"border-danger/40 border-l-danger bg-danger-bg/45":"border-warning/40 border-l-warning bg-warning-bg/55"),children:[e.jsx("div",{className:"text-sm font-medium",children:o.title}),e.jsx("div",{className:"mt-0.5 text-xs text-text-dim",children:o.detail}),o.action&&e.jsx("div",{className:"mt-1",children:o.action})]},o.id))}):null]})}function de({diagnostics:s,loading:i}){const{t:r}=P("settings");return e.jsxs("details",{className:"rounded-md border border-border bg-surface shadow-sm",children:[e.jsxs("summary",{className:"flex cursor-pointer list-none flex-wrap items-center gap-2 px-3 py-2 text-sm font-medium",children:[e.jsx(z,{className:"h-4 w-4 text-text-dim"}),e.jsx("span",{children:r("security.diagnostics.title")}),e.jsx("span",{className:"text-xs font-normal text-text-muted",children:r("security.diagnostics.summary")}),e.jsx(T,{variant:"outline",className:"ml-auto",children:r("security.diagnostics.advanced")})]}),e.jsx("div",{className:"border-t border-border bg-surface-2/35 px-3 py-3",children:s?e.jsxs("ul",{className:"grid gap-2 text-sm sm:grid-cols-2",children:[e.jsx(I,{label:r("security.diagnostics.runningAsRoot"),ok:s.runningAsRoot===!1,text:s.runningAsRoot===!0?r("security.diagnostics.runningAsRootHelp"):"OK"}),e.jsx(I,{label:r("security.diagnostics.envFilePerms"),ok:s.envFile.exists&&!s.envFile.tooPermissive,text:s.envFile.exists?s.envFile.tooPermissive?`${s.envFile.mode} — ${r("security.diagnostics.envFilePermsLax")}`:r("security.diagnostics.envFilePermsOk"):"—"}),e.jsx(I,{label:r("security.diagnostics.bwrapAvailable"),ok:s.bwrapAvailable,text:s.bwrapAvailable?"/usr/bin/bwrap":r("security.diagnostics.bwrapMissing")}),e.jsx(I,{label:r("security.diagnostics.senderAllowlist"),ok:s.senderAllowlistConfigured,text:s.senderAllowlistConfigured?r("security.diagnostics.senderAllowlistOn"):r("security.diagnostics.senderAllowlistOff")}),e.jsx(I,{label:r("security.diagnostics.adminAllowlist"),ok:s.adminAllowlistConfigured,text:s.adminAllowlistConfigured?r("security.diagnostics.adminAllowlistOn"):r("security.diagnostics.adminAllowlistOff")}),e.jsx(I,{label:r("security.diagnosticsPlatformBlacklist"),ok:s.platformBlacklist.length===0,text:s.platformBlacklist.length===0?"—":s.platformBlacklist.join(", ")})]}):e.jsx("p",{className:"text-sm text-text-dim",children:i?r("security.posture.loading"):"…"})})]})}function ue({mode:s,members:i,choices:r,loading:m,explicitOpen:t,dirty:y,saving:p,onModeChange:b,onMembersChange:x,onSave:o}){const{t:d}=P("settings"),[w,E]=f.useState(""),c=M(i),u=f.useMemo(()=>new Set(c),[c]);function h(a){u.has(a)?x(c.filter(N=>N!==a)):x([...c,a])}function C(){const a=M(w.split(","));a.length!==0&&(x(M([...c,...a])),E(""),b("restricted"))}return e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(j,{type:"button",size:"sm",variant:s==="restricted"?"default":"secondary",onClick:()=>b("restricted"),"aria-pressed":s==="restricted",children:d("security.sender.modeRestricted")}),e.jsx(j,{type:"button",size:"sm",variant:s==="open"?"default":"secondary",onClick:()=>b("open"),"aria-pressed":s==="open",children:d("security.sender.modeOpen")}),s==="open"&&e.jsx(T,{variant:t?"outline":"warning",children:d(t?"security.sender.openExplicit":"security.sender.openImplicit")})]}),s==="restricted"?e.jsxs("div",{className:"rounded-md border border-border bg-surface-2 p-2",children:[e.jsx("div",{className:"flex min-h-8 flex-wrap items-center gap-1.5",children:c.length===0?e.jsx("span",{className:"px-1 text-xs text-text-muted",children:d("security.sender.emptyMembers")}):c.map(a=>e.jsxs(T,{variant:"secondary",className:"normal-case tracking-normal",children:[e.jsx("span",{className:"font-mono",children:a}),e.jsx("button",{type:"button",className:"ml-1 rounded-full text-text-dim hover:text-text",onClick:()=>x(c.filter(N=>N!==a)),"aria-label":d("security.sender.removeMember",{value:a}),children:e.jsx(q,{className:"h-3 w-3"})})]},a))}),e.jsxs("div",{className:"mt-2 flex flex-wrap gap-2",children:[e.jsxs(Y,{children:[e.jsx(J,{asChild:!0,children:e.jsxs(j,{type:"button",variant:"outline",size:"sm",disabled:m,children:[m?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(ae,{className:"h-4 w-4"}),d("security.sender.chooseMembers")]})}),e.jsxs(Z,{align:"start",className:"max-h-80 w-80 overflow-y-auto",children:[e.jsx(ee,{children:d("security.sender.chooseMembers")}),e.jsx(se,{}),r.length===0?e.jsx("div",{className:"px-2 py-2 text-sm text-text-muted",children:d("security.sender.noChoices")}):r.map(a=>e.jsx(te,{checked:u.has(a.value),onCheckedChange:()=>h(a.value),onSelect:N=>N.preventDefault(),className:"items-start gap-2",children:e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block truncate font-mono text-xs",children:a.label}),a.detail&&e.jsx("span",{className:"mt-0.5 block truncate text-xs text-text-muted",children:a.detail})]})},a.value))]})]}),e.jsxs("div",{className:"flex min-w-[220px] flex-1 gap-2",children:[e.jsx(_,{value:w,onChange:a=>E(a.target.value),onKeyDown:a=>{a.key==="Enter"&&(a.preventDefault(),C())},placeholder:d("security.sender.placeholder"),className:"h-7 font-mono text-xs"}),e.jsx(j,{type:"button",variant:"secondary",size:"sm",onClick:C,disabled:!w.trim(),children:d("security.sender.addCustom")})]})]})]}):e.jsxs("p",{className:"flex items-start gap-2 text-xs text-text-muted",children:[e.jsx(X,{className:"mt-0.5 h-3.5 w-3.5 shrink-0 text-warning"}),e.jsx("span",{children:d("security.sender.openHint")})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs(j,{type:"button",size:"sm",onClick:o,disabled:p||!y||s==="restricted"&&c.length===0,children:[p?e.jsx(D,{className:"h-4 w-4 animate-spin"}):e.jsx(W,{className:"h-4 w-4"}),d("security.sender.save")]}),e.jsx("span",{className:"text-[10px] text-text-muted",children:d(y?"security.sender.unsaved":"security.sender.saved")})]})]})}function I({label:s,ok:i,text:r}){return e.jsxs("li",{className:"flex items-start gap-2 rounded-md border border-border bg-surface p-3",children:[i?e.jsx(Q,{className:"mt-0.5 h-4 w-4 shrink-0 text-success"}):e.jsx(X,{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:V("text-xs",i?"text-text-muted":"text-warning"),children:r})]})]})}function S({id:s,title:i,description:r,envKey:m,children:t}){return e.jsxs("section",{id:s,className:"rounded-md border border-border bg-surface p-4 shadow-sm",children:[e.jsxs("div",{className:"mb-2 flex flex-wrap items-baseline gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold",children:i}),m&&e.jsx(T,{variant:"outline",className:"font-mono text-[10px]",children:m})]}),e.jsx("p",{className:"mb-3 text-xs text-text-dim",children:r}),t]})}function v({label:s,hint:i,children:r}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{className:"text-xs font-medium text-text-dim",children:s}),r,i&&e.jsx("p",{className:"text-[10px] text-text-muted",children:i})]})}function M(s){const i=[],r=new Set;for(const m of s){const t=m.trim();!t||r.has(t)||(r.add(t),i.push(t))}return i}function me(s){return`${s.platform}:${s.userId}`}function xe(s){const i=new Date(s);return Number.isNaN(i.getTime())?s:i.toLocaleString()}export{Ne as default};
|
|
2
|
+
//# sourceMappingURL=security-CbP4QgVp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-CbP4QgVp.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, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Link } from 'react-router-dom'\nimport { toast } from 'sonner'\nimport {\n AlertTriangle,\n CheckCircle2,\n Loader2,\n Plus,\n RefreshCcw,\n ShieldAlert,\n ShieldCheck,\n X,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport { Input } from '@/components/ui/input'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useAdminAllowlist, useEnv, useUpdateEnv } from '@/hooks/use-settings'\nimport { client } from '@/lib/api/client'\nimport { describeError } from '@/lib/api/errors'\nimport { cn } from '@/lib/utils'\nimport type { KnownImUser } from '@/types/api'\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\ninterface SenderChoice {\n value: string\n label: string\n detail?: string\n}\n\ntype SenderMode = 'restricted' | 'open'\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\nfunction parseSenderAllowlist(raw: string | undefined): { mode: SenderMode; members: string[]; explicitOpen: boolean } {\n const value = (raw ?? '').trim()\n if (value === '*') return { mode: 'open', members: [], explicitOpen: true }\n if (!value) return { mode: 'open', members: [], explicitOpen: false }\n return {\n mode: 'restricted',\n members: uniqueStrings(value.split(',')),\n explicitOpen: false,\n }\n}\n\nfunction serializeSenderAllowlist(mode: SenderMode, members: string[]): string | null {\n if (mode === 'open') return '*'\n const values = uniqueStrings(members)\n return values.length > 0 ? values.join(',') : null\n}\n\nfunction senderValueFingerprint(mode: SenderMode, members: string[]): string {\n return mode === 'open' ? '*' : uniqueStrings(members).join(',')\n}\n\nexport default function SettingsSecurityRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const envQuery = useEnv()\n const updateEnv = useUpdateEnv()\n const adminsQuery = useAdminAllowlist()\n const [diagnostics, setDiagnostics] = useState<Diagnostics | null>(null)\n const [diagLoading, setDiagLoading] = useState(false)\n const [senderMode, setSenderMode] = useState<SenderMode>('open')\n const [senderMembers, setSenderMembers] = useState<string[]>([])\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 const senderParsed = useMemo(() => parseSenderAllowlist(env.AGIM_ALLOWED_USERS), [env.AGIM_ALLOWED_USERS])\n const senderChoices = useMemo<SenderChoice[]>(() => {\n const choices = new Map<string, SenderChoice>()\n for (const u of adminsQuery.data?.knownUsers ?? []) {\n const key = imUserKey(u)\n choices.set(key, {\n value: key,\n label: key,\n detail: t('security.sender.lastSeen', { time: formatSeenAt(u.lastSeenAt) }),\n })\n }\n for (const member of senderMembers) {\n if (!choices.has(member)) {\n choices.set(member, {\n value: member,\n label: member,\n detail: t('security.sender.fromCurrentValue'),\n })\n }\n }\n return [...choices.values()].sort((a, b) => a.label.localeCompare(b.label))\n }, [adminsQuery.data?.knownUsers, senderMembers, t])\n const senderDirty = senderMode === 'open'\n ? senderParsed.mode !== 'open' || !senderParsed.explicitOpen\n : senderValueFingerprint(senderMode, senderMembers)\n !== senderValueFingerprint(senderParsed.mode, senderParsed.members)\n\n useEffect(() => {\n setSenderMode(senderParsed.mode)\n setSenderMembers(senderParsed.members)\n }, [senderParsed.mode, senderParsed.members])\n\n async function saveSenderAllowlist(): Promise<void> {\n const next = serializeSenderAllowlist(senderMode, senderMembers)\n if (senderMode === 'restricted' && next === null) {\n toast.error(t('security.sender.emptyRestrictedToast'))\n return\n }\n await setValue('AGIM_ALLOWED_USERS', next)\n }\n\n return (\n <div className=\"mx-auto flex max-w-4xl flex-col gap-4\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('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-text-dim\">{t('security.subtitle')}</p>\n </header>\n\n <SecurityPosture\n diagnostics={diagnostics}\n env={env}\n loading={envQuery.isLoading || diagLoading}\n onSetValue={(key, value) => void setValue(key, value)}\n />\n\n {/* Sender allowlist */}\n <ControlCard\n id=\"sender-allowlist\"\n title={t('security.sender.title')}\n description={t('security.sender.description')}\n >\n <SenderAllowlistEditor\n mode={senderMode}\n members={senderMembers}\n choices={senderChoices}\n loading={adminsQuery.isLoading}\n explicitOpen={senderParsed.explicitOpen}\n dirty={senderDirty}\n saving={updateEnv.isPending}\n onModeChange={setSenderMode}\n onMembersChange={setSenderMembers}\n onSave={() => void saveSenderAllowlist()}\n />\n </ControlCard>\n\n <DiagnosticsPanel diagnostics={diagnostics} loading={diagLoading} />\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-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-text-muted\">\n {t('security.platformBlacklist.currentLabel')}: {diagnostics.platformBlacklist.join(', ')}\n </p>\n )}\n </ControlCard>\n </div>\n )\n}\n\nfunction SecurityPosture({\n diagnostics,\n env,\n loading,\n onSetValue,\n}: {\n diagnostics: Diagnostics | null\n env: Record<string, string | undefined>\n loading: boolean\n onSetValue: (key: string, value: string | null) => void\n}): JSX.Element {\n const { t } = useTranslation('settings')\n const sender = parseSenderAllowlist(env.AGIM_ALLOWED_USERS)\n const issues = useMemo(() => {\n const rows: Array<{\n id: string\n level: 'danger' | 'warn'\n title: string\n detail: string\n action?: JSX.Element\n }> = []\n\n if (envBool(env.AGIM_DANGEROUSLY_SKIP_PERMISSIONS)) {\n rows.push({\n id: 'skip-permissions',\n level: 'danger',\n title: t('security.posture.issue.skipPermissions.title'),\n detail: t('security.posture.issue.skipPermissions.detail'),\n action: (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"link\"\n className=\"h-auto p-0 text-xs text-danger\"\n onClick={() => onSetValue('AGIM_DANGEROUSLY_SKIP_PERMISSIONS', '0')}\n >\n {t('security.posture.issue.skipPermissions.action')}\n </Button>\n ),\n })\n }\n\n if (sender.mode === 'open') {\n rows.push({\n id: 'sender-open',\n level: 'warn',\n title: sender.explicitOpen\n ? t('security.posture.issue.senderOpenExplicit.title')\n : t('security.posture.issue.senderOpenImplicit.title'),\n detail: sender.explicitOpen\n ? t('security.posture.issue.senderOpenExplicit.detail')\n : t('security.posture.issue.senderOpenImplicit.detail'),\n action: (\n <Button type=\"button\" size=\"sm\" variant=\"link\" className=\"h-auto p-0 text-xs\" asChild>\n <a href=\"#sender-allowlist\">{t('security.posture.issue.senderOpenImplicit.action')}</a>\n </Button>\n ),\n })\n }\n\n if (diagnostics && !diagnostics.adminAllowlistConfigured) {\n rows.push({\n id: 'admin-empty',\n level: 'warn',\n title: t('security.posture.issue.adminEmpty.title'),\n detail: t('security.posture.issue.adminEmpty.detail'),\n action: (\n <Button type=\"button\" size=\"sm\" variant=\"link\" className=\"h-auto p-0 text-xs\" asChild>\n <Link to=\"/settings/admins\">{t('security.posture.issue.adminEmpty.action')}</Link>\n </Button>\n ),\n })\n }\n\n if (diagnostics?.envFile.exists && diagnostics.envFile.tooPermissive) {\n rows.push({\n id: 'env-perms',\n level: 'warn',\n title: t('security.posture.issue.envPerms.title'),\n detail: t('security.posture.issue.envPerms.detail', { mode: diagnostics.envFile.mode ?? '---' }),\n })\n }\n\n if (diagnostics?.runningAsRoot === true) {\n rows.push({\n id: 'root',\n level: 'warn',\n title: t('security.posture.issue.root.title'),\n detail: t('security.posture.issue.root.detail'),\n })\n }\n\n if (envBool(env.AGIM_NATIVE_WEB_ALLOW_PRIVATE)) {\n rows.push({\n id: 'private-web',\n level: 'warn',\n title: t('security.posture.issue.privateWeb.title'),\n detail: t('security.posture.issue.privateWeb.detail'),\n action: (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"link\"\n className=\"h-auto p-0 text-xs\"\n onClick={() => onSetValue('AGIM_NATIVE_WEB_ALLOW_PRIVATE', null)}\n >\n {t('security.posture.issue.privateWeb.action')}\n </Button>\n ),\n })\n }\n\n if (!envBool(env.AGIM_NATIVE_FS_RESTRICT)) {\n rows.push({\n id: 'fs-open',\n level: 'warn',\n title: t('security.posture.issue.fsOpen.title'),\n detail: t('security.posture.issue.fsOpen.detail'),\n action: (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"link\"\n className=\"h-auto p-0 text-xs\"\n onClick={() => onSetValue('AGIM_NATIVE_FS_RESTRICT', '1')}\n >\n {t('security.posture.issue.fsOpen.action')}\n </Button>\n ),\n })\n }\n\n return rows\n }, [diagnostics, env, onSetValue, sender.explicitOpen, sender.mode, t])\n\n const dangerCount = issues.filter((issue) => issue.level === 'danger').length\n const ready = !loading && issues.length === 0\n\n return (\n <section className={cn(\n 'rounded-md border p-4 shadow-sm',\n dangerCount > 0 ? 'border-danger/60 bg-danger-bg/30' : 'border-border bg-surface',\n )}>\n <div className=\"flex flex-wrap items-center gap-2\">\n {ready ? <ShieldCheck className=\"h-4 w-4 text-success\" /> : <ShieldAlert className=\"h-4 w-4 text-warning\" />}\n <h2 className=\"text-sm font-semibold\">{t('security.posture.title')}</h2>\n <Badge variant={ready ? 'success' : dangerCount > 0 ? 'danger' : 'warning'}>\n {loading\n ? t('security.posture.loading')\n : ready\n ? t('security.posture.ready')\n : t('security.posture.needsAction', { count: issues.length })}\n </Badge>\n <p className=\"basis-full text-xs text-text-dim sm:basis-auto sm:ml-2\">\n {ready ? t('security.posture.readyDetail') : t('security.posture.detail')}\n </p>\n </div>\n\n {loading ? (\n <div className=\"mt-3 h-10 rounded-md bg-surface-2 animate-pulse\" />\n ) : issues.length > 0 ? (\n <ul className=\"mt-3 grid gap-3 md:grid-cols-3\">\n {issues.slice(0, 5).map((issue) => (\n <li\n key={issue.id}\n className={cn(\n 'min-w-0 rounded-md border border-l-2 p-3',\n issue.level === 'danger'\n ? 'border-danger/40 border-l-danger bg-danger-bg/45'\n : 'border-warning/40 border-l-warning bg-warning-bg/55',\n )}\n >\n <div className=\"text-sm font-medium\">{issue.title}</div>\n <div className=\"mt-0.5 text-xs text-text-dim\">{issue.detail}</div>\n {issue.action && (\n <div className=\"mt-1\">\n {issue.action}\n </div>\n )}\n </li>\n ))}\n </ul>\n ) : null}\n </section>\n )\n}\n\nfunction DiagnosticsPanel({\n diagnostics,\n loading,\n}: {\n diagnostics: Diagnostics | null\n loading: boolean\n}): JSX.Element {\n const { t } = useTranslation('settings')\n\n return (\n <details className=\"rounded-md border border-border bg-surface shadow-sm\">\n <summary className=\"flex cursor-pointer list-none flex-wrap items-center gap-2 px-3 py-2 text-sm font-medium\">\n <ShieldAlert className=\"h-4 w-4 text-text-dim\" />\n <span>{t('security.diagnostics.title')}</span>\n <span className=\"text-xs font-normal text-text-muted\">{t('security.diagnostics.summary')}</span>\n <Badge variant=\"outline\" className=\"ml-auto\">{t('security.diagnostics.advanced')}</Badge>\n </summary>\n <div className=\"border-t border-border bg-surface-2/35 px-3 py-3\">\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-text-dim\">{loading ? t('security.posture.loading') : '…'}</p>\n )}\n </div>\n </details>\n )\n}\n\nfunction SenderAllowlistEditor({\n mode,\n members,\n choices,\n loading,\n explicitOpen,\n dirty,\n saving,\n onModeChange,\n onMembersChange,\n onSave,\n}: {\n mode: SenderMode\n members: string[]\n choices: SenderChoice[]\n loading: boolean\n explicitOpen: boolean\n dirty: boolean\n saving: boolean\n onModeChange: (mode: SenderMode) => void\n onMembersChange: (members: string[]) => void\n onSave: () => void\n}): JSX.Element {\n const { t } = useTranslation('settings')\n const [custom, setCustom] = useState('')\n const selected = uniqueStrings(members)\n const selectedSet = useMemo(() => new Set(selected), [selected])\n\n function toggle(value: string): void {\n if (selectedSet.has(value)) {\n onMembersChange(selected.filter((item) => item !== value))\n } else {\n onMembersChange([...selected, value])\n }\n }\n\n function addCustom(): void {\n const parsed = uniqueStrings(custom.split(','))\n if (parsed.length === 0) return\n onMembersChange(uniqueStrings([...selected, ...parsed]))\n setCustom('')\n onModeChange('restricted')\n }\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === 'restricted' ? 'default' : 'secondary'}\n onClick={() => onModeChange('restricted')}\n aria-pressed={mode === 'restricted'}\n >\n {t('security.sender.modeRestricted')}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={mode === 'open' ? 'default' : 'secondary'}\n onClick={() => onModeChange('open')}\n aria-pressed={mode === 'open'}\n >\n {t('security.sender.modeOpen')}\n </Button>\n {mode === 'open' && (\n <Badge variant={explicitOpen ? 'outline' : 'warning'}>\n {explicitOpen ? t('security.sender.openExplicit') : t('security.sender.openImplicit')}\n </Badge>\n )}\n </div>\n\n {mode === 'restricted' ? (\n <div className=\"rounded-md border border-border bg-surface-2 p-2\">\n <div className=\"flex min-h-8 flex-wrap items-center gap-1.5\">\n {selected.length === 0 ? (\n <span className=\"px-1 text-xs text-text-muted\">{t('security.sender.emptyMembers')}</span>\n ) : selected.map((item) => (\n <Badge key={item} variant=\"secondary\" className=\"normal-case tracking-normal\">\n <span className=\"font-mono\">{item}</span>\n <button\n type=\"button\"\n className=\"ml-1 rounded-full text-text-dim hover:text-text\"\n onClick={() => onMembersChange(selected.filter((value) => value !== item))}\n aria-label={t('security.sender.removeMember', { value: item })}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n ))}\n </div>\n\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" disabled={loading}>\n {loading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Plus className=\"h-4 w-4\" />}\n {t('security.sender.chooseMembers')}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"max-h-80 w-80 overflow-y-auto\">\n <DropdownMenuLabel>{t('security.sender.chooseMembers')}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {choices.length === 0 ? (\n <div className=\"px-2 py-2 text-sm text-text-muted\">{t('security.sender.noChoices')}</div>\n ) : choices.map((choice) => (\n <DropdownMenuCheckboxItem\n key={choice.value}\n checked={selectedSet.has(choice.value)}\n onCheckedChange={() => toggle(choice.value)}\n onSelect={(event) => event.preventDefault()}\n className=\"items-start gap-2\"\n >\n <span className=\"min-w-0\">\n <span className=\"block truncate font-mono text-xs\">{choice.label}</span>\n {choice.detail && (\n <span className=\"mt-0.5 block truncate text-xs text-text-muted\">{choice.detail}</span>\n )}\n </span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n <div className=\"flex min-w-[220px] flex-1 gap-2\">\n <Input\n value={custom}\n onChange={(e) => setCustom(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n addCustom()\n }\n }}\n placeholder={t('security.sender.placeholder')}\n className=\"h-7 font-mono text-xs\"\n />\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" onClick={addCustom} disabled={!custom.trim()}>\n {t('security.sender.addCustom')}\n </Button>\n </div>\n </div>\n </div>\n ) : (\n <p className=\"flex items-start gap-2 text-xs text-text-muted\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-warning\" />\n <span>{t('security.sender.openHint')}</span>\n </p>\n )}\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={onSave}\n disabled={saving || !dirty || (mode === 'restricted' && selected.length === 0)}\n >\n {saving ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <ShieldCheck className=\"h-4 w-4\" />}\n {t('security.sender.save')}\n </Button>\n <span className=\"text-[10px] text-text-muted\">\n {dirty ? t('security.sender.unsaved') : t('security.sender.saved')}\n </span>\n </div>\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 rounded-md border border-border bg-surface p-3\">\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-text-muted' : 'text-warning')}>{text}</div>\n </div>\n </li>\n )\n}\n\nfunction ControlCard({\n id, title, description, envKey, children,\n}: { id?: string; title: string; description: string; envKey?: string; children: React.ReactNode }): JSX.Element {\n return (\n <section id={id} className=\"rounded-md border border-border bg-surface p-4 shadow-sm\">\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-text-dim\">{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-text-dim\">{label}</label>\n {children}\n {hint && <p className=\"text-[10px] text-text-muted\">{hint}</p>}\n </div>\n )\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n const out: string[] = []\n const seen = new Set<string>()\n for (const raw of values) {\n const value = raw.trim()\n if (!value || seen.has(value)) continue\n seen.add(value)\n out.push(value)\n }\n return out\n}\n\nfunction imUserKey(user: KnownImUser): string {\n return `${user.platform}:${user.userId}`\n}\n\nfunction formatSeenAt(value: string): string {\n const dt = new Date(value)\n if (Number.isNaN(dt.getTime())) return value\n return dt.toLocaleString()\n}\n"],"names":["envBool","v","t","parseSenderAllowlist","raw","value","uniqueStrings","serializeSenderAllowlist","mode","members","values","senderValueFingerprint","SettingsSecurityRoute","useTranslation","envQuery","useEnv","updateEnv","useUpdateEnv","adminsQuery","useAdminAllowlist","diagnostics","setDiagnostics","useState","diagLoading","setDiagLoading","senderMode","setSenderMode","senderMembers","setSenderMembers","loadDiagnostics","res","client","err","toast","describeError","useEffect","setValue","key","env","senderParsed","useMemo","senderChoices","choices","u","imUserKey","formatSeenAt","member","a","b","senderDirty","saveSenderAllowlist","next","jsxs","jsx","Button","Loader2","RefreshCcw","SecurityPosture","ControlCard","SenderAllowlistEditor","DiagnosticsPanel","LabeledField","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","e","loading","onSetValue","sender","issues","rows","Link","dangerCount","issue","ready","cn","ShieldCheck","ShieldAlert","Badge","DiagRow","explicitOpen","dirty","saving","onModeChange","onMembersChange","onSave","custom","setCustom","selected","selectedSet","toggle","item","addCustom","parsed","X","DropdownMenu","DropdownMenuTrigger","Plus","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","choice","DropdownMenuCheckboxItem","event","AlertTriangle","label","ok","text","CheckCircle2","id","title","description","envKey","children","hint","out","seen","user","dt"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{h as e}from"./index-DCfdN5R7.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 y=e("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);export{y as S};
|
|
7
|
+
//# sourceMappingURL=server-Dg4e8pvm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-Dg4e8pvm.js","sources":["../../node_modules/lucide-react/dist/esm/icons/server.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Server = createLucideIcon(\"Server\", [\n [\"rect\", { width: \"20\", height: \"8\", x: \"2\", y: \"2\", rx: \"2\", ry: \"2\", key: \"ngkwjq\" }],\n [\"rect\", { width: \"20\", height: \"8\", x: \"2\", y: \"14\", rx: \"2\", ry: \"2\", key: \"iecqi9\" }],\n [\"line\", { x1: \"6\", x2: \"6.01\", y1: \"6\", y2: \"6\", key: \"16zg32\" }],\n [\"line\", { x1: \"6\", x2: \"6.01\", y1: \"18\", y2: \"18\", key: \"nzw8ys\" }]\n]);\n\nexport { Server as default };\n//# sourceMappingURL=server.js.map\n"],"names":["Server","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,IAAK,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,SAAU,EACtF,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,IAAK,EAAG,IAAK,EAAG,KAAM,GAAI,IAAK,GAAI,IAAK,IAAK,SAAU,EACvF,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,OAAQ,GAAI,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EACjE,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,OAAQ,GAAI,KAAM,GAAI,KAAM,IAAK,QAAQ,CAAE,CACrE,CAAC","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{h as U,u as y,j as e,e as u,d as j,R as O,f as N,p as l,q as f,X as q,w as M,I as W}from"./index-DCfdN5R7.js";import{r as g}from"./react-DlP5eolq.js";import{C as R}from"./confirm-dialog-BDb0NLny.js";import{a as $,e as Q,n as H,f as V,u as X,d as G,o as J}from"./use-settings-DGIjmUX0.js";import{L as k}from"./loader-circle-DDdmcH0k.js";import{R as T}from"./refresh-ccw-DlAd-eTQ.js";import{P as K}from"./play-DX5wp4WH.js";import{N as Y}from"./network-BUeWK3bs.js";import{S as Z}from"./save-BDOtZrfp.js";import{T as L}from"./terminal-_pXeEjXG.js";import{F as b}from"./file-text-BxfdLM0-.js";import{C as ee}from"./copy-CD4A7VD8.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 se=U("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]),te={systemd:"success",background:"info",foreground:"warning",none:"default"},A=3e3,F=9090;function be(){const{t:s}=y(["settings","common"]),r=$(),t=r.data,a=t&&t.mode!=="none",n=Q(),i=H(),c=V(),[m,o]=g.useState(!1),[h,v]=g.useState(!1);async function w(){try{await n.mutateAsync(),l.success(s("service.toast.started"))}catch(d){l.error(f(d,s).message)}}async function x(){try{await i.mutateAsync(),l.success(s("service.toast.stopped"))}catch(d){throw l.error(f(d,s).message),d}}async function p(){try{await c.mutateAsync(),l.success(s("service.toast.restarted"))}catch(d){throw l.error(f(d,s).message),d}}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(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(k,{className:"h-4 w-4 animate-spin"}):e.jsx(T,{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(ne,{}),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(j,{variant:te[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(u,{type:"button",variant:"default",size:"sm",disabled:a||n.isPending,onClick:()=>void w(),children:[n.isPending?e.jsx(k,{className:"h-4 w-4 animate-spin"}):e.jsx(K,{className:"h-4 w-4"}),s("service.actions.start")]}),e.jsxs(u,{type:"button",variant:"outline",size:"sm",disabled:!a||c.isPending,onClick:()=>v(!0),children:[e.jsx(O,{className:N("h-4 w-4",c.isPending&&"animate-spin")}),s("service.actions.restart")]}),e.jsxs(u,{type:"button",variant:"destructive",size:"sm",disabled:!a||i.isPending,onClick:()=>o(!0),children:[e.jsx(se,{className:"h-4 w-4"}),s("service.actions.stop")]})]})]}):null,e.jsx(re,{service:t}),e.jsx(R,{open:m,onOpenChange:o,title:s("service.actions.confirmStop"),description:s("service.actions.confirmStopDesc"),intent:"danger",confirmLabel:s("service.actions.stop"),onConfirm:x}),e.jsx(R,{open:h,onOpenChange:v,title:s("service.actions.confirmRestart"),description:s("service.actions.confirmRestartDesc"),intent:"danger",confirmLabel:s("service.actions.restart"),onConfirm:p})]})}function re({service:s}){const{t:r}=y(["settings","common"]),t=J(120),a=t.data?.path??"~/.agim/agim.log",n=!!(s&&s.mode!=="none"),i=!!(n&&s?.bootPhase&&s.bootPhase!=="ready"),c=s?n?i?"booting":"running":"stopped":"loading",m=t.data?.exists===!0;async function o(v){try{await navigator.clipboard.writeText(v),l.success(r("service.recovery.toast.copied"))}catch{l.error(r("service.recovery.toast.copyFailed"))}}const h=`tail -n 120 ${ie(a)}`;return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex flex-col gap-2 border-b border-border px-4 py-3 sm:flex-row sm:items-center",children:[e.jsxs("div",{className:"flex min-w-0 flex-1 items-center gap-2",children:[e.jsx(L,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:r("service.recovery.title")}),e.jsx(j,{variant:c==="running"?"success":c==="stopped"?"warning":"info",children:r(`service.recovery.state.${c}`)})]}),e.jsxs(u,{type:"button",variant:"ghost",size:"sm",disabled:t.isFetching,onClick:()=>void t.refetch(),children:[e.jsx(T,{className:N("h-4 w-4",t.isFetching&&"animate-spin")}),e.jsx("span",{children:r("service.recovery.refreshLog")})]})]}),e.jsxs("div",{className:"grid gap-4 p-4 lg:grid-cols-[minmax(0,0.85fr)_minmax(0,1.15fr)]",children:[e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("p",{className:"text-sm text-text-dim",children:c==="running"?r("service.recovery.detail.running"):c==="booting"?r("service.recovery.detail.booting",{phase:s?.bootPhase??""}):r(c==="stopped"?"service.recovery.detail.stopped":"service.recovery.detail.loading")}),e.jsxs("div",{className:"grid gap-2",children:[e.jsx(S,{icon:e.jsx(L,{className:"h-4 w-4"}),label:r("service.recovery.commands.doctor"),command:"agim doctor",onCopy:o}),e.jsx(S,{icon:e.jsx(b,{className:"h-4 w-4"}),label:r("service.recovery.commands.status"),command:"agim status",onCopy:o}),m?e.jsx(S,{icon:e.jsx(b,{className:"h-4 w-4"}),label:r("service.recovery.commands.tail"),command:h,onCopy:o}):e.jsx(ae,{icon:e.jsx(b,{className:"h-4 w-4"}),label:r("service.recovery.commands.tailPending"),detail:t.isLoading?r("service.recovery.commands.tailChecking"):r("service.recovery.commands.tailPendingDetail")})]})]}),e.jsxs("div",{className:"min-w-0 rounded-md border border-border bg-surface-2",children:[e.jsxs("div",{className:"flex items-center gap-2 border-b border-border px-3 py-2",children:[e.jsx(b,{className:"h-4 w-4 text-text-dim"}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-xs font-medium",children:a}),t.data?.truncated&&e.jsx(j,{variant:"warning",children:r("service.recovery.truncated")})]}),t.isLoading?e.jsx("div",{className:"h-40 animate-pulse"}):t.isError?e.jsx("p",{className:"p-3 text-sm text-danger",children:f(t.error,r).message}):t.data?.exists?e.jsx("pre",{className:"max-h-72 overflow-auto whitespace-pre-wrap break-words p-3 font-mono text-[11px] leading-5 text-text-dim",children:t.data.content||r("service.recovery.logEmpty")}):e.jsx("p",{className:"p-3 text-sm text-text-dim",children:r("service.recovery.logMissing")})]})]})]})}function ae({icon:s,label:r,detail:t}){return e.jsxs("div",{className:"flex min-w-0 items-center gap-2 rounded-md border border-border bg-surface-2 px-3 py-2",children:[e.jsx("span",{className:"text-text-dim","aria-hidden":"true",children:s}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-xs font-medium",children:r}),e.jsx("p",{className:"text-[11px] text-text-dim",children:t})]})]})}function S({icon:s,label:r,command:t,onCopy:a}){return e.jsxs("div",{className:"flex min-w-0 items-center gap-2 rounded-md border border-border bg-surface-2 px-3 py-2",children:[e.jsx("span",{className:"text-text-dim","aria-hidden":"true",children:s}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-xs font-medium",children:r}),e.jsx("code",{className:"block truncate text-[11px] text-text-dim",children:t})]}),e.jsx(u,{type:"button",variant:"ghost",size:"sm",onClick:()=>void a(t),"aria-label":r,children:e.jsx(ee,{className:"h-4 w-4"})})]})}function ie(s){return`'${s.replace(/'/g,"'\\''")}'`}function D(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 ne(){const{t:s}=y(["settings","common"]),r=X(),t=G(),a=r.data,n=a?.webPort,i=a?.acpPort,[c,m]=g.useState(""),[o,h]=g.useState(""),[v,w]=g.useState(0);g.useEffect(()=>{a&&r.dataUpdatedAt!==v&&(m(n!=null?String(n):""),h(i!=null?String(i):""),w(r.dataUpdatedAt))},[a,r.dataUpdatedAt,n,i,v]);const x=D(c),p=D(o),d=!x.ok,C=!p.ok,z=g.useMemo(()=>{if(!a)return!1;const P=x.ok?x.value:void 0,B=p.ok?p.value:void 0;return P!==n||B!==i},[a,x,p,n,i]);function I(){m(n!=null?String(n):""),h(i!=null?String(i):"")}async function _(){if(!(!a||d||C))try{await t.mutateAsync({...a,webPort:x.ok?x.value:void 0,acpPort:p.ok?p.value:void 0}),l.success(s("service.ports.toast.saved"))}catch(P){l.error(f(P,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(Y,{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(E,{id:"web-port",label:s("service.ports.webPort"),hint:s("service.ports.webPortHint",{default:A}),value:c,onChange:m,invalid:d,placeholder:String(A)}),a?.features?.remoteAgent?e.jsx(E,{id:"acp-port",label:s("service.ports.acpPort"),hint:s("service.ports.acpPortHint",{default:F}),value:o,onChange:h,invalid:C,placeholder:String(F)}):null]}),z&&e.jsxs("div",{className:"flex items-center gap-2 border-t border-border px-4 py-3",children:[e.jsx(j,{variant:"warning",children:s("service.ports.restartRequired")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:I,disabled:t.isPending,children:[e.jsx(q,{className:"h-4 w-4"}),s("service.ports.discard")]}),e.jsxs(u,{size:"sm",onClick:()=>void _(),disabled:t.isPending||d||C,children:[t.isPending?e.jsx(k,{className:"h-4 w-4 animate-spin"}):e.jsx(Z,{className:"h-4 w-4"}),t.isPending?s("service.ports.saving"):s("service.ports.save")]})]})]})}function E({id:s,label:r,hint:t,value:a,onChange:n,invalid:i,placeholder:c}){const{t:m}=y("settings");return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(M,{htmlFor:s,className:"text-xs font-medium",children:r}),e.jsx(W,{id:s,type:"number",inputMode:"numeric",min:1,max:65535,value:a,onChange:o=>n(o.target.value),placeholder:c,"aria-invalid":i,className:N("font-mono",i&&"border-danger focus:ring-danger")}),e.jsx("p",{className:N("text-[11px]",i?"text-danger":"text-text-dim"),children:i?m("service.ports.invalidPort"):t})]})}export{be as default};
|
|
7
|
+
//# sourceMappingURL=service-gWZa3sup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-gWZa3sup.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 Copy, FileText, Loader2, Network, Play, RefreshCcw, RotateCcw, Save, Square, Terminal, 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 useServiceLogTail,\n useRestartService,\n useServiceStatus,\n useStartService,\n useStopService,\n useUpdateConfig,\n} from '@/hooks/use-settings'\nimport { describeError } from '@/lib/api/errors'\nimport type { ServiceMode, ServiceStatus } 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 <ServiceRecoveryCard service={data} />\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\nfunction ServiceRecoveryCard({ service }: { service?: ServiceStatus }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const logQuery = useServiceLogTail(120)\n const logPath = logQuery.data?.path ?? '~/.agim/agim.log'\n const isRunning = Boolean(service && service.mode !== 'none')\n const isBooting = Boolean(isRunning && service?.bootPhase && service.bootPhase !== 'ready')\n const state = !service ? 'loading' : !isRunning ? 'stopped' : isBooting ? 'booting' : 'running'\n const logExists = logQuery.data?.exists === true\n\n async function copy(text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text)\n toast.success(t('service.recovery.toast.copied'))\n } catch {\n toast.error(t('service.recovery.toast.copyFailed'))\n }\n }\n\n const tailCommand = `tail -n 120 ${shellQuote(logPath)}`\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"flex flex-col gap-2 border-b border-border px-4 py-3 sm:flex-row sm:items-center\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <Terminal className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('service.recovery.title')}</h2>\n <Badge variant={state === 'running' ? 'success' : state === 'stopped' ? 'warning' : 'info'}>\n {t(`service.recovery.state.${state}`)}\n </Badge>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={logQuery.isFetching}\n onClick={() => void logQuery.refetch()}\n >\n <RefreshCcw className={cn('h-4 w-4', logQuery.isFetching && 'animate-spin')} />\n <span>{t('service.recovery.refreshLog')}</span>\n </Button>\n </header>\n\n <div className=\"grid gap-4 p-4 lg:grid-cols-[minmax(0,0.85fr)_minmax(0,1.15fr)]\">\n <div className=\"flex flex-col gap-3\">\n <p className=\"text-sm text-text-dim\">\n {state === 'running'\n ? t('service.recovery.detail.running')\n : state === 'booting'\n ? t('service.recovery.detail.booting', { phase: service?.bootPhase ?? '' })\n : state === 'stopped'\n ? t('service.recovery.detail.stopped')\n : t('service.recovery.detail.loading')}\n </p>\n\n <div className=\"grid gap-2\">\n <RecoveryCommand\n icon={<Terminal className=\"h-4 w-4\" />}\n label={t('service.recovery.commands.doctor')}\n command=\"agim doctor\"\n onCopy={copy}\n />\n <RecoveryCommand\n icon={<FileText className=\"h-4 w-4\" />}\n label={t('service.recovery.commands.status')}\n command=\"agim status\"\n onCopy={copy}\n />\n {logExists ? (\n <RecoveryCommand\n icon={<FileText className=\"h-4 w-4\" />}\n label={t('service.recovery.commands.tail')}\n command={tailCommand}\n onCopy={copy}\n />\n ) : (\n <RecoveryInfo\n icon={<FileText className=\"h-4 w-4\" />}\n label={t('service.recovery.commands.tailPending')}\n detail={logQuery.isLoading\n ? t('service.recovery.commands.tailChecking')\n : t('service.recovery.commands.tailPendingDetail')}\n />\n )}\n </div>\n </div>\n\n <div className=\"min-w-0 rounded-md border border-border bg-surface-2\">\n <div className=\"flex items-center gap-2 border-b border-border px-3 py-2\">\n <FileText className=\"h-4 w-4 text-text-dim\" />\n <span className=\"min-w-0 flex-1 truncate text-xs font-medium\">{logPath}</span>\n {logQuery.data?.truncated && (\n <Badge variant=\"warning\">{t('service.recovery.truncated')}</Badge>\n )}\n </div>\n {logQuery.isLoading ? (\n <div className=\"h-40 animate-pulse\" />\n ) : logQuery.isError ? (\n <p className=\"p-3 text-sm text-danger\">{describeError(logQuery.error, t).message}</p>\n ) : !logQuery.data?.exists ? (\n <p className=\"p-3 text-sm text-text-dim\">{t('service.recovery.logMissing')}</p>\n ) : (\n <pre className=\"max-h-72 overflow-auto whitespace-pre-wrap break-words p-3 font-mono text-[11px] leading-5 text-text-dim\">\n {logQuery.data.content || t('service.recovery.logEmpty')}\n </pre>\n )}\n </div>\n </div>\n </section>\n )\n}\n\nfunction RecoveryInfo({\n icon,\n label,\n detail,\n}: {\n icon: JSX.Element\n label: string\n detail: string\n}): JSX.Element {\n return (\n <div className=\"flex min-w-0 items-center gap-2 rounded-md border border-border bg-surface-2 px-3 py-2\">\n <span className=\"text-text-dim\" aria-hidden=\"true\">{icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium\">{label}</div>\n <p className=\"text-[11px] text-text-dim\">{detail}</p>\n </div>\n </div>\n )\n}\n\nfunction RecoveryCommand({\n icon,\n label,\n command,\n onCopy,\n}: {\n icon: JSX.Element\n label: string\n command: string\n onCopy: (text: string) => Promise<void>\n}): JSX.Element {\n return (\n <div className=\"flex min-w-0 items-center gap-2 rounded-md border border-border bg-surface-2 px-3 py-2\">\n <span className=\"text-text-dim\" aria-hidden=\"true\">{icon}</span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium\">{label}</div>\n <code className=\"block truncate text-[11px] text-text-dim\">{command}</code>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void onCopy(command)}\n aria-label={label}\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </div>\n )\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`\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","ServiceRecoveryCard","ConfirmDialog","service","logQuery","useServiceLogTail","logPath","isBooting","state","logExists","copy","text","tailCommand","shellQuote","Terminal","RecoveryCommand","FileText","RecoveryInfo","icon","label","detail","command","onCopy","Copy","value","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","hint","onChange","invalid","placeholder","Label","Input","e"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{h as e}from"./index-DCfdN5R7.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const t=e("ShieldAlert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);export{t as S};
|
|
7
|
-
//# sourceMappingURL=shield-alert-
|
|
7
|
+
//# sourceMappingURL=shield-alert-DOKK9EnJ.js.map
|
package/dist/web/public/assets/{shield-alert-WOa69jy3.js.map → shield-alert-DOKK9EnJ.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shield-alert-
|
|
1
|
+
{"version":3,"file":"shield-alert-DOKK9EnJ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/shield-alert.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ShieldAlert = createLucideIcon(\"ShieldAlert\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ],\n [\"path\", { d: \"M12 8v4\", key: \"1got3b\" }],\n [\"path\", { d: \"M12 16h.01\", key: \"1drbdi\" }]\n]);\n\nexport { ShieldAlert as default };\n//# sourceMappingURL=shield-alert.js.map\n"],"names":["ShieldAlert","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAcC,EAAiB,cAAe,CAClD,CACE,OACA,CACE,EAAG,qKACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,CAAC","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{h as a}from"./index-DCfdN5R7.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 p=a("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);export{p as S};
|
|
7
|
+
//# sourceMappingURL=sparkles-G0QIs9nP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparkles-G0QIs9nP.js","sources":["../../node_modules/lucide-react/dist/esm/icons/sparkles.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Sparkles = createLucideIcon(\"Sparkles\", [\n [\n \"path\",\n {\n d: \"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\",\n key: \"4pj2yx\"\n }\n ],\n [\"path\", { d: \"M20 3v4\", key: \"1olli1\" }],\n [\"path\", { d: \"M22 5h-4\", key: \"1gvqau\" }],\n [\"path\", { d: \"M4 17v2\", key: \"vumght\" }],\n [\"path\", { d: \"M5 18H3\", key: \"zchphs\" }]\n]);\n\nexport { Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n"],"names":["Sparkles","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CACE,OACA,CACE,EAAG,8PACH,IAAK,QACX,CACA,EACE,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,EACxC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAQ,CAAE,CAC1C,CAAC","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as L,a as z,b as Q,j as e,M as S,B as C,P as E,d as k,e as c,L as g,f as A,C as T,g as _}from"./index-DCfdN5R7.js";import{u as D,a as M}from"./use-settings-DGIjmUX0.js";import{u as P}from"./use-workspace-CuytyHwb.js";import{R as q}from"./refresh-ccw-DlAd-eTQ.js";import{S as G}from"./server-Dg4e8pvm.js";import{A as F}from"./arrow-right-A889Wof8.js";import{L as $}from"./loader-circle-DDdmcH0k.js";import"./react-DlP5eolq.js";const H={done:"success",todo:"outline",warn:"warning",loading:"info"};function ee(){const{t:s}=L("settings"),t=D(),a=M(),r=P(),l=z(),d=t.data,i=d?.defaultAgent||d?.agents?.[0]||"",m=i?Q(i):s("start.unknown"),o=i?r.data?.[i]:void 0,R=t.isLoading||r.isLoading,x=a.data,h=!!(x&&x.mode!=="none"),f=(l.data?.backends??[]).filter(n=>n.secret.source!=="none"),u=f.length>0,p=d?.messengers??[],j=p.length>0,w=a.isLoading?"loading":h?"done":"warn",b=R?"loading":o===!0?"done":o===!1?"warn":i?"todo":"warn",N=l.isLoading?"loading":u?"done":"todo",v=t.isLoading?"loading":j?"done":"todo",y=[w,b,v,N].filter(n=>n==="done").length,B=[{id:"web",state:w,icon:e.jsx(S,{}),title:s("start.steps.web.title"),detail:h?s("start.steps.web.ready",{mode:x?.mode??""}):s("start.steps.web.needsStart"),action:s("start.steps.web.action"),to:"/?welcome=1"},{id:"agent",state:b,icon:e.jsx(C,{}),title:s("start.steps.agent.title"),detail:o===!0?s("start.steps.agent.ready",{agent:m}):o===!1?s("start.steps.agent.offline",{agent:m}):i?s("start.steps.agent.selected",{agent:m}):s("start.steps.agent.empty"),action:s("start.steps.agent.action"),to:"/settings/agents"},{id:"llm",state:N,icon:e.jsx(C,{}),title:s("start.steps.llm.title"),detail:u?s("start.steps.llm.ready",{count:f.length}):s("start.steps.llm.empty"),action:s("start.steps.llm.action"),to:"/settings/llm"},{id:"im",state:v,icon:e.jsx(E,{}),title:s("start.steps.im.title"),detail:j?s("start.steps.im.ready",{platforms:p.map(n=>J(n,s)).join(", ")}):s("start.steps.im.empty"),action:s("start.steps.im.action"),to:"/settings/messengers"}];return e.jsxs("div",{className:"mx-auto flex max-w-5xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-3 border-b border-border pb-4 sm:flex-row sm:items-end",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("start.title")}),e.jsxs(k,{variant:y>=3?"success":"info",children:[y,"/4"]})]}),e.jsx("p",{className:"mt-1 max-w-2xl text-sm text-text-dim",children:s("start.subtitle")})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(c,{asChild:!0,size:"sm",children:e.jsxs(g,{to:"/?welcome=1",children:[e.jsx(S,{className:"h-4 w-4"}),e.jsx("span",{children:s("start.actions.chat")})]})}),e.jsxs(c,{type:"button",variant:"ghost",size:"sm",disabled:t.isFetching||a.isFetching||r.isFetching||l.isFetching,onClick:()=>{t.refetch(),a.refetch(),r.refetch(),l.refetch()},children:[e.jsx(q,{className:A("h-4 w-4",(t.isFetching||a.isFetching||r.isFetching||l.isFetching)&&"animate-spin")}),e.jsx("span",{children:s("start.actions.refresh")})]})]})]}),e.jsx("section",{className:"grid gap-3 sm:grid-cols-2",children:B.map(n=>e.jsx(I,{step:n},n.id))}),e.jsx("section",{className:"rounded-md border border-border bg-surface p-4",children:e.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center",children:[e.jsx("span",{className:"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-surface-2 text-text-dim",children:e.jsx(G,{className:"h-4 w-4"})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("h2",{className:"text-sm font-semibold",children:s("start.deploy.title")}),e.jsx("p",{className:"mt-1 text-sm text-text-dim",children:s("start.deploy.detail")})]}),e.jsx(c,{asChild:!0,variant:"secondary",size:"sm",children:e.jsxs(g,{to:"/settings/service",children:[e.jsx("span",{children:s("start.deploy.action")}),e.jsx(F,{className:"h-4 w-4"})]})})]})})]})}function I({step:s}){const{t}=L("settings"),a=s.state==="done";return e.jsx("article",{className:"rounded-md border border-border bg-surface p-4",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("span",{className:A("flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-surface-2",s.state==="done"&&"text-success",s.state==="warn"&&"text-warning",s.state==="todo"&&"text-text-dim",s.state==="loading"&&"text-info","[&_svg]:h-4 [&_svg]:w-4"),"aria-hidden":"true",children:s.state==="done"?e.jsx(T,{}):s.state==="warn"?e.jsx(_,{}):s.state==="loading"?e.jsx($,{className:"animate-spin"}):s.icon}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold",children:s.title}),e.jsx(k,{variant:H[s.state],children:t(`start.state.${s.state}`)})]}),e.jsx("p",{className:"mt-1 text-sm text-text-dim",children:s.detail}),e.jsx(c,{asChild:!0,variant:a?"ghost":"secondary",size:"sm",className:"mt-3",children:e.jsxs(g,{to:s.to,children:[e.jsx("span",{children:s.action}),e.jsx(F,{className:"h-4 w-4"})]})})]})]})})}function J(s,t){return{"wechat-ilink":t("messengers.platform.wechat"),telegram:t("messengers.platform.telegram"),feishu:t("messengers.platform.feishu"),dingtalk:t("messengers.platform.dingtalk"),discord:t("messengers.platform.discord"),email:t("tabs.email")}[s]??s}export{ee as default};
|
|
2
|
+
//# sourceMappingURL=start-D-abhl3q.js.map
|