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,2 +0,0 @@
|
|
|
1
|
-
import{u as a,j as e,T as i,N as r,c as n,O as m}from"./index-D7BuMEIr.js";import"./react-DlP5eolq.js";const u=[{to:"messengers",i18nKey:"tabs.messengers",mounted:!0},{to:"email",i18nKey:"tabs.email",mounted:!0},{to:"viewer",i18nKey:"tabs.viewer",mounted:!0},{to:"agents",i18nKey:"tabs.agents",mounted:!0},{to:"llm",i18nKey:"tabs.llm",mounted:!0},{to:"mcp",i18nKey:"tabs.mcp",mounted:!0},{to:"native-agent",i18nKey:"tabs.nativeAgent",mounted:!0},{to:"search",i18nKey:"tabs.search",mounted:!0},{to:"mobile",i18nKey:"tabs.mobile",mounted:!0},{to:"agim-skills",i18nKey:"tabs.agimSkills",mounted:!0},{to:"policy",i18nKey:"tabs.policy",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(i,{}),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(r,{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-0rDvqHCV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layout-0rDvqHCV.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: 'email', i18nKey: 'tabs.email', mounted: true },\n { to: 'viewer', i18nKey: 'tabs.viewer', mounted: true },\n { to: 'agents', i18nKey: 'tabs.agents', mounted: true },\n // Stage 6 — native LLM stack. Three tabs in a logical group:\n // LLM backends (config + secrets) -> MCP external servers ->\n // native agent / evaluator / heartbeat behavior knobs.\n { to: 'llm', i18nKey: 'tabs.llm', mounted: true },\n { to: 'mcp', i18nKey: 'tabs.mcp', mounted: true },\n { to: 'native-agent', i18nKey: 'tabs.nativeAgent', mounted: true },\n // v1.2.126 — web_search provider chain + per-provider keys.\n { to: 'search', i18nKey: 'tabs.search', 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 { to: 'policy', i18nKey: 'tabs.policy', 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,QAAgB,QAAS,aAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,SAAgB,QAAS,cAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,SAAgB,QAAS,cAAqB,QAAS,EAAA,EAI7D,CAAE,GAAI,MAAgB,QAAS,WAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,MAAgB,QAAS,WAAqB,QAAS,EAAA,EAC7D,CAAE,GAAI,eAAgB,QAAS,mBAAqB,QAAS,EAAA,EAE7D,CAAE,GAAI,SAAgB,QAAS,cAAqB,QAAS,EAAA,EAE7D,CAAE,GAAI,SAAgB,QAAS,cAAqB,QAAS,EAAA,EAE7D,CAAE,GAAI,cAAgB,QAAS,kBAAqB,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,7 +0,0 @@
|
|
|
1
|
-
import{o as I,u as k,a9 as _,j as e,B as y,aa as $,ab as z,l as T,ac as O,L as b,S as L,g as B,h as H,i as E,k as R,ad as q,I as N,m}from"./index-D7BuMEIr.js";import{r as f}from"./react-DlP5eolq.js";import{T as F,a as M,b as U,c as j,d as V,e as g}from"./table-CSHCu7pz.js";import{L as K}from"./loader-circle-DO3Ni2RJ.js";import{R as D}from"./refresh-ccw-BhPAzZAa.js";import{T as W}from"./trash-2-Cco09tAA.js";import{P as Z}from"./plus-BxjzY9Wh.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 Q=I("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"}]]),Y=["cheap","evaluator","native-chat"],P="__unbind__",w=["deepseek","moonshot","zhipu","openai","anthropic","custom"],v=[{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 oe(){const{t:a}=k(["settings","common"]),s=_();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:a("llm.title")}),e.jsxs(y,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void s.refetch(),disabled:s.isFetching,"aria-label":a("actions.refresh",{ns:"common"}),children:[s.isFetching?e.jsx(K,{className:"h-4 w-4 animate-spin"}):e.jsx(D,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:a("llm.refresh")})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:a("llm.subtitle")}),s.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx(G,{data:s.data}),e.jsx(J,{data:s.data}),e.jsx(X,{})]})]})}function G({data:a}){const{t:s}=k(["settings","common"]),x=$(),p=z(),[i,h]=f.useState({});async function r(t){if(confirm(s("llm.removeConfirm",{name:t})))try{const l=await x.mutateAsync(t);m.success(s("llm.removedToast",{count:l.removedRoles}))}catch(l){m.error(l?.message??String(l))}}async function o(t){h(l=>({...l,[t]:s("llm.pinging")}));try{const l=await p.mutateAsync(t),u=l.ok?`✓ ${l.durationMs}ms · tokens ${l.tokensIn}→${l.tokensOut}`:`✗ ${l.error}`;h(S=>({...S,[t]:u}))}catch(l){h(u=>({...u,[t]:`✗ ${l?.message??String(l)}`}))}}const d=a?.backends??[];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("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:d.length})})}),e.jsxs(F,{children:[e.jsx(M,{children:e.jsxs(U,{children:[e.jsx(j,{children:s("llm.col.name")}),e.jsx(j,{children:s("llm.col.provider")}),e.jsx(j,{children:s("llm.col.model")}),e.jsx(j,{children:s("llm.col.baseUrl")}),e.jsx(j,{children:s("llm.col.apiKey")}),e.jsx(j,{children:s("llm.col.actions")})]})}),e.jsx(V,{children:d.map(t=>{const l=t.secret.source==="none"?e.jsx(T,{variant:"outline",children:s("llm.secretMissing")}):e.jsx(T,{variant:"success",children:t.secret.source});return e.jsxs(U,{children:[e.jsx(g,{className:"font-mono text-xs",children:t.name}),e.jsx(g,{children:t.provider}),e.jsx(g,{className:"font-mono text-xs",children:t.model}),e.jsx(g,{className:"break-all font-mono text-[11px] text-text-dim",children:t.baseUrl??"—"}),e.jsx(g,{children:l}),e.jsxs(g,{className:"flex flex-col gap-1 sm:flex-row sm:items-center",children:[e.jsxs(y,{variant:"ghost",size:"sm",onClick:()=>void o(t.name),disabled:p.isPending||t.secret.source==="none",title:t.secret.source==="none"?s("llm.setKeyFirst"):s("llm.pingHint"),children:[e.jsx(Q,{className:"h-4 w-4"}),e.jsx("span",{children:s("llm.ping")})]}),e.jsxs(y,{variant:"ghost",size:"sm",onClick:()=>void r(t.name),disabled:x.isPending,className:"text-danger hover:text-danger",children:[e.jsx(W,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("llm.remove")})]}),i[t.name]&&e.jsx("span",{className:"ml-2 text-[11px] text-text-dim",children:i[t.name]})]})]},t.name)})})]})]})}function J({data:a}){const{t:s}=k(["settings","common"]),x=O(),p=(a?.backends??[]).map(r=>r.name),i=a?.roles??{};async function h(r,o){const d={[r]:o===P?null:o};try{await x.mutateAsync(d),m.success(s("llm.roleUpdated",{role:r}))}catch(t){m.error(t?.message??String(t))}}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:Y.map(r=>e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(b,{className:"text-xs font-medium",children:r}),e.jsxs(L,{value:i[r]??P,onValueChange:o=>void h(r,o),disabled:p.length===0||x.isPending,children:[e.jsx(B,{className:"font-mono text-xs",children:e.jsx(H,{placeholder:s("llm.unset")})}),e.jsxs(E,{children:[e.jsx(R,{value:P,children:s("llm.unbound")}),p.map(o=>e.jsx(R,{value:o,children:o},o))]})]}),e.jsx("p",{className:"text-[11px] text-text-dim",children:s(`llm.roleHint.${r}`)})]},r))})]})}function X(){const{t:a}=k(["settings","common"]),s=q(),[x,p]=f.useState(0),[i,h]=f.useState(""),[r,o]=f.useState(v[0]?.baseUrl??""),[d,t]=f.useState(v[0]?.modelHint??""),[l,u]=f.useState("");function S(n){p(n);const c=v[n];c&&(o(c.baseUrl),t(c.modelHint))}async function A(n){n.preventDefault();const c=v[x];if(!c){m.error(a("llm.invalidPreset"));return}if(!i.trim()){m.error(a("llm.nameRequired"));return}if(!r.trim()){m.error(a("llm.baseUrlRequired"));return}if(!d.trim()){m.error(a("llm.modelRequired"));return}try{await s.mutateAsync({name:i.trim(),provider:c.provider,baseUrl:r.trim(),model:d.trim(),...l.trim()?{apiKey:l.trim()}:{}}),m.success(l.trim()?a("llm.addedWithKey",{name:i.trim()}):a("llm.addedNoKey",{name:i.trim()})),h(""),u("")}catch(C){m.error(C?.message??String(C))}}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:a("llm.addTitle")})}),e.jsxs("form",{onSubmit:n=>void A(n),className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsxs("div",{children:[e.jsx(b,{className:"text-xs font-medium",children:a("llm.preset")}),e.jsxs(L,{value:String(x),onValueChange:n=>S(Number(n)),children:[e.jsx(B,{children:e.jsx(H,{})}),e.jsx(E,{children:v.map((n,c)=>e.jsx(R,{value:String(c),children:a(`llm.presets.${w[c]}`)},w[c]))})]})]}),e.jsxs("div",{children:[e.jsx(b,{className:"text-xs font-medium",children:a("llm.name")}),e.jsx(N,{value:i,onChange:n=>h(n.target.value),placeholder:a("llm.namePlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{className:"sm:col-span-2",children:[e.jsx(b,{className:"text-xs font-medium",children:a("llm.baseUrl")}),e.jsx(N,{value:r,onChange:n=>o(n.target.value),placeholder:a("llm.baseUrlPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(b,{className:"text-xs font-medium",children:a("llm.model")}),e.jsx(N,{value:d,onChange:n=>t(n.target.value),placeholder:a("llm.modelPlaceholder"),className:"font-mono text-xs"})]}),e.jsxs("div",{children:[e.jsx(b,{className:"text-xs font-medium",children:a("llm.apiKeyOptional")}),e.jsx(N,{type:"password",value:l,onChange:n=>u(n.target.value),placeholder:a("llm.apiKeyPlaceholder"),className:"font-mono text-xs",autoComplete:"off"})]}),e.jsx("div",{className:"sm:col-span-2 flex",children:e.jsxs(y,{type:"submit",disabled:s.isPending,className:"ml-auto",children:[s.isPending?e.jsx(K,{className:"h-4 w-4 animate-spin"}):e.jsx(Z,{className:"h-4 w-4"}),a("llm.addBackend")]})})]})]})}export{oe as default};
|
|
7
|
-
//# sourceMappingURL=llm-COWnMdB9.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-COWnMdB9.js","sources":["../../node_modules/lucide-react/dist/esm/icons/zap.js","../../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 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/llm — native LLM backends + role bindings (Stage 6).\n *\n * Front-end for the `/api/llm/*` REST surface that landed in Stage 4.\n * Operators add an OpenAI-compatible or Anthropic backend, paste an\n * API key, optionally bind roles (cheap / evaluator / native-chat),\n * and ping-test the connection — all 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'\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 <RolesCard data={listQuery.data} />\n <AddBackendCard />\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\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) { toast.error(t('llm.invalidPreset')); return }\n if (!name.trim()) { toast.error(t('llm.nameRequired')); return }\n if (!baseUrl.trim()) { toast.error(t('llm.baseUrlRequired')); return }\n if (!model.trim()) { toast.error(t('llm.modelRequired')); 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.trim() ? { apiKey: apiKey.trim() } : {}),\n })\n toast.success(\n apiKey.trim()\n ? t('llm.addedWithKey', { name: name.trim() })\n : t('llm.addedNoKey', { name: name.trim() }),\n )\n setName(''); setApiKey('')\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.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.apiKeyOptional')}</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 <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 </form>\n </section>\n )\n}\n\n/* helper — toast tag passthrough */\nfunction _unused(): typeof CheckCircle2 { return CheckCircle2 }\nvoid _unused\n"],"names":["Zap","createLucideIcon","KNOWN_ROLES","UNBIND_SENTINEL","PRESET_KEYS","PRESETS","SettingsLlmRoute","t","useTranslation","listQuery","useLlmList","jsxs","jsx","Button","Loader2","RefreshCcw","Fragment","BackendsCard","RolesCard","AddBackendCard","data","removeBackend","useLlmRemoveBackend","ping","useLlmPing","pingResults","setPingResults","useState","onRemove","name","r","toast","err","onPing","m","msg","rows","Table","TableHeader","TableRow","TableHead","TableBody","b","keyBadge","Badge","TableCell","Trash2","putRoles","useLlmPutRoles","backendNames","current","onChangeRole","role","value","next","Label","Select","v","SelectTrigger","SelectValue","SelectContent","SelectItem","n","addBackend","useLlmAddBackend","presetIdx","setPresetIdx","setName","baseUrl","setBaseUrl","model","setModel","apiKey","setApiKey","onPickPreset","idx","p","onSubmit","e","_p","i","Input","Plus"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import{o as A,u as m,j as e,B as _,l as h,X as H,m as v,I as o,S as y,g as R,h as S,i as U,k as g,L as k}from"./index-D7BuMEIr.js";import{r as p}from"./react-DlP5eolq.js";import{u as L,a as B}from"./use-settings-DQnJkPXp.js";import{L as I}from"./loader-circle-DO3Ni2RJ.js";import{R as P}from"./refresh-ccw-BhPAzZAa.js";import{S as O}from"./save-Cye8Vlu5.js";import{N as V}from"./network-pNcx_slv.js";import{S as D}from"./shield-alert-CBOmgn9W.js";import{B as w}from"./bell-BLwNOhXO.js";import{H as K}from"./heart-pulse-8RDC8GWv.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 G=A("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 X=A("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 Y=A("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 z=A("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"}]]);function F(a){return{role:a.IMHUB_NATIVE_AGENT_ROLE??"",mode:a.IMHUB_NATIVE_AGENT_MODE||"read-only",autoAllow:a.IMHUB_NATIVE_AGENT_AUTOALLOW??"",denyList:a.IMHUB_NATIVE_AGENT_DENYLIST??"",evalEnabled:x(a.IMHUB_NOTIFICATION_EVALUATOR),evalSources:a.IMHUB_NOTIFICATION_EVALUATOR_SOURCES??"",hbEnabled:x(a.IMHUB_HEARTBEAT_ENABLED),hbTickMs:a.IMHUB_HEARTBEAT_TICK_INTERVAL_MS??"",hbDefaultMin:a.IMHUB_HEARTBEAT_DEFAULT_INTERVAL_MIN??"",toolResultCap:a.IMHUB_NATIVE_TOOL_RESULT_MAX_CHARS??"",toolTimeoutMs:a.IMHUB_NATIVE_TOOL_TIMEOUT_MS??"",blankRetryMax:a.IMHUB_NATIVE_BLANK_RETRY_MAX??"",lengthRecoveryMax:a.IMHUB_NATIVE_LENGTH_RECOVERY_MAX??"",a2aMaxDepth:a.IMHUB_A2A_MAX_DEPTH??"",a2aTimeoutMs:a.IMHUB_A2A_TIMEOUT_DEFAULT_MS??"",callAgentInProcess:!N(a.IMHUB_NATIVE_CALL_AGENT_IN_PROCESS),callAgentMaxPerTurn:a.IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN??"",semanticStuckLoop:!N(a.IMHUB_NATIVE_SEMANTIC_STUCK_LOOP),criticEnabled:x(a.IMHUB_NATIVE_CRITIC),criticRole:a.IMHUB_NATIVE_CRITIC_ROLE??"",planModeDefault:x(a.IMHUB_NATIVE_PLAN_MODE),planIntentAuto:x(a.IMHUB_PLAN_INTENT_AUTO),planIntentPhrases:a.IMHUB_PLAN_INTENT_PHRASES??"",compactTriggerChars:a.IMHUB_NATIVE_COMPACT_TRIGGER_CHARS??"",compactKeepTurns:a.IMHUB_NATIVE_COMPACT_KEEP_TURNS??"",compactKeepFirst:a.IMHUB_NATIVE_COMPACT_KEEP_FIRST??"",compactSummaryChars:a.IMHUB_NATIVE_COMPACT_SUMMARY_CHARS??"",streamPartial:!N(a.IMHUB_NATIVE_STREAM_PARTIAL),maxIter:a.IMHUB_NATIVE_AGENT_MAX_ITER??""}}function N(a){if(!a)return!1;const l=a.toLowerCase().trim();return l==="off"||l==="false"||l==="0"||l==="no"}function x(a){if(!a)return!1;const l=a.toLowerCase();return l==="1"||l==="true"||l==="yes"||l==="on"}function W(){const{t:a}=m(["settings","common"]),l=a("nativeAgent.subtitle"),t=a("nativeAgent.llmLink"),s=l.indexOf(t);return s===-1?e.jsx("p",{className:"text-sm text-text-dim",children:l}):e.jsxs("p",{className:"text-sm text-text-dim",children:[l.slice(0,s),e.jsx("a",{className:"underline",href:t,children:t}),l.slice(s+t.length)]})}function he(){const{t:a}=m(["settings","common"]),l=L({reveal:!1}),t=B(),s=l.data?.env??{},c=p.useMemo(()=>F(s),[s]),[n,b]=p.useState(c),[T,M]=p.useState("");p.useEffect(()=>{const r=JSON.stringify(c);r!==T&&(b(c),M(r))},[c,T]);const E=JSON.stringify(n)!==JSON.stringify(c);function d(r,u){b(C=>({...C,[r]:u}))}async function j(){const r={};if(n.role!==c.role&&(r.IMHUB_NATIVE_AGENT_ROLE=n.role.trim()||null),n.mode!==c.mode&&(r.IMHUB_NATIVE_AGENT_MODE=n.mode),n.autoAllow!==c.autoAllow&&(r.IMHUB_NATIVE_AGENT_AUTOALLOW=n.autoAllow.trim()||null),n.denyList!==c.denyList&&(r.IMHUB_NATIVE_AGENT_DENYLIST=n.denyList.trim()||null),n.evalEnabled!==c.evalEnabled&&(r.IMHUB_NOTIFICATION_EVALUATOR=n.evalEnabled?"on":null),n.evalSources!==c.evalSources&&(r.IMHUB_NOTIFICATION_EVALUATOR_SOURCES=n.evalSources.trim()||null),n.hbEnabled!==c.hbEnabled&&(r.IMHUB_HEARTBEAT_ENABLED=n.hbEnabled?"on":null),n.hbTickMs!==c.hbTickMs&&(r.IMHUB_HEARTBEAT_TICK_INTERVAL_MS=n.hbTickMs.trim()||null),n.hbDefaultMin!==c.hbDefaultMin&&(r.IMHUB_HEARTBEAT_DEFAULT_INTERVAL_MIN=n.hbDefaultMin.trim()||null),n.toolResultCap!==c.toolResultCap&&(r.IMHUB_NATIVE_TOOL_RESULT_MAX_CHARS=n.toolResultCap.trim()||null),n.toolTimeoutMs!==c.toolTimeoutMs&&(r.IMHUB_NATIVE_TOOL_TIMEOUT_MS=n.toolTimeoutMs.trim()||null),n.blankRetryMax!==c.blankRetryMax&&(r.IMHUB_NATIVE_BLANK_RETRY_MAX=n.blankRetryMax.trim()||null),n.lengthRecoveryMax!==c.lengthRecoveryMax&&(r.IMHUB_NATIVE_LENGTH_RECOVERY_MAX=n.lengthRecoveryMax.trim()||null),n.a2aMaxDepth!==c.a2aMaxDepth&&(r.IMHUB_A2A_MAX_DEPTH=n.a2aMaxDepth.trim()||null),n.a2aTimeoutMs!==c.a2aTimeoutMs&&(r.IMHUB_A2A_TIMEOUT_DEFAULT_MS=n.a2aTimeoutMs.trim()||null),n.callAgentInProcess!==c.callAgentInProcess&&(r.IMHUB_NATIVE_CALL_AGENT_IN_PROCESS=n.callAgentInProcess?null:"off"),n.callAgentMaxPerTurn!==c.callAgentMaxPerTurn&&(r.IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN=n.callAgentMaxPerTurn.trim()||null),n.semanticStuckLoop!==c.semanticStuckLoop&&(r.IMHUB_NATIVE_SEMANTIC_STUCK_LOOP=n.semanticStuckLoop?null:"off"),n.criticEnabled!==c.criticEnabled&&(r.IMHUB_NATIVE_CRITIC=n.criticEnabled?"on":null),n.criticRole!==c.criticRole&&(r.IMHUB_NATIVE_CRITIC_ROLE=n.criticRole.trim()||null),n.planModeDefault!==c.planModeDefault&&(r.IMHUB_NATIVE_PLAN_MODE=n.planModeDefault?"1":null),n.planIntentAuto!==c.planIntentAuto&&(r.IMHUB_PLAN_INTENT_AUTO=n.planIntentAuto?"on":null),n.planIntentPhrases!==c.planIntentPhrases&&(r.IMHUB_PLAN_INTENT_PHRASES=n.planIntentPhrases.trim()||null),n.compactTriggerChars!==c.compactTriggerChars&&(r.IMHUB_NATIVE_COMPACT_TRIGGER_CHARS=n.compactTriggerChars.trim()||null),n.compactKeepTurns!==c.compactKeepTurns&&(r.IMHUB_NATIVE_COMPACT_KEEP_TURNS=n.compactKeepTurns.trim()||null),n.compactKeepFirst!==c.compactKeepFirst&&(r.IMHUB_NATIVE_COMPACT_KEEP_FIRST=n.compactKeepFirst.trim()||null),n.compactSummaryChars!==c.compactSummaryChars&&(r.IMHUB_NATIVE_COMPACT_SUMMARY_CHARS=n.compactSummaryChars.trim()||null),n.streamPartial!==c.streamPartial&&(r.IMHUB_NATIVE_STREAM_PARTIAL=n.streamPartial?null:"off"),n.maxIter!==c.maxIter&&(r.IMHUB_NATIVE_AGENT_MAX_ITER=n.maxIter.trim()||null),Object.keys(r).length!==0)try{await t.mutateAsync({updates:r}),v.success(a("nativeAgent.savedToast"))}catch(u){v.error(u?.message??String(u))}}function f(){b(c)}return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-6",children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:a("nativeAgent.title")}),e.jsxs(_,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void l.refetch(),disabled:l.isFetching,"aria-label":a("actions.refresh",{ns:"common"}),children:[l.isFetching?e.jsx(I,{className:"h-4 w-4 animate-spin"}):e.jsx(P,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:a("nativeAgent.refresh")})]})]}),e.jsx(W,{}),l.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs(e.Fragment,{children:[e.jsx(J,{draft:n,setField:d}),e.jsx(Z,{draft:n,setField:d}),e.jsx($,{draft:n,setField:d}),e.jsx(ee,{draft:n,setField:d}),e.jsx(te,{draft:n,setField:d}),e.jsx(ae,{draft:n,setField:d}),e.jsx(q,{draft:n,setField:d}),e.jsx(Q,{draft:n,setField:d})]}),E&&e.jsxs("div",{className:"sticky bottom-2 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-3 shadow",children:[e.jsx(h,{variant:"info",children:a("nativeAgent.unsaved")}),e.jsxs(_,{variant:"ghost",size:"sm",className:"ml-auto",onClick:f,disabled:t.isPending,children:[e.jsx(H,{className:"h-4 w-4"})," ",a("nativeAgent.discard")]}),e.jsxs(_,{size:"sm",onClick:()=>void j(),disabled:t.isPending,children:[t.isPending?e.jsx(I,{className:"h-4 w-4 animate-spin"}):e.jsx(O,{className:"h-4 w-4"}),a("nativeAgent.save")]})]})]})}function J({draft:a,setField:l}){const{t}=m(["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(G,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:t("nativeAgent.agentCard")})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(i,{label:t("nativeAgent.roleOverride"),hint:t("nativeAgent.roleHint"),children:e.jsx(o,{value:a.role,onChange:s=>l("role",s.target.value),placeholder:"native-chat",className:"font-mono text-xs"})}),e.jsx(i,{label:t("nativeAgent.approvalMode"),hint:t("nativeAgent.approvalHint"),children:e.jsxs(y,{value:a.mode,onValueChange:s=>l("mode",s),children:[e.jsx(R,{children:e.jsx(S,{})}),e.jsxs(U,{children:[e.jsx(g,{value:"read-only",children:t("nativeAgent.modeReadOnly")}),e.jsx(g,{value:"allow-list",children:t("nativeAgent.modeAllowList")}),e.jsx(g,{value:"allow-all",children:t("nativeAgent.modeAllowAll")}),e.jsx(g,{value:"deny-all",children:t("nativeAgent.modeDenyAll")})]})]})}),e.jsx(i,{label:t("nativeAgent.autoAllow"),hint:t("nativeAgent.autoAllowHint"),children:e.jsx(o,{value:a.autoAllow,onChange:s=>l("autoAllow",s.target.value),placeholder:"native_,mcp_filesystem_",className:"font-mono text-xs"})}),e.jsx(i,{label:t("nativeAgent.denyList"),hint:t("nativeAgent.denyListHint"),children:e.jsx(o,{value:a.denyList,onChange:s=>l("denyList",s.target.value),placeholder:"mcp_shell_,mcp_dangerous_",className:"font-mono text-xs"})})]})]})}function q({draft:a,setField:l}){const{t}=m(["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(w,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:t("nativeAgent.evaluatorCard")}),a.evalEnabled?e.jsx(h,{variant:"success",children:t("nativeAgent.on")}):e.jsx(h,{variant:"outline",children:t("nativeAgent.off")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:t("nativeAgent.evalDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(i,{label:t("nativeAgent.enableGate"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:a.evalEnabled,onChange:s=>l("evalEnabled",s.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t("nativeAgent.filterViaLlm")})]})}),e.jsx(i,{label:t("nativeAgent.evalSources"),hint:t("nativeAgent.evalSourcesHint"),children:e.jsx(o,{value:a.evalSources,onChange:s=>l("evalSources",s.target.value),placeholder:"push,heartbeat",className:"font-mono text-xs",disabled:!a.evalEnabled})})]})]})}function Q({draft:a,setField:l}){const{t}=m(["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(K,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:t("nativeAgent.heartbeatCard")}),a.hbEnabled?e.jsx(h,{variant:"success",children:t("nativeAgent.on")}):e.jsx(h,{variant:"outline",children:t("nativeAgent.off")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:t("nativeAgent.hbDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-3",children:[e.jsx(i,{label:t("nativeAgent.enableScheduler"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:a.hbEnabled,onChange:s=>l("hbEnabled",s.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:t("nativeAgent.startScanLoop")})]})}),e.jsx(i,{label:t("nativeAgent.tickInterval"),hint:t("nativeAgent.tickHint"),children:e.jsx(o,{type:"number",value:a.hbTickMs,onChange:s=>l("hbTickMs",s.target.value),placeholder:"60000",className:"font-mono text-xs",disabled:!a.hbEnabled})}),e.jsx(i,{label:t("nativeAgent.defaultInterval"),hint:t("nativeAgent.defaultIntervalHint"),children:e.jsx(o,{type:"number",value:a.hbDefaultMin,onChange:s=>l("hbDefaultMin",s.target.value),placeholder:"15",className:"font-mono text-xs",disabled:!a.hbEnabled})})]})]})}function Z({draft:a,setField:l}){const{t}=m(["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(Y,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:t("nativeAgent.runtimeCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:t("nativeAgent.runtimeDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(i,{label:t("nativeAgent.toolResultCap"),hint:t("nativeAgent.toolResultCapHint"),children:e.jsx(o,{type:"number",value:a.toolResultCap,onChange:s=>l("toolResultCap",s.target.value),placeholder:"64000",className:"font-mono text-xs"})}),e.jsx(i,{label:t("nativeAgent.toolTimeoutMs"),hint:t("nativeAgent.toolTimeoutHint"),children:e.jsx(o,{type:"number",value:a.toolTimeoutMs,onChange:s=>l("toolTimeoutMs",s.target.value),placeholder:"60000",className:"font-mono text-xs"})}),e.jsx(i,{label:t("nativeAgent.blankRetryMax"),hint:t("nativeAgent.blankRetryHint"),children:e.jsx(o,{type:"number",value:a.blankRetryMax,onChange:s=>l("blankRetryMax",s.target.value),placeholder:"1",className:"font-mono text-xs"})}),e.jsx(i,{label:t("nativeAgent.lengthRecoveryMax"),hint:t("nativeAgent.lengthRecoveryHint"),children:e.jsx(o,{type:"number",value:a.lengthRecoveryMax,onChange:s=>l("lengthRecoveryMax",s.target.value),placeholder:"1",className:"font-mono text-xs"})})]})]})}function $({draft:a,setField:l}){const{t}=m(["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(V,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:t("nativeAgent.a2aCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:t("nativeAgent.a2aDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(i,{label:t("nativeAgent.a2aMaxDepth"),hint:t("nativeAgent.a2aMaxDepthHint"),children:e.jsx(o,{type:"number",value:a.a2aMaxDepth,onChange:s=>l("a2aMaxDepth",s.target.value),placeholder:"1",className:"font-mono text-xs"})}),e.jsx(i,{label:t("nativeAgent.a2aTimeoutMs"),hint:t("nativeAgent.a2aTimeoutMsHint"),children:e.jsx(o,{type:"number",value:a.a2aTimeoutMs,onChange:s=>l("a2aTimeoutMs",s.target.value),placeholder:"1800000",className:"font-mono text-xs"})}),e.jsx(i,{label:t("nativeAgent.callAgentInProcess"),hint:t("nativeAgent.callAgentInProcessHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:a.callAgentInProcess,onChange:s=>l("callAgentInProcess",s.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:a.callAgentInProcess?t("nativeAgent.on"):t("nativeAgent.off")})]})}),e.jsx(i,{label:t("nativeAgent.callAgentMaxPerTurn"),hint:t("nativeAgent.callAgentMaxPerTurnHint"),children:e.jsx(o,{type:"number",value:a.callAgentMaxPerTurn,onChange:s=>l("callAgentMaxPerTurn",s.target.value),placeholder:"2",className:"font-mono text-xs"})})]})]})}function ee({draft:a,setField:l}){const{t}=m(["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(D,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:t("nativeAgent.criticCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:t("nativeAgent.criticDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(i,{label:t("nativeAgent.semanticStuckLoop"),hint:t("nativeAgent.semanticStuckLoopHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:a.semanticStuckLoop,onChange:s=>l("semanticStuckLoop",s.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:a.semanticStuckLoop?t("nativeAgent.on"):t("nativeAgent.off")})]})}),e.jsx(i,{label:t("nativeAgent.criticEnabled"),hint:t("nativeAgent.criticEnabledHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:a.criticEnabled,onChange:s=>l("criticEnabled",s.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:a.criticEnabled?t("nativeAgent.on"):t("nativeAgent.off")})]})}),e.jsx(i,{label:t("nativeAgent.criticRole"),hint:t("nativeAgent.criticRoleHint"),children:e.jsx(o,{value:a.criticRole,onChange:s=>l("criticRole",s.target.value),placeholder:"(use main backend)",className:"font-mono text-xs",disabled:!a.criticEnabled})}),e.jsx(i,{label:t("nativeAgent.planModeDefault"),hint:t("nativeAgent.planModeDefaultHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:a.planModeDefault,onChange:s=>l("planModeDefault",s.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:a.planModeDefault?t("nativeAgent.on"):t("nativeAgent.off")})]})}),e.jsx(i,{label:t("nativeAgent.planIntentAuto"),hint:t("nativeAgent.planIntentAutoHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:a.planIntentAuto,onChange:s=>l("planIntentAuto",s.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:a.planIntentAuto?t("nativeAgent.on"):t("nativeAgent.off")})]})}),e.jsx(i,{label:t("nativeAgent.planIntentPhrases"),hint:t("nativeAgent.planIntentPhrasesHint"),children:e.jsx(o,{value:a.planIntentPhrases,onChange:s=>l("planIntentPhrases",s.target.value),placeholder:"先想想,plan only,don't act yet",className:"font-mono text-xs",disabled:!a.planIntentAuto})})]})]})}function te({draft:a,setField:l}){const{t}=m(["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(X,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:t("nativeAgent.compactCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:t("nativeAgent.compactDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(i,{label:t("nativeAgent.compactTriggerChars"),hint:t("nativeAgent.compactTriggerCharsHint"),children:e.jsx(o,{type:"number",value:a.compactTriggerChars,onChange:s=>l("compactTriggerChars",s.target.value),placeholder:"60000",className:"font-mono text-xs"})}),e.jsx(i,{label:t("nativeAgent.compactKeepTurns"),hint:t("nativeAgent.compactKeepTurnsHint"),children:e.jsx(o,{type:"number",value:a.compactKeepTurns,onChange:s=>l("compactKeepTurns",s.target.value),placeholder:"6",className:"font-mono text-xs"})}),e.jsx(i,{label:t("nativeAgent.compactKeepFirst"),hint:t("nativeAgent.compactKeepFirstHint"),children:e.jsx(o,{type:"number",value:a.compactKeepFirst,onChange:s=>l("compactKeepFirst",s.target.value),placeholder:"1",className:"font-mono text-xs"})}),e.jsx(i,{label:t("nativeAgent.compactSummaryChars"),hint:t("nativeAgent.compactSummaryCharsHint"),children:e.jsx(o,{type:"number",value:a.compactSummaryChars,onChange:s=>l("compactSummaryChars",s.target.value),placeholder:"1500",className:"font-mono text-xs"})})]})]})}function ae({draft:a,setField:l}){const{t}=m(["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(z,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:t("nativeAgent.streamCard")})]}),e.jsx("p",{className:"px-4 pt-2 text-xs text-text-dim",children:t("nativeAgent.streamDesc")}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2",children:[e.jsx(i,{label:t("nativeAgent.streamPartial"),hint:t("nativeAgent.streamPartialHint"),children:e.jsxs("label",{className:"flex items-center gap-2 text-sm",children:[e.jsx("input",{type:"checkbox",checked:a.streamPartial,onChange:s=>l("streamPartial",s.target.checked),className:"h-4 w-4 accent-accent cursor-pointer"}),e.jsx("span",{children:a.streamPartial?t("nativeAgent.on"):t("nativeAgent.off")})]})}),e.jsx(i,{label:t("nativeAgent.maxIter"),hint:t("nativeAgent.maxIterHint"),children:e.jsx(o,{type:"number",value:a.maxIter,onChange:s=>l("maxIter",s.target.value),placeholder:"50",className:"font-mono text-xs"})})]})]})}function i({label:a,hint:l,children:t}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(k,{className:"text-xs font-medium",children:a}),t,l&&e.jsx("p",{className:"text-[11px] text-text-dim",children:l})]})}export{he as default};
|
|
22
|
-
//# sourceMappingURL=native-agent-MGgMeTHN.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"native-agent-MGgMeTHN.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","../../src/routes/settings/native-agent.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 * /settings/native-agent — focused env editor for native 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 native agent backend selection (which LLM, which role)\n * lives on /settings/llm; this page only covers the 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 // Native 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 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=\"mx-auto flex max-w-4xl flex-col gap-6\">\n <header className=\"flex items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('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 {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=\"sticky bottom-2 flex items-center gap-2 rounded-md border border-border bg-surface px-4 py-3 shadow\">\n <Badge variant=\"info\">{t('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"],"names":["Cpu","createLucideIcon","FileStack","Gauge","Waves","draftFromEnv","env","isTruthy","isFalsy","v","s","SubtitleWithLlmLink","t","useTranslation","subtitle","link","idx","jsx","jsxs","SettingsNativeAgentRoute","envQuery","useEnv","updateEnv","useUpdateEnv","envData","current","useMemo","draft","setDraft","useState","syncedHash","setSyncedHash","useEffect","hash","isDirty","setField","k","d","onSave","updates","toast","err","onDiscard","Button","Loader2","RefreshCcw","Fragment","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"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import{o as u,u as f,j as e,l as j,B as p,L as g,I as N,C as b}from"./index-D7BuMEIr.js";import{r as c}from"./react-DlP5eolq.js";import{T as y,a as v,b as x,c as i,d as C,e as l}from"./table-CSHCu7pz.js";import{f as k}from"./use-background-tasks-D77bcfrq.js";import{L as w}from"./loader-circle-DO3Ni2RJ.js";import{R as V}from"./refresh-ccw-BhPAzZAa.js";import{C as F}from"./chevron-right-CpWYrqTa.js";import{C as L}from"./clock-BPBx4QWT.js";import{C as M}from"./circle-x-QODE2UcL.js";import{C as T}from"./circle-check-DhcTh_uP.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 R=u("ClipboardList",[["rect",{width:"8",height:"4",x:"8",y:"2",rx:"1",ry:"1",key:"tgr4d6"}],["path",{d:"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2",key:"116196"}],["path",{d:"M12 11h4",key:"1jrz19"}],["path",{d:"M12 16h4",key:"n85exb"}],["path",{d:"M8 11h.01",key:"1dfujw"}],["path",{d:"M8 16h.01",key:"18s6g9"}]]);/**
|
|
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 P=u("PenLine",[["path",{d:"M12 20h9",key:"t2du7b"}],["path",{d:"M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z",key:"1ykcvy"}]]),E={approved:e.jsx(T,{className:"h-3 w-3"}),rejected:e.jsx(M,{className:"h-3 w-3"}),edited:e.jsx(P,{className:"h-3 w-3"}),expired:e.jsx(L,{className:"h-3 w-3"})},O={approved:"success",rejected:"warning",edited:"info",expired:"outline"};function A(a){if(a==null)return"—";if(a<1e3)return`${a}ms`;const s=a/1e3;return s<60?`${s.toFixed(1)}s`:`${(s/60).toFixed(1)}min`}function W(){const{t:a}=f(["tasks","common"]),[s,r]=c.useState(""),[d,o]=c.useState(""),t=k({threadKey:d||void 0,limit:200}),h=c.useMemo(()=>t.data?.plans??[],[t.data]);function m(){o(s.trim())}return e.jsxs("div",{className:"mx-auto flex max-w-6xl flex-col gap-4 p-4",children:[e.jsxs("header",{className:"flex items-center gap-3",children:[e.jsx(R,{className:"h-5 w-5 text-text-dim"}),e.jsx("h1",{className:"text-xl font-semibold",children:a("plans.title",{defaultValue:"Plan history"})}),e.jsx(j,{variant:"info",children:h.length}),e.jsxs(p,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void t.refetch(),disabled:t.isFetching,"aria-label":a("actions.refresh",{ns:"common"}),children:[t.isFetching?e.jsx(w,{className:"h-4 w-4 animate-spin"}):e.jsx(V,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:a("plans.refresh",{defaultValue:"Refresh"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:a("plans.subtitle",{defaultValue:"Every native_exit_plan_mode handshake (v1.2.131) lands here with outcome + the plan markdown the model proposed."})}),e.jsxs("section",{className:"flex items-end gap-2 rounded-md border border-border bg-surface p-3",children:[e.jsxs("div",{className:"flex flex-1 flex-col gap-1",children:[e.jsx(g,{className:"text-xs font-medium",children:a("plans.filterLabel",{defaultValue:"Filter by thread key (optional)"})}),e.jsx(N,{value:s,onChange:n=>r(n.target.value),onKeyDown:n=>{n.key==="Enter"&&m()},placeholder:"tg:8754479311:default",className:"font-mono text-xs"})]}),e.jsx(p,{size:"sm",onClick:m,disabled:t.isFetching,children:a("plans.applyFilter",{defaultValue:"Apply"})}),d&&e.jsx(p,{size:"sm",variant:"ghost",onClick:()=>{r(""),o("")},children:a("plans.clearFilter",{defaultValue:"Clear"})})]}),t.isLoading?e.jsx("div",{className:"h-32 rounded-md bg-surface-2 animate-pulse"}):h.length===0?e.jsx("section",{className:"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim",children:d?a("plans.emptyFiltered",{defaultValue:"No plan history for this thread. Either the thread never entered plan mode, or it was approved without going through the exit handshake (e.g. /plan off manually)."}):a("plans.empty",{defaultValue:"No plans yet. Try /plan on in an IM thread and let the model build a plan."})}):e.jsxs(y,{children:[e.jsx(v,{children:e.jsxs(x,{children:[e.jsx(i,{className:"w-8"}),e.jsx(i,{children:a("plans.col.outcome",{defaultValue:"Outcome"})}),e.jsx(i,{children:a("plans.col.thread",{defaultValue:"Thread"})}),e.jsx(i,{children:a("plans.col.resolvedAt",{defaultValue:"Resolved"})}),e.jsx(i,{children:a("plans.col.pending",{defaultValue:"Wait"})}),e.jsx(i,{children:a("plans.col.detail",{defaultValue:"Detail"})})]})}),e.jsx(C,{children:h.map(n=>e.jsx(I,{row:n},n.id))})]})]})}function I({row:a}){const{t:s}=f(["tasks"]),[r,d]=c.useState(!1);return e.jsxs(e.Fragment,{children:[e.jsxs(x,{className:"cursor-pointer hover:bg-surface-hover",onClick:()=>d(o=>!o),children:[e.jsx(l,{className:"p-1 align-top text-text-dim",children:r?e.jsx(b,{className:"h-4 w-4"}):e.jsx(F,{className:"h-4 w-4"})}),e.jsx(l,{className:"align-top",children:e.jsxs(j,{variant:O[a.outcome],children:[E[a.outcome],e.jsx("span",{className:"ml-1",children:a.outcome})]})}),e.jsx(l,{className:"align-top",children:e.jsx("code",{className:"text-[11px]",children:a.threadKey})}),e.jsx(l,{className:"align-top text-[11px] text-text-dim",children:a.resolvedAt}),e.jsx(l,{className:"align-top text-[11px] text-text-dim",children:A(a.pendingMs)}),e.jsx(l,{className:"align-top text-xs",children:a.detail?e.jsxs("span",{title:a.detail,children:[a.detail.slice(0,80),a.detail.length>80?"…":""]}):e.jsx("span",{className:"text-text-dim",children:"—"})})]}),r&&e.jsx(x,{children:e.jsxs(l,{colSpan:6,className:"bg-surface-2 p-3",children:[e.jsx("div",{className:"text-[11px] text-text-dim",children:s("plans.planMdLabel",{defaultValue:"Plan markdown the model proposed:"})}),e.jsx("pre",{className:"mt-1 max-h-96 overflow-y-auto whitespace-pre-wrap rounded border border-border bg-surface p-3 text-[12px]",children:a.planMd})]})})]})}export{W as default};
|
|
12
|
-
//# sourceMappingURL=plans-Ddz5qwqp.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plans-Ddz5qwqp.js","sources":["../../node_modules/lucide-react/dist/esm/icons/clipboard-list.js","../../node_modules/lucide-react/dist/esm/icons/pen-line.js","../../src/routes/tasks/plans.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ClipboardList = createLucideIcon(\"ClipboardList\", [\n [\"rect\", { width: \"8\", height: \"4\", x: \"8\", y: \"2\", rx: \"1\", ry: \"1\", key: \"tgr4d6\" }],\n [\n \"path\",\n {\n d: \"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\",\n key: \"116196\"\n }\n ],\n [\"path\", { d: \"M12 11h4\", key: \"1jrz19\" }],\n [\"path\", { d: \"M12 16h4\", key: \"n85exb\" }],\n [\"path\", { d: \"M8 11h.01\", key: \"1dfujw\" }],\n [\"path\", { d: \"M8 16h.01\", key: \"18s6g9\" }]\n]);\n\nexport { ClipboardList as default };\n//# sourceMappingURL=clipboard-list.js.map\n","/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst PenLine = createLucideIcon(\"PenLine\", [\n [\"path\", { d: \"M12 20h9\", key: \"t2du7b\" }],\n [\n \"path\",\n {\n d: \"M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z\",\n key: \"1ykcvy\"\n }\n ]\n]);\n\nexport { PenLine as default };\n//# sourceMappingURL=pen-line.js.map\n","/**\n * /tasks/plans — admin view of native_exit_plan_mode handshakes\n * (v1.2.133).\n *\n * Surfaces the plan_history sqlite table populated by v1.2.131's\n * exit-plan-mode dispatcher. Each row shows what plan the model\n * proposed, what outcome the user picked (approved / rejected /\n * edited / expired), how long the operator took to decide, and\n * the rejection / edit reason if any.\n *\n * Layout mirrors /tasks/asks: header with title + count + refresh +\n * optional thread filter, then a table. Each row's plan markdown\n * is collapsed by default — click to expand into a fenced markdown\n * block (no live render; that's a v1.2.134 idea once we know\n * operators actually use this surface).\n */\n\nimport { useMemo, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport {\n CheckCircle2, ChevronDown, ChevronRight, ClipboardList,\n Edit3, Loader2, RefreshCcw, XCircle, Clock,\n} from 'lucide-react'\n\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport { Label } from '@/components/ui/label'\nimport {\n Table, TableBody, TableCell, TableHead, TableHeader, TableRow,\n} from '@/components/ui/table'\nimport { usePlansList, type PlanHistoryRow, type PlanOutcome } from '@/hooks/use-background-tasks'\n\nconst OUTCOME_ICONS: Record<PlanOutcome, JSX.Element> = {\n approved: <CheckCircle2 className=\"h-3 w-3\" />,\n rejected: <XCircle className=\"h-3 w-3\" />,\n edited: <Edit3 className=\"h-3 w-3\" />,\n expired: <Clock className=\"h-3 w-3\" />,\n}\n\nconst OUTCOME_VARIANT: Record<PlanOutcome, 'success' | 'warning' | 'info' | 'outline'> = {\n approved: 'success',\n rejected: 'warning',\n edited: 'info',\n expired: 'outline',\n}\n\nfunction fmtPending(ms: number | null): string {\n if (ms == null) return '—'\n if (ms < 1000) return `${ms}ms`\n const s = ms / 1000\n if (s < 60) return `${s.toFixed(1)}s`\n return `${(s / 60).toFixed(1)}min`\n}\n\nexport default function TasksPlansRoute(): JSX.Element {\n const { t } = useTranslation(['tasks', 'common'])\n const [filter, setFilter] = useState('')\n const [appliedFilter, setAppliedFilter] = useState('')\n const listQuery = usePlansList({ threadKey: appliedFilter || undefined, limit: 200 })\n\n const rows = useMemo(() => listQuery.data?.plans ?? [], [listQuery.data])\n\n function applyFilter(): void {\n setAppliedFilter(filter.trim())\n }\n\n return (\n <div className=\"mx-auto flex max-w-6xl flex-col gap-4 p-4\">\n <header className=\"flex items-center gap-3\">\n <ClipboardList className=\"h-5 w-5 text-text-dim\" />\n <h1 className=\"text-xl font-semibold\">{t('plans.title', { defaultValue: 'Plan history' })}</h1>\n <Badge variant=\"info\">{rows.length}</Badge>\n <Button\n variant=\"ghost\" size=\"sm\" className=\"ml-auto\"\n onClick={() => void listQuery.refetch()}\n disabled={listQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {listQuery.isFetching\n ? <Loader2 className=\"h-4 w-4 animate-spin\" />\n : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('plans.refresh', { defaultValue: 'Refresh' })}</span>\n </Button>\n </header>\n <p className=\"text-sm text-text-dim\">\n {t('plans.subtitle', {\n defaultValue:\n 'Every native_exit_plan_mode handshake (v1.2.131) lands here with outcome + the plan markdown the model proposed.',\n })}\n </p>\n\n <section className=\"flex items-end gap-2 rounded-md border border-border bg-surface p-3\">\n <div className=\"flex flex-1 flex-col gap-1\">\n <Label className=\"text-xs font-medium\">\n {t('plans.filterLabel', { defaultValue: 'Filter by thread key (optional)' })}\n </Label>\n <Input\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') applyFilter() }}\n placeholder=\"tg:8754479311:default\"\n className=\"font-mono text-xs\"\n />\n </div>\n <Button size=\"sm\" onClick={applyFilter} disabled={listQuery.isFetching}>\n {t('plans.applyFilter', { defaultValue: 'Apply' })}\n </Button>\n {appliedFilter && (\n <Button\n size=\"sm\" variant=\"ghost\"\n onClick={() => { setFilter(''); setAppliedFilter('') }}\n >\n {t('plans.clearFilter', { defaultValue: 'Clear' })}\n </Button>\n )}\n </section>\n\n {listQuery.isLoading ? (\n <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n ) : rows.length === 0 ? (\n <section className=\"rounded-md border border-border bg-surface p-6 text-center text-sm text-text-dim\">\n {appliedFilter\n ? t('plans.emptyFiltered', {\n defaultValue: 'No plan history for this thread. Either the thread never entered plan mode, or it was approved without going through the exit handshake (e.g. /plan off manually).',\n })\n : t('plans.empty', {\n defaultValue: 'No plans yet. Try /plan on in an IM thread and let the model build a plan.',\n })}\n </section>\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-8\" />\n <TableHead>{t('plans.col.outcome', { defaultValue: 'Outcome' })}</TableHead>\n <TableHead>{t('plans.col.thread', { defaultValue: 'Thread' })}</TableHead>\n <TableHead>{t('plans.col.resolvedAt', { defaultValue: 'Resolved' })}</TableHead>\n <TableHead>{t('plans.col.pending', { defaultValue: 'Wait' })}</TableHead>\n <TableHead>{t('plans.col.detail', { defaultValue: 'Detail' })}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((r) => <PlanRow key={r.id} row={r} />)}\n </TableBody>\n </Table>\n )}\n </div>\n )\n}\n\nfunction PlanRow({ row }: { row: PlanHistoryRow }): JSX.Element {\n const { t } = useTranslation(['tasks'])\n const [open, setOpen] = useState(false)\n return (\n <>\n <TableRow className=\"cursor-pointer hover:bg-surface-hover\" onClick={() => setOpen((v) => !v)}>\n <TableCell className=\"p-1 align-top text-text-dim\">\n {open ? <ChevronDown className=\"h-4 w-4\" /> : <ChevronRight className=\"h-4 w-4\" />}\n </TableCell>\n <TableCell className=\"align-top\">\n <Badge variant={OUTCOME_VARIANT[row.outcome]}>\n {OUTCOME_ICONS[row.outcome]}\n <span className=\"ml-1\">{row.outcome}</span>\n </Badge>\n </TableCell>\n <TableCell className=\"align-top\">\n <code className=\"text-[11px]\">{row.threadKey}</code>\n </TableCell>\n <TableCell className=\"align-top text-[11px] text-text-dim\">{row.resolvedAt}</TableCell>\n <TableCell className=\"align-top text-[11px] text-text-dim\">{fmtPending(row.pendingMs)}</TableCell>\n <TableCell className=\"align-top text-xs\">\n {row.detail\n ? <span title={row.detail}>{row.detail.slice(0, 80)}{row.detail.length > 80 ? '…' : ''}</span>\n : <span className=\"text-text-dim\">—</span>}\n </TableCell>\n </TableRow>\n {open && (\n <TableRow>\n <TableCell colSpan={6} className=\"bg-surface-2 p-3\">\n <div className=\"text-[11px] text-text-dim\">\n {t('plans.planMdLabel', { defaultValue: 'Plan markdown the model proposed:' })}\n </div>\n <pre className=\"mt-1 max-h-96 overflow-y-auto whitespace-pre-wrap rounded border border-border bg-surface p-3 text-[12px]\">\n {row.planMd}\n </pre>\n </TableCell>\n </TableRow>\n )}\n </>\n )\n}\n"],"names":["ClipboardList","createLucideIcon","PenLine","OUTCOME_ICONS","jsx","CheckCircle2","XCircle","Edit3","Clock","OUTCOME_VARIANT","fmtPending","ms","TasksPlansRoute","t","useTranslation","filter","setFilter","useState","appliedFilter","setAppliedFilter","listQuery","usePlansList","rows","useMemo","applyFilter","jsxs","Badge","Button","Loader2","RefreshCcw","Label","Input","e","Table","TableHeader","TableRow","TableHead","TableBody","r","PlanRow","row","open","setOpen","Fragment","v","TableCell","ChevronDown","ChevronRight"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import{o as y,u as f,f as B,j as e,T as D,B as u,L as A,S as R,g as V,h as $,i as H,k as C,c as p,a7 as N,l as h,m as _,n as U}from"./index-D7BuMEIr.js";import{r as v}from"./react-DlP5eolq.js";import{E as z}from"./empty-state-DoiBKL4l.js";import{u as W,a as Z,b as I}from"./use-workspace-J5eeVxw9.js";import{L as P}from"./loader-circle-DO3Ni2RJ.js";import{R as O}from"./refresh-ccw-BhPAzZAa.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 Q=y("File",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}]]);/**
|
|
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 S=y("FolderTree",[["path",{d:"M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z",key:"hod4my"}],["path",{d:"M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z",key:"w4yl2u"}],["path",{d:"M3 5a2 2 0 0 0 2 2h3",key:"f2jnh7"}],["path",{d:"M3 3v13a2 2 0 0 0 2 2h3",key:"k8epm1"}]]);/**
|
|
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 q=y("Folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]);function ne(){const{t}=f(["workspace","common"]),[r,c]=B(),s=r.get("agent")??"",n=r.get("path")??"",i=W().data??{},o=v.useMemo(()=>Object.keys(i).sort(),[i]),d=Z(s,n,{enabled:!!s}),l=d.data,g=l?.type==="dir",T=l?.type==="file";function k(a){const m=new URLSearchParams(r);for(const[F,b]of Object.entries(a))b==null||b===""?m.delete(F):m.set(F,b);c(m,{replace:!1})}function E(a){k({agent:a||null,path:null})}function j(a){k({path:a||null})}function w(){if(!n)return;const a=n.lastIndexOf("/"),m=a>=0?n.slice(0,a):"";j(m)}return e.jsxs("div",{className:"flex min-h-dvh flex-col bg-bg",children:[e.jsx(D,{}),e.jsxs("main",{className:"mx-auto flex w-full max-w-7xl flex-1 flex-col gap-4 px-3 py-4 sm:px-4 pb-safe",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:t("pageTitle")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>d.refetch(),disabled:!s||d.isFetching,"aria-label":t("actions.refresh",{ns:"common"}),children:[d.isFetching?e.jsx(P,{className:"h-4 w-4 animate-spin"}):e.jsx(O,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:t("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:t("subtitle")})]}),e.jsx("div",{className:"flex flex-wrap items-end gap-2",children:e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(A,{htmlFor:"agent",className:"text-xs text-text-dim",children:t("agentPicker.label")}),e.jsxs(R,{value:s||"__placeholder__",onValueChange:a=>E(a==="__placeholder__"?"":a),children:[e.jsx(V,{id:"agent",className:"w-64",children:e.jsx($,{placeholder:t("agentPicker.placeholder")})}),e.jsxs(H,{children:[e.jsx(C,{value:"__placeholder__",disabled:!0,children:t("agentPicker.placeholder")}),o.map(a=>e.jsx(C,{value:a,children:e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"font-mono text-xs",children:a}),e.jsx("span",{className:p("inline-block h-1.5 w-1.5 rounded-full",i[a]?"bg-success":"bg-text-muted")}),e.jsx("span",{className:"text-text-dim text-xs",children:i[a]?t("agentPicker.online"):t("agentPicker.offline")})]})},a))]})]})]})}),s?e.jsxs(e.Fragment,{children:[e.jsx(K,{path:n,onNavigate:j,onUp:w}),d.isLoading?e.jsx("div",{className:"h-32 rounded-md bg-surface-2 animate-pulse"}):g&&l?.type==="dir"?e.jsx(G,{entries:l.entries,onEnter:a=>j(n?`${n}/${a.name}`:a.name)}):T&&l?.type==="file"?e.jsx(J,{file:l,agent:s,onBack:w}):e.jsx(z,{icon:e.jsx(S,{}),title:t("editor.loadFailed"),description:d.error?.message??""})]}):e.jsx(z,{icon:e.jsx(S,{}),title:t("noAgent.title"),description:t("noAgent.description")})]})]})}function K({path:t,onNavigate:r,onUp:c}){const{t:s}=f("workspace"),n=t?t.split("/"):[];return e.jsxs("div",{className:"flex flex-wrap items-center gap-1 text-sm",children:[e.jsx(u,{type:"button",variant:"ghost",size:"sm",onClick:c,disabled:!t,"aria-label":s("tree.up"),children:e.jsx(N,{className:"h-4 w-4"})}),e.jsx("button",{type:"button",onClick:()=>r(""),className:"text-text-dim hover:text-text rounded px-1 py-0.5",children:s("tree.rootLabel")}),n.map((x,i)=>{const o=n.slice(0,i+1).join("/");return e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"text-text-muted",children:"/"}),e.jsx("button",{type:"button",onClick:()=>r(o),className:"text-text-dim hover:text-text rounded px-1 py-0.5",children:x})]},o)})]})}function G({entries:t,onEnter:r}){const{t:c}=f("workspace");return t.length===0?e.jsx("div",{className:"rounded-md border border-border bg-surface p-3 text-sm text-text-dim",children:c("tree.empty")}):e.jsx("ul",{className:"divide-y divide-border rounded-md border border-border bg-surface",children:t.map(s=>e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>r(s),disabled:s.broken||s.symlink_escape,className:p("flex w-full items-center gap-2 px-3 py-2 text-sm text-left","transition-colors hover:bg-surface-hover disabled:opacity-50 disabled:cursor-not-allowed"),children:[s.isDir?e.jsx(q,{className:"h-4 w-4 text-accent"}):e.jsx(Q,{className:"h-4 w-4 text-text-dim"}),e.jsx("span",{className:s.isDir?"font-medium text-text":"text-text",children:s.name}),s.symlink_escape&&e.jsx(h,{variant:"warning",className:"ml-2",children:c("tree.symlinkEscape")}),s.broken&&!s.symlink_escape&&e.jsx(h,{variant:"danger",className:"ml-2",children:c("tree.broken")}),!s.isDir&&s.size!=null&&e.jsx("span",{className:"ml-auto text-xs text-text-muted tabular-nums",children:M(s.size)}),s.mtime&&e.jsx("span",{className:p("text-xs text-text-muted tabular-nums",!s.isDir&&s.size!=null?"ml-3":"ml-auto"),children:L(s.mtime)})]})},s.name))})}function J({file:t,agent:r,onBack:c}){const{t:s}=f(["workspace","common"]),[n,x]=v.useState(t.content);v.useEffect(()=>{x(t.content)},[t.content]);const i=n!==t.content,o=I();async function d(){try{await o.mutateAsync({agent:r,path:t.path,body:{content:n}}),_.success(s("toast.saved",{path:t.path}))}catch(l){const{message:g}=U(l,s);_.error(g)}}return t.encoding==="base64"?e.jsxs("div",{className:"rounded-md border border-border bg-surface p-4 text-sm",children:[e.jsxs(u,{variant:"ghost",size:"sm",onClick:c,className:"mb-3",children:[e.jsx(N,{className:"h-4 w-4"}),s("tree.up")]}),e.jsx("p",{className:"text-text-dim",children:s("editor.binary")}),e.jsxs("p",{className:"mt-2 text-xs text-text-muted tabular-nums",children:[t.path," · ",M(t.size)]})]}):e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs(u,{variant:"ghost",size:"sm",onClick:c,children:[e.jsx(N,{className:"h-4 w-4"}),s("tree.up")]}),e.jsx("code",{className:"rounded bg-surface-2 px-1.5 py-0.5 text-xs font-mono",children:t.path}),t.truncated&&e.jsx(h,{variant:"warning",children:"truncated"}),i&&e.jsx(h,{variant:"info",children:s("editor.dirtyHint")}),e.jsxs(u,{type:"button",size:"sm",className:"ml-auto",onClick:()=>void d(),disabled:!i||o.isPending||t.truncated,children:[o.isPending?e.jsx(P,{className:"h-4 w-4 animate-spin"}):null,o.isPending?s("editor.saving"):s("editor.save")]})]}),t.truncated&&e.jsx("p",{className:"text-xs text-warning",children:s("editor.truncated")}),e.jsx("textarea",{value:n,onChange:l=>x(l.target.value),rows:24,spellCheck:!1,className:p("w-full resize-y rounded-md border bg-bg px-3 py-2","font-mono text-xs leading-5","focus:outline-none focus:ring-2 focus:ring-accent focus:ring-offset-1 focus:ring-offset-bg",i?"border-accent":"border-border")}),!i&&e.jsx("p",{className:"text-xs text-text-muted",children:s("editor.savedMeta",{size:t.size,at:L(t.mtime)})})]})}function L(t){if(t==null)return"—";try{const r=new Date(t);return Number.isNaN(r.getTime())?t:r.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return t}}function M(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KiB`:`${(t/1024/1024).toFixed(1)} MiB`}export{ne as default};
|
|
17
|
-
//# sourceMappingURL=workspace-BqMuxPFF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-BqMuxPFF.js","sources":["../../node_modules/lucide-react/dist/esm/icons/file.js","../../node_modules/lucide-react/dist/esm/icons/folder-tree.js","../../node_modules/lucide-react/dist/esm/icons/folder.js","../../src/routes/workspace.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 File = createLucideIcon(\"File\", [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }]\n]);\n\nexport { File as default };\n//# sourceMappingURL=file.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 FolderTree = createLucideIcon(\"FolderTree\", [\n [\n \"path\",\n {\n d: \"M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\",\n key: \"hod4my\"\n }\n ],\n [\n \"path\",\n {\n d: \"M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\",\n key: \"w4yl2u\"\n }\n ],\n [\"path\", { d: \"M3 5a2 2 0 0 0 2 2h3\", key: \"f2jnh7\" }],\n [\"path\", { d: \"M3 3v13a2 2 0 0 0 2 2h3\", key: \"k8epm1\" }]\n]);\n\nexport { FolderTree as default };\n//# sourceMappingURL=folder-tree.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 Folder = createLucideIcon(\"Folder\", [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n]);\n\nexport { Folder as default };\n//# sourceMappingURL=folder.js.map\n","/**\n * /workspace — file browser + editor for the per-agent CWD.\n *\n * Single-column finder UI: pick an agent → drill into the workspace\n * via ?path=, click a file → opens the editor pane below the\n * listing. No recursive tree because the listing handler is cheap\n * and the typical workspace has ≤ 30 entries per dir.\n *\n * Editor is a plain `<textarea>` — Monaco / CodeMirror would balloon\n * the bundle for what is realistically operator-edits to\n * CLAUDE.md / AGENTS.md / config snippets. Binary files render a\n * read-only placeholder. Truncated files (> 1 MiB) block save to\n * prevent destructive overwrites.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport { useTranslation } from 'react-i18next'\nimport { toast } from 'sonner'\nimport { ChevronUp, File, Folder, FolderTree, Loader2, RefreshCcw } from 'lucide-react'\n\nimport { Topbar } from '@/components/shell/topbar'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Label } from '@/components/ui/label'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/components/ui/select'\nimport {\n useAgentsStatus,\n useWorkspaceFiles,\n useWriteWorkspaceFile,\n} from '@/hooks/use-workspace'\nimport { describeError } from '@/lib/api/errors'\nimport type {\n WorkspaceFileContent,\n WorkspaceFileEntry,\n} from '@/types/api'\nimport { cn } from '@/lib/utils'\n\nexport default function WorkspaceRoute(): JSX.Element {\n const { t } = useTranslation(['workspace', 'common'])\n const [params, setParams] = useSearchParams()\n const agent = params.get('agent') ?? ''\n const path = params.get('path') ?? ''\n\n const agentsQuery = useAgentsStatus()\n const agents = agentsQuery.data ?? {}\n const agentNames = useMemo(() => Object.keys(agents).sort(), [agents])\n\n /** Query may resolve to either a dir listing or file content — we\n * branch on `data.type` in the render. */\n const filesQuery = useWorkspaceFiles(agent, path, { enabled: Boolean(agent) })\n const data = filesQuery.data\n const isDir = data?.type === 'dir'\n const isFile = data?.type === 'file'\n\n function patchParams(patch: Record<string, string | null>): void {\n const next = new URLSearchParams(params)\n for (const [k, v] of Object.entries(patch)) {\n if (v == null || v === '') next.delete(k)\n else next.set(k, v)\n }\n setParams(next, { replace: false })\n }\n\n function setAgent(next: string): void {\n // Switching agent always resets the path so we don't drag a\n // claude-specific path into codex's workspace.\n patchParams({ agent: next || null, path: null })\n }\n function navigateTo(nextPath: string): void {\n patchParams({ path: nextPath || null })\n }\n function navigateUp(): void {\n if (!path) return\n const idx = path.lastIndexOf('/')\n const parent = idx >= 0 ? path.slice(0, idx) : ''\n navigateTo(parent)\n }\n\n return (\n <div className=\"flex min-h-dvh flex-col bg-bg\">\n <Topbar />\n\n <main className=\"mx-auto flex w-full max-w-7xl flex-1 flex-col gap-4 px-3 py-4 sm:px-4 pb-safe\">\n <header className=\"flex flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h1 className=\"text-xl font-semibold\">{t('pageTitle')}</h1>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => filesQuery.refetch()}\n disabled={!agent || filesQuery.isFetching}\n aria-label={t('actions.refresh', { ns: 'common' })}\n >\n {filesQuery.isFetching ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <RefreshCcw className=\"h-4 w-4\" />}\n <span className=\"hidden sm:inline\">{t('actions.refresh', { ns: 'common' })}</span>\n </Button>\n </div>\n <p className=\"text-sm text-text-dim\">{t('subtitle')}</p>\n </header>\n\n {/* Agent picker */}\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"agent\" className=\"text-xs text-text-dim\">\n {t('agentPicker.label')}\n </Label>\n <Select value={agent || '__placeholder__'} onValueChange={(v) => setAgent(v === '__placeholder__' ? '' : v)}>\n <SelectTrigger id=\"agent\" className=\"w-64\">\n <SelectValue placeholder={t('agentPicker.placeholder')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__placeholder__\" disabled>\n {t('agentPicker.placeholder')}\n </SelectItem>\n {agentNames.map((name) => (\n <SelectItem key={name} value={name}>\n <span className=\"flex items-center gap-2\">\n <span className=\"font-mono text-xs\">{name}</span>\n <span className={cn(\n 'inline-block h-1.5 w-1.5 rounded-full',\n agents[name] ? 'bg-success' : 'bg-text-muted',\n )} />\n <span className=\"text-text-dim text-xs\">\n {agents[name] ? t('agentPicker.online') : t('agentPicker.offline')}\n </span>\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {!agent ? (\n <EmptyState\n icon={<FolderTree />}\n title={t('noAgent.title')}\n description={t('noAgent.description')}\n />\n ) : (\n <>\n {/* Breadcrumb + Up */}\n <Breadcrumb\n path={path}\n onNavigate={navigateTo}\n onUp={navigateUp}\n />\n\n {filesQuery.isLoading ? (\n <div className=\"h-32 rounded-md bg-surface-2 animate-pulse\" />\n ) : isDir && data?.type === 'dir' ? (\n <DirListing\n entries={data.entries}\n onEnter={(entry) => navigateTo(\n path ? `${path}/${entry.name}` : entry.name,\n )}\n />\n ) : isFile && data?.type === 'file' ? (\n <FileEditor\n file={data}\n agent={agent}\n onBack={navigateUp}\n />\n ) : (\n <EmptyState\n icon={<FolderTree />}\n title={t('editor.loadFailed')}\n description={filesQuery.error?.message ?? ''}\n />\n )}\n </>\n )}\n </main>\n </div>\n )\n}\n\ninterface BreadcrumbProps {\n path: string\n onNavigate: (path: string) => void\n onUp: () => void\n}\n\nfunction Breadcrumb({ path, onNavigate, onUp }: BreadcrumbProps): JSX.Element {\n const { t } = useTranslation('workspace')\n const parts = path ? path.split('/') : []\n return (\n <div className=\"flex flex-wrap items-center gap-1 text-sm\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onUp}\n disabled={!path}\n aria-label={t('tree.up')}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </Button>\n <button\n type=\"button\"\n onClick={() => onNavigate('')}\n className=\"text-text-dim hover:text-text rounded px-1 py-0.5\"\n >\n {t('tree.rootLabel')}\n </button>\n {parts.map((part, i) => {\n const upto = parts.slice(0, i + 1).join('/')\n return (\n <span key={upto} className=\"flex items-center gap-1\">\n <span className=\"text-text-muted\">/</span>\n <button\n type=\"button\"\n onClick={() => onNavigate(upto)}\n className=\"text-text-dim hover:text-text rounded px-1 py-0.5\"\n >\n {part}\n </button>\n </span>\n )\n })}\n </div>\n )\n}\n\ninterface DirListingProps {\n entries: WorkspaceFileEntry[]\n onEnter: (entry: WorkspaceFileEntry) => void\n}\n\nfunction DirListing({ entries, onEnter }: DirListingProps): JSX.Element {\n const { t } = useTranslation('workspace')\n if (entries.length === 0) {\n return <div className=\"rounded-md border border-border bg-surface p-3 text-sm text-text-dim\">{t('tree.empty')}</div>\n }\n return (\n <ul className=\"divide-y divide-border rounded-md border border-border bg-surface\">\n {entries.map((e) => (\n <li key={e.name}>\n <button\n type=\"button\"\n onClick={() => onEnter(e)}\n disabled={e.broken || e.symlink_escape}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-2 text-sm text-left',\n 'transition-colors hover:bg-surface-hover disabled:opacity-50 disabled:cursor-not-allowed',\n )}\n >\n {e.isDir ? <Folder className=\"h-4 w-4 text-accent\" /> : <File className=\"h-4 w-4 text-text-dim\" />}\n <span className={e.isDir ? 'font-medium text-text' : 'text-text'}>{e.name}</span>\n {e.symlink_escape && (\n <Badge variant=\"warning\" className=\"ml-2\">{t('tree.symlinkEscape')}</Badge>\n )}\n {e.broken && !e.symlink_escape && (\n <Badge variant=\"danger\" className=\"ml-2\">{t('tree.broken')}</Badge>\n )}\n {!e.isDir && e.size != null && (\n <span className=\"ml-auto text-xs text-text-muted tabular-nums\">{formatSize(e.size)}</span>\n )}\n {e.mtime && (\n <span className={cn('text-xs text-text-muted tabular-nums', !e.isDir && e.size != null ? 'ml-3' : 'ml-auto')}>\n {formatTime(e.mtime)}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>\n )\n}\n\ninterface FileEditorProps {\n file: WorkspaceFileContent\n agent: string\n onBack: () => void\n}\n\nfunction FileEditor({ file, agent, onBack }: FileEditorProps): JSX.Element {\n const { t } = useTranslation(['workspace', 'common'])\n const [draft, setDraft] = useState(file.content)\n useEffect(() => { setDraft(file.content) }, [file.content])\n const dirty = draft !== file.content\n\n const write = useWriteWorkspaceFile()\n\n async function onSave(): Promise<void> {\n try {\n await write.mutateAsync({ agent, path: file.path, body: { content: draft } })\n toast.success(t('toast.saved', { path: file.path }))\n } catch (err) {\n const { message } = describeError(err, t)\n toast.error(message)\n }\n }\n\n if (file.encoding === 'base64') {\n return (\n <div className=\"rounded-md border border-border bg-surface p-4 text-sm\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onBack} className=\"mb-3\">\n <ChevronUp className=\"h-4 w-4\" />\n {t('tree.up')}\n </Button>\n <p className=\"text-text-dim\">{t('editor.binary')}</p>\n <p className=\"mt-2 text-xs text-text-muted tabular-nums\">\n {file.path} · {formatSize(file.size)}\n </p>\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onBack}>\n <ChevronUp className=\"h-4 w-4\" />\n {t('tree.up')}\n </Button>\n <code className=\"rounded bg-surface-2 px-1.5 py-0.5 text-xs font-mono\">{file.path}</code>\n {file.truncated && <Badge variant=\"warning\">truncated</Badge>}\n {dirty && <Badge variant=\"info\">{t('editor.dirtyHint')}</Badge>}\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"ml-auto\"\n onClick={() => void onSave()}\n disabled={!dirty || write.isPending || file.truncated}\n >\n {write.isPending ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : null}\n {write.isPending ? t('editor.saving') : t('editor.save')}\n </Button>\n </div>\n {file.truncated && (\n <p className=\"text-xs text-warning\">{t('editor.truncated')}</p>\n )}\n <textarea\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n rows={24}\n spellCheck={false}\n className={cn(\n 'w-full resize-y rounded-md border bg-bg px-3 py-2',\n 'font-mono text-xs leading-5',\n 'focus:outline-none focus:ring-2 focus:ring-accent focus:ring-offset-1 focus:ring-offset-bg',\n dirty ? 'border-accent' : 'border-border',\n )}\n />\n {!dirty && (\n <p className=\"text-xs text-text-muted\">\n {t('editor.savedMeta', { size: file.size, at: formatTime(file.mtime) })}\n </p>\n )}\n </div>\n )\n}\n\nfunction formatTime(iso: string | null): string {\n if (iso == null) return '—'\n try {\n const d = new Date(iso)\n if (Number.isNaN(d.getTime())) return iso\n return d.toLocaleString(undefined, { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n } catch {\n return iso\n }\n}\n\nfunction formatSize(n: number): string {\n if (n < 1024) return `${n} B`\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KiB`\n return `${(n / 1024 / 1024).toFixed(1)} MiB`\n}\n"],"names":["File","createLucideIcon","FolderTree","Folder","WorkspaceRoute","useTranslation","params","setParams","useSearchParams","agent","path","agents","useAgentsStatus","agentNames","useMemo","filesQuery","useWorkspaceFiles","data","isDir","isFile","patchParams","patch","next","k","v","setAgent","navigateTo","nextPath","navigateUp","idx","parent","jsxs","jsx","Topbar","Button","Loader2","RefreshCcw","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","name","cn","Fragment","Breadcrumb","DirListing","entry","FileEditor","EmptyState","onNavigate","onUp","t","parts","ChevronUp","part","upto","entries","onEnter","e","Badge","formatSize","formatTime","file","onBack","draft","setDraft","useState","useEffect","dirty","write","useWriteWorkspaceFile","onSave","toast","err","message","describeError","iso","d","n"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|