agim-cli 1.3.2 → 1.3.3
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/i18n.d.ts +2 -2
- package/dist/cli-ui/i18n.js +4 -4
- package/dist/cli-ui/i18n.js.map +1 -1
- package/dist/cli-ui/setup-llm.js +1 -1
- package/dist/cli-ui/setup-llm.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 +229 -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/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/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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-uqxuXn2X.js","sources":["../../node_modules/lucide-react/dist/esm/icons/clock-3.js","../../node_modules/lucide-react/dist/esm/icons/ellipsis-vertical.js","../../node_modules/lucide-react/dist/esm/icons/sparkles.js","../../src/routes/m/chat.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 Clock3 = createLucideIcon(\"Clock3\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16.5 12\", key: \"1aq6pp\" }]\n]);\n\nexport { Clock3 as default };\n//# sourceMappingURL=clock-3.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 EllipsisVertical = createLucideIcon(\"EllipsisVertical\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"1\", key: \"41hilf\" }],\n [\"circle\", { cx: \"12\", cy: \"5\", r: \"1\", key: \"gxeob9\" }],\n [\"circle\", { cx: \"12\", cy: \"19\", r: \"1\", key: \"lyex9k\" }]\n]);\n\nexport { EllipsisVertical as default };\n//# sourceMappingURL=ellipsis-vertical.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 Sparkles = createLucideIcon(\"Sparkles\", [\n [\n \"path\",\n {\n d: \"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\",\n key: \"4pj2yx\"\n }\n ],\n [\"path\", { d: \"M20 3v4\", key: \"1olli1\" }],\n [\"path\", { d: \"M22 5h-4\", key: \"1gvqau\" }],\n [\"path\", { d: \"M4 17v2\", key: \"vumght\" }],\n [\"path\", { d: \"M5 18H3\", key: \"zchphs\" }]\n]);\n\nexport { Sparkles as default };\n//# sourceMappingURL=sparkles.js.map\n","/**\n * /m/chat — mobile-first chat surface (production-oriented UX pass).\n *\n * Upgrades over v1:\n * - richer hierarchy (thread title + status + execution rail)\n * - date separators + per-message timestamps\n * - quick prompts + larger mobile composer controls\n * - bottom-sheet menu and activity panel for recent runs\n *\n * Keeps compatibility with the existing useChat() transport:\n * same message flow / approvals / reconnect behavior.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport {\n Activity,\n ArrowDown,\n ChevronLeft,\n Clock3,\n Loader2,\n MoreVertical,\n Sparkles,\n Send,\n} from 'lucide-react'\nimport { toast } from 'sonner'\n\nimport { useChat, type ChatMessage, type RunActivity } from '@/hooks/use-chat'\nimport { Button } from '@/components/ui/button'\nimport { Badge } from '@/components/ui/badge'\nimport { MessageBubble } from '@/components/chat/message-bubble'\nimport { ApprovalDock } from '@/components/chat/approval-dock'\nimport { AgentPicker } from '@/components/chat/agent-picker'\nimport { isNativeSetupError } from '@/components/chat/error-hints'\nimport { NativeSetupDialog } from '@/components/chat/native-setup-dialog'\nimport { agentDisplayName } from '@/lib/agent-label'\nimport { cn } from '@/lib/utils'\n\nconst STATUS_STYLES: Record<string, string> = {\n open: 'bg-success',\n connecting: 'bg-warning animate-pulse',\n closed: 'bg-text-muted',\n error: 'bg-danger',\n}\n\ntype SheetMode = 'none' | 'menu' | 'activity'\ntype MessageRow =\n | { type: 'divider'; key: string; label: string }\n | { type: 'message'; key: string; msg: ChatMessage }\n\nfunction safeTs(ts: number): number {\n return Number.isFinite(ts) ? ts : Date.now()\n}\n\nfunction dayKey(ts: number): string {\n const d = new Date(safeTs(ts))\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${d.getFullYear()}-${m}-${day}`\n}\n\nfunction formatDay(ts: number, locale: string): string {\n return new Intl.DateTimeFormat(locale, {\n month: 'short',\n day: 'numeric',\n weekday: 'short',\n }).format(new Date(safeTs(ts)))\n}\n\nfunction formatClock(ts: number, locale: string): string {\n return new Intl.DateTimeFormat(locale, {\n hour: '2-digit',\n minute: '2-digit',\n }).format(new Date(safeTs(ts)))\n}\n\nfunction formatDurationMs(ms?: number): string {\n if (!ms || ms <= 0) return '0ms'\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(ms >= 10_000 ? 0 : 1)}s`\n}\n\nfunction buildRows(messages: ChatMessage[], locale: string): MessageRow[] {\n const rows: MessageRow[] = []\n let prevDay = ''\n for (const msg of messages) {\n const k = dayKey(msg.timestamp)\n if (k !== prevDay) {\n rows.push({ type: 'divider', key: `d-${k}`, label: formatDay(msg.timestamp, locale) })\n prevDay = k\n }\n rows.push({ type: 'message', key: msg.id, msg })\n }\n return rows\n}\n\nfunction runStatusBadgeClass(status: RunActivity['status']): string {\n switch (status) {\n case 'running': return 'bg-info-bg text-info'\n case 'success': return 'bg-success-bg text-success'\n case 'error': return 'bg-danger-bg text-danger'\n }\n}\n\nexport default function MobileChatRoute(): JSX.Element {\n const { t, i18n } = useTranslation(['chat', 'common'])\n const {\n state, send, switchAgent, approvalClick, newConversation, clearError,\n } = useChat()\n const [input, setInput] = useState('')\n const [sheet, setSheet] = useState<SheetMode>('none')\n const [showScrollDown, setShowScrollDown] = useState(false)\n const [nativeSetupDialogOpen, setNativeSetupDialogOpen] = useState(false)\n const [nativeSetupReason, setNativeSetupReason] = useState('')\n const listRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLTextAreaElement>(null)\n const statusLabel = t(`chat.status.${state.status}`, { defaultValue: state.status })\n\n const quickPrompts = useMemo(\n () => [\n t('chat.quickPrompt.plan'),\n t('chat.quickPrompt.risks'),\n t('chat.quickPrompt.summary'),\n ],\n [t],\n )\n\n const chatMessages = useMemo(\n () => state.messages.filter((m) => !m.approval),\n [state.messages],\n )\n const rows = useMemo(\n () => buildRows(chatMessages, i18n.language),\n [chatMessages, i18n.language],\n )\n\n const latestUserTitle = useMemo(() => {\n const firstUser = chatMessages.find((m) => m.role === 'user' && m.content.trim())\n if (!firstUser) return t('chat.mobileTitle', { defaultValue: 'agim chat' })\n const compact = firstUser.content.replace(/\\s+/g, ' ').trim()\n return compact.length > 24 ? `${compact.slice(0, 24)}…` : compact\n }, [chatMessages, t])\n\n const latestRuns = useMemo(() => state.runActivities.slice(0, 12), [state.runActivities])\n const activeRun = useMemo(\n () => state.runActivities.find((r) => r.runId === state.activeRunId),\n [state.activeRunId, state.runActivities],\n )\n\n // Auto-scroll to bottom on new messages OR streaming chunk. Same\n // pinch-tolerance as desktop: hold position when user is reading up.\n useEffect(() => {\n const el = listRef.current\n if (!el) return\n const distFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight\n if (distFromBottom > 200 && state.currentReplyId == null) return\n requestAnimationFrame(() => { el.scrollTop = el.scrollHeight })\n }, [state.messages, state.currentReplyId])\n\n // Floating \"scroll to bottom\" pill.\n useEffect(() => {\n const el = listRef.current\n if (!el) return\n const onScroll = (): void => {\n const dist = el.scrollHeight - el.scrollTop - el.clientHeight\n setShowScrollDown(dist > 200)\n }\n el.addEventListener('scroll', onScroll, { passive: true })\n onScroll()\n return () => el.removeEventListener('scroll', onScroll)\n }, [])\n\n // Surface WS errors as toast and clear.\n useEffect(() => {\n if (!state.error) return\n if (isNativeSetupError(state.error)) {\n setNativeSetupReason(state.error)\n setNativeSetupDialogOpen(true)\n } else {\n toast.error(state.error)\n }\n clearError()\n }, [state.error, clearError])\n\n // Auto-grow textarea up to 6 lines.\n useEffect(() => {\n const ta = inputRef.current\n if (!ta) return\n ta.style.height = 'auto'\n ta.style.height = `${Math.min(ta.scrollHeight, 24 * 6 + 16)}px`\n }, [input])\n\n function onSubmit(e?: React.FormEvent): void {\n e?.preventDefault()\n const v = input.trim()\n if (!v) return\n if (state.status !== 'open') {\n toast.error(t('chat.notConnected', { defaultValue: 'Not connected. Reconnecting…' }))\n return\n }\n if (state.currentReplyId) return\n send(v)\n setInput('')\n requestAnimationFrame(() => inputRef.current?.focus())\n }\n\n function onKeyDown(e: React.KeyboardEvent<HTMLTextAreaElement>): void {\n // IME-safe: never submit while composition is active.\n const ne = e.nativeEvent as KeyboardEvent & { isComposing?: boolean }\n if (ne.isComposing || e.keyCode === 229) return\n // Mobile keeps Enter for newline; explicit Send button submits.\n }\n\n function onScrollToBottom(): void {\n const el = listRef.current\n if (!el) return\n el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' })\n }\n\n function onLogout(): void {\n void fetch('/api/auth/logout', { method: 'POST' }).finally(() => {\n try { localStorage.removeItem('agim_token') } catch { /* noop */ }\n window.location.replace('/login')\n })\n }\n\n function onStartNewConversation(): void {\n newConversation()\n toast.success(t('chat.newConvToast', { defaultValue: 'Started a new conversation' }))\n setSheet('none')\n requestAnimationFrame(() => inputRef.current?.focus())\n }\n\n return (\n <div className=\"relative flex h-dvh flex-col bg-bg\">\n <NativeSetupDialog\n open={nativeSetupDialogOpen}\n reason={nativeSetupReason}\n onOpenChange={setNativeSetupDialogOpen}\n onConfigured={() => switchAgent('agim')}\n />\n\n <header\n className=\"flex items-center gap-2 border-b border-border bg-surface px-3 py-2\"\n style={{ paddingTop: 'calc(env(safe-area-inset-top) + 0.5rem)' }}\n >\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={t('chat.back', { defaultValue: 'Back' })}\n onClick={() => (window.history.length > 1 ? window.history.back() : window.location.assign('/'))}\n className=\"h-9 w-9 p-0\"\n >\n <ChevronLeft className=\"h-5 w-5\" />\n </Button>\n <div className=\"flex min-w-0 flex-1 flex-col items-center\">\n <span className=\"truncate text-sm font-semibold\">{latestUserTitle}</span>\n <span className=\"flex items-center gap-1.5 text-[11px] text-text-dim\">\n <span className={cn('inline-block h-1.5 w-1.5 rounded-full', STATUS_STYLES[state.status])} />\n <span>{state.agent ? agentDisplayName(state.agent) : '—'}</span>\n <span>·</span>\n <span>{state.activeRunId ? t('chat.running', { defaultValue: 'Running' }) : statusLabel}</span>\n </span>\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={t('chat.menu', { defaultValue: 'Menu' })}\n onClick={() => setSheet('menu')}\n className=\"h-9 w-9 p-0\"\n >\n <MoreVertical className=\"h-5 w-5\" />\n </Button>\n </header>\n\n <div ref={listRef} className=\"flex-1 overflow-y-auto\">\n <div className=\"mx-auto flex w-full max-w-3xl flex-col gap-3 px-3 py-4\">\n {chatMessages.length === 0 && state.status === 'open' && (\n <div className=\"flex flex-col items-center gap-2 py-14 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-surface-2 text-2xl\">\n 💬\n </div>\n <h2 className=\"text-base font-semibold\">\n {t('chat.welcomeTitle', { defaultValue: 'Start a conversation' })}\n </h2>\n <p className=\"max-w-xs text-sm text-text-dim\">\n {t('chat.welcomeBodyMobile', {\n defaultValue: 'Type a message below. Switch agent or start over from the menu.',\n })}\n </p>\n </div>\n )}\n {chatMessages.length === 0 && state.status !== 'open' && (\n <div className=\"grid place-items-center py-16 text-center\">\n <p className=\"text-sm text-text-dim\">\n {state.status === 'connecting'\n ? t('chat.connecting', { defaultValue: 'Connecting to agim…' })\n : t('chat.disconnected', {\n defaultValue: 'Disconnected. Reconnecting automatically.',\n })}\n </p>\n </div>\n )}\n {rows.map((row) => row.type === 'divider' ? (\n <div key={row.key} className=\"py-1 text-center text-[11px] text-text-muted\">\n {row.label}\n </div>\n ) : (\n <div key={row.key} className=\"space-y-1\">\n <MessageBubble\n msg={row.msg}\n onApprove={(mid, reqId, choice) => approvalClick(mid, reqId, choice)}\n />\n <div className={cn(\n 'px-1 text-[11px] text-text-muted',\n row.msg.role === 'user' ? 'text-right' : 'text-left',\n )}\n >\n {formatClock(row.msg.timestamp, i18n.language)}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {showScrollDown && (\n <button\n type=\"button\"\n onClick={onScrollToBottom}\n className=\"absolute bottom-28 left-1/2 z-20 -translate-x-1/2 rounded-full border border-border bg-surface p-2 shadow-md\"\n aria-label={t('chat.scrollDown', { defaultValue: 'Scroll to bottom' })}\n >\n <ArrowDown className=\"h-4 w-4\" />\n </button>\n )}\n\n <ApprovalDock\n approvals={state.pendingApprovals}\n onApprove={(mid, reqId, choice) => approvalClick(mid, reqId, choice)}\n />\n\n <form\n onSubmit={onSubmit}\n className=\"sticky bottom-0 border-t border-border bg-surface px-3 py-2\"\n style={{ paddingBottom: 'calc(env(safe-area-inset-bottom) + 0.5rem)' }}\n >\n {chatMessages.length === 0 && state.status === 'open' && (\n <div className=\"mb-2 flex gap-2 overflow-x-auto pb-1\">\n {quickPrompts.map((prompt) => (\n <button\n key={prompt}\n type=\"button\"\n onClick={() => {\n setInput(prompt)\n requestAnimationFrame(() => inputRef.current?.focus())\n }}\n className=\"shrink-0 rounded-full border border-border bg-surface-2 px-3 py-1.5 text-xs text-text-dim hover:bg-surface-hover\"\n >\n {prompt}\n </button>\n ))}\n </div>\n )}\n\n {activeRun && (\n <div className=\"mb-2 flex items-center justify-between rounded-xl border border-info/30 bg-info-bg/50 px-3 py-1.5\">\n <span className=\"inline-flex items-center gap-1 text-xs text-info\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n {t('chat.running', { defaultValue: 'Running' })}\n </span>\n <span className=\"truncate text-xs text-text-dim\">\n {agentDisplayName(activeRun.agent)} · {formatDurationMs(activeRun.durationMs)}\n </span>\n </div>\n )}\n\n <div className=\"flex items-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onStartNewConversation}\n disabled={state.status !== 'open' || !!state.currentReplyId}\n aria-label={t('chat.newConv', { defaultValue: 'New conversation' })}\n className=\"h-11 w-11 shrink-0 rounded-full p-0\"\n >\n <Sparkles className=\"h-4 w-4\" />\n </Button>\n <textarea\n ref={inputRef}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={t('chat.inputPlaceholderMobile', { defaultValue: 'Message…' })}\n rows={1}\n className={cn(\n 'flex-1 resize-none rounded-3xl border border-border bg-bg',\n 'px-3 py-2 text-[15px] leading-6',\n 'focus:outline-none focus:ring-2 focus:ring-accent focus:ring-offset-1 focus:ring-offset-bg',\n )}\n />\n <Button\n type=\"submit\"\n disabled={!input.trim() || state.status !== 'open' || !!state.currentReplyId}\n aria-label={t('chat.send', { defaultValue: 'Send' })}\n className=\"h-11 w-11 shrink-0 rounded-full p-0\"\n >\n {state.currentReplyId ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n\n <div className=\"mt-2 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {state.currentReplyId && (\n <Badge variant=\"info\">\n {t('chat.streaming', { defaultValue: '… streaming' })}\n </Badge>\n )}\n {!state.currentReplyId && (\n <span className=\"text-[11px] text-text-muted\">\n {t('chat.mobileHint')}\n </span>\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => setSheet('activity')}\n className=\"inline-flex items-center gap-1 rounded px-1.5 py-1 text-xs text-text-dim hover:bg-surface-hover hover:text-text\"\n >\n <Activity className=\"h-3.5 w-3.5\" />\n {t('chat.activity', { defaultValue: 'Activity' })}\n </button>\n </div>\n </form>\n\n {sheet !== 'none' && (\n <>\n <button\n type=\"button\"\n aria-label={t('actions.close', { ns: 'common', defaultValue: 'Close' })}\n className=\"fixed inset-0 z-30 bg-black/35\"\n onClick={() => setSheet('none')}\n />\n <div className=\"fixed inset-x-0 bottom-0 z-40 rounded-t-2xl border border-border bg-surface px-4 pb-safe pt-3 shadow-lg\">\n <div className=\"mx-auto mb-3 h-1.5 w-12 rounded-full bg-border\" />\n\n {sheet === 'menu' && (\n <div className=\"space-y-3 pb-3\">\n <div>\n <div className=\"mb-1 text-[11px] uppercase text-text-dim\">\n {t('chat.agent', { defaultValue: 'Agent' })}\n </div>\n <AgentPicker\n agents={state.agents}\n value={state.agent}\n onChange={(a) => {\n switchAgent(a)\n setSheet('none')\n }}\n />\n </div>\n\n <button\n type=\"button\"\n className=\"block w-full rounded-md border border-border px-3 py-2 text-left text-sm hover:bg-surface-hover disabled:opacity-50\"\n disabled={state.status !== 'open' || !!state.currentReplyId}\n onClick={onStartNewConversation}\n >\n {t('chat.newConv', { defaultValue: 'New conversation' })}\n </button>\n\n <button\n type=\"button\"\n className=\"block w-full rounded-md border border-border px-3 py-2 text-left text-sm hover:bg-surface-hover\"\n onClick={() => setSheet('activity')}\n >\n {t('chat.activity', { defaultValue: 'Activity' })}\n </button>\n\n <button\n type=\"button\"\n className=\"block w-full rounded-md border border-border px-3 py-2 text-left text-sm hover:bg-surface-hover\"\n onClick={() => {\n setSheet('none')\n window.location.assign('/settings/llm')\n }}\n >\n {t('chat.llmSettings', { defaultValue: 'LLM settings' })}\n </button>\n\n <button\n type=\"button\"\n className=\"block w-full rounded-md border border-danger/30 px-3 py-2 text-left text-sm text-danger hover:bg-danger/10\"\n onClick={onLogout}\n >\n {t('chat.logout', { defaultValue: 'Log out' })}\n </button>\n </div>\n )}\n\n {sheet === 'activity' && (\n <div className=\"space-y-3 pb-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-semibold\">\n {t('chat.activityTitle', { defaultValue: 'Run activity' })}\n </div>\n <button\n type=\"button\"\n className=\"text-xs text-text-dim hover:text-text\"\n onClick={() => setSheet('menu')}\n >\n {t('actions.back', { ns: 'common', defaultValue: 'Back' })}\n </button>\n </div>\n\n <div className=\"rounded-md border border-border bg-surface-2 px-3 py-2 text-xs text-text-dim\">\n {t('chat.pendingApprovals', { defaultValue: 'Pending approvals' })}: {state.pendingApprovals.length}\n </div>\n\n <div className=\"max-h-72 space-y-2 overflow-y-auto pr-1\">\n {latestRuns.length === 0 && (\n <div className=\"rounded-md border border-border px-3 py-5 text-center text-xs text-text-dim\">\n {t('chat.activityEmpty', { defaultValue: 'No recent runs yet.' })}\n </div>\n )}\n {latestRuns.map((run) => (\n <div key={run.runId} className=\"rounded-md border border-border px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <Badge className={cn('border-0', runStatusBadgeClass(run.status))}>\n {run.status}\n </Badge>\n <span className=\"truncate text-xs font-medium\">{agentDisplayName(run.agent)}</span>\n <span className=\"ml-auto text-[11px] text-text-muted\">\n {formatDurationMs(run.durationMs)}\n </span>\n </div>\n <div className=\"mt-1 flex items-center gap-1 text-[11px] text-text-muted\">\n <Clock3 className=\"h-3 w-3\" />\n {formatClock(run.startedAt, i18n.language)}\n {run.outputChars != null && (\n <span>· {run.outputChars} chars</span>\n )}\n </div>\n {run.error && (\n <p className=\"mt-1 text-[11px] text-danger\">{run.error}</p>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </>\n )}\n </div>\n )\n}\n"],"names":["Clock3","createLucideIcon","EllipsisVertical","Sparkles","STATUS_STYLES","safeTs","ts","dayKey","d","m","day","formatDay","locale","formatClock","formatDurationMs","ms","buildRows","messages","rows","prevDay","msg","k","runStatusBadgeClass","status","MobileChatRoute","t","i18n","useTranslation","state","send","switchAgent","approvalClick","newConversation","clearError","useChat","input","setInput","useState","sheet","setSheet","showScrollDown","setShowScrollDown","nativeSetupDialogOpen","setNativeSetupDialogOpen","nativeSetupReason","setNativeSetupReason","listRef","useRef","inputRef","statusLabel","quickPrompts","useMemo","chatMessages","latestUserTitle","firstUser","compact","latestRuns","activeRun","r","useEffect","el","onScroll","dist","isNativeSetupError","toast","ta","onSubmit","e","v","onKeyDown","onScrollToBottom","onLogout","onStartNewConversation","jsxs","jsx","NativeSetupDialog","Button","ChevronLeft","cn","agentDisplayName","MoreVertical","row","MessageBubble","mid","reqId","choice","ArrowDown","ApprovalDock","prompt","Loader2","Send","Badge","Activity","Fragment","AgentPicker","a","run"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as e}from"./index-
|
|
1
|
+
import{o as e}from"./index-BIBWEKxu.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const t=e("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);export{t as C};
|
|
7
|
-
//# sourceMappingURL=chevron-left-
|
|
7
|
+
//# sourceMappingURL=chevron-left-CN-4SIfi.js.map
|
package/dist/web/public/assets/{chevron-left-CnLOhWHE.js.map → chevron-left-CN-4SIfi.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chevron-left-
|
|
1
|
+
{"version":3,"file":"chevron-left-CN-4SIfi.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chevron-left.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronLeft = createLucideIcon(\"ChevronLeft\", [\n [\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]\n]);\n\nexport { ChevronLeft as default };\n//# sourceMappingURL=chevron-left.js.map\n"],"names":["ChevronLeft","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAcC,EAAiB,cAAe,CAClD,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o}from"./index-
|
|
1
|
+
import{o}from"./index-BIBWEKxu.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const e=o("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);export{e as C};
|
|
7
|
-
//# sourceMappingURL=chevron-right-
|
|
7
|
+
//# sourceMappingURL=chevron-right-BhSTLH2K.js.map
|
package/dist/web/public/assets/{chevron-right-CpWYrqTa.js.map → chevron-right-BhSTLH2K.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chevron-right-
|
|
1
|
+
{"version":3,"file":"chevron-right-BhSTLH2K.js","sources":["../../node_modules/lucide-react/dist/esm/icons/chevron-right.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n"],"names":["ChevronRight","createLucideIcon"],"mappings":"mCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAeC,EAAiB,eAAgB,CACpD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as c}from"./index-
|
|
1
|
+
import{o as c}from"./index-BIBWEKxu.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const r=c("CircleCheck",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);export{r as C};
|
|
7
|
-
//# sourceMappingURL=circle-check-
|
|
7
|
+
//# sourceMappingURL=circle-check-B4UdHmdJ.js.map
|
package/dist/web/public/assets/{circle-check-DhcTh_uP.js.map → circle-check-B4UdHmdJ.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circle-check-
|
|
1
|
+
{"version":3,"file":"circle-check-B4UdHmdJ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-check.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleCheck = createLucideIcon(\"CircleCheck\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n]);\n\nexport { CircleCheck as default };\n//# sourceMappingURL=circle-check.js.map\n"],"names":["CircleCheck","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAcC,EAAiB,cAAe,CAClD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAQ,CAAE,CAChD,CAAC","x_google_ignoreList":[0]}
|
package/dist/web/public/assets/{circle-check-big-CcknUEHz.js → circle-check-big-CvXnDqiF.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as e}from"./index-
|
|
1
|
+
import{o as e}from"./index-BIBWEKxu.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const t=e("CircleCheckBig",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);export{t as C};
|
|
7
|
-
//# sourceMappingURL=circle-check-big-
|
|
7
|
+
//# sourceMappingURL=circle-check-big-CvXnDqiF.js.map
|
package/dist/web/public/assets/{circle-check-big-CcknUEHz.js.map → circle-check-big-CvXnDqiF.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circle-check-big-
|
|
1
|
+
{"version":3,"file":"circle-check-big-CvXnDqiF.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-check-big.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleCheckBig = createLucideIcon(\"CircleCheckBig\", [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n]);\n\nexport { CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n"],"names":["CircleCheckBig","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAiBC,EAAiB,iBAAkB,CACxD,CAAC,OAAQ,CAAE,EAAG,kCAAmC,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAQ,CAAE,CACjD,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as c}from"./index-
|
|
1
|
+
import{o as c}from"./index-BIBWEKxu.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const r=c("CircleX",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);export{r as C};
|
|
7
|
-
//# sourceMappingURL=circle-x-
|
|
7
|
+
//# sourceMappingURL=circle-x-B8y8mLHr.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circle-x-
|
|
1
|
+
{"version":3,"file":"circle-x-B8y8mLHr.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-x.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleX = createLucideIcon(\"CircleX\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n]);\n\nexport { CircleX as default };\n//# sourceMappingURL=circle-x.js.map\n"],"names":["CircleX","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAUC,EAAiB,UAAW,CAC1C,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAQ,CAAE,EAC1C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as c}from"./index-
|
|
1
|
+
import{o as c}from"./index-BIBWEKxu.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const e=c("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);export{e as C};
|
|
7
|
-
//# sourceMappingURL=clock-
|
|
7
|
+
//# sourceMappingURL=clock-CK2KO_Rc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock-
|
|
1
|
+
{"version":3,"file":"clock-CK2KO_Rc.js","sources":["../../node_modules/lucide-react/dist/esm/icons/clock.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Clock = createLucideIcon(\"Clock\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16 14\", key: \"68esgv\" }]\n]);\n\nexport { Clock as default };\n//# sourceMappingURL=clock.js.map\n"],"names":["Clock","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAQC,EAAiB,QAAS,CACtC,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,WAAY,CAAE,OAAQ,mBAAoB,IAAK,QAAQ,CAAE,CAC5D,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as y,j as a,D as j,t as D,v as g,w as h,x as b,y as p,B as r}from"./index-
|
|
2
|
-
//# sourceMappingURL=confirm-dialog-
|
|
1
|
+
import{u as y,j as a,D as j,t as D,v as g,w as h,x as b,y as p,B as r}from"./index-BIBWEKxu.js";import{r as n}from"./react-DlP5eolq.js";function v({open:c,onOpenChange:t,title:d,description:e,confirmLabel:u,cancelLabel:f,intent:x="default",onConfirm:l}){const{t:i}=y("common"),[s,o]=n.useState(!1),m=n.useCallback(async()=>{o(!0);try{await l(),t(!1)}catch{}finally{o(!1)}},[l,t]);return a.jsx(j,{open:c,onOpenChange:s?()=>{}:t,children:a.jsxs(D,{children:[a.jsxs(g,{children:[a.jsx(h,{children:d}),e&&a.jsx(b,{children:e})]}),a.jsxs(p,{children:[a.jsx(r,{type:"button",variant:"secondary",onClick:()=>t(!1),disabled:s,children:f??i("actions.cancel")}),a.jsx(r,{type:"button",variant:x==="danger"?"destructive":"default",onClick:m,disabled:s,"aria-busy":s,children:s?i("states.saving"):u??i("actions.confirm")})]})]})})}v.displayName="ConfirmDialog";export{v as C};
|
|
2
|
+
//# sourceMappingURL=confirm-dialog-GZyIzSwj.js.map
|
package/dist/web/public/assets/{confirm-dialog-HsyBgWxC.js.map → confirm-dialog-GZyIzSwj.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm-dialog-
|
|
1
|
+
{"version":3,"file":"confirm-dialog-GZyIzSwj.js","sources":["../../src/components/common/confirm-dialog.tsx"],"sourcesContent":["/**\n * ConfirmDialog — unified secondary-confirmation for destructive /\n * irreversible actions: delete fact, cancel job, revoke approval,\n * drop reminder, prune memos, etc.\n *\n * Why a wrapper: the v1 web admin had 3+ near-duplicate confirm\n * patterns (alert(), inline ▼ \"Are you sure?\" links, raw Dialog\n * uses). They each phrased the title / button differently and the\n * destructive variant was inconsistent. This component is the single\n * legal way to ask \"are you sure\" in v2.\n *\n * Controlled-only: caller owns the `open` state. That makes it\n * trivial to compose into a row action menu (open the dialog when\n * user clicks \"Delete\" in a DropdownMenu) without needing a\n * uncontrolled / `asChild` Trigger.\n *\n * `intent=\"danger\"` swaps the confirm button to the destructive\n * variant. `intent=\"default\"` (the implicit fallback) keeps the\n * primary blue — for non-destructive confirms like \"Submit anyway?\"\n *\n * Async confirm: the `onConfirm` callback may return a Promise; the\n * confirm button shows a busy state and stays disabled until the\n * promise settles. On error the dialog stays open so the caller can\n * surface the error via toast.\n */\n\nimport * as React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog'\nimport { Button } from '@/components/ui/button'\n\nexport type ConfirmDialogIntent = 'default' | 'danger'\n\nexport interface ConfirmDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: React.ReactNode\n description?: React.ReactNode\n /** Label for the confirm button. Defaults to t('common.actions.confirm'). */\n confirmLabel?: React.ReactNode\n /** Label for the cancel button. Defaults to t('common.actions.cancel'). */\n cancelLabel?: React.ReactNode\n /** Default: \"default\". `danger` styles the confirm button as destructive. */\n intent?: ConfirmDialogIntent\n /** Called when the user clicks confirm. May return a Promise; the\n * button shows busy state until the promise settles. The dialog\n * closes on success; on rejection it stays open. */\n onConfirm: () => void | Promise<void>\n}\n\nfunction ConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel,\n cancelLabel,\n intent = 'default',\n onConfirm,\n}: ConfirmDialogProps): JSX.Element {\n const { t } = useTranslation('common')\n const [busy, setBusy] = React.useState(false)\n\n const handleConfirm = React.useCallback(async () => {\n setBusy(true)\n try {\n await onConfirm()\n onOpenChange(false)\n } catch {\n // Keep dialog open; caller surfaces the failure via toast.\n } finally {\n setBusy(false)\n }\n }, [onConfirm, onOpenChange])\n\n return (\n <Dialog open={open} onOpenChange={busy ? () => {} : onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => onOpenChange(false)}\n disabled={busy}\n >\n {cancelLabel ?? t('actions.cancel')}\n </Button>\n <Button\n type=\"button\"\n variant={intent === 'danger' ? 'destructive' : 'default'}\n onClick={handleConfirm}\n disabled={busy}\n aria-busy={busy}\n >\n {busy ? t('states.saving') : (confirmLabel ?? t('actions.confirm'))}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\nConfirmDialog.displayName = 'ConfirmDialog'\n\nexport { ConfirmDialog }\n"],"names":["ConfirmDialog","open","onOpenChange","title","description","confirmLabel","cancelLabel","intent","onConfirm","t","useTranslation","busy","setBusy","React.useState","handleConfirm","React.useCallback","jsx","Dialog","jsxs","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","Button"],"mappings":"wIAyDA,SAASA,EAAc,CACrB,KAAAC,EACA,aAAAC,EACA,MAAAC,EACA,YAAAC,EACA,aAAAC,EACA,YAAAC,EACA,OAAAC,EAAS,UACT,UAAAC,CACF,EAAoC,CAClC,KAAM,CAAE,EAAAC,CAAA,EAAMC,EAAe,QAAQ,EAC/B,CAACC,EAAMC,CAAO,EAAIC,EAAAA,SAAe,EAAK,EAEtCC,EAAgBC,EAAAA,YAAkB,SAAY,CAClDH,EAAQ,EAAI,EACZ,GAAI,CACF,MAAMJ,EAAA,EACNN,EAAa,EAAK,CACpB,MAAQ,CAER,QAAA,CACEU,EAAQ,EAAK,CACf,CACF,EAAG,CAACJ,EAAWN,CAAY,CAAC,EAE5B,OACEc,EAAAA,IAACC,EAAA,CAAO,KAAAhB,EAAY,aAAcU,EAAO,IAAM,CAAC,EAAIT,EAClD,SAAAgB,EAAAA,KAACC,EAAA,CACC,SAAA,CAAAD,OAACE,EAAA,CACC,SAAA,CAAAJ,EAAAA,IAACK,GAAa,SAAAlB,CAAA,CAAM,EACnBC,GAAeY,EAAAA,IAACM,EAAA,CAAmB,SAAAlB,CAAA,CAAY,CAAA,EAClD,SACCmB,EAAA,CACC,SAAA,CAAAP,EAAAA,IAACQ,EAAA,CACC,KAAK,SACL,QAAQ,YACR,QAAS,IAAMtB,EAAa,EAAK,EACjC,SAAUS,EAET,SAAAL,GAAeG,EAAE,gBAAgB,CAAA,CAAA,EAEpCO,EAAAA,IAACQ,EAAA,CACC,KAAK,SACL,QAASjB,IAAW,SAAW,cAAgB,UAC/C,QAASO,EACT,SAAUH,EACV,YAAWA,EAEV,WAAOF,EAAE,eAAe,EAAKJ,GAAgBI,EAAE,iBAAiB,CAAA,CAAA,CACnE,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CACAT,EAAc,YAAc"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as e}from"./index-
|
|
1
|
+
import{o as e}from"./index-BIBWEKxu.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const o=e("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);export{o as C};
|
|
7
|
-
//# sourceMappingURL=copy-
|
|
7
|
+
//# sourceMappingURL=copy-CDCgL5Yq.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-
|
|
1
|
+
{"version":3,"file":"copy-CDCgL5Yq.js","sources":["../../node_modules/lucide-react/dist/esm/icons/copy.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Copy = createLucideIcon(\"Copy\", [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n]);\n\nexport { Copy as default };\n//# sourceMappingURL=copy.js.map\n"],"names":["Copy","createLucideIcon"],"mappings":"wCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAOC,EAAiB,OAAQ,CACpC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,SAAU,EACvF,CAAC,OAAQ,CAAE,EAAG,0DAA2D,IAAK,QAAQ,CAAE,CAC1F,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as _,u as H,j as e,c as g}from"./index-
|
|
1
|
+
import{o as _,u as H,j as e,c as g}from"./index-BIBWEKxu.js";import{r as P}from"./react-DlP5eolq.js";import{T as $,a as q,b as u,c as D,d as B,e as b}from"./table-Dww-k14l.js";import{E}from"./empty-state-BRsb30K6.js";import{A as F}from"./arrow-up-Cc28qbjN.js";import{A as L}from"./arrow-down-x-Lq92tn.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const O=_("ArrowUpDown",[["path",{d:"m21 16-4 4-4-4",key:"f6ql7i"}],["path",{d:"M17 20V4",key:"1ejh1v"}],["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}]]);function V({columns:i,rows:r,getRowId:m,loading:N=!1,loadingRows:k=5,emptyState:y,onRowClick:h,selection:n,onSelectionChange:v,sort:x,onSortChange:p,className:M}){const{t:f}=H("common"),t=n!==void 0&&v!==void 0,j=t&&r.length>0&&r.every(a=>n.has(m(a))),T=t&&r.some(a=>n.has(m(a)))&&!j;function w(){if(!t)return;const a=new Set(n);if(j)for(const s of r)a.delete(m(s));else for(const s of r)a.add(m(s));v(a)}function A(a){if(!t)return;const s=new Set(n);s.has(a)?s.delete(a):s.add(a),v(s)}function U(a){p&&(!x||x.id!==a?p({id:a,dir:"asc"}):x.dir==="asc"?p({id:a,dir:"desc"}):p(null))}return e.jsxs("div",{className:g("w-full",M),children:[e.jsx("div",{className:"hidden md:block",children:e.jsxs($,{children:[e.jsx(q,{children:e.jsxs(u,{children:[t&&e.jsx(D,{className:"w-10",children:e.jsx("input",{type:"checkbox",role:"checkbox","aria-label":f("table.selectAll"),"aria-checked":T?"mixed":j,checked:j,ref:a=>{a&&(a.indeterminate=T)},onChange:w,disabled:N||r.length===0,className:"h-4 w-4 accent-accent cursor-pointer"})}),i.map(a=>e.jsx(D,{className:a.headClassName,children:a.sortable&&p?e.jsxs("button",{type:"button",onClick:()=>U(a.id),className:g("inline-flex items-center gap-1","uppercase tracking-wide","hover:text-text transition-colors"),children:[a.header,x?.id===a.id?x.dir==="asc"?e.jsx(F,{className:"h-3 w-3"}):e.jsx(L,{className:"h-3 w-3"}):e.jsx(O,{className:"h-3 w-3 opacity-50"})]}):a.header},a.id))]})}),e.jsx(B,{children:N?Array.from({length:k}).map((a,s)=>e.jsxs(u,{children:[t&&e.jsx(b,{}),i.map(c=>e.jsx(b,{className:c.cellClassName,children:e.jsx("div",{className:"h-4 w-3/4 rounded bg-surface-2 animate-pulse"})},c.id))]},`skeleton-${s}`)):r.length===0?e.jsx(u,{children:e.jsx(b,{colSpan:i.length+(t?1:0),className:"p-0",children:y??e.jsx(E,{title:f("states.empty")})})}):r.map((a,s)=>{const c=m(a),o=t&&n.has(c);return e.jsxs(u,{"data-state":o?"selected":void 0,onClick:h?()=>h(a):void 0,className:h?"cursor-pointer":void 0,children:[t&&e.jsx(b,{onClick:d=>d.stopPropagation(),children:e.jsx("input",{type:"checkbox",role:"checkbox","aria-label":f("table.selectRow"),checked:o,onChange:()=>A(c),className:"h-4 w-4 accent-accent cursor-pointer"})}),i.map(d=>e.jsx(b,{className:d.cellClassName,children:d.cell(a,s)},d.id))]},c)})})]})}),e.jsx("div",{className:"md:hidden flex flex-col gap-2",children:N?Array.from({length:Math.min(3,k)}).map((a,s)=>e.jsxs("div",{className:"rounded-md border border-border bg-surface p-3 space-y-2",children:[e.jsx("div",{className:"h-4 w-1/2 rounded bg-surface-2 animate-pulse"}),e.jsx("div",{className:"h-3 w-3/4 rounded bg-surface-2 animate-pulse"}),e.jsx("div",{className:"h-3 w-2/3 rounded bg-surface-2 animate-pulse"})]},`mskel-${s}`)):r.length===0?y??e.jsx(E,{title:f("states.empty")}):r.map((a,s)=>{const c=m(a),o=t&&n.has(c),d=i.find(l=>l.asCardTitle)??i[0],C=i.filter(l=>!l.asCardTitle&&!l.hideOnMobile&&l.id!==d?.id);return e.jsxs("div",{"data-state":o?"selected":void 0,onClick:h?()=>h(a):void 0,className:g("rounded-md border bg-surface p-3",o?"border-accent":"border-border",h&&"cursor-pointer active:bg-surface-hover"),children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[d&&e.jsx("div",{className:"font-medium text-text",children:d.cell(a,s)}),t&&e.jsx("input",{type:"checkbox",role:"checkbox","aria-label":f("table.selectRow"),checked:!!o,onChange:()=>A(c),onClick:l=>l.stopPropagation(),className:"h-4 w-4 accent-accent cursor-pointer mt-0.5"})]}),C.length>0&&e.jsx("dl",{className:"mt-2 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-sm",children:C.map(l=>e.jsxs(P.Fragment,{children:[e.jsx("dt",{className:"text-text-dim",children:l.header}),e.jsx("dd",{className:"text-text",children:l.cell(a,s)})]},l.id))})]},c)})})]})}V.displayName="DataTable";export{V as D};
|
|
7
|
-
//# sourceMappingURL=data-table-
|
|
7
|
+
//# sourceMappingURL=data-table-1cGunUIX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table-C0yaCeSS.js","sources":["../../node_modules/lucide-react/dist/esm/icons/arrow-up-down.js","../../src/components/common/data-table.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 ArrowUpDown = createLucideIcon(\"ArrowUpDown\", [\n [\"path\", { d: \"m21 16-4 4-4-4\", key: \"f6ql7i\" }],\n [\"path\", { d: \"M17 20V4\", key: \"1ejh1v\" }],\n [\"path\", { d: \"m3 8 4-4 4 4\", key: \"11wl7u\" }],\n [\"path\", { d: \"M7 4v16\", key: \"1glfcx\" }]\n]);\n\nexport { ArrowUpDown as default };\n//# sourceMappingURL=arrow-up-down.js.map\n","/**\n * DataTable<T> — generic table for the M2 list pages (jobs /\n * approvals / reminders / memos). Wraps the primitive Table with:\n *\n * * Type-safe `columns` definition — header label, cell renderer,\n * optional sortable flag, optional className for both header / cell.\n * * Loading state — N skeleton rows so layout doesn't jump.\n * * Empty state — drops in <EmptyState> below the header.\n * * Row selection (optional) — `selection` + `onSelectionChange`;\n * caller manages the Set so it can be URL-state or zustand.\n * * Sort — controlled `sort: { id, dir }` + `onSortChange`. Same\n * rationale as Pagination: the URL is the source of truth.\n * * Mobile fallback — below `md` the table swaps to a vertical card\n * list. Card view uses the same column definitions but stacks\n * label / value pairs instead of a row.\n *\n * What this deliberately does NOT do:\n * * No virtualization. Expected row counts at M2 are ≤ 200; if a\n * page outgrows that, swap the render to react-window from inside\n * here without changing callers.\n * * No column resizing / hiding UX. shadcn columns are static.\n * * No filters. Filters live above the table in a dedicated\n * FilterBar (next-PR concern).\n *\n * Why hand-rolled instead of @tanstack/table-core:\n * For the M2 surface area (4 flat-data pages, ≤ 200 rows each),\n * pulling in a 13 KB head-table dep would add abstraction we don't\n * use. If virtualisation or column-pinning becomes a need, the\n * columns prop here maps 1:1 to tanstack's ColumnDef and we can\n * migrate without changing call sites.\n */\n\nimport * as React from 'react'\nimport { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react'\nimport { useTranslation } from 'react-i18next'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { cn } from '@/lib/utils'\n\nexport type SortDir = 'asc' | 'desc'\n\nexport interface SortState {\n id: string\n dir: SortDir\n}\n\nexport interface DataTableColumn<T> {\n /** Stable id for sort + selection. Usually matches the row key. */\n id: string\n /** Header label. ReactNode so callers can pass <Tooltip> etc. */\n header: React.ReactNode\n /** Cell renderer. Receives the row and its index. */\n cell: (row: T, index: number) => React.ReactNode\n /** When true, the header becomes a sort button. */\n sortable?: boolean\n /** Optional className applied to the <th>. */\n headClassName?: string\n /** Optional className applied to every <td> in this column. */\n cellClassName?: string\n /** Mobile-card variant: when set, this column's value renders\n * prominently as the card's title row. Only one column should\n * use this; the rest become label/value pairs. */\n asCardTitle?: boolean\n /** Hide this column on the mobile card view. */\n hideOnMobile?: boolean\n}\n\nexport interface DataTableProps<T> {\n columns: DataTableColumn<T>[]\n rows: T[]\n /** Stable per-row id. Used for selection + React keys. */\n getRowId: (row: T) => string\n loading?: boolean\n /** Number of skeleton rows to show during loading. Default 5. */\n loadingRows?: number\n /** Empty-state slot. When omitted a default EmptyState renders. */\n emptyState?: React.ReactNode\n /** Click handler for the whole row — opens detail drawer, navigates, etc. */\n onRowClick?: (row: T) => void\n /** Controlled selection. When defined, a checkbox column auto-renders. */\n selection?: Set<string>\n onSelectionChange?: (next: Set<string>) => void\n /** Controlled sort. When omitted, sortable headers stay inert. */\n sort?: SortState | null\n onSortChange?: (next: SortState | null) => void\n className?: string\n}\n\nfunction DataTable<T>({\n columns,\n rows,\n getRowId,\n loading = false,\n loadingRows = 5,\n emptyState,\n onRowClick,\n selection,\n onSelectionChange,\n sort,\n onSortChange,\n className,\n}: DataTableProps<T>): JSX.Element {\n const { t } = useTranslation('common')\n const selectable = selection !== undefined && onSelectionChange !== undefined\n\n const allChecked = selectable && rows.length > 0 && rows.every((r) => selection.has(getRowId(r)))\n const someChecked = selectable && rows.some((r) => selection.has(getRowId(r))) && !allChecked\n\n function toggleAll(): void {\n if (!selectable) return\n const next = new Set(selection)\n if (allChecked) {\n for (const r of rows) next.delete(getRowId(r))\n } else {\n for (const r of rows) next.add(getRowId(r))\n }\n onSelectionChange(next)\n }\n\n function toggleRow(id: string): void {\n if (!selectable) return\n const next = new Set(selection)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelectionChange(next)\n }\n\n function toggleSort(colId: string): void {\n if (!onSortChange) return\n if (!sort || sort.id !== colId) {\n onSortChange({ id: colId, dir: 'asc' })\n } else if (sort.dir === 'asc') {\n onSortChange({ id: colId, dir: 'desc' })\n } else {\n onSortChange(null)\n }\n }\n\n return (\n <div className={cn('w-full', className)}>\n {/* Desktop / tablet — table view */}\n <div className=\"hidden md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n {selectable && (\n <TableHead className=\"w-10\">\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n aria-label={t('table.selectAll')}\n aria-checked={someChecked ? 'mixed' : allChecked}\n checked={allChecked}\n ref={(el) => {\n if (el) el.indeterminate = someChecked\n }}\n onChange={toggleAll}\n disabled={loading || rows.length === 0}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n </TableHead>\n )}\n {columns.map((c) => (\n <TableHead key={c.id} className={c.headClassName}>\n {c.sortable && onSortChange ? (\n <button\n type=\"button\"\n onClick={() => toggleSort(c.id)}\n className={cn(\n 'inline-flex items-center gap-1',\n 'uppercase tracking-wide',\n 'hover:text-text transition-colors',\n )}\n >\n {c.header}\n {sort?.id === c.id ? (\n sort.dir === 'asc' ? <ArrowUp className=\"h-3 w-3\" /> : <ArrowDown className=\"h-3 w-3\" />\n ) : (\n <ArrowUpDown className=\"h-3 w-3 opacity-50\" />\n )}\n </button>\n ) : (\n c.header\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading\n ? Array.from({ length: loadingRows }).map((_, i) => (\n <TableRow key={`skeleton-${i}`}>\n {selectable && <TableCell />}\n {columns.map((c) => (\n <TableCell key={c.id} className={c.cellClassName}>\n <div className=\"h-4 w-3/4 rounded bg-surface-2 animate-pulse\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n : rows.length === 0\n ? (\n <TableRow>\n <TableCell\n colSpan={columns.length + (selectable ? 1 : 0)}\n className=\"p-0\"\n >\n {emptyState ?? <EmptyState title={t('states.empty')} />}\n </TableCell>\n </TableRow>\n )\n : rows.map((row, i) => {\n const id = getRowId(row)\n const isSelected = selectable && selection.has(id)\n return (\n <TableRow\n key={id}\n data-state={isSelected ? 'selected' : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={onRowClick ? 'cursor-pointer' : undefined}\n >\n {selectable && (\n <TableCell onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n aria-label={t('table.selectRow')}\n checked={isSelected}\n onChange={() => toggleRow(id)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n </TableCell>\n )}\n {columns.map((c) => (\n <TableCell key={c.id} className={c.cellClassName}>\n {c.cell(row, i)}\n </TableCell>\n ))}\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </div>\n\n {/* Mobile — card view */}\n <div className=\"md:hidden flex flex-col gap-2\">\n {loading\n ? Array.from({ length: Math.min(3, loadingRows) }).map((_, i) => (\n <div\n key={`mskel-${i}`}\n className=\"rounded-md border border-border bg-surface p-3 space-y-2\"\n >\n <div className=\"h-4 w-1/2 rounded bg-surface-2 animate-pulse\" />\n <div className=\"h-3 w-3/4 rounded bg-surface-2 animate-pulse\" />\n <div className=\"h-3 w-2/3 rounded bg-surface-2 animate-pulse\" />\n </div>\n ))\n : rows.length === 0\n ? (emptyState ?? <EmptyState title={t('states.empty')} />)\n : rows.map((row, i) => {\n const id = getRowId(row)\n const isSelected = selectable && selection.has(id)\n const titleCol = columns.find((c) => c.asCardTitle) ?? columns[0]\n const fieldCols = columns.filter((c) => !c.asCardTitle && !c.hideOnMobile && c.id !== titleCol?.id)\n return (\n <div\n key={id}\n data-state={isSelected ? 'selected' : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(\n 'rounded-md border bg-surface p-3',\n isSelected ? 'border-accent' : 'border-border',\n onRowClick && 'cursor-pointer active:bg-surface-hover',\n )}\n >\n <div className=\"flex items-start justify-between gap-2\">\n {titleCol && (\n <div className=\"font-medium text-text\">{titleCol.cell(row, i)}</div>\n )}\n {selectable && (\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n aria-label={t('table.selectRow')}\n checked={!!isSelected}\n onChange={() => toggleRow(id)}\n onClick={(e) => e.stopPropagation()}\n className=\"h-4 w-4 accent-accent cursor-pointer mt-0.5\"\n />\n )}\n </div>\n {fieldCols.length > 0 && (\n <dl className=\"mt-2 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-sm\">\n {fieldCols.map((c) => (\n <React.Fragment key={c.id}>\n <dt className=\"text-text-dim\">{c.header}</dt>\n <dd className=\"text-text\">{c.cell(row, i)}</dd>\n </React.Fragment>\n ))}\n </dl>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\nDataTable.displayName = 'DataTable'\n\nexport { DataTable }\n"],"names":["ArrowUpDown","createLucideIcon","DataTable","columns","rows","getRowId","loading","loadingRows","emptyState","onRowClick","selection","onSelectionChange","sort","onSortChange","className","t","useTranslation","selectable","allChecked","r","someChecked","toggleAll","next","toggleRow","id","toggleSort","colId","cn","jsx","jsxs","Table","TableHeader","TableRow","TableHead","el","c","ArrowUp","ArrowDown","TableBody","_","i","TableCell","EmptyState","row","isSelected","e","titleCol","fieldCols","React.Fragment"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"data-table-1cGunUIX.js","sources":["../../node_modules/lucide-react/dist/esm/icons/arrow-up-down.js","../../src/components/common/data-table.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 ArrowUpDown = createLucideIcon(\"ArrowUpDown\", [\n [\"path\", { d: \"m21 16-4 4-4-4\", key: \"f6ql7i\" }],\n [\"path\", { d: \"M17 20V4\", key: \"1ejh1v\" }],\n [\"path\", { d: \"m3 8 4-4 4 4\", key: \"11wl7u\" }],\n [\"path\", { d: \"M7 4v16\", key: \"1glfcx\" }]\n]);\n\nexport { ArrowUpDown as default };\n//# sourceMappingURL=arrow-up-down.js.map\n","/**\n * DataTable<T> — generic table for the M2 list pages (jobs /\n * approvals / reminders / memos). Wraps the primitive Table with:\n *\n * * Type-safe `columns` definition — header label, cell renderer,\n * optional sortable flag, optional className for both header / cell.\n * * Loading state — N skeleton rows so layout doesn't jump.\n * * Empty state — drops in <EmptyState> below the header.\n * * Row selection (optional) — `selection` + `onSelectionChange`;\n * caller manages the Set so it can be URL-state or zustand.\n * * Sort — controlled `sort: { id, dir }` + `onSortChange`. Same\n * rationale as Pagination: the URL is the source of truth.\n * * Mobile fallback — below `md` the table swaps to a vertical card\n * list. Card view uses the same column definitions but stacks\n * label / value pairs instead of a row.\n *\n * What this deliberately does NOT do:\n * * No virtualization. Expected row counts at M2 are ≤ 200; if a\n * page outgrows that, swap the render to react-window from inside\n * here without changing callers.\n * * No column resizing / hiding UX. shadcn columns are static.\n * * No filters. Filters live above the table in a dedicated\n * FilterBar (next-PR concern).\n *\n * Why hand-rolled instead of @tanstack/table-core:\n * For the M2 surface area (4 flat-data pages, ≤ 200 rows each),\n * pulling in a 13 KB head-table dep would add abstraction we don't\n * use. If virtualisation or column-pinning becomes a need, the\n * columns prop here maps 1:1 to tanstack's ColumnDef and we can\n * migrate without changing call sites.\n */\n\nimport * as React from 'react'\nimport { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react'\nimport { useTranslation } from 'react-i18next'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table'\nimport { EmptyState } from '@/components/common/empty-state'\nimport { cn } from '@/lib/utils'\n\nexport type SortDir = 'asc' | 'desc'\n\nexport interface SortState {\n id: string\n dir: SortDir\n}\n\nexport interface DataTableColumn<T> {\n /** Stable id for sort + selection. Usually matches the row key. */\n id: string\n /** Header label. ReactNode so callers can pass <Tooltip> etc. */\n header: React.ReactNode\n /** Cell renderer. Receives the row and its index. */\n cell: (row: T, index: number) => React.ReactNode\n /** When true, the header becomes a sort button. */\n sortable?: boolean\n /** Optional className applied to the <th>. */\n headClassName?: string\n /** Optional className applied to every <td> in this column. */\n cellClassName?: string\n /** Mobile-card variant: when set, this column's value renders\n * prominently as the card's title row. Only one column should\n * use this; the rest become label/value pairs. */\n asCardTitle?: boolean\n /** Hide this column on the mobile card view. */\n hideOnMobile?: boolean\n}\n\nexport interface DataTableProps<T> {\n columns: DataTableColumn<T>[]\n rows: T[]\n /** Stable per-row id. Used for selection + React keys. */\n getRowId: (row: T) => string\n loading?: boolean\n /** Number of skeleton rows to show during loading. Default 5. */\n loadingRows?: number\n /** Empty-state slot. When omitted a default EmptyState renders. */\n emptyState?: React.ReactNode\n /** Click handler for the whole row — opens detail drawer, navigates, etc. */\n onRowClick?: (row: T) => void\n /** Controlled selection. When defined, a checkbox column auto-renders. */\n selection?: Set<string>\n onSelectionChange?: (next: Set<string>) => void\n /** Controlled sort. When omitted, sortable headers stay inert. */\n sort?: SortState | null\n onSortChange?: (next: SortState | null) => void\n className?: string\n}\n\nfunction DataTable<T>({\n columns,\n rows,\n getRowId,\n loading = false,\n loadingRows = 5,\n emptyState,\n onRowClick,\n selection,\n onSelectionChange,\n sort,\n onSortChange,\n className,\n}: DataTableProps<T>): JSX.Element {\n const { t } = useTranslation('common')\n const selectable = selection !== undefined && onSelectionChange !== undefined\n\n const allChecked = selectable && rows.length > 0 && rows.every((r) => selection.has(getRowId(r)))\n const someChecked = selectable && rows.some((r) => selection.has(getRowId(r))) && !allChecked\n\n function toggleAll(): void {\n if (!selectable) return\n const next = new Set(selection)\n if (allChecked) {\n for (const r of rows) next.delete(getRowId(r))\n } else {\n for (const r of rows) next.add(getRowId(r))\n }\n onSelectionChange(next)\n }\n\n function toggleRow(id: string): void {\n if (!selectable) return\n const next = new Set(selection)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelectionChange(next)\n }\n\n function toggleSort(colId: string): void {\n if (!onSortChange) return\n if (!sort || sort.id !== colId) {\n onSortChange({ id: colId, dir: 'asc' })\n } else if (sort.dir === 'asc') {\n onSortChange({ id: colId, dir: 'desc' })\n } else {\n onSortChange(null)\n }\n }\n\n return (\n <div className={cn('w-full', className)}>\n {/* Desktop / tablet — table view */}\n <div className=\"hidden md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n {selectable && (\n <TableHead className=\"w-10\">\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n aria-label={t('table.selectAll')}\n aria-checked={someChecked ? 'mixed' : allChecked}\n checked={allChecked}\n ref={(el) => {\n if (el) el.indeterminate = someChecked\n }}\n onChange={toggleAll}\n disabled={loading || rows.length === 0}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n </TableHead>\n )}\n {columns.map((c) => (\n <TableHead key={c.id} className={c.headClassName}>\n {c.sortable && onSortChange ? (\n <button\n type=\"button\"\n onClick={() => toggleSort(c.id)}\n className={cn(\n 'inline-flex items-center gap-1',\n 'uppercase tracking-wide',\n 'hover:text-text transition-colors',\n )}\n >\n {c.header}\n {sort?.id === c.id ? (\n sort.dir === 'asc' ? <ArrowUp className=\"h-3 w-3\" /> : <ArrowDown className=\"h-3 w-3\" />\n ) : (\n <ArrowUpDown className=\"h-3 w-3 opacity-50\" />\n )}\n </button>\n ) : (\n c.header\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {loading\n ? Array.from({ length: loadingRows }).map((_, i) => (\n <TableRow key={`skeleton-${i}`}>\n {selectable && <TableCell />}\n {columns.map((c) => (\n <TableCell key={c.id} className={c.cellClassName}>\n <div className=\"h-4 w-3/4 rounded bg-surface-2 animate-pulse\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n : rows.length === 0\n ? (\n <TableRow>\n <TableCell\n colSpan={columns.length + (selectable ? 1 : 0)}\n className=\"p-0\"\n >\n {emptyState ?? <EmptyState title={t('states.empty')} />}\n </TableCell>\n </TableRow>\n )\n : rows.map((row, i) => {\n const id = getRowId(row)\n const isSelected = selectable && selection.has(id)\n return (\n <TableRow\n key={id}\n data-state={isSelected ? 'selected' : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={onRowClick ? 'cursor-pointer' : undefined}\n >\n {selectable && (\n <TableCell onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n aria-label={t('table.selectRow')}\n checked={isSelected}\n onChange={() => toggleRow(id)}\n className=\"h-4 w-4 accent-accent cursor-pointer\"\n />\n </TableCell>\n )}\n {columns.map((c) => (\n <TableCell key={c.id} className={c.cellClassName}>\n {c.cell(row, i)}\n </TableCell>\n ))}\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </div>\n\n {/* Mobile — card view */}\n <div className=\"md:hidden flex flex-col gap-2\">\n {loading\n ? Array.from({ length: Math.min(3, loadingRows) }).map((_, i) => (\n <div\n key={`mskel-${i}`}\n className=\"rounded-md border border-border bg-surface p-3 space-y-2\"\n >\n <div className=\"h-4 w-1/2 rounded bg-surface-2 animate-pulse\" />\n <div className=\"h-3 w-3/4 rounded bg-surface-2 animate-pulse\" />\n <div className=\"h-3 w-2/3 rounded bg-surface-2 animate-pulse\" />\n </div>\n ))\n : rows.length === 0\n ? (emptyState ?? <EmptyState title={t('states.empty')} />)\n : rows.map((row, i) => {\n const id = getRowId(row)\n const isSelected = selectable && selection.has(id)\n const titleCol = columns.find((c) => c.asCardTitle) ?? columns[0]\n const fieldCols = columns.filter((c) => !c.asCardTitle && !c.hideOnMobile && c.id !== titleCol?.id)\n return (\n <div\n key={id}\n data-state={isSelected ? 'selected' : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(\n 'rounded-md border bg-surface p-3',\n isSelected ? 'border-accent' : 'border-border',\n onRowClick && 'cursor-pointer active:bg-surface-hover',\n )}\n >\n <div className=\"flex items-start justify-between gap-2\">\n {titleCol && (\n <div className=\"font-medium text-text\">{titleCol.cell(row, i)}</div>\n )}\n {selectable && (\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n aria-label={t('table.selectRow')}\n checked={!!isSelected}\n onChange={() => toggleRow(id)}\n onClick={(e) => e.stopPropagation()}\n className=\"h-4 w-4 accent-accent cursor-pointer mt-0.5\"\n />\n )}\n </div>\n {fieldCols.length > 0 && (\n <dl className=\"mt-2 grid grid-cols-[max-content_1fr] gap-x-3 gap-y-1 text-sm\">\n {fieldCols.map((c) => (\n <React.Fragment key={c.id}>\n <dt className=\"text-text-dim\">{c.header}</dt>\n <dd className=\"text-text\">{c.cell(row, i)}</dd>\n </React.Fragment>\n ))}\n </dl>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\nDataTable.displayName = 'DataTable'\n\nexport { DataTable }\n"],"names":["ArrowUpDown","createLucideIcon","DataTable","columns","rows","getRowId","loading","loadingRows","emptyState","onRowClick","selection","onSelectionChange","sort","onSortChange","className","t","useTranslation","selectable","allChecked","r","someChecked","toggleAll","next","toggleRow","id","toggleSort","colId","cn","jsx","jsxs","Table","TableHeader","TableRow","TableHead","el","c","ArrowUp","ArrowDown","TableBody","_","i","TableCell","EmptyState","row","isSelected","e","titleCol","fieldCols","React.Fragment"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o}from"./index-
|
|
1
|
+
import{o}from"./index-BIBWEKxu.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const a=o("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);export{a as D};
|
|
7
|
-
//# sourceMappingURL=download-
|
|
7
|
+
//# sourceMappingURL=download-CuLP0G-q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download-
|
|
1
|
+
{"version":3,"file":"download-CuLP0G-q.js","sources":["../../node_modules/lucide-react/dist/esm/icons/download.js"],"sourcesContent":["/**\n * @license lucide-react v0.469.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Download = createLucideIcon(\"Download\", [\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"polyline\", { points: \"7 10 12 15 17 10\", key: \"2ggqvy\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"15\", y2: \"3\", key: \"1vk2je\" }]\n]);\n\nexport { Download as default };\n//# sourceMappingURL=download.js.map\n"],"names":["Download","createLucideIcon"],"mappings":"mCAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASK,MAACA,EAAWC,EAAiB,WAAY,CAC5C,CAAC,OAAQ,CAAE,EAAG,4CAA6C,IAAK,QAAQ,CAAE,EAC1E,CAAC,WAAY,CAAE,OAAQ,mBAAoB,IAAK,QAAQ,CAAE,EAC1D,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,IAAK,IAAK,QAAQ,CAAE,CACnE,CAAC","x_google_ignoreList":[0]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{o as A,u as F,j as e,
|
|
1
|
+
import{o as A,u as F,j as e,a9 as L,l as I,B as u,I as S,c as z,S as D,g as V,h as X,i as J,k as g,X as K,m,n as j,L as Q}from"./index-BIBWEKxu.js";import{r as M}from"./react-DlP5eolq.js";import{u as Y,a as q,f as G}from"./use-settings-DG1rm9KU.js";import{L as H}from"./loader-circle-BQkLEJZw.js";import{C as W}from"./circle-x-B8y8mLHr.js";import{C as Z}from"./circle-check-B4UdHmdJ.js";import{R as $}from"./refresh-ccw-CFPE6zD1.js";import{E as ee,a as se}from"./eye-DSu_4mW2.js";import{S as ae}from"./save-CNUmUMEf.js";/**
|
|
2
2
|
* @license lucide-react v0.469.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/const te=A("Mail",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]),U=["IMHUB_SMTP_HOST","IMHUB_SMTP_PORT","IMHUB_SMTP_USER","IMHUB_SMTP_PASS","IMHUB_SMTP_FROM","IMHUB_SMTP_SECURE"];function v(){return{IMHUB_SMTP_HOST:"",IMHUB_SMTP_PORT:"",IMHUB_SMTP_USER:"",IMHUB_SMTP_PASS:"",IMHUB_SMTP_FROM:"",IMHUB_SMTP_SECURE:"auto"}}function ie(s){const i=(s??"").trim().toLowerCase();return i==="1"||i==="true"||i==="yes"?"true":i==="0"||i==="false"||i==="no"?"false":"auto"}function P(s){return{IMHUB_SMTP_HOST:s.IMHUB_SMTP_HOST??"",IMHUB_SMTP_PORT:s.IMHUB_SMTP_PORT??"",IMHUB_SMTP_USER:s.IMHUB_SMTP_USER??"",IMHUB_SMTP_PASS:s.IMHUB_SMTP_PASS??"",IMHUB_SMTP_FROM:s.IMHUB_SMTP_FROM??"",IMHUB_SMTP_SECURE:ie(s.IMHUB_SMTP_SECURE)}}function B(s){return/\*{3,}/.test(s)}function he(){const{t:s}=F(["settings","common"]),[i,T]=M.useState(!1),n=Y({reveal:i}),o=q(),h=G(),l=n.data?.env??{},[r,f]=M.useState(v),[b,C]=M.useState("");M.useEffect(()=>{if(!n.data)return;const a=P(l),t=JSON.stringify(a);t!==b&&(f(a),C(t))},[n.dataUpdatedAt]);const _=!!(l.IMHUB_SMTP_HOST&&l.IMHUB_SMTP_USER&&l.IMHUB_SMTP_PASS),N=M.useMemo(()=>{if(!n.data)return!1;const a=P(l);for(const t of U)if(!(t==="IMHUB_SMTP_PASS"&&r[t]&&B(r[t])&&r[t]===a[t])&&r[t]!==a[t])return!0;return!1},[r,l,n.data]);function d(a,t){f(c=>({...c,[a]:t}))}function E(){n.data&&f(P(l))}async function R(){if(!n.data)return;const a=P(l),t={};for(const c of U){const p=r[c],k=a[c];p!==k&&(c==="IMHUB_SMTP_PASS"&&B(p)||(t[c]=p===""?null:p))}if(Object.keys(t).length===0){m.info(s("email.toast.noChanges"));return}try{await o.mutateAsync({updates:t}),m.success(s("email.toast.saved"))}catch(c){m.error(j(c,s).message)}}async function y(){if(!n.data)return;const a={};for(const t of U)a[t]=null;try{await o.mutateAsync({updates:a}),f(v()),m.success(s("email.toast.disabled"))}catch(t){m.error(j(t,s).message)}}async function w(){try{const a=await h.mutateAsync();m.success(a.message)}catch(a){m.error(j(a,s).message)}}const O=h.isPending?e.jsx(H,{className:"h-4 w-4 animate-spin"}):h.isError?e.jsx(W,{className:"h-4 w-4 text-danger"}):h.isSuccess?e.jsx(Z,{className:"h-4 w-4 text-success"}):e.jsx(L,{className:"h-4 w-4"});return e.jsxs("div",{className:"mx-auto flex max-w-4xl flex-col gap-4",children:[e.jsxs("header",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("h1",{className:"text-xl font-semibold",children:s("email.title")}),_?e.jsx(I,{variant:"success",children:s("email.statusOn")}):e.jsx(I,{variant:"outline",children:s("email.statusOff")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>void n.refetch(),disabled:n.isFetching,"aria-label":s("actions.refresh",{ns:"common"}),children:[n.isFetching?e.jsx(H,{className:"h-4 w-4 animate-spin"}):e.jsx($,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s("actions.refresh",{ns:"common"})})]})]}),e.jsx("p",{className:"text-sm text-text-dim",children:s("email.subtitle")})]}),n.isLoading?e.jsx("div",{className:"h-64 rounded-md bg-surface-2 animate-pulse"}):e.jsxs("section",{className:"rounded-md border border-border bg-surface",children:[e.jsxs("header",{className:"flex items-center gap-2 border-b border-border px-4 py-3",children:[e.jsx(te,{className:"h-4 w-4 text-text-dim"}),e.jsx("h2",{className:"text-sm font-semibold",children:s("email.cardTitle")}),e.jsxs(u,{variant:"ghost",size:"sm",className:"ml-auto",onClick:()=>T(a=>!a),disabled:n.isFetching,"aria-label":s(i?"email.hide":"email.reveal"),children:[i?e.jsx(ee,{className:"h-4 w-4"}):e.jsx(se,{className:"h-4 w-4"}),e.jsx("span",{className:"hidden sm:inline",children:s(i?"email.hide":"email.reveal")})]})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-3 px-4 py-4 sm:grid-cols-2",children:[e.jsx(x,{label:s("email.host"),hint:s("email.hostHint"),children:e.jsx(S,{value:r.IMHUB_SMTP_HOST,onChange:a=>d("IMHUB_SMTP_HOST",a.target.value),placeholder:"smtp.gmail.com",autoComplete:"off"})}),e.jsx(x,{label:s("email.port"),hint:s("email.portHint"),children:e.jsx(S,{type:"number",inputMode:"numeric",min:1,max:65535,value:r.IMHUB_SMTP_PORT,onChange:a=>d("IMHUB_SMTP_PORT",a.target.value),placeholder:"465",autoComplete:"off"})}),e.jsx(x,{label:s("email.user"),hint:s("email.userHint"),children:e.jsx(S,{value:r.IMHUB_SMTP_USER,onChange:a=>d("IMHUB_SMTP_USER",a.target.value),placeholder:"you@example.com",autoComplete:"off"})}),e.jsx(x,{label:s("email.pass"),hint:s("email.passHint"),children:e.jsx(S,{type:i?"text":"password",value:r.IMHUB_SMTP_PASS,onChange:a=>d("IMHUB_SMTP_PASS",a.target.value),placeholder:"••••••••",autoComplete:"new-password",className:z(B(r.IMHUB_SMTP_PASS)&&"font-mono text-text-muted")})}),e.jsx(x,{label:s("email.from"),hint:s("email.fromHint"),children:e.jsx(S,{value:r.IMHUB_SMTP_FROM,onChange:a=>d("IMHUB_SMTP_FROM",a.target.value),placeholder:"",autoComplete:"off"})}),e.jsx(x,{label:s("email.secure"),hint:s("email.secureHint"),children:e.jsxs(D,{value:r.IMHUB_SMTP_SECURE,onValueChange:a=>d("IMHUB_SMTP_SECURE",a),children:[e.jsx(V,{children:e.jsx(X,{})}),e.jsxs(J,{children:[e.jsx(g,{value:"auto",children:s("email.secureAuto")}),e.jsx(g,{value:"true",children:s("email.secureTrue")}),e.jsx(g,{value:"false",children:s("email.secureFalse")})]})]})})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2 border-t border-border px-4 py-3",children:[e.jsxs(u,{variant:"secondary",size:"sm",onClick:()=>void w(),disabled:!_||h.isPending,title:_?void 0:s("email.testNeedsConfigured"),children:[O,s("email.testBtn")]}),e.jsxs(u,{variant:"ghost",size:"sm",onClick:()=>void y(),disabled:!_||o.isPending,className:"text-danger hover:text-danger",children:[e.jsx(K,{className:"h-4 w-4"}),s("email.disableBtn")]}),e.jsx("span",{className:"ml-auto"}),N&&e.jsxs(e.Fragment,{children:[e.jsx(u,{variant:"ghost",size:"sm",onClick:E,disabled:o.isPending,children:s("email.discard")}),e.jsxs(u,{size:"sm",onClick:()=>void R(),disabled:o.isPending,children:[o.isPending?e.jsx(H,{className:"h-4 w-4 animate-spin"}):e.jsx(ae,{className:"h-4 w-4"}),o.isPending?s("email.saving"):s("email.saveBtn")]})]})]})]})]})}function x({label:s,hint:i,children:T}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(Q,{className:"text-xs font-medium",children:s}),T,i&&e.jsx("p",{className:"text-[11px] text-text-dim",children:i})]})}export{he as default,ie as normalizeSecure};
|
|
7
|
-
//# sourceMappingURL=email-
|
|
7
|
+
//# sourceMappingURL=email-Q-SY9qC9.js.map
|