@zythum02/fello-server 0.1.52 → 0.1.54
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/out/renderer/assets/{_baseUniq-C0L-SxO8.js → _baseUniq-DYINnBRJ.js} +1 -1
- package/out/renderer/assets/_baseUniq-DYINnBRJ.js.br +0 -0
- package/out/renderer/assets/_baseUniq-DYINnBRJ.js.gz +0 -0
- package/out/renderer/assets/{arc-bnlMIyYF.js → arc-BSUyw88k.js} +1 -1
- package/out/renderer/assets/arc-BSUyw88k.js.br +0 -0
- package/out/renderer/assets/arc-BSUyw88k.js.gz +0 -0
- package/out/renderer/assets/{architectureDiagram-Q4EWVU46-Cr0249Lu.js → architectureDiagram-Q4EWVU46-Cxb8DhYZ.js} +6 -6
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-Cxb8DhYZ.js.br +0 -0
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-Cxb8DhYZ.js.gz +0 -0
- package/out/renderer/assets/{arrow-left-D589pHHA.js → arrow-left-CQqe9rrj.js} +1 -1
- package/out/renderer/assets/arrow-up-1eI4tva4.js +21 -0
- package/out/renderer/assets/{automation-CvjrkE9z.js → automation-CQAOpWYp.js} +7 -8
- package/out/renderer/assets/automation-CQAOpWYp.js.br +0 -0
- package/out/renderer/assets/automation-CQAOpWYp.js.gz +0 -0
- package/out/renderer/assets/{blockDiagram-DXYQGD6D-Cw6vh5dx.js → blockDiagram-DXYQGD6D-CFozis-v.js} +7 -7
- package/out/renderer/assets/blockDiagram-DXYQGD6D-CFozis-v.js.br +0 -0
- package/out/renderer/assets/blockDiagram-DXYQGD6D-CFozis-v.js.gz +0 -0
- package/out/renderer/assets/{c4Diagram-AHTNJAMY-BUrvcyv2.js → c4Diagram-AHTNJAMY-CcDDkZUp.js} +3 -3
- package/out/renderer/assets/c4Diagram-AHTNJAMY-CcDDkZUp.js.br +0 -0
- package/out/renderer/assets/c4Diagram-AHTNJAMY-CcDDkZUp.js.gz +0 -0
- package/out/renderer/assets/{channel-DQr36qW5.js → channel-B-VC_ZcK.js} +1 -1
- package/out/renderer/assets/{chunk-4BX2VUAB-DOsXCDD7.js → chunk-4BX2VUAB-ClHmnOTC.js} +1 -1
- package/out/renderer/assets/{chunk-4TB4RGXK-D_fBnf0p.js → chunk-4TB4RGXK-mwOvn19G.js} +5 -5
- package/out/renderer/assets/chunk-4TB4RGXK-mwOvn19G.js.br +0 -0
- package/out/renderer/assets/chunk-4TB4RGXK-mwOvn19G.js.gz +0 -0
- package/out/renderer/assets/{chunk-55IACEB6-3ETNuedT.js → chunk-55IACEB6-CE8f6iip.js} +1 -1
- package/out/renderer/assets/{chunk-EDXVE4YY-BJLqHaER.js → chunk-EDXVE4YY-CU7aY96h.js} +1 -1
- package/out/renderer/assets/chunk-EDXVE4YY-CU7aY96h.js.br +0 -0
- package/out/renderer/assets/chunk-EDXVE4YY-CU7aY96h.js.gz +0 -0
- package/out/renderer/assets/{chunk-FMBD7UC4-DP-WGTNG.js → chunk-FMBD7UC4-B38kFkjv.js} +1 -1
- package/out/renderer/assets/{chunk-OYMX7WX6-CrS7loi7.js → chunk-OYMX7WX6-BriTCtaz.js} +3 -3
- package/out/renderer/assets/chunk-OYMX7WX6-BriTCtaz.js.br +0 -0
- package/out/renderer/assets/{chunk-OYMX7WX6-CrS7loi7.js.gz → chunk-OYMX7WX6-BriTCtaz.js.gz} +0 -0
- package/out/renderer/assets/{chunk-QZHKN3VN-C53USs5W.js → chunk-QZHKN3VN-BwJ37p5G.js} +1 -1
- package/out/renderer/assets/{chunk-YZCP3GAM-CMgdytZR.js → chunk-YZCP3GAM-BlHAYoQe.js} +1 -1
- package/out/renderer/assets/chunk-YZCP3GAM-BlHAYoQe.js.br +0 -0
- package/out/renderer/assets/chunk-YZCP3GAM-BlHAYoQe.js.gz +0 -0
- package/out/renderer/assets/{circle-x-OvXymUrf.js → circle-x-D_gJIgxf.js} +1 -1
- package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-DIYtEiO5.js → classDiagram-6PBFFD2Q-D01ZMeaj.js} +7 -7
- package/out/renderer/assets/{classDiagram-6PBFFD2Q-DIYtEiO5.js → classDiagram-v2-HSJHXN6E-D01ZMeaj.js} +7 -7
- package/out/renderer/assets/{clone-D45P7Iqc.js → clone-qctAbdCx.js} +1 -1
- package/out/renderer/assets/{code-editor-SuOcN-5B.js → code-editor-tm0AYOLz.js} +2 -2
- package/out/renderer/assets/code-editor-tm0AYOLz.js.br +0 -0
- package/out/renderer/assets/code-editor-tm0AYOLz.js.gz +0 -0
- package/out/renderer/assets/{collapsible-Bd85ZCyx.js → collapsible-DD6NlDid.js} +1 -1
- package/out/renderer/assets/collapsible-DD6NlDid.js.br +0 -0
- package/out/renderer/assets/collapsible-DD6NlDid.js.gz +0 -0
- package/out/renderer/assets/command-BF4jOeoL.js +11 -0
- package/out/renderer/assets/{cose-bilkent-S5V4N54A-Dq8VllNT.js → cose-bilkent-S5V4N54A-CF4brbsf.js} +2 -2
- package/out/renderer/assets/cose-bilkent-S5V4N54A-CF4brbsf.js.br +0 -0
- package/out/renderer/assets/cose-bilkent-S5V4N54A-CF4brbsf.js.gz +0 -0
- package/out/renderer/assets/{dagre-KV5264BT-Dec8q4UT.js → dagre-KV5264BT-C6I5VgRp.js} +7 -7
- package/out/renderer/assets/dagre-KV5264BT-C6I5VgRp.js.br +0 -0
- package/out/renderer/assets/dagre-KV5264BT-C6I5VgRp.js.gz +0 -0
- package/out/renderer/assets/{diagram-5BDNPKRD-CzA2u_EN.js → diagram-5BDNPKRD-BAO72D5R.js} +7 -7
- package/out/renderer/assets/diagram-5BDNPKRD-BAO72D5R.js.br +0 -0
- package/out/renderer/assets/diagram-5BDNPKRD-BAO72D5R.js.gz +0 -0
- package/out/renderer/assets/{diagram-G4DWMVQ6-C8h3R7jD.js → diagram-G4DWMVQ6-BmpkrtJs.js} +7 -7
- package/out/renderer/assets/diagram-G4DWMVQ6-BmpkrtJs.js.br +0 -0
- package/out/renderer/assets/diagram-G4DWMVQ6-BmpkrtJs.js.gz +0 -0
- package/out/renderer/assets/{diagram-MMDJMWI5-9tiXSF90.js → diagram-MMDJMWI5-8keZZjgB.js} +6 -6
- package/out/renderer/assets/diagram-MMDJMWI5-8keZZjgB.js.br +0 -0
- package/out/renderer/assets/diagram-MMDJMWI5-8keZZjgB.js.gz +0 -0
- package/out/renderer/assets/{diagram-TYMM5635-BrarGJNf.js → diagram-TYMM5635-Be4uDvHI.js} +6 -6
- package/out/renderer/assets/diagram-TYMM5635-Be4uDvHI.js.br +0 -0
- package/out/renderer/assets/diagram-TYMM5635-Be4uDvHI.js.gz +0 -0
- package/out/renderer/assets/{ellipsis-BafkhboM.js → ellipsis-92s4sSUO.js} +1 -1
- package/out/renderer/assets/{erDiagram-SMLLAGMA-1Q9StK7L.js → erDiagram-SMLLAGMA-C6IgAbhi.js} +5 -5
- package/out/renderer/assets/erDiagram-SMLLAGMA-C6IgAbhi.js.br +0 -0
- package/out/renderer/assets/erDiagram-SMLLAGMA-C6IgAbhi.js.gz +0 -0
- package/out/renderer/assets/{field-ohYLdnJa.js → field-BPsDfe4e.js} +1 -1
- package/out/renderer/assets/field-BPsDfe4e.js.br +0 -0
- package/out/renderer/assets/field-BPsDfe4e.js.gz +0 -0
- package/out/renderer/assets/{file-text-CshHuHgW.js → file-text-ITbWr8iW.js} +1 -1
- package/out/renderer/assets/{flowDiagram-DWJPFMVM-CpcXVOmj.js → flowDiagram-DWJPFMVM-vbYKBn4t.js} +7 -7
- package/out/renderer/assets/flowDiagram-DWJPFMVM-vbYKBn4t.js.br +0 -0
- package/out/renderer/assets/flowDiagram-DWJPFMVM-vbYKBn4t.js.gz +0 -0
- package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-C7Da4JBG.js → ganttDiagram-T4ZO3ILL-AxXIe9I4.js} +3 -3
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-AxXIe9I4.js.br +0 -0
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-AxXIe9I4.js.gz +0 -0
- package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-COBL52q_.js → gitGraphDiagram-UUTBAWPF-DSipARMB.js} +7 -7
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-DSipARMB.js.br +0 -0
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-DSipARMB.js.gz +0 -0
- package/out/renderer/assets/{graph-vKaAs6sc.js → graph-mNaHfg3r.js} +2 -2
- package/out/renderer/assets/graph-mNaHfg3r.js.br +0 -0
- package/out/renderer/assets/graph-mNaHfg3r.js.gz +0 -0
- package/out/renderer/assets/{highlighted-body-OFNGDK62-BGNnB1Ll.js → highlighted-body-OFNGDK62-8846XFj-.js} +2 -2
- package/out/renderer/assets/{index-BJPggXxf.js → index-BUwXrbHW.js} +1979 -663
- package/out/renderer/assets/index-BUwXrbHW.js.br +0 -0
- package/out/renderer/assets/index-BUwXrbHW.js.gz +0 -0
- package/out/renderer/assets/index-DOIzYXAl.css +382 -0
- package/out/renderer/assets/index-DOIzYXAl.css.br +0 -0
- package/out/renderer/assets/index-DOIzYXAl.css.gz +0 -0
- package/out/renderer/assets/{infoDiagram-42DDH7IO-z37e1cYq.js → infoDiagram-42DDH7IO-ThYxaM6U.js} +5 -5
- package/out/renderer/assets/infoDiagram-42DDH7IO-ThYxaM6U.js.br +0 -0
- package/out/renderer/assets/infoDiagram-42DDH7IO-ThYxaM6U.js.gz +0 -0
- package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-D0QTo3NZ.js → ishikawaDiagram-UXIWVN3A-EcWEDDQ3.js} +2 -2
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-EcWEDDQ3.js.br +0 -0
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-EcWEDDQ3.js.gz +0 -0
- package/out/renderer/assets/{item-Cv-tnX8b.js → item-Dph2aCdz.js} +20 -2
- package/out/renderer/assets/item-Dph2aCdz.js.br +0 -0
- package/out/renderer/assets/item-Dph2aCdz.js.gz +0 -0
- package/out/renderer/assets/{journeyDiagram-VCZTEJTY-CQV0gdjM.js → journeyDiagram-VCZTEJTY-Ct6VLkXK.js} +5 -5
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-Ct6VLkXK.js.br +0 -0
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-Ct6VLkXK.js.gz +0 -0
- package/out/renderer/assets/{kanban-definition-6JOO6SKY-DouRT6vc.js → kanban-definition-6JOO6SKY-DHWulQen.js} +3 -3
- package/out/renderer/assets/kanban-definition-6JOO6SKY-DHWulQen.js.br +0 -0
- package/out/renderer/assets/kanban-definition-6JOO6SKY-DHWulQen.js.gz +0 -0
- package/out/renderer/assets/{layout-BhbUjpvY.js → layout-pfquJ3N_.js} +4 -4
- package/out/renderer/assets/layout-pfquJ3N_.js.br +0 -0
- package/out/renderer/assets/layout-pfquJ3N_.js.gz +0 -0
- package/out/renderer/assets/{linear-D1WO10JK.js → linear-CdfVBcAB.js} +1 -1
- package/out/renderer/assets/linear-CdfVBcAB.js.br +0 -0
- package/out/renderer/assets/linear-CdfVBcAB.js.gz +0 -0
- package/out/renderer/assets/{link-2-C5KPDK2L.js → link-2-DpdZfD3m.js} +1 -1
- package/out/renderer/assets/{mermaid-GHXKKRXX-KwA2c0l5.js → mermaid-GHXKKRXX-CqMNodCp.js} +54 -54
- package/out/renderer/assets/mermaid-GHXKKRXX-CqMNodCp.js.br +0 -0
- package/out/renderer/assets/mermaid-GHXKKRXX-CqMNodCp.js.gz +0 -0
- package/out/renderer/assets/mic-CT1bYBEV.js +22 -0
- package/out/renderer/assets/{min-BP2C7bzG.js → min-CiK16GFr.js} +2 -2
- package/out/renderer/assets/min-CiK16GFr.js.br +0 -0
- package/out/renderer/assets/min-CiK16GFr.js.gz +0 -0
- package/out/renderer/assets/{mindmap-definition-QFDTVHPH-CxLYrjVp.js → mindmap-definition-QFDTVHPH-BvmM-Xdx.js} +4 -4
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-BvmM-Xdx.js.br +0 -0
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-BvmM-Xdx.js.gz +0 -0
- package/out/renderer/assets/{open-guide-UhaRhiI6.js → open-guide-BqiUQfrM.js} +1 -1
- package/out/renderer/assets/{package-search-DpyeQ5Lx.js → package-search-BxIuIl9F.js} +1 -1
- package/out/renderer/assets/{pieDiagram-DEJITSTG-D1LBRn_k.js → pieDiagram-DEJITSTG-CQY4NZ_4.js} +7 -7
- package/out/renderer/assets/pieDiagram-DEJITSTG-CQY4NZ_4.js.br +0 -0
- package/out/renderer/assets/pieDiagram-DEJITSTG-CQY4NZ_4.js.gz +0 -0
- package/out/renderer/assets/{plus-CsV_3veW.js → plus-C5XdFVFm.js} +1 -1
- package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-89cdKeKP.js → quadrantDiagram-34T5L4WZ-BiDWKNht.js} +3 -3
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-BiDWKNht.js.br +0 -0
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-BiDWKNht.js.gz +0 -0
- package/out/renderer/assets/{requirementDiagram-MS252O5E-BPmX5cbr.js → requirementDiagram-MS252O5E-D-KxL9Tf.js} +4 -4
- package/out/renderer/assets/requirementDiagram-MS252O5E-D-KxL9Tf.js.br +0 -0
- package/out/renderer/assets/requirementDiagram-MS252O5E-D-KxL9Tf.js.gz +0 -0
- package/out/renderer/assets/{resizable-C_plViAK.js → resizable-ObbINbIB.js} +1 -1
- package/out/renderer/assets/resizable-ObbINbIB.js.br +0 -0
- package/out/renderer/assets/resizable-ObbINbIB.js.gz +0 -0
- package/out/renderer/assets/{sankeyDiagram-XADWPNL6-Cy6CP9QU.js → sankeyDiagram-XADWPNL6-BIFbqkzs.js} +2 -2
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-BIFbqkzs.js.br +0 -0
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-BIFbqkzs.js.gz +0 -0
- package/out/renderer/assets/{schedule-BRGzJU8Q.js → schedule-BtuArq_x.js} +9 -10
- package/out/renderer/assets/schedule-BtuArq_x.js.br +0 -0
- package/out/renderer/assets/schedule-BtuArq_x.js.gz +0 -0
- package/out/renderer/assets/{search-BHyqy--Q.js → search-TCnuQyCi.js} +1 -1
- package/out/renderer/assets/{sequenceDiagram-FGHM5R23-B3c7Za1w.js → sequenceDiagram-FGHM5R23-DQX-_zuj.js} +4 -4
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-DQX-_zuj.js.br +0 -0
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-DQX-_zuj.js.gz +0 -0
- package/out/renderer/assets/{session-DAyi31xW.js → session-C_1BpGhU.js} +1511 -263
- package/out/renderer/assets/session-C_1BpGhU.js.br +0 -0
- package/out/renderer/assets/session-C_1BpGhU.js.gz +0 -0
- package/out/renderer/assets/{setting-dialog-B9QpnCSy.js → setting-dialog-D1_-4H95.js} +3 -3
- package/out/renderer/assets/setting-dialog-D1_-4H95.js.br +0 -0
- package/out/renderer/assets/setting-dialog-D1_-4H95.js.gz +0 -0
- package/out/renderer/assets/{settings-2-DTnwbGMG.js → settings-2-BwfZrIw6.js} +1 -1
- package/out/renderer/assets/{settings-agents-BrAPSjkm.js → settings-agents-BtuYXQ1V.js} +26 -15
- package/out/renderer/assets/settings-agents-BtuYXQ1V.js.br +0 -0
- package/out/renderer/assets/settings-agents-BtuYXQ1V.js.gz +0 -0
- package/out/renderer/assets/{settings-general-Ck2OiZjy.js → settings-general-cHqsKFFa.js} +36 -3
- package/out/renderer/assets/settings-general-cHqsKFFa.js.br +0 -0
- package/out/renderer/assets/settings-general-cHqsKFFa.js.gz +0 -0
- package/out/renderer/assets/{settings-ilink-D0Br74W_.js → settings-ilink-BR1Vd9t9.js} +3 -3
- package/out/renderer/assets/settings-ilink-BR1Vd9t9.js.br +0 -0
- package/out/renderer/assets/settings-ilink-BR1Vd9t9.js.gz +0 -0
- package/out/renderer/assets/{settings-image-generation-BdyKoUUZ.js → settings-image-generation-MUHYnpbm.js} +6 -7
- package/out/renderer/assets/settings-image-generation-MUHYnpbm.js.br +0 -0
- package/out/renderer/assets/settings-image-generation-MUHYnpbm.js.gz +0 -0
- package/out/renderer/assets/{settings-layout-B7d1oQnz.js → settings-layout-SBihzFfb.js} +16 -3
- package/out/renderer/assets/settings-layout-SBihzFfb.js.br +0 -0
- package/out/renderer/assets/settings-layout-SBihzFfb.js.gz +0 -0
- package/out/renderer/assets/{settings-mcp-DtnVGpCh.js → settings-mcp-Co88s-0y.js} +8 -9
- package/out/renderer/assets/settings-mcp-Co88s-0y.js.br +0 -0
- package/out/renderer/assets/settings-mcp-Co88s-0y.js.gz +0 -0
- package/out/renderer/assets/{settings-memory-Bff_D3Id.js → settings-memory-CNH9gHYC.js} +2 -3
- package/out/renderer/assets/settings-memory-CNH9gHYC.js.br +0 -0
- package/out/renderer/assets/settings-memory-CNH9gHYC.js.gz +0 -0
- package/out/renderer/assets/settings-shortcuts-C1s7YIMj.js +267 -0
- package/out/renderer/assets/settings-shortcuts-C1s7YIMj.js.br +0 -0
- package/out/renderer/assets/settings-shortcuts-C1s7YIMj.js.gz +0 -0
- package/out/renderer/assets/{settings-snippets-CuwNZ684.js → settings-snippets-DGgI6mxm.js} +7 -8
- package/out/renderer/assets/settings-snippets-DGgI6mxm.js.br +0 -0
- package/out/renderer/assets/settings-snippets-DGgI6mxm.js.gz +0 -0
- package/out/renderer/assets/settings-speech-to-text-CV0xM7yz.js +1054 -0
- package/out/renderer/assets/settings-speech-to-text-CV0xM7yz.js.br +0 -0
- package/out/renderer/assets/settings-speech-to-text-CV0xM7yz.js.gz +0 -0
- package/out/renderer/assets/{settings-webui-CcjZQw6G.js → settings-webui-Bj9dJDcm.js} +2 -2
- package/out/renderer/assets/settings-webui-Bj9dJDcm.js.br +0 -0
- package/out/renderer/assets/settings-webui-Bj9dJDcm.js.gz +0 -0
- package/out/renderer/assets/{skills-installed-BR3EmTKD.js → skills-installed-Bhd5a33I.js} +4 -4
- package/out/renderer/assets/skills-installed-Bhd5a33I.js.br +0 -0
- package/out/renderer/assets/skills-installed-Bhd5a33I.js.gz +0 -0
- package/out/renderer/assets/{skills-layout-Cgy95TdD.js → skills-layout-DZFDa1cw.js} +2 -2
- package/out/renderer/assets/skills-layout-DZFDa1cw.js.br +0 -0
- package/out/renderer/assets/skills-layout-DZFDa1cw.js.gz +0 -0
- package/out/renderer/assets/{skills-skills-sh-7eO0Llg2.js → skills-skills-sh-DF59nekm.js} +4 -4
- package/out/renderer/assets/skills-skills-sh-DF59nekm.js.br +0 -0
- package/out/renderer/assets/skills-skills-sh-DF59nekm.js.gz +0 -0
- package/out/renderer/assets/{sortable.esm-BTWJnVbf.js → sortable.esm-BlhN8Kkg.js} +1 -1
- package/out/renderer/assets/sortable.esm-BlhN8Kkg.js.br +0 -0
- package/out/renderer/assets/sortable.esm-BlhN8Kkg.js.gz +0 -0
- package/out/renderer/assets/{standard-schema-Dk273X__.js → standard-schema-CGAs4bGi.js} +1 -1
- package/out/renderer/assets/standard-schema-CGAs4bGi.js.br +0 -0
- package/out/renderer/assets/standard-schema-CGAs4bGi.js.gz +0 -0
- package/out/renderer/assets/{stateDiagram-FHFEXIEX-C-7WuE0a.js → stateDiagram-FHFEXIEX-DappRrGm.js} +9 -9
- package/out/renderer/assets/stateDiagram-FHFEXIEX-DappRrGm.js.br +0 -0
- package/out/renderer/assets/stateDiagram-FHFEXIEX-DappRrGm.js.gz +0 -0
- package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-IZRTgRo8.js → stateDiagram-v2-QKLJ7IA2-mbgJN2Ya.js} +5 -5
- package/out/renderer/assets/{task-Bd1x6VfK.js → task-C7tCZ6e3.js} +11 -12
- package/out/renderer/assets/task-C7tCZ6e3.js.br +0 -0
- package/out/renderer/assets/task-C7tCZ6e3.js.gz +0 -0
- package/out/renderer/assets/{textarea-CcqU8Ki7.js → textarea-DNSPhqFr.js} +2 -2
- package/out/renderer/assets/{timeline-definition-GMOUNBTQ-DVUMAatS.js → timeline-definition-GMOUNBTQ-o8XIUDyn.js} +3 -3
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-o8XIUDyn.js.br +0 -0
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-o8XIUDyn.js.gz +0 -0
- package/out/renderer/assets/{vennDiagram-DHZGUBPP-BtKdpgmE.js → vennDiagram-DHZGUBPP-mnc6bpmR.js} +2 -2
- package/out/renderer/assets/vennDiagram-DHZGUBPP-mnc6bpmR.js.br +0 -0
- package/out/renderer/assets/vennDiagram-DHZGUBPP-mnc6bpmR.js.gz +0 -0
- package/out/renderer/assets/{wardley-RL74JXVD-DRlpukah.js → wardley-RL74JXVD-wdJYeEiD.js} +4 -4
- package/out/renderer/assets/wardley-RL74JXVD-wdJYeEiD.js.br +0 -0
- package/out/renderer/assets/wardley-RL74JXVD-wdJYeEiD.js.gz +0 -0
- package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-c_iDOO-3.js → wardleyDiagram-NUSXRM2D-Ddx6k7tJ.js} +6 -6
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-Ddx6k7tJ.js.br +0 -0
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-Ddx6k7tJ.js.gz +0 -0
- package/out/renderer/assets/{wrench-C-pOIUrz.js → wrench-BsjH8RPm.js} +1 -1
- package/out/renderer/assets/wrench-BsjH8RPm.js.br +0 -0
- package/out/renderer/assets/wrench-BsjH8RPm.js.gz +0 -0
- package/out/renderer/assets/{xlsx-view-Ca3bToM7.js → xlsx-view-CQd4jbk-.js} +21 -13
- package/out/renderer/assets/xlsx-view-CQd4jbk-.js.br +0 -0
- package/out/renderer/assets/xlsx-view-CQd4jbk-.js.gz +0 -0
- package/out/renderer/assets/{xychartDiagram-5P7HB3ND-D65drBbj.js → xychartDiagram-5P7HB3ND-VIQ9wuz0.js} +3 -3
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-VIQ9wuz0.js.br +0 -0
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-VIQ9wuz0.js.gz +0 -0
- package/out/renderer/index.html +2 -2
- package/out/renderer/index.html.br +0 -0
- package/out/renderer/index.html.gz +0 -0
- package/out/scripts/mcp-skills/server.mjs +1 -1
- package/out/server/main.js +290 -11
- package/package.json +2 -1
- package/resources/tree-sitter-wasm/tree-sitter-dart.wasm +0 -0
- package/out/renderer/assets/_baseUniq-C0L-SxO8.js.br +0 -0
- package/out/renderer/assets/_baseUniq-C0L-SxO8.js.gz +0 -0
- package/out/renderer/assets/arc-bnlMIyYF.js.br +0 -0
- package/out/renderer/assets/arc-bnlMIyYF.js.gz +0 -0
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-Cr0249Lu.js.br +0 -0
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-Cr0249Lu.js.gz +0 -0
- package/out/renderer/assets/automation-CvjrkE9z.js.br +0 -0
- package/out/renderer/assets/automation-CvjrkE9z.js.gz +0 -0
- package/out/renderer/assets/blockDiagram-DXYQGD6D-Cw6vh5dx.js.br +0 -0
- package/out/renderer/assets/blockDiagram-DXYQGD6D-Cw6vh5dx.js.gz +0 -0
- package/out/renderer/assets/c4Diagram-AHTNJAMY-BUrvcyv2.js.br +0 -0
- package/out/renderer/assets/c4Diagram-AHTNJAMY-BUrvcyv2.js.gz +0 -0
- package/out/renderer/assets/chunk-4TB4RGXK-D_fBnf0p.js.br +0 -0
- package/out/renderer/assets/chunk-4TB4RGXK-D_fBnf0p.js.gz +0 -0
- package/out/renderer/assets/chunk-EDXVE4YY-BJLqHaER.js.br +0 -0
- package/out/renderer/assets/chunk-EDXVE4YY-BJLqHaER.js.gz +0 -0
- package/out/renderer/assets/chunk-OYMX7WX6-CrS7loi7.js.br +0 -0
- package/out/renderer/assets/chunk-YZCP3GAM-CMgdytZR.js.br +0 -0
- package/out/renderer/assets/chunk-YZCP3GAM-CMgdytZR.js.gz +0 -0
- package/out/renderer/assets/clipboard-xI9lExaB.js +0 -15
- package/out/renderer/assets/code-editor-SuOcN-5B.js.br +0 -0
- package/out/renderer/assets/code-editor-SuOcN-5B.js.gz +0 -0
- package/out/renderer/assets/collapsible-Bd85ZCyx.js.br +0 -0
- package/out/renderer/assets/collapsible-Bd85ZCyx.js.gz +0 -0
- package/out/renderer/assets/context-menu-BO9-4FYd.js +0 -282
- package/out/renderer/assets/context-menu-BO9-4FYd.js.br +0 -0
- package/out/renderer/assets/context-menu-BO9-4FYd.js.gz +0 -0
- package/out/renderer/assets/cose-bilkent-S5V4N54A-Dq8VllNT.js.br +0 -0
- package/out/renderer/assets/cose-bilkent-S5V4N54A-Dq8VllNT.js.gz +0 -0
- package/out/renderer/assets/dagre-KV5264BT-Dec8q4UT.js.br +0 -0
- package/out/renderer/assets/dagre-KV5264BT-Dec8q4UT.js.gz +0 -0
- package/out/renderer/assets/diagram-5BDNPKRD-CzA2u_EN.js.br +0 -0
- package/out/renderer/assets/diagram-5BDNPKRD-CzA2u_EN.js.gz +0 -0
- package/out/renderer/assets/diagram-G4DWMVQ6-C8h3R7jD.js.br +0 -0
- package/out/renderer/assets/diagram-G4DWMVQ6-C8h3R7jD.js.gz +0 -0
- package/out/renderer/assets/diagram-MMDJMWI5-9tiXSF90.js.br +0 -0
- package/out/renderer/assets/diagram-MMDJMWI5-9tiXSF90.js.gz +0 -0
- package/out/renderer/assets/diagram-TYMM5635-BrarGJNf.js.br +0 -0
- package/out/renderer/assets/diagram-TYMM5635-BrarGJNf.js.gz +0 -0
- package/out/renderer/assets/erDiagram-SMLLAGMA-1Q9StK7L.js.br +0 -0
- package/out/renderer/assets/erDiagram-SMLLAGMA-1Q9StK7L.js.gz +0 -0
- package/out/renderer/assets/field-ohYLdnJa.js.br +0 -0
- package/out/renderer/assets/field-ohYLdnJa.js.gz +0 -0
- package/out/renderer/assets/flowDiagram-DWJPFMVM-CpcXVOmj.js.br +0 -0
- package/out/renderer/assets/flowDiagram-DWJPFMVM-CpcXVOmj.js.gz +0 -0
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-C7Da4JBG.js.br +0 -0
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-C7Da4JBG.js.gz +0 -0
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-COBL52q_.js.br +0 -0
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-COBL52q_.js.gz +0 -0
- package/out/renderer/assets/graph-vKaAs6sc.js.br +0 -0
- package/out/renderer/assets/graph-vKaAs6sc.js.gz +0 -0
- package/out/renderer/assets/index-BJPggXxf.js.br +0 -0
- package/out/renderer/assets/index-BJPggXxf.js.gz +0 -0
- package/out/renderer/assets/index-DGML4zYf.css +0 -382
- package/out/renderer/assets/index-DGML4zYf.css.br +0 -0
- package/out/renderer/assets/index-DGML4zYf.css.gz +0 -0
- package/out/renderer/assets/infoDiagram-42DDH7IO-z37e1cYq.js.br +0 -0
- package/out/renderer/assets/infoDiagram-42DDH7IO-z37e1cYq.js.gz +0 -0
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-D0QTo3NZ.js.br +0 -0
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-D0QTo3NZ.js.gz +0 -0
- package/out/renderer/assets/item-Cv-tnX8b.js.br +0 -0
- package/out/renderer/assets/item-Cv-tnX8b.js.gz +0 -0
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-CQV0gdjM.js.br +0 -0
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-CQV0gdjM.js.gz +0 -0
- package/out/renderer/assets/kanban-definition-6JOO6SKY-DouRT6vc.js.br +0 -0
- package/out/renderer/assets/kanban-definition-6JOO6SKY-DouRT6vc.js.gz +0 -0
- package/out/renderer/assets/layout-BhbUjpvY.js.br +0 -0
- package/out/renderer/assets/layout-BhbUjpvY.js.gz +0 -0
- package/out/renderer/assets/linear-D1WO10JK.js.br +0 -0
- package/out/renderer/assets/linear-D1WO10JK.js.gz +0 -0
- package/out/renderer/assets/mermaid-GHXKKRXX-KwA2c0l5.js.br +0 -0
- package/out/renderer/assets/mermaid-GHXKKRXX-KwA2c0l5.js.gz +0 -0
- package/out/renderer/assets/min-BP2C7bzG.js.br +0 -0
- package/out/renderer/assets/min-BP2C7bzG.js.gz +0 -0
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-CxLYrjVp.js.br +0 -0
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-CxLYrjVp.js.gz +0 -0
- package/out/renderer/assets/pieDiagram-DEJITSTG-D1LBRn_k.js.br +0 -0
- package/out/renderer/assets/pieDiagram-DEJITSTG-D1LBRn_k.js.gz +0 -0
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-89cdKeKP.js.br +0 -0
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-89cdKeKP.js.gz +0 -0
- package/out/renderer/assets/refresh-cw-CYW3HR-E.js +0 -11
- package/out/renderer/assets/requirementDiagram-MS252O5E-BPmX5cbr.js.br +0 -0
- package/out/renderer/assets/requirementDiagram-MS252O5E-BPmX5cbr.js.gz +0 -0
- package/out/renderer/assets/resizable-C_plViAK.js.br +0 -0
- package/out/renderer/assets/resizable-C_plViAK.js.gz +0 -0
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-Cy6CP9QU.js.br +0 -0
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-Cy6CP9QU.js.gz +0 -0
- package/out/renderer/assets/schedule-BRGzJU8Q.js.br +0 -0
- package/out/renderer/assets/schedule-BRGzJU8Q.js.gz +0 -0
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-B3c7Za1w.js.br +0 -0
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-B3c7Za1w.js.gz +0 -0
- package/out/renderer/assets/session-DAyi31xW.js.br +0 -0
- package/out/renderer/assets/session-DAyi31xW.js.gz +0 -0
- package/out/renderer/assets/setting-dialog-B9QpnCSy.js.br +0 -0
- package/out/renderer/assets/setting-dialog-B9QpnCSy.js.gz +0 -0
- package/out/renderer/assets/settings-agents-BrAPSjkm.js.br +0 -0
- package/out/renderer/assets/settings-agents-BrAPSjkm.js.gz +0 -0
- package/out/renderer/assets/settings-general-Ck2OiZjy.js.br +0 -0
- package/out/renderer/assets/settings-general-Ck2OiZjy.js.gz +0 -0
- package/out/renderer/assets/settings-ilink-D0Br74W_.js.br +0 -0
- package/out/renderer/assets/settings-ilink-D0Br74W_.js.gz +0 -0
- package/out/renderer/assets/settings-image-generation-BdyKoUUZ.js.br +0 -0
- package/out/renderer/assets/settings-image-generation-BdyKoUUZ.js.gz +0 -0
- package/out/renderer/assets/settings-layout-B7d1oQnz.js.br +0 -0
- package/out/renderer/assets/settings-layout-B7d1oQnz.js.gz +0 -0
- package/out/renderer/assets/settings-mcp-DtnVGpCh.js.br +0 -0
- package/out/renderer/assets/settings-mcp-DtnVGpCh.js.gz +0 -0
- package/out/renderer/assets/settings-memory-Bff_D3Id.js.br +0 -0
- package/out/renderer/assets/settings-memory-Bff_D3Id.js.gz +0 -0
- package/out/renderer/assets/settings-snippets-CuwNZ684.js.br +0 -0
- package/out/renderer/assets/settings-snippets-CuwNZ684.js.gz +0 -0
- package/out/renderer/assets/settings-webui-CcjZQw6G.js.br +0 -0
- package/out/renderer/assets/settings-webui-CcjZQw6G.js.gz +0 -0
- package/out/renderer/assets/skills-installed-BR3EmTKD.js.br +0 -0
- package/out/renderer/assets/skills-installed-BR3EmTKD.js.gz +0 -0
- package/out/renderer/assets/skills-layout-Cgy95TdD.js.br +0 -0
- package/out/renderer/assets/skills-layout-Cgy95TdD.js.gz +0 -0
- package/out/renderer/assets/skills-skills-sh-7eO0Llg2.js.br +0 -0
- package/out/renderer/assets/skills-skills-sh-7eO0Llg2.js.gz +0 -0
- package/out/renderer/assets/sortable.esm-BTWJnVbf.js.br +0 -0
- package/out/renderer/assets/sortable.esm-BTWJnVbf.js.gz +0 -0
- package/out/renderer/assets/standard-schema-Dk273X__.js.br +0 -0
- package/out/renderer/assets/standard-schema-Dk273X__.js.gz +0 -0
- package/out/renderer/assets/stateDiagram-FHFEXIEX-C-7WuE0a.js.br +0 -0
- package/out/renderer/assets/stateDiagram-FHFEXIEX-C-7WuE0a.js.gz +0 -0
- package/out/renderer/assets/task-Bd1x6VfK.js.br +0 -0
- package/out/renderer/assets/task-Bd1x6VfK.js.gz +0 -0
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-DVUMAatS.js.br +0 -0
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-DVUMAatS.js.gz +0 -0
- package/out/renderer/assets/vennDiagram-DHZGUBPP-BtKdpgmE.js.br +0 -0
- package/out/renderer/assets/vennDiagram-DHZGUBPP-BtKdpgmE.js.gz +0 -0
- package/out/renderer/assets/wardley-RL74JXVD-DRlpukah.js.br +0 -0
- package/out/renderer/assets/wardley-RL74JXVD-DRlpukah.js.gz +0 -0
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-c_iDOO-3.js.br +0 -0
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-c_iDOO-3.js.gz +0 -0
- package/out/renderer/assets/wrench-C-pOIUrz.js.br +0 -0
- package/out/renderer/assets/wrench-C-pOIUrz.js.gz +0 -0
- package/out/renderer/assets/xlsx-view-Ca3bToM7.js.br +0 -0
- package/out/renderer/assets/xlsx-view-Ca3bToM7.js.gz +0 -0
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-D65drBbj.js.br +0 -0
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-D65drBbj.js.gz +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./session-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./session-C_1BpGhU.js","./settings-2-BwfZrIw6.js","./xlsx-view-CQd4jbk-.js","./mermaid-GHXKKRXX-CqMNodCp.js","./collapsible-DD6NlDid.js","./item-Dph2aCdz.js","./file-text-ITbWr8iW.js","./link-2-DpdZfD3m.js","./search-TCnuQyCi.js","./schemas-c0X-G5_P.js","./wrench-BsjH8RPm.js","./ellipsis-92s4sSUO.js","./xlsx-view-Chm2gOCI.css","./arrow-up-1eI4tva4.js","./mic-CT1bYBEV.js","./arrow-left-CQqe9rrj.js","./plus-C5XdFVFm.js","./resizable-ObbINbIB.js","./settings-layout-SBihzFfb.js","./command-BF4jOeoL.js","./settings-general-cHqsKFFa.js","./field-BPsDfe4e.js","./settings-shortcuts-C1s7YIMj.js","./settings-agents-BtuYXQ1V.js","./open-guide-BqiUQfrM.js","./sortable.esm-BlhN8Kkg.js","./standard-schema-CGAs4bGi.js","./textarea-DNSPhqFr.js","./circle-x-D_gJIgxf.js","./settings-mcp-Co88s-0y.js","./settings-webui-Bj9dJDcm.js","./settings-ilink-BR1Vd9t9.js","./settings-snippets-DGgI6mxm.js","./settings-memory-CNH9gHYC.js","./settings-image-generation-MUHYnpbm.js","./settings-speech-to-text-CV0xM7yz.js","./skills-layout-DZFDa1cw.js","./package-search-BxIuIl9F.js","./skills-installed-Bhd5a33I.js","./skills-skills-sh-DF59nekm.js","./automation-CQAOpWYp.js","./setting-dialog-D1_-4H95.js","./schedule-BtuArq_x.js","./task-C7tCZ6e3.js"])))=>i.map(i=>d[i]);
|
|
2
2
|
function _mergeNamespaces(n, m) {
|
|
3
3
|
for (var i = 0; i < m.length; i++) {
|
|
4
4
|
const e = m[i];
|
|
@@ -2225,7 +2225,7 @@ function requireReactDomClient_production() {
|
|
|
2225
2225
|
clipboardData: function(event) {
|
|
2226
2226
|
return "clipboardData" in event ? event.clipboardData : window.clipboardData;
|
|
2227
2227
|
}
|
|
2228
|
-
}), SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface), CompositionEventInterface = assign({}, EventInterface, { data: 0 }), SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface),
|
|
2228
|
+
}), SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface), CompositionEventInterface = assign({}, EventInterface, { data: 0 }), SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface), normalizeKey2 = {
|
|
2229
2229
|
Esc: "Escape",
|
|
2230
2230
|
Spacebar: " ",
|
|
2231
2231
|
Left: "ArrowLeft",
|
|
@@ -2291,7 +2291,7 @@ function requireReactDomClient_production() {
|
|
|
2291
2291
|
var KeyboardEventInterface = assign({}, UIEventInterface, {
|
|
2292
2292
|
key: function(nativeEvent) {
|
|
2293
2293
|
if (nativeEvent.key) {
|
|
2294
|
-
var key =
|
|
2294
|
+
var key = normalizeKey2[nativeEvent.key] || nativeEvent.key;
|
|
2295
2295
|
if ("Unidentified" !== key) return key;
|
|
2296
2296
|
}
|
|
2297
2297
|
return "keypress" === nativeEvent.type ? (nativeEvent = getEventCharCode(nativeEvent), 13 === nativeEvent ? "Enter" : String.fromCharCode(nativeEvent)) : "keydown" === nativeEvent.type || "keyup" === nativeEvent.type ? translateToKey[nativeEvent.keyCode] || "Unidentified" : "";
|
|
@@ -14132,8 +14132,11 @@ const useAppStore = create((set2, get2) => ({
|
|
|
14132
14132
|
ilink: { useOriginalImage: false },
|
|
14133
14133
|
editor: { name: "code" },
|
|
14134
14134
|
sound: { volume: 50, muted: false, theme: "soft" },
|
|
14135
|
+
voiceInput: { altDoublePress: true },
|
|
14135
14136
|
snippets: [],
|
|
14136
14137
|
imageGeneration: [],
|
|
14138
|
+
speechToText: [],
|
|
14139
|
+
shortcuts: {},
|
|
14137
14140
|
webUIStatus: { enabled: false, url: null },
|
|
14138
14141
|
ilinkStatus: { connected: false },
|
|
14139
14142
|
activeIlinkSessionId: null,
|
|
@@ -14265,8 +14268,11 @@ const useAppStore = create((set2, get2) => ({
|
|
|
14265
14268
|
setIlink: (ilink) => set2({ ilink }),
|
|
14266
14269
|
setEditor: (editor) => set2({ editor }),
|
|
14267
14270
|
setSound: (sound) => set2({ sound }),
|
|
14271
|
+
setVoiceInput: (voiceInput) => set2({ voiceInput }),
|
|
14268
14272
|
setSnippets: (snippets) => set2({ snippets }),
|
|
14269
14273
|
setImageGeneration: (imageGeneration2) => set2({ imageGeneration: imageGeneration2 }),
|
|
14274
|
+
setSpeechToText: (speechToText) => set2({ speechToText }),
|
|
14275
|
+
setShortcuts: (shortcuts) => set2({ shortcuts }),
|
|
14270
14276
|
setWebUIStatus: (status) => set2({ webUIStatus: status }),
|
|
14271
14277
|
setIlinkStatus: (status) => set2({ ilinkStatus: status }),
|
|
14272
14278
|
setActiveIlinkSessionId: (sessionId) => set2({ activeIlinkSessionId: sessionId }),
|
|
@@ -16885,17 +16891,18 @@ const useTranslation = (ns, props = {}) => {
|
|
|
16885
16891
|
}
|
|
16886
16892
|
return ret;
|
|
16887
16893
|
};
|
|
16888
|
-
const sidebar$1 = { "welcome": "Welcome", "skills": "Skills", "automation": "Automation", "projects": "Projects", "noProjects": "No projects yet", "noProjectsHint": "Add a project folder to get started", "addProject": "Add Project", "noAgentsHint": "Configure an agent first", "configureAgent": "Configure Agent", "revealInFinder": "Reveal in Finder", "rename": "Rename", "delete": "Delete", "renameProject": "Rename Project", "
|
|
16894
|
+
const sidebar$1 = { "welcome": "Welcome", "skills": "Skills", "automation": "Automation", "projects": "Projects", "noProjects": "No projects yet", "noProjectsHint": "Add a project folder to get started", "addProject": "Add Project", "noAgentsHint": "Configure an agent first", "configureAgent": "Configure Agent", "revealInFinder": "Reveal in Finder", "rename": "Rename", "delete": "Delete", "renameProject": "Rename Project", "renameSession": "Rename Session", "deleteSession": "Delete Session", "enterNewProjectName": "Enter a new project name.", "enterNewSessionName": "Enter a new session name.", "addProjectTitle": "Add Project", "enterProjectPath": "Enter absolute path to project on the server:", "pathCannotBeEmpty": "Path cannot be empty", "webuiEnabled": "WebUI Enabled", "deleteProject": "Delete Project", "deleteProjectConfirm": 'Delete project "{{title}}" and all sessions in it?\nThis action cannot be undone.', "deleteSessionConfirm": 'Delete session "{{title}}"?\nThis action cannot be undone.', "cancel": "Cancel", "save": "Save", "settings": "Settings", "agents": "Agents", "addProjectFailed": "Failed to add project.", "newSessionFailed": "Failed to create a new session.", "loadSessionFailed": "Failed to load session.", "revealInFinderFailed": "Failed to reveal in Finder.", "openInEditorFailed": "Failed to open in editor.", "projectExists": "Project already exists.", "projectNameEmpty": "Project name cannot be empty.", "sessionNameEmpty": "Session name cannot be empty.", "newSession": "New Session", "viewSession": "View Session", "projectActions": "Project actions for {{title}}", "createSessionInProject": "Create session in {{title}}", "sessionActions": "Session actions for {{title}}", "ilinkSetActive": "Set WeChat Active", "ilinkUnsetActive": "Unset WeChat Active", "failedToUpdateIlinkSession": "Failed to update WeChat active session.", "sessionOperationInProgress": "Another session operation is already in progress.", "ilinkActiveStatus": "WeChat Active", "ilinkInactiveStatus": "Not WeChat Active", "restartSession": "Restart Session", "closeSession": "Close Session", "closingSession": "Closing…", "failedToCloseSession": "Failed to close session.", "failedToDeleteSession": "Failed to delete session.", "failedToDeleteProject": "Failed to delete project.", "failedToLoadSession": "Failed to load session.", "failedToUpdateMcpServers": "Failed to update MCP servers", "collapse": "Collapse sidebar", "expand": "Expand sidebar", "updated": "Updated", "created": "Created", "sessionCount": "{{count}} sessions", "sessionCount_one": "{{count}} session", "newSessionDialog": { "title": "Create session", "agent": "Agent", "selectAgent": "Select an agent", "mcp": "MCP", "noMcp": "No MCP servers configured", "permission": "Permission", "permissionAsk": "Ask", "permissionAllowAll": "Allow all", "create": "Create" } };
|
|
16889
16895
|
const skills$1 = { "title": "Skills", "installed": { "label": "Installed", "noDescription": "No description provided.", "revealInFinder": "Reveal in Finder", "viewSkill": "View SKILL.md", "uninstall": "Uninstall", "uninstallTitle": "Uninstall Skill", "uninstallConfirm": "Are you sure you want to uninstall {{name}}? ", "cancel": "Cancel", "uninstalledSuccess": "Skill {{name}} uninstalled", "uninstallFailed": "Failed to uninstall: {{message}}", "revealFailed": "Failed to reveal in Finder: {{message}}", "loadFailed": "Failed to load skills", "loadContentFailed": "Error loading skill content: {{message}}", "noSkills": "No skills installed." }, "skillsSh": { "label": "skills.sh", "title": "Discover Skills", "desc": "Explore and install community skills to enhance your agents.", "searchPlaceholder": "Search skills (e.g. pr-review, react-best-practices)...", "install": "Install", "installSuccess": "Skill {{name}} installed", "installFailed": "Install failed", "noResults": "No skills found", "installs": "{{count}} installs", "installedStatus": "Installed", "authorPrefix": "by " } };
|
|
16890
16896
|
const contextMenu$1 = { "cut": "Cut", "copy": "Copy", "paste": "Paste", "selectAll": "Select All" };
|
|
16891
|
-
const settings$1 = /* @__PURE__ */ JSON.parse(`{"themeDesc":"Customize the appearance of the application","languageDesc":"Select the display language","title":"Settings","general":{"title":"General","desc":"Manage your application settings.","theme":"Theme","light":"Light","dark":"Dark","system":"System","language":"Language","english":"English","chinese":"简体中文","saveThemeFailed":"Failed to save theme setting.","saveLanguageFailed":"Failed to save language setting.","groupAppearance":"Appearance","groupProject":"Project","autoWatchFiles":"Auto Watch Files","autoWatchFilesDesc":"Automatically watch project file changes","saveFileWatcherFailed":"Failed to save file watcher setting.","groupNetwork":"Network","proxy":"Network Proxy","proxyDesc":"Configure the network proxy used by Fello for Node requests, subprocesses and the UI.","proxyEdit":"Edit proxy settings","proxyOff":"Direct","proxySystem":"System","groupSound":"Sound","soundEnabled":"Sound Effects","soundEnabledDesc":"Play sound effects for notifications","soundVolume":"Volume","soundVolumeDesc":"Adjust notification volume","soundTheme":"Sound Style","soundThemeDesc":"Select the sound effect style","soundSoft":"Soft","soundCrisp":"Crisp","soundTest":"Test","soundTestDesc":"Preview the current sound effect","soundTestPlay":"Play","saveSoundFailed":"Failed to save sound setting.","groupEditor":"Editor","editor":"Open in Editor","editorDesc":"Choose the editor to open files","selectEditor":"Select editor","saveEditorFailed":"Failed to save editor setting."},"agents":{"desc":"Manage agent configurations and startup commands.","description":"Configure agents","title":"Agents","guide":"User Guide","addStdioAgent":"Add via ACP Agent","addApiAgent":"Add via API Key","editStdioAgent":"Edit ACP Agent","editApiAgent":"Edit API Agent","dialogDesc":"Configure the agent ID, command, arguments and environment variables.","apiDialogDesc":"Configure provider, endpoint and authentication for API agent.","agentId":"Agent ID (Name)","apiProvider":"Provider","apiBaseUrl":"Base URL","apiKey":"API Key","apiHeaders":"Headers (JSON)","contextWindowTokens":"Context Window (tokens)","modelIdTemplate":"Model Id Template","models":"Models (one per line)","modelsHint":"Usually not needed — models are fetched automatically. Only specify if the API doesn't return the models you need","command":"Command","args":"Arguments","envVars":"Environment Variables (JSON)","envJson":"Environment Variables (JSON)","quickPreset":"Quick preset","cancel":"Cancel","save":"Save","edit":"Edit","delete":"Delete","dragToReorder":"Drag to reorder","noAgents":"No agents configured","errorIdCommand":"ID and Command are required.","errorDuplicateId":"An agent with this ID already exists.","errorEnvJson":"Env must be a valid JSON object.","errorContextWindowTokens":"Context Window must be a positive integer.","updateFailed":"Failed to update configuration.","confirmDeleteTitle":"Delete Agent","confirmDeleteDesc":"Are you sure you want to delete this agent? This action cannot be undone.","confirmDeleteDescWithSessions":"Are you sure you want to delete this agent? {{count}} session(s) will also be deleted. This action cannot be undone.","reset":"Reset Agent","resetSuccess":"Agent reset.","resetFailed":"Failed to reset agent.","deleteAllSessions":"Delete All Sessions","confirmDeleteAllSessionsTitle":"Delete All Sessions","confirmDeleteAllSessionsDesc":"All sessions for this agent will be permanently deleted. This action cannot be undone.","deleteAllSessionsSuccess":"{{count}} session(s) deleted.","deleteAllSessionsFailed":"Failed to delete sessions.","validation":{"enterId":"Please enter an agent ID.","idFormat":"Only letters, numbers, _ and - allowed.","selectProvider":"Please select a provider.","enterBaseUrl":"Please enter a base URL.","enterApiKey":"Please enter an API key.","enterCommand":"Please enter a command.","jsonObject":"Must be a valid JSON object with string values.","positiveInteger":"Must be a positive integer."}},"mcp":{"desc":"Manage MCP server configurations and startup commands.","description":"Configure MCP Servers","title":"MCP Servers","guide":"User Guide","addMcp":"Add MCP Server","addStdioMcp":"Add Stdio MCP","addHttpMcp":"Add HTTP MCP","addSseMcp":"Add SSE MCP","recommended":{"exa":{"name":"Exa","desc":"Exa MCP Server — AI Web Search"}},"editMcp":"Edit MCP Server","dialogDesc":"Configure the MCP server ID, command, arguments and environment variables.","mcpId":"MCP Server ID (Name)","command":"Command","args":"Arguments","envVars":"Environment Variables (JSON)","envJson":"Environment Variables (JSON)","url":"URL","headers":"Headers (JSON)","headersJson":"Headers (JSON)","httpDialogDesc":"Configure the MCP server ID, HTTP URL and request headers.","sseDialogDesc":"Configure the MCP server ID, SSE endpoint URL and request headers.","cancel":"Cancel","save":"Save","edit":"Edit","delete":"Delete","dragToReorder":"Drag to reorder","noMcpServers":"No MCP servers configured","errorIdRequired":"ID is required.","errorUrlRequired":"URL is required.","errorIdCommand":"ID and Command are required.","errorDuplicateId":"An MCP server with this ID already exists.","errorHeadersJson":"Headers must be a valid JSON object.","errorEnvJson":"Env must be a valid JSON object.","updateFailed":"Failed to update configuration.","confirmDeleteTitle":"Delete MCP Server","confirmDeleteDesc":"Are you sure you want to delete this MCP server? This action cannot be undone.","validation":{"enterId":"Please enter a server ID.","idFormat":"Only letters, numbers, _ and - allowed.","enterCommand":"Please enter a command.","enterUrl":"Please enter a URL.","jsonObject":"Must be a valid JSON object with string values."}},"webui":{"desc":"Configure remote access to the Fello interface.","title":"WebUI","guide":"User Guide","enable":"Enable WebUI","enableDesc":"Allow remote access to Fello interface via browser","accessUrl":"Access URL","accessDesc":"Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.","enableAccess":"Enable WebUI Access","port":"Port:","token":"Token:","autoGenerated":"Auto-generated","copy":"Copy","note":"Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.","updateFailed":"Failed to update configuration.","disabledInWebUI":"WebUI configuration is disabled when running inside the browser."},"ilink":{"title":"WeChat iLink","guide":"User Guide","description":"Connect Fello to WeChat via iLink Bot API. Once connected, a ClawBot contact will appear in your WeChat, allowing you to chat with your AI agent from anywhere.","connected":"Connected","notConnected":"Not Connected","notConnectedHint":"Scan QR code with WeChat to connect","login":"Login","loggingIn":"Waiting...","disconnect":"Disconnect","scanPrompt":"Scan with WeChat to login","qrcodeExpired":"QR code expired, please try again","scanned":"Scanned! Please confirm on your phone.","browserOpened":"QR code opened in browser. Scan with WeChat to login.","activeSession":"Active Session for WeChat","activeSessionHint":"Messages from WeChat will be routed to this session. Right-click a session in the sidebar to set it as active.","selectSession":"-- Select a session --","none":"-- None --","howItWorks":"How it works","step1":"Click \\"Login\\" to open the QR code in your browser","step2":"Scan the QR code with WeChat","step3":"A \\"ClawBot\\" contact appears in your WeChat","step4":"Chat with ClawBot — messages are routed to the active session above","step5":"Right-click any session in the sidebar to set it as active for WeChat","useOriginalImage":"Use Original Image","useOriginalImageDesc":"Send full-size images to the model (uses more tokens). When off, thumbnails are used.","keepaliveMaxCount":"Keepalive Messages","keepaliveMaxCountDesc":"Max consecutive keepalive messages while thinking.","commandsTitle":"WeChat \\"!\\" Commands","commandsDesc":"Messages starting with ! or ! are commands. They interrupt the current agent execution (cancelling an ongoing reply) and then run the corresponding action.","cmdSwitchSession":"Switch Session","cmdSwitchSessionDesc":"List all sessions (grouped by project); reply with a number to switch.","cmdNewSession":"New Session","cmdNewSessionDesc":"List all projects; reply with a number to create a session in that project and switch to it.","cmdSwitchModel":"Switch Model","cmdSwitchModelDesc":"List models available in the current session; reply with a number to switch (API agents only).","cmdSnippet":"Quick Snippet","cmdSnippetDesc":"List configured snippets; reply with a number to send that content to the agent.","cmdStatus":"View Status","cmdStatusDesc":"Show active session info (title, project, agent, features, MCP status)."},"snippets":{"title":"Snippets","desc":"Manage reusable text snippets for quick insertion.","description":"Configure Snippets","add":"Add Snippet","edit":"Edit Snippet","delete":"Delete","save":"Save","cancel":"Cancel","empty":"No snippets configured","saveFailed":"Failed to save snippets.","titleLabel":"Title","titlePlaceholder":"Title","contentLabel":"Content","contentPlaceholder":"Content","dialogDesc":"Configure the snippet title and content.","confirmDeleteTitle":"Delete Snippet","confirmDeleteDesc":"Are you sure you want to delete this snippet? This action cannot be undone.","validation":{"enterTitle":"Please enter a title.","enterContent":"Please enter content."}},"memory":{"title":"Memory","desc":"View and manage persistent project-level memory.","projectMemories":"Project Memories","refresh":"Refresh","clear":"Clear","cleared":"Memory cleared.","clearFailed":"Failed to clear memory.","delete":"Delete","deleted":"Memory entry deleted.","deleteFailed":"Failed to delete memory entry.","confirmDeleteTitle":"Delete Memory Entry","confirmDeleteDesc":"Are you sure you want to delete this memory entry? This cannot be undone.","confirmClearTitle":"Clear Memory","confirmClearDesc":"Are you sure you want to clear all memory for project \\"{{title}}\\"? This cannot be undone.","revealInFinder":"Reveal in Finder","revealFailed":"Failed to reveal file.","noFile":"No memory file found.","noProjects":"No projects found.","empty":"No memories stored.","entries":"Entries"},"imageGeneration":{"title":"Image Generation","desc":"Configure image generation providers. The active provider will be available as a tool for agents.","providers":"Providers","add":"Add Provider","addProvider":"Add Provider","editProvider":"Edit Provider","dialogDesc":"Configure provider, endpoint and authentication for image generation.","edit":"Edit","delete":"Delete","empty":"No image generation providers configured","updateFailed":"Failed to update configuration.","confirmDeleteTitle":"Delete Provider","confirmDeleteDesc":"Are you sure you want to delete this image generation provider?","cancel":"Cancel","save":"Save","form":{"name":"Name","provider":"Provider","baseUrl":"Base URL","baseUrlHint":"Request → {baseUrl}/images/generations","apiKey":"API Key","headers":"Headers (JSON)","extraBody":"Extra Body (JSON)","extraBodyHint":"Additional parameters merged into request body (e.g. quality, style).","model":"Model"},"validation":{"enterName":"Please enter a name.","selectProvider":"Please select a provider.","enterBaseUrl":"Please enter a base URL.","enterApiKey":"Please enter an API key.","enterModel":"Please enter the model name.","jsonObject":"Must be a valid JSON object with string values."}},"proxy":{"title":"Network Proxy","mode":"Proxy Mode","off":"Direct","offDesc":"Connect directly without a proxy","manual":"Manual","manualDesc":"Specify a proxy server manually for all network requests","system":"System","systemDesc":"Use the system proxy settings (macOS/Windows or environment variables)","httpProxy":"HTTP Proxy","httpProxyPlaceholder":"e.g. http://127.0.0.1:7890","httpsProxy":"HTTPS Proxy (optional)","httpsProxyHint":"Falls back to the HTTP proxy when empty.","noProxy":"No Proxy (optional)","noProxyPlaceholder":"e.g. localhost,127.0.0.1,*.internal","username":"Username (optional)","password":"Password (optional)","cancel":"Cancel","save":"Save","later":"Later","restartNow":"Restart Now","restartTitle":"Restart Required","restartDesc":"Proxy settings saved. Restart Fello to apply the new proxy configuration.","restartManualDesc":"Proxy settings saved. Please manually restart the Fello server process to apply the new configuration.","saveFailed":"Failed to save proxy settings.","validation":{"httpProxyRequired":"HTTP proxy URL is required in manual mode.","invalidProxyUrl":"{{field}} should start with http:// or https://, or use a host:port address (e.g. 127.0.0.1:7890)."}}}`);
|
|
16897
|
+
const commands$1 = { "focusChatInput": { "title": "Focus chat input", "description": "Move focus to the chat input." }, "focusChatArea": { "title": "Focus chat area", "description": "Move focus to the chat conversation." }, "focusFileTree": { "title": "Focus file tree", "description": "Move focus to the project file tree." }, "focusTerminalList": { "title": "Focus terminal list", "description": "Move focus to the terminal list." }, "focusSidebarSessions": { "title": "Focus session list", "description": "Move focus to the session list." } };
|
|
16898
|
+
const settings$1 = /* @__PURE__ */ JSON.parse(`{"themeDesc":"Customize the appearance of the application","languageDesc":"Select the display language","title":"Settings","general":{"title":"General","desc":"Manage your application settings.","theme":"Theme","light":"Light","dark":"Dark","system":"System","language":"Language","english":"English","chinese":"简体中文","saveThemeFailed":"Failed to save theme setting.","saveLanguageFailed":"Failed to save language setting.","groupAppearance":"Appearance","groupProject":"Project","autoWatchFiles":"Auto Watch Files","autoWatchFilesDesc":"Automatically watch project file changes","saveFileWatcherFailed":"Failed to save file watcher setting.","groupVoiceInput":"Voice Input","altDoublePress":"Double-press Alt","altDoublePressDesc":"Double-press Alt quickly while an input is focused to start or stop voice input.","saveVoiceInputFailed":"Failed to save voice input setting.","groupNetwork":"Network","proxy":"Network Proxy","proxyDesc":"Configure the network proxy used by Fello for Node requests, subprocesses and the UI.","proxyEdit":"Edit proxy settings","proxyOff":"Direct","proxySystem":"System","groupSound":"Sound","soundEnabled":"Sound Effects","soundEnabledDesc":"Play sound effects for notifications","soundVolume":"Volume","soundVolumeDesc":"Adjust notification volume","soundTheme":"Sound Style","soundThemeDesc":"Select the sound effect style","soundSoft":"Soft","soundCrisp":"Crisp","soundTest":"Test","soundTestDesc":"Preview the current sound effect","soundTestPlay":"Play","saveSoundFailed":"Failed to save sound setting.","groupEditor":"Editor","editor":"Open in Editor","editorDesc":"Choose the editor to open files","selectEditor":"Select editor","saveEditorFailed":"Failed to save editor setting."},"shortcuts":{"title":"Shortcuts","desc":"Customize keyboard shortcuts for common actions.","navigation":"Navigation","recording":"Press a shortcut","changeShortcut":"Change shortcut","unassigned":"Unassigned","delete":"Delete","set":"Set","restore":"Restore","setTitle":"Set shortcut","setDesc":"Press the shortcut you want to use.","cancel":"Cancel","confirm":"Confirm","reset":"Reset to default","conflict":"Already used by {{command}}.","saveFailed":"Failed to save shortcuts."},"agents":{"desc":"Manage agent configurations and startup commands.","description":"Configure agents","title":"Agents","guide":"User Guide","addStdioAgent":"Add via ACP Agent","addApiAgent":"Add via API Key","editStdioAgent":"Edit ACP Agent","editApiAgent":"Edit API Agent","dialogDesc":"Configure the agent ID, command, arguments and environment variables.","apiDialogDesc":"Configure provider, endpoint and authentication for API agent.","agentId":"Agent ID (Name)","apiProvider":"Provider","apiBaseUrl":"Base URL","apiKey":"API Key","apiHeaders":"Headers (JSON)","contextWindowTokens":"Context Window (tokens)","modelIdTemplate":"Model Id Template","models":"Models (one per line)","modelsHint":"Usually not needed — models are fetched automatically. Only specify if the API doesn't return the models you need","command":"Command","args":"Arguments","envVars":"Environment Variables (JSON)","envJson":"Environment Variables (JSON)","quickPreset":"Quick preset","cancel":"Cancel","save":"Save","edit":"Edit","delete":"Delete","dragToReorder":"Drag to reorder","noAgents":"No agents configured","errorIdCommand":"ID and Command are required.","errorDuplicateId":"An agent with this ID already exists.","errorEnvJson":"Env must be a valid JSON object.","errorContextWindowTokens":"Context Window must be a positive integer.","updateFailed":"Failed to update configuration.","confirmDeleteTitle":"Delete Agent","confirmDeleteDesc":"Are you sure you want to delete this agent? This action cannot be undone.","confirmDeleteDescWithSessions":"Are you sure you want to delete this agent? {{count}} session(s) will also be deleted. This action cannot be undone.","reset":"Reset Agent","resetSuccess":"Agent reset.","resetFailed":"Failed to reset agent.","deleteAllSessions":"Delete All Sessions","confirmDeleteAllSessionsTitle":"Delete All Sessions","confirmDeleteAllSessionsDesc":"All sessions for this agent will be permanently deleted. This action cannot be undone.","deleteAllSessionsSuccess":"{{count}} session(s) deleted.","deleteAllSessionsFailed":"Failed to delete sessions.","validation":{"enterId":"Please enter an agent ID.","idFormat":"Only letters, numbers, _ and - allowed.","selectProvider":"Please select a provider.","enterBaseUrl":"Please enter a base URL.","enterApiKey":"Please enter an API key.","enterCommand":"Please enter a command.","jsonObject":"Must be a valid JSON object with string values.","positiveInteger":"Must be a positive integer."}},"mcp":{"desc":"Manage MCP server configurations and startup commands.","description":"Configure MCP Servers","title":"MCP Servers","guide":"User Guide","addMcp":"Add MCP Server","addStdioMcp":"Add Stdio MCP","addHttpMcp":"Add HTTP MCP","addSseMcp":"Add SSE MCP","recommended":{"exa":{"name":"Exa","desc":"Exa MCP Server — AI Web Search"}},"editMcp":"Edit MCP Server","dialogDesc":"Configure the MCP server ID, command, arguments and environment variables.","mcpId":"MCP Server ID (Name)","command":"Command","args":"Arguments","envVars":"Environment Variables (JSON)","envJson":"Environment Variables (JSON)","url":"URL","headers":"Headers (JSON)","headersJson":"Headers (JSON)","httpDialogDesc":"Configure the MCP server ID, HTTP URL and request headers.","sseDialogDesc":"Configure the MCP server ID, SSE endpoint URL and request headers.","cancel":"Cancel","save":"Save","edit":"Edit","delete":"Delete","dragToReorder":"Drag to reorder","noMcpServers":"No MCP servers configured","errorIdRequired":"ID is required.","errorUrlRequired":"URL is required.","errorIdCommand":"ID and Command are required.","errorDuplicateId":"An MCP server with this ID already exists.","errorHeadersJson":"Headers must be a valid JSON object.","errorEnvJson":"Env must be a valid JSON object.","updateFailed":"Failed to update configuration.","confirmDeleteTitle":"Delete MCP Server","confirmDeleteDesc":"Are you sure you want to delete this MCP server? This action cannot be undone.","validation":{"enterId":"Please enter a server ID.","idFormat":"Only letters, numbers, _ and - allowed.","enterCommand":"Please enter a command.","enterUrl":"Please enter a URL.","jsonObject":"Must be a valid JSON object with string values."}},"webui":{"desc":"Configure remote access to the Fello interface.","title":"WebUI","guide":"User Guide","enable":"Enable WebUI","enableDesc":"Allow remote access to Fello interface via browser","accessUrl":"Access URL","accessDesc":"Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.","enableAccess":"Enable WebUI Access","port":"Port:","token":"Token:","autoGenerated":"Auto-generated","copy":"Copy","note":"Note: This URL contains a temporary token. The WebUI will be disabled when you restart the application.","updateFailed":"Failed to update configuration.","disabledInWebUI":"WebUI configuration is disabled when running inside the browser."},"ilink":{"title":"WeChat iLink","guide":"User Guide","description":"Connect Fello to WeChat via iLink Bot API. Once connected, a ClawBot contact will appear in your WeChat, allowing you to chat with your AI agent from anywhere.","connected":"Connected","notConnected":"Not Connected","notConnectedHint":"Scan QR code with WeChat to connect","login":"Login","loggingIn":"Waiting...","disconnect":"Disconnect","scanPrompt":"Scan with WeChat to login","qrcodeExpired":"QR code expired, please try again","scanned":"Scanned! Please confirm on your phone.","browserOpened":"QR code opened in browser. Scan with WeChat to login.","activeSession":"Active Session for WeChat","activeSessionHint":"Messages from WeChat will be routed to this session. Right-click a session in the sidebar to set it as active.","selectSession":"-- Select a session --","none":"-- None --","howItWorks":"How it works","step1":"Click \\"Login\\" to open the QR code in your browser","step2":"Scan the QR code with WeChat","step3":"A \\"ClawBot\\" contact appears in your WeChat","step4":"Chat with ClawBot — messages are routed to the active session above","step5":"Right-click any session in the sidebar to set it as active for WeChat","useOriginalImage":"Use Original Image","useOriginalImageDesc":"Send full-size images to the model (uses more tokens). When off, thumbnails are used.","keepaliveMaxCount":"Keepalive Messages","keepaliveMaxCountDesc":"Max consecutive keepalive messages while thinking.","commandsTitle":"WeChat \\"!\\" Commands","commandsDesc":"Messages starting with ! or ! are commands. They interrupt the current agent execution (cancelling an ongoing reply) and then run the corresponding action.","cmdSwitchSession":"Switch Session","cmdSwitchSessionDesc":"List all sessions (grouped by project); reply with a number to switch.","cmdNewSession":"New Session","cmdNewSessionDesc":"List all projects; reply with a number to create a session in that project and switch to it.","cmdSwitchModel":"Switch Model","cmdSwitchModelDesc":"List models available in the current session; reply with a number to switch (API agents only).","cmdSnippet":"Quick Snippet","cmdSnippetDesc":"List configured snippets; reply with a number to send that content to the agent.","cmdStatus":"View Status","cmdStatusDesc":"Show active session info (title, project, agent, features, MCP status)."},"snippets":{"title":"Snippets","desc":"Manage reusable text snippets for quick insertion.","description":"Configure Snippets","add":"Add Snippet","edit":"Edit Snippet","delete":"Delete","save":"Save","cancel":"Cancel","empty":"No snippets configured","saveFailed":"Failed to save snippets.","titleLabel":"Title","titlePlaceholder":"Title","contentLabel":"Content","contentPlaceholder":"Content","dialogDesc":"Configure the snippet title and content.","confirmDeleteTitle":"Delete Snippet","confirmDeleteDesc":"Are you sure you want to delete this snippet? This action cannot be undone.","validation":{"enterTitle":"Please enter a title.","enterContent":"Please enter content."}},"memory":{"title":"Memory","desc":"View and manage persistent project-level memory.","projectMemories":"Project Memories","refresh":"Refresh","clear":"Clear","cleared":"Memory cleared.","clearFailed":"Failed to clear memory.","delete":"Delete","deleted":"Memory entry deleted.","deleteFailed":"Failed to delete memory entry.","confirmDeleteTitle":"Delete Memory Entry","confirmDeleteDesc":"Are you sure you want to delete this memory entry? This cannot be undone.","confirmClearTitle":"Clear Memory","confirmClearDesc":"Are you sure you want to clear all memory for project \\"{{title}}\\"? This cannot be undone.","revealInFinder":"Reveal in Finder","revealFailed":"Failed to reveal file.","noFile":"No memory file found.","noProjects":"No projects found.","empty":"No memories stored.","entries":"Entries"},"imageGeneration":{"title":"Image Generation","desc":"Configure image generation providers. The active provider will be available as a tool for agents.","providers":"Providers","add":"Add Provider","addProvider":"Add Provider","editProvider":"Edit Provider","dialogDesc":"Configure provider, endpoint and authentication for image generation.","edit":"Edit","delete":"Delete","empty":"No image generation providers configured","updateFailed":"Failed to update configuration.","confirmDeleteTitle":"Delete Provider","confirmDeleteDesc":"Are you sure you want to delete this image generation provider?","cancel":"Cancel","save":"Save","form":{"name":"Name","provider":"Provider","baseUrl":"Base URL","baseUrlHint":"Request → {baseUrl}/images/generations","apiKey":"API Key","headers":"Headers (JSON)","extraBody":"Extra Body (JSON)","extraBodyHint":"Additional parameters merged into request body (e.g. quality, style).","model":"Model"},"validation":{"enterName":"Please enter a name.","selectProvider":"Please select a provider.","enterBaseUrl":"Please enter a base URL.","enterApiKey":"Please enter an API key.","enterModel":"Please enter the model name.","jsonObject":"Must be a valid JSON object with string values."}},"speechToText":{"title":"Speech to Text","desc":"Configure realtime speech recognition providers for chat voice input.","guide":"User Guide","providers":"Providers","add":"Add Provider","addProvider":"Add Provider","editProvider":"Edit Provider","dialogDesc":"Configure a realtime speech-to-text provider for voice input.","edit":"Edit","delete":"Delete","empty":"No speech-to-text providers configured","updateFailed":"Failed to update configuration.","confirmDeleteTitle":"Delete Provider","confirmDeleteDesc":"Delete this speech provider?","cancel":"Cancel","save":"Save","validation":{"enterName":"Please enter a name.","selectProvider":"Please select a provider.","enterApiKey":"Please enter an API key.","enterAppId":"Please enter an App ID.","enterApiSecret":"Please enter an API secret."},"form":{"name":"Name","provider":"Provider","appId":"App ID","apiKey":"API Key","apiSecret":"API Secret","optional":" (optional)","language":"Language (optional)"}},"proxy":{"title":"Network Proxy","mode":"Proxy Mode","off":"Direct","offDesc":"Connect directly without a proxy","manual":"Manual","manualDesc":"Specify a proxy server manually for all network requests","system":"System","systemDesc":"Use the system proxy settings (macOS/Windows or environment variables)","httpProxy":"HTTP Proxy","httpProxyPlaceholder":"e.g. http://127.0.0.1:7890","httpsProxy":"HTTPS Proxy (optional)","httpsProxyHint":"Falls back to the HTTP proxy when empty.","noProxy":"No Proxy (optional)","noProxyPlaceholder":"e.g. localhost,127.0.0.1,*.internal","username":"Username (optional)","password":"Password (optional)","cancel":"Cancel","save":"Save","later":"Later","restartNow":"Restart Now","restartTitle":"Restart Required","restartDesc":"Proxy settings saved. Restart Fello to apply the new proxy configuration.","restartManualDesc":"Proxy settings saved. Please manually restart the Fello server process to apply the new configuration.","saveFailed":"Failed to save proxy settings.","validation":{"httpProxyRequired":"HTTP proxy URL is required in manual mode.","invalidProxyUrl":"{{field}} should start with http:// or https://, or use a host:port address (e.g. 127.0.0.1:7890)."}}}`);
|
|
16892
16899
|
const chat$1 = { "failedToLoadSession": "Failed to load session.", "failedToUpdateMcpServers": "Failed to update MCP servers." };
|
|
16893
16900
|
const tokenUsage$1 = { "title": "Token Usage Breakdown", "loading": "Loading…", "noData": "No token breakdown data available", "promptCount": "{{count}} prompts", "promptLabel": "Prompt #{{count}}", "noBreakdown": "No detailed breakdown available for this prompt", "input": "Input", "output": "Output", "inputShort": "in", "outputShort": "out", "totalTokens": "Total", "thought": "Thought", "cacheRead": "Cache Read", "cacheWrite": "Cache Write", "cached": "Cached", "tokens": "tokens", "token": "token", "sessionTotal": "Session Total", "systemPrompt": "System Prompt", "tools": "Tools", "history": "History", "userMessage": "User Message", "inputComposition": "Input Composition", "delta": "Estimation delta", "toolsDefinition": "Tools Definition", "toolsCount": "{{count}} tools · {{tokens}} tokens", "more": "+{{count}} more", "steps": "Steps", "stepsCount": "{{count}} steps", "toolCalls": "tool calls", "noCache": "No Cache", "text": "Text", "stepTime": "Step Time", "responseTime": "Response Time", "arguments": "Arguments", "result": "Result", "execution": "Execution", "performance": "Performance", "totalTime": "Total Time", "outputSpeed": "Output Speed", "tokensPerSecond": "token/s", "firstToken": "First Token" };
|
|
16894
16901
|
const planBubble$1 = { "title": "Plan", "summary": "{{completed}} / {{total}} completed", "status": { "pending": "Pending", "inProgress": "In progress", "completed": "Completed" }, "priority": { "high": "High", "medium": "Medium", "low": "Low" } };
|
|
16895
16902
|
const constant$1 = { "feature": { "title": "Features", "askUser": "Ask Me", "skills": "Skills", "shareToUser": "Share to User", "search": "Search", "memory": "Memory", "imageGeneration": "Image Generation" } };
|
|
16896
|
-
const chatHeader$1 = { "sessionId": "Session", "openSessionFolder": "Open Session Folder", "refresh": "Restart Session", "closeSession": "Close Session", "closingSession": "Closing…", "failedToCloseSession": "Failed to close session.", "contextWindow": "Context Window", "used": "Used", "size": "Size", "percentUsed": "{{pct}}% used", "remaining": "{{count}} remaining", "lastTurn": "Last Turn", "input": "Input", "output": "Output", "total": "Total", "thought": "Thought", "cacheRead": "Cache read", "cacheWrite": "Cache write", "cost": "Cost", "viewBreakdown": "View Breakdown" };
|
|
16897
|
-
const chatInput$1 = { "placeholderDisabled": "Start a new chat to begin...", "placeholderActive": "Ask anything... (Enter to send)", "mode": "Mode", "suggestions": "Suggestions", "messageInput": "Message input", "stop": "Stop", "send": "Send", "tokensUsage": "In: {{input}} Out: {{output}} Total: {{total}}{{thoughtStr}}", "tokensTotal": "{{total}}k tokens", "generationFailed": "Generation failed.", "attach": "Attach file", "reference": "Reference", "mention": "Mention", "snippets": "Snippets", "snippetsEmpty": "No snippets. Click to add in Settings.", "selectModel": "Select model", "stopReasonMaxTokens": "Reached maximum token limit", "stopReasonMaxTurnRequests": "Reached maximum turn limit", "stopReasonRefusal": "Model refused to respond", "stopReasonCancelled": "Generation was cancelled" };
|
|
16898
|
-
const filePanel$1 = { "title": "Files", "emptyDirectory": "Empty directory", "newFile": "New File", "newFolder": "New Folder", "rename": "Rename", "copyPath": "Copy Path", "copyRelativePath": "Copy Relative Path", "revealInFinder": "Reveal in Finder", "openInEditor": "Open in {{editor}}", "delete": "Delete", "deleteConfirmSingle": 'How would you like to delete "{{name}}"?', "deleteConfirmMultiple": "How would you like to delete {{count}} items?", "dragItems": "{{count}} items", "cancel": "Cancel", "moveToTrash": "Move to Trash", "moveToRecycleBin": "Move to Recycle Bin", "moveConfirmTitle": "Move", "moveConfirmSingle": 'Move "{{name}}" to "{{dest}}"?', "moveConfirmMultiple": 'Move {{count}} items to "{{dest}}"?', "moveConfirmSingleToRoot": 'Move "{{name}}" to the root directory?', "moveConfirmMultipleToRoot": "Move {{count}} items to the root directory?", "loading": "Loading...", "collapseFolders": "Collapse Folders", "refresh": "Refresh", "addToChat": "Add to Chat", "noProject": "No project selected" };
|
|
16903
|
+
const chatHeader$1 = { "sessionId": "Session", "openSessionFolder": "Open Session Folder", "projectId": "Project", "openProjectFolder": "Open Project Folder", "refresh": "Restart Session", "closeSession": "Close Session", "closingSession": "Closing…", "failedToCloseSession": "Failed to close session.", "sessionOperationInProgress": "Another session operation is already in progress.", "contextWindow": "Context Window", "used": "Used", "size": "Size", "percentUsed": "{{pct}}% used", "remaining": "{{count}} remaining", "lastTurn": "Last Turn", "input": "Input", "output": "Output", "total": "Total", "thought": "Thought", "cacheRead": "Cache read", "cacheWrite": "Cache write", "cost": "Cost", "viewBreakdown": "View Breakdown" };
|
|
16904
|
+
const chatInput$1 = { "placeholderDisabled": "Start a new chat to begin...", "placeholderActive": "Ask anything... (Enter to send)", "mode": "Mode", "suggestions": "Suggestions", "messageInput": "Message input", "stop": "Stop", "send": "Send", "tokensUsage": "In: {{input}} Out: {{output}} Total: {{total}}{{thoughtStr}}", "tokensTotal": "{{total}}k tokens", "generationFailed": "Generation failed.", "attach": "Attach file", "reference": "Reference", "mention": "Mention", "snippets": "Snippets", "snippetsEmpty": "No snippets. Click to add in Settings.", "selectModel": "Select model", "stopReasonMaxTokens": "Reached maximum token limit", "stopReasonMaxTurnRequests": "Reached maximum turn limit", "stopReasonRefusal": "Model refused to respond", "stopReasonCancelled": "Generation was cancelled", "voiceInput": "Voice input", "selectVoiceInputDevice": "Select microphone", "stopVoiceInput": "Stop voice input", "startingVoiceInput": "Starting voice input", "voiceInputNotConfigured": "Configure voice input in Settings", "noAudioInputDevices": "No audio input devices found" };
|
|
16905
|
+
const filePanel$1 = { "title": "Files", "view": "View", "emptyDirectory": "Empty directory", "newFile": "New File", "newFolder": "New Folder", "rename": "Rename", "copyPath": "Copy Path", "copyRelativePath": "Copy Relative Path", "revealInFinder": "Reveal in Finder", "openInEditor": "Open in {{editor}}", "delete": "Delete", "deleteConfirmSingle": 'How would you like to delete "{{name}}"?', "deleteConfirmMultiple": "How would you like to delete {{count}} items?", "dragItems": "{{count}} items", "cancel": "Cancel", "moveToTrash": "Move to Trash", "moveToRecycleBin": "Move to Recycle Bin", "moveConfirmTitle": "Move", "moveConfirmSingle": 'Move "{{name}}" to "{{dest}}"?', "moveConfirmMultiple": 'Move {{count}} items to "{{dest}}"?', "moveConfirmSingleToRoot": 'Move "{{name}}" to the root directory?', "moveConfirmMultipleToRoot": "Move {{count}} items to the root directory?", "loading": "Loading...", "collapseFolders": "Collapse Folders", "refresh": "Refresh", "addToChat": "Add to Chat", "noProject": "No project selected" };
|
|
16899
16906
|
const toolBubble$1 = { "tool": "Tool", "stop": "Stop", "stopping": "Stopping…", "result": "Result", "terminal": "Terminal" };
|
|
16900
16907
|
const imageView$1 = { "fallbackAlt": "Image" };
|
|
16901
16908
|
const readonlyTerminal$1 = { "noOutput": "No output" };
|
|
@@ -16908,7 +16915,7 @@ const chatTimeline$1 = { "userMessageIndex": "User message {{index}}", "jumpToUs
|
|
|
16908
16915
|
const thinkingBubble$1 = { "thinking": "Thinking...", "thought": "Thought" };
|
|
16909
16916
|
const userBubble$1 = { "copy": "Copy", "locate": "Locate" };
|
|
16910
16917
|
const session$1 = { "usageSummary": "{{total}} tk ( ↓ {{input}} ↑ {{output}}{{cachedPart}} )", "usageSummaryCached": " ↻ {{cached}}", "connecting": "Connecting to agent...", "connectionFailed": "Failed to connect to agent", "retry": "Retry" };
|
|
16911
|
-
const terminalPanel$1 = { "title": "Terminal", "noTerminalSelected": "No terminal selected", "addTerminal": "Add terminal" };
|
|
16918
|
+
const terminalPanel$1 = { "title": "Terminal", "noTerminalSelected": "No terminal selected", "addTerminal": "Add terminal", "view": "View", "delete": "Delete terminal" };
|
|
16912
16919
|
const permission$1 = { "title": "Permission Required", "error": "Failed to respond to permission request" };
|
|
16913
16920
|
const errorBoundary$1 = { "title": "Something went wrong", "defaultMessage": "An unexpected error occurred in the application.", "reload": "Reload Application" };
|
|
16914
16921
|
const panel$1 = { "files": "Files", "terminal": "Terminal", "noProjectSelected": "No project selected" };
|
|
@@ -16925,6 +16932,7 @@ const en = {
|
|
|
16925
16932
|
sidebar: sidebar$1,
|
|
16926
16933
|
skills: skills$1,
|
|
16927
16934
|
contextMenu: contextMenu$1,
|
|
16935
|
+
commands: commands$1,
|
|
16928
16936
|
settings: settings$1,
|
|
16929
16937
|
chat: chat$1,
|
|
16930
16938
|
tokenUsage: tokenUsage$1,
|
|
@@ -16959,17 +16967,18 @@ const en = {
|
|
|
16959
16967
|
imageGeneration: imageGeneration$1,
|
|
16960
16968
|
automation: automation$1
|
|
16961
16969
|
};
|
|
16962
|
-
const sidebar = { "welcome": "欢迎使用", "skills": "技能", "automation": "自动化", "projects": "项目", "noProjects": "暂无项目", "noProjectsHint": "添加一个项目文件夹开始", "addProject": "添加项目", "noAgentsHint": "请先配置 Agent", "configureAgent": "配置 Agent", "revealInFinder": "在访达中显示", "rename": "重命名", "delete": "删除", "renameProject": "重命名项目", "
|
|
16970
|
+
const sidebar = { "welcome": "欢迎使用", "skills": "技能", "automation": "自动化", "projects": "项目", "noProjects": "暂无项目", "noProjectsHint": "添加一个项目文件夹开始", "addProject": "添加项目", "noAgentsHint": "请先配置 Agent", "configureAgent": "配置 Agent", "revealInFinder": "在访达中显示", "rename": "重命名", "delete": "删除", "renameProject": "重命名项目", "renameSession": "重命名会话", "deleteSession": "删除会话", "enterNewProjectName": "请输入新的项目名称。", "enterNewSessionName": "请输入新的会话名称。", "addProjectTitle": "添加项目", "enterProjectPath": "请输入服务器上的项目绝对路径:", "pathCannotBeEmpty": "路径不能为空", "webuiEnabled": "已启用 WebUI", "deleteProject": "删除项目", "deleteProjectConfirm": "是否删除项目“{{title}}”及其所有会话?\n此操作无法撤销。", "deleteSessionConfirm": "是否删除会话“{{title}}”?\n此操作无法撤销。", "cancel": "取消", "save": "保存", "settings": "设置", "agents": "智能体", "addProjectFailed": "添加项目失败。", "newSessionFailed": "创建新会话失败。", "loadSessionFailed": "加载会话失败。", "revealInFinderFailed": "在访达中显示失败。", "openInEditorFailed": "在编辑器中打开失败。", "projectExists": "项目已存在。", "projectNameEmpty": "项目名称不能为空。", "sessionNameEmpty": "会话名称不能为空。", "newSession": "新会话", "viewSession": "查看会话", "projectActions": "项目操作:{{title}}", "createSessionInProject": "在 {{title}} 中创建会话", "sessionActions": "会话操作:{{title}}", "ilinkSetActive": "设为微信活跃会话", "ilinkUnsetActive": "取消微信活跃", "failedToUpdateIlinkSession": "更新微信活跃会话失败。", "sessionOperationInProgress": "已有其他会话操作正在进行中。", "ilinkActiveStatus": "微信活跃", "ilinkInactiveStatus": "非微信活跃", "restartSession": "重启会话", "closeSession": "关闭会话", "closingSession": "关闭中…", "failedToCloseSession": "关闭会话失败。", "failedToDeleteSession": "删除会话失败。", "failedToDeleteProject": "删除项目失败。", "failedToLoadSession": "加载会话失败。", "failedToUpdateMcpServers": "更新 MCP 服务器失败。", "collapse": "收起侧边栏", "expand": "展开侧边栏", "updated": "更新于", "created": "创建于", "sessionCount": "{{count}} 个会话", "newSessionDialog": { "title": "新建会话", "agent": "智能体", "selectAgent": "选择智能体", "mcp": "MCP", "noMcp": "未配置 MCP 服务器", "permission": "权限", "permissionAsk": "每次询问", "permissionAllowAll": "全部允许", "create": "创建" } };
|
|
16963
16971
|
const skills = { "title": "技能", "installed": { "label": "已安装", "noDescription": "暂无描述。", "revealInFinder": "在访达中显示", "viewSkill": "查看 SKILL.md", "uninstall": "卸载", "uninstallTitle": "卸载技能", "uninstallConfirm": "确定要卸载 {{name}} 吗?", "cancel": "取消", "uninstalledSuccess": "技能 {{name}} 已卸载", "uninstallFailed": "卸载失败:{{message}}", "revealFailed": "在访达中显示失败:{{message}}", "loadFailed": "加载技能失败", "loadContentFailed": "加载技能内容出错:{{message}}", "noSkills": "暂无安装的技能" }, "skillsSh": { "label": "skills.sh", "title": "探索技能", "desc": "浏览并安装社区提供的技能,以增强你的 Agent 能力。", "searchPlaceholder": "搜索技能(例如:pr-review, react-best-practices)...", "install": "安装", "installSuccess": "技能 {{name}} 已安装", "installFailed": "安装失败", "noResults": "未找到相关技能", "installs": "{{count}} 次安装", "installedStatus": "已安装", "authorPrefix": "作者: " } };
|
|
16964
16972
|
const contextMenu = { "cut": "剪切", "copy": "复制", "paste": "粘贴", "selectAll": "全选" };
|
|
16965
|
-
const
|
|
16973
|
+
const commands = { "focusChatInput": { "title": "聚焦聊天输入框", "description": "将焦点移动到聊天输入框。" }, "focusChatArea": { "title": "聚焦聊天区域", "description": "将焦点移动到聊天内容区域。" }, "focusFileTree": { "title": "聚焦文件树", "description": "将焦点移动到项目文件树。" }, "focusTerminalList": { "title": "聚焦终端列表", "description": "将焦点移动到终端列表。" }, "focusSidebarSessions": { "title": "聚焦会话列表", "description": "将焦点移动到会话列表。" } };
|
|
16974
|
+
const settings = { "themeDesc": "自定义应用的外观", "languageDesc": "选择应用显示的语言", "title": "设置", "general": { "title": "通用", "desc": "管理应用设置。", "theme": "主题", "light": "浅色", "dark": "深色", "system": "跟随系统", "language": "语言", "english": "English", "chinese": "简体中文", "saveThemeFailed": "保存主题设置失败。", "saveLanguageFailed": "保存语言设置失败。", "groupAppearance": "外观", "groupProject": "项目", "autoWatchFiles": "自动监听文件", "autoWatchFilesDesc": "自动监听项目文件变更", "saveFileWatcherFailed": "保存文件监听设置失败。", "groupVoiceInput": "语音输入", "altDoublePress": "双击 Alt 快捷键", "altDoublePressDesc": "输入框聚焦时快速双击 Alt,开始或停止语音输入。", "saveVoiceInputFailed": "保存语音输入设置失败。", "groupNetwork": "网络", "proxy": "网络代理", "proxyDesc": "配置 Fello 的网络代理,应用于 Node 请求、子进程与界面。", "proxyEdit": "修改代理设置", "proxyOff": "直连", "proxySystem": "跟随系统", "groupSound": "音效", "soundEnabled": "音效", "soundEnabledDesc": "播放通知音效", "soundVolume": "音量", "soundVolumeDesc": "调整通知音量", "soundTheme": "音效风格", "soundThemeDesc": "选择音效风格", "soundSoft": "柔和", "soundCrisp": "清脆", "soundTest": "试听", "soundTestDesc": "预览当前音效效果", "soundTestPlay": "播放", "saveSoundFailed": "保存音效设置失败。", "groupEditor": "编辑器", "editor": "使用编辑器打开", "editorDesc": "选择用于打开文件的编辑器", "selectEditor": "选择编辑器", "saveEditorFailed": "保存编辑器设置失败。" }, "shortcuts": { "title": "快捷键", "desc": "自定义常用操作的键盘快捷键。", "navigation": "导航", "recording": "请按下快捷键", "changeShortcut": "修改快捷键", "unassigned": "未设置", "delete": "删除", "set": "设置", "restore": "还原", "setTitle": "设置快捷键", "setDesc": "请按下要使用的快捷键。", "cancel": "取消", "confirm": "确认", "reset": "恢复默认", "conflict": "已被 {{command}} 使用。", "saveFailed": "保存快捷键失败。" }, "agents": { "desc": "管理智能体的配置和启动命令。", "description": "配置智能体", "title": "智能体", "guide": "使用手册", "addStdioAgent": "通过 ACP Agent 添加", "addApiAgent": "通过 API Key 添加", "editStdioAgent": "编辑 ACP Agent", "editApiAgent": "编辑 API Agent", "dialogDesc": "配置智能体 ID、命令、参数和环境变量。", "apiDialogDesc": "配置 API 智能体的提供商、端点和认证信息。", "agentId": "智能体 ID (名称)", "apiProvider": "提供商", "apiBaseUrl": "Base URL", "apiKey": "API Key", "apiHeaders": "请求头 (JSON)", "contextWindowTokens": "上下文窗口 (token)", "modelIdTemplate": "Model Id 模版", "models": "模型列表 (每行一个)", "modelsHint": "通常无需填写,会自动获取。仅在接口未返回所需模型时手动指定", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "quickPreset": "快速预设", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noAgents": "未配置任何智能体", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的智能体。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "errorContextWindowTokens": "上下文窗口必须为正整数。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除智能体", "confirmDeleteDesc": "确定要删除此智能体吗?此操作无法撤销。", "confirmDeleteDescWithSessions": "确定要删除此智能体吗?{{count}} 个会话也将被同时删除。此操作无法撤销。", "reset": "重置智能体", "resetSuccess": "智能体已重置。", "resetFailed": "重置智能体失败。", "deleteAllSessions": "删除所有会话", "confirmDeleteAllSessionsTitle": "删除所有会话", "confirmDeleteAllSessionsDesc": "此智能体的所有会话将被永久删除。此操作无法撤销。", "deleteAllSessionsSuccess": "已删除 {{count}} 个会话。", "deleteAllSessionsFailed": "删除会话失败。", "validation": { "enterId": "请输入智能体 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "selectProvider": "请选择提供商。", "enterBaseUrl": "请输入 Base URL。", "enterApiKey": "请输入 API Key。", "enterCommand": "请输入命令。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。", "positiveInteger": "必须为正整数。" } }, "mcp": { "desc": "管理 MCP 服务器的配置和启动命令。", "description": "配置 MCP 服务器", "title": "MCP 服务器", "guide": "使用手册", "addMcp": "添加 MCP 服务器", "addStdioMcp": "添加 Stdio MCP", "addHttpMcp": "添加 HTTP MCP", "addSseMcp": "添加 SSE MCP", "recommended": { "exa": { "name": "Exa", "desc": "Exa MCP 服务器 — AI 网络搜索" } }, "editMcp": "编辑 MCP 服务器", "dialogDesc": "配置 MCP 服务器 ID、命令、参数和环境变量。", "mcpId": "MCP 服务器 ID (名称)", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "url": "URL", "headers": "请求头 (JSON)", "headersJson": "请求头 (JSON)", "httpDialogDesc": "配置 MCP 服务器 ID、HTTP URL 和请求头。", "sseDialogDesc": "配置 MCP 服务器 ID、SSE 端点 URL 和请求头。", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noMcpServers": "未配置任何 MCP 服务器", "errorIdRequired": "ID 不能为空。", "errorUrlRequired": "URL 不能为空。", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的 MCP 服务器。", "errorHeadersJson": "请求头必须是有效的 JSON 对象。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除 MCP 服务器", "confirmDeleteDesc": "确定要删除此 MCP 服务器吗?此操作无法撤销。", "validation": { "enterId": "请输入服务器 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "enterCommand": "请输入命令。", "enterUrl": "请输入 URL。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。" } }, "webui": { "desc": "配置对 Fello 界面的远程访问。", "title": "WebUI", "guide": "使用手册", "enable": "启用 WebUI", "enableDesc": "允许通过浏览器远程访问 Fello 界面", "enableAccess": "启用 WebUI 访问", "port": "端口:", "token": "Token:", "autoGenerated": "自动生成", "accessUrl": "访问地址", "accessDesc": "注意:此地址包含临时访问令牌,应用重启后将失效。", "copy": "复制", "note": "注意:此地址包含临时访问令牌,应用重启后将失效。", "updateFailed": "更新配置失败。", "disabledInWebUI": "WebUI 配置在浏览器中不可用。" }, "ilink": { "title": "微信 iLink", "guide": "使用手册", "description": "通过 iLink Bot API 将 Fello 接入微信。连接后,微信中会出现一个 ClawBot 联系人,你可以随时随地与 AI 智能体对话。", "connected": "已连接", "notConnected": "未连接", "notConnectedHint": "使用微信扫描二维码连接", "login": "登录", "loggingIn": "等待扫码...", "disconnect": "断开连接", "scanPrompt": "使用微信扫描二维码登录", "qrcodeExpired": "二维码已过期,请重新获取", "scanned": "已扫码!请在手机上确认登录。", "browserOpened": "二维码已在浏览器中打开,请使用微信扫码登录。", "activeSession": "微信活跃会话", "activeSessionHint": "微信消息将路由到此会话。可在侧边栏右键会话设为活跃。", "selectSession": "-- 选择一个会话 --", "none": "-- 无 --", "howItWorks": "使用说明", "step1": "点击「登录」在浏览器中打开二维码。", "step2": "使用微信扫描二维码。", "step3": "微信中出现「ClawBot」联系人。", "step4": "与 ClawBot 聊天 — 消息将路由到上方选择的活跃会话。", "step5": "在侧边栏右键任意会话即可设为微信活跃会话。", "useOriginalImage": "使用原图", "useOriginalImageDesc": "向模型发送原始大小的图片(消耗更多 token)。关闭时使用缩略图。", "keepaliveMaxCount": "保活消息", "keepaliveMaxCountDesc": "AI 思考时最大连续保活消息数。", "commandsTitle": "微信 ! 命令", "commandsDesc": "在微信中发送以 ! 或 ! 开头的消息即为命令。命令会中断当前 Agent 执行(如正在生成回复则立即取消),然后执行对应操作。", "cmdSwitchSession": "切换会话", "cmdSwitchSessionDesc": "列出所有会话(按项目分组),回复序号切换到对应会话。", "cmdNewSession": "新建会话", "cmdNewSessionDesc": "列出所有项目,回复序号在该项目下创建新会话并自动切换。", "cmdSwitchModel": "切换模型", "cmdSwitchModelDesc": "列出当前会话可用的模型,回复序号切换(仅 API Agent 支持)。", "cmdSnippet": "快捷短语", "cmdSnippetDesc": "列出已配置的 Snippets,回复序号将对应内容发送给 Agent。", "cmdStatus": "查看状态", "cmdStatusDesc": "显示当前活跃会话信息(标题、项目、Agent、Features、MCP 状态)。" }, "snippets": { "title": "快捷短语", "desc": "管理可复用的文本片段,快速插入到对话中。", "description": "配置快捷短语", "add": "添加短语", "edit": "编辑短语", "delete": "删除", "save": "保存", "cancel": "取消", "empty": "暂无快捷短语", "saveFailed": "保存快捷短语失败。", "titleLabel": "标题", "titlePlaceholder": "标题", "contentLabel": "内容", "contentPlaceholder": "内容", "dialogDesc": "配置短语的标题和内容。", "confirmDeleteTitle": "删除短语", "confirmDeleteDesc": "确定要删除此短语吗?此操作无法撤销。", "validation": { "enterTitle": "请输入标题。", "enterContent": "请输入内容。" } }, "memory": { "title": "记忆", "desc": "查看和管理项目级持久化记忆。", "projectMemories": "项目记忆", "refresh": "刷新", "clear": "清除", "cleared": "记忆已清除。", "clearFailed": "清除记忆失败。", "delete": "删除", "deleted": "记忆条目已删除。", "deleteFailed": "删除记忆条目失败。", "confirmDeleteTitle": "删除记忆条目", "confirmDeleteDesc": "确定要删除此记忆条目吗?此操作不可撤销。", "confirmClearTitle": "清除记忆", "confirmClearDesc": '确定要清除项目 "{{title}}" 的所有记忆吗?此操作不可撤销。', "revealInFinder": "在访达中显示", "revealFailed": "显示文件失败。", "noFile": "未找到记忆文件。", "noProjects": "未找到项目。", "empty": "暂无记忆。", "entries": "条目" }, "imageGeneration": { "title": "图片生成", "desc": "配置图片生成服务提供商。激活的提供商将作为工具供 Agent 使用。", "providers": "提供商", "add": "添加提供商", "addProvider": "添加提供商", "editProvider": "编辑提供商", "dialogDesc": "配置图片生成的提供商、端点和认证信息。", "edit": "编辑", "delete": "删除", "empty": "尚未配置图片生成提供商", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除提供商", "confirmDeleteDesc": "确定要删除此图片生成提供商吗?", "cancel": "取消", "save": "保存", "form": { "name": "名称", "provider": "提供商", "baseUrl": "Base URL", "baseUrlHint": "请求将发送至 {baseUrl}/images/generations", "apiKey": "API Key", "headers": "请求头 (JSON)", "extraBody": "额外参数 (JSON)", "extraBodyHint": "合并到请求体中的额外参数(如 quality、style 等厂商特有参数)。", "model": "模型" }, "validation": { "enterName": "请输入名称。", "selectProvider": "请选择提供商。", "enterBaseUrl": "请输入 Base URL。", "enterApiKey": "请输入 API Key。", "enterModel": "请输入模型名称。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。" } }, "speechToText": { "title": "语音识别", "desc": "配置聊天输入框使用的实时语音识别服务商。", "guide": "使用手册", "providers": "服务商", "add": "添加服务商", "addProvider": "添加服务商", "editProvider": "编辑服务商", "dialogDesc": "配置实时语音输入的服务商和认证信息。", "edit": "编辑", "delete": "删除", "empty": "尚未配置语音识别服务商", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除服务商", "confirmDeleteDesc": "确定删除这个语音识别服务商吗?", "cancel": "取消", "save": "保存", "validation": { "enterName": "请输入名称。", "selectProvider": "请选择服务商。", "enterApiKey": "请输入 API Key。", "enterAppId": "请输入 App ID。", "enterApiSecret": "请输入 API Secret。" }, "form": { "name": "名称", "provider": "服务商", "appId": "App ID", "apiKey": "API Key", "apiSecret": "API Secret", "optional": "(可选)", "language": "语言(可选)" } }, "proxy": { "title": "网络代理", "mode": "代理模式", "off": "直连", "offDesc": "不使用代理,直接连接", "manual": "手动", "manualDesc": "手动指定代理服务器,所有网络请求走代理", "system": "跟随系统", "systemDesc": "使用系统代理设置(macOS/Windows 或环境变量)", "httpProxy": "HTTP 代理", "httpProxyPlaceholder": "例如 http://127.0.0.1:7890", "httpsProxy": "HTTPS 代理(可选)", "httpsProxyHint": "留空时回退到 HTTP 代理。", "noProxy": "不使用代理(可选)", "noProxyPlaceholder": "例如 localhost,127.0.0.1,*.internal", "username": "用户名(可选)", "password": "密码(可选)", "cancel": "取消", "save": "保存", "later": "稍后", "restartNow": "立即重启", "restartTitle": "需要重启", "restartDesc": "代理设置已保存,重启 Fello 后新的代理配置才会生效。", "restartManualDesc": "代理设置已保存,请手动重启 Fello 服务端进程后生效。", "saveFailed": "保存代理设置失败。", "validation": { "httpProxyRequired": "手动模式下必须填写 HTTP 代理地址。", "invalidProxyUrl": "{{field}} 应以 http:// 或 https:// 开头,或使用 host:port 形式(例如 127.0.0.1:7890)。" } } };
|
|
16966
16975
|
const chat = { "failedToLoadSession": "加载会话失败。", "failedToUpdateMcpServers": "更新 MCP 服务器失败。" };
|
|
16967
16976
|
const tokenUsage = { "title": "Token 使用明细", "loading": "加载中…", "noData": "暂无 Token 使用明细", "promptCount": "{{count}} 轮对话", "promptLabel": "第 {{count}} 轮对话", "noBreakdown": "此提示词没有详细的 Token 明细", "input": "输入", "output": "输出", "inputShort": "输入", "outputShort": "输出", "totalTokens": "总计", "thought": "思考", "cacheRead": "缓存读取", "cacheWrite": "缓存写入", "cached": "缓存", "tokens": "Token", "token": "Token", "sessionTotal": "会话总计", "systemPrompt": "系统提示词", "tools": "工具", "history": "历史消息", "userMessage": "用户消息", "inputComposition": "输入组成", "delta": "估算差值", "toolsDefinition": "工具定义", "toolsCount": "{{count}} 个工具 · {{tokens}} tokens", "more": "+{{count}} 项", "steps": "步骤", "stepsCount": "{{count}} 步", "toolCalls": "工具调用", "noCache": "未缓存", "text": "文本", "stepTime": "步骤耗时", "responseTime": "响应耗时", "arguments": "参数", "result": "结果", "execution": "执行耗时", "performance": "性能", "totalTime": "总耗时", "outputSpeed": "输出速度", "tokensPerSecond": "Token/s", "firstToken": "首个 Token" };
|
|
16968
16977
|
const planBubble = { "title": "计划", "summary": "已完成 {{completed}} / {{total}}", "status": { "pending": "等待中", "inProgress": "进行中", "completed": "已完成" }, "priority": { "high": "高优先级", "medium": "中优先级", "low": "低优先级" } };
|
|
16969
16978
|
const constant = { "feature": { "title": "功能", "askUser": "向我提问", "skills": "技能", "shareToUser": "分享给用户", "search": "项目检索", "memory": "记忆", "imageGeneration": "图片生成" } };
|
|
16970
|
-
const chatHeader = { "sessionId": "会话编号", "openSessionFolder": "打开会话文件夹", "refresh": "重启会话", "closeSession": "关闭会话", "closingSession": "关闭中…", "failedToCloseSession": "关闭会话失败。", "contextWindow": "上下文窗口", "used": "已用", "size": "上限", "percentUsed": "已用 {{pct}}%", "remaining": "剩余 {{count}}", "lastTurn": "上一轮", "input": "输入", "output": "输出", "total": "总计", "thought": "思考", "cacheRead": "缓存读取", "cacheWrite": "缓存写入", "cost": "费用", "viewBreakdown": "查看明细" };
|
|
16971
|
-
const chatInput = { "placeholderDisabled": "请先开启新的会话...", "placeholderActive": "有任何问题请问我... (回车发送)", "mode": "模式", "suggestions": "建议", "messageInput": "消息输入", "stop": "停止", "send": "发送", "tokensUsage": "输入: {{input}} 输出: {{output}} 总计: {{total}}{{thoughtStr}}", "tokensTotal": "{{total}}k tokens", "generationFailed": "生成失败。", "attach": "附加文件", "reference": "引用", "mention": "应用", "snippets": "快捷短语", "snippetsEmpty": "暂无短语,点击前往设置添加。", "selectModel": "选择模型", "stopReasonMaxTokens": "已达到最大 token 限制", "stopReasonMaxTurnRequests": "已达到最大轮次限制", "stopReasonRefusal": "模型拒绝回答", "stopReasonCancelled": "生成已取消" };
|
|
16972
|
-
const filePanel = { "title": "文件", "emptyDirectory": "空目录", "newFile": "新建文件", "newFolder": "新建文件夹", "rename": "重命名", "copyPath": "复制路径", "copyRelativePath": "复制相对路径", "revealInFinder": "在访达中显示", "openInEditor": "使用 {{editor}} 打开", "delete": "删除", "deleteConfirmSingle": "是否删除“{{name}}”?", "deleteConfirmMultiple": "是否删除选中的 {{count}} 个项目?", "dragItems": "{{count}} 个项目", "cancel": "取消", "moveToTrash": "移至废纸篓", "moveToRecycleBin": "移至回收站", "moveConfirmTitle": "移动", "moveConfirmSingle": "是否将“{{name}}”移动到“{{dest}}”?", "moveConfirmMultiple": "是否将 {{count}} 个项目移动到“{{dest}}”?", "moveConfirmSingleToRoot": "是否将“{{name}}”移动到根目录?", "moveConfirmMultipleToRoot": "是否将 {{count}} 个项目移动到根目录?", "loading": "加载中...", "collapseFolders": "折叠文件夹", "refresh": "刷新", "addToChat": "添加到对话", "noProject": "未选择项目" };
|
|
16979
|
+
const chatHeader = { "sessionId": "会话编号", "openSessionFolder": "打开会话文件夹", "projectId": "项目目录", "openProjectFolder": "打开项目文件夹", "refresh": "重启会话", "closeSession": "关闭会话", "closingSession": "关闭中…", "failedToCloseSession": "关闭会话失败。", "sessionOperationInProgress": "已有其他会话操作正在进行中。", "contextWindow": "上下文窗口", "used": "已用", "size": "上限", "percentUsed": "已用 {{pct}}%", "remaining": "剩余 {{count}}", "lastTurn": "上一轮", "input": "输入", "output": "输出", "total": "总计", "thought": "思考", "cacheRead": "缓存读取", "cacheWrite": "缓存写入", "cost": "费用", "viewBreakdown": "查看明细" };
|
|
16980
|
+
const chatInput = { "placeholderDisabled": "请先开启新的会话...", "placeholderActive": "有任何问题请问我... (回车发送)", "mode": "模式", "suggestions": "建议", "messageInput": "消息输入", "stop": "停止", "send": "发送", "tokensUsage": "输入: {{input}} 输出: {{output}} 总计: {{total}}{{thoughtStr}}", "tokensTotal": "{{total}}k tokens", "generationFailed": "生成失败。", "attach": "附加文件", "reference": "引用", "mention": "应用", "snippets": "快捷短语", "snippetsEmpty": "暂无短语,点击前往设置添加。", "selectModel": "选择模型", "stopReasonMaxTokens": "已达到最大 token 限制", "stopReasonMaxTurnRequests": "已达到最大轮次限制", "stopReasonRefusal": "模型拒绝回答", "stopReasonCancelled": "生成已取消", "voiceInput": "语音输入", "selectVoiceInputDevice": "选择麦克风", "stopVoiceInput": "停止语音输入", "startingVoiceInput": "正在启动语音输入", "voiceInputNotConfigured": "请先在设置中配置语音识别", "noAudioInputDevices": "未找到音频输入设备" };
|
|
16981
|
+
const filePanel = { "title": "文件", "view": "查看", "emptyDirectory": "空目录", "newFile": "新建文件", "newFolder": "新建文件夹", "rename": "重命名", "copyPath": "复制路径", "copyRelativePath": "复制相对路径", "revealInFinder": "在访达中显示", "openInEditor": "使用 {{editor}} 打开", "delete": "删除", "deleteConfirmSingle": "是否删除“{{name}}”?", "deleteConfirmMultiple": "是否删除选中的 {{count}} 个项目?", "dragItems": "{{count}} 个项目", "cancel": "取消", "moveToTrash": "移至废纸篓", "moveToRecycleBin": "移至回收站", "moveConfirmTitle": "移动", "moveConfirmSingle": "是否将“{{name}}”移动到“{{dest}}”?", "moveConfirmMultiple": "是否将 {{count}} 个项目移动到“{{dest}}”?", "moveConfirmSingleToRoot": "是否将“{{name}}”移动到根目录?", "moveConfirmMultipleToRoot": "是否将 {{count}} 个项目移动到根目录?", "loading": "加载中...", "collapseFolders": "折叠文件夹", "refresh": "刷新", "addToChat": "添加到对话", "noProject": "未选择项目" };
|
|
16973
16982
|
const toolBubble = { "tool": "工具", "stop": "停止", "stopping": "停止中…", "result": "结果", "terminal": "终端" };
|
|
16974
16983
|
const imageView = { "fallbackAlt": "图片" };
|
|
16975
16984
|
const readonlyTerminal = { "noOutput": "无输出." };
|
|
@@ -16982,7 +16991,7 @@ const chatTimeline = { "userMessageIndex": "第 {{index}} 条用户消息", "jum
|
|
|
16982
16991
|
const thinkingBubble = { "thinking": "思考中...", "thought": "思考过程" };
|
|
16983
16992
|
const userBubble = { "copy": "复制", "locate": "定位" };
|
|
16984
16993
|
const session = { "usageSummary": "{{total}} tk ( ↓ {{input}} ↑ {{output}}{{cachedPart}} )", "usageSummaryCached": " ↻ {{cached}}", "connecting": "正在连接智能体...", "connectionFailed": "连接智能体失败", "retry": "重试" };
|
|
16985
|
-
const terminalPanel = { "title": "终端", "noTerminalSelected": "未选择终端", "addTerminal": "添加终端" };
|
|
16994
|
+
const terminalPanel = { "title": "终端", "noTerminalSelected": "未选择终端", "addTerminal": "添加终端", "view": "查看", "delete": "删除终端" };
|
|
16986
16995
|
const permission = { "title": "需要权限", "error": "响应权限请求失败" };
|
|
16987
16996
|
const errorBoundary = { "title": "出了点问题", "defaultMessage": "应用程序发生意外错误。", "reload": "重新加载应用" };
|
|
16988
16997
|
const panel = { "files": "文件", "terminal": "终端", "noProjectSelected": "未选择项目" };
|
|
@@ -16999,6 +17008,7 @@ const zhCN = {
|
|
|
16999
17008
|
sidebar,
|
|
17000
17009
|
skills,
|
|
17001
17010
|
contextMenu,
|
|
17011
|
+
commands,
|
|
17002
17012
|
settings,
|
|
17003
17013
|
chat,
|
|
17004
17014
|
tokenUsage,
|
|
@@ -20604,6 +20614,9 @@ bridge.on("prompt-start", (payload) => emit("prompt-start", payload));
|
|
|
20604
20614
|
bridge.on("prompt-end", (payload) => emit("prompt-end", payload));
|
|
20605
20615
|
bridge.on("schedules-changed", (payload) => emit("schedules-changed", payload));
|
|
20606
20616
|
bridge.on("task-update", (payload) => emit("task-update", payload));
|
|
20617
|
+
bridge.on("asr-transcript", (payload) => emit("asr-transcript", payload));
|
|
20618
|
+
bridge.on("asr-error", (payload) => emit("asr-error", payload));
|
|
20619
|
+
bridge.on("asr-closed", (payload) => emit("asr-closed", payload));
|
|
20607
20620
|
void invokeIPC("registerClient", { clientId }).catch(() => {
|
|
20608
20621
|
});
|
|
20609
20622
|
function calculateUserMessageChunk(state, subSessionId, update2, displayId, receivedAt) {
|
|
@@ -20949,6 +20962,233 @@ function reduceFlushStreaming(currentState) {
|
|
|
20949
20962
|
messages: newMessages
|
|
20950
20963
|
};
|
|
20951
20964
|
}
|
|
20965
|
+
class RestartSessionError extends Error {
|
|
20966
|
+
constructor(stage, cause) {
|
|
20967
|
+
super(stage === "update" ? "Failed to update session." : "Failed to load session.");
|
|
20968
|
+
this.stage = stage;
|
|
20969
|
+
this.cause = cause;
|
|
20970
|
+
this.name = "RestartSessionError";
|
|
20971
|
+
}
|
|
20972
|
+
stage;
|
|
20973
|
+
cause;
|
|
20974
|
+
}
|
|
20975
|
+
function isSessionLifecycleBusy(sessionId) {
|
|
20976
|
+
return activeLifecycleOperations.has(sessionId);
|
|
20977
|
+
}
|
|
20978
|
+
class SessionLifecycleBusyError extends Error {
|
|
20979
|
+
constructor(sessionId, operation) {
|
|
20980
|
+
const operationLabel = operation === "restart" ? "restarting" : operation === "close" ? "closing" : operation === "delete" ? "being deleted" : operation === "reset" ? "being reset" : "loading";
|
|
20981
|
+
super(`Session is already ${operationLabel}.`);
|
|
20982
|
+
this.sessionId = sessionId;
|
|
20983
|
+
this.operation = operation;
|
|
20984
|
+
this.name = "SessionLifecycleBusyError";
|
|
20985
|
+
}
|
|
20986
|
+
sessionId;
|
|
20987
|
+
operation;
|
|
20988
|
+
}
|
|
20989
|
+
const activeLifecycleOperations = /* @__PURE__ */ new Map();
|
|
20990
|
+
async function withSessionLifecycleLocks(sessionIds, operation, task) {
|
|
20991
|
+
const uniqueSessionIds = [...new Set(sessionIds)];
|
|
20992
|
+
const busySessionId = uniqueSessionIds.find(
|
|
20993
|
+
(sessionId) => activeLifecycleOperations.has(sessionId)
|
|
20994
|
+
);
|
|
20995
|
+
if (busySessionId) {
|
|
20996
|
+
throw new SessionLifecycleBusyError(busySessionId, operation);
|
|
20997
|
+
}
|
|
20998
|
+
for (const sessionId of uniqueSessionIds) {
|
|
20999
|
+
activeLifecycleOperations.set(sessionId, operation);
|
|
21000
|
+
}
|
|
21001
|
+
try {
|
|
21002
|
+
return await task();
|
|
21003
|
+
} finally {
|
|
21004
|
+
for (const sessionId of uniqueSessionIds) {
|
|
21005
|
+
activeLifecycleOperations.delete(sessionId);
|
|
21006
|
+
}
|
|
21007
|
+
}
|
|
21008
|
+
}
|
|
21009
|
+
async function withSessionLifecycleLock(sessionId, operation, task) {
|
|
21010
|
+
return withSessionLifecycleLocks([sessionId], operation, task);
|
|
21011
|
+
}
|
|
21012
|
+
function applyPendingNotifications(sessionId, state, pendingNotifications, knownDisplayIds) {
|
|
21013
|
+
const displayIds = knownDisplayIds ?? /* @__PURE__ */ new Set();
|
|
21014
|
+
let nextState = state;
|
|
21015
|
+
for (const notification of pendingNotifications) {
|
|
21016
|
+
const displayId = notification.update._meta?.fello?.displayId;
|
|
21017
|
+
if (displayId && displayIds.has(displayId)) continue;
|
|
21018
|
+
if (displayId) displayIds.add(displayId);
|
|
21019
|
+
nextState = reduceSessionNotification(sessionId, nextState, notification);
|
|
21020
|
+
}
|
|
21021
|
+
return nextState;
|
|
21022
|
+
}
|
|
21023
|
+
function finishLoadingSession(sessionId) {
|
|
21024
|
+
useAppStore.getState().updateSessionState(sessionId, (currentState) => {
|
|
21025
|
+
const state = applyPendingNotifications(
|
|
21026
|
+
sessionId,
|
|
21027
|
+
currentState,
|
|
21028
|
+
currentState.pendingNotifications
|
|
21029
|
+
);
|
|
21030
|
+
return {
|
|
21031
|
+
...reduceFlushStreaming(state),
|
|
21032
|
+
pendingNotifications: [],
|
|
21033
|
+
isLoading: false
|
|
21034
|
+
};
|
|
21035
|
+
});
|
|
21036
|
+
}
|
|
21037
|
+
async function restoreSessionHistory(sessionId, keepLoading) {
|
|
21038
|
+
const result = await request.getSessionHistory({ sessionId });
|
|
21039
|
+
if (!result) {
|
|
21040
|
+
throw new Error("Session history is unavailable.");
|
|
21041
|
+
}
|
|
21042
|
+
const historyDisplayIds = /* @__PURE__ */ new Set();
|
|
21043
|
+
const store = useAppStore.getState();
|
|
21044
|
+
store.updateSessionState(sessionId, (currentState) => {
|
|
21045
|
+
let state = {
|
|
21046
|
+
...currentState,
|
|
21047
|
+
messages: [],
|
|
21048
|
+
activeToolCalls: /* @__PURE__ */ new Map(),
|
|
21049
|
+
activeSubagents: /* @__PURE__ */ new Map()
|
|
21050
|
+
};
|
|
21051
|
+
for (const notification of result.messages) {
|
|
21052
|
+
const displayId = notification?.update?._meta?.fello?.displayId;
|
|
21053
|
+
if (displayId) historyDisplayIds.add(displayId);
|
|
21054
|
+
if (!notification?.update) continue;
|
|
21055
|
+
state = reduceSessionNotification(sessionId, state, notification);
|
|
21056
|
+
}
|
|
21057
|
+
state = applyPendingNotifications(
|
|
21058
|
+
sessionId,
|
|
21059
|
+
state,
|
|
21060
|
+
currentState.pendingNotifications,
|
|
21061
|
+
historyDisplayIds
|
|
21062
|
+
);
|
|
21063
|
+
return {
|
|
21064
|
+
...reduceFlushStreaming(state),
|
|
21065
|
+
isLoading: keepLoading,
|
|
21066
|
+
pendingNotifications: []
|
|
21067
|
+
};
|
|
21068
|
+
});
|
|
21069
|
+
return historyDisplayIds;
|
|
21070
|
+
}
|
|
21071
|
+
async function loadSession(sessionId, { force = false, loadHistory = false } = {}) {
|
|
21072
|
+
return withSessionLifecycleLock(sessionId, "load", async () => {
|
|
21073
|
+
let loadingStarted = false;
|
|
21074
|
+
try {
|
|
21075
|
+
if (loadHistory) {
|
|
21076
|
+
useAppStore.getState().updateSessionState(sessionId, (currentState) => ({
|
|
21077
|
+
...reduceFlushStreaming(currentState),
|
|
21078
|
+
isLoading: true
|
|
21079
|
+
}));
|
|
21080
|
+
loadingStarted = true;
|
|
21081
|
+
}
|
|
21082
|
+
await request.loadSession({ sessionId, force });
|
|
21083
|
+
if (loadHistory) {
|
|
21084
|
+
await restoreSessionHistory(sessionId, false);
|
|
21085
|
+
useAppStore.getState().updateSessionState(sessionId, () => ({
|
|
21086
|
+
loadedAt: Date.now()
|
|
21087
|
+
}));
|
|
21088
|
+
}
|
|
21089
|
+
} catch (error) {
|
|
21090
|
+
if (loadingStarted) finishLoadingSession(sessionId);
|
|
21091
|
+
throw error;
|
|
21092
|
+
}
|
|
21093
|
+
});
|
|
21094
|
+
}
|
|
21095
|
+
async function restartSession(options) {
|
|
21096
|
+
return withSessionLifecycleLock(options.session.id, "restart", async () => {
|
|
21097
|
+
const { session: session2, mcpServers = session2.mcpServers, features = session2.features } = options;
|
|
21098
|
+
let loadingStarted = false;
|
|
21099
|
+
try {
|
|
21100
|
+
const store = useAppStore.getState();
|
|
21101
|
+
store.updateSessionState(session2.id, (currentState) => ({
|
|
21102
|
+
...reduceFlushStreaming(currentState),
|
|
21103
|
+
isLoading: true
|
|
21104
|
+
}));
|
|
21105
|
+
loadingStarted = true;
|
|
21106
|
+
try {
|
|
21107
|
+
await request.updateSession({
|
|
21108
|
+
sessionId: session2.id,
|
|
21109
|
+
mcpServers,
|
|
21110
|
+
features
|
|
21111
|
+
});
|
|
21112
|
+
} catch (error) {
|
|
21113
|
+
throw new RestartSessionError("update", error);
|
|
21114
|
+
}
|
|
21115
|
+
const currentSession = useAppStore.getState().sessions.find((item) => item.id === session2.id) ?? session2;
|
|
21116
|
+
store.updateSession({
|
|
21117
|
+
...currentSession,
|
|
21118
|
+
mcpServers,
|
|
21119
|
+
features,
|
|
21120
|
+
isStreaming: false
|
|
21121
|
+
});
|
|
21122
|
+
let historyDisplayIds;
|
|
21123
|
+
try {
|
|
21124
|
+
historyDisplayIds = await restoreSessionHistory(session2.id, true);
|
|
21125
|
+
await request.loadSession({ sessionId: session2.id, force: true });
|
|
21126
|
+
} catch (error) {
|
|
21127
|
+
throw new RestartSessionError("load", error);
|
|
21128
|
+
}
|
|
21129
|
+
useAppStore.getState().updateSessionState(session2.id, (currentState) => {
|
|
21130
|
+
const state = applyPendingNotifications(
|
|
21131
|
+
session2.id,
|
|
21132
|
+
currentState,
|
|
21133
|
+
currentState.pendingNotifications,
|
|
21134
|
+
historyDisplayIds
|
|
21135
|
+
);
|
|
21136
|
+
return {
|
|
21137
|
+
...reduceFlushStreaming(state),
|
|
21138
|
+
pendingNotifications: [],
|
|
21139
|
+
isLoading: false,
|
|
21140
|
+
loadedAt: Date.now()
|
|
21141
|
+
};
|
|
21142
|
+
});
|
|
21143
|
+
} catch (error) {
|
|
21144
|
+
if (loadingStarted) finishLoadingSession(session2.id);
|
|
21145
|
+
throw error;
|
|
21146
|
+
}
|
|
21147
|
+
});
|
|
21148
|
+
}
|
|
21149
|
+
function closeSession(sessionId) {
|
|
21150
|
+
return withSessionLifecycleLock(sessionId, "close", async () => {
|
|
21151
|
+
await request.closeSession({ sessionId });
|
|
21152
|
+
finishLoadingSession(sessionId);
|
|
21153
|
+
});
|
|
21154
|
+
}
|
|
21155
|
+
function deleteProject(projectId, sessionIds) {
|
|
21156
|
+
return withSessionLifecycleLocks(sessionIds, "delete", () => request.deleteProject(projectId));
|
|
21157
|
+
}
|
|
21158
|
+
function deleteSessions(sessionIds) {
|
|
21159
|
+
return withSessionLifecycleLocks(sessionIds, "delete", async () => {
|
|
21160
|
+
for (const sessionId of sessionIds) {
|
|
21161
|
+
await request.deleteSession(sessionId);
|
|
21162
|
+
}
|
|
21163
|
+
});
|
|
21164
|
+
}
|
|
21165
|
+
function deleteSession(sessionId) {
|
|
21166
|
+
return deleteSessions([sessionId]);
|
|
21167
|
+
}
|
|
21168
|
+
function updateAgentSettings(agents, sessionIds) {
|
|
21169
|
+
return withSessionLifecycleLocks(sessionIds, "reset", () => request.updateSettings({ agents }));
|
|
21170
|
+
}
|
|
21171
|
+
function resetAgent(agentId, sessionIds) {
|
|
21172
|
+
return withSessionLifecycleLocks(sessionIds, "reset", () => request.resetAgent({ agentId }));
|
|
21173
|
+
}
|
|
21174
|
+
function clearAgentSessions(agentId, sessionIds) {
|
|
21175
|
+
return withSessionLifecycleLocks(
|
|
21176
|
+
sessionIds,
|
|
21177
|
+
"delete",
|
|
21178
|
+
() => request.clearAgentSessions({ agentId })
|
|
21179
|
+
);
|
|
21180
|
+
}
|
|
21181
|
+
async function newSession(options) {
|
|
21182
|
+
const result = await request.newSession(options);
|
|
21183
|
+
useAppStore.getState().updateSessionState(result.sessionId, () => ({
|
|
21184
|
+
isLoading: false,
|
|
21185
|
+
loadedAt: Date.now()
|
|
21186
|
+
}));
|
|
21187
|
+
return result.sessionId;
|
|
21188
|
+
}
|
|
21189
|
+
async function renameSession(sessionId, title) {
|
|
21190
|
+
await request.updateSession({ sessionId, title });
|
|
21191
|
+
}
|
|
20952
21192
|
const UNINITIALIZED = {};
|
|
20953
21193
|
function useRefWithInit(init, initArg) {
|
|
20954
21194
|
const ref = reactExports.useRef(UNINITIALIZED);
|
|
@@ -30884,7 +31124,7 @@ const cva = (base, config) => (props) => {
|
|
|
30884
31124
|
return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);
|
|
30885
31125
|
};
|
|
30886
31126
|
const buttonVariants = cva(
|
|
30887
|
-
"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-
|
|
31127
|
+
"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
30888
31128
|
{
|
|
30889
31129
|
variants: {
|
|
30890
31130
|
variant: {
|
|
@@ -31006,7 +31246,7 @@ const createLucideIcon = (iconName, iconNode) => {
|
|
|
31006
31246
|
Component.displayName = toPascalCase(iconName);
|
|
31007
31247
|
return Component;
|
|
31008
31248
|
};
|
|
31009
|
-
const __iconNode$
|
|
31249
|
+
const __iconNode$B = [
|
|
31010
31250
|
["path", { d: "M12 8V4H8", key: "hb8ula" }],
|
|
31011
31251
|
["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
|
|
31012
31252
|
["path", { d: "M2 14h2", key: "vft8re" }],
|
|
@@ -31014,8 +31254,8 @@ const __iconNode$y = [
|
|
|
31014
31254
|
["path", { d: "M15 13v2", key: "1xurst" }],
|
|
31015
31255
|
["path", { d: "M9 13v2", key: "rq6x2g" }]
|
|
31016
31256
|
];
|
|
31017
|
-
const Bot = createLucideIcon("bot", __iconNode$
|
|
31018
|
-
const __iconNode$
|
|
31257
|
+
const Bot = createLucideIcon("bot", __iconNode$B);
|
|
31258
|
+
const __iconNode$A = [
|
|
31019
31259
|
["path", { d: "M8 2v3", key: "1ioesn" }],
|
|
31020
31260
|
["path", { d: "M16 2v3", key: "otl347" }],
|
|
31021
31261
|
["rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", key: "h1oib" }],
|
|
@@ -31027,56 +31267,67 @@ const __iconNode$x = [
|
|
|
31027
31267
|
["path", { d: "M12 17h.01", key: "p32p05" }],
|
|
31028
31268
|
["path", { d: "M16 17h.01", key: "ql8jdd" }]
|
|
31029
31269
|
];
|
|
31030
|
-
const CalendarDays = createLucideIcon("calendar-days", __iconNode$
|
|
31031
|
-
const __iconNode$
|
|
31032
|
-
const Check = createLucideIcon("check", __iconNode$
|
|
31033
|
-
const __iconNode$
|
|
31034
|
-
const ChevronDown = createLucideIcon("chevron-down", __iconNode$
|
|
31035
|
-
const __iconNode$
|
|
31036
|
-
const ChevronRight = createLucideIcon("chevron-right", __iconNode$
|
|
31037
|
-
const __iconNode$
|
|
31038
|
-
const ChevronUp = createLucideIcon("chevron-up", __iconNode$
|
|
31039
|
-
const __iconNode$
|
|
31270
|
+
const CalendarDays = createLucideIcon("calendar-days", __iconNode$A);
|
|
31271
|
+
const __iconNode$z = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
|
|
31272
|
+
const Check = createLucideIcon("check", __iconNode$z);
|
|
31273
|
+
const __iconNode$y = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
|
|
31274
|
+
const ChevronDown = createLucideIcon("chevron-down", __iconNode$y);
|
|
31275
|
+
const __iconNode$x = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
|
|
31276
|
+
const ChevronRight = createLucideIcon("chevron-right", __iconNode$x);
|
|
31277
|
+
const __iconNode$w = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
|
|
31278
|
+
const ChevronUp = createLucideIcon("chevron-up", __iconNode$w);
|
|
31279
|
+
const __iconNode$v = [
|
|
31040
31280
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
31041
31281
|
["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
|
|
31042
31282
|
];
|
|
31043
|
-
const CircleCheck = createLucideIcon("circle-check", __iconNode$
|
|
31044
|
-
const __iconNode$
|
|
31283
|
+
const CircleCheck = createLucideIcon("circle-check", __iconNode$v);
|
|
31284
|
+
const __iconNode$u = [
|
|
31045
31285
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
31046
31286
|
["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
|
|
31047
31287
|
["path", { d: "M12 17h.01", key: "p32p05" }]
|
|
31048
31288
|
];
|
|
31049
|
-
const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$
|
|
31050
|
-
const __iconNode$
|
|
31289
|
+
const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$u);
|
|
31290
|
+
const __iconNode$t = [
|
|
31051
31291
|
["path", { d: "M11 14h10", key: "1w8e9d" }],
|
|
31052
31292
|
["path", { d: "M16 4h2a2 2 0 0 1 2 2v1.344", key: "1e62lh" }],
|
|
31053
31293
|
["path", { d: "m17 18 4-4-4-4", key: "z2g111" }],
|
|
31054
31294
|
["path", { d: "M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 1.793-1.113", key: "bjbb7m" }],
|
|
31055
31295
|
["rect", { x: "8", y: "2", width: "8", height: "4", rx: "1", key: "ublpy" }]
|
|
31056
31296
|
];
|
|
31057
|
-
const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$
|
|
31058
|
-
const __iconNode$
|
|
31297
|
+
const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$t);
|
|
31298
|
+
const __iconNode$s = [
|
|
31059
31299
|
["path", { d: "M12 6v6l4 2", key: "mmk7yg" }],
|
|
31060
31300
|
["path", { d: "M22 12a10 10 0 1 0-11 9.95", key: "17dhok" }],
|
|
31061
31301
|
["path", { d: "m22 16-5.5 5.5L14 19", key: "1eibut" }]
|
|
31062
31302
|
];
|
|
31063
|
-
const ClockCheck = createLucideIcon("clock-check", __iconNode$
|
|
31064
|
-
const __iconNode$
|
|
31303
|
+
const ClockCheck = createLucideIcon("clock-check", __iconNode$s);
|
|
31304
|
+
const __iconNode$r = [
|
|
31065
31305
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
31066
31306
|
["path", { d: "M12 6v6l4 2", key: "mmk7yg" }]
|
|
31067
31307
|
];
|
|
31068
|
-
const Clock = createLucideIcon("clock", __iconNode$
|
|
31069
|
-
const __iconNode$
|
|
31308
|
+
const Clock = createLucideIcon("clock", __iconNode$r);
|
|
31309
|
+
const __iconNode$q = [
|
|
31070
31310
|
["path", { d: "m16 18 6-6-6-6", key: "eg8j8" }],
|
|
31071
31311
|
["path", { d: "m8 6-6 6 6 6", key: "ppft3o" }]
|
|
31072
31312
|
];
|
|
31073
|
-
const Code = createLucideIcon("code", __iconNode$
|
|
31074
|
-
const __iconNode$
|
|
31313
|
+
const Code = createLucideIcon("code", __iconNode$q);
|
|
31314
|
+
const __iconNode$p = [
|
|
31075
31315
|
["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
|
|
31076
31316
|
["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" }]
|
|
31077
31317
|
];
|
|
31078
|
-
const Copy = createLucideIcon("copy", __iconNode$
|
|
31079
|
-
const __iconNode$
|
|
31318
|
+
const Copy = createLucideIcon("copy", __iconNode$p);
|
|
31319
|
+
const __iconNode$o = [
|
|
31320
|
+
[
|
|
31321
|
+
"path",
|
|
31322
|
+
{
|
|
31323
|
+
d: "M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",
|
|
31324
|
+
key: "1nclc0"
|
|
31325
|
+
}
|
|
31326
|
+
],
|
|
31327
|
+
["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
|
|
31328
|
+
];
|
|
31329
|
+
const Eye = createLucideIcon("eye", __iconNode$o);
|
|
31330
|
+
const __iconNode$n = [
|
|
31080
31331
|
[
|
|
31081
31332
|
"path",
|
|
31082
31333
|
{
|
|
@@ -31086,8 +31337,8 @@ const __iconNode$l = [
|
|
|
31086
31337
|
],
|
|
31087
31338
|
["path", { d: "M2 10h20", key: "1ir3d8" }]
|
|
31088
31339
|
];
|
|
31089
|
-
const FolderClosed = createLucideIcon("folder-closed", __iconNode$
|
|
31090
|
-
const __iconNode$
|
|
31340
|
+
const FolderClosed = createLucideIcon("folder-closed", __iconNode$n);
|
|
31341
|
+
const __iconNode$m = [
|
|
31091
31342
|
[
|
|
31092
31343
|
"path",
|
|
31093
31344
|
{
|
|
@@ -31096,8 +31347,8 @@ const __iconNode$k = [
|
|
|
31096
31347
|
}
|
|
31097
31348
|
]
|
|
31098
31349
|
];
|
|
31099
|
-
const FolderOpen = createLucideIcon("folder-open", __iconNode$
|
|
31100
|
-
const __iconNode$
|
|
31350
|
+
const FolderOpen = createLucideIcon("folder-open", __iconNode$m);
|
|
31351
|
+
const __iconNode$l = [
|
|
31101
31352
|
["path", { d: "M12 10v6", key: "1bos4e" }],
|
|
31102
31353
|
["path", { d: "M9 13h6", key: "1uhe8q" }],
|
|
31103
31354
|
[
|
|
@@ -31108,8 +31359,8 @@ const __iconNode$j = [
|
|
|
31108
31359
|
}
|
|
31109
31360
|
]
|
|
31110
31361
|
];
|
|
31111
|
-
const FolderPlus = createLucideIcon("folder-plus", __iconNode$
|
|
31112
|
-
const __iconNode$
|
|
31362
|
+
const FolderPlus = createLucideIcon("folder-plus", __iconNode$l);
|
|
31363
|
+
const __iconNode$k = [
|
|
31113
31364
|
[
|
|
31114
31365
|
"path",
|
|
31115
31366
|
{
|
|
@@ -31118,14 +31369,14 @@ const __iconNode$i = [
|
|
|
31118
31369
|
}
|
|
31119
31370
|
]
|
|
31120
31371
|
];
|
|
31121
|
-
const Folder = createLucideIcon("folder", __iconNode$
|
|
31122
|
-
const __iconNode$
|
|
31372
|
+
const Folder = createLucideIcon("folder", __iconNode$k);
|
|
31373
|
+
const __iconNode$j = [
|
|
31123
31374
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
31124
31375
|
["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
|
|
31125
31376
|
["path", { d: "M2 12h20", key: "9i4pu4" }]
|
|
31126
31377
|
];
|
|
31127
|
-
const Globe = createLucideIcon("globe", __iconNode$
|
|
31128
|
-
const __iconNode$
|
|
31378
|
+
const Globe = createLucideIcon("globe", __iconNode$j);
|
|
31379
|
+
const __iconNode$i = [
|
|
31129
31380
|
["path", { d: "M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8", key: "5wwlr5" }],
|
|
31130
31381
|
[
|
|
31131
31382
|
"path",
|
|
@@ -31135,23 +31386,23 @@ const __iconNode$g = [
|
|
|
31135
31386
|
}
|
|
31136
31387
|
]
|
|
31137
31388
|
];
|
|
31138
|
-
const House = createLucideIcon("house", __iconNode$
|
|
31139
|
-
const __iconNode$
|
|
31389
|
+
const House = createLucideIcon("house", __iconNode$i);
|
|
31390
|
+
const __iconNode$h = [
|
|
31140
31391
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
31141
31392
|
["path", { d: "M12 16v-4", key: "1dtifu" }],
|
|
31142
31393
|
["path", { d: "M12 8h.01", key: "e9boi3" }]
|
|
31143
31394
|
];
|
|
31144
|
-
const Info = createLucideIcon("info", __iconNode$
|
|
31145
|
-
const __iconNode$
|
|
31395
|
+
const Info = createLucideIcon("info", __iconNode$h);
|
|
31396
|
+
const __iconNode$g = [
|
|
31146
31397
|
["path", { d: "m16 6 4 14", key: "ji33uf" }],
|
|
31147
31398
|
["path", { d: "M12 6v14", key: "1n7gus" }],
|
|
31148
31399
|
["path", { d: "M8 8v12", key: "1gg7y9" }],
|
|
31149
31400
|
["path", { d: "M4 4v16", key: "6qkkli" }]
|
|
31150
31401
|
];
|
|
31151
|
-
const Library = createLucideIcon("library", __iconNode$
|
|
31152
|
-
const __iconNode$
|
|
31153
|
-
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$
|
|
31154
|
-
const __iconNode$
|
|
31402
|
+
const Library = createLucideIcon("library", __iconNode$g);
|
|
31403
|
+
const __iconNode$f = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
|
|
31404
|
+
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$f);
|
|
31405
|
+
const __iconNode$e = [
|
|
31155
31406
|
[
|
|
31156
31407
|
"path",
|
|
31157
31408
|
{
|
|
@@ -31162,8 +31413,8 @@ const __iconNode$c = [
|
|
|
31162
31413
|
["path", { d: "M8 12h8", key: "1wcyev" }],
|
|
31163
31414
|
["path", { d: "M12 8v8", key: "napkw2" }]
|
|
31164
31415
|
];
|
|
31165
|
-
const MessageCirclePlus = createLucideIcon("message-circle-plus", __iconNode$
|
|
31166
|
-
const __iconNode$
|
|
31416
|
+
const MessageCirclePlus = createLucideIcon("message-circle-plus", __iconNode$e);
|
|
31417
|
+
const __iconNode$d = [
|
|
31167
31418
|
[
|
|
31168
31419
|
"path",
|
|
31169
31420
|
{
|
|
@@ -31172,8 +31423,8 @@ const __iconNode$b = [
|
|
|
31172
31423
|
}
|
|
31173
31424
|
]
|
|
31174
31425
|
];
|
|
31175
|
-
const MessageCircle = createLucideIcon("message-circle", __iconNode$
|
|
31176
|
-
const __iconNode$
|
|
31426
|
+
const MessageCircle = createLucideIcon("message-circle", __iconNode$d);
|
|
31427
|
+
const __iconNode$c = [
|
|
31177
31428
|
[
|
|
31178
31429
|
"path",
|
|
31179
31430
|
{
|
|
@@ -31182,8 +31433,8 @@ const __iconNode$a = [
|
|
|
31182
31433
|
}
|
|
31183
31434
|
]
|
|
31184
31435
|
];
|
|
31185
|
-
const MessageSquare = createLucideIcon("message-square", __iconNode$
|
|
31186
|
-
const __iconNode$
|
|
31436
|
+
const MessageSquare = createLucideIcon("message-square", __iconNode$c);
|
|
31437
|
+
const __iconNode$b = [
|
|
31187
31438
|
["path", { d: "m15 9-6 6", key: "1uzhvr" }],
|
|
31188
31439
|
[
|
|
31189
31440
|
"path",
|
|
@@ -31194,20 +31445,20 @@ const __iconNode$9 = [
|
|
|
31194
31445
|
],
|
|
31195
31446
|
["path", { d: "m9 9 6 6", key: "z0biqf" }]
|
|
31196
31447
|
];
|
|
31197
|
-
const OctagonX = createLucideIcon("octagon-x", __iconNode$
|
|
31198
|
-
const __iconNode$
|
|
31448
|
+
const OctagonX = createLucideIcon("octagon-x", __iconNode$b);
|
|
31449
|
+
const __iconNode$a = [
|
|
31199
31450
|
["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
|
|
31200
31451
|
["path", { d: "M9 3v18", key: "fh3hqa" }],
|
|
31201
31452
|
["path", { d: "m16 15-3-3 3-3", key: "14y99z" }]
|
|
31202
31453
|
];
|
|
31203
|
-
const PanelLeftClose = createLucideIcon("panel-left-close", __iconNode$
|
|
31204
|
-
const __iconNode$
|
|
31454
|
+
const PanelLeftClose = createLucideIcon("panel-left-close", __iconNode$a);
|
|
31455
|
+
const __iconNode$9 = [
|
|
31205
31456
|
["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
|
|
31206
31457
|
["path", { d: "M9 3v18", key: "fh3hqa" }],
|
|
31207
31458
|
["path", { d: "m14 9 3 3-3 3", key: "8010ee" }]
|
|
31208
31459
|
];
|
|
31209
|
-
const PanelLeftOpen = createLucideIcon("panel-left-open", __iconNode$
|
|
31210
|
-
const __iconNode$
|
|
31460
|
+
const PanelLeftOpen = createLucideIcon("panel-left-open", __iconNode$9);
|
|
31461
|
+
const __iconNode$8 = [
|
|
31211
31462
|
[
|
|
31212
31463
|
"path",
|
|
31213
31464
|
{
|
|
@@ -31217,7 +31468,19 @@ const __iconNode$6 = [
|
|
|
31217
31468
|
],
|
|
31218
31469
|
["path", { d: "m15 5 4 4", key: "1mk7zo" }]
|
|
31219
31470
|
];
|
|
31220
|
-
const Pencil = createLucideIcon("pencil", __iconNode$
|
|
31471
|
+
const Pencil = createLucideIcon("pencil", __iconNode$8);
|
|
31472
|
+
const __iconNode$7 = [
|
|
31473
|
+
["path", { d: "M12 2v10", key: "mnfbl" }],
|
|
31474
|
+
["path", { d: "M18.4 6.6a9 9 0 1 1-12.77.04", key: "obofu9" }]
|
|
31475
|
+
];
|
|
31476
|
+
const Power = createLucideIcon("power", __iconNode$7);
|
|
31477
|
+
const __iconNode$6 = [
|
|
31478
|
+
["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
|
|
31479
|
+
["path", { d: "M21 3v5h-5", key: "1q7to0" }],
|
|
31480
|
+
["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
|
|
31481
|
+
["path", { d: "M8 16H3v5", key: "1cv678" }]
|
|
31482
|
+
];
|
|
31483
|
+
const RefreshCw = createLucideIcon("refresh-cw", __iconNode$6);
|
|
31221
31484
|
const __iconNode$5 = [
|
|
31222
31485
|
["circle", { cx: "6", cy: "6", r: "3", key: "1lh9wr" }],
|
|
31223
31486
|
["path", { d: "M8.12 8.12 12 12", key: "1alkpv" }],
|
|
@@ -31779,7 +32042,7 @@ function Input({ className, type, ...props }) {
|
|
|
31779
32042
|
type,
|
|
31780
32043
|
"data-slot": "input",
|
|
31781
32044
|
className: cn$1(
|
|
31782
|
-
"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-
|
|
32045
|
+
"h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
|
|
31783
32046
|
className
|
|
31784
32047
|
),
|
|
31785
32048
|
...props
|
|
@@ -34868,7 +35131,7 @@ function useMenuParent() {
|
|
|
34868
35131
|
}, [menubarContext]);
|
|
34869
35132
|
return parent;
|
|
34870
35133
|
}
|
|
34871
|
-
const Separator
|
|
35134
|
+
const Separator = /* @__PURE__ */ reactExports.forwardRef(function SeparatorComponent(componentProps, forwardedRef) {
|
|
34872
35135
|
const {
|
|
34873
35136
|
className,
|
|
34874
35137
|
render,
|
|
@@ -35163,7 +35426,7 @@ function DropdownMenuSeparator({
|
|
|
35163
35426
|
...props
|
|
35164
35427
|
}) {
|
|
35165
35428
|
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
35166
|
-
Separator
|
|
35429
|
+
Separator,
|
|
35167
35430
|
{
|
|
35168
35431
|
"data-slot": "dropdown-menu-separator",
|
|
35169
35432
|
className: cn$1("-mx-1 my-1 h-px bg-border", className),
|
|
@@ -38062,7 +38325,7 @@ function useRender(params) {
|
|
|
38062
38325
|
return useRenderElement(params.defaultTagName ?? "div", params, params);
|
|
38063
38326
|
}
|
|
38064
38327
|
const badgeVariants = cva(
|
|
38065
|
-
"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-
|
|
38328
|
+
"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!",
|
|
38066
38329
|
{
|
|
38067
38330
|
variants: {
|
|
38068
38331
|
variant: {
|
|
@@ -40057,7 +40320,7 @@ function SelectTrigger({
|
|
|
40057
40320
|
"data-slot": "select-trigger",
|
|
40058
40321
|
"data-size": size2,
|
|
40059
40322
|
className: cn$1(
|
|
40060
|
-
"flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent px-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-
|
|
40323
|
+
"flex w-fit items-center justify-between gap-1.5 rounded-lg border border-input bg-transparent px-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 data-[size=sm]:bg-transparent data-[size=sm]:text-xs data-[size=sm]:text-muted-foreground hover:data-[size=sm]:text-foreground data-[size=sm]:rounded-[min(var(--radius-md),10px)] *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
40061
40324
|
className
|
|
40062
40325
|
),
|
|
40063
40326
|
...props,
|
|
@@ -41053,7 +41316,7 @@ function TabsTrigger({ className, ...props }) {
|
|
|
41053
41316
|
{
|
|
41054
41317
|
"data-slot": "tabs-trigger",
|
|
41055
41318
|
className: cn$1(
|
|
41056
|
-
"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/70 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-
|
|
41319
|
+
"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/70 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
41057
41320
|
"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent",
|
|
41058
41321
|
"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground",
|
|
41059
41322
|
"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100",
|
|
@@ -41300,7 +41563,7 @@ function Switch({
|
|
|
41300
41563
|
"data-slot": "switch",
|
|
41301
41564
|
"data-size": size2,
|
|
41302
41565
|
className: cn$1(
|
|
41303
|
-
"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-
|
|
41566
|
+
"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50",
|
|
41304
41567
|
className
|
|
41305
41568
|
),
|
|
41306
41569
|
...props,
|
|
@@ -42133,6 +42396,27 @@ function ScrollArea({
|
|
|
42133
42396
|
hideScrollBar,
|
|
42134
42397
|
...props
|
|
42135
42398
|
}) {
|
|
42399
|
+
const handleViewportKeyDown = (event) => {
|
|
42400
|
+
const viewport = event.currentTarget;
|
|
42401
|
+
if (event.defaultPrevented || event.target !== viewport || viewport.ownerDocument.activeElement !== viewport) {
|
|
42402
|
+
return;
|
|
42403
|
+
}
|
|
42404
|
+
const isMetaEdgeShortcut = event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey;
|
|
42405
|
+
const isPlainEdgeShortcut = !event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey;
|
|
42406
|
+
let top = null;
|
|
42407
|
+
if (isMetaEdgeShortcut && event.key === "ArrowUp") {
|
|
42408
|
+
top = 0;
|
|
42409
|
+
} else if (isMetaEdgeShortcut && event.key === "ArrowDown") {
|
|
42410
|
+
top = viewport.scrollHeight;
|
|
42411
|
+
} else if (isPlainEdgeShortcut && event.key === "Home") {
|
|
42412
|
+
top = 0;
|
|
42413
|
+
} else if (isPlainEdgeShortcut && event.key === "End") {
|
|
42414
|
+
top = viewport.scrollHeight;
|
|
42415
|
+
}
|
|
42416
|
+
if (top === null) return;
|
|
42417
|
+
event.preventDefault();
|
|
42418
|
+
viewport.scrollTo({ top, behavior: "smooth" });
|
|
42419
|
+
};
|
|
42136
42420
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
42137
42421
|
ScrollAreaRoot,
|
|
42138
42422
|
{
|
|
@@ -42146,6 +42430,7 @@ function ScrollArea({
|
|
|
42146
42430
|
"data-slot": "scroll-area-viewport",
|
|
42147
42431
|
className: cn$1("size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:outline-1", viewportClassName),
|
|
42148
42432
|
style: { overflowAnchor: "auto" },
|
|
42433
|
+
onKeyDown: handleViewportKeyDown,
|
|
42149
42434
|
children
|
|
42150
42435
|
}
|
|
42151
42436
|
),
|
|
@@ -42577,24 +42862,414 @@ function HoverCardContent({
|
|
|
42577
42862
|
}
|
|
42578
42863
|
) });
|
|
42579
42864
|
}
|
|
42580
|
-
function
|
|
42865
|
+
function ContextMenuRoot(props) {
|
|
42866
|
+
const [anchor, setAnchor] = reactExports.useState({
|
|
42867
|
+
getBoundingClientRect() {
|
|
42868
|
+
return DOMRect.fromRect({
|
|
42869
|
+
width: 0,
|
|
42870
|
+
height: 0,
|
|
42871
|
+
x: 0,
|
|
42872
|
+
y: 0
|
|
42873
|
+
});
|
|
42874
|
+
}
|
|
42875
|
+
});
|
|
42876
|
+
const backdropRef = reactExports.useRef(null);
|
|
42877
|
+
const internalBackdropRef = reactExports.useRef(null);
|
|
42878
|
+
const actionsRef = reactExports.useRef(null);
|
|
42879
|
+
const positionerRef = reactExports.useRef(null);
|
|
42880
|
+
const allowMouseUpTriggerRef = reactExports.useRef(true);
|
|
42881
|
+
const initialCursorPointRef = reactExports.useRef(null);
|
|
42882
|
+
const id = useId();
|
|
42883
|
+
const contextValue = reactExports.useMemo(() => ({
|
|
42884
|
+
anchor,
|
|
42885
|
+
setAnchor,
|
|
42886
|
+
actionsRef,
|
|
42887
|
+
backdropRef,
|
|
42888
|
+
internalBackdropRef,
|
|
42889
|
+
positionerRef,
|
|
42890
|
+
allowMouseUpTriggerRef,
|
|
42891
|
+
initialCursorPointRef,
|
|
42892
|
+
rootId: id
|
|
42893
|
+
}), [anchor, id]);
|
|
42894
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuRootContext.Provider, {
|
|
42895
|
+
value: contextValue,
|
|
42896
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRootContext.Provider, {
|
|
42897
|
+
value: void 0,
|
|
42898
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRoot, {
|
|
42899
|
+
...props
|
|
42900
|
+
})
|
|
42901
|
+
})
|
|
42902
|
+
});
|
|
42903
|
+
}
|
|
42904
|
+
const LONG_PRESS_DELAY = 500;
|
|
42905
|
+
const ContextMenuTrigger$1 = /* @__PURE__ */ reactExports.forwardRef(function ContextMenuTrigger2(componentProps, forwardedRef) {
|
|
42906
|
+
const {
|
|
42907
|
+
render,
|
|
42908
|
+
className,
|
|
42909
|
+
style,
|
|
42910
|
+
...elementProps
|
|
42911
|
+
} = componentProps;
|
|
42912
|
+
const {
|
|
42913
|
+
setAnchor,
|
|
42914
|
+
actionsRef,
|
|
42915
|
+
internalBackdropRef,
|
|
42916
|
+
backdropRef,
|
|
42917
|
+
positionerRef,
|
|
42918
|
+
allowMouseUpTriggerRef,
|
|
42919
|
+
initialCursorPointRef,
|
|
42920
|
+
rootId
|
|
42921
|
+
} = useContextMenuRootContext(false);
|
|
42922
|
+
const {
|
|
42923
|
+
store
|
|
42924
|
+
} = useMenuRootContext(false);
|
|
42925
|
+
const open = store.useState("open");
|
|
42926
|
+
const disabled2 = store.useState("disabled");
|
|
42927
|
+
const triggerRef = reactExports.useRef(null);
|
|
42928
|
+
const touchPositionRef = reactExports.useRef(null);
|
|
42929
|
+
const longPressTimeout = useTimeout();
|
|
42930
|
+
const allowMouseUpTimeout = useTimeout();
|
|
42931
|
+
const allowMouseUpRef = reactExports.useRef(false);
|
|
42932
|
+
const mouseUpAbortControllerRef = reactExports.useRef(null);
|
|
42933
|
+
function handleLongPress(x2, y2, event) {
|
|
42934
|
+
const isTouchEvent = event.type.startsWith("touch");
|
|
42935
|
+
initialCursorPointRef.current = {
|
|
42936
|
+
x: x2,
|
|
42937
|
+
y: y2
|
|
42938
|
+
};
|
|
42939
|
+
setAnchor({
|
|
42940
|
+
getBoundingClientRect() {
|
|
42941
|
+
return DOMRect.fromRect({
|
|
42942
|
+
width: isTouchEvent ? 10 : 0,
|
|
42943
|
+
height: isTouchEvent ? 10 : 0,
|
|
42944
|
+
x: x2,
|
|
42945
|
+
y: y2
|
|
42946
|
+
});
|
|
42947
|
+
}
|
|
42948
|
+
});
|
|
42949
|
+
allowMouseUpRef.current = false;
|
|
42950
|
+
actionsRef.current?.setOpen(true, createChangeEventDetails(triggerPress, event));
|
|
42951
|
+
allowMouseUpTimeout.start(LONG_PRESS_DELAY, () => {
|
|
42952
|
+
allowMouseUpRef.current = true;
|
|
42953
|
+
});
|
|
42954
|
+
}
|
|
42955
|
+
function handleContextMenu(event) {
|
|
42956
|
+
if (disabled2) {
|
|
42957
|
+
return;
|
|
42958
|
+
}
|
|
42959
|
+
allowMouseUpTriggerRef.current = true;
|
|
42960
|
+
stopEvent(event);
|
|
42961
|
+
handleLongPress(event.clientX, event.clientY, event.nativeEvent);
|
|
42962
|
+
const doc = ownerDocument(triggerRef.current);
|
|
42963
|
+
mouseUpAbortControllerRef.current?.abort();
|
|
42964
|
+
const mouseUpAbortController = new AbortController();
|
|
42965
|
+
mouseUpAbortControllerRef.current = mouseUpAbortController;
|
|
42966
|
+
doc.addEventListener("mouseup", (mouseEvent) => {
|
|
42967
|
+
allowMouseUpTriggerRef.current = false;
|
|
42968
|
+
if (!allowMouseUpRef.current) {
|
|
42969
|
+
return;
|
|
42970
|
+
}
|
|
42971
|
+
allowMouseUpTimeout.clear();
|
|
42972
|
+
allowMouseUpRef.current = false;
|
|
42973
|
+
const mouseUpTarget = getTarget(mouseEvent);
|
|
42974
|
+
if (contains(positionerRef.current, mouseUpTarget)) {
|
|
42975
|
+
return;
|
|
42976
|
+
}
|
|
42977
|
+
if (rootId && mouseUpTarget && findRootOwnerId(mouseUpTarget) === rootId) {
|
|
42978
|
+
return;
|
|
42979
|
+
}
|
|
42980
|
+
actionsRef.current?.setOpen(false, createChangeEventDetails(cancelOpen, mouseEvent));
|
|
42981
|
+
}, {
|
|
42982
|
+
once: true,
|
|
42983
|
+
signal: mouseUpAbortController.signal
|
|
42984
|
+
});
|
|
42985
|
+
}
|
|
42986
|
+
function cancelLongPress() {
|
|
42987
|
+
longPressTimeout.clear();
|
|
42988
|
+
touchPositionRef.current = null;
|
|
42989
|
+
}
|
|
42990
|
+
function handleTouchStart(event) {
|
|
42991
|
+
if (disabled2) {
|
|
42992
|
+
cancelLongPress();
|
|
42993
|
+
return;
|
|
42994
|
+
}
|
|
42995
|
+
allowMouseUpTriggerRef.current = false;
|
|
42996
|
+
if (event.touches.length !== 1) {
|
|
42997
|
+
cancelLongPress();
|
|
42998
|
+
return;
|
|
42999
|
+
}
|
|
43000
|
+
event.stopPropagation();
|
|
43001
|
+
const touch = event.touches[0];
|
|
43002
|
+
const touchPosition = {
|
|
43003
|
+
x: touch.clientX,
|
|
43004
|
+
y: touch.clientY
|
|
43005
|
+
};
|
|
43006
|
+
touchPositionRef.current = touchPosition;
|
|
43007
|
+
longPressTimeout.start(LONG_PRESS_DELAY, () => {
|
|
43008
|
+
handleLongPress(touchPosition.x, touchPosition.y, event.nativeEvent);
|
|
43009
|
+
});
|
|
43010
|
+
}
|
|
43011
|
+
function handleTouchMove(event) {
|
|
43012
|
+
if (event.touches.length !== 1) {
|
|
43013
|
+
cancelLongPress();
|
|
43014
|
+
return;
|
|
43015
|
+
}
|
|
43016
|
+
if (longPressTimeout.isStarted() && touchPositionRef.current) {
|
|
43017
|
+
const touch = event.touches[0];
|
|
43018
|
+
const moveThreshold = 10;
|
|
43019
|
+
const deltaX = Math.abs(touch.clientX - touchPositionRef.current.x);
|
|
43020
|
+
const deltaY = Math.abs(touch.clientY - touchPositionRef.current.y);
|
|
43021
|
+
if (deltaX > moveThreshold || deltaY > moveThreshold) {
|
|
43022
|
+
cancelLongPress();
|
|
43023
|
+
}
|
|
43024
|
+
}
|
|
43025
|
+
}
|
|
43026
|
+
reactExports.useEffect(() => () => {
|
|
43027
|
+
mouseUpAbortControllerRef.current?.abort();
|
|
43028
|
+
}, []);
|
|
43029
|
+
reactExports.useEffect(() => {
|
|
43030
|
+
function handleDocumentContextMenu(event) {
|
|
43031
|
+
if (disabled2) {
|
|
43032
|
+
return;
|
|
43033
|
+
}
|
|
43034
|
+
const target = getTarget(event);
|
|
43035
|
+
const targetElement = target;
|
|
43036
|
+
if (contains(triggerRef.current, targetElement) || contains(internalBackdropRef.current, targetElement) || contains(backdropRef.current, targetElement)) {
|
|
43037
|
+
event.preventDefault();
|
|
43038
|
+
}
|
|
43039
|
+
}
|
|
43040
|
+
const doc = ownerDocument(triggerRef.current);
|
|
43041
|
+
return addEventListener(doc, "contextmenu", handleDocumentContextMenu);
|
|
43042
|
+
}, [backdropRef, disabled2, internalBackdropRef]);
|
|
43043
|
+
const state = {
|
|
43044
|
+
open
|
|
43045
|
+
};
|
|
43046
|
+
const element = useRenderElement("div", componentProps, {
|
|
43047
|
+
state,
|
|
43048
|
+
ref: [triggerRef, forwardedRef],
|
|
43049
|
+
props: [{
|
|
43050
|
+
onContextMenu: handleContextMenu,
|
|
43051
|
+
onTouchStart: handleTouchStart,
|
|
43052
|
+
onTouchMove: handleTouchMove,
|
|
43053
|
+
onTouchEnd: cancelLongPress,
|
|
43054
|
+
onTouchCancel: cancelLongPress,
|
|
43055
|
+
style: {
|
|
43056
|
+
WebkitTouchCallout: "none"
|
|
43057
|
+
}
|
|
43058
|
+
}, elementProps],
|
|
43059
|
+
stateAttributesMapping: pressableTriggerOpenStateMapping
|
|
43060
|
+
});
|
|
43061
|
+
return element;
|
|
43062
|
+
});
|
|
43063
|
+
function ContextMenu({ ...props }) {
|
|
43064
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuRoot, { "data-slot": "context-menu", ...props });
|
|
43065
|
+
}
|
|
43066
|
+
function ContextMenuTrigger({
|
|
43067
|
+
className,
|
|
43068
|
+
...props
|
|
43069
|
+
}) {
|
|
43070
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43071
|
+
ContextMenuTrigger$1,
|
|
43072
|
+
{
|
|
43073
|
+
"data-slot": "context-menu-trigger",
|
|
43074
|
+
className: cn$1("select-none", className),
|
|
43075
|
+
...props
|
|
43076
|
+
}
|
|
43077
|
+
);
|
|
43078
|
+
}
|
|
43079
|
+
function ContextMenuContent({
|
|
43080
|
+
className,
|
|
43081
|
+
align = "start",
|
|
43082
|
+
alignOffset = 4,
|
|
43083
|
+
side = "right",
|
|
43084
|
+
sideOffset = 0,
|
|
43085
|
+
...props
|
|
43086
|
+
}) {
|
|
43087
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(MenuPortal, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43088
|
+
MenuPositioner,
|
|
43089
|
+
{
|
|
43090
|
+
className: "isolate z-50 outline-none",
|
|
43091
|
+
align,
|
|
43092
|
+
alignOffset,
|
|
43093
|
+
side,
|
|
43094
|
+
sideOffset,
|
|
43095
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43096
|
+
MenuPopup,
|
|
43097
|
+
{
|
|
43098
|
+
"data-slot": "context-menu-content",
|
|
43099
|
+
className: cn$1("z-50 max-h-(--available-height) min-w-38 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover py-1 px-1 space-y-0.5 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
|
|
43100
|
+
...props
|
|
43101
|
+
}
|
|
43102
|
+
)
|
|
43103
|
+
}
|
|
43104
|
+
) });
|
|
43105
|
+
}
|
|
43106
|
+
function ContextMenuItem({
|
|
42581
43107
|
className,
|
|
42582
|
-
|
|
43108
|
+
inset,
|
|
43109
|
+
variant = "default",
|
|
42583
43110
|
...props
|
|
42584
43111
|
}) {
|
|
42585
43112
|
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
42586
|
-
|
|
43113
|
+
MenuItem,
|
|
42587
43114
|
{
|
|
42588
|
-
"data-slot": "
|
|
42589
|
-
|
|
43115
|
+
"data-slot": "context-menu-item",
|
|
43116
|
+
"data-inset": inset,
|
|
43117
|
+
"data-variant": variant,
|
|
42590
43118
|
className: cn$1(
|
|
42591
|
-
"
|
|
43119
|
+
"group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-sm px-1.5 py-1 text-xs text-muted-foreground/90 outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive",
|
|
42592
43120
|
className
|
|
42593
43121
|
),
|
|
42594
43122
|
...props
|
|
42595
43123
|
}
|
|
42596
43124
|
);
|
|
42597
43125
|
}
|
|
43126
|
+
function ContextMenuSeparator({
|
|
43127
|
+
className,
|
|
43128
|
+
...props
|
|
43129
|
+
}) {
|
|
43130
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43131
|
+
Separator,
|
|
43132
|
+
{
|
|
43133
|
+
"data-slot": "context-menu-separator",
|
|
43134
|
+
className: cn$1("-mx-1 my-1 h-px bg-border", className),
|
|
43135
|
+
...props
|
|
43136
|
+
}
|
|
43137
|
+
);
|
|
43138
|
+
}
|
|
43139
|
+
const FocusTargetContext = reactExports.createContext(null);
|
|
43140
|
+
function FocusTargetProvider({ children }) {
|
|
43141
|
+
const targetsRef = reactExports.useRef(/* @__PURE__ */ new Map());
|
|
43142
|
+
const register2 = reactExports.useCallback((id, handler) => {
|
|
43143
|
+
targetsRef.current.set(id, handler);
|
|
43144
|
+
return () => {
|
|
43145
|
+
if (targetsRef.current.get(id) === handler) {
|
|
43146
|
+
targetsRef.current.delete(id);
|
|
43147
|
+
}
|
|
43148
|
+
};
|
|
43149
|
+
}, []);
|
|
43150
|
+
const focus = reactExports.useCallback((id) => {
|
|
43151
|
+
const handler = targetsRef.current.get(id);
|
|
43152
|
+
if (!handler) return false;
|
|
43153
|
+
return handler() !== false;
|
|
43154
|
+
}, []);
|
|
43155
|
+
const value = reactExports.useMemo(() => ({ register: register2, focus }), [focus, register2]);
|
|
43156
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(FocusTargetContext.Provider, { value, children });
|
|
43157
|
+
}
|
|
43158
|
+
function useFocusTargetContext() {
|
|
43159
|
+
const context = reactExports.useContext(FocusTargetContext);
|
|
43160
|
+
if (!context) {
|
|
43161
|
+
throw new Error("Focus target hooks must be used within FocusTargetProvider");
|
|
43162
|
+
}
|
|
43163
|
+
return context;
|
|
43164
|
+
}
|
|
43165
|
+
function useFocusTarget(id, handler, enabled = true) {
|
|
43166
|
+
const { register: register2 } = useFocusTargetContext();
|
|
43167
|
+
const handlerRef = reactExports.useRef(handler);
|
|
43168
|
+
const enabledRef = reactExports.useRef(enabled);
|
|
43169
|
+
handlerRef.current = handler;
|
|
43170
|
+
enabledRef.current = enabled;
|
|
43171
|
+
reactExports.useEffect(() => {
|
|
43172
|
+
const registeredHandler = () => {
|
|
43173
|
+
if (!enabledRef.current) return false;
|
|
43174
|
+
return handlerRef.current();
|
|
43175
|
+
};
|
|
43176
|
+
return register2(id, registeredHandler);
|
|
43177
|
+
}, [id, register2]);
|
|
43178
|
+
}
|
|
43179
|
+
function useFocusTargetRegistry() {
|
|
43180
|
+
return useFocusTargetContext();
|
|
43181
|
+
}
|
|
43182
|
+
const keyCodeMap = {
|
|
43183
|
+
esc: "Escape",
|
|
43184
|
+
escape: "Escape",
|
|
43185
|
+
enter: "Enter",
|
|
43186
|
+
return: "Enter",
|
|
43187
|
+
plus: "Equal",
|
|
43188
|
+
minus: "Minus",
|
|
43189
|
+
tab: "Tab",
|
|
43190
|
+
space: "Space",
|
|
43191
|
+
backspace: "Backspace",
|
|
43192
|
+
delete: "Delete",
|
|
43193
|
+
up: "ArrowUp",
|
|
43194
|
+
down: "ArrowDown",
|
|
43195
|
+
left: "ArrowLeft",
|
|
43196
|
+
right: "ArrowRight",
|
|
43197
|
+
home: "Home",
|
|
43198
|
+
end: "End",
|
|
43199
|
+
pageup: "PageUp",
|
|
43200
|
+
"page-up": "PageUp",
|
|
43201
|
+
pagedown: "PageDown",
|
|
43202
|
+
"page-down": "PageDown"
|
|
43203
|
+
};
|
|
43204
|
+
const keyCodeAliases = {
|
|
43205
|
+
plus: ["Equal", "NumpadAdd"],
|
|
43206
|
+
minus: ["Minus", "NumpadSubtract"]
|
|
43207
|
+
};
|
|
43208
|
+
function parseShortcut(shortcut) {
|
|
43209
|
+
const parts = shortcut.split("+").map((part) => part.trim()).filter(Boolean);
|
|
43210
|
+
const keyPart = parts.pop()?.toLowerCase() ?? "";
|
|
43211
|
+
const modifiers = new Set(parts);
|
|
43212
|
+
const normalizedKey = keyPart.length === 1 ? keyPart : keyCodeMap[keyPart] ?? keyPart;
|
|
43213
|
+
const code = /^\d$/.test(keyPart) ? `Digit${keyPart}` : /^[fF]\d{1,2}$/.test(keyPart) ? keyPart.toUpperCase() : keyCodeMap[keyPart] ?? null;
|
|
43214
|
+
const codes = keyCodeAliases[keyPart] ?? (code ? [code] : null);
|
|
43215
|
+
return {
|
|
43216
|
+
key: normalizedKey,
|
|
43217
|
+
codes,
|
|
43218
|
+
alt: modifiers.has("Alt"),
|
|
43219
|
+
ctrl: modifiers.has("Control") || modifiers.has("Ctrl"),
|
|
43220
|
+
meta: modifiers.has("Meta") || modifiers.has("Cmd"),
|
|
43221
|
+
shift: modifiers.has("Shift"),
|
|
43222
|
+
mod: modifiers.has("Mod")
|
|
43223
|
+
};
|
|
43224
|
+
}
|
|
43225
|
+
function isMacPlatform() {
|
|
43226
|
+
return typeof navigator !== "undefined" && /mac|iphone|ipad|ipod/i.test(navigator.platform);
|
|
43227
|
+
}
|
|
43228
|
+
function isShortcutCaptureTarget(target) {
|
|
43229
|
+
return target instanceof HTMLElement && target.closest("[data-shortcut-capture]") !== null;
|
|
43230
|
+
}
|
|
43231
|
+
function isEditableTarget(target) {
|
|
43232
|
+
if (!(target instanceof HTMLElement)) return false;
|
|
43233
|
+
if (target.isContentEditable) return true;
|
|
43234
|
+
return ["INPUT", "TEXTAREA", "SELECT"].includes(target.tagName);
|
|
43235
|
+
}
|
|
43236
|
+
function matchesShortcut(event, shortcut) {
|
|
43237
|
+
const isMac = isMacPlatform();
|
|
43238
|
+
const expectedCtrl = shortcut.ctrl || shortcut.mod && !isMac;
|
|
43239
|
+
const expectedMeta = shortcut.meta || shortcut.mod && isMac;
|
|
43240
|
+
if (event.altKey !== shortcut.alt) return false;
|
|
43241
|
+
if (event.ctrlKey !== expectedCtrl) return false;
|
|
43242
|
+
if (event.metaKey !== expectedMeta) return false;
|
|
43243
|
+
if (event.shiftKey !== shortcut.shift) return false;
|
|
43244
|
+
if (shortcut.codes) return shortcut.codes.includes(event.code);
|
|
43245
|
+
return event.key.toLowerCase() === shortcut.key.toLowerCase();
|
|
43246
|
+
}
|
|
43247
|
+
function useKeyboardShortcuts(shortcuts, { scopeRef, capture = true } = {}) {
|
|
43248
|
+
const shortcutsRef = reactExports.useRef(shortcuts);
|
|
43249
|
+
shortcutsRef.current = shortcuts;
|
|
43250
|
+
reactExports.useEffect(() => {
|
|
43251
|
+
const handleKeyDown = (event) => {
|
|
43252
|
+
if (event.isComposing || event.repeat) return;
|
|
43253
|
+
if (scopeRef) {
|
|
43254
|
+
const eventTarget = event.target;
|
|
43255
|
+
if (!(eventTarget instanceof Node) || !scopeRef.current?.contains(eventTarget)) return;
|
|
43256
|
+
}
|
|
43257
|
+
if (isShortcutCaptureTarget(event.target)) return;
|
|
43258
|
+
for (const shortcut of shortcutsRef.current) {
|
|
43259
|
+
if (shortcut.enabled === false) continue;
|
|
43260
|
+
if (shortcut.ignoreInputs !== false && isEditableTarget(event.target)) continue;
|
|
43261
|
+
const parsedShortcut = parseShortcut(shortcut.shortcut);
|
|
43262
|
+
if (!matchesShortcut(event, parsedShortcut)) continue;
|
|
43263
|
+
if (shortcut.preventDefault !== false) event.preventDefault();
|
|
43264
|
+
if (shortcut.stopPropagation !== false) event.stopPropagation();
|
|
43265
|
+
shortcut.handler(event);
|
|
43266
|
+
break;
|
|
43267
|
+
}
|
|
43268
|
+
};
|
|
43269
|
+
window.addEventListener("keydown", handleKeyDown, capture);
|
|
43270
|
+
return () => window.removeEventListener("keydown", handleKeyDown, capture);
|
|
43271
|
+
}, [capture, scopeRef]);
|
|
43272
|
+
}
|
|
42598
43273
|
function getErrorMessage(error, fallbackMessage) {
|
|
42599
43274
|
return extractErrorMessage(error) || fallbackMessage;
|
|
42600
43275
|
}
|
|
@@ -42616,6 +43291,9 @@ function projectHoverId(id) {
|
|
|
42616
43291
|
function sessionHoverId(id) {
|
|
42617
43292
|
return `s:${id}`;
|
|
42618
43293
|
}
|
|
43294
|
+
function sidebarNavigationItemKey(item) {
|
|
43295
|
+
return item.type === "project" ? `project:${item.id}` : `session:${item.id}`;
|
|
43296
|
+
}
|
|
42619
43297
|
function Sidebar() {
|
|
42620
43298
|
const { t, i18n } = useTranslation();
|
|
42621
43299
|
const navigate = useNavigate();
|
|
@@ -42656,6 +43334,7 @@ function Sidebar() {
|
|
|
42656
43334
|
setProjects,
|
|
42657
43335
|
setSessions,
|
|
42658
43336
|
sidebarOpen,
|
|
43337
|
+
setSidebarOpen,
|
|
42659
43338
|
configuredAgents,
|
|
42660
43339
|
configuredMcpServers,
|
|
42661
43340
|
sessionStates,
|
|
@@ -42693,7 +43372,20 @@ function Sidebar() {
|
|
|
42693
43372
|
);
|
|
42694
43373
|
const [expandedProjects, setExpandedProjects] = reactExports.useState({});
|
|
42695
43374
|
const [hoverId, setHoverId] = reactExports.useState(null);
|
|
43375
|
+
const [contextMenuId, setContextMenuId] = reactExports.useState(null);
|
|
43376
|
+
const [sessionAction, setSessionAction] = reactExports.useState(null);
|
|
43377
|
+
const hoveredTriggerIdRef = reactExports.useRef(null);
|
|
42696
43378
|
const { prompt, confirm, toast: toast2 } = useMessage();
|
|
43379
|
+
const handleSetActiveIlinkSession = async (sessionId) => {
|
|
43380
|
+
try {
|
|
43381
|
+
await request.setActiveIlinkSession({ sessionId });
|
|
43382
|
+
} catch (err) {
|
|
43383
|
+
console.error("Failed to update WeChat active session:", err);
|
|
43384
|
+
toast2.error(
|
|
43385
|
+
extractErrorMessage(err) || t("sidebar.failedToUpdateIlinkSession", "Failed to update WeChat active session.")
|
|
43386
|
+
);
|
|
43387
|
+
}
|
|
43388
|
+
};
|
|
42697
43389
|
const showMacTrafficLightSpace = isMacApp && !isFullScreen;
|
|
42698
43390
|
const refreshData = async () => {
|
|
42699
43391
|
const [nextProjects, nextSessions] = await Promise.all([
|
|
@@ -42734,24 +43426,25 @@ function Sidebar() {
|
|
|
42734
43426
|
}
|
|
42735
43427
|
};
|
|
42736
43428
|
handleAddProjectRef.current = handleAddProject;
|
|
42737
|
-
const
|
|
43429
|
+
const handleNewSession = async (projectId, agentId, params) => {
|
|
42738
43430
|
try {
|
|
42739
43431
|
setExpandedProjects((prev) => ({ ...prev, [projectId]: true }));
|
|
42740
43432
|
useAppStore.getState().setIsCreatingSession(true);
|
|
42741
|
-
const
|
|
43433
|
+
const sessionId = await newSession({
|
|
42742
43434
|
projectId,
|
|
42743
43435
|
agentId,
|
|
42744
43436
|
mcpServers: params?.mcpServers,
|
|
42745
43437
|
features: params?.features,
|
|
42746
43438
|
permissionMode: params?.permissionMode
|
|
42747
43439
|
});
|
|
42748
|
-
useAppStore.getState().updateSessionState(result.sessionId, () => ({ loadedAt: Date.now() }));
|
|
42749
43440
|
await refreshData();
|
|
42750
|
-
handleNavigate(`/session-view/${
|
|
43441
|
+
handleNavigate(`/session-view/${sessionId}`);
|
|
42751
43442
|
return true;
|
|
42752
43443
|
} catch (err) {
|
|
42753
|
-
console.error("Failed to create new
|
|
42754
|
-
toast2.error(
|
|
43444
|
+
console.error("Failed to create new session:", err);
|
|
43445
|
+
toast2.error(
|
|
43446
|
+
getErrorMessage(err, t("sidebar.newSessionFailed", "Failed to create a new session."))
|
|
43447
|
+
);
|
|
42755
43448
|
return false;
|
|
42756
43449
|
} finally {
|
|
42757
43450
|
useAppStore.getState().setIsCreatingSession(false);
|
|
@@ -42781,7 +43474,7 @@ function Sidebar() {
|
|
|
42781
43474
|
handleNewSessionRef.current = openNewSessionDialog;
|
|
42782
43475
|
const handleCreateNewSession = async () => {
|
|
42783
43476
|
if (!newSessionProjectId || !newSessionAgentId) return;
|
|
42784
|
-
const ok = await
|
|
43477
|
+
const ok = await handleNewSession(newSessionProjectId, newSessionAgentId, {
|
|
42785
43478
|
mcpServers: Array.from(newSessionMcpIds),
|
|
42786
43479
|
features: newSessionFeatures,
|
|
42787
43480
|
permissionMode: newSessionPermissionMode
|
|
@@ -42798,27 +43491,101 @@ function Sidebar() {
|
|
|
42798
43491
|
}
|
|
42799
43492
|
handleNavigate(`/session-view/${session2.id}`);
|
|
42800
43493
|
};
|
|
43494
|
+
const handleRestartSession = async (session2) => {
|
|
43495
|
+
if (sessionAction) return;
|
|
43496
|
+
setSessionAction({ id: session2.id, type: "restart" });
|
|
43497
|
+
try {
|
|
43498
|
+
await restartSession({
|
|
43499
|
+
session: session2,
|
|
43500
|
+
mcpServers: session2.mcpServers,
|
|
43501
|
+
features: session2.features
|
|
43502
|
+
});
|
|
43503
|
+
} catch (err) {
|
|
43504
|
+
console.error("Failed to restart session:", err);
|
|
43505
|
+
if (err instanceof SessionLifecycleBusyError) {
|
|
43506
|
+
toast2.error(
|
|
43507
|
+
t(
|
|
43508
|
+
"sidebar.sessionOperationInProgress",
|
|
43509
|
+
"Another session operation is already in progress."
|
|
43510
|
+
)
|
|
43511
|
+
);
|
|
43512
|
+
return;
|
|
43513
|
+
}
|
|
43514
|
+
const lifecycleError = err instanceof RestartSessionError ? err : null;
|
|
43515
|
+
const cause = lifecycleError?.cause ?? err;
|
|
43516
|
+
const fallback = lifecycleError?.stage === "update" ? t("sidebar.failedToUpdateMcpServers", "Failed to update MCP servers") : t("sidebar.failedToLoadSession", "Failed to load session.");
|
|
43517
|
+
toast2.error(extractErrorMessage(cause) || fallback);
|
|
43518
|
+
} finally {
|
|
43519
|
+
setSessionAction(null);
|
|
43520
|
+
}
|
|
43521
|
+
};
|
|
43522
|
+
const handleCloseSession = async (session2) => {
|
|
43523
|
+
if (sessionAction) return;
|
|
43524
|
+
setSessionAction({ id: session2.id, type: "close" });
|
|
43525
|
+
try {
|
|
43526
|
+
await closeSession(session2.id);
|
|
43527
|
+
if (activeSessionId === session2.id) {
|
|
43528
|
+
handleNavigate("/");
|
|
43529
|
+
}
|
|
43530
|
+
} catch (err) {
|
|
43531
|
+
console.error("Failed to close session:", err);
|
|
43532
|
+
if (err instanceof SessionLifecycleBusyError) {
|
|
43533
|
+
toast2.error(
|
|
43534
|
+
t(
|
|
43535
|
+
"sidebar.sessionOperationInProgress",
|
|
43536
|
+
"Another session operation is already in progress."
|
|
43537
|
+
)
|
|
43538
|
+
);
|
|
43539
|
+
return;
|
|
43540
|
+
}
|
|
43541
|
+
toast2.error(
|
|
43542
|
+
extractErrorMessage(err) || t("sidebar.failedToCloseSession", "Failed to close session.")
|
|
43543
|
+
);
|
|
43544
|
+
} finally {
|
|
43545
|
+
setSessionAction(null);
|
|
43546
|
+
}
|
|
43547
|
+
};
|
|
42801
43548
|
const handleDeleteSession = async (session2) => {
|
|
42802
|
-
|
|
43549
|
+
if (sessionAction) return;
|
|
43550
|
+
const displayTitle = session2.title || t("sidebar.newSession", "New Session");
|
|
42803
43551
|
await confirm({
|
|
42804
|
-
title: t("sidebar.
|
|
42805
|
-
content: t("sidebar.
|
|
43552
|
+
title: t("sidebar.deleteSession"),
|
|
43553
|
+
content: t("sidebar.deleteSessionConfirm", { title: displayTitle }),
|
|
42806
43554
|
buttons: [
|
|
42807
43555
|
{ text: t("sidebar.cancel"), value: null, variant: "outline" },
|
|
42808
43556
|
{
|
|
42809
43557
|
text: t("sidebar.delete"),
|
|
42810
43558
|
variant: "destructive",
|
|
42811
43559
|
value: async () => {
|
|
42812
|
-
|
|
42813
|
-
|
|
42814
|
-
|
|
43560
|
+
setSessionAction({ id: session2.id, type: "delete" });
|
|
43561
|
+
try {
|
|
43562
|
+
await deleteSession(session2.id);
|
|
43563
|
+
if (activeSessionId === session2.id) {
|
|
43564
|
+
handleNavigate("/");
|
|
43565
|
+
}
|
|
43566
|
+
const store = useAppStore.getState();
|
|
43567
|
+
store.setSessions(store.sessions.filter((item) => item.id !== session2.id));
|
|
43568
|
+
store.disposeSessionState(session2.id);
|
|
43569
|
+
await refreshData();
|
|
43570
|
+
return "deleted";
|
|
43571
|
+
} catch (err) {
|
|
43572
|
+
console.error("Failed to delete session:", err);
|
|
43573
|
+
if (err instanceof SessionLifecycleBusyError) {
|
|
43574
|
+
toast2.error(
|
|
43575
|
+
t(
|
|
43576
|
+
"sidebar.sessionOperationInProgress",
|
|
43577
|
+
"Another session operation is already in progress."
|
|
43578
|
+
)
|
|
43579
|
+
);
|
|
43580
|
+
return null;
|
|
43581
|
+
}
|
|
43582
|
+
toast2.error(
|
|
43583
|
+
extractErrorMessage(err) || t("sidebar.failedToDeleteSession", "Failed to delete session.")
|
|
43584
|
+
);
|
|
43585
|
+
return null;
|
|
43586
|
+
} finally {
|
|
43587
|
+
setSessionAction(null);
|
|
42815
43588
|
}
|
|
42816
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
42817
|
-
setSessions(store.sessions.filter((s) => s.id !== session2.id));
|
|
42818
|
-
store.disposeSessionState(session2.id);
|
|
42819
|
-
await request.deleteSession(session2.id);
|
|
42820
|
-
await refreshData();
|
|
42821
|
-
return "deleted";
|
|
42822
43589
|
}
|
|
42823
43590
|
}
|
|
42824
43591
|
]
|
|
@@ -42837,15 +43604,15 @@ function Sidebar() {
|
|
|
42837
43604
|
}
|
|
42838
43605
|
};
|
|
42839
43606
|
const handleRenameSession = async (session2) => {
|
|
42840
|
-
const displayTitle = session2.title || t("sidebar.
|
|
43607
|
+
const displayTitle = session2.title || t("sidebar.newSession", "New Session");
|
|
42841
43608
|
const newName = await prompt({
|
|
42842
|
-
title: t("sidebar.
|
|
42843
|
-
content: t("sidebar.
|
|
43609
|
+
title: t("sidebar.renameSession"),
|
|
43610
|
+
content: t("sidebar.enterNewSessionName"),
|
|
42844
43611
|
defaultValue: displayTitle,
|
|
42845
|
-
validate: (val) => val.trim() ? void 0 : t("sidebar.
|
|
43612
|
+
validate: (val) => val.trim() ? void 0 : t("sidebar.sessionNameEmpty", "Session name cannot be empty")
|
|
42846
43613
|
});
|
|
42847
43614
|
if (newName) {
|
|
42848
|
-
await
|
|
43615
|
+
await renameSession(session2.id, newName.trim());
|
|
42849
43616
|
await refreshData();
|
|
42850
43617
|
}
|
|
42851
43618
|
};
|
|
@@ -42859,19 +43626,40 @@ function Sidebar() {
|
|
|
42859
43626
|
text: t("sidebar.delete"),
|
|
42860
43627
|
value: async () => {
|
|
42861
43628
|
const state = useAppStore.getState();
|
|
42862
|
-
const
|
|
42863
|
-
|
|
43629
|
+
const projectSessions = state.sessions.filter(
|
|
43630
|
+
(session2) => session2.projectId === project.id
|
|
43631
|
+
);
|
|
43632
|
+
const activeSession = projectSessions.find((session2) => session2.id === activeSessionId);
|
|
43633
|
+
if (activeSession) {
|
|
42864
43634
|
handleNavigate("/");
|
|
42865
43635
|
}
|
|
42866
|
-
|
|
42867
|
-
|
|
42868
|
-
|
|
42869
|
-
|
|
43636
|
+
try {
|
|
43637
|
+
await deleteProject(
|
|
43638
|
+
project.id,
|
|
43639
|
+
projectSessions.map((session2) => session2.id)
|
|
43640
|
+
);
|
|
43641
|
+
const currentState = useAppStore.getState();
|
|
43642
|
+
const map = new Map(currentState.sessionStates);
|
|
43643
|
+
for (const session2 of projectSessions) map.delete(session2.id);
|
|
43644
|
+
useAppStore.setState({ sessionStates: map });
|
|
43645
|
+
await refreshData();
|
|
43646
|
+
return "deleted";
|
|
43647
|
+
} catch (err) {
|
|
43648
|
+
console.error("Failed to delete project:", err);
|
|
43649
|
+
if (err instanceof SessionLifecycleBusyError) {
|
|
43650
|
+
toast2.error(
|
|
43651
|
+
t(
|
|
43652
|
+
"sidebar.sessionOperationInProgress",
|
|
43653
|
+
"Another session operation is already in progress."
|
|
43654
|
+
)
|
|
43655
|
+
);
|
|
43656
|
+
return null;
|
|
43657
|
+
}
|
|
43658
|
+
toast2.error(
|
|
43659
|
+
extractErrorMessage(err) || t("sidebar.failedToDeleteProject", "Failed to delete project.")
|
|
43660
|
+
);
|
|
43661
|
+
return null;
|
|
42870
43662
|
}
|
|
42871
|
-
useAppStore.setState({ sessionStates: map });
|
|
42872
|
-
await request.deleteProject(project.id);
|
|
42873
|
-
await refreshData();
|
|
42874
|
-
return "deleted";
|
|
42875
43663
|
},
|
|
42876
43664
|
variant: "destructive"
|
|
42877
43665
|
}
|
|
@@ -42913,6 +43701,158 @@ function Sidebar() {
|
|
|
42913
43701
|
const toggleProject = (projectId) => {
|
|
42914
43702
|
setExpandedProjects((prev) => ({ ...prev, [projectId]: !isProjectExpanded(projectId) }));
|
|
42915
43703
|
};
|
|
43704
|
+
const navigationItemRefs = reactExports.useRef(/* @__PURE__ */ new Map());
|
|
43705
|
+
const addProjectButtonRef = reactExports.useRef(null);
|
|
43706
|
+
const sessionListRef = reactExports.useRef(null);
|
|
43707
|
+
const navigationItems = reactExports.useMemo(() => {
|
|
43708
|
+
const items = [];
|
|
43709
|
+
for (const project of sortedProjects) {
|
|
43710
|
+
items.push({ type: "project", id: project.id });
|
|
43711
|
+
if (expandedProjects[project.id] ?? true) {
|
|
43712
|
+
for (const session2 of sessionsByProject[project.id] ?? []) {
|
|
43713
|
+
items.push({ type: "session", id: session2.id, projectId: project.id });
|
|
43714
|
+
}
|
|
43715
|
+
}
|
|
43716
|
+
}
|
|
43717
|
+
return items;
|
|
43718
|
+
}, [expandedProjects, sessionsByProject, sortedProjects]);
|
|
43719
|
+
const focusNavigationItem = reactExports.useCallback(
|
|
43720
|
+
(item) => {
|
|
43721
|
+
let element = navigationItemRefs.current.get(
|
|
43722
|
+
sidebarNavigationItemKey(item)
|
|
43723
|
+
);
|
|
43724
|
+
if (!element) {
|
|
43725
|
+
const itemIndex = navigationItems.findIndex(
|
|
43726
|
+
(navigationItem) => sidebarNavigationItemKey(navigationItem) === sidebarNavigationItemKey(item)
|
|
43727
|
+
);
|
|
43728
|
+
element = sessionListRef.current?.querySelectorAll('[role="treeitem"]')[itemIndex];
|
|
43729
|
+
}
|
|
43730
|
+
if (!element) return;
|
|
43731
|
+
element.focus({ preventScroll: true });
|
|
43732
|
+
element.scrollIntoView({ block: "nearest" });
|
|
43733
|
+
},
|
|
43734
|
+
[navigationItems]
|
|
43735
|
+
);
|
|
43736
|
+
const focusSidebarSessions = reactExports.useCallback(() => {
|
|
43737
|
+
const focusVisibleItem = () => {
|
|
43738
|
+
const activeSession = sessions.find((session2) => session2.id === activeSessionId);
|
|
43739
|
+
const targetItem = activeSession ? navigationItems.find(
|
|
43740
|
+
(item) => item.type === "session" && item.id === activeSession.id
|
|
43741
|
+
) ?? navigationItems.find(
|
|
43742
|
+
(item) => item.type === "project" && item.id === activeSession.projectId
|
|
43743
|
+
) : navigationItems[0];
|
|
43744
|
+
if (targetItem) {
|
|
43745
|
+
focusNavigationItem(targetItem);
|
|
43746
|
+
} else {
|
|
43747
|
+
addProjectButtonRef.current?.focus({ preventScroll: true });
|
|
43748
|
+
}
|
|
43749
|
+
};
|
|
43750
|
+
if (!sidebarOpen) {
|
|
43751
|
+
setSidebarOpen(true);
|
|
43752
|
+
}
|
|
43753
|
+
window.requestAnimationFrame(focusVisibleItem);
|
|
43754
|
+
}, [
|
|
43755
|
+
activeSessionId,
|
|
43756
|
+
focusNavigationItem,
|
|
43757
|
+
navigationItems,
|
|
43758
|
+
sessions,
|
|
43759
|
+
setSidebarOpen,
|
|
43760
|
+
sidebarOpen
|
|
43761
|
+
]);
|
|
43762
|
+
useFocusTarget("sidebar-sessions", focusSidebarSessions);
|
|
43763
|
+
const handleNavigationKeyDown = (event, item) => {
|
|
43764
|
+
const { key } = event;
|
|
43765
|
+
const isVerticalNavigationKey = key === "ArrowUp" || key === "ArrowDown" || key === "Home" || key === "End";
|
|
43766
|
+
if (isVerticalNavigationKey) {
|
|
43767
|
+
event.preventDefault();
|
|
43768
|
+
event.stopPropagation();
|
|
43769
|
+
const currentIndex = navigationItems.findIndex(
|
|
43770
|
+
(navigationItem) => sidebarNavigationItemKey(navigationItem) === sidebarNavigationItemKey(item)
|
|
43771
|
+
);
|
|
43772
|
+
if (navigationItems.length === 0) return;
|
|
43773
|
+
if (key === "ArrowUp" && currentIndex === 0) {
|
|
43774
|
+
addProjectButtonRef.current?.focus({ preventScroll: true });
|
|
43775
|
+
return;
|
|
43776
|
+
}
|
|
43777
|
+
const nextIndex = key === "Home" ? 0 : key === "End" ? navigationItems.length - 1 : Math.max(
|
|
43778
|
+
0,
|
|
43779
|
+
Math.min(navigationItems.length - 1, currentIndex + (key === "ArrowDown" ? 1 : -1))
|
|
43780
|
+
);
|
|
43781
|
+
const nextItem = navigationItems[nextIndex];
|
|
43782
|
+
if (nextItem) focusNavigationItem(nextItem);
|
|
43783
|
+
return;
|
|
43784
|
+
}
|
|
43785
|
+
if (key === "/") {
|
|
43786
|
+
event.preventDefault();
|
|
43787
|
+
event.stopPropagation();
|
|
43788
|
+
const target = event.currentTarget;
|
|
43789
|
+
const rect = target.getBoundingClientRect();
|
|
43790
|
+
target.dispatchEvent(
|
|
43791
|
+
new MouseEvent("contextmenu", {
|
|
43792
|
+
bubbles: true,
|
|
43793
|
+
cancelable: true,
|
|
43794
|
+
view: window,
|
|
43795
|
+
button: 2,
|
|
43796
|
+
buttons: 2,
|
|
43797
|
+
clientX: rect.left + rect.width / 2,
|
|
43798
|
+
clientY: rect.top + rect.height / 2
|
|
43799
|
+
})
|
|
43800
|
+
);
|
|
43801
|
+
return;
|
|
43802
|
+
}
|
|
43803
|
+
if (key === "ArrowLeft" || key === "ArrowRight") {
|
|
43804
|
+
event.preventDefault();
|
|
43805
|
+
event.stopPropagation();
|
|
43806
|
+
if (item.type === "project") {
|
|
43807
|
+
if (key === "ArrowLeft") {
|
|
43808
|
+
if (isProjectExpanded(item.id)) {
|
|
43809
|
+
setExpandedProjects((prev) => ({ ...prev, [item.id]: false }));
|
|
43810
|
+
}
|
|
43811
|
+
} else if (!isProjectExpanded(item.id)) {
|
|
43812
|
+
setExpandedProjects((prev) => ({ ...prev, [item.id]: true }));
|
|
43813
|
+
} else {
|
|
43814
|
+
const firstChild = navigationItems.find(
|
|
43815
|
+
(navigationItem) => navigationItem.type === "session" && navigationItem.projectId === item.id
|
|
43816
|
+
);
|
|
43817
|
+
if (firstChild) focusNavigationItem(firstChild);
|
|
43818
|
+
}
|
|
43819
|
+
} else if (key === "ArrowLeft") {
|
|
43820
|
+
focusNavigationItem({ type: "project", id: item.projectId });
|
|
43821
|
+
}
|
|
43822
|
+
return;
|
|
43823
|
+
}
|
|
43824
|
+
if (key === "Enter" || key === " " || key === "Spacebar") {
|
|
43825
|
+
event.preventDefault();
|
|
43826
|
+
event.stopPropagation();
|
|
43827
|
+
if (item.type === "project") {
|
|
43828
|
+
toggleProject(item.id);
|
|
43829
|
+
} else {
|
|
43830
|
+
const session2 = sessions.find((candidate) => candidate.id === item.id);
|
|
43831
|
+
if (session2) void handleSelectSession(session2);
|
|
43832
|
+
}
|
|
43833
|
+
}
|
|
43834
|
+
};
|
|
43835
|
+
const handleAddProjectKeyDown = (event) => {
|
|
43836
|
+
const { key } = event;
|
|
43837
|
+
if (key === "ArrowLeft" || key === "ArrowRight" || key === "Home" || key === "End") {
|
|
43838
|
+
event.preventDefault();
|
|
43839
|
+
event.stopPropagation();
|
|
43840
|
+
addProjectButtonRef.current?.focus({ preventScroll: true });
|
|
43841
|
+
return;
|
|
43842
|
+
}
|
|
43843
|
+
if (key === "ArrowDown") {
|
|
43844
|
+
event.preventDefault();
|
|
43845
|
+
event.stopPropagation();
|
|
43846
|
+
const firstItem = navigationItems[0];
|
|
43847
|
+
if (firstItem) focusNavigationItem(firstItem);
|
|
43848
|
+
return;
|
|
43849
|
+
}
|
|
43850
|
+
if (key === "Enter" || key === " " || key === "Spacebar") {
|
|
43851
|
+
event.preventDefault();
|
|
43852
|
+
event.stopPropagation();
|
|
43853
|
+
void handleAddProject();
|
|
43854
|
+
}
|
|
43855
|
+
};
|
|
42916
43856
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
42917
43857
|
"aside",
|
|
42918
43858
|
{
|
|
@@ -42968,351 +43908,512 @@ function Sidebar() {
|
|
|
42968
43908
|
}
|
|
42969
43909
|
)
|
|
42970
43910
|
] }),
|
|
42971
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-3
|
|
43911
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-3 pt-2", children: [
|
|
42972
43912
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-normal tracking-wide text-sidebar-foreground/40 uppercase select-none", children: t("sidebar.projects") }),
|
|
42973
43913
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
42974
43914
|
Button,
|
|
42975
43915
|
{
|
|
43916
|
+
ref: addProjectButtonRef,
|
|
42976
43917
|
variant: "ghost",
|
|
42977
43918
|
size: "icon",
|
|
42978
|
-
|
|
43919
|
+
tabIndex: -1,
|
|
43920
|
+
className: "size-6 -mr-1 text-sidebar-foreground/45 hover:bg-sidebar-accent/30 hover:text-sidebar-foreground/70",
|
|
42979
43921
|
onClick: handleAddProject,
|
|
43922
|
+
onKeyDown: handleAddProjectKeyDown,
|
|
43923
|
+
"aria-label": t("sidebar.addProject", "Add project"),
|
|
42980
43924
|
children: /* @__PURE__ */ jsxRuntimeExports.jsx(FolderPlus, { className: "size-3.5" })
|
|
42981
43925
|
}
|
|
42982
43926
|
)
|
|
42983
43927
|
] }),
|
|
42984
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
42985
|
-
|
|
42986
|
-
|
|
42987
|
-
|
|
42988
|
-
|
|
42989
|
-
|
|
42990
|
-
|
|
42991
|
-
|
|
42992
|
-
|
|
42993
|
-
|
|
42994
|
-
|
|
42995
|
-
|
|
42996
|
-
|
|
42997
|
-
|
|
42998
|
-
|
|
42999
|
-
|
|
43000
|
-
|
|
43001
|
-
|
|
43002
|
-
|
|
43003
|
-
|
|
43004
|
-
|
|
43005
|
-
|
|
43006
|
-
if (
|
|
43007
|
-
}
|
|
43008
|
-
|
|
43009
|
-
|
|
43010
|
-
|
|
43011
|
-
|
|
43012
|
-
|
|
43013
|
-
|
|
43014
|
-
|
|
43015
|
-
|
|
43016
|
-
|
|
43017
|
-
|
|
43018
|
-
|
|
43019
|
-
|
|
43020
|
-
|
|
43021
|
-
|
|
43022
|
-
|
|
43023
|
-
|
|
43024
|
-
|
|
43025
|
-
|
|
43026
|
-
defaultValue: "Create chat in {{title}}",
|
|
43027
|
-
title: project.title
|
|
43028
|
-
}),
|
|
43029
|
-
children: /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, { className: "size-3.5" })
|
|
43030
|
-
}
|
|
43031
|
-
)
|
|
43032
|
-
]
|
|
43033
|
-
}
|
|
43034
|
-
) }),
|
|
43035
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43036
|
-
HoverCardContent,
|
|
43037
|
-
{
|
|
43038
|
-
side: "right",
|
|
43039
|
-
align: "start",
|
|
43040
|
-
sideOffset: -30,
|
|
43041
|
-
alignOffset: 2,
|
|
43042
|
-
className: "max-w-60 min-w-48 w-auto p-3",
|
|
43043
|
-
children: [
|
|
43044
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
43045
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium leading-snug", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: project.title }) }),
|
|
43046
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
|
|
43047
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-3 shrink-0" }),
|
|
43048
|
-
isWebUI ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", title: project.cwd, children: project.cwd }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43049
|
-
"button",
|
|
43928
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43929
|
+
"div",
|
|
43930
|
+
{
|
|
43931
|
+
ref: sessionListRef,
|
|
43932
|
+
role: "tree",
|
|
43933
|
+
"aria-label": t("sidebar.sessions", "Sessions"),
|
|
43934
|
+
className: "space-y-0.5 p-1.5 outline-none focus:ring-1 focus:ring-ring/50",
|
|
43935
|
+
children: sortedProjects.map((project) => {
|
|
43936
|
+
const projectSessions = sessionsByProject[project.id] ?? [];
|
|
43937
|
+
const expanded = isProjectExpanded(project.id);
|
|
43938
|
+
const currentHoverId = projectHoverId(project.id);
|
|
43939
|
+
const latestProjectUpdateAt = projectSessions.length > 0 ? projectSessions.reduce((max2, session2) => Math.max(max2, session2.updatedAt), 0) : project.createdAt;
|
|
43940
|
+
const connectedSessions = projectSessions.filter(
|
|
43941
|
+
(session2) => session2.connectionStatus === "connected"
|
|
43942
|
+
);
|
|
43943
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-0.5 group", children: [
|
|
43944
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43945
|
+
HoverCard,
|
|
43946
|
+
{
|
|
43947
|
+
open: hoverId === currentHoverId,
|
|
43948
|
+
onOpenChange: (open) => {
|
|
43949
|
+
if (open) {
|
|
43950
|
+
if (contextMenuId === null) setHoverId(currentHoverId);
|
|
43951
|
+
} else if (hoverId === currentHoverId && hoveredTriggerIdRef.current !== currentHoverId) {
|
|
43952
|
+
setHoverId(null);
|
|
43953
|
+
}
|
|
43954
|
+
},
|
|
43955
|
+
children: [
|
|
43956
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(HoverCardTrigger, { render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}), delay: 0, closeDelay: 100, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43957
|
+
ContextMenu,
|
|
43958
|
+
{
|
|
43959
|
+
onOpenChange: (open) => {
|
|
43960
|
+
setContextMenuId(open ? currentHoverId : null);
|
|
43961
|
+
if (open) {
|
|
43962
|
+
setHoverId(null);
|
|
43963
|
+
} else if (hoveredTriggerIdRef.current === currentHoverId) {
|
|
43964
|
+
setHoverId(currentHoverId);
|
|
43965
|
+
}
|
|
43966
|
+
},
|
|
43967
|
+
children: [
|
|
43968
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43969
|
+
ContextMenuTrigger,
|
|
43050
43970
|
{
|
|
43051
|
-
|
|
43052
|
-
|
|
43053
|
-
|
|
43054
|
-
|
|
43055
|
-
|
|
43971
|
+
render: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43972
|
+
"div",
|
|
43973
|
+
{
|
|
43974
|
+
ref: (element) => {
|
|
43975
|
+
const key = sidebarNavigationItemKey({
|
|
43976
|
+
type: "project",
|
|
43977
|
+
id: project.id
|
|
43978
|
+
});
|
|
43979
|
+
if (element) {
|
|
43980
|
+
navigationItemRefs.current.set(key, element);
|
|
43981
|
+
} else {
|
|
43982
|
+
navigationItemRefs.current.delete(key);
|
|
43983
|
+
}
|
|
43984
|
+
},
|
|
43985
|
+
tabIndex: -1,
|
|
43986
|
+
role: "treeitem",
|
|
43987
|
+
"aria-level": 1,
|
|
43988
|
+
"aria-expanded": expanded,
|
|
43989
|
+
onClick: () => toggleProject(project.id),
|
|
43990
|
+
onKeyDown: (event) => handleNavigationKeyDown(event, {
|
|
43991
|
+
type: "project",
|
|
43992
|
+
id: project.id
|
|
43993
|
+
}),
|
|
43994
|
+
onPointerEnter: () => {
|
|
43995
|
+
hoveredTriggerIdRef.current = currentHoverId;
|
|
43996
|
+
},
|
|
43997
|
+
onPointerLeave: () => {
|
|
43998
|
+
hoveredTriggerIdRef.current = null;
|
|
43999
|
+
},
|
|
44000
|
+
className: cn$1(
|
|
44001
|
+
"flex h-7 cursor-default items-center gap-1.5 rounded-md px-1.5 text-xs font-normal transition-colors text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground/95 outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
44002
|
+
connectedSessions.length > 0 ? "text-sidebar-foreground/60" : "",
|
|
44003
|
+
hoverId === currentHoverId || contextMenuId === currentHoverId ? "bg-sidebar-accent" : ""
|
|
44004
|
+
)
|
|
44005
|
+
}
|
|
44006
|
+
),
|
|
44007
|
+
children: [
|
|
44008
|
+
expanded ? /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3.5" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(FolderClosed, { className: "size-3.5" }),
|
|
44009
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal font-normal uppercase select-none", children: project.title }),
|
|
44010
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44011
|
+
"button",
|
|
44012
|
+
{
|
|
44013
|
+
type: "button",
|
|
44014
|
+
onClick: (e) => {
|
|
44015
|
+
e.stopPropagation();
|
|
44016
|
+
openNewSessionDialog(project.id);
|
|
44017
|
+
},
|
|
44018
|
+
className: `flex size-4 items-center justify-center rounded-sm text-sidebar-foreground/40 hover:bg-sidebar-accent/25 hover:text-sidebar-foreground/70 transition-opacity duration-300 ${projectSessions.length === 0 ? "opacity-100" : "opacity-0 group-hover:opacity-100"}`,
|
|
44019
|
+
"aria-label": t("sidebar.createSessionInProject", {
|
|
44020
|
+
defaultValue: "Create session in {{title}}",
|
|
44021
|
+
title: project.title
|
|
44022
|
+
}),
|
|
44023
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, { className: "size-3.5" })
|
|
44024
|
+
}
|
|
44025
|
+
)
|
|
44026
|
+
]
|
|
43056
44027
|
}
|
|
43057
|
-
)
|
|
43058
|
-
|
|
43059
|
-
|
|
43060
|
-
|
|
43061
|
-
|
|
43062
|
-
|
|
43063
|
-
|
|
43064
|
-
|
|
43065
|
-
|
|
43066
|
-
|
|
43067
|
-
|
|
43068
|
-
|
|
43069
|
-
|
|
43070
|
-
|
|
43071
|
-
|
|
43072
|
-
|
|
43073
|
-
|
|
43074
|
-
|
|
43075
|
-
|
|
43076
|
-
|
|
43077
|
-
|
|
43078
|
-
|
|
43079
|
-
|
|
43080
|
-
|
|
43081
|
-
|
|
43082
|
-
|
|
43083
|
-
]
|
|
43084
|
-
}
|
|
43085
|
-
),
|
|
43086
|
-
!isWebUI && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43087
|
-
"button",
|
|
43088
|
-
{
|
|
43089
|
-
type: "button",
|
|
43090
|
-
onClick: () => void handleOpenProjectInEditor(project),
|
|
43091
|
-
className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
|
|
43092
|
-
children: [
|
|
43093
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Code, { className: "size-3 shrink-0" }),
|
|
44028
|
+
),
|
|
44029
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { className: "w-48", children: [
|
|
44030
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44031
|
+
ContextMenuItem,
|
|
44032
|
+
{
|
|
44033
|
+
onClick: () => openNewSessionDialog(project.id),
|
|
44034
|
+
className: "font-medium text-foreground",
|
|
44035
|
+
children: [
|
|
44036
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCirclePlus, { className: "size-3" }),
|
|
44037
|
+
t("sidebar.newSession", "New Session")
|
|
44038
|
+
]
|
|
44039
|
+
}
|
|
44040
|
+
),
|
|
44041
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
44042
|
+
!isWebUI && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44043
|
+
ContextMenuItem,
|
|
44044
|
+
{
|
|
44045
|
+
onClick: () => void handleRevealProjectInFinder(project),
|
|
44046
|
+
children: [
|
|
44047
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3" }),
|
|
44048
|
+
t("sidebar.revealInFinder")
|
|
44049
|
+
]
|
|
44050
|
+
}
|
|
44051
|
+
),
|
|
44052
|
+
!isWebUI && /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => void handleOpenProjectInEditor(project), children: [
|
|
44053
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Code, { className: "size-3" }),
|
|
43094
44054
|
t("filePanel.openInEditor", {
|
|
43095
44055
|
editor: EDITOR_LABELS[useAppStore.getState().editor.name] ?? "Editor"
|
|
43096
44056
|
})
|
|
43097
|
-
]
|
|
43098
|
-
|
|
43099
|
-
|
|
43100
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43101
|
-
"button",
|
|
43102
|
-
{
|
|
43103
|
-
type: "button",
|
|
43104
|
-
onClick: () => handleRenameProject(project),
|
|
43105
|
-
className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
|
|
43106
|
-
children: [
|
|
43107
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3 shrink-0" }),
|
|
44057
|
+
] }),
|
|
44058
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => void handleRenameProject(project), children: [
|
|
44059
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3" }),
|
|
43108
44060
|
t("sidebar.rename")
|
|
43109
|
-
]
|
|
43110
|
-
|
|
43111
|
-
|
|
43112
|
-
|
|
43113
|
-
"button",
|
|
43114
|
-
{
|
|
43115
|
-
type: "button",
|
|
43116
|
-
onClick: () => void handleDeleteProject(project),
|
|
43117
|
-
className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-destructive transition-colors hover:bg-destructive/10",
|
|
43118
|
-
children: [
|
|
43119
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3 shrink-0" }),
|
|
43120
|
-
t("sidebar.delete")
|
|
43121
|
-
]
|
|
43122
|
-
}
|
|
43123
|
-
)
|
|
43124
|
-
] })
|
|
43125
|
-
]
|
|
43126
|
-
}
|
|
43127
|
-
)
|
|
43128
|
-
]
|
|
43129
|
-
}
|
|
43130
|
-
),
|
|
43131
|
-
expanded && projectSessions.map((session2) => {
|
|
43132
|
-
const currentHoverId2 = sessionHoverId(session2.id);
|
|
43133
|
-
const agentLabel = configuredAgents.find((a) => a.id === session2.agentId)?.id || session2.agentId;
|
|
43134
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43135
|
-
HoverCard,
|
|
43136
|
-
{
|
|
43137
|
-
open: hoverId === currentHoverId2,
|
|
43138
|
-
onOpenChange: (open) => {
|
|
43139
|
-
if (!open && hoverId === currentHoverId2) {
|
|
43140
|
-
setHoverId(null);
|
|
43141
|
-
} else if (open && !hoverId) {
|
|
43142
|
-
setHoverId(currentHoverId2);
|
|
43143
|
-
}
|
|
43144
|
-
},
|
|
43145
|
-
children: [
|
|
43146
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(HoverCardTrigger, { render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}), delay: 1500, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43147
|
-
"div",
|
|
43148
|
-
{
|
|
43149
|
-
onClick: () => handleSelectSession(session2),
|
|
43150
|
-
onPointerEnter: () => {
|
|
43151
|
-
if (hoverId !== null) setHoverId(currentHoverId2);
|
|
43152
|
-
},
|
|
43153
|
-
onContextMenu: (e) => {
|
|
43154
|
-
e.preventDefault();
|
|
43155
|
-
setHoverId(currentHoverId2);
|
|
43156
|
-
},
|
|
43157
|
-
className: `group flex h-8 cursor-default items-center justify-between rounded-md pl-1.5 pr-2 text-xs font-normal transition-colors ${activeSessionId === session2.id ? "bg-sidebar-accent text-sidebar-accent-foreground" : "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground/95"} ${hoverId === currentHoverId2 ? "bg-sidebar-accent" : ""}`,
|
|
43158
|
-
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43159
|
-
"div",
|
|
43160
|
-
{
|
|
43161
|
-
className: cn$1(
|
|
43162
|
-
"flex min-w-0 flex-1 items-center gap-1.5",
|
|
43163
|
-
session2.connectionStatus === "connected" ? "" : "opacity-60"
|
|
43164
|
-
),
|
|
43165
|
-
children: [
|
|
43166
|
-
(() => {
|
|
43167
|
-
const state = sessionStates.get(session2.id);
|
|
43168
|
-
const hasAskUser = (state?.askUserRequests?.length ?? 0) > 0;
|
|
43169
|
-
const isStreaming = session2.isStreaming;
|
|
43170
|
-
const completedStatus = state?.completedStatus;
|
|
43171
|
-
if (hasAskUser) {
|
|
43172
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleQuestionMark, { className: "size-3 shrink-0 text-sky-500" });
|
|
43173
|
-
}
|
|
43174
|
-
if (isStreaming) {
|
|
43175
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin shrink-0" });
|
|
43176
|
-
}
|
|
43177
|
-
if (completedStatus === "success" || state?.completedAt && !completedStatus) {
|
|
43178
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 shrink-0 text-green-500" });
|
|
43179
|
-
}
|
|
43180
|
-
if (completedStatus === "error") {
|
|
43181
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3 shrink-0 text-yellow-500" });
|
|
43182
|
-
}
|
|
43183
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-3 shrink-0" });
|
|
43184
|
-
})(),
|
|
43185
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43186
|
-
Badge,
|
|
44061
|
+
] }),
|
|
44062
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
44063
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44064
|
+
ContextMenuItem,
|
|
43187
44065
|
{
|
|
43188
|
-
variant: "
|
|
43189
|
-
|
|
43190
|
-
children:
|
|
44066
|
+
variant: "destructive",
|
|
44067
|
+
onClick: () => void handleDeleteProject(project),
|
|
44068
|
+
children: [
|
|
44069
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3" }),
|
|
44070
|
+
t("sidebar.deleteProject")
|
|
44071
|
+
]
|
|
43191
44072
|
}
|
|
43192
|
-
)
|
|
43193
|
-
|
|
43194
|
-
|
|
43195
|
-
|
|
43196
|
-
|
|
43197
|
-
|
|
43198
|
-
|
|
43199
|
-
|
|
43200
|
-
|
|
43201
|
-
|
|
43202
|
-
|
|
43203
|
-
|
|
43204
|
-
|
|
43205
|
-
|
|
43206
|
-
|
|
43207
|
-
className: "max-w-60 min-w-48 w-auto p-3",
|
|
43208
|
-
children: [
|
|
43209
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
43210
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium leading-snug", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: session2.title || t("sidebar.newChat", "New Chat") }) }),
|
|
43211
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
|
|
43212
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Bot, { className: "size-3 shrink-0" }),
|
|
43213
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: session2.agentId })
|
|
43214
|
-
] }),
|
|
44073
|
+
)
|
|
44074
|
+
] })
|
|
44075
|
+
]
|
|
44076
|
+
}
|
|
44077
|
+
) }),
|
|
44078
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44079
|
+
HoverCardContent,
|
|
44080
|
+
{
|
|
44081
|
+
side: "right",
|
|
44082
|
+
align: "start",
|
|
44083
|
+
sideOffset: 12,
|
|
44084
|
+
alignOffset: 0,
|
|
44085
|
+
className: "w-54 max-w-[20vw] p-3",
|
|
44086
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
44087
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium leading-snug line-clamp-2 wrap-break-word", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: project.title }) }),
|
|
43215
44088
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
|
|
43216
44089
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-3 shrink-0" }),
|
|
43217
|
-
isWebUI ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: project.
|
|
44090
|
+
isWebUI ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", title: project.cwd, children: project.cwd }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43218
44091
|
"button",
|
|
43219
44092
|
{
|
|
43220
44093
|
type: "button",
|
|
43221
44094
|
onClick: () => void handleRevealProjectInFinder(project),
|
|
43222
44095
|
title: project.cwd,
|
|
43223
44096
|
className: "min-w-0 flex-1 truncate text-left transition-colors hover:text-foreground",
|
|
43224
|
-
children: project.
|
|
44097
|
+
children: project.cwd
|
|
43225
44098
|
}
|
|
43226
44099
|
)
|
|
43227
44100
|
] }),
|
|
43228
44101
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
|
|
43229
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
43230
|
-
/* @__PURE__ */ jsxRuntimeExports.
|
|
43231
|
-
|
|
43232
|
-
|
|
43233
|
-
":"
|
|
43234
|
-
] }),
|
|
43235
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatRelativeTime(session2.updatedAt, i18n.language) })
|
|
43236
|
-
] })
|
|
44102
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0" }),
|
|
44103
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: t("sidebar.sessionCount", "{{count}} sessions", {
|
|
44104
|
+
count: projectSessions.length
|
|
44105
|
+
}) })
|
|
43237
44106
|
] }),
|
|
43238
44107
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
|
|
43239
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44108
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3 shrink-0" }),
|
|
43240
44109
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "truncate", children: [
|
|
43241
44110
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mr-1", children: [
|
|
43242
|
-
t(
|
|
44111
|
+
t(
|
|
44112
|
+
projectSessions.length > 0 ? "sidebar.updated" : "sidebar.created",
|
|
44113
|
+
projectSessions.length > 0 ? "Updated" : "Created"
|
|
44114
|
+
),
|
|
43243
44115
|
":"
|
|
43244
44116
|
] }),
|
|
43245
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatRelativeTime(
|
|
44117
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatRelativeTime(latestProjectUpdateAt, i18n.language) })
|
|
43246
44118
|
] })
|
|
43247
44119
|
] })
|
|
43248
|
-
] }),
|
|
43249
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Separator, { className: "my-2.5" }),
|
|
43250
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col -mx-2 -my-1", children: [
|
|
43251
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43252
|
-
"button",
|
|
43253
|
-
{
|
|
43254
|
-
type: "button",
|
|
43255
|
-
onClick: () => handleRenameSession(session2),
|
|
43256
|
-
className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
|
|
43257
|
-
children: [
|
|
43258
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3 shrink-0" }),
|
|
43259
|
-
t("sidebar.rename")
|
|
43260
|
-
]
|
|
43261
|
-
}
|
|
43262
|
-
),
|
|
43263
|
-
ilinkStatus.connected && activeIlinkSessionId !== session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43264
|
-
"button",
|
|
43265
|
-
{
|
|
43266
|
-
type: "button",
|
|
43267
|
-
onClick: () => {
|
|
43268
|
-
request.setActiveIlinkSession({ sessionId: session2.id }).catch(() => {
|
|
43269
|
-
});
|
|
43270
|
-
},
|
|
43271
|
-
className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
|
|
43272
|
-
children: [
|
|
43273
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0" }),
|
|
43274
|
-
t("sidebar.ilinkSetActive", "Set as WeChat Active")
|
|
43275
|
-
]
|
|
43276
|
-
}
|
|
43277
|
-
),
|
|
43278
|
-
ilinkStatus.connected && activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43279
|
-
"button",
|
|
43280
|
-
{
|
|
43281
|
-
type: "button",
|
|
43282
|
-
onClick: () => {
|
|
43283
|
-
request.setActiveIlinkSession({ sessionId: "" }).catch(() => {
|
|
43284
|
-
});
|
|
43285
|
-
},
|
|
43286
|
-
className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
|
|
43287
|
-
children: [
|
|
43288
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0 text-green-500" }),
|
|
43289
|
-
t("sidebar.ilinkUnsetActive", "Unset WeChat Active")
|
|
43290
|
-
]
|
|
43291
|
-
}
|
|
43292
|
-
),
|
|
43293
|
-
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43294
|
-
"button",
|
|
43295
|
-
{
|
|
43296
|
-
type: "button",
|
|
43297
|
-
onClick: () => void handleDeleteSession(session2),
|
|
43298
|
-
className: "flex h-7 items-center gap-2 rounded-md px-2 text-xs text-destructive transition-colors hover:bg-destructive/10",
|
|
43299
|
-
children: [
|
|
43300
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3 shrink-0" }),
|
|
43301
|
-
t("sidebar.delete")
|
|
43302
|
-
]
|
|
43303
|
-
}
|
|
43304
|
-
)
|
|
43305
44120
|
] })
|
|
43306
|
-
|
|
43307
|
-
|
|
43308
|
-
|
|
43309
|
-
|
|
43310
|
-
|
|
43311
|
-
session2
|
|
43312
|
-
|
|
44121
|
+
}
|
|
44122
|
+
)
|
|
44123
|
+
]
|
|
44124
|
+
}
|
|
44125
|
+
),
|
|
44126
|
+
expanded && projectSessions.map((session2) => {
|
|
44127
|
+
const currentHoverId2 = sessionHoverId(session2.id);
|
|
44128
|
+
const agentLabel = configuredAgents.find((a) => a.id === session2.agentId)?.id || session2.agentId;
|
|
44129
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44130
|
+
HoverCard,
|
|
44131
|
+
{
|
|
44132
|
+
open: hoverId === currentHoverId2,
|
|
44133
|
+
onOpenChange: (open) => {
|
|
44134
|
+
if (open) {
|
|
44135
|
+
if (contextMenuId === null) setHoverId(currentHoverId2);
|
|
44136
|
+
} else if (hoverId === currentHoverId2 && hoveredTriggerIdRef.current !== currentHoverId2) {
|
|
44137
|
+
setHoverId(null);
|
|
44138
|
+
}
|
|
44139
|
+
},
|
|
44140
|
+
children: [
|
|
44141
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(HoverCardTrigger, { render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}), delay: 0, closeDelay: 100, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44142
|
+
ContextMenu,
|
|
44143
|
+
{
|
|
44144
|
+
onOpenChange: (open) => {
|
|
44145
|
+
setContextMenuId(open ? currentHoverId2 : null);
|
|
44146
|
+
if (open) {
|
|
44147
|
+
setHoverId(null);
|
|
44148
|
+
} else if (hoveredTriggerIdRef.current === currentHoverId2) {
|
|
44149
|
+
setHoverId(currentHoverId2);
|
|
44150
|
+
}
|
|
44151
|
+
},
|
|
44152
|
+
children: [
|
|
44153
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44154
|
+
ContextMenuTrigger,
|
|
44155
|
+
{
|
|
44156
|
+
render: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44157
|
+
"div",
|
|
44158
|
+
{
|
|
44159
|
+
ref: (element) => {
|
|
44160
|
+
const key = sidebarNavigationItemKey({
|
|
44161
|
+
type: "session",
|
|
44162
|
+
id: session2.id,
|
|
44163
|
+
projectId: project.id
|
|
44164
|
+
});
|
|
44165
|
+
if (element) {
|
|
44166
|
+
navigationItemRefs.current.set(key, element);
|
|
44167
|
+
} else {
|
|
44168
|
+
navigationItemRefs.current.delete(key);
|
|
44169
|
+
}
|
|
44170
|
+
},
|
|
44171
|
+
tabIndex: -1,
|
|
44172
|
+
role: "treeitem",
|
|
44173
|
+
"aria-level": 2,
|
|
44174
|
+
"aria-current": activeSessionId === session2.id ? "page" : void 0,
|
|
44175
|
+
onClick: () => handleSelectSession(session2),
|
|
44176
|
+
onKeyDown: (event) => handleNavigationKeyDown(event, {
|
|
44177
|
+
type: "session",
|
|
44178
|
+
id: session2.id,
|
|
44179
|
+
projectId: project.id
|
|
44180
|
+
}),
|
|
44181
|
+
onPointerEnter: () => {
|
|
44182
|
+
hoveredTriggerIdRef.current = currentHoverId2;
|
|
44183
|
+
},
|
|
44184
|
+
onPointerLeave: () => {
|
|
44185
|
+
hoveredTriggerIdRef.current = null;
|
|
44186
|
+
},
|
|
44187
|
+
className: `group flex h-7 cursor-default items-center justify-between rounded-md pl-1.5 pr-2 text-xs font-normal transition-colors outline-none focus-visible:ring-1 focus-visible:ring-ring ${activeSessionId === session2.id ? "bg-sidebar-accent text-sidebar-accent-foreground" : "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground/95"} ${hoverId === currentHoverId2 || contextMenuId === currentHoverId2 ? "bg-sidebar-accent" : ""}`
|
|
44188
|
+
}
|
|
44189
|
+
),
|
|
44190
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44191
|
+
"div",
|
|
44192
|
+
{
|
|
44193
|
+
className: cn$1(
|
|
44194
|
+
"flex min-w-0 flex-1 items-center gap-1.5",
|
|
44195
|
+
session2.connectionStatus === "connected" ? "" : "opacity-60"
|
|
44196
|
+
),
|
|
44197
|
+
children: [
|
|
44198
|
+
(() => {
|
|
44199
|
+
const state = sessionStates.get(session2.id);
|
|
44200
|
+
const hasAskUser = (state?.askUserRequests?.length ?? 0) > 0;
|
|
44201
|
+
const isStreaming = session2.isStreaming;
|
|
44202
|
+
const completedStatus = state?.completedStatus;
|
|
44203
|
+
if (hasAskUser) {
|
|
44204
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleQuestionMark, { className: "size-3 shrink-0 text-sky-500" });
|
|
44205
|
+
}
|
|
44206
|
+
if (isStreaming) {
|
|
44207
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin shrink-0" });
|
|
44208
|
+
}
|
|
44209
|
+
if (completedStatus === "success" || state?.completedAt && !completedStatus) {
|
|
44210
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-3 shrink-0 text-green-500" });
|
|
44211
|
+
}
|
|
44212
|
+
if (completedStatus === "error") {
|
|
44213
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(TriangleAlert, { className: "size-3 shrink-0 text-yellow-500" });
|
|
44214
|
+
}
|
|
44215
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-3 shrink-0" });
|
|
44216
|
+
})(),
|
|
44217
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44218
|
+
Badge,
|
|
44219
|
+
{
|
|
44220
|
+
variant: "outline",
|
|
44221
|
+
className: "px-1 -ml-0.5 text-[10px] uppercase select-none max-w-24",
|
|
44222
|
+
children: agentLabel
|
|
44223
|
+
}
|
|
44224
|
+
),
|
|
44225
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "min-w-0 flex-1 truncate leading-normal select-none", children: session2.title || t("sidebar.newSession", "New Session") }),
|
|
44226
|
+
activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 shrink-0 text-green-500" })
|
|
44227
|
+
]
|
|
44228
|
+
}
|
|
44229
|
+
)
|
|
44230
|
+
}
|
|
44231
|
+
),
|
|
44232
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { className: "w-48", children: [
|
|
44233
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44234
|
+
ContextMenuItem,
|
|
44235
|
+
{
|
|
44236
|
+
onClick: () => handleSelectSession(session2),
|
|
44237
|
+
className: "font-medium text-foreground",
|
|
44238
|
+
children: [
|
|
44239
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Eye, { className: "size-3" }),
|
|
44240
|
+
t("sidebar.viewSession", "View Session")
|
|
44241
|
+
]
|
|
44242
|
+
}
|
|
44243
|
+
),
|
|
44244
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
44245
|
+
!isWebUI && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44246
|
+
ContextMenuItem,
|
|
44247
|
+
{
|
|
44248
|
+
onClick: () => void handleRevealProjectInFinder(project),
|
|
44249
|
+
children: [
|
|
44250
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3" }),
|
|
44251
|
+
t("sidebar.revealInFinder")
|
|
44252
|
+
]
|
|
44253
|
+
}
|
|
44254
|
+
),
|
|
44255
|
+
!isWebUI && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44256
|
+
ContextMenuItem,
|
|
44257
|
+
{
|
|
44258
|
+
onClick: () => void handleOpenProjectInEditor(project),
|
|
44259
|
+
children: [
|
|
44260
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Code, { className: "size-3" }),
|
|
44261
|
+
t("filePanel.openInEditor", {
|
|
44262
|
+
editor: EDITOR_LABELS[useAppStore.getState().editor.name] ?? "Editor"
|
|
44263
|
+
})
|
|
44264
|
+
]
|
|
44265
|
+
}
|
|
44266
|
+
),
|
|
44267
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => handleRenameSession(session2), children: [
|
|
44268
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Pencil, { className: "size-3" }),
|
|
44269
|
+
t("sidebar.rename")
|
|
44270
|
+
] }),
|
|
44271
|
+
ilinkStatus.connected && activeIlinkSessionId !== session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44272
|
+
ContextMenuItem,
|
|
44273
|
+
{
|
|
44274
|
+
onClick: () => void handleSetActiveIlinkSession(session2.id),
|
|
44275
|
+
children: [
|
|
44276
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3" }),
|
|
44277
|
+
t("sidebar.ilinkSetActive", "Set as WeChat Active")
|
|
44278
|
+
]
|
|
44279
|
+
}
|
|
44280
|
+
),
|
|
44281
|
+
ilinkStatus.connected && activeIlinkSessionId === session2.id && /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44282
|
+
ContextMenuItem,
|
|
44283
|
+
{
|
|
44284
|
+
onClick: () => void handleSetActiveIlinkSession(""),
|
|
44285
|
+
children: [
|
|
44286
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "size-3 text-green-500" }),
|
|
44287
|
+
t("sidebar.ilinkUnsetActive", "Unset WeChat Active")
|
|
44288
|
+
]
|
|
44289
|
+
}
|
|
44290
|
+
),
|
|
44291
|
+
session2.connectionStatus === "connected" && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
44292
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
44293
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44294
|
+
ContextMenuItem,
|
|
44295
|
+
{
|
|
44296
|
+
onClick: () => void handleRestartSession(session2),
|
|
44297
|
+
disabled: sessionAction !== null,
|
|
44298
|
+
children: [
|
|
44299
|
+
sessionAction?.id === session2.id && sessionAction.type === "restart" ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-3" }),
|
|
44300
|
+
t("sidebar.restartSession", "Restart Session")
|
|
44301
|
+
]
|
|
44302
|
+
}
|
|
44303
|
+
),
|
|
44304
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44305
|
+
ContextMenuItem,
|
|
44306
|
+
{
|
|
44307
|
+
onClick: () => void handleCloseSession(session2),
|
|
44308
|
+
disabled: sessionAction !== null,
|
|
44309
|
+
children: [
|
|
44310
|
+
sessionAction?.id === session2.id && sessionAction.type === "close" ? /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Power, { className: "size-3" }),
|
|
44311
|
+
sessionAction?.id === session2.id && sessionAction.type === "close" ? t("sidebar.closingSession", "Closing…") : t("sidebar.closeSession", "Close Session")
|
|
44312
|
+
]
|
|
44313
|
+
}
|
|
44314
|
+
)
|
|
44315
|
+
] }),
|
|
44316
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
|
|
44317
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
44318
|
+
ContextMenuItem,
|
|
44319
|
+
{
|
|
44320
|
+
variant: "destructive",
|
|
44321
|
+
onClick: () => void handleDeleteSession(session2),
|
|
44322
|
+
disabled: sessionAction !== null,
|
|
44323
|
+
children: [
|
|
44324
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3" }),
|
|
44325
|
+
t("sidebar.deleteSession")
|
|
44326
|
+
]
|
|
44327
|
+
}
|
|
44328
|
+
)
|
|
44329
|
+
] })
|
|
44330
|
+
]
|
|
44331
|
+
}
|
|
44332
|
+
) }),
|
|
44333
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44334
|
+
HoverCardContent,
|
|
44335
|
+
{
|
|
44336
|
+
side: "right",
|
|
44337
|
+
align: "start",
|
|
44338
|
+
sideOffset: 12,
|
|
44339
|
+
alignOffset: 0,
|
|
44340
|
+
className: "w-54 max-w-[20vw] p-3",
|
|
44341
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
44342
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm font-medium leading-snug line-clamp-2 wrap-break-word", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: session2.title || t("sidebar.newSession", "New Session") }) }),
|
|
44343
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
|
|
44344
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Bot, { className: "size-3 shrink-0" }),
|
|
44345
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: session2.agentId })
|
|
44346
|
+
] }),
|
|
44347
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
|
|
44348
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Folder, { className: "size-3 shrink-0" }),
|
|
44349
|
+
isWebUI ? /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: project.title }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44350
|
+
"button",
|
|
44351
|
+
{
|
|
44352
|
+
type: "button",
|
|
44353
|
+
onClick: () => void handleRevealProjectInFinder(project),
|
|
44354
|
+
title: project.cwd,
|
|
44355
|
+
className: "min-w-0 flex-1 truncate text-left transition-colors hover:text-foreground",
|
|
44356
|
+
children: project.title
|
|
44357
|
+
}
|
|
44358
|
+
)
|
|
44359
|
+
] }),
|
|
44360
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
|
|
44361
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "size-3 shrink-0" }),
|
|
44362
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "truncate", children: [
|
|
44363
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mr-1", children: [
|
|
44364
|
+
t("sidebar.updated", "Updated"),
|
|
44365
|
+
":"
|
|
44366
|
+
] }),
|
|
44367
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatRelativeTime(session2.updatedAt, i18n.language) })
|
|
44368
|
+
] })
|
|
44369
|
+
] }),
|
|
44370
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
|
|
44371
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(CalendarDays, { className: "size-3 shrink-0" }),
|
|
44372
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "truncate", children: [
|
|
44373
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "mr-1", children: [
|
|
44374
|
+
t("sidebar.created", "Created"),
|
|
44375
|
+
":"
|
|
44376
|
+
] }),
|
|
44377
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: formatRelativeTime(session2.createdAt, i18n.language) })
|
|
44378
|
+
] })
|
|
44379
|
+
] }),
|
|
44380
|
+
ilinkStatus.connected && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground py-px", children: [
|
|
44381
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44382
|
+
MessageCircle,
|
|
44383
|
+
{
|
|
44384
|
+
className: cn$1(
|
|
44385
|
+
"size-3 shrink-0",
|
|
44386
|
+
activeIlinkSessionId === session2.id && "text-green-500"
|
|
44387
|
+
)
|
|
44388
|
+
}
|
|
44389
|
+
),
|
|
44390
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44391
|
+
"button",
|
|
44392
|
+
{
|
|
44393
|
+
type: "button",
|
|
44394
|
+
onClick: () => void handleSetActiveIlinkSession(
|
|
44395
|
+
activeIlinkSessionId === session2.id ? "" : session2.id
|
|
44396
|
+
),
|
|
44397
|
+
className: "min-w-0 flex-1 truncate text-left transition-colors hover:text-foreground",
|
|
44398
|
+
children: t(
|
|
44399
|
+
activeIlinkSessionId === session2.id ? "sidebar.ilinkActiveStatus" : "sidebar.ilinkInactiveStatus",
|
|
44400
|
+
activeIlinkSessionId === session2.id ? "WeChat Active" : "Not WeChat Active"
|
|
44401
|
+
)
|
|
44402
|
+
}
|
|
44403
|
+
)
|
|
44404
|
+
] })
|
|
44405
|
+
] })
|
|
44406
|
+
}
|
|
44407
|
+
)
|
|
44408
|
+
]
|
|
44409
|
+
},
|
|
44410
|
+
session2.id
|
|
44411
|
+
);
|
|
44412
|
+
})
|
|
44413
|
+
] }, project.id);
|
|
43313
44414
|
})
|
|
43314
|
-
|
|
43315
|
-
|
|
44415
|
+
}
|
|
44416
|
+
) }),
|
|
43316
44417
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-auto border-t border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
43317
44418
|
Button,
|
|
43318
44419
|
{
|
|
@@ -43522,9 +44623,10 @@ function Sidebar() {
|
|
|
43522
44623
|
Button,
|
|
43523
44624
|
{
|
|
43524
44625
|
size: "sm",
|
|
43525
|
-
className: "h-8 text-xs",
|
|
44626
|
+
className: "h-8 text-xs focus:border-ring focus:ring-1 focus:ring-ring/50",
|
|
43526
44627
|
variant: "default",
|
|
43527
44628
|
disabled: creating,
|
|
44629
|
+
autoFocus: true,
|
|
43528
44630
|
onClick: handleCreateNewSession,
|
|
43529
44631
|
children: [
|
|
43530
44632
|
creating && /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin" }),
|
|
@@ -43752,7 +44854,7 @@ function Welcome() {
|
|
|
43752
44854
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "absolute bottom-3 right-4 text-[11px] text-muted-foreground/40 z-10 pointer-events-none", children: [
|
|
43753
44855
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [
|
|
43754
44856
|
"v",
|
|
43755
|
-
"0.1.
|
|
44857
|
+
"0.1.54"
|
|
43756
44858
|
] }),
|
|
43757
44859
|
false
|
|
43758
44860
|
] }),
|
|
@@ -43914,55 +45016,63 @@ function Welcome() {
|
|
|
43914
45016
|
function lazyNamed(loader, name) {
|
|
43915
45017
|
return reactExports.lazy(() => loader().then((mod) => ({ default: mod[name] })));
|
|
43916
45018
|
}
|
|
43917
|
-
const Session = lazyNamed(() => __vitePreload(() => import("./session-
|
|
45019
|
+
const Session = lazyNamed(() => __vitePreload(() => import("./session-C_1BpGhU.js"), true ? __vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]) : void 0, import.meta.url), "Session");
|
|
43918
45020
|
const SettingsLayout = lazyNamed(
|
|
43919
|
-
() => __vitePreload(() => import("./settings-layout-
|
|
45021
|
+
() => __vitePreload(() => import("./settings-layout-SBihzFfb.js"), true ? __vite__mapDeps([18,19,10,14]) : void 0, import.meta.url),
|
|
43920
45022
|
"SettingsLayout"
|
|
43921
45023
|
);
|
|
43922
45024
|
const SettingsGeneral = lazyNamed(
|
|
43923
|
-
() => __vitePreload(() => import("./settings-general-
|
|
45025
|
+
() => __vitePreload(() => import("./settings-general-cHqsKFFa.js"), true ? __vite__mapDeps([20,21]) : void 0, import.meta.url),
|
|
43924
45026
|
"SettingsGeneral"
|
|
43925
45027
|
);
|
|
45028
|
+
const SettingsShortcuts = lazyNamed(
|
|
45029
|
+
() => __vitePreload(() => import("./settings-shortcuts-C1s7YIMj.js"), true ? __vite__mapDeps([22,19,13,15]) : void 0, import.meta.url),
|
|
45030
|
+
"SettingsShortcuts"
|
|
45031
|
+
);
|
|
43926
45032
|
const SettingsAgents = lazyNamed(
|
|
43927
|
-
() => __vitePreload(() => import("./settings-agents-
|
|
45033
|
+
() => __vitePreload(() => import("./settings-agents-BtuYXQ1V.js"), true ? __vite__mapDeps([23,24,25,26,27,21,11,9,16,28]) : void 0, import.meta.url),
|
|
43928
45034
|
"SettingsAgents"
|
|
43929
45035
|
);
|
|
43930
45036
|
const SettingsMcp = lazyNamed(
|
|
43931
|
-
() => __vitePreload(() => import("./settings-mcp-
|
|
45037
|
+
() => __vitePreload(() => import("./settings-mcp-Co88s-0y.js"), true ? __vite__mapDeps([29,24,25,26,27,21,9,16]) : void 0, import.meta.url),
|
|
43932
45038
|
"SettingsMcp"
|
|
43933
45039
|
);
|
|
43934
45040
|
const SettingsWebUI = lazyNamed(
|
|
43935
|
-
() => __vitePreload(() => import("./settings-webui-
|
|
45041
|
+
() => __vitePreload(() => import("./settings-webui-Bj9dJDcm.js"), true ? __vite__mapDeps([30,24]) : void 0, import.meta.url),
|
|
43936
45042
|
"SettingsWebUI"
|
|
43937
45043
|
);
|
|
43938
45044
|
const SettingsILink = lazyNamed(
|
|
43939
|
-
() => __vitePreload(() => import("./settings-ilink-
|
|
45045
|
+
() => __vitePreload(() => import("./settings-ilink-BR1Vd9t9.js"), true ? __vite__mapDeps([31,24,7]) : void 0, import.meta.url),
|
|
43940
45046
|
"SettingsILink"
|
|
43941
45047
|
);
|
|
43942
45048
|
const SettingsSnippets = lazyNamed(
|
|
43943
|
-
() => __vitePreload(() => import("./settings-snippets-
|
|
45049
|
+
() => __vitePreload(() => import("./settings-snippets-DGgI6mxm.js"), true ? __vite__mapDeps([32,26,27,21,9,25,16]) : void 0, import.meta.url),
|
|
43944
45050
|
"SettingsSnippets"
|
|
43945
45051
|
);
|
|
43946
45052
|
const SettingsMemory = lazyNamed(
|
|
43947
|
-
() => __vitePreload(() => import("./settings-memory-
|
|
45053
|
+
() => __vitePreload(() => import("./settings-memory-CNH9gHYC.js"), true ? __vite__mapDeps([33,4]) : void 0, import.meta.url),
|
|
43948
45054
|
"SettingsMemory"
|
|
43949
45055
|
);
|
|
43950
45056
|
const SettingsImageGeneration = lazyNamed(
|
|
43951
|
-
() => __vitePreload(() => import("./settings-image-generation-
|
|
45057
|
+
() => __vitePreload(() => import("./settings-image-generation-MUHYnpbm.js"), true ? __vite__mapDeps([34,26,27,21,16,11,9]) : void 0, import.meta.url),
|
|
43952
45058
|
"SettingsImageGeneration"
|
|
43953
45059
|
);
|
|
43954
|
-
const
|
|
45060
|
+
const SettingsSpeechToText = lazyNamed(
|
|
45061
|
+
() => __vitePreload(() => import("./settings-speech-to-text-CV0xM7yz.js"), true ? __vite__mapDeps([35,26,21,24,9,16]) : void 0, import.meta.url),
|
|
45062
|
+
"SettingsSpeechToText"
|
|
45063
|
+
);
|
|
45064
|
+
const SkillsLayout = lazyNamed(() => __vitePreload(() => import("./skills-layout-DZFDa1cw.js"), true ? __vite__mapDeps([36,37]) : void 0, import.meta.url), "SkillsLayout");
|
|
43955
45065
|
const SkillsInstalled = lazyNamed(
|
|
43956
|
-
() => __vitePreload(() => import("./skills-installed-
|
|
45066
|
+
() => __vitePreload(() => import("./skills-installed-Bhd5a33I.js"), true ? __vite__mapDeps([38,3,5,6]) : void 0, import.meta.url),
|
|
43957
45067
|
"SkillsInstalled"
|
|
43958
45068
|
);
|
|
43959
45069
|
const SkillsSh = lazyNamed(
|
|
43960
|
-
() => __vitePreload(() => import("./skills-skills-sh-
|
|
45070
|
+
() => __vitePreload(() => import("./skills-skills-sh-DF59nekm.js"), true ? __vite__mapDeps([39,5,8,37]) : void 0, import.meta.url),
|
|
43961
45071
|
"SkillsSh"
|
|
43962
45072
|
);
|
|
43963
|
-
const Automation = lazyNamed(() => __vitePreload(() => import("./automation-
|
|
43964
|
-
const Schedule = lazyNamed(() => __vitePreload(() => import("./schedule-
|
|
43965
|
-
const Task = lazyNamed(() => __vitePreload(() => import("./task-
|
|
45073
|
+
const Automation = lazyNamed(() => __vitePreload(() => import("./automation-CQAOpWYp.js"), true ? __vite__mapDeps([40,5,41,27,21,16,1]) : void 0, import.meta.url), "Automation");
|
|
45074
|
+
const Schedule = lazyNamed(() => __vitePreload(() => import("./schedule-BtuArq_x.js"), true ? __vite__mapDeps([42,17,41,27,21,15,1,6,28]) : void 0, import.meta.url), "Schedule");
|
|
45075
|
+
const Task = lazyNamed(() => __vitePreload(() => import("./task-C7tCZ6e3.js"), true ? __vite__mapDeps([43,17,3,2,4,5,6,7,8,9,10,11,12]) : void 0, import.meta.url), "Task");
|
|
43966
45076
|
function SessionWrapper() {
|
|
43967
45077
|
const { sessionId } = useParams();
|
|
43968
45078
|
const sessionInfo = useAppStore((s) => s.sessions.find((x2) => x2.id === sessionId));
|
|
@@ -43990,13 +45100,15 @@ function AppRouter() {
|
|
|
43990
45100
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "/session-view/:sessionId", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SessionWrapper, {}) }),
|
|
43991
45101
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(Route, { path: "/settings", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsLayout, {}), children: [
|
|
43992
45102
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "general", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsGeneral, {}) }),
|
|
45103
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "shortcuts", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsShortcuts, {}) }),
|
|
43993
45104
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "agents", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsAgents, {}) }),
|
|
43994
45105
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "mcp", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsMcp, {}) }),
|
|
43995
45106
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "webui", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsWebUI, {}) }),
|
|
43996
45107
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "ilink", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsILink, {}) }),
|
|
43997
45108
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "snippets", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsSnippets, {}) }),
|
|
43998
45109
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "memory", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsMemory, {}) }),
|
|
43999
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "image-generation", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsImageGeneration, {}) })
|
|
45110
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "image-generation", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsImageGeneration, {}) }),
|
|
45111
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "speech-to-text", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsSpeechToText, {}) })
|
|
44000
45112
|
] }),
|
|
44001
45113
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(Route, { path: "/skills", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsLayout, {}), children: [
|
|
44002
45114
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "installed", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsInstalled, {}) }),
|
|
@@ -44009,8 +45121,8 @@ function AppRouter() {
|
|
|
44009
45121
|
"div",
|
|
44010
45122
|
{
|
|
44011
45123
|
className: cn$1(
|
|
44012
|
-
"flex h-12 w-12 absolute z-10 top-0 items-center justify-center transition-
|
|
44013
|
-
sidebarOpen ? "left-49" : showMacTrafficLightSpace ? "left-16" : "left-0"
|
|
45124
|
+
"flex h-12 w-12 absolute z-10 top-0 items-center justify-center transition-all duration-200",
|
|
45125
|
+
sidebarOpen ? "left-49 -ml-px" : showMacTrafficLightSpace ? "left-16" : "left-0"
|
|
44014
45126
|
),
|
|
44015
45127
|
style: { WebkitAppRegion: "no-drag" },
|
|
44016
45128
|
children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
@@ -44030,6 +45142,181 @@ function AppRouter() {
|
|
|
44030
45142
|
)
|
|
44031
45143
|
] });
|
|
44032
45144
|
}
|
|
45145
|
+
const COMMAND_DEFINITIONS = [
|
|
45146
|
+
{
|
|
45147
|
+
id: "focus.chatInput",
|
|
45148
|
+
category: "navigation",
|
|
45149
|
+
titleKey: "commands.focusChatInput.title",
|
|
45150
|
+
descriptionKey: "commands.focusChatInput.description",
|
|
45151
|
+
defaultShortcuts: ["Mod+Shift+I"],
|
|
45152
|
+
ignoreInputs: false,
|
|
45153
|
+
focusTargets: ["chat-input", "ask-user-dialog"]
|
|
45154
|
+
},
|
|
45155
|
+
{
|
|
45156
|
+
id: "focus.chatArea",
|
|
45157
|
+
category: "navigation",
|
|
45158
|
+
titleKey: "commands.focusChatArea.title",
|
|
45159
|
+
descriptionKey: "commands.focusChatArea.description",
|
|
45160
|
+
defaultShortcuts: ["Mod+Shift+M"],
|
|
45161
|
+
ignoreInputs: false,
|
|
45162
|
+
focusTargets: ["chat-area"]
|
|
45163
|
+
},
|
|
45164
|
+
{
|
|
45165
|
+
id: "focus.fileTree",
|
|
45166
|
+
category: "navigation",
|
|
45167
|
+
titleKey: "commands.focusFileTree.title",
|
|
45168
|
+
descriptionKey: "commands.focusFileTree.description",
|
|
45169
|
+
defaultShortcuts: ["Mod+Shift+D"],
|
|
45170
|
+
ignoreInputs: false,
|
|
45171
|
+
focusTargets: ["file-tree"]
|
|
45172
|
+
},
|
|
45173
|
+
{
|
|
45174
|
+
id: "focus.terminalList",
|
|
45175
|
+
category: "navigation",
|
|
45176
|
+
titleKey: "commands.focusTerminalList.title",
|
|
45177
|
+
descriptionKey: "commands.focusTerminalList.description",
|
|
45178
|
+
defaultShortcuts: ["Mod+Shift+T"],
|
|
45179
|
+
ignoreInputs: false,
|
|
45180
|
+
focusTargets: ["terminal-list"]
|
|
45181
|
+
},
|
|
45182
|
+
{
|
|
45183
|
+
id: "focus.sidebarSessions",
|
|
45184
|
+
category: "navigation",
|
|
45185
|
+
titleKey: "commands.focusSidebarSessions.title",
|
|
45186
|
+
descriptionKey: "commands.focusSidebarSessions.description",
|
|
45187
|
+
defaultShortcuts: ["Mod+Shift+E"],
|
|
45188
|
+
ignoreInputs: false,
|
|
45189
|
+
focusTargets: ["sidebar-sessions"]
|
|
45190
|
+
}
|
|
45191
|
+
];
|
|
45192
|
+
function createAppCommands(focus) {
|
|
45193
|
+
return COMMAND_DEFINITIONS.map((definition) => ({
|
|
45194
|
+
...definition,
|
|
45195
|
+
execute: () => {
|
|
45196
|
+
for (const target of definition.focusTargets ?? []) {
|
|
45197
|
+
if (focus(target)) break;
|
|
45198
|
+
}
|
|
45199
|
+
}
|
|
45200
|
+
}));
|
|
45201
|
+
}
|
|
45202
|
+
const MODIFIER_ORDER = ["Mod", "Ctrl", "Alt", "Shift", "Meta"];
|
|
45203
|
+
const MODIFIER_ALIASES = {
|
|
45204
|
+
alt: "Alt",
|
|
45205
|
+
control: "Ctrl",
|
|
45206
|
+
ctrl: "Ctrl",
|
|
45207
|
+
meta: "Meta",
|
|
45208
|
+
cmd: "Mod",
|
|
45209
|
+
command: "Mod",
|
|
45210
|
+
mod: "Mod",
|
|
45211
|
+
option: "Alt",
|
|
45212
|
+
shift: "Shift"
|
|
45213
|
+
};
|
|
45214
|
+
const KEY_ALIASES = {
|
|
45215
|
+
esc: "Escape",
|
|
45216
|
+
escape: "Escape",
|
|
45217
|
+
enter: "Enter",
|
|
45218
|
+
return: "Enter",
|
|
45219
|
+
tab: "Tab",
|
|
45220
|
+
space: "Space",
|
|
45221
|
+
backspace: "Backspace",
|
|
45222
|
+
delete: "Delete",
|
|
45223
|
+
up: "ArrowUp",
|
|
45224
|
+
down: "ArrowDown",
|
|
45225
|
+
left: "ArrowLeft",
|
|
45226
|
+
right: "ArrowRight",
|
|
45227
|
+
home: "Home",
|
|
45228
|
+
end: "End",
|
|
45229
|
+
pageup: "PageUp",
|
|
45230
|
+
"page-up": "PageUp",
|
|
45231
|
+
pagedown: "PageDown",
|
|
45232
|
+
"page-down": "PageDown",
|
|
45233
|
+
plus: "Plus",
|
|
45234
|
+
"+": "Plus",
|
|
45235
|
+
minus: "Minus",
|
|
45236
|
+
"-": "Minus"
|
|
45237
|
+
};
|
|
45238
|
+
const KEY_TOKENS_BY_CODE = {
|
|
45239
|
+
Minus: "Minus"
|
|
45240
|
+
};
|
|
45241
|
+
function normalizeKey(key) {
|
|
45242
|
+
const trimmed = key.trim();
|
|
45243
|
+
const alias = KEY_ALIASES[trimmed.toLowerCase()];
|
|
45244
|
+
if (alias) return alias;
|
|
45245
|
+
if (/^key[a-z]$/i.test(trimmed)) return trimmed.slice(3).toUpperCase();
|
|
45246
|
+
if (/^digit\d$/i.test(trimmed)) return trimmed.slice(5);
|
|
45247
|
+
if (/^f\d{1,2}$/i.test(trimmed)) return trimmed.toUpperCase();
|
|
45248
|
+
return trimmed.length === 1 ? trimmed.toUpperCase() : trimmed;
|
|
45249
|
+
}
|
|
45250
|
+
function normalizeShortcut(shortcut) {
|
|
45251
|
+
const parts = shortcut.split("+").map((part) => part.trim()).filter(Boolean);
|
|
45252
|
+
const keyPart = parts.pop();
|
|
45253
|
+
if (!keyPart) return "";
|
|
45254
|
+
const modifiers = /* @__PURE__ */ new Set();
|
|
45255
|
+
for (const part of parts) {
|
|
45256
|
+
const modifier = MODIFIER_ALIASES[part.toLowerCase()];
|
|
45257
|
+
if (modifier) modifiers.add(modifier);
|
|
45258
|
+
}
|
|
45259
|
+
const orderedModifiers = MODIFIER_ORDER.filter((modifier) => modifiers.has(modifier));
|
|
45260
|
+
return [...orderedModifiers, normalizeKey(keyPart)].join("+");
|
|
45261
|
+
}
|
|
45262
|
+
function keyFromKeyboardEvent(event) {
|
|
45263
|
+
if (/^Key[A-Z]$/i.test(event.code)) return event.code.slice(3).toUpperCase();
|
|
45264
|
+
if (/^Digit\d$/.test(event.code)) return event.code.slice(5);
|
|
45265
|
+
if (/^F\d{1,2}$/.test(event.code)) return event.code.toUpperCase();
|
|
45266
|
+
if (event.key === " ") return "Space";
|
|
45267
|
+
if (event.key === "+") return "Plus";
|
|
45268
|
+
if (event.key === "-") return "Minus";
|
|
45269
|
+
return KEY_TOKENS_BY_CODE[event.code] ?? normalizeKey(event.key);
|
|
45270
|
+
}
|
|
45271
|
+
function shortcutModifiersFromEvent(event, isMac) {
|
|
45272
|
+
const modifiers = [];
|
|
45273
|
+
if (isMac ? event.metaKey : event.ctrlKey) modifiers.push("Mod");
|
|
45274
|
+
if (isMac ? event.ctrlKey : event.metaKey) modifiers.push(isMac ? "Ctrl" : "Meta");
|
|
45275
|
+
if (event.altKey) modifiers.push("Alt");
|
|
45276
|
+
if (event.shiftKey) modifiers.push("Shift");
|
|
45277
|
+
return modifiers;
|
|
45278
|
+
}
|
|
45279
|
+
function shortcutPreviewFromKeyboardEvent(event, isMac) {
|
|
45280
|
+
if (event.key === "=") return null;
|
|
45281
|
+
const modifiers = shortcutModifiersFromEvent(event, isMac);
|
|
45282
|
+
const isModifierKey = ["Control", "Meta", "Alt", "Shift"].includes(event.key);
|
|
45283
|
+
const key = isModifierKey ? null : keyFromKeyboardEvent(event);
|
|
45284
|
+
if (modifiers.length === 0) return null;
|
|
45285
|
+
return normalizeShortcut([...modifiers, ...key ? [key] : []].join("+"));
|
|
45286
|
+
}
|
|
45287
|
+
function shortcutFromKeyboardEvent(event, isMac) {
|
|
45288
|
+
if (["Control", "Meta", "Alt", "Shift"].includes(event.key)) return null;
|
|
45289
|
+
if (shortcutModifiersFromEvent(event, isMac).length === 0) return null;
|
|
45290
|
+
return shortcutPreviewFromKeyboardEvent(event, isMac);
|
|
45291
|
+
}
|
|
45292
|
+
function getCommandShortcuts(command, overrides) {
|
|
45293
|
+
const override = overrides[command.id];
|
|
45294
|
+
return (override ?? command.defaultShortcuts).map(normalizeShortcut).filter(Boolean);
|
|
45295
|
+
}
|
|
45296
|
+
function findShortcutConflicts(commands2, overrides) {
|
|
45297
|
+
const commandsByShortcut = /* @__PURE__ */ new Map();
|
|
45298
|
+
for (const command of commands2) {
|
|
45299
|
+
for (const shortcut of getCommandShortcuts(command, overrides)) {
|
|
45300
|
+
const commandIds = commandsByShortcut.get(shortcut) ?? [];
|
|
45301
|
+
commandIds.push(command.id);
|
|
45302
|
+
commandsByShortcut.set(shortcut, commandIds);
|
|
45303
|
+
}
|
|
45304
|
+
}
|
|
45305
|
+
return [...commandsByShortcut.entries()].filter(([, commandIds]) => commandIds.length > 1).map(([shortcut, commandIds]) => ({ shortcut, commandIds }));
|
|
45306
|
+
}
|
|
45307
|
+
function useCommandShortcuts(commands2, overrides) {
|
|
45308
|
+
const shortcuts = reactExports.useMemo(
|
|
45309
|
+
() => commands2.flatMap(
|
|
45310
|
+
(command) => getCommandShortcuts(command, overrides).map((shortcut) => ({
|
|
45311
|
+
shortcut,
|
|
45312
|
+
handler: command.execute,
|
|
45313
|
+
ignoreInputs: command.ignoreInputs
|
|
45314
|
+
}))
|
|
45315
|
+
),
|
|
45316
|
+
[commands2, overrides]
|
|
45317
|
+
);
|
|
45318
|
+
useKeyboardShortcuts(shortcuts);
|
|
45319
|
+
}
|
|
44033
45320
|
var h = { name: "soft", baseFreq: 440, noiseColor: "pink", oscType: "sine", filterFreq: 3e3, filterQ: 2, attack: 2e-3, decay: 1, brightness: 2e3 }, D$1 = { name: "crisp", baseFreq: 523, noiseColor: "white", oscType: "triangle", filterFreq: 5e3, filterQ: 3, attack: 15e-4, decay: 0.6, brightness: 4e3 }, L$1 = { name: "arcade", baseFreq: 392, noiseColor: "white", oscType: "square", filterFreq: 2200, filterQ: 5, attack: 1e-3, decay: 0.5, brightness: 2800 }, P = { name: "glass", baseFreq: 660, noiseColor: "pink", oscType: "sine", filterFreq: 6500, filterQ: 6, attack: 4e-3, decay: 1.4, brightness: 5500 }, Q = { soft: h, crisp: D$1, arcade: L$1, glass: P };
|
|
44034
45321
|
function v$1(n) {
|
|
44035
45322
|
if (typeof n == "string") {
|
|
@@ -44333,12 +45620,16 @@ function AppContent() {
|
|
|
44333
45620
|
setEditor,
|
|
44334
45621
|
setSnippets,
|
|
44335
45622
|
setImageGeneration,
|
|
45623
|
+
setSpeechToText,
|
|
45624
|
+
setVoiceInput,
|
|
45625
|
+
setShortcuts,
|
|
44336
45626
|
setProxy,
|
|
44337
45627
|
isMacApp,
|
|
44338
45628
|
setIsFullScreen,
|
|
44339
45629
|
setIlinkStatus,
|
|
44340
45630
|
setActiveIlinkSessionId
|
|
44341
45631
|
} = useAppStore();
|
|
45632
|
+
const shortcuts = useAppStore((state) => state.shortcuts);
|
|
44342
45633
|
const { resolvedTheme } = z();
|
|
44343
45634
|
const { i18n, t } = useTranslation();
|
|
44344
45635
|
const { toast: toast2 } = useMessage();
|
|
@@ -44346,6 +45637,9 @@ function AppContent() {
|
|
|
44346
45637
|
const matchSession = location.pathname.match(/^\/session-view\/(.+)$/);
|
|
44347
45638
|
const activeSessionId = matchSession ? matchSession[1] : null;
|
|
44348
45639
|
const activeSessionIdRef = reactExports.useRef(activeSessionId);
|
|
45640
|
+
const { focus } = useFocusTargetRegistry();
|
|
45641
|
+
const commands2 = reactExports.useMemo(() => createAppCommands(focus), [focus]);
|
|
45642
|
+
useCommandShortcuts(commands2, shortcuts);
|
|
44349
45643
|
reactExports.useEffect(() => {
|
|
44350
45644
|
activeSessionIdRef.current = activeSessionId;
|
|
44351
45645
|
}, [activeSessionId]);
|
|
@@ -44386,6 +45680,9 @@ function AppContent() {
|
|
|
44386
45680
|
if (settings2.editor) setEditor(settings2.editor);
|
|
44387
45681
|
if (settings2.snippets) setSnippets(settings2.snippets);
|
|
44388
45682
|
if (settings2.imageGeneration) setImageGeneration(settings2.imageGeneration);
|
|
45683
|
+
if (settings2.speechToText) setSpeechToText(settings2.speechToText);
|
|
45684
|
+
if (settings2.voiceInput) setVoiceInput(settings2.voiceInput);
|
|
45685
|
+
if (settings2.shortcuts) setShortcuts(settings2.shortcuts);
|
|
44389
45686
|
for (const session2 of sessions ?? []) {
|
|
44390
45687
|
try {
|
|
44391
45688
|
const pending = await request.getPendingAskUserRequests({ sessionId: session2.id });
|
|
@@ -44418,6 +45715,9 @@ function AppContent() {
|
|
|
44418
45715
|
setEditor,
|
|
44419
45716
|
setSnippets,
|
|
44420
45717
|
setImageGeneration,
|
|
45718
|
+
setSpeechToText,
|
|
45719
|
+
setVoiceInput,
|
|
45720
|
+
setShortcuts,
|
|
44421
45721
|
setProxy,
|
|
44422
45722
|
setIlinkStatus,
|
|
44423
45723
|
setActiveIlinkSessionId
|
|
@@ -44432,7 +45732,16 @@ function AppContent() {
|
|
|
44432
45732
|
for (const [sid, notifications] of pendingSessionNotificationRef.current.entries()) {
|
|
44433
45733
|
pendingSessionNotificationRef.current.delete(sid);
|
|
44434
45734
|
let processedCount = 0;
|
|
45735
|
+
if (!useAppStore.getState().sessions.some((session2) => session2.id === sid)) {
|
|
45736
|
+
continue;
|
|
45737
|
+
}
|
|
44435
45738
|
store.updateSessionState(sid, (currentState) => {
|
|
45739
|
+
if (currentState.isLoading || isSessionLifecycleBusy(sid)) {
|
|
45740
|
+
processedCount = notifications.length;
|
|
45741
|
+
return {
|
|
45742
|
+
pendingNotifications: [...currentState.pendingNotifications, ...notifications]
|
|
45743
|
+
};
|
|
45744
|
+
}
|
|
44436
45745
|
let state = currentState;
|
|
44437
45746
|
for (let i = 0; i < notifications.length; i++) {
|
|
44438
45747
|
const notification = notifications[i];
|
|
@@ -44732,7 +46041,7 @@ function AppContent() {
|
|
|
44732
46041
|
] });
|
|
44733
46042
|
}
|
|
44734
46043
|
function App() {
|
|
44735
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ThemeProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(MessageProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(HashRouter, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(AppContent, {}) }) }) }) });
|
|
46044
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorBoundary, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ThemeProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(MessageProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(HashRouter, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(FocusTargetProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(AppContent, {}) }) }) }) }) });
|
|
44736
46045
|
}
|
|
44737
46046
|
clientExports.createRoot(document.getElementById("root")).render(
|
|
44738
46047
|
/* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.StrictMode, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(App, {}) })
|
|
@@ -44741,221 +46050,228 @@ if (typeof window === "object") {
|
|
|
44741
46050
|
Object.assign(window, { appStore: useAppStore });
|
|
44742
46051
|
}
|
|
44743
46052
|
export {
|
|
44744
|
-
|
|
44745
|
-
|
|
46053
|
+
useParams as $,
|
|
46054
|
+
DropdownMenu as A,
|
|
44746
46055
|
Button as B,
|
|
44747
46056
|
Check as C,
|
|
44748
46057
|
Dialog as D,
|
|
44749
|
-
|
|
44750
|
-
|
|
44751
|
-
|
|
44752
|
-
|
|
46058
|
+
DropdownMenuTrigger as E,
|
|
46059
|
+
DropdownMenuContent as F,
|
|
46060
|
+
DropdownMenuItem as G,
|
|
46061
|
+
DialogFooter as H,
|
|
44753
46062
|
Input as I,
|
|
44754
|
-
|
|
44755
|
-
|
|
46063
|
+
generateUUID as J,
|
|
46064
|
+
useLocation as K,
|
|
44756
46065
|
Library as L,
|
|
44757
|
-
|
|
46066
|
+
cn$1 as M,
|
|
44758
46067
|
Navigate as N,
|
|
44759
|
-
|
|
46068
|
+
NavLink as O,
|
|
44760
46069
|
Pencil as P,
|
|
44761
|
-
|
|
44762
|
-
|
|
46070
|
+
Outlet as Q,
|
|
46071
|
+
LoaderCircle as R,
|
|
44763
46072
|
ScrollArea as S,
|
|
44764
46073
|
Trash2 as T,
|
|
44765
|
-
|
|
44766
|
-
|
|
44767
|
-
|
|
44768
|
-
|
|
44769
|
-
|
|
44770
|
-
|
|
44771
|
-
|
|
46074
|
+
FolderOpen as U,
|
|
46075
|
+
electron as V,
|
|
46076
|
+
toast as W,
|
|
46077
|
+
useNavigate as X,
|
|
46078
|
+
subscribe as Y,
|
|
46079
|
+
ClockCheck as Z,
|
|
46080
|
+
Badge as _,
|
|
44772
46081
|
useAppStore as a,
|
|
44773
|
-
|
|
44774
|
-
|
|
44775
|
-
|
|
44776
|
-
|
|
44777
|
-
|
|
44778
|
-
|
|
44779
|
-
|
|
44780
|
-
|
|
44781
|
-
|
|
44782
|
-
|
|
44783
|
-
|
|
44784
|
-
|
|
44785
|
-
|
|
44786
|
-
|
|
44787
|
-
|
|
44788
|
-
|
|
44789
|
-
|
|
44790
|
-
|
|
44791
|
-
|
|
44792
|
-
|
|
44793
|
-
|
|
44794
|
-
|
|
44795
|
-
|
|
44796
|
-
|
|
44797
|
-
|
|
44798
|
-
|
|
44799
|
-
|
|
44800
|
-
|
|
44801
|
-
|
|
44802
|
-
|
|
44803
|
-
|
|
44804
|
-
|
|
44805
|
-
|
|
44806
|
-
|
|
44807
|
-
|
|
44808
|
-
|
|
44809
|
-
|
|
44810
|
-
|
|
44811
|
-
|
|
44812
|
-
|
|
44813
|
-
|
|
44814
|
-
|
|
44815
|
-
|
|
44816
|
-
|
|
44817
|
-
|
|
44818
|
-
|
|
44819
|
-
|
|
44820
|
-
|
|
44821
|
-
|
|
44822
|
-
|
|
44823
|
-
|
|
44824
|
-
|
|
44825
|
-
|
|
44826
|
-
|
|
44827
|
-
|
|
44828
|
-
|
|
44829
|
-
|
|
44830
|
-
|
|
44831
|
-
|
|
44832
|
-
|
|
44833
|
-
|
|
44834
|
-
|
|
44835
|
-
|
|
44836
|
-
|
|
46082
|
+
useValueChanged as a$,
|
|
46083
|
+
CircleCheck as a0,
|
|
46084
|
+
Bot as a1,
|
|
46085
|
+
Globe as a2,
|
|
46086
|
+
MessageCircle as a3,
|
|
46087
|
+
SelectGroup as a4,
|
|
46088
|
+
SelectLabel as a5,
|
|
46089
|
+
RefreshCw as a6,
|
|
46090
|
+
ChevronRight as a7,
|
|
46091
|
+
cva as a8,
|
|
46092
|
+
Separator as a9,
|
|
46093
|
+
useMergedRefs as aA,
|
|
46094
|
+
useValueAsRef as aB,
|
|
46095
|
+
useAnimationsFinished as aC,
|
|
46096
|
+
useIsoLayoutEffect as aD,
|
|
46097
|
+
useOpenChangeComplete as aE,
|
|
46098
|
+
AnimationFrame as aF,
|
|
46099
|
+
addEventListener as aG,
|
|
46100
|
+
getWindow as aH,
|
|
46101
|
+
none as aI,
|
|
46102
|
+
resolveStyle as aJ,
|
|
46103
|
+
Tabs as aK,
|
|
46104
|
+
TabsList as aL,
|
|
46105
|
+
TabsTrigger as aM,
|
|
46106
|
+
webUIBaseUrl as aN,
|
|
46107
|
+
reduceSessionNotification as aO,
|
|
46108
|
+
reduceFlushStreaming as aP,
|
|
46109
|
+
Clock as aQ,
|
|
46110
|
+
Folder as aR,
|
|
46111
|
+
shimExports as aS,
|
|
46112
|
+
NOOP as aT,
|
|
46113
|
+
useCSPContext as aU,
|
|
46114
|
+
clamp as aV,
|
|
46115
|
+
fieldValidityMapping as aW,
|
|
46116
|
+
useFormContext as aX,
|
|
46117
|
+
useFieldRootContext as aY,
|
|
46118
|
+
useLabelableContext as aZ,
|
|
46119
|
+
useRegisterFieldControl as a_,
|
|
46120
|
+
useRender as aa,
|
|
46121
|
+
mergeProps as ab,
|
|
46122
|
+
resetAgent as ac,
|
|
46123
|
+
clearAgentSessions as ad,
|
|
46124
|
+
updateAgentSettings as ae,
|
|
46125
|
+
ALL_FEATURES as af,
|
|
46126
|
+
FEATURE_I18N_KEYS as ag,
|
|
46127
|
+
COMMAND_DEFINITIONS as ah,
|
|
46128
|
+
getCommandShortcuts as ai,
|
|
46129
|
+
shortcutPreviewFromKeyboardEvent as aj,
|
|
46130
|
+
shortcutFromKeyboardEvent as ak,
|
|
46131
|
+
findShortcutConflicts as al,
|
|
46132
|
+
React as am,
|
|
46133
|
+
reactDomExports as an,
|
|
46134
|
+
getDefaultExportFromCjs as ao,
|
|
46135
|
+
useControlled as ap,
|
|
46136
|
+
useTransitionStatus as aq,
|
|
46137
|
+
useBaseUiId as ar,
|
|
46138
|
+
useStableCallback as as,
|
|
46139
|
+
createChangeEventDetails as at,
|
|
46140
|
+
triggerPress as au,
|
|
46141
|
+
formatErrorMessage as av,
|
|
46142
|
+
TransitionStatusDataAttributes as aw,
|
|
46143
|
+
transitionStatusMapping as ax,
|
|
46144
|
+
useRenderElement as ay,
|
|
46145
|
+
useButton as az,
|
|
44837
46146
|
useMessage as b,
|
|
44838
|
-
|
|
44839
|
-
|
|
44840
|
-
|
|
44841
|
-
|
|
44842
|
-
|
|
44843
|
-
|
|
44844
|
-
|
|
44845
|
-
|
|
44846
|
-
|
|
44847
|
-
|
|
44848
|
-
|
|
44849
|
-
|
|
44850
|
-
|
|
44851
|
-
|
|
44852
|
-
|
|
44853
|
-
|
|
44854
|
-
|
|
44855
|
-
|
|
44856
|
-
|
|
44857
|
-
|
|
44858
|
-
|
|
44859
|
-
|
|
44860
|
-
|
|
44861
|
-
|
|
44862
|
-
|
|
44863
|
-
|
|
44864
|
-
|
|
44865
|
-
|
|
44866
|
-
|
|
44867
|
-
|
|
44868
|
-
|
|
44869
|
-
|
|
44870
|
-
|
|
44871
|
-
|
|
44872
|
-
|
|
44873
|
-
|
|
44874
|
-
|
|
44875
|
-
|
|
44876
|
-
|
|
44877
|
-
|
|
44878
|
-
|
|
44879
|
-
|
|
44880
|
-
|
|
44881
|
-
|
|
44882
|
-
|
|
44883
|
-
|
|
44884
|
-
|
|
44885
|
-
|
|
44886
|
-
|
|
44887
|
-
|
|
44888
|
-
|
|
44889
|
-
|
|
44890
|
-
|
|
44891
|
-
|
|
44892
|
-
|
|
44893
|
-
|
|
44894
|
-
|
|
44895
|
-
|
|
44896
|
-
|
|
44897
|
-
|
|
44898
|
-
|
|
44899
|
-
|
|
44900
|
-
|
|
44901
|
-
|
|
46147
|
+
useTriggerFocusGuards as b$,
|
|
46148
|
+
areArraysEqual as b0,
|
|
46149
|
+
keyboard as b1,
|
|
46150
|
+
inputChange as b2,
|
|
46151
|
+
createGenericEventDetails as b3,
|
|
46152
|
+
activeElement as b4,
|
|
46153
|
+
ownerDocument as b5,
|
|
46154
|
+
contains as b6,
|
|
46155
|
+
CompositeList as b7,
|
|
46156
|
+
getDefaultLabelId as b8,
|
|
46157
|
+
resolveAriaLabelledBy as b9,
|
|
46158
|
+
popupStoreSelectors as bA,
|
|
46159
|
+
triggerHover as bB,
|
|
46160
|
+
escapeKey as bC,
|
|
46161
|
+
attachPreventUnmountOnClose as bD,
|
|
46162
|
+
closePress as bE,
|
|
46163
|
+
PATIENT_CLICK_THRESHOLD as bF,
|
|
46164
|
+
focusOut as bG,
|
|
46165
|
+
setPopupOpenState as bH,
|
|
46166
|
+
createInitialPopupStoreState as bI,
|
|
46167
|
+
createPopupFloatingRootContext as bJ,
|
|
46168
|
+
Timeout as bK,
|
|
46169
|
+
PopupTriggerMap as bL,
|
|
46170
|
+
FloatingTree as bM,
|
|
46171
|
+
usePopupRootSync as bN,
|
|
46172
|
+
useImplicitActiveTrigger as bO,
|
|
46173
|
+
useOpenStateTransitions as bP,
|
|
46174
|
+
imperativeAction as bQ,
|
|
46175
|
+
PopupHandleAttachment as bR,
|
|
46176
|
+
usePopupRootStore as bS,
|
|
46177
|
+
useDismiss as bT,
|
|
46178
|
+
usePopupInteractionProps as bU,
|
|
46179
|
+
usePopupHandleStore as bV,
|
|
46180
|
+
useTriggerDataForwarding as bW,
|
|
46181
|
+
useHoverReferenceInteraction as bX,
|
|
46182
|
+
safePolygon as bY,
|
|
46183
|
+
useClick as bZ,
|
|
46184
|
+
useOpenMethodTriggerProps as b_,
|
|
46185
|
+
useDirection as ba,
|
|
46186
|
+
getTarget as bb,
|
|
46187
|
+
useAnimationFrame as bc,
|
|
46188
|
+
isElement as bd,
|
|
46189
|
+
drag as be,
|
|
46190
|
+
trackPress as bf,
|
|
46191
|
+
useLabelableId as bg,
|
|
46192
|
+
useCompositeListItem as bh,
|
|
46193
|
+
visuallyHidden as bi,
|
|
46194
|
+
COMPOSITE_KEYS as bj,
|
|
46195
|
+
PAGE_UP as bk,
|
|
46196
|
+
PAGE_DOWN as bl,
|
|
46197
|
+
HOME as bm,
|
|
46198
|
+
END as bn,
|
|
46199
|
+
ARROW_LEFT as bo,
|
|
46200
|
+
ARROW_DOWN as bp,
|
|
46201
|
+
ARROW_RIGHT as bq,
|
|
46202
|
+
ARROW_UP as br,
|
|
46203
|
+
matchesFocusVisible as bs,
|
|
46204
|
+
EDITOR_LABELS as bt,
|
|
46205
|
+
L as bu,
|
|
46206
|
+
N as bv,
|
|
46207
|
+
_ as bw,
|
|
46208
|
+
D as bx,
|
|
46209
|
+
w as by,
|
|
46210
|
+
ReactStore as bz,
|
|
44902
46211
|
createLucideIcon as c,
|
|
44903
|
-
|
|
44904
|
-
|
|
44905
|
-
|
|
44906
|
-
|
|
44907
|
-
|
|
44908
|
-
|
|
44909
|
-
|
|
44910
|
-
|
|
44911
|
-
|
|
44912
|
-
|
|
44913
|
-
|
|
44914
|
-
|
|
44915
|
-
|
|
44916
|
-
|
|
44917
|
-
|
|
44918
|
-
|
|
44919
|
-
|
|
44920
|
-
|
|
44921
|
-
|
|
44922
|
-
|
|
44923
|
-
|
|
44924
|
-
|
|
44925
|
-
|
|
44926
|
-
|
|
44927
|
-
|
|
44928
|
-
|
|
44929
|
-
|
|
44930
|
-
|
|
44931
|
-
|
|
44932
|
-
|
|
44933
|
-
|
|
44934
|
-
|
|
44935
|
-
|
|
44936
|
-
|
|
44937
|
-
|
|
44938
|
-
|
|
44939
|
-
|
|
44940
|
-
|
|
44941
|
-
|
|
44942
|
-
|
|
44943
|
-
|
|
44944
|
-
|
|
44945
|
-
|
|
44946
|
-
|
|
44947
|
-
|
|
44948
|
-
|
|
44949
|
-
|
|
44950
|
-
|
|
44951
|
-
|
|
44952
|
-
|
|
44953
|
-
|
|
44954
|
-
|
|
44955
|
-
|
|
44956
|
-
|
|
46212
|
+
CLICK_TRIGGER_IDENTIFIER as c0,
|
|
46213
|
+
FocusGuard as c1,
|
|
46214
|
+
pressableTriggerOpenStateMapping as c2,
|
|
46215
|
+
triggerOpenStateMapping as c3,
|
|
46216
|
+
FloatingPortal as c4,
|
|
46217
|
+
POPUP_COLLISION_AVOIDANCE as c5,
|
|
46218
|
+
useFloatingNodeId as c6,
|
|
46219
|
+
useAnchorPositioning as c7,
|
|
46220
|
+
useAnchoredPopupScrollLock as c8,
|
|
46221
|
+
usePositioner as c9,
|
|
46222
|
+
HoverCard as cA,
|
|
46223
|
+
HoverCardTrigger as cB,
|
|
46224
|
+
HoverCardContent as cC,
|
|
46225
|
+
X as cD,
|
|
46226
|
+
DropdownMenuSub as cE,
|
|
46227
|
+
DropdownMenuSubTrigger as cF,
|
|
46228
|
+
DropdownMenuSubContent as cG,
|
|
46229
|
+
CircleQuestionMark as cH,
|
|
46230
|
+
ChevronUp as cI,
|
|
46231
|
+
z as cJ,
|
|
46232
|
+
__vitePreload as cK,
|
|
46233
|
+
Code as cL,
|
|
46234
|
+
MessageSquare as cM,
|
|
46235
|
+
FolderPlus as cN,
|
|
46236
|
+
Eye as cO,
|
|
46237
|
+
useProjectState as cP,
|
|
46238
|
+
useFocusTargetRegistry as cQ,
|
|
46239
|
+
TabsContent as cR,
|
|
46240
|
+
loadSession as cS,
|
|
46241
|
+
Card as cT,
|
|
46242
|
+
getBasename as cU,
|
|
46243
|
+
isSubPath as cV,
|
|
46244
|
+
formatBytes as cW,
|
|
46245
|
+
isImageMimeType as cX,
|
|
46246
|
+
twMerge as cY,
|
|
46247
|
+
clsx as cZ,
|
|
46248
|
+
getAugmentedNamespace as c_,
|
|
46249
|
+
InternalBackdrop as ca,
|
|
46250
|
+
inertValue as cb,
|
|
46251
|
+
FloatingNode as cc,
|
|
46252
|
+
useToolbarRootContext as cd,
|
|
46253
|
+
useHoverFloatingInteraction as ce,
|
|
46254
|
+
createDefaultInitialFocus as cf,
|
|
46255
|
+
FOCUSABLE_POPUP_PROPS as cg,
|
|
46256
|
+
getDisabledMountTransitionStyles as ch,
|
|
46257
|
+
FloatingFocusManager as ci,
|
|
46258
|
+
isHTMLElement as cj,
|
|
46259
|
+
popupTransitionStateMapping as ck,
|
|
46260
|
+
formatUpdatedTime as cl,
|
|
46261
|
+
buttonVariants as cm,
|
|
46262
|
+
restartSession as cn,
|
|
46263
|
+
SessionLifecycleBusyError as co,
|
|
46264
|
+
closeSession as cp,
|
|
46265
|
+
RestartSessionError as cq,
|
|
46266
|
+
Tooltip as cr,
|
|
46267
|
+
TooltipTrigger as cs,
|
|
46268
|
+
TooltipContent as ct,
|
|
46269
|
+
useFocusTarget as cu,
|
|
46270
|
+
formatDuration as cv,
|
|
46271
|
+
ReactDOM as cw,
|
|
46272
|
+
clientId as cx,
|
|
44957
46273
|
ChevronDown as cy,
|
|
44958
|
-
|
|
46274
|
+
v as cz,
|
|
44959
46275
|
Switch as d,
|
|
44960
46276
|
Copy as e,
|
|
44961
46277
|
request as f,
|
|
@@ -44963,20 +46279,20 @@ export {
|
|
|
44963
46279
|
copyText as h,
|
|
44964
46280
|
isWebUI as i,
|
|
44965
46281
|
jsxRuntimeExports as j,
|
|
44966
|
-
|
|
44967
|
-
|
|
44968
|
-
|
|
44969
|
-
|
|
44970
|
-
|
|
44971
|
-
|
|
44972
|
-
|
|
46282
|
+
ContextMenu as k,
|
|
46283
|
+
ContextMenuTrigger as l,
|
|
46284
|
+
ContextMenuContent as m,
|
|
46285
|
+
ContextMenuItem as n,
|
|
46286
|
+
ContextMenuSeparator as o,
|
|
46287
|
+
DialogContent as p,
|
|
46288
|
+
DialogHeader as q,
|
|
44973
46289
|
reactExports as r,
|
|
44974
|
-
|
|
44975
|
-
|
|
46290
|
+
DialogTitle as s,
|
|
46291
|
+
DialogDescription as t,
|
|
44976
46292
|
useTranslation as u,
|
|
44977
|
-
|
|
44978
|
-
|
|
44979
|
-
|
|
44980
|
-
|
|
44981
|
-
|
|
46293
|
+
Select as v,
|
|
46294
|
+
SelectTrigger as w,
|
|
46295
|
+
SelectValue as x,
|
|
46296
|
+
SelectContent as y,
|
|
46297
|
+
SelectItem as z
|
|
44982
46298
|
};
|