agim-cli 1.3.2 → 1.3.4
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 +11 -0
- package/dist/cli-ui/config-wizard.d.ts.map +1 -1
- package/dist/cli-ui/config-wizard.js +222 -98
- package/dist/cli-ui/config-wizard.js.map +1 -1
- package/dist/cli-ui/i18n.d.ts +42 -8
- package/dist/cli-ui/i18n.d.ts.map +1 -1
- package/dist/cli-ui/i18n.js +88 -16
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/setup-llm.d.ts.map +1 -1
- package/dist/cli-ui/setup-llm.js +38 -13
- package/dist/cli-ui/setup-llm.js.map +1 -1
- package/dist/cli-ui/setup-mcp.d.ts.map +1 -1
- package/dist/cli-ui/setup-mcp.js +31 -2
- package/dist/cli-ui/setup-mcp.js.map +1 -1
- package/dist/cli-ui/tui/app.d.ts +4 -1
- package/dist/cli-ui/tui/app.d.ts.map +1 -1
- package/dist/cli-ui/tui/app.js +240 -6
- package/dist/cli-ui/tui/app.js.map +1 -1
- package/dist/cli-ui/tui/approval-bridge.d.ts +61 -0
- package/dist/cli-ui/tui/approval-bridge.d.ts.map +1 -0
- package/dist/cli-ui/tui/approval-bridge.js +274 -0
- package/dist/cli-ui/tui/approval-bridge.js.map +1 -0
- package/dist/cli-ui/tui/approval-view.d.ts +15 -0
- package/dist/cli-ui/tui/approval-view.d.ts.map +1 -0
- package/dist/cli-ui/tui/approval-view.js +46 -0
- package/dist/cli-ui/tui/approval-view.js.map +1 -0
- package/dist/cli-ui/tui/index.d.ts.map +1 -1
- package/dist/cli-ui/tui/index.js +31 -0
- package/dist/cli-ui/tui/index.js.map +1 -1
- package/dist/cli.js +56 -2
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-cwd.js +1 -1
- package/dist/core/ask-user-rpc.d.ts +36 -14
- package/dist/core/ask-user-rpc.d.ts.map +1 -1
- package/dist/core/ask-user-rpc.js +309 -34
- package/dist/core/ask-user-rpc.js.map +1 -1
- package/dist/core/commands/builtin.d.ts.map +1 -1
- package/dist/core/commands/builtin.js +15 -6
- package/dist/core/commands/builtin.js.map +1 -1
- package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -1
- package/dist/core/llm/imhub-dispatcher.js +6 -1
- package/dist/core/llm/imhub-dispatcher.js.map +1 -1
- package/dist/core/onboarding.js +2 -2
- package/dist/core/onboarding.js.map +1 -1
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +12 -9
- package/dist/core/router.js.map +1 -1
- package/dist/core/types.d.ts +6 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +4 -0
- package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -1
- package/dist/plugins/agents/claude-code/mcp-approval-server.js +11 -6
- package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
- package/dist/plugins/agents/native/index.js +8 -8
- 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 +4 -3
- package/dist/plugins/agents/pi-native/factory.js.map +1 -1
- package/dist/web/llm-api.js +7 -4
- package/dist/web/llm-api.js.map +1 -1
- package/dist/web/public/assets/{a2a-Dtc6AKjx.js → a2a-Y30Sn8pc.js} +2 -2
- package/dist/web/public/assets/{a2a-Dtc6AKjx.js.map → a2a-Y30Sn8pc.js.map} +1 -1
- package/dist/web/public/assets/{activity-CWFI_ke7.js → activity--oN7qxFJ.js} +2 -2
- package/dist/web/public/assets/{activity-CWFI_ke7.js.map → activity--oN7qxFJ.js.map} +1 -1
- package/dist/web/public/assets/{admins-CeQorJdU.js → admins-DONiT3ld.js} +2 -2
- package/dist/web/public/assets/{admins-CeQorJdU.js.map → admins-DONiT3ld.js.map} +1 -1
- package/dist/web/public/assets/agents-DRbQOH0K.js +7 -0
- package/dist/web/public/assets/agents-DRbQOH0K.js.map +1 -0
- package/dist/web/public/assets/{approvals-BEPKSyrL.js → approvals-C5jd7Wf9.js} +2 -2
- package/dist/web/public/assets/{approvals-BEPKSyrL.js.map → approvals-C5jd7Wf9.js.map} +1 -1
- package/dist/web/public/assets/{arrow-down-CzWGZc48.js → arrow-down-x-Lq92tn.js} +2 -2
- package/dist/web/public/assets/{arrow-down-CzWGZc48.js.map → arrow-down-x-Lq92tn.js.map} +1 -1
- package/dist/web/public/assets/{arrow-up-CXy94NPi.js → arrow-up-Cc28qbjN.js} +2 -2
- package/dist/web/public/assets/{arrow-up-CXy94NPi.js.map → arrow-up-Cc28qbjN.js.map} +1 -1
- package/dist/web/public/assets/{asks-BszsbhPn.js → asks-CeVcu8SD.js} +2 -2
- package/dist/web/public/assets/{asks-BszsbhPn.js.map → asks-CeVcu8SD.js.map} +1 -1
- package/dist/web/public/assets/{audit-ACrwMizd.js → audit-Dc9_FDkW.js} +2 -2
- package/dist/web/public/assets/{audit-ACrwMizd.js.map → audit-Dc9_FDkW.js.map} +1 -1
- package/dist/web/public/assets/{bell-BLwNOhXO.js → bell-CxPf_Xzs.js} +2 -2
- package/dist/web/public/assets/{bell-BLwNOhXO.js.map → bell-CxPf_Xzs.js.map} +1 -1
- package/dist/web/public/assets/{bgjobs-Cwp0PmTF.js → bgjobs-CYjmAJgs.js} +2 -2
- package/dist/web/public/assets/{bgjobs-Cwp0PmTF.js.map → bgjobs-CYjmAJgs.js.map} +1 -1
- package/dist/web/public/assets/{brain-5AJBYzXX.js → brain-DjCfwBAT.js} +2 -2
- package/dist/web/public/assets/{brain-5AJBYzXX.js.map → brain-DjCfwBAT.js.map} +1 -1
- package/dist/web/public/assets/{briefcase-BTDurkZz.js → briefcase-Br1bd_VG.js} +2 -2
- package/dist/web/public/assets/{briefcase-BTDurkZz.js.map → briefcase-Br1bd_VG.js.map} +1 -1
- package/dist/web/public/assets/chat-uqxuXn2X.js +17 -0
- package/dist/web/public/assets/chat-uqxuXn2X.js.map +1 -0
- package/dist/web/public/assets/{chevron-left-CnLOhWHE.js → chevron-left-CN-4SIfi.js} +2 -2
- package/dist/web/public/assets/{chevron-left-CnLOhWHE.js.map → chevron-left-CN-4SIfi.js.map} +1 -1
- package/dist/web/public/assets/{chevron-right-CpWYrqTa.js → chevron-right-BhSTLH2K.js} +2 -2
- package/dist/web/public/assets/{chevron-right-CpWYrqTa.js.map → chevron-right-BhSTLH2K.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-DhcTh_uP.js → circle-check-B4UdHmdJ.js} +2 -2
- package/dist/web/public/assets/{circle-check-DhcTh_uP.js.map → circle-check-B4UdHmdJ.js.map} +1 -1
- package/dist/web/public/assets/{circle-check-big-CcknUEHz.js → circle-check-big-CvXnDqiF.js} +2 -2
- package/dist/web/public/assets/{circle-check-big-CcknUEHz.js.map → circle-check-big-CvXnDqiF.js.map} +1 -1
- package/dist/web/public/assets/{circle-x-QODE2UcL.js → circle-x-B8y8mLHr.js} +2 -2
- package/dist/web/public/assets/{circle-x-QODE2UcL.js.map → circle-x-B8y8mLHr.js.map} +1 -1
- package/dist/web/public/assets/{clock-BPBx4QWT.js → clock-CK2KO_Rc.js} +2 -2
- package/dist/web/public/assets/{clock-BPBx4QWT.js.map → clock-CK2KO_Rc.js.map} +1 -1
- package/dist/web/public/assets/{confirm-dialog-HsyBgWxC.js → confirm-dialog-GZyIzSwj.js} +2 -2
- package/dist/web/public/assets/{confirm-dialog-HsyBgWxC.js.map → confirm-dialog-GZyIzSwj.js.map} +1 -1
- package/dist/web/public/assets/{copy-VJNELMp7.js → copy-CDCgL5Yq.js} +2 -2
- package/dist/web/public/assets/{copy-VJNELMp7.js.map → copy-CDCgL5Yq.js.map} +1 -1
- package/dist/web/public/assets/{data-table-C0yaCeSS.js → data-table-1cGunUIX.js} +2 -2
- package/dist/web/public/assets/{data-table-C0yaCeSS.js.map → data-table-1cGunUIX.js.map} +1 -1
- package/dist/web/public/assets/{download-EUh-RXv5.js → download-CuLP0G-q.js} +2 -2
- package/dist/web/public/assets/{download-EUh-RXv5.js.map → download-CuLP0G-q.js.map} +1 -1
- package/dist/web/public/assets/{email-YUzrp4Tf.js → email-Q-SY9qC9.js} +2 -2
- package/dist/web/public/assets/{email-YUzrp4Tf.js.map → email-Q-SY9qC9.js.map} +1 -1
- package/dist/web/public/assets/{empty-state-DoiBKL4l.js → empty-state-BRsb30K6.js} +2 -2
- package/dist/web/public/assets/{empty-state-DoiBKL4l.js.map → empty-state-BRsb30K6.js.map} +1 -1
- package/dist/web/public/assets/{external-link-Bf2430Ji.js → external-link-D-E90Kfw.js} +2 -2
- package/dist/web/public/assets/{external-link-Bf2430Ji.js.map → external-link-D-E90Kfw.js.map} +1 -1
- package/dist/web/public/assets/{eye-vE4k-Us-.js → eye-DSu_4mW2.js} +2 -2
- package/dist/web/public/assets/{eye-vE4k-Us-.js.map → eye-DSu_4mW2.js.map} +1 -1
- package/dist/web/public/assets/{facts-BPVTGzM4.js → facts-pmGTfGmv.js} +2 -2
- package/dist/web/public/assets/{facts-BPVTGzM4.js.map → facts-pmGTfGmv.js.map} +1 -1
- package/dist/web/public/assets/goals-DpRm9-av.js +17 -0
- package/dist/web/public/assets/goals-DpRm9-av.js.map +1 -0
- package/dist/web/public/assets/{health-CSMAArAj.js → health-mqoH7KDV.js} +2 -2
- package/dist/web/public/assets/{health-CSMAArAj.js.map → health-mqoH7KDV.js.map} +1 -1
- package/dist/web/public/assets/{heart-pulse-8RDC8GWv.js → heart-pulse-CrCHhXtC.js} +2 -2
- package/dist/web/public/assets/{heart-pulse-8RDC8GWv.js.map → heart-pulse-CrCHhXtC.js.map} +1 -1
- package/dist/web/public/assets/{heartbeat-BzHZy7Mx.js → heartbeat-EGjLHWU0.js} +2 -2
- package/dist/web/public/assets/{heartbeat-BzHZy7Mx.js.map → heartbeat-EGjLHWU0.js.map} +1 -1
- package/dist/web/public/assets/hot-B9x1_5yx.js +12 -0
- package/dist/web/public/assets/hot-B9x1_5yx.js.map +1 -0
- package/dist/web/public/assets/index-BIBWEKxu.js +204 -0
- package/dist/web/public/assets/index-BIBWEKxu.js.map +1 -0
- package/dist/web/public/assets/{injection-a2kkgRbT.js → injection-CDx5n-mk.js} +2 -2
- package/dist/web/public/assets/{injection-a2kkgRbT.js.map → injection-CDx5n-mk.js.map} +1 -1
- package/dist/web/public/assets/{installed-XQQEPKh8.js → installed-DV7X4wfv.js} +5 -5
- package/dist/web/public/assets/{installed-XQQEPKh8.js.map → installed-DV7X4wfv.js.map} +1 -1
- package/dist/web/public/assets/{jobs-Cby1Eq4o.js → jobs-zAigElCl.js} +2 -2
- package/dist/web/public/assets/{jobs-Cby1Eq4o.js.map → jobs-zAigElCl.js.map} +1 -1
- package/dist/web/public/assets/{layout-BdtJtlu5.js → layout-7wcifbsm.js} +2 -2
- package/dist/web/public/assets/{layout-BdtJtlu5.js.map → layout-7wcifbsm.js.map} +1 -1
- package/dist/web/public/assets/{layout-BRnEPnky.js → layout-B0RjH6M2.js} +2 -2
- package/dist/web/public/assets/{layout-BRnEPnky.js.map → layout-B0RjH6M2.js.map} +1 -1
- package/dist/web/public/assets/{layout-Gh29ouFO.js → layout-C6q-GbBZ.js} +2 -2
- package/dist/web/public/assets/{layout-Gh29ouFO.js.map → layout-C6q-GbBZ.js.map} +1 -1
- package/dist/web/public/assets/layout-CzjqlPxW.js +2 -0
- package/dist/web/public/assets/layout-CzjqlPxW.js.map +1 -0
- package/dist/web/public/assets/{layout-CbqldDRj.js → layout-DOSpVfND.js} +2 -2
- package/dist/web/public/assets/{layout-CbqldDRj.js.map → layout-DOSpVfND.js.map} +1 -1
- package/dist/web/public/assets/llm-DwZX5fwY.js +27 -0
- package/dist/web/public/assets/llm-DwZX5fwY.js.map +1 -0
- package/dist/web/public/assets/{loader-circle-DO3Ni2RJ.js → loader-circle-BQkLEJZw.js} +2 -2
- package/dist/web/public/assets/{loader-circle-DO3Ni2RJ.js.map → loader-circle-BQkLEJZw.js.map} +1 -1
- package/dist/web/public/assets/{map-pin-BsL35E1s.js → map-pin-B-IMY07m.js} +2 -2
- package/dist/web/public/assets/{map-pin-BsL35E1s.js.map → map-pin-B-IMY07m.js.map} +1 -1
- package/dist/web/public/assets/{mcp-CWMdxcBf.js → mcp-K0P3-b6q.js} +2 -2
- package/dist/web/public/assets/{mcp-CWMdxcBf.js.map → mcp-K0P3-b6q.js.map} +1 -1
- package/dist/web/public/assets/{memos-BYQa4d2t.js → memos-DcpDEVN8.js} +2 -2
- package/dist/web/public/assets/{memos-BYQa4d2t.js.map → memos-DcpDEVN8.js.map} +1 -1
- package/dist/web/public/assets/{messengers-CebazAJ1.js → messengers-DmrNvPMS.js} +2 -2
- package/dist/web/public/assets/{messengers-CebazAJ1.js.map → messengers-DmrNvPMS.js.map} +1 -1
- package/dist/web/public/assets/{mobile-CMJRNHs2.js → mobile-a-oUiAoR.js} +2 -2
- package/dist/web/public/assets/{mobile-CMJRNHs2.js.map → mobile-a-oUiAoR.js.map} +1 -1
- package/dist/web/public/assets/{network-pNcx_slv.js → network-Bbh3j5ew.js} +2 -2
- package/dist/web/public/assets/{network-pNcx_slv.js.map → network-Bbh3j5ew.js.map} +1 -1
- package/dist/web/public/assets/{outbox-87hzZQLn.js → outbox-BP_hfANb.js} +2 -2
- package/dist/web/public/assets/{outbox-87hzZQLn.js.map → outbox-BP_hfANb.js.map} +1 -1
- package/dist/web/public/assets/{pagination-C4edFAqf.js → pagination-CPLj3V0r.js} +2 -2
- package/dist/web/public/assets/{pagination-C4edFAqf.js.map → pagination-CPLj3V0r.js.map} +1 -1
- package/dist/web/public/assets/{persona-BcOT3Wms.js → persona-CT38dLd4.js} +2 -2
- package/dist/web/public/assets/{persona-BcOT3Wms.js.map → persona-CT38dLd4.js.map} +1 -1
- package/dist/web/public/assets/plans-Msw85XkI.js +12 -0
- package/dist/web/public/assets/plans-Msw85XkI.js.map +1 -0
- package/dist/web/public/assets/{play-Bzdymasn.js → play-tH2nb1Kt.js} +2 -2
- package/dist/web/public/assets/{play-Bzdymasn.js.map → play-tH2nb1Kt.js.map} +1 -1
- package/dist/web/public/assets/{plus-BxjzY9Wh.js → plus-6MNGQidu.js} +2 -2
- package/dist/web/public/assets/{plus-BxjzY9Wh.js.map → plus-6MNGQidu.js.map} +1 -1
- package/dist/web/public/assets/{policy-Be-tMZZc.js → policy-BJ7zORVG.js} +2 -2
- package/dist/web/public/assets/{policy-Be-tMZZc.js.map → policy-BJ7zORVG.js.map} +1 -1
- package/dist/web/public/assets/{qr-code-D1V5cA_X.js → qr-code-DfsxFxoa.js} +2 -2
- package/dist/web/public/assets/{qr-code-D1V5cA_X.js.map → qr-code-DfsxFxoa.js.map} +1 -1
- package/dist/web/public/assets/{refresh-ccw-BhPAzZAa.js → refresh-ccw-CFPE6zD1.js} +2 -2
- package/dist/web/public/assets/{refresh-ccw-BhPAzZAa.js.map → refresh-ccw-CFPE6zD1.js.map} +1 -1
- package/dist/web/public/assets/{reminders-DEWtrlH_.js → reminders-CAUNAuDy.js} +2 -2
- package/dist/web/public/assets/{reminders-DEWtrlH_.js.map → reminders-CAUNAuDy.js.map} +1 -1
- package/dist/web/public/assets/{save-Cye8Vlu5.js → save-CNUmUMEf.js} +2 -2
- package/dist/web/public/assets/{save-Cye8Vlu5.js.map → save-CNUmUMEf.js.map} +1 -1
- package/dist/web/public/assets/{schedules-CuqRy3t8.js → schedules-C25NyoGh.js} +2 -2
- package/dist/web/public/assets/{schedules-CuqRy3t8.js.map → schedules-C25NyoGh.js.map} +1 -1
- package/dist/web/public/assets/{search-Dot_W5Eu.js → search-CaRTqZw1.js} +2 -2
- package/dist/web/public/assets/{search-Dot_W5Eu.js.map → search-CaRTqZw1.js.map} +1 -1
- package/dist/web/public/assets/{search-BQqVArrW.js → search-D9TZs0bG.js} +2 -2
- package/dist/web/public/assets/{search-BQqVArrW.js.map → search-D9TZs0bG.js.map} +1 -1
- package/dist/web/public/assets/{security-BB-YnetQ.js → security-BMGGzEwr.js} +2 -2
- package/dist/web/public/assets/{security-BB-YnetQ.js.map → security-BMGGzEwr.js.map} +1 -1
- package/dist/web/public/assets/{service-DgkqlAtM.js → service-BQBoddcT.js} +2 -2
- package/dist/web/public/assets/{service-DgkqlAtM.js.map → service-BQBoddcT.js.map} +1 -1
- package/dist/web/public/assets/{shield-alert-CBOmgn9W.js → shield-alert-eOBoc2yc.js} +2 -2
- package/dist/web/public/assets/{shield-alert-CBOmgn9W.js.map → shield-alert-eOBoc2yc.js.map} +1 -1
- package/dist/web/public/assets/{status-badge-9sMFH4uP.js → status-badge-CF1Cya26.js} +2 -2
- package/dist/web/public/assets/{status-badge-9sMFH4uP.js.map → status-badge-CF1Cya26.js.map} +1 -1
- package/dist/web/public/assets/{subtasks-BrqdQxw_.js → subtasks-CEPB2TSV.js} +2 -2
- package/dist/web/public/assets/{subtasks-BrqdQxw_.js.map → subtasks-CEPB2TSV.js.map} +1 -1
- package/dist/web/public/assets/{table-CSHCu7pz.js → table-Dww-k14l.js} +2 -2
- package/dist/web/public/assets/{table-CSHCu7pz.js.map → table-Dww-k14l.js.map} +1 -1
- package/dist/web/public/assets/{topn-DZWbwDge.js → topn-DwgKlIxc.js} +2 -2
- package/dist/web/public/assets/{topn-DZWbwDge.js.map → topn-DwgKlIxc.js.map} +1 -1
- package/dist/web/public/assets/{trash-2-Cco09tAA.js → trash-2-BF98SY8M.js} +2 -2
- package/dist/web/public/assets/{trash-2-Cco09tAA.js.map → trash-2-BF98SY8M.js.map} +1 -1
- package/dist/web/public/assets/{use-agim-skills-CJOJKeOZ.js → use-agim-skills-kDpiSMBP.js} +2 -2
- package/dist/web/public/assets/{use-agim-skills-CJOJKeOZ.js.map → use-agim-skills-kDpiSMBP.js.map} +1 -1
- package/dist/web/public/assets/{use-background-tasks-D77bcfrq.js → use-background-tasks-B1Pxq3JU.js} +2 -2
- package/dist/web/public/assets/{use-background-tasks-D77bcfrq.js.map → use-background-tasks-B1Pxq3JU.js.map} +1 -1
- package/dist/web/public/assets/{use-memory-CX4B1SYC.js → use-memory-w-EY79Zm.js} +2 -2
- package/dist/web/public/assets/{use-memory-CX4B1SYC.js.map → use-memory-w-EY79Zm.js.map} +1 -1
- package/dist/web/public/assets/{use-observability-rcc7fRmj.js → use-observability-Cd2dUHb7.js} +2 -2
- package/dist/web/public/assets/{use-observability-rcc7fRmj.js.map → use-observability-Cd2dUHb7.js.map} +1 -1
- package/dist/web/public/assets/{use-settings-DQnJkPXp.js → use-settings-DG1rm9KU.js} +2 -2
- package/dist/web/public/assets/{use-settings-DQnJkPXp.js.map → use-settings-DG1rm9KU.js.map} +1 -1
- package/dist/web/public/assets/{use-workspace-J5eeVxw9.js → use-workspace-DvW_xOmj.js} +2 -2
- package/dist/web/public/assets/{use-workspace-J5eeVxw9.js.map → use-workspace-DvW_xOmj.js.map} +1 -1
- package/dist/web/public/assets/{vector-xRphJ8hW.js → vector-CDJ4p6UI.js} +2 -2
- package/dist/web/public/assets/{vector-xRphJ8hW.js.map → vector-CDJ4p6UI.js.map} +1 -1
- package/dist/web/public/assets/{viewer-Bq7l2kE8.js → viewer-Bje5-HtQ.js} +2 -2
- package/dist/web/public/assets/{viewer-Bq7l2kE8.js.map → viewer-Bje5-HtQ.js.map} +1 -1
- package/dist/web/public/assets/workspace-B7QYGLix.js +17 -0
- package/dist/web/public/assets/workspace-B7QYGLix.js.map +1 -0
- package/dist/web/public/assets/{workspaces-D0pYJfxI.js → workspaces-BlodF0DP.js} +2 -2
- package/dist/web/public/assets/{workspaces-D0pYJfxI.js.map → workspaces-BlodF0DP.js.map} +1 -1
- package/dist/web/public/index.html +2 -2
- package/dist/web/server.js +2 -2
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/public/assets/agents-DnJruPrS.js +0 -7
- package/dist/web/public/assets/agents-DnJruPrS.js.map +0 -1
- package/dist/web/public/assets/chat-D7jjr-Rn.js +0 -17
- package/dist/web/public/assets/chat-D7jjr-Rn.js.map +0 -1
- package/dist/web/public/assets/goals-HsKzf-PG.js +0 -17
- package/dist/web/public/assets/goals-HsKzf-PG.js.map +0 -1
- package/dist/web/public/assets/hot-DkFvD3H4.js +0 -12
- package/dist/web/public/assets/hot-DkFvD3H4.js.map +0 -1
- package/dist/web/public/assets/index-D7BuMEIr.js +0 -204
- package/dist/web/public/assets/index-D7BuMEIr.js.map +0 -1
- package/dist/web/public/assets/layout-0rDvqHCV.js +0 -2
- package/dist/web/public/assets/layout-0rDvqHCV.js.map +0 -1
- package/dist/web/public/assets/llm-COWnMdB9.js +0 -7
- package/dist/web/public/assets/llm-COWnMdB9.js.map +0 -1
- package/dist/web/public/assets/native-agent-MGgMeTHN.js +0 -22
- package/dist/web/public/assets/native-agent-MGgMeTHN.js.map +0 -1
- package/dist/web/public/assets/plans-Ddz5qwqp.js +0 -12
- package/dist/web/public/assets/plans-Ddz5qwqp.js.map +0 -1
- package/dist/web/public/assets/workspace-BqMuxPFF.js +0 -17
- package/dist/web/public/assets/workspace-BqMuxPFF.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-
|
|
1
|
+
{"version":3,"file":"layout-B0RjH6M2.js","sources":["../../src/routes/tasks/layout.tsx"],"sourcesContent":["/**\n * /tasks — layout shell shared by every sub-tab.\n *\n * Renders the application Topbar plus a sub-tab strip below it. The\n * actual sub-tab body comes from <Outlet /> — one file per tab under\n * routes/tasks/.\n *\n * Sub-tab order matches plan: jobs / subtasks / bgjobs / schedules /\n * outbox / a2a. Each sub-tab is gated on its route being mounted; in\n * PR-10a only `/tasks/jobs` is wired up so the others stay out of the\n * nav until their PRs land.\n */\n\nimport { NavLink, Outlet } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Topbar } from '@/components/shell/topbar'\nimport { cn } from '@/lib/utils'\n\ninterface SubTab {\n to: string\n i18nKey: string\n mounted: boolean\n}\n\nconst SUB_TABS: SubTab[] = [\n { to: 'jobs', i18nKey: 'subnav.jobs', mounted: true },\n { to: 'subtasks', i18nKey: 'subnav.subtasks', mounted: true },\n { to: 'bgjobs', i18nKey: 'subnav.bgjobs', mounted: true },\n { to: 'schedules', i18nKey: 'subnav.schedules', mounted: true },\n { to: 'outbox', i18nKey: 'subnav.outbox', mounted: true },\n { to: 'a2a', i18nKey: 'subnav.a2a', mounted: true },\n // P1 follow-up — per-thread background primitives.\n { to: 'heartbeat', i18nKey: 'subnav.heartbeat', mounted: true },\n { to: 'goals', i18nKey: 'subnav.goals', mounted: true },\n { to: 'asks', i18nKey: 'subnav.asks', mounted: true },\n // v1.2.133 — native_exit_plan_mode audit log.\n { to: 'plans', i18nKey: 'subnav.plans', mounted: true },\n]\n\nexport default function TasksLayout(): JSX.Element {\n const { t } = useTranslation('tasks')\n return (\n <div className=\"flex min-h-dvh flex-col bg-bg\">\n <Topbar />\n\n <nav\n className={cn(\n 'sticky top-[var(--topbar-h,0)] z-10',\n 'flex items-center gap-1',\n 'border-b border-border bg-surface',\n 'px-3 sm:px-4 py-1',\n 'overflow-x-auto',\n )}\n aria-label={t('pageTitle')}\n >\n {SUB_TABS.filter((tab) => tab.mounted).map((tab) => (\n <NavLink\n key={tab.to}\n to={tab.to}\n className={({ isActive }) =>\n cn(\n 'shrink-0 rounded-md px-3 py-1.5 text-sm no-underline',\n 'transition-colors tap-target',\n isActive\n ? 'bg-accent-bg text-accent font-medium'\n : 'text-text-dim hover:bg-surface-hover hover:text-text',\n )\n }\n >\n {t(tab.i18nKey)}\n </NavLink>\n ))}\n </nav>\n\n <main className=\"flex-1 px-3 sm:px-4 py-4 pb-safe\">\n <Outlet />\n </main>\n </div>\n )\n}\n"],"names":["SUB_TABS","TasksLayout","t","useTranslation","jsxs","jsx","Topbar","cn","tab","NavLink","isActive","Outlet"],"mappings":"uGAwBA,MAAMA,EAAqB,CACzB,CAAE,GAAI,OAAa,QAAS,cAAoB,QAAS,EAAA,EACzD,CAAE,GAAI,WAAa,QAAS,kBAAoB,QAAS,EAAA,EACzD,CAAE,GAAI,SAAa,QAAS,gBAAoB,QAAS,EAAA,EACzD,CAAE,GAAI,YAAa,QAAS,mBAAoB,QAAS,EAAA,EACzD,CAAE,GAAI,SAAa,QAAS,gBAAoB,QAAS,EAAA,EACzD,CAAE,GAAI,MAAa,QAAS,aAAoB,QAAS,EAAA,EAEzD,CAAE,GAAI,YAAa,QAAS,mBAAoB,QAAS,EAAA,EACzD,CAAE,GAAI,QAAa,QAAS,eAAoB,QAAS,EAAA,EACzD,CAAE,GAAI,OAAa,QAAS,cAAoB,QAAS,EAAA,EAEzD,CAAE,GAAI,QAAa,QAAS,eAAoB,QAAS,EAAA,CAC3D,EAEA,SAAwBC,GAA2B,CACjD,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAe,OAAO,EACpC,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAO,EAERD,EAAAA,IAAC,MAAA,CACC,UAAWE,EACT,sCACA,0BACA,oCACA,oBACA,iBAAA,EAEF,aAAYL,EAAE,WAAW,EAExB,SAAAF,EAAS,OAAQQ,GAAQA,EAAI,OAAO,EAAE,IAAKA,GAC1CH,EAAAA,IAACI,EAAA,CAEC,GAAID,EAAI,GACR,UAAW,CAAC,CAAE,SAAAE,CAAA,IACZH,EACE,uDACA,+BACAG,EACI,uCACA,sDAAA,EAIP,SAAAR,EAAEM,EAAI,OAAO,CAAA,EAZTA,EAAI,EAAA,CAcZ,CAAA,CAAA,QAGF,OAAA,CAAK,UAAU,mCACd,SAAAH,EAAAA,IAACM,IAAO,CAAA,CACV,CAAA,EACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as m,j as e,S as d,g as u,h as p,i as h,k as i,f,T as b,N as j,c as x,O as g}from"./index-
|
|
2
|
-
//# sourceMappingURL=layout-
|
|
1
|
+
import{u as m,j as e,S as d,g as u,h as p,i as h,k as i,f,T as b,N as j,c as x,O as g}from"./index-BIBWEKxu.js";import{u as y}from"./use-memory-w-EY79Zm.js";import"./react-DlP5eolq.js";function _({value:c,onChange:n,className:l}){const{t:r}=m("memory"),{data:o,isLoading:s}=y(),a=o?.users??[];return e.jsxs(d,{value:c||"__placeholder__",onValueChange:t=>n(t==="__placeholder__"?"":t),disabled:s||a.length===0,children:[e.jsx(u,{className:l??"h-9 w-72 max-w-full",children:e.jsx(p,{placeholder:r("userPicker.placeholder")})}),e.jsxs(h,{children:[e.jsx(i,{value:"__placeholder__",disabled:!0,children:r("userPicker.placeholder")}),a.map(t=>e.jsx(i,{value:t.user_key,children:e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-mono text-xs",children:t.user_key}),e.jsx("span",{className:"text-text-dim text-xs",children:r("userPicker.factsLabel",{count:t.fact_count})}),t.has_persona&&e.jsxs("span",{className:"text-accent text-xs",children:["·",r("userPicker.personaTag"),"·"]})]})},t.user_key))]})]})}const v=[{to:"facts",i18nKey:"tabs.facts",mounted:!0},{to:"persona",i18nKey:"tabs.persona",mounted:!0},{to:"vector",i18nKey:"tabs.vector",mounted:!0}];function P(){const{t:c}=m("memory"),[n,l]=f(),r=n.get("user")??"";function o(s){const a=new URLSearchParams(n);s?a.set("user",s):a.delete("user"),l(a,{replace:!0})}return e.jsxs("div",{className:"flex min-h-dvh flex-col bg-bg",children:[e.jsx(b,{}),e.jsx("div",{className:"border-b border-border bg-surface px-3 sm:px-4 py-2",children:e.jsxs("div",{className:"mx-auto flex max-w-7xl items-center gap-3",children:[e.jsx("span",{className:"text-sm text-text-dim shrink-0",children:c("userPicker.label")}),e.jsx(_,{value:r,onChange:o})]})}),e.jsx("nav",{className:x("sticky top-0 z-10","flex items-center gap-1","border-b border-border bg-surface","px-3 sm:px-4 py-1","overflow-x-auto"),"aria-label":c("pageTitle"),children:v.filter(s=>s.mounted).map(s=>e.jsx(j,{to:s.to,className:({isActive:a})=>x("shrink-0 rounded-md px-3 py-1.5 text-sm no-underline","transition-colors tap-target",a?"bg-accent-bg text-accent font-medium":"text-text-dim hover:bg-surface-hover hover:text-text"),children:c(s.i18nKey)},s.to))}),e.jsx("main",{className:"flex-1 px-3 sm:px-4 py-4 pb-safe",children:e.jsx(g,{})})]})}export{P as default};
|
|
2
|
+
//# sourceMappingURL=layout-C6q-GbBZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-
|
|
1
|
+
{"version":3,"file":"layout-C6q-GbBZ.js","sources":["../../src/components/memory/user-picker.tsx","../../src/routes/memory/layout.tsx"],"sourcesContent":["/**\n * MemoryUserPicker — Select for the user_key the /memory route\n * targets. Sources the option list from useMemoryUsers, shows the\n * per-user fact_count + persona-presence as inline metadata so the\n * operator can tell which users are interesting at a glance.\n *\n * Loading: while users fetch, the trigger shows the placeholder so\n * the page doesn't jump.\n *\n * Empty bank: no users → the dropdown is disabled with a tooltip\n * explaining there's nothing to pick. Avoids a confusing \"no items\"\n * dropdown state.\n */\n\nimport { useTranslation } from 'react-i18next'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport { useMemoryUsers } from '@/hooks/use-memory'\n\nexport interface MemoryUserPickerProps {\n value: string\n onChange: (next: string) => void\n className?: string\n}\n\nexport function MemoryUserPicker({ value, onChange, className }: MemoryUserPickerProps): JSX.Element {\n const { t } = useTranslation('memory')\n const { data, isLoading } = useMemoryUsers()\n const users = data?.users ?? []\n\n return (\n <Select\n value={value || '__placeholder__'}\n onValueChange={(v) => onChange(v === '__placeholder__' ? '' : v)}\n disabled={isLoading || users.length === 0}\n >\n <SelectTrigger className={className ?? 'h-9 w-72 max-w-full'}>\n <SelectValue placeholder={t('userPicker.placeholder')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__placeholder__\" disabled>\n {t('userPicker.placeholder')}\n </SelectItem>\n {users.map((u) => (\n <SelectItem key={u.user_key} value={u.user_key}>\n <span className=\"flex items-center gap-2\">\n <span className=\"font-mono text-xs\">{u.user_key}</span>\n <span className=\"text-text-dim text-xs\">\n {t('userPicker.factsLabel', { count: u.fact_count })}\n </span>\n {u.has_persona && (\n <span className=\"text-accent text-xs\">·{t('userPicker.personaTag')}·</span>\n )}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\n","/**\n * /memory — layout shell shared by every sub-tab.\n *\n * Memory is partitioned per user_key. The picker lives in the\n * layout so it's the first thing the operator sees and stays put\n * across sub-tabs (facts / persona / vector / skills). The chosen\n * user is held in URL state (?user=) so sub-tabs read it via\n * useSearchParams.\n *\n * Sub-tabs: facts / persona / vector. Skills used to live here too\n * but was promoted to its own top-level /skills tab in 2026-05 — the\n * router keeps a redirect for old /memory/skills bookmarks.\n */\n\nimport { NavLink, Outlet, useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Topbar } from '@/components/shell/topbar'\nimport { MemoryUserPicker } from '@/components/memory/user-picker'\nimport { cn } from '@/lib/utils'\n\ninterface SubTab {\n to: string\n i18nKey: string\n mounted: boolean\n}\n\nconst SUB_TABS: SubTab[] = [\n { to: 'facts', i18nKey: 'tabs.facts', mounted: true },\n { to: 'persona', i18nKey: 'tabs.persona', mounted: true },\n { to: 'vector', i18nKey: 'tabs.vector', mounted: true },\n // 'skills' was here; promoted to top-level /skills in 2026-05.\n]\n\nexport default function MemoryLayout(): JSX.Element {\n const { t } = useTranslation('memory')\n const [params, setParams] = useSearchParams()\n const userKey = params.get('user') ?? ''\n\n function setUserKey(next: string): void {\n const p = new URLSearchParams(params)\n if (!next) p.delete('user')\n else p.set('user', next)\n setParams(p, { replace: true })\n }\n\n return (\n <div className=\"flex min-h-dvh flex-col bg-bg\">\n <Topbar />\n\n {/* User picker — the primary navigation control for this page */}\n <div className=\"border-b border-border bg-surface px-3 sm:px-4 py-2\">\n <div className=\"mx-auto flex max-w-7xl items-center gap-3\">\n <span className=\"text-sm text-text-dim shrink-0\">{t('userPicker.label')}</span>\n <MemoryUserPicker value={userKey} onChange={setUserKey} />\n </div>\n </div>\n\n {/* Sub-tab nav */}\n <nav\n className={cn(\n 'sticky top-0 z-10',\n 'flex items-center gap-1',\n 'border-b border-border bg-surface',\n 'px-3 sm:px-4 py-1',\n 'overflow-x-auto',\n )}\n aria-label={t('pageTitle')}\n >\n {SUB_TABS.filter((tab) => tab.mounted).map((tab) => (\n <NavLink\n key={tab.to}\n to={tab.to}\n className={({ isActive }) =>\n cn(\n 'shrink-0 rounded-md px-3 py-1.5 text-sm no-underline',\n 'transition-colors tap-target',\n isActive\n ? 'bg-accent-bg text-accent font-medium'\n : 'text-text-dim hover:bg-surface-hover hover:text-text',\n )\n }\n >\n {t(tab.i18nKey)}\n </NavLink>\n ))}\n </nav>\n\n <main className=\"flex-1 px-3 sm:px-4 py-4 pb-safe\">\n <Outlet />\n </main>\n </div>\n )\n}\n"],"names":["MemoryUserPicker","value","onChange","className","t","useTranslation","data","isLoading","useMemoryUsers","users","jsxs","Select","v","jsx","SelectTrigger","SelectValue","SelectContent","SelectItem","u","SUB_TABS","MemoryLayout","params","setParams","useSearchParams","userKey","setUserKey","next","p","Topbar","cn","tab","NavLink","isActive","Outlet"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{u as a,j as e,T as r,N as i,c as n,O as m}from"./index-BIBWEKxu.js";import"./react-DlP5eolq.js";const u=[{to:"messengers",i18nKey:"tabs.messengers",mounted:!0},{to:"agents",i18nKey:"tabs.agents",mounted:!0},{to:"llm",i18nKey:"tabs.llm",mounted:!0},{to:"mobile",i18nKey:"tabs.mobile",mounted:!0},{to:"agim-skills",i18nKey:"tabs.agimSkills",mounted:!0},{to:"search",i18nKey:"tabs.search",mounted:!0},{to:"mcp",i18nKey:"tabs.mcp",mounted:!0},{to:"policy",i18nKey:"tabs.policy",mounted:!0},{to:"email",i18nKey:"tabs.email",mounted:!0},{to:"viewer",i18nKey:"tabs.viewer",mounted:!0},{to:"security",i18nKey:"tabs.security",mounted:!0},{to:"workspaces",i18nKey:"tabs.workspaces",mounted:!0},{to:"admins",i18nKey:"tabs.admins",mounted:!0},{to:"service",i18nKey:"tabs.service",mounted:!0}];function d(){const{t:s}=a("settings");return e.jsxs("div",{className:"flex min-h-dvh flex-col bg-bg",children:[e.jsx(r,{}),e.jsx("nav",{className:n("sticky top-0 z-10","flex items-center gap-1","border-b border-border bg-surface","px-3 sm:px-4 py-1","overflow-x-auto"),"aria-label":s("pageTitle"),children:u.filter(t=>t.mounted).map(t=>e.jsx(i,{to:t.to,className:({isActive:o})=>n("shrink-0 rounded-md px-3 py-1.5 text-sm no-underline","transition-colors tap-target",o?"bg-accent-bg text-accent font-medium":"text-text-dim hover:bg-surface-hover hover:text-text"),children:s(t.i18nKey)},t.to))}),e.jsx("main",{className:"flex-1 px-3 sm:px-4 py-4 pb-safe",children:e.jsx(m,{})})]})}export{d as default};
|
|
2
|
+
//# sourceMappingURL=layout-CzjqlPxW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-CzjqlPxW.js","sources":["../../src/routes/settings/layout.tsx"],"sourcesContent":["/**\n * /settings — layout shell with sub-tab nav (environment / service).\n *\n * Workspaces / WeChat QR / Admin allowlist will land as additional\n * sub-tabs in PR-19b/c. The `mounted` flag gates their nav links.\n */\n\nimport { NavLink, Outlet } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { Topbar } from '@/components/shell/topbar'\nimport { cn } from '@/lib/utils'\n\ninterface SubTab {\n to: string\n i18nKey: string\n mounted: boolean\n}\n\nconst SUB_TABS: SubTab[] = [\n { to: 'messengers', i18nKey: 'tabs.messengers', mounted: true },\n { to: 'agents', i18nKey: 'tabs.agents', mounted: true },\n // Stage 6 — Agim Agent stack (model APIs + runtime knobs).\n { to: 'llm', i18nKey: 'tabs.llm', mounted: true },\n // v1.2.129 — mobile QR generator (open /m/chat from a phone).\n { to: 'mobile', i18nKey: 'tabs.mobile', mounted: true },\n // P1 follow-up — agim SKILL.md editor.\n { to: 'agim-skills', i18nKey: 'tabs.agimSkills', mounted: true },\n // v1.2.126 — web_search provider chain + per-provider keys.\n { to: 'search', i18nKey: 'tabs.search', mounted: true },\n { to: 'mcp', i18nKey: 'tabs.mcp', mounted: true },\n { to: 'policy', i18nKey: 'tabs.policy', mounted: true },\n { to: 'email', i18nKey: 'tabs.email', mounted: true },\n { to: 'viewer', i18nKey: 'tabs.viewer', mounted: true },\n { to: 'security', i18nKey: 'tabs.security', mounted: true },\n { to: 'workspaces', i18nKey: 'tabs.workspaces', mounted: true },\n { to: 'admins', i18nKey: 'tabs.admins', mounted: true },\n // R13 follow-up — /settings/env catch-all editor removed; raw env-var\n // editing belongs in `~/.agim/env` on the host, not in a web form.\n { to: 'service', i18nKey: 'tabs.service', mounted: true },\n]\n\nexport default function SettingsLayout(): JSX.Element {\n const { t } = useTranslation('settings')\n return (\n <div className=\"flex min-h-dvh flex-col bg-bg\">\n <Topbar />\n\n <nav\n className={cn(\n 'sticky top-0 z-10',\n 'flex items-center gap-1',\n 'border-b border-border bg-surface',\n 'px-3 sm:px-4 py-1',\n 'overflow-x-auto',\n )}\n aria-label={t('pageTitle')}\n >\n {SUB_TABS.filter((tab) => tab.mounted).map((tab) => (\n <NavLink\n key={tab.to}\n to={tab.to}\n className={({ isActive }) =>\n cn(\n 'shrink-0 rounded-md px-3 py-1.5 text-sm no-underline',\n 'transition-colors tap-target',\n isActive\n ? 'bg-accent-bg text-accent font-medium'\n : 'text-text-dim hover:bg-surface-hover hover:text-text',\n )\n }\n >\n {t(tab.i18nKey)}\n </NavLink>\n ))}\n </nav>\n\n <main className=\"flex-1 px-3 sm:px-4 py-4 pb-safe\">\n <Outlet />\n </main>\n </div>\n )\n}\n"],"names":["SUB_TABS","SettingsLayout","t","useTranslation","jsxs","jsx","Topbar","cn","tab","NavLink","isActive","Outlet"],"mappings":"uGAkBA,MAAMA,EAAqB,CACzB,CAAE,GAAI,aAAgB,QAAS,kBAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,SAAgB,QAAS,cAAqB,QAAS,EAAA,EAE7D,CAAE,GAAI,MAAgB,QAAS,WAAqB,QAAS,EAAA,EAE7D,CAAE,GAAI,SAAgB,QAAS,cAAqB,QAAS,EAAA,EAE7D,CAAE,GAAI,cAAgB,QAAS,kBAAqB,QAAS,EAAA,EAE7D,CAAE,GAAI,SAAgB,QAAS,cAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,MAAgB,QAAS,WAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,SAAgB,QAAS,cAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,QAAgB,QAAS,aAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,SAAgB,QAAS,cAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,WAAgB,QAAS,gBAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,aAAgB,QAAS,kBAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,SAAgB,QAAS,cAAqB,QAAS,EAAA,EAG7D,CAAE,GAAI,UAAgB,QAAS,eAAqB,QAAS,EAAA,CAC/D,EAEA,SAAwBC,GAA8B,CACpD,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAe,UAAU,EACvC,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAC,EAAAA,IAACC,EAAA,EAAO,EAERD,EAAAA,IAAC,MAAA,CACC,UAAWE,EACT,oBACA,0BACA,oCACA,oBACA,iBAAA,EAEF,aAAYL,EAAE,WAAW,EAExB,SAAAF,EAAS,OAAQQ,GAAQA,EAAI,OAAO,EAAE,IAAKA,GAC1CH,EAAAA,IAACI,EAAA,CAEC,GAAID,EAAI,GACR,UAAW,CAAC,CAAE,SAAAE,CAAA,IACZH,EACE,uDACA,+BACAG,EACI,uCACA,sDAAA,EAIP,SAAAR,EAAEM,EAAI,OAAO,CAAA,EAZTA,EAAI,EAAA,CAcZ,CAAA,CAAA,QAGF,OAAA,CAAK,UAAU,mCACd,SAAAH,EAAAA,IAACM,IAAO,CAAA,CACV,CAAA,EACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as n,j as t,N as o,c as s,O as l}from"./index-
|
|
2
|
-
//# sourceMappingURL=layout-
|
|
1
|
+
import{u as n,j as t,N as o,c as s,O as l}from"./index-BIBWEKxu.js";import"./react-DlP5eolq.js";const r=[{to:"installed",i18nKey:"agimSkills.tab.installed"},{to:"hot",i18nKey:"agimSkills.tab.hot"},{to:"injection",i18nKey:"agimSkills.tab.injection"}];function c(){const{t:i}=n(["settings"]);return t.jsxs("div",{className:"flex flex-col gap-4",children:[t.jsx("nav",{className:s("flex items-center gap-1","border-b border-border","-mx-3 sm:-mx-4 px-3 sm:px-4 pb-2","overflow-x-auto"),"aria-label":i("agimSkills.title"),children:r.map(e=>t.jsx(o,{to:e.to,className:({isActive:a})=>s("shrink-0 rounded-md px-3 py-1.5 text-sm no-underline","transition-colors tap-target",a?"bg-accent-bg text-accent font-medium":"text-text-dim hover:bg-surface-hover hover:text-text"),children:i(e.i18nKey)},e.to))}),t.jsx(l,{})]})}export{c as default};
|
|
2
|
+
//# sourceMappingURL=layout-DOSpVfND.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-
|
|
1
|
+
{"version":3,"file":"layout-DOSpVfND.js","sources":["../../src/routes/settings/agim-skills/layout.tsx"],"sourcesContent":["/**\n * /settings/agim-skills — combined skill management.\n *\n * 2026-05 consolidation: the v2 SPA briefly had two skill entry points\n * (top-level /skills + this settings route) which duplicated 95% of\n * the data after multi-root scanning landed. We merged both flows here:\n *\n * installed — agim's own loader view; CRUD against the writable\n * workspace dir, read-only for builtins and skills\n * inherited from ~/.claude/skills + opencode + codex.\n * hot — skillhub.cn 热门 (moved from /skills/hot).\n *\n * Old URLs under /skills still resolve via redirects in router.tsx\n * so bookmarks keep working.\n */\n\nimport { NavLink, Outlet } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { cn } from '@/lib/utils'\n\ninterface SubTab {\n to: string\n i18nKey: string\n}\n\nconst SUB_TABS: SubTab[] = [\n { to: 'installed', i18nKey: 'agimSkills.tab.installed' },\n { to: 'hot', i18nKey: 'agimSkills.tab.hot' },\n // v1.2.151 — system-prompt skill block editor (operator override).\n { to: 'injection', i18nKey: 'agimSkills.tab.injection' },\n]\n\nexport default function SettingsAgimSkillsLayout(): JSX.Element {\n const { t } = useTranslation(['settings'])\n return (\n <div className=\"flex flex-col gap-4\">\n <nav\n className={cn(\n 'flex items-center gap-1',\n 'border-b border-border',\n '-mx-3 sm:-mx-4 px-3 sm:px-4 pb-2',\n 'overflow-x-auto',\n )}\n aria-label={t('agimSkills.title')}\n >\n {SUB_TABS.map((tab) => (\n <NavLink\n key={tab.to}\n to={tab.to}\n className={({ isActive }) =>\n cn(\n 'shrink-0 rounded-md px-3 py-1.5 text-sm no-underline',\n 'transition-colors tap-target',\n isActive\n ? 'bg-accent-bg text-accent font-medium'\n : 'text-text-dim hover:bg-surface-hover hover:text-text',\n )\n }\n >\n {t(tab.i18nKey)}\n </NavLink>\n ))}\n </nav>\n <Outlet />\n </div>\n )\n}\n"],"names":["SUB_TABS","SettingsAgimSkillsLayout","t","useTranslation","jsxs","jsx","cn","tab","NavLink","isActive","Outlet"],"mappings":"gGAyBA,MAAMA,EAAqB,CACzB,CAAE,GAAI,YAAa,QAAS,0BAAA,EAC5B,CAAE,GAAI,MAAa,QAAS,oBAAA,EAE5B,CAAE,GAAI,YAAa,QAAS,0BAAA,CAC9B,EAEA,SAAwBC,GAAwC,CAC9D,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAe,CAAC,UAAU,CAAC,EACzC,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CACC,UAAWC,EACT,0BACA,yBACA,mCACA,iBAAA,EAEF,aAAYJ,EAAE,kBAAkB,EAE/B,SAAAF,EAAS,IAAKO,GACbF,EAAAA,IAACG,EAAA,CAEC,GAAID,EAAI,GACR,UAAW,CAAC,CAAE,SAAAE,CAAA,IACZH,EACE,uDACA,+BACAG,EACI,uCACA,sDAAA,EAIP,SAAAP,EAAEK,EAAI,OAAO,CAAA,EAZTA,EAAI,EAAA,CAcZ,CAAA,CAAA,QAEFG,EAAA,CAAA,CAAO,CAAA,EACV,CAEJ"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import{o as R,u as p,j as e,B as _,l as T,X as F,I as m,S as B,g as O,h as w,i as V,k as f,m as j,L as v,aa as Y,ab as q,ac as W,ad as $,ae as J}from"./index-BIBWEKxu.js";import{r as b}from"./react-DlP5eolq.js";import{T as Z,a as Q,b as K,c as E,d as ee,e as C}from"./table-Dww-k14l.js";import{u as te,a as ae}from"./use-settings-DG1rm9KU.js";import{L as S}from"./loader-circle-BQkLEJZw.js";import{R as X}from"./refresh-ccw-CFPE6zD1.js";import{S as se}from"./save-CNUmUMEf.js";import{N as ne}from"./network-Bbh3j5ew.js";import{S as le}from"./shield-alert-eOBoc2yc.js";import{B as re}from"./bell-CxPf_Xzs.js";import{H as ce}from"./heart-pulse-CrCHhXtC.js";import{T as ie}from"./trash-2-BF98SY8M.js";import{P as oe}from"./plus-6MNGQidu.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 me=R("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/**
|
|
7
|
+
* @license lucide-react v0.469.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const de=R("FileStack",[["path",{d:"M21 7h-3a2 2 0 0 1-2-2V2",key:"9rb54x"}],["path",{d:"M21 6v6.5c0 .8-.7 1.5-1.5 1.5h-7c-.8 0-1.5-.7-1.5-1.5v-9c0-.8.7-1.5 1.5-1.5H17Z",key:"1059l0"}],["path",{d:"M7 8v8.8c0 .3.2.6.4.8.2.2.5.4.8.4H15",key:"16874u"}],["path",{d:"M3 12v8.8c0 .3.2.6.4.8.2.2.5.4.8.4H11",key:"k2ox98"}]]);/**
|
|
12
|
+
* @license lucide-react v0.469.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const xe=R("Gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]);/**
|
|
17
|
+
* @license lucide-react v0.469.0 - ISC
|
|
18
|
+
*
|
|
19
|
+
* This source code is licensed under the ISC license.
|
|
20
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
+
*/const he=R("Waves",[["path",{d:"M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"knzxuh"}],["path",{d:"M2 12c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"2jd2cc"}],["path",{d:"M2 18c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1",key:"rd2r6e"}]]);/**
|
|
22
|
+
* @license lucide-react v0.469.0 - ISC
|
|
23
|
+
*
|
|
24
|
+
* This source code is licensed under the ISC license.
|
|
25
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
26
|
+
*/const ue=R("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]);function pe(t){return{role:t.IMHUB_NATIVE_AGENT_ROLE??"",mode:t.IMHUB_NATIVE_AGENT_MODE||"read-only",autoAllow:t.IMHUB_NATIVE_AGENT_AUTOALLOW??"",denyList:t.IMHUB_NATIVE_AGENT_DENYLIST??"",evalEnabled:y(t.IMHUB_NOTIFICATION_EVALUATOR),evalSources:t.IMHUB_NOTIFICATION_EVALUATOR_SOURCES??"",hbEnabled:y(t.IMHUB_HEARTBEAT_ENABLED),hbTickMs:t.IMHUB_HEARTBEAT_TICK_INTERVAL_MS??"",hbDefaultMin:t.IMHUB_HEARTBEAT_DEFAULT_INTERVAL_MIN??"",toolResultCap:t.IMHUB_NATIVE_TOOL_RESULT_MAX_CHARS??"",toolTimeoutMs:t.IMHUB_NATIVE_TOOL_TIMEOUT_MS??"",blankRetryMax:t.IMHUB_NATIVE_BLANK_RETRY_MAX??"",lengthRecoveryMax:t.IMHUB_NATIVE_LENGTH_RECOVERY_MAX??"",a2aMaxDepth:t.IMHUB_A2A_MAX_DEPTH??"",a2aTimeoutMs:t.IMHUB_A2A_TIMEOUT_DEFAULT_MS??"",callAgentInProcess:!L(t.IMHUB_NATIVE_CALL_AGENT_IN_PROCESS),callAgentMaxPerTurn:t.IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN??"",semanticStuckLoop:!L(t.IMHUB_NATIVE_SEMANTIC_STUCK_LOOP),criticEnabled:y(t.IMHUB_NATIVE_CRITIC),criticRole:t.IMHUB_NATIVE_CRITIC_ROLE??"",planModeDefault:y(t.IMHUB_NATIVE_PLAN_MODE),planIntentAuto:y(t.IMHUB_PLAN_INTENT_AUTO),planIntentPhrases:t.IMHUB_PLAN_INTENT_PHRASES??"",compactTriggerChars:t.IMHUB_NATIVE_COMPACT_TRIGGER_CHARS??"",compactKeepTurns:t.IMHUB_NATIVE_COMPACT_KEEP_TURNS??"",compactKeepFirst:t.IMHUB_NATIVE_COMPACT_KEEP_FIRST??"",compactSummaryChars:t.IMHUB_NATIVE_COMPACT_SUMMARY_CHARS??"",streamPartial:!L(t.IMHUB_NATIVE_STREAM_PARTIAL),maxIter:t.IMHUB_NATIVE_AGENT_MAX_ITER??""}}function L(t){if(!t)return!1;const s=t.toLowerCase().trim();return s==="off"||s==="false"||s==="0"||s==="no"}function y(t){if(!t)return!1;const s=t.toLowerCase();return s==="1"||s==="true"||s==="yes"||s==="on"}function ge(){const{t}=p(["settings","common"]),s=t("nativeAgent.subtitle"),a=t("nativeAgent.llmLink"),l=s.indexOf(a);return l===-1?e.jsx("p",{className:"text-sm text-text-dim",children:s}):e.jsxs("p",{className:"text-sm text-text-dim",children:[s.slice(0,l),e.jsx("a",{className:"underline",href:a,children:a}),s.slice(l+a.length)]})}function Ae({embedded:t=!1}){const{t:s}=p(["settings","common"]),a=te({reveal:!1}),l=ae(),g=a.data?.env??{},r=b.useMemo(()=>pe(g),[g]),[n,h]=b.useState(r),[A,i]=b.useState("");b.useEffect(()=>{const c=JSON.stringify(r);c!==A&&(h(r),i(c))},[r,A]);const d=JSON.stringify(n)!==JSON.stringify(r);function u(c,M){h(U=>({...U,[c]:M}))}async function I(){const c={};if(n.role!==r.role&&(c.IMHUB_NATIVE_AGENT_ROLE=n.role.trim()||null),n.mode!==r.mode&&(c.IMHUB_NATIVE_AGENT_MODE=n.mode),n.autoAllow!==r.autoAllow&&(c.IMHUB_NATIVE_AGENT_AUTOALLOW=n.autoAllow.trim()||null),n.denyList!==r.denyList&&(c.IMHUB_NATIVE_AGENT_DENYLIST=n.denyList.trim()||null),n.evalEnabled!==r.evalEnabled&&(c.IMHUB_NOTIFICATION_EVALUATOR=n.evalEnabled?"on":null),n.evalSources!==r.evalSources&&(c.IMHUB_NOTIFICATION_EVALUATOR_SOURCES=n.evalSources.trim()||null),n.hbEnabled!==r.hbEnabled&&(c.IMHUB_HEARTBEAT_ENABLED=n.hbEnabled?"on":null),n.hbTickMs!==r.hbTickMs&&(c.IMHUB_HEARTBEAT_TICK_INTERVAL_MS=n.hbTickMs.trim()||null),n.hbDefaultMin!==r.hbDefaultMin&&(c.IMHUB_HEARTBEAT_DEFAULT_INTERVAL_MIN=n.hbDefaultMin.trim()||null),n.toolResultCap!==r.toolResultCap&&(c.IMHUB_NATIVE_TOOL_RESULT_MAX_CHARS=n.toolResultCap.trim()||null),n.toolTimeoutMs!==r.toolTimeoutMs&&(c.IMHUB_NATIVE_TOOL_TIMEOUT_MS=n.toolTimeoutMs.trim()||null),n.blankRetryMax!==r.blankRetryMax&&(c.IMHUB_NATIVE_BLANK_RETRY_MAX=n.blankRetryMax.trim()||null),n.lengthRecoveryMax!==r.lengthRecoveryMax&&(c.IMHUB_NATIVE_LENGTH_RECOVERY_MAX=n.lengthRecoveryMax.trim()||null),n.a2aMaxDepth!==r.a2aMaxDepth&&(c.IMHUB_A2A_MAX_DEPTH=n.a2aMaxDepth.trim()||null),n.a2aTimeoutMs!==r.a2aTimeoutMs&&(c.IMHUB_A2A_TIMEOUT_DEFAULT_MS=n.a2aTimeoutMs.trim()||null),n.callAgentInProcess!==r.callAgentInProcess&&(c.IMHUB_NATIVE_CALL_AGENT_IN_PROCESS=n.callAgentInProcess?null:"off"),n.callAgentMaxPerTurn!==r.callAgentMaxPerTurn&&(c.IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN=n.callAgentMaxPerTurn.trim()||null),n.semanticStuckLoop!==r.semanticStuckLoop&&(c.IMHUB_NATIVE_SEMANTIC_STUCK_LOOP=n.semanticStuckLoop?null:"off"),n.criticEnabled!==r.criticEnabled&&(c.IMHUB_NATIVE_CRITIC=n.criticEnabled?"on":null),n.criticRole!==r.criticRole&&(c.IMHUB_NATIVE_CRITIC_ROLE=n.criticRole.trim()||null),n.planModeDefault!==r.planModeDefault&&(c.IMHUB_NATIVE_PLAN_MODE=n.planModeDefault?"1":null),n.planIntentAuto!==r.planIntentAuto&&(c.IMHUB_PLAN_INTENT_AUTO=n.planIntentAuto?"on":null),n.planIntentPhrases!==r.planIntentPhrases&&(c.IMHUB_PLAN_INTENT_PHRASES=n.planIntentPhrases.trim()||null),n.compactTriggerChars!==r.compactTriggerChars&&(c.IMHUB_NATIVE_COMPACT_TRIGGER_CHARS=n.compactTriggerChars.trim()||null),n.compactKeepTurns!==r.compactKeepTurns&&(c.IMHUB_NATIVE_COMPACT_KEEP_TURNS=n.compactKeepTurns.trim()||null),n.compactKeepFirst!==r.compactKeepFirst&&(c.IMHUB_NATIVE_COMPACT_KEEP_FIRST=n.compactKeepFirst.trim()||null),n.compactSummaryChars!==r.compactSummaryChars&&(c.IMHUB_NATIVE_COMPACT_SUMMARY_CHARS=n.compactSummaryChars.trim()||null),n.streamPartial!==r.streamPartial&&(c.IMHUB_NATIVE_STREAM_PARTIAL=n.streamPartial?null:"off"),n.maxIter!==r.maxIter&&(c.IMHUB_NATIVE_AGENT_MAX_ITER=n.maxIter.trim()||null),Object.keys(c).length!==0)try{await l.mutateAsync({updates:c}),j.success(s("nativeAgent.savedToast"))}catch(M){j.error(M?.message??String(M))}}function k(){h(r)}return e.jsxs("div",{className:t?"flex flex-col gap-6":"mx-auto flex max-w-4xl flex-col gap-6",children:[!t&&e.jsxs(e.Fragment,{children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("nativeAgent.title")}),e.jsxs(_,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void a.refetch(),disabled:a.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[a.isFetching?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(X,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("nativeAgent.refresh")})]})]}),e.jsx(ge,{})]}),a.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx(be,{draft:n,setField:u}),e.jsx(ve,{draft:n,setField:u}),e.jsx(fe,{draft:n,setField:u}),e.jsx(_e,{draft:n,setField:u}),e.jsx(Te,{draft:n,setField:u}),e.jsx(Ie,{draft:n,setField:u}),e.jsx(Ne,{draft:n,setField:u}),e.jsx(je,{draft:n,setField:u})]}),d&&e.jsxs("div",{className:t?"flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-3 shadow":"sticky bottom-2 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-3 shadow",children:[e.jsx(T,{variant:"info",children:s("nativeAgent.unsaved")}),e.jsxs(_,{variant:"ghost",size:"sm",className:"ml-auto",onClick:k,disabled:l.isPending,children:[e.jsx(F,{className:"h-4 w-4"})," ",s("nativeAgent.discard")]}),e.jsxs(_,{size:"sm",onClick:()=>void I(),disabled:l.isPending,children:[l.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(se,{className:"h-4 w-4"}),s("nativeAgent.save")]})]})]})}function be({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(me,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.agentCard")})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.roleOverride"),hint:a("nativeAgent.roleHint"),children:e.jsx(m,{value:t.role,onChange:l=>s("role",l.target.value),placeholder:"native-chat",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.approvalMode"),hint:a("nativeAgent.approvalHint"),children:e.jsxs(B,{value:t.mode,onValueChange:l=>s("mode",l),children:[e.jsx(O,{children:e.jsx(w,{})}),e.jsxs(V,{children:[e.jsx(f,{value:"read-only",children:a("nativeAgent.modeReadOnly")}),e.jsx(f,{value:"allow-list",children:a("nativeAgent.modeAllowList")}),e.jsx(f,{value:"allow-all",children:a("nativeAgent.modeAllowAll")}),e.jsx(f,{value:"deny-all",children:a("nativeAgent.modeDenyAll")})]})]})}),e.jsx(o,{label:a("nativeAgent.autoAllow"),hint:a("nativeAgent.autoAllowHint"),children:e.jsx(m,{value:t.autoAllow,onChange:l=>s("autoAllow",l.target.value),placeholder:"native_,mcp_filesystem_",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.denyList"),hint:a("nativeAgent.denyListHint"),children:e.jsx(m,{value:t.denyList,onChange:l=>s("denyList",l.target.value),placeholder:"mcp_shell_,mcp_dangerous_",className:"font-mono text-xs"})})]})]})}function Ne({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(re,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.evaluatorCard")}),t.evalEnabled?e.jsx(T,{variant:"success",children:a("nativeAgent.on")}):e.jsx(T,{variant:"outline",children:a("nativeAgent.off")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.evalDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.enableGate"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.evalEnabled,onChange:l=>s("evalEnabled",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:a("nativeAgent.filterViaLlm")})]})}),e.jsx(o,{label:a("nativeAgent.evalSources"),hint:a("nativeAgent.evalSourcesHint"),children:e.jsx(m,{value:t.evalSources,onChange:l=>s("evalSources",l.target.value),placeholder:"push,heartbeat",className:"font-mono text-xs",disabled:!t.evalEnabled})})]})]})}function je({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(ce,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.heartbeatCard")}),t.hbEnabled?e.jsx(T,{variant:"success",children:a("nativeAgent.on")}):e.jsx(T,{variant:"outline",children:a("nativeAgent.off")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.hbDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-3",children:[e.jsx(o,{label:a("nativeAgent.enableScheduler"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.hbEnabled,onChange:l=>s("hbEnabled",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:a("nativeAgent.startScanLoop")})]})}),e.jsx(o,{label:a("nativeAgent.tickInterval"),hint:a("nativeAgent.tickHint"),children:e.jsx(m,{type:"number",value:t.hbTickMs,onChange:l=>s("hbTickMs",l.target.value),placeholder:"60000",className:"font-mono text-xs",disabled:!t.hbEnabled})}),e.jsx(o,{label:a("nativeAgent.defaultInterval"),hint:a("nativeAgent.defaultIntervalHint"),children:e.jsx(m,{type:"number",value:t.hbDefaultMin,onChange:l=>s("hbDefaultMin",l.target.value),placeholder:"15",className:"font-mono text-xs",disabled:!t.hbEnabled})})]})]})}function ve({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(xe,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.runtimeCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.runtimeDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.toolResultCap"),hint:a("nativeAgent.toolResultCapHint"),children:e.jsx(m,{type:"number",value:t.toolResultCap,onChange:l=>s("toolResultCap",l.target.value),placeholder:"64000",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.toolTimeoutMs"),hint:a("nativeAgent.toolTimeoutHint"),children:e.jsx(m,{type:"number",value:t.toolTimeoutMs,onChange:l=>s("toolTimeoutMs",l.target.value),placeholder:"60000",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.blankRetryMax"),hint:a("nativeAgent.blankRetryHint"),children:e.jsx(m,{type:"number",value:t.blankRetryMax,onChange:l=>s("blankRetryMax",l.target.value),placeholder:"1",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.lengthRecoveryMax"),hint:a("nativeAgent.lengthRecoveryHint"),children:e.jsx(m,{type:"number",value:t.lengthRecoveryMax,onChange:l=>s("lengthRecoveryMax",l.target.value),placeholder:"1",className:"font-mono text-xs"})})]})]})}function fe({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(ne,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.a2aCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.a2aDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.a2aMaxDepth"),hint:a("nativeAgent.a2aMaxDepthHint"),children:e.jsx(m,{type:"number",value:t.a2aMaxDepth,onChange:l=>s("a2aMaxDepth",l.target.value),placeholder:"1",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.a2aTimeoutMs"),hint:a("nativeAgent.a2aTimeoutMsHint"),children:e.jsx(m,{type:"number",value:t.a2aTimeoutMs,onChange:l=>s("a2aTimeoutMs",l.target.value),placeholder:"1800000",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.callAgentInProcess"),hint:a("nativeAgent.callAgentInProcessHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.callAgentInProcess,onChange:l=>s("callAgentInProcess",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.callAgentInProcess?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.callAgentMaxPerTurn"),hint:a("nativeAgent.callAgentMaxPerTurnHint"),children:e.jsx(m,{type:"number",value:t.callAgentMaxPerTurn,onChange:l=>s("callAgentMaxPerTurn",l.target.value),placeholder:"2",className:"font-mono text-xs"})})]})]})}function _e({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(le,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.criticCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.criticDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.semanticStuckLoop"),hint:a("nativeAgent.semanticStuckLoopHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.semanticStuckLoop,onChange:l=>s("semanticStuckLoop",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.semanticStuckLoop?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.criticEnabled"),hint:a("nativeAgent.criticEnabledHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.criticEnabled,onChange:l=>s("criticEnabled",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.criticEnabled?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.criticRole"),hint:a("nativeAgent.criticRoleHint"),children:e.jsx(m,{value:t.criticRole,onChange:l=>s("criticRole",l.target.value),placeholder:"(use main backend)",className:"font-mono text-xs",disabled:!t.criticEnabled})}),e.jsx(o,{label:a("nativeAgent.planModeDefault"),hint:a("nativeAgent.planModeDefaultHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.planModeDefault,onChange:l=>s("planModeDefault",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.planModeDefault?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.planIntentAuto"),hint:a("nativeAgent.planIntentAutoHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.planIntentAuto,onChange:l=>s("planIntentAuto",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.planIntentAuto?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.planIntentPhrases"),hint:a("nativeAgent.planIntentPhrasesHint"),children:e.jsx(m,{value:t.planIntentPhrases,onChange:l=>s("planIntentPhrases",l.target.value),placeholder:"先想想,plan only,don't act yet",className:"font-mono text-xs",disabled:!t.planIntentAuto})})]})]})}function Te({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(de,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.compactCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.compactDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.compactTriggerChars"),hint:a("nativeAgent.compactTriggerCharsHint"),children:e.jsx(m,{type:"number",value:t.compactTriggerChars,onChange:l=>s("compactTriggerChars",l.target.value),placeholder:"60000",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.compactKeepTurns"),hint:a("nativeAgent.compactKeepTurnsHint"),children:e.jsx(m,{type:"number",value:t.compactKeepTurns,onChange:l=>s("compactKeepTurns",l.target.value),placeholder:"6",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.compactKeepFirst"),hint:a("nativeAgent.compactKeepFirstHint"),children:e.jsx(m,{type:"number",value:t.compactKeepFirst,onChange:l=>s("compactKeepFirst",l.target.value),placeholder:"1",className:"font-mono text-xs"})}),e.jsx(o,{label:a("nativeAgent.compactSummaryChars"),hint:a("nativeAgent.compactSummaryCharsHint"),children:e.jsx(m,{type:"number",value:t.compactSummaryChars,onChange:l=>s("compactSummaryChars",l.target.value),placeholder:"1500",className:"font-mono text-xs"})})]})]})}function Ie({draft:t,setField:s}){const{t:a}=p(["settings","common"]);return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(he,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:a("nativeAgent.streamCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:a("nativeAgent.streamDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(o,{label:a("nativeAgent.streamPartial"),hint:a("nativeAgent.streamPartialHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t.streamPartial,onChange:l=>s("streamPartial",l.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t.streamPartial?a("nativeAgent.on"):a("nativeAgent.off")})]})}),e.jsx(o,{label:a("nativeAgent.maxIter"),hint:a("nativeAgent.maxIterHint"),children:e.jsx(m,{type:"number",value:t.maxIter,onChange:l=>s("maxIter",l.target.value),placeholder:"50",className:"font-mono text-xs"})})]})]})}function o({label:t,hint:s,children:a}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(v,{className:"text-xs font-medium",children:t}),a,s&&e.jsx("p",{className:"text-[11px] text-text-dim",children:s})]})}const Me=["cheap","evaluator","native-chat"],P="__unbind__",G=["deepseek","moonshot","zhipu","openai","anthropic","custom"],H=[{provider:"openai-compat",baseUrl:"https://api.deepseek.com/v1",modelHint:"deepseek-chat"},{provider:"openai-compat",baseUrl:"https://api.moonshot.cn/v1",modelHint:"moonshot-v1-8k"},{provider:"openai-compat",baseUrl:"https://open.bigmodel.cn/api/paas/v4",modelHint:"glm-4-air"},{provider:"openai-compat",baseUrl:"https://api.openai.com/v1",modelHint:"gpt-4o-mini"},{provider:"anthropic",baseUrl:"https://api.anthropic.com",modelHint:"claude-3-5-sonnet-20241022"},{provider:"openai-compat",baseUrl:"",modelHint:""}];function Ge(){const{t}=p(["settings","common"]),s=Y();return e.jsxs("div",{className:"mx-auto flex max-w-5xl flex-col gap-6",children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:t("llm.title")}),e.jsxs(_,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void s.refetch(),disabled:s.isFetching,"aria-label":t("actions.refresh",{ns:"common"}),children:[s.isFetching?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(X,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:t("llm.refresh")})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:t("llm.subtitle")}),s.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx(Ee,{data:s.data}),e.jsx(ye,{}),e.jsx(Ce,{data:s.data}),e.jsxs("section",{id:"agim-agent",className:"rounded-md border border-border bg-surface px-4 py-3",children:[e.jsx("h2",{className:"text-sm font-semibold",children:t("llm.agimAgentRuntimeTitle")}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:t("llm.agimAgentRuntimeHint")})]}),e.jsx(Ae,{embedded:!0})]})]})}function Ee({data:t}){const{t:s}=p(["settings","common"]),a=q(),l=W(),[g,r]=b.useState({});async function n(i){if(confirm(s("llm.removeConfirm",{name:i})))try{const d=await a.mutateAsync(i);j.success(s("llm.removedToast",{count:d.removedRoles}))}catch(d){j.error(d?.message??String(d))}}async function h(i){r(d=>({...d,[i]:s("llm.pinging")}));try{const d=await l.mutateAsync(i),u=d.ok?`✓ ${d.durationMs}ms · tokens ${d.tokensIn}→${d.tokensOut}`:`✗ ${d.error}`;r(I=>({...I,[i]:u}))}catch(d){r(u=>({...u,[i]:`✗ ${d?.message??String(d)}`}))}}const A=t?.backends??[];return A.length===0?e.jsx("section",{className:"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim",children:s("llm.backendsEmpty")}):e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsx("header",{className:"border-b border-border px-4 py-3",children:e.jsx("h2",{className:"text-sm font-semibold",children:s("llm.backendsTitle",{count:A.length})})}),e.jsxs(Z,{children:[e.jsx(Q,{children:e.jsxs(K,{children:[e.jsx(E,{children:s("llm.col.name")}),e.jsx(E,{children:s("llm.col.provider")}),e.jsx(E,{children:s("llm.col.model")}),e.jsx(E,{children:s("llm.col.baseUrl")}),e.jsx(E,{children:s("llm.col.apiKey")}),e.jsx(E,{children:s("llm.col.actions")})]})}),e.jsx(ee,{children:A.map(i=>{const d=i.secret.source==="none"?e.jsx(T,{variant:"outline",children:s("llm.secretMissing")}):e.jsx(T,{variant:"success",children:i.secret.source});return e.jsxs(K,{children:[e.jsx(C,{className:"font-mono text-xs",children:i.name}),e.jsx(C,{children:i.provider}),e.jsx(C,{className:"font-mono text-xs",children:i.model}),e.jsx(C,{className:"break-all font-mono text-[11px] text-text-dim",children:i.baseUrl??"—"}),e.jsx(C,{children:d}),e.jsxs(C,{className:"flex flex-col gap-1 sm:flex-row sm:items-center",children:[e.jsxs(_,{variant:"ghost",size:"sm",onClick:()=>void h(i.name),disabled:l.isPending||i.secret.source==="none",title:i.secret.source==="none"?s("llm.setKeyFirst"):s("llm.pingHint"),children:[e.jsx(ue,{className:"h-4 w-4"}),e.jsx("span",{children:s("llm.ping")})]}),e.jsxs(_,{variant:"ghost",size:"sm",onClick:()=>void n(i.name),disabled:a.isPending,className:"text-danger hover:text-danger",children:[e.jsx(ie,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("llm.remove")})]}),g[i.name]&&e.jsx("span",{className:"ml-2 text-[11px] text-text-dim",children:g[i.name]})]})]},i.name)})})]})]})}function Ce({data:t}){const{t:s}=p(["settings","common"]),a=J(),l=(t?.backends??[]).map(n=>n.name),g=t?.roles??{};async function r(n,h){const A={[n]:h===P?null:h};try{await a.mutateAsync(A),j.success(s("llm.roleUpdated",{role:n}))}catch(i){j.error(i?.message??String(i))}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"border-b border-border px-4 py-3",children:[e.jsx("h2",{className:"text-sm font-semibold",children:s("llm.rolesTitle")}),e.jsx("p",{className:"mt-1 text-xs text-text-dim",children:s("llm.rolesOptionalHint")})]}),e.jsx("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-3",children:Me.map(n=>e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(v,{className:"text-xs font-medium",children:n}),e.jsxs(B,{value:g[n]??P,onValueChange:h=>void r(n,h),disabled:l.length===0||a.isPending,children:[e.jsx(O,{className:"font-mono text-xs",children:e.jsx(w,{placeholder:s("llm.unset")})}),e.jsxs(V,{children:[e.jsx(f,{value:P,children:s("llm.unbound")}),l.map(h=>e.jsx(f,{value:h,children:h},h))]})]}),e.jsx("p",{className:"text-[11px] text-text-dim",children:s(`llm.roleHint.${n}`)})]},n))})]})}function ye(){const{t}=p(["settings","common"]),s=$(),[a,l]=b.useState(0),[g,r]=b.useState(""),[n,h]=b.useState(H[0]?.baseUrl??""),[A,i]=b.useState(H[0]?.modelHint??""),[d,u]=b.useState(""),[I,k]=b.useState(null);function c(x){k(x),j.error(x)}function M(x){l(x);const N=H[x];N&&(h(N.baseUrl),i(N.modelHint))}async function U(x){x.preventDefault();const N=H[a];if(!N){c(t("llm.invalidPreset"));return}if(!g.trim()){c(t("llm.nameRequired"));return}if(!n.trim()){c(t("llm.baseUrlRequired"));return}if(!A.trim()){c(t("llm.modelRequired"));return}if(!d.trim()){c(t("llm.apiKeyRequired"));return}try{await s.mutateAsync({name:g.trim(),provider:N.provider,baseUrl:n.trim(),model:A.trim(),apiKey:d.trim()}),k(null),j.success(t("llm.addedWithKey",{name:g.trim()})),r(""),u("")}catch(D){const z=D?.message??String(D);c(z)}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsx("header",{className:"border-b border-border px-4 py-3",children:e.jsx("h2",{className:"text-sm font-semibold",children:t("llm.addTitle")})}),e.jsxs("form",{onSubmit:x=>void U(x),className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(v,{className:"text-xs font-medium",children:t("llm.preset")}),e.jsxs(B,{value:String(a),onValueChange:x=>M(Number(x)),children:[e.jsx(O,{children:e.jsx(w,{})}),e.jsx(V,{children:H.map((x,N)=>e.jsx(f,{value:String(N),children:t(`llm.presets.${G[N]}`)},G[N]))})]})]}),e.jsxs("div",{children:[e.jsx(v,{className:"text-xs font-medium",children:t("llm.name")}),e.jsx(m,{value:g,onChange:x=>r(x.target.value),placeholder:t("llm.namePlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(v,{className:"text-xs font-medium",children:t("llm.baseUrl")}),e.jsx(m,{value:n,onChange:x=>h(x.target.value),placeholder:t("llm.baseUrlPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(v,{className:"text-xs font-medium",children:t("llm.model")}),e.jsx(m,{value:A,onChange:x=>i(x.target.value),placeholder:t("llm.modelPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(v,{className:"text-xs font-medium",children:t("llm.apiKey")}),e.jsx(m,{type:"password",value:d,onChange:x=>u(x.target.value),placeholder:t("llm.apiKeyPlaceholder"),className:"font-mono text-xs",autoComplete:"off"})]}),e.jsx("div",{className:"sm:col-span-2 flex",children:e.jsxs("div",{className:"flex w-full flex-col gap-2 sm:items-end",children:[I&&e.jsx("p",{className:"text-xs text-danger",children:I}),e.jsxs(_,{type:"submit",disabled:s.isPending,className:"ml-auto",children:[s.isPending?e.jsx(S,{className:"h-4 w-4 animate-spin"}):e.jsx(oe,{className:"h-4 w-4"}),t("llm.addBackend")]})]})})]})]})}export{Ge as default};
|
|
27
|
+
//# sourceMappingURL=llm-DwZX5fwY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-DwZX5fwY.js","sources":["../../node_modules/lucide-react/dist/esm/icons/cpu.js","../../node_modules/lucide-react/dist/esm/icons/file-stack.js","../../node_modules/lucide-react/dist/esm/icons/gauge.js","../../node_modules/lucide-react/dist/esm/icons/waves.js","../../node_modules/lucide-react/dist/esm/icons/zap.js","../../src/routes/settings/native-agent.tsx","../../src/routes/settings/llm.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 Cpu = createLucideIcon(\"Cpu\", [\n [\"rect\", { width: \"16\", height: \"16\", x: \"4\", y: \"4\", rx: \"2\", key: \"14l7u7\" }],\n [\"rect\", { width: \"6\", height: \"6\", x: \"9\", y: \"9\", rx: \"1\", key: \"5aljv4\" }],\n [\"path\", { d: \"M15 2v2\", key: \"13l42r\" }],\n [\"path\", { d: \"M15 20v2\", key: \"15mkzm\" }],\n [\"path\", { d: \"M2 15h2\", key: \"1gxd5l\" }],\n [\"path\", { d: \"M2 9h2\", key: \"1bbxkp\" }],\n [\"path\", { d: \"M20 15h2\", key: \"19e6y8\" }],\n [\"path\", { d: \"M20 9h2\", key: \"19tzq7\" }],\n [\"path\", { d: \"M9 2v2\", key: \"165o2o\" }],\n [\"path\", { d: \"M9 20v2\", key: \"i2bqo8\" }]\n]);\n\nexport { Cpu as default };\n//# sourceMappingURL=cpu.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 FileStack = createLucideIcon(\"FileStack\", [\n [\"path\", { d: \"M21 7h-3a2 2 0 0 1-2-2V2\", key: \"9rb54x\" }],\n [\n \"path\",\n {\n d: \"M21 6v6.5c0 .8-.7 1.5-1.5 1.5h-7c-.8 0-1.5-.7-1.5-1.5v-9c0-.8.7-1.5 1.5-1.5H17Z\",\n key: \"1059l0\"\n }\n ],\n [\"path\", { d: \"M7 8v8.8c0 .3.2.6.4.8.2.2.5.4.8.4H15\", key: \"16874u\" }],\n [\"path\", { d: \"M3 12v8.8c0 .3.2.6.4.8.2.2.5.4.8.4H11\", key: \"k2ox98\" }]\n]);\n\nexport { FileStack as default };\n//# sourceMappingURL=file-stack.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 Gauge = createLucideIcon(\"Gauge\", [\n [\"path\", { d: \"m12 14 4-4\", key: \"9kzdfg\" }],\n [\"path\", { d: \"M3.34 19a10 10 0 1 1 17.32 0\", key: \"19p75a\" }]\n]);\n\nexport { Gauge as default };\n//# sourceMappingURL=gauge.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 Waves = createLucideIcon(\"Waves\", [\n [\n \"path\",\n {\n d: \"M2 6c.6.5 1.2 1 2.5 1C7 7 7 5 9.5 5c2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\",\n key: \"knzxuh\"\n }\n ],\n [\n \"path\",\n {\n d: \"M2 12c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\",\n key: \"2jd2cc\"\n }\n ],\n [\n \"path\",\n {\n d: \"M2 18c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 2.6 0 2.4 2 5 2 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1\",\n key: \"rd2r6e\"\n }\n ]\n]);\n\nexport { Waves as default };\n//# sourceMappingURL=waves.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 Zap = createLucideIcon(\"Zap\", [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n]);\n\nexport { Zap as default };\n//# sourceMappingURL=zap.js.map\n","/**\n * /settings/native-agent — focused env editor for Agim Agent +\n * notification evaluator + heartbeat (Stage 6).\n *\n * All three subsystems are env-driven; their env keys are already in\n * ENV_EDITABLE_KEYS so the generic /api/env GET+PUT pair works. This\n * page just gives them a curated form so operators don't have to dig\n * through the 200+-key generic env editor.\n *\n * The actual model API selection (which LLM, which role) lives on\n * /settings/llm; this module covers behavioral knobs.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport {\n Bell, Cpu, FileStack, Gauge, HeartPulse, Loader2, Network,\n RefreshCcw, Save, ShieldAlert, Waves, X,\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 Select, SelectContent, SelectItem, SelectTrigger, SelectValue,\n} from '@/components/ui/select'\nimport { useEnv, useUpdateEnv } from '@/hooks/use-settings'\n\ntype ApprovalMode = 'allow-all' | 'read-only' | 'allow-list' | 'deny-all'\n\ninterface Draft {\n // Agim Agent\n role: string\n mode: ApprovalMode\n autoAllow: string\n denyList: string\n // Notification evaluator\n evalEnabled: boolean\n evalSources: string\n // Heartbeat\n hbEnabled: boolean\n hbTickMs: string\n hbDefaultMin: string\n // v1.2.126 — runtime caps (each one optional / empty = use default)\n toolResultCap: string\n toolTimeoutMs: string\n blankRetryMax: string\n lengthRecoveryMax: string\n // v1.2.127 — A2A 子 Agent 派生\n a2aMaxDepth: string\n a2aTimeoutMs: string\n callAgentInProcess: boolean\n callAgentMaxPerTurn: string\n // v1.2.127 — 早停 + 复盘\n semanticStuckLoop: boolean\n criticEnabled: boolean\n criticRole: string\n planModeDefault: boolean\n // v1.2.135 — heuristic auto-enter on plan-intent keywords\n planIntentAuto: boolean\n planIntentPhrases: string\n // v1.2.127 — Auto-compact 4 旋钮(OpenHands Condenser)\n compactTriggerChars: string\n compactKeepTurns: string\n compactKeepFirst: string\n compactSummaryChars: string\n // v1.2.127 — 流式 + 迭代\n streamPartial: boolean\n maxIter: string\n}\n\nfunction draftFromEnv(env: Record<string, string>): Draft {\n return {\n role: env.IMHUB_NATIVE_AGENT_ROLE ?? '',\n mode: (env.IMHUB_NATIVE_AGENT_MODE as ApprovalMode | undefined) || 'read-only',\n autoAllow: env.IMHUB_NATIVE_AGENT_AUTOALLOW ?? '',\n denyList: env.IMHUB_NATIVE_AGENT_DENYLIST ?? '',\n evalEnabled: isTruthy(env.IMHUB_NOTIFICATION_EVALUATOR),\n evalSources: env.IMHUB_NOTIFICATION_EVALUATOR_SOURCES ?? '',\n hbEnabled: isTruthy(env.IMHUB_HEARTBEAT_ENABLED),\n hbTickMs: env.IMHUB_HEARTBEAT_TICK_INTERVAL_MS ?? '',\n hbDefaultMin: env.IMHUB_HEARTBEAT_DEFAULT_INTERVAL_MIN ?? '',\n toolResultCap: env.IMHUB_NATIVE_TOOL_RESULT_MAX_CHARS ?? '',\n toolTimeoutMs: env.IMHUB_NATIVE_TOOL_TIMEOUT_MS ?? '',\n blankRetryMax: env.IMHUB_NATIVE_BLANK_RETRY_MAX ?? '',\n lengthRecoveryMax: env.IMHUB_NATIVE_LENGTH_RECOVERY_MAX ?? '',\n a2aMaxDepth: env.IMHUB_A2A_MAX_DEPTH ?? '',\n a2aTimeoutMs: env.IMHUB_A2A_TIMEOUT_DEFAULT_MS ?? '',\n // Default ON: only 'off' / '0' / 'no' / 'false' disable.\n callAgentInProcess: !isFalsy(env.IMHUB_NATIVE_CALL_AGENT_IN_PROCESS),\n callAgentMaxPerTurn: env.IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN ?? '',\n semanticStuckLoop: !isFalsy(env.IMHUB_NATIVE_SEMANTIC_STUCK_LOOP),\n criticEnabled: isTruthy(env.IMHUB_NATIVE_CRITIC),\n criticRole: env.IMHUB_NATIVE_CRITIC_ROLE ?? '',\n planModeDefault: isTruthy(env.IMHUB_NATIVE_PLAN_MODE),\n planIntentAuto: isTruthy(env.IMHUB_PLAN_INTENT_AUTO),\n planIntentPhrases: env.IMHUB_PLAN_INTENT_PHRASES ?? '',\n compactTriggerChars: env.IMHUB_NATIVE_COMPACT_TRIGGER_CHARS ?? '',\n compactKeepTurns: env.IMHUB_NATIVE_COMPACT_KEEP_TURNS ?? '',\n compactKeepFirst: env.IMHUB_NATIVE_COMPACT_KEEP_FIRST ?? '',\n compactSummaryChars: env.IMHUB_NATIVE_COMPACT_SUMMARY_CHARS ?? '',\n streamPartial: !isFalsy(env.IMHUB_NATIVE_STREAM_PARTIAL),\n maxIter: env.IMHUB_NATIVE_AGENT_MAX_ITER ?? '',\n }\n}\n\n/** Mirror of the native-side parser: 'off' / '0' / 'no' / 'false'\n * (case-insensitive) disables a feature whose default is ON. Empty\n * string means \"not set\" — caller decides whether that's ON or OFF\n * depending on the variable's default. */\nfunction isFalsy(v: string | undefined): boolean {\n if (!v) return false\n const s = v.toLowerCase().trim()\n return s === 'off' || s === 'false' || s === '0' || s === 'no'\n}\n\nfunction isTruthy(v: string | undefined): boolean {\n if (!v) return false\n const s = v.toLowerCase()\n return s === '1' || s === 'true' || s === 'yes' || s === 'on'\n}\n\nfunction SubtitleWithLlmLink(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const subtitle = t('nativeAgent.subtitle')\n const link = t('nativeAgent.llmLink')\n const idx = subtitle.indexOf(link)\n if (idx === -1) {\n return <p className=\"text-sm text-text-dim\">{subtitle}</p>\n }\n return (\n <p className=\"text-sm text-text-dim\">\n {subtitle.slice(0, idx)}\n <a className=\"underline\" href={link}>{link}</a>\n {subtitle.slice(idx + link.length)}\n </p>\n )\n}\n\nexport default function SettingsNativeAgentRoute(): JSX.Element {\n return <NativeAgentSettingsPanel />\n}\n\nexport interface NativeAgentSettingsPanelProps {\n embedded?: boolean\n}\n\nexport function NativeAgentSettingsPanel({ embedded = false }: NativeAgentSettingsPanelProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const envQuery = useEnv({ reveal: false })\n const updateEnv = useUpdateEnv()\n\n const envData = envQuery.data?.env ?? {}\n const current = useMemo(() => draftFromEnv(envData), [envData])\n const [draft, setDraft] = useState<Draft>(current)\n const [syncedHash, setSyncedHash] = useState('')\n\n useEffect(() => {\n const hash = JSON.stringify(current)\n if (hash !== syncedHash) {\n setDraft(current)\n setSyncedHash(hash)\n }\n }, [current, syncedHash])\n\n const isDirty = JSON.stringify(draft) !== JSON.stringify(current)\n\n function setField<K extends keyof Draft>(k: K, v: Draft[K]): void {\n setDraft((d) => ({ ...d, [k]: v }))\n }\n\n async function onSave(): Promise<void> {\n const updates: Record<string, string | null> = {}\n if (draft.role !== current.role) {\n updates.IMHUB_NATIVE_AGENT_ROLE = draft.role.trim() || null\n }\n if (draft.mode !== current.mode) {\n updates.IMHUB_NATIVE_AGENT_MODE = draft.mode\n }\n if (draft.autoAllow !== current.autoAllow) {\n updates.IMHUB_NATIVE_AGENT_AUTOALLOW = draft.autoAllow.trim() || null\n }\n if (draft.denyList !== current.denyList) {\n updates.IMHUB_NATIVE_AGENT_DENYLIST = draft.denyList.trim() || null\n }\n if (draft.evalEnabled !== current.evalEnabled) {\n updates.IMHUB_NOTIFICATION_EVALUATOR = draft.evalEnabled ? 'on' : null\n }\n if (draft.evalSources !== current.evalSources) {\n updates.IMHUB_NOTIFICATION_EVALUATOR_SOURCES = draft.evalSources.trim() || null\n }\n if (draft.hbEnabled !== current.hbEnabled) {\n updates.IMHUB_HEARTBEAT_ENABLED = draft.hbEnabled ? 'on' : null\n }\n if (draft.hbTickMs !== current.hbTickMs) {\n updates.IMHUB_HEARTBEAT_TICK_INTERVAL_MS = draft.hbTickMs.trim() || null\n }\n if (draft.hbDefaultMin !== current.hbDefaultMin) {\n updates.IMHUB_HEARTBEAT_DEFAULT_INTERVAL_MIN = draft.hbDefaultMin.trim() || null\n }\n if (draft.toolResultCap !== current.toolResultCap) {\n updates.IMHUB_NATIVE_TOOL_RESULT_MAX_CHARS = draft.toolResultCap.trim() || null\n }\n if (draft.toolTimeoutMs !== current.toolTimeoutMs) {\n updates.IMHUB_NATIVE_TOOL_TIMEOUT_MS = draft.toolTimeoutMs.trim() || null\n }\n if (draft.blankRetryMax !== current.blankRetryMax) {\n updates.IMHUB_NATIVE_BLANK_RETRY_MAX = draft.blankRetryMax.trim() || null\n }\n if (draft.lengthRecoveryMax !== current.lengthRecoveryMax) {\n updates.IMHUB_NATIVE_LENGTH_RECOVERY_MAX = draft.lengthRecoveryMax.trim() || null\n }\n // v1.2.127 — A2A\n if (draft.a2aMaxDepth !== current.a2aMaxDepth) {\n updates.IMHUB_A2A_MAX_DEPTH = draft.a2aMaxDepth.trim() || null\n }\n if (draft.a2aTimeoutMs !== current.a2aTimeoutMs) {\n updates.IMHUB_A2A_TIMEOUT_DEFAULT_MS = draft.a2aTimeoutMs.trim() || null\n }\n if (draft.callAgentInProcess !== current.callAgentInProcess) {\n // Default ON: write only when operator turned OFF; ON = delete the env.\n updates.IMHUB_NATIVE_CALL_AGENT_IN_PROCESS = draft.callAgentInProcess ? null : 'off'\n }\n if (draft.callAgentMaxPerTurn !== current.callAgentMaxPerTurn) {\n updates.IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN = draft.callAgentMaxPerTurn.trim() || null\n }\n // v1.2.127 — 早停 + 复盘\n if (draft.semanticStuckLoop !== current.semanticStuckLoop) {\n updates.IMHUB_NATIVE_SEMANTIC_STUCK_LOOP = draft.semanticStuckLoop ? null : 'off'\n }\n if (draft.criticEnabled !== current.criticEnabled) {\n updates.IMHUB_NATIVE_CRITIC = draft.criticEnabled ? 'on' : null\n }\n if (draft.criticRole !== current.criticRole) {\n updates.IMHUB_NATIVE_CRITIC_ROLE = draft.criticRole.trim() || null\n }\n if (draft.planModeDefault !== current.planModeDefault) {\n updates.IMHUB_NATIVE_PLAN_MODE = draft.planModeDefault ? '1' : null\n }\n if (draft.planIntentAuto !== current.planIntentAuto) {\n updates.IMHUB_PLAN_INTENT_AUTO = draft.planIntentAuto ? 'on' : null\n }\n if (draft.planIntentPhrases !== current.planIntentPhrases) {\n updates.IMHUB_PLAN_INTENT_PHRASES = draft.planIntentPhrases.trim() || null\n }\n // v1.2.127 — Auto-compact\n if (draft.compactTriggerChars !== current.compactTriggerChars) {\n updates.IMHUB_NATIVE_COMPACT_TRIGGER_CHARS = draft.compactTriggerChars.trim() || null\n }\n if (draft.compactKeepTurns !== current.compactKeepTurns) {\n updates.IMHUB_NATIVE_COMPACT_KEEP_TURNS = draft.compactKeepTurns.trim() || null\n }\n if (draft.compactKeepFirst !== current.compactKeepFirst) {\n updates.IMHUB_NATIVE_COMPACT_KEEP_FIRST = draft.compactKeepFirst.trim() || null\n }\n if (draft.compactSummaryChars !== current.compactSummaryChars) {\n updates.IMHUB_NATIVE_COMPACT_SUMMARY_CHARS = draft.compactSummaryChars.trim() || null\n }\n // v1.2.127 — 流式 + 迭代\n if (draft.streamPartial !== current.streamPartial) {\n updates.IMHUB_NATIVE_STREAM_PARTIAL = draft.streamPartial ? null : 'off'\n }\n if (draft.maxIter !== current.maxIter) {\n updates.IMHUB_NATIVE_AGENT_MAX_ITER = draft.maxIter.trim() || null\n }\n if (Object.keys(updates).length === 0) return\n try {\n await updateEnv.mutateAsync({ updates })\n toast.success(t('nativeAgent.savedToast'))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n function onDiscard(): void {\n setDraft(current)\n }\n\n return (\n <div className={embedded ? 'flex flex-col gap-6' : 'mx-auto flex max-w-4xl flex-col gap-6'}>\n {!embedded && (\n <>\n <header className=\"flex items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('nativeAgent.title')}</h1>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void envQuery.refetch()}\n disabled={envQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {envQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('nativeAgent.refresh')}</span>\n </Button>\n </header>\n <SubtitleWithLlmLink />\n </>\n )}\n\n {envQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n <NativeAgentCard draft={draft} setField={setField} />\n <RuntimeCapsCard draft={draft} setField={setField} />\n <A2ACard draft={draft} setField={setField} />\n <CriticCard draft={draft} setField={setField} />\n <CompactCard draft={draft} setField={setField} />\n <StreamCard draft={draft} setField={setField} />\n <EvaluatorCard draft={draft} setField={setField} />\n <HeartbeatCard draft={draft} setField={setField} />\n </>\n )}\n\n {isDirty && (\n <div className={embedded\n ? 'flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-3 shadow'\n : 'sticky bottom-2 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-3 shadow'}\n >\n <Badge variant=\"info\">{t('nativeAgent.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('nativeAgent.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('nativeAgent.save')}\n </Button>\n </div>\n )}\n </div>\n )\n}\n\ninterface CardProps {\n draft: Draft\n setField: <K extends keyof Draft>(k: K, v: Draft[K]) => void\n}\n\nfunction NativeAgentCard({ draft, setField }: CardProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\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 <Cpu className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('nativeAgent.agentCard')}</h2>\n </header>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <Field\n label={t('nativeAgent.roleOverride')}\n hint={t('nativeAgent.roleHint')}\n >\n <Input\n value={draft.role}\n onChange={(e) => setField('role', e.target.value)}\n placeholder=\"native-chat\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('nativeAgent.approvalMode')}\n hint={t('nativeAgent.approvalHint')}\n >\n <Select\n value={draft.mode}\n onValueChange={(v) => setField('mode', v as ApprovalMode)}\n >\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"read-only\">{t('nativeAgent.modeReadOnly')}</SelectItem>\n <SelectItem value=\"allow-list\">{t('nativeAgent.modeAllowList')}</SelectItem>\n <SelectItem value=\"allow-all\">{t('nativeAgent.modeAllowAll')}</SelectItem>\n <SelectItem value=\"deny-all\">{t('nativeAgent.modeDenyAll')}</SelectItem>\n </SelectContent>\n </Select>\n </Field>\n <Field\n label={t('nativeAgent.autoAllow')}\n hint={t('nativeAgent.autoAllowHint')}\n >\n <Input\n value={draft.autoAllow}\n onChange={(e) => setField('autoAllow', e.target.value)}\n placeholder=\"native_,mcp_filesystem_\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('nativeAgent.denyList')}\n hint={t('nativeAgent.denyListHint')}\n >\n <Input\n value={draft.denyList}\n onChange={(e) => setField('denyList', e.target.value)}\n placeholder=\"mcp_shell_,mcp_dangerous_\"\n className=\"font-mono text-xs\"\n />\n </Field>\n </div>\n </section>\n )\n}\n\nfunction EvaluatorCard({ draft, setField }: CardProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\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 <Bell className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('nativeAgent.evaluatorCard')}</h2>\n {draft.evalEnabled\n ? <Badge variant=\"success\">{t('nativeAgent.on')}</Badge>\n : <Badge variant=\"outline\">{t('nativeAgent.off')}</Badge>}\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('nativeAgent.evalDesc')}</p>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <Field label={t('nativeAgent.enableGate')}>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={draft.evalEnabled}\n onChange={(e) => setField('evalEnabled', e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span>{t('nativeAgent.filterViaLlm')}</span>\n </label>\n </Field>\n <Field\n label={t('nativeAgent.evalSources')}\n hint={t('nativeAgent.evalSourcesHint')}\n >\n <Input\n value={draft.evalSources}\n onChange={(e) => setField('evalSources', e.target.value)}\n placeholder=\"push,heartbeat\"\n className=\"font-mono text-xs\"\n disabled={!draft.evalEnabled}\n />\n </Field>\n </div>\n </section>\n )\n}\n\nfunction HeartbeatCard({ draft, setField }: CardProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\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 <HeartPulse className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('nativeAgent.heartbeatCard')}</h2>\n {draft.hbEnabled\n ? <Badge variant=\"success\">{t('nativeAgent.on')}</Badge>\n : <Badge variant=\"outline\">{t('nativeAgent.off')}</Badge>}\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('nativeAgent.hbDesc')}</p>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-3\">\n <Field label={t('nativeAgent.enableScheduler')}>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={draft.hbEnabled}\n onChange={(e) => setField('hbEnabled', e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span>{t('nativeAgent.startScanLoop')}</span>\n </label>\n </Field>\n <Field\n label={t('nativeAgent.tickInterval')}\n hint={t('nativeAgent.tickHint')}\n >\n <Input\n type=\"number\"\n value={draft.hbTickMs}\n onChange={(e) => setField('hbTickMs', e.target.value)}\n placeholder=\"60000\"\n className=\"font-mono text-xs\"\n disabled={!draft.hbEnabled}\n />\n </Field>\n <Field\n label={t('nativeAgent.defaultInterval')}\n hint={t('nativeAgent.defaultIntervalHint')}\n >\n <Input\n type=\"number\"\n value={draft.hbDefaultMin}\n onChange={(e) => setField('hbDefaultMin', e.target.value)}\n placeholder=\"15\"\n className=\"font-mono text-xs\"\n disabled={!draft.hbEnabled}\n />\n </Field>\n </div>\n </section>\n )\n}\n\nfunction RuntimeCapsCard({ draft, setField }: CardProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\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 <Gauge className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('nativeAgent.runtimeCard')}</h2>\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('nativeAgent.runtimeDesc')}</p>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <Field\n label={t('nativeAgent.toolResultCap')}\n hint={t('nativeAgent.toolResultCapHint')}\n >\n <Input\n type=\"number\"\n value={draft.toolResultCap}\n onChange={(e) => setField('toolResultCap', e.target.value)}\n placeholder=\"64000\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('nativeAgent.toolTimeoutMs')}\n hint={t('nativeAgent.toolTimeoutHint')}\n >\n <Input\n type=\"number\"\n value={draft.toolTimeoutMs}\n onChange={(e) => setField('toolTimeoutMs', e.target.value)}\n placeholder=\"60000\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('nativeAgent.blankRetryMax')}\n hint={t('nativeAgent.blankRetryHint')}\n >\n <Input\n type=\"number\"\n value={draft.blankRetryMax}\n onChange={(e) => setField('blankRetryMax', e.target.value)}\n placeholder=\"1\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('nativeAgent.lengthRecoveryMax')}\n hint={t('nativeAgent.lengthRecoveryHint')}\n >\n <Input\n type=\"number\"\n value={draft.lengthRecoveryMax}\n onChange={(e) => setField('lengthRecoveryMax', e.target.value)}\n placeholder=\"1\"\n className=\"font-mono text-xs\"\n />\n </Field>\n </div>\n </section>\n )\n}\n\nfunction A2ACard({ draft, setField }: CardProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\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('nativeAgent.a2aCard')}</h2>\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('nativeAgent.a2aDesc')}</p>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <Field\n label={t('nativeAgent.a2aMaxDepth')}\n hint={t('nativeAgent.a2aMaxDepthHint')}\n >\n <Input\n type=\"number\"\n value={draft.a2aMaxDepth}\n onChange={(e) => setField('a2aMaxDepth', e.target.value)}\n placeholder=\"1\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('nativeAgent.a2aTimeoutMs')}\n hint={t('nativeAgent.a2aTimeoutMsHint')}\n >\n <Input\n type=\"number\"\n value={draft.a2aTimeoutMs}\n onChange={(e) => setField('a2aTimeoutMs', e.target.value)}\n placeholder=\"1800000\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('nativeAgent.callAgentInProcess')}\n hint={t('nativeAgent.callAgentInProcessHint')}\n >\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={draft.callAgentInProcess}\n onChange={(e) => setField('callAgentInProcess', e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span>{draft.callAgentInProcess ? t('nativeAgent.on') : t('nativeAgent.off')}</span>\n </label>\n </Field>\n <Field\n label={t('nativeAgent.callAgentMaxPerTurn')}\n hint={t('nativeAgent.callAgentMaxPerTurnHint')}\n >\n <Input\n type=\"number\"\n value={draft.callAgentMaxPerTurn}\n onChange={(e) => setField('callAgentMaxPerTurn', e.target.value)}\n placeholder=\"2\"\n className=\"font-mono text-xs\"\n />\n </Field>\n </div>\n </section>\n )\n}\n\nfunction CriticCard({ draft, setField }: CardProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\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 <ShieldAlert className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('nativeAgent.criticCard')}</h2>\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('nativeAgent.criticDesc')}</p>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <Field\n label={t('nativeAgent.semanticStuckLoop')}\n hint={t('nativeAgent.semanticStuckLoopHint')}\n >\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={draft.semanticStuckLoop}\n onChange={(e) => setField('semanticStuckLoop', e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span>{draft.semanticStuckLoop ? t('nativeAgent.on') : t('nativeAgent.off')}</span>\n </label>\n </Field>\n <Field\n label={t('nativeAgent.criticEnabled')}\n hint={t('nativeAgent.criticEnabledHint')}\n >\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={draft.criticEnabled}\n onChange={(e) => setField('criticEnabled', e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span>{draft.criticEnabled ? t('nativeAgent.on') : t('nativeAgent.off')}</span>\n </label>\n </Field>\n <Field\n label={t('nativeAgent.criticRole')}\n hint={t('nativeAgent.criticRoleHint')}\n >\n <Input\n value={draft.criticRole}\n onChange={(e) => setField('criticRole', e.target.value)}\n placeholder=\"(use main backend)\"\n className=\"font-mono text-xs\"\n disabled={!draft.criticEnabled}\n />\n </Field>\n <Field\n label={t('nativeAgent.planModeDefault')}\n hint={t('nativeAgent.planModeDefaultHint')}\n >\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={draft.planModeDefault}\n onChange={(e) => setField('planModeDefault', e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span>{draft.planModeDefault ? t('nativeAgent.on') : t('nativeAgent.off')}</span>\n </label>\n </Field>\n <Field\n label={t('nativeAgent.planIntentAuto')}\n hint={t('nativeAgent.planIntentAutoHint')}\n >\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={draft.planIntentAuto}\n onChange={(e) => setField('planIntentAuto', e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span>{draft.planIntentAuto ? t('nativeAgent.on') : t('nativeAgent.off')}</span>\n </label>\n </Field>\n <Field\n label={t('nativeAgent.planIntentPhrases')}\n hint={t('nativeAgent.planIntentPhrasesHint')}\n >\n <Input\n value={draft.planIntentPhrases}\n onChange={(e) => setField('planIntentPhrases', e.target.value)}\n placeholder=\"先想想,plan only,don't act yet\"\n className=\"font-mono text-xs\"\n disabled={!draft.planIntentAuto}\n />\n </Field>\n </div>\n </section>\n )\n}\n\nfunction CompactCard({ draft, setField }: CardProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\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 <FileStack className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('nativeAgent.compactCard')}</h2>\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('nativeAgent.compactDesc')}</p>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <Field\n label={t('nativeAgent.compactTriggerChars')}\n hint={t('nativeAgent.compactTriggerCharsHint')}\n >\n <Input\n type=\"number\"\n value={draft.compactTriggerChars}\n onChange={(e) => setField('compactTriggerChars', e.target.value)}\n placeholder=\"60000\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('nativeAgent.compactKeepTurns')}\n hint={t('nativeAgent.compactKeepTurnsHint')}\n >\n <Input\n type=\"number\"\n value={draft.compactKeepTurns}\n onChange={(e) => setField('compactKeepTurns', e.target.value)}\n placeholder=\"6\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('nativeAgent.compactKeepFirst')}\n hint={t('nativeAgent.compactKeepFirstHint')}\n >\n <Input\n type=\"number\"\n value={draft.compactKeepFirst}\n onChange={(e) => setField('compactKeepFirst', e.target.value)}\n placeholder=\"1\"\n className=\"font-mono text-xs\"\n />\n </Field>\n <Field\n label={t('nativeAgent.compactSummaryChars')}\n hint={t('nativeAgent.compactSummaryCharsHint')}\n >\n <Input\n type=\"number\"\n value={draft.compactSummaryChars}\n onChange={(e) => setField('compactSummaryChars', e.target.value)}\n placeholder=\"1500\"\n className=\"font-mono text-xs\"\n />\n </Field>\n </div>\n </section>\n )\n}\n\nfunction StreamCard({ draft, setField }: CardProps): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\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 <Waves className=\"h-4 w-4 text-text-dim\" />\n <h2 className=\"text-sm font-semibold\">{t('nativeAgent.streamCard')}</h2>\n </header>\n <p className=\"px-4 pt-2 text-xs text-text-dim\">{t('nativeAgent.streamDesc')}</p>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <Field\n label={t('nativeAgent.streamPartial')}\n hint={t('nativeAgent.streamPartialHint')}\n >\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={draft.streamPartial}\n onChange={(e) => setField('streamPartial', e.target.checked)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n <span>{draft.streamPartial ? t('nativeAgent.on') : t('nativeAgent.off')}</span>\n </label>\n </Field>\n <Field\n label={t('nativeAgent.maxIter')}\n hint={t('nativeAgent.maxIterHint')}\n >\n <Input\n type=\"number\"\n value={draft.maxIter}\n onChange={(e) => setField('maxIter', e.target.value)}\n placeholder=\"50\"\n className=\"font-mono text-xs\"\n />\n </Field>\n </div>\n </section>\n )\n}\n\ninterface FieldProps {\n label: string\n hint?: string\n children: React.ReactNode\n}\nfunction Field({ label, hint, children }: FieldProps): JSX.Element {\n return (\n <div className=\"flex flex-col gap-1\">\n <Label className=\"text-xs font-medium\">{label}</Label>\n {children}\n {hint && <p className=\"text-[11px] text-text-dim\">{hint}</p>}\n </div>\n )\n}\n","/**\n * /settings/llm — Agim Agent model APIs + runtime settings.\n *\n * Front-end for the `/api/llm/*` REST surface that landed in Stage 4.\n * Operators add an OpenAI-compatible or Anthropic API, paste an API\n * key, optionally bind roles (cheap / evaluator / native-chat), and\n * tune built-in Agim Agent runtime behavior without hand-editing\n * ~/.agim/config.json.\n *\n * Intentionally minimal styling — focused on doing the job; matches\n * the existing settings pages' shadcn look without bespoke chrome.\n */\n\nimport { useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { CheckCircle2, Loader2, Plus, RefreshCcw, Trash2, Zap } from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue,\n} from '@/components/ui/select'\nimport {\n Table, TableBody, TableCell, TableHead, TableHeader, TableRow,\n} from '@/components/ui/table'\nimport {\n useLlmList, useLlmAddBackend, useLlmRemoveBackend, useLlmPutRoles, useLlmPing,\n} from '@/hooks/use-llm-admin'\nimport { NativeAgentSettingsPanel } from '@/routes/settings/native-agent'\n\nconst KNOWN_ROLES = ['cheap', 'evaluator', 'native-chat'] as const\nconst UNBIND_SENTINEL = '__unbind__'\n\ninterface ProviderPreset {\n provider: 'openai-compat' | 'anthropic'\n baseUrl: string\n modelHint: string\n}\n\nconst PRESET_KEYS = ['deepseek', 'moonshot', 'zhipu', 'openai', 'anthropic', 'custom'] as const\n\nconst PRESETS: ProviderPreset[] = [\n { provider: 'openai-compat',\n baseUrl: 'https://api.deepseek.com/v1', modelHint: 'deepseek-chat' },\n { provider: 'openai-compat',\n baseUrl: 'https://api.moonshot.cn/v1', modelHint: 'moonshot-v1-8k' },\n { provider: 'openai-compat',\n baseUrl: 'https://open.bigmodel.cn/api/paas/v4', modelHint: 'glm-4-air' },\n { provider: 'openai-compat',\n baseUrl: 'https://api.openai.com/v1', modelHint: 'gpt-4o-mini' },\n { provider: 'anthropic',\n // No trailing /v1: the Anthropic provider appends `/v1/messages` itself.\n baseUrl: 'https://api.anthropic.com', modelHint: 'claude-3-5-sonnet-20241022' },\n { provider: 'openai-compat',\n baseUrl: '', modelHint: '' },\n]\n\nexport default function SettingsLlmRoute(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const listQuery = useLlmList()\n return (\n <div className=\"mx-auto flex max-w-5xl flex-col gap-6\">\n <header className=\"flex items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('llm.title')}</h1>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('llm.refresh')}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">{t('llm.subtitle')}</p>\n\n {listQuery.isLoading ? (\n <div className=\"h-64 rounded-md bg-surface-2 animate-pulse\" />\n ) : (\n <>\n <BackendsCard data={listQuery.data} />\n <AddBackendCard />\n <RolesCard data={listQuery.data} />\n <section id=\"agim-agent\" className=\"rounded-md border border-border bg-surface px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('llm.agimAgentRuntimeTitle')}</h2>\n <p className=\"mt-1 text-xs text-text-dim\">{t('llm.agimAgentRuntimeHint')}</p>\n </section>\n <NativeAgentSettingsPanel embedded />\n </>\n )}\n </div>\n )\n}\n\n/* ─────────────── Backends list ─────────────── */\n\nfunction BackendsCard({ data }: { data: ReturnType<typeof useLlmList>['data'] }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const removeBackend = useLlmRemoveBackend()\n const ping = useLlmPing()\n const [pingResults, setPingResults] = useState<Record<string, string>>({})\n\n async function onRemove(name: string): Promise<void> {\n if (!confirm(t('llm.removeConfirm', { name }))) return\n try {\n const r = await removeBackend.mutateAsync(name)\n toast.success(t('llm.removedToast', { count: r.removedRoles }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n async function onPing(name: string): Promise<void> {\n setPingResults((m) => ({ ...m, [name]: t('llm.pinging') }))\n try {\n const r = await ping.mutateAsync(name)\n const msg = r.ok\n ? `✓ ${r.durationMs}ms · tokens ${r.tokensIn}→${r.tokensOut}`\n : `✗ ${r.error}`\n setPingResults((m) => ({ ...m, [name]: msg }))\n } catch (err) {\n setPingResults((m) => ({ ...m, [name]: `✗ ${((err as Error)?.message ?? String(err))}` }))\n }\n }\n\n const rows = data?.backends ?? []\n if (rows.length === 0) {\n return (\n <section className=\"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim\">\n {t('llm.backendsEmpty')}\n </section>\n )\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('llm.backendsTitle', { count: rows.length })}</h2>\n </header>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{t('llm.col.name')}</TableHead>\n <TableHead>{t('llm.col.provider')}</TableHead>\n <TableHead>{t('llm.col.model')}</TableHead>\n <TableHead>{t('llm.col.baseUrl')}</TableHead>\n <TableHead>{t('llm.col.apiKey')}</TableHead>\n <TableHead>{t('llm.col.actions')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((b) => {\n const keyBadge = b.secret.source === 'none'\n ? <Badge variant=\"outline\">{t('llm.secretMissing')}</Badge>\n : <Badge variant=\"success\">{b.secret.source}</Badge>\n return (\n <TableRow key={b.name}>\n <TableCell className=\"font-mono text-xs\">{b.name}</TableCell>\n <TableCell>{b.provider}</TableCell>\n <TableCell className=\"font-mono text-xs\">{b.model}</TableCell>\n <TableCell className=\"break-all font-mono text-[11px] text-text-dim\">{b.baseUrl ?? '—'}</TableCell>\n <TableCell>{keyBadge}</TableCell>\n <TableCell className=\"flex flex-col gap-1 sm:flex-row sm:items-center\">\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onPing(b.name)}\n disabled={ping.isPending || b.secret.source === 'none'}\n title={b.secret.source === 'none' ? t('llm.setKeyFirst') : t('llm.pingHint')}\n >\n <Zap className=\"h-4 w-4\" />\n <span>{t('llm.ping')}</span>\n </Button>\n <Button\n variant=\"ghost\" size=\"sm\"\n onClick={() => void onRemove(b.name)}\n disabled={removeBackend.isPending}\n className=\"text-danger hover:text-danger\"\n >\n <Trash2 className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{t('llm.remove')}</span>\n </Button>\n {pingResults[b.name] && (\n <span className=\"ml-2 text-[11px] text-text-dim\">{pingResults[b.name]}</span>\n )}\n </TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </section>\n )\n}\n\n/* ─────────────── Role bindings ─────────────── */\n\nfunction RolesCard({ data }: { data: ReturnType<typeof useLlmList>['data'] }): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const putRoles = useLlmPutRoles()\n const backendNames = (data?.backends ?? []).map((b) => b.name)\n const current = data?.roles ?? {}\n\n async function onChangeRole(role: string, value: string): Promise<void> {\n const next: Record<string, string | null> = {\n [role]: value === UNBIND_SENTINEL ? null : value,\n }\n try {\n await putRoles.mutateAsync(next)\n toast.success(t('llm.roleUpdated', { role }))\n } catch (err) {\n toast.error(((err as Error)?.message ?? String(err)))\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('llm.rolesTitle')}</h2>\n <p className=\"mt-1 text-xs text-text-dim\">{t('llm.rolesOptionalHint')}</p>\n </header>\n <div className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-3\">\n {KNOWN_ROLES.map((role) => (\n <div key={role} className=\"flex flex-col gap-1\">\n <Label className=\"text-xs font-medium\">{role}</Label>\n <Select\n value={current[role] ?? UNBIND_SENTINEL}\n onValueChange={(v) => void onChangeRole(role, v)}\n disabled={backendNames.length === 0 || putRoles.isPending}\n >\n <SelectTrigger className=\"font-mono text-xs\">\n <SelectValue placeholder={t('llm.unset')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={UNBIND_SENTINEL}>{t('llm.unbound')}</SelectItem>\n {backendNames.map((n) => (\n <SelectItem key={n} value={n}>{n}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-[11px] text-text-dim\">\n {t(`llm.roleHint.${role}`)}\n </p>\n </div>\n ))}\n </div>\n </section>\n )\n}\n\n/* ─────────────── Add backend form ─────────────── */\n\nfunction AddBackendCard(): JSX.Element {\n const { t } = useTranslation(['settings', 'common'])\n const addBackend = useLlmAddBackend()\n const [presetIdx, setPresetIdx] = useState(0)\n const [name, setName] = useState('')\n const [baseUrl, setBaseUrl] = useState(PRESETS[0]?.baseUrl ?? '')\n const [model, setModel] = useState(PRESETS[0]?.modelHint ?? '')\n const [apiKey, setApiKey] = useState('')\n const [formError, setFormError] = useState<string | null>(null)\n\n function fail(message: string): void {\n setFormError(message)\n toast.error(message)\n }\n\n function onPickPreset(idx: number): void {\n setPresetIdx(idx)\n const p = PRESETS[idx]\n if (!p) return\n setBaseUrl(p.baseUrl)\n setModel(p.modelHint)\n }\n\n async function onSubmit(e: React.FormEvent): Promise<void> {\n e.preventDefault()\n const p = PRESETS[presetIdx]\n if (!p) { fail(t('llm.invalidPreset')); return }\n if (!name.trim()) { fail(t('llm.nameRequired')); return }\n if (!baseUrl.trim()) { fail(t('llm.baseUrlRequired')); return }\n if (!model.trim()) { fail(t('llm.modelRequired')); return }\n if (!apiKey.trim()) { fail(t('llm.apiKeyRequired')); return }\n try {\n await addBackend.mutateAsync({\n name: name.trim(),\n provider: p.provider,\n baseUrl: baseUrl.trim(),\n model: model.trim(),\n apiKey: apiKey.trim(),\n })\n setFormError(null)\n toast.success(t('llm.addedWithKey', { name: name.trim() }))\n setName(''); setApiKey('')\n } catch (err) {\n const message = ((err as Error)?.message ?? String(err))\n fail(message)\n }\n }\n\n return (\n <section className=\"rounded-md border border-border bg-surface\">\n <header className=\"border-b border-border px-4 py-3\">\n <h2 className=\"text-sm font-semibold\">{t('llm.addTitle')}</h2>\n </header>\n <form onSubmit={(e) => void onSubmit(e)} className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2\">\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.preset')}</Label>\n <Select value={String(presetIdx)} onValueChange={(v) => onPickPreset(Number(v))}>\n <SelectTrigger><SelectValue /></SelectTrigger>\n <SelectContent>\n {PRESETS.map((_p, i) => (\n <SelectItem key={PRESET_KEYS[i]} value={String(i)}>\n {t(`llm.presets.${PRESET_KEYS[i]}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.name')}</Label>\n <Input\n value={name} onChange={(e) => setName(e.target.value)}\n placeholder={t('llm.namePlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div className=\"sm:col-span-2\">\n <Label className=\"text-xs font-medium\">{t('llm.baseUrl')}</Label>\n <Input\n value={baseUrl} onChange={(e) => setBaseUrl(e.target.value)}\n placeholder={t('llm.baseUrlPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.model')}</Label>\n <Input\n value={model} onChange={(e) => setModel(e.target.value)}\n placeholder={t('llm.modelPlaceholder')}\n className=\"font-mono text-xs\"\n />\n </div>\n <div>\n <Label className=\"text-xs font-medium\">{t('llm.apiKey')}</Label>\n <Input\n type=\"password\"\n value={apiKey} onChange={(e) => setApiKey(e.target.value)}\n placeholder={t('llm.apiKeyPlaceholder')}\n className=\"font-mono text-xs\"\n autoComplete=\"off\"\n />\n </div>\n <div className=\"sm:col-span-2 flex\">\n <div className=\"flex w-full flex-col gap-2 sm:items-end\">\n {formError && (\n <p className=\"text-xs text-danger\">{formError}</p>\n )}\n <Button\n type=\"submit\"\n disabled={addBackend.isPending}\n className=\"ml-auto\"\n >\n {addBackend.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <Plus className=\"h-4 w-4\" />}\n {t('llm.addBackend')}\n </Button>\n </div>\n </div>\n </form>\n </section>\n )\n}\n\n/* helper — toast tag passthrough */\nfunction _unused(): typeof CheckCircle2 { return CheckCircle2 }\nvoid _unused\n"],"names":["Cpu","createLucideIcon","FileStack","Gauge","Waves","Zap","draftFromEnv","env","isTruthy","isFalsy","v","SubtitleWithLlmLink","useTranslation","subtitle","link","idx","jsx","jsxs","NativeAgentSettingsPanel","embedded","t","envQuery","useEnv","updateEnv","useUpdateEnv","envData","current","useMemo","draft","setDraft","useState","syncedHash","setSyncedHash","useEffect","hash","isDirty","setField","k","d","onSave","updates","toast","err","onDiscard","Fragment","Button","Loader2","RefreshCcw","NativeAgentCard","RuntimeCapsCard","A2ACard","CriticCard","CompactCard","StreamCard","EvaluatorCard","HeartbeatCard","Badge","X","Save","Field","Input","e","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Bell","HeartPulse","Network","ShieldAlert","label","hint","children","Label","KNOWN_ROLES","UNBIND_SENTINEL","PRESET_KEYS","PRESETS","SettingsLlmRoute","listQuery","useLlmList","BackendsCard","AddBackendCard","RolesCard","data","removeBackend","useLlmRemoveBackend","ping","useLlmPing","pingResults","setPingResults","onRemove","name","r","onPing","m","msg","rows","Table","TableHeader","TableRow","TableHead","TableBody","b","keyBadge","TableCell","Trash2","putRoles","useLlmPutRoles","backendNames","onChangeRole","role","value","next","n","addBackend","useLlmAddBackend","presetIdx","setPresetIdx","setName","baseUrl","setBaseUrl","model","setModel","apiKey","setApiKey","formError","setFormError","fail","message","onPickPreset","p","onSubmit","_p","i","Plus"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as e}from"./index-
|
|
1
|
+
import{o as e}from"./index-BIBWEKxu.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 o=e("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);export{o as L};
|
|
7
|
-
//# sourceMappingURL=loader-circle-
|
|
7
|
+
//# sourceMappingURL=loader-circle-BQkLEJZw.js.map
|
package/dist/web/public/assets/{loader-circle-DO3Ni2RJ.js.map → loader-circle-BQkLEJZw.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-circle-
|
|
1
|
+
{"version":3,"file":"loader-circle-BQkLEJZw.js","sources":["../../node_modules/lucide-react/dist/esm/icons/loader-circle.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 LoaderCircle = createLucideIcon(\"LoaderCircle\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]\n]);\n\nexport { LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n"],"names":["LoaderCircle","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,8BAA+B,IAAK,QAAQ,CAAE,CAC9D,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as c}from"./index-
|
|
1
|
+
import{o as c}from"./index-BIBWEKxu.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=c("MapPin",[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]]);export{r as M};
|
|
7
|
-
//# sourceMappingURL=map-pin-
|
|
7
|
+
//# sourceMappingURL=map-pin-B-IMY07m.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-pin-
|
|
1
|
+
{"version":3,"file":"map-pin-B-IMY07m.js","sources":["../../node_modules/lucide-react/dist/esm/icons/map-pin.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 MapPin = createLucideIcon(\"MapPin\", [\n [\n \"path\",\n {\n d: \"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\",\n key: \"1r0f0z\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"10\", r: \"3\", key: \"ilqhr7\" }]\n]);\n\nexport { MapPin as default };\n//# sourceMappingURL=map-pin.js.map\n"],"names":["MapPin","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAASC,EAAiB,SAAU,CACxC,CACE,OACA,CACE,EAAG,uGACH,IAAK,QACX,CACA,EACE,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,QAAQ,CAAE,CAC1D,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as A,u as L,
|
|
1
|
+
import{o as A,u as L,af as M,j as e,B as k,ag as q,ah as z,l as C,ai as B,L as x,I as v,S as F,g as I,h as O,i as $,k as R,m as o}from"./index-BIBWEKxu.js";import{r as l}from"./react-DlP5eolq.js";import{T as E,a as D,b as H,c as b,d as J,e as N}from"./table-Dww-k14l.js";import{L as P}from"./loader-circle-BQkLEJZw.js";import{R as V}from"./refresh-ccw-CFPE6zD1.js";import{A as U}from"./activity--oN7qxFJ.js";import{T as Q}from"./trash-2-BF98SY8M.js";import{P as W}from"./plus-6MNGQidu.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 G=A("ServerCog",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5",key:"tn8das"}],["path",{d:"M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5",key:"1g2pve"}],["path",{d:"M6 6h.01",key:"1utrut"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"m15.7 13.4-.9-.3",key:"1jwmzr"}],["path",{d:"m9.2 10.9-.9-.3",key:"qapnim"}],["path",{d:"m10.6 15.7.3-.9",key:"quwk0k"}],["path",{d:"m13.6 15.7-.4-1",key:"cb9xp7"}],["path",{d:"m10.8 9.3-.4-1",key:"1uaiz5"}],["path",{d:"m8.3 13.6 1-.4",key:"s6srou"}],["path",{d:"m14.7 10.8 1-.4",key:"4d31cq"}],["path",{d:"m13.4 8.3-.3.9",key:"1bm987"}]]);function ce(){const{t}=L(["settings","common"]),s=M();return e.jsxs("div",{className:"mx-auto flex max-w-5xl flex-col gap-6",children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx(G,{className:"h-5 w-5 text-text-dim"}),e.jsx("h1",{className:"text-xl font-semibold",children:t("mcp.title")}),e.jsxs(k,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void s.refetch(),disabled:s.isFetching,"aria-label":t("actions.refresh",{ns:"common"}),children:[s.isFetching?e.jsx(P,{className:"h-4 w-4 animate-spin"}):e.jsx(V,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:t("mcp.refresh")})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:t("mcp.subtitle")}),s.isLoading?e.jsx("div",{className:"h-48 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx(K,{data:s.data}),e.jsx(Y,{})]})]})}function K({data:t}){const{t:s}=L(["settings","common"]),m=q(),p=z(),[i,u]=l.useState({});async function j(a){if(confirm(s("mcp.removeConfirm",{name:a})))try{await m.mutateAsync(a),o.success(s("mcp.removedToast",{name:a}))}catch(r){o.error(r?.message??String(r))}}async function y(a){u(r=>({...r,[a]:s("mcp.probing")}));try{const r=await p.mutateAsync(a),c=r.connected?`✓ ${r.toolCount===1?s("mcp.runtimeConnectedOne",{count:r.toolCount}):s("mcp.runtimeConnected",{count:r.toolCount})}`:`✗ ${r.lastError??s("mcp.runtimeDisconnected")}`;u(h=>({...h,[a]:c}))}catch(r){u(c=>({...c,[a]:`✗ ${r?.message??String(r)}`}))}}const d=t?.servers??[],S=t?.runtime?.servers??[];return d.length===0?e.jsx("section",{className:"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim",children:s("mcp.serversEmpty")}):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("h2",{className:"text-sm font-semibold",children:s("mcp.serversTitle",{count:d.length})}),t?.runtime&&e.jsx(C,{variant:"info",children:s("mcp.totalTools",{count:t.runtime.totalTools})})]}),e.jsxs(E,{children:[e.jsx(D,{children:e.jsxs(H,{children:[e.jsx(b,{children:s("mcp.col.name")}),e.jsx(b,{children:s("mcp.col.transport")}),e.jsx(b,{children:s("mcp.col.target")}),e.jsx(b,{children:s("mcp.col.runtime")}),e.jsx(b,{children:s("mcp.col.actions")})]})}),e.jsx(J,{children:d.map(a=>{const r=S.find(n=>n.name===a.name),c=X(a,s),h=a.command?`${a.command} ${(a.args??[]).join(" ")}`.trim():a.url??"—",w=r?r.connected?e.jsx(C,{variant:"success",children:r.toolCount===1?s("mcp.runtimeConnectedOne",{count:r.toolCount}):s("mcp.runtimeConnected",{count:r.toolCount})}):e.jsx(C,{variant:"danger",children:s("mcp.runtimeDisconnected")}):e.jsx(C,{variant:"outline",children:s("mcp.runtimeUnknown")});return e.jsxs(H,{children:[e.jsx(N,{className:"font-mono text-xs",children:a.name}),e.jsx(N,{children:c}),e.jsx(N,{className:"break-all font-mono text-[11px] text-text-dim",children:h}),e.jsx(N,{children:w}),e.jsxs(N,{className:"flex flex-col gap-1 sm:flex-row sm:items-center",children:[e.jsxs(k,{variant:"ghost",size:"sm",onClick:()=>void y(a.name),disabled:p.isPending,children:[e.jsx(U,{className:"h-4 w-4"}),e.jsx("span",{children:s("mcp.health")})]}),e.jsxs(k,{variant:"ghost",size:"sm",onClick:()=>void j(a.name),disabled:m.isPending,className:"text-danger hover:text-danger",children:[e.jsx(Q,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("mcp.remove")})]}),i[a.name]&&e.jsx("span",{className:"ml-2 text-[11px] text-text-dim",children:i[a.name]})]})]},a.name)})})]})]})}function X(t,s){return t.command?s("mcp.transportStdio"):t.url?t.url.endsWith("/sse")?s("mcp.transportSse"):s("mcp.transportHttp"):"—"}function Y(){const{t}=L(["settings","common"]),s=B(),[m,p]=l.useState(""),[i,u]=l.useState("stdio"),[j,y]=l.useState(""),[d,S]=l.useState(""),[a,r]=l.useState(""),[c,h]=l.useState("");async function w(n){if(n.preventDefault(),!m.trim()){o.error(t("mcp.nameRequired"));return}let T;if(c.trim())try{T=JSON.parse(c)}catch{o.error(t("mcp.headersInvalid"));return}const g={name:m.trim()};if(i==="stdio"){if(!j.trim()){o.error(t("mcp.commandRequired"));return}g.command=j.trim();const f=d.split(/\s+/).filter(Boolean);f.length>0&&(g.args=f)}else{if(!a.trim()){o.error(t("mcp.urlRequired"));return}g.url=a.trim(),T&&(g.headers=T)}try{await s.mutateAsync(g),o.success(t("mcp.addedToast",{name:m.trim()})),p(""),y(""),S(""),r(""),h("")}catch(f){o.error(f?.message??String(f))}}return e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsx("header",{className:"border-b border-border px-4 py-3",children:e.jsx("h2",{className:"text-sm font-semibold",children:t("mcp.addTitle")})}),e.jsxs("form",{onSubmit:n=>void w(n),className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.nameLabel")}),e.jsx(v,{value:m,onChange:n=>p(n.target.value),placeholder:t("mcp.namePlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.transportLabel")}),e.jsxs(F,{value:i,onValueChange:n=>u(n),children:[e.jsx(I,{children:e.jsx(O,{})}),e.jsxs($,{children:[e.jsx(R,{value:"stdio",children:t("mcp.transportStdioOption")}),e.jsx(R,{value:"http",children:t("mcp.transportHttpOption")})]})]})]}),i==="stdio"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.commandLabel")}),e.jsx(v,{value:j,onChange:n=>y(n.target.value),placeholder:t("mcp.commandPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.argsLabel")}),e.jsx(v,{value:d,onChange:n=>S(n.target.value),placeholder:"-y @modelcontextprotocol/server-filesystem /data",className:"font-mono text-xs"})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.urlLabel")}),e.jsx(v,{value:a,onChange:n=>r(n.target.value),placeholder:t("mcp.urlPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(x,{className:"text-xs font-medium",children:t("mcp.headersLabel")}),e.jsx(v,{value:c,onChange:n=>h(n.target.value),placeholder:t("mcp.headersPlaceholder"),className:"font-mono text-xs"})]})]}),e.jsx("div",{className:"sm:col-span-2 flex",children:e.jsxs(k,{type:"submit",disabled:s.isPending,className:"ml-auto",children:[s.isPending?e.jsx(P,{className:"h-4 w-4 animate-spin"}):e.jsx(W,{className:"h-4 w-4"}),t("mcp.addServer")]})})]})]})}export{ce as default};
|
|
7
|
-
//# sourceMappingURL=mcp-
|
|
7
|
+
//# sourceMappingURL=mcp-K0P3-b6q.js.map
|