@zythum02/fello-server 0.1.52 → 0.1.53
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-CJr3HkLS.js} +1 -1
- package/out/renderer/assets/_baseUniq-CJr3HkLS.js.br +0 -0
- package/out/renderer/assets/_baseUniq-CJr3HkLS.js.gz +0 -0
- package/out/renderer/assets/{arc-bnlMIyYF.js → arc-POsBroTF.js} +1 -1
- package/out/renderer/assets/arc-POsBroTF.js.br +0 -0
- package/out/renderer/assets/arc-POsBroTF.js.gz +0 -0
- package/out/renderer/assets/{architectureDiagram-Q4EWVU46-Cr0249Lu.js → architectureDiagram-Q4EWVU46-CmToUhDb.js} +6 -6
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-CmToUhDb.js.br +0 -0
- package/out/renderer/assets/architectureDiagram-Q4EWVU46-CmToUhDb.js.gz +0 -0
- package/out/renderer/assets/{arrow-left-D589pHHA.js → arrow-left-CxS1t3f7.js} +1 -1
- package/out/renderer/assets/{automation-CvjrkE9z.js → automation-Cyz3eLWp.js} +7 -8
- package/out/renderer/assets/automation-Cyz3eLWp.js.br +0 -0
- package/out/renderer/assets/automation-Cyz3eLWp.js.gz +0 -0
- package/out/renderer/assets/{blockDiagram-DXYQGD6D-Cw6vh5dx.js → blockDiagram-DXYQGD6D-M2nnTg9f.js} +7 -7
- package/out/renderer/assets/blockDiagram-DXYQGD6D-M2nnTg9f.js.br +0 -0
- package/out/renderer/assets/blockDiagram-DXYQGD6D-M2nnTg9f.js.gz +0 -0
- package/out/renderer/assets/{c4Diagram-AHTNJAMY-BUrvcyv2.js → c4Diagram-AHTNJAMY-CwLtsy_0.js} +3 -3
- package/out/renderer/assets/c4Diagram-AHTNJAMY-CwLtsy_0.js.br +0 -0
- package/out/renderer/assets/c4Diagram-AHTNJAMY-CwLtsy_0.js.gz +0 -0
- package/out/renderer/assets/{channel-DQr36qW5.js → channel-BUNDMqpH.js} +1 -1
- package/out/renderer/assets/{chunk-4BX2VUAB-DOsXCDD7.js → chunk-4BX2VUAB-B2qXmkDT.js} +1 -1
- package/out/renderer/assets/{chunk-4TB4RGXK-D_fBnf0p.js → chunk-4TB4RGXK-DXLZpPY5.js} +5 -5
- package/out/renderer/assets/chunk-4TB4RGXK-DXLZpPY5.js.br +0 -0
- package/out/renderer/assets/chunk-4TB4RGXK-DXLZpPY5.js.gz +0 -0
- package/out/renderer/assets/{chunk-55IACEB6-3ETNuedT.js → chunk-55IACEB6-CJeyefxI.js} +1 -1
- package/out/renderer/assets/{chunk-EDXVE4YY-BJLqHaER.js → chunk-EDXVE4YY-CNjJEQfY.js} +1 -1
- package/out/renderer/assets/chunk-EDXVE4YY-CNjJEQfY.js.br +0 -0
- package/out/renderer/assets/chunk-EDXVE4YY-CNjJEQfY.js.gz +0 -0
- package/out/renderer/assets/{chunk-FMBD7UC4-DP-WGTNG.js → chunk-FMBD7UC4-DOAOsjRu.js} +1 -1
- package/out/renderer/assets/{chunk-OYMX7WX6-CrS7loi7.js → chunk-OYMX7WX6-BG4B1VQ7.js} +3 -3
- package/out/renderer/assets/chunk-OYMX7WX6-BG4B1VQ7.js.br +0 -0
- package/out/renderer/assets/chunk-OYMX7WX6-BG4B1VQ7.js.gz +0 -0
- package/out/renderer/assets/{chunk-QZHKN3VN-C53USs5W.js → chunk-QZHKN3VN-B9zfXYIQ.js} +1 -1
- package/out/renderer/assets/{chunk-YZCP3GAM-CMgdytZR.js → chunk-YZCP3GAM-jeoI2tsD.js} +1 -1
- package/out/renderer/assets/chunk-YZCP3GAM-jeoI2tsD.js.br +0 -0
- package/out/renderer/assets/chunk-YZCP3GAM-jeoI2tsD.js.gz +0 -0
- package/out/renderer/assets/{circle-x-OvXymUrf.js → circle-x-B1kBsMlS.js} +1 -1
- package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-DIYtEiO5.js → classDiagram-6PBFFD2Q-DWPFF3Yt.js} +7 -7
- package/out/renderer/assets/{classDiagram-6PBFFD2Q-DIYtEiO5.js → classDiagram-v2-HSJHXN6E-DWPFF3Yt.js} +7 -7
- package/out/renderer/assets/{clone-D45P7Iqc.js → clone-Dcvr9oKv.js} +1 -1
- package/out/renderer/assets/{code-editor-SuOcN-5B.js → code-editor-CEXlC4aV.js} +2 -2
- package/out/renderer/assets/code-editor-CEXlC4aV.js.br +0 -0
- package/out/renderer/assets/code-editor-CEXlC4aV.js.gz +0 -0
- package/out/renderer/assets/{collapsible-Bd85ZCyx.js → collapsible-CMuCJUWG.js} +1 -1
- package/out/renderer/assets/collapsible-CMuCJUWG.js.br +0 -0
- package/out/renderer/assets/collapsible-CMuCJUWG.js.gz +0 -0
- package/out/renderer/assets/{cose-bilkent-S5V4N54A-Dq8VllNT.js → cose-bilkent-S5V4N54A-B3bgImVS.js} +2 -2
- package/out/renderer/assets/cose-bilkent-S5V4N54A-B3bgImVS.js.br +0 -0
- package/out/renderer/assets/cose-bilkent-S5V4N54A-B3bgImVS.js.gz +0 -0
- package/out/renderer/assets/{dagre-KV5264BT-Dec8q4UT.js → dagre-KV5264BT-DTbumBA_.js} +7 -7
- package/out/renderer/assets/dagre-KV5264BT-DTbumBA_.js.br +0 -0
- package/out/renderer/assets/dagre-KV5264BT-DTbumBA_.js.gz +0 -0
- package/out/renderer/assets/{diagram-5BDNPKRD-CzA2u_EN.js → diagram-5BDNPKRD-B34Y6e8q.js} +7 -7
- package/out/renderer/assets/diagram-5BDNPKRD-B34Y6e8q.js.br +0 -0
- package/out/renderer/assets/diagram-5BDNPKRD-B34Y6e8q.js.gz +0 -0
- package/out/renderer/assets/{diagram-G4DWMVQ6-C8h3R7jD.js → diagram-G4DWMVQ6-BBiBmFR4.js} +7 -7
- package/out/renderer/assets/diagram-G4DWMVQ6-BBiBmFR4.js.br +0 -0
- package/out/renderer/assets/diagram-G4DWMVQ6-BBiBmFR4.js.gz +0 -0
- package/out/renderer/assets/{diagram-MMDJMWI5-9tiXSF90.js → diagram-MMDJMWI5-P-YslDjG.js} +6 -6
- package/out/renderer/assets/diagram-MMDJMWI5-P-YslDjG.js.br +0 -0
- package/out/renderer/assets/diagram-MMDJMWI5-P-YslDjG.js.gz +0 -0
- package/out/renderer/assets/{diagram-TYMM5635-BrarGJNf.js → diagram-TYMM5635-D_cLard_.js} +6 -6
- package/out/renderer/assets/diagram-TYMM5635-D_cLard_.js.br +0 -0
- package/out/renderer/assets/diagram-TYMM5635-D_cLard_.js.gz +0 -0
- package/out/renderer/assets/{ellipsis-BafkhboM.js → ellipsis-D1agTYu1.js} +1 -1
- package/out/renderer/assets/{erDiagram-SMLLAGMA-1Q9StK7L.js → erDiagram-SMLLAGMA-C1MHqKvC.js} +5 -5
- package/out/renderer/assets/erDiagram-SMLLAGMA-C1MHqKvC.js.br +0 -0
- package/out/renderer/assets/erDiagram-SMLLAGMA-C1MHqKvC.js.gz +0 -0
- package/out/renderer/assets/{field-ohYLdnJa.js → field-DR3J0r9e.js} +1 -1
- package/out/renderer/assets/field-DR3J0r9e.js.br +0 -0
- package/out/renderer/assets/field-DR3J0r9e.js.gz +0 -0
- package/out/renderer/assets/{file-text-CshHuHgW.js → file-text-nGCW6zu1.js} +1 -1
- package/out/renderer/assets/{flowDiagram-DWJPFMVM-CpcXVOmj.js → flowDiagram-DWJPFMVM-DprlEc3Z.js} +7 -7
- package/out/renderer/assets/flowDiagram-DWJPFMVM-DprlEc3Z.js.br +0 -0
- package/out/renderer/assets/flowDiagram-DWJPFMVM-DprlEc3Z.js.gz +0 -0
- package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-C7Da4JBG.js → ganttDiagram-T4ZO3ILL-CbTdumBm.js} +3 -3
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-CbTdumBm.js.br +0 -0
- package/out/renderer/assets/ganttDiagram-T4ZO3ILL-CbTdumBm.js.gz +0 -0
- package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-COBL52q_.js → gitGraphDiagram-UUTBAWPF-06bme-w8.js} +7 -7
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-06bme-w8.js.br +0 -0
- package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-06bme-w8.js.gz +0 -0
- package/out/renderer/assets/{graph-vKaAs6sc.js → graph-BZhxluo9.js} +2 -2
- package/out/renderer/assets/graph-BZhxluo9.js.br +0 -0
- package/out/renderer/assets/graph-BZhxluo9.js.gz +0 -0
- package/out/renderer/assets/{highlighted-body-OFNGDK62-BGNnB1Ll.js → highlighted-body-OFNGDK62-CvDMJtXf.js} +2 -2
- package/out/renderer/assets/{index-BJPggXxf.js → index-LmYTNvdF.js} +906 -457
- package/out/renderer/assets/index-LmYTNvdF.js.br +0 -0
- package/out/renderer/assets/index-LmYTNvdF.js.gz +0 -0
- package/out/renderer/assets/index-aGJ_yZib.css +382 -0
- package/out/renderer/assets/index-aGJ_yZib.css.br +0 -0
- package/out/renderer/assets/index-aGJ_yZib.css.gz +0 -0
- package/out/renderer/assets/{infoDiagram-42DDH7IO-z37e1cYq.js → infoDiagram-42DDH7IO-DqivEzWL.js} +5 -5
- package/out/renderer/assets/infoDiagram-42DDH7IO-DqivEzWL.js.br +0 -0
- package/out/renderer/assets/infoDiagram-42DDH7IO-DqivEzWL.js.gz +0 -0
- package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-D0QTo3NZ.js → ishikawaDiagram-UXIWVN3A-BKcg_z4w.js} +2 -2
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-BKcg_z4w.js.br +0 -0
- package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-BKcg_z4w.js.gz +0 -0
- package/out/renderer/assets/{item-Cv-tnX8b.js → item-BHEUMM9H.js} +1 -1
- package/out/renderer/assets/item-BHEUMM9H.js.br +0 -0
- package/out/renderer/assets/item-BHEUMM9H.js.gz +0 -0
- package/out/renderer/assets/{journeyDiagram-VCZTEJTY-CQV0gdjM.js → journeyDiagram-VCZTEJTY-Bvv8xuxQ.js} +5 -5
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-Bvv8xuxQ.js.br +0 -0
- package/out/renderer/assets/journeyDiagram-VCZTEJTY-Bvv8xuxQ.js.gz +0 -0
- package/out/renderer/assets/{kanban-definition-6JOO6SKY-DouRT6vc.js → kanban-definition-6JOO6SKY-C-gRMpeM.js} +3 -3
- package/out/renderer/assets/kanban-definition-6JOO6SKY-C-gRMpeM.js.br +0 -0
- package/out/renderer/assets/kanban-definition-6JOO6SKY-C-gRMpeM.js.gz +0 -0
- package/out/renderer/assets/{layout-BhbUjpvY.js → layout-B4dSyItA.js} +4 -4
- package/out/renderer/assets/layout-B4dSyItA.js.br +0 -0
- package/out/renderer/assets/layout-B4dSyItA.js.gz +0 -0
- package/out/renderer/assets/{linear-D1WO10JK.js → linear-CoVhuer7.js} +1 -1
- package/out/renderer/assets/linear-CoVhuer7.js.br +0 -0
- package/out/renderer/assets/linear-CoVhuer7.js.gz +0 -0
- package/out/renderer/assets/{link-2-C5KPDK2L.js → link-2-DHUPzNSt.js} +1 -1
- package/out/renderer/assets/{mermaid-GHXKKRXX-KwA2c0l5.js → mermaid-GHXKKRXX-CZqkhGx7.js} +54 -54
- package/out/renderer/assets/mermaid-GHXKKRXX-CZqkhGx7.js.br +0 -0
- package/out/renderer/assets/mermaid-GHXKKRXX-CZqkhGx7.js.gz +0 -0
- package/out/renderer/assets/mic-BgSvicCB.js +22 -0
- package/out/renderer/assets/{min-BP2C7bzG.js → min-emzuJjmk.js} +2 -2
- package/out/renderer/assets/min-emzuJjmk.js.br +0 -0
- package/out/renderer/assets/min-emzuJjmk.js.gz +0 -0
- package/out/renderer/assets/{mindmap-definition-QFDTVHPH-CxLYrjVp.js → mindmap-definition-QFDTVHPH-DQ4JNECm.js} +4 -4
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-DQ4JNECm.js.br +0 -0
- package/out/renderer/assets/mindmap-definition-QFDTVHPH-DQ4JNECm.js.gz +0 -0
- package/out/renderer/assets/{open-guide-UhaRhiI6.js → open-guide-CfLO-Sdk.js} +1 -1
- package/out/renderer/assets/{package-search-DpyeQ5Lx.js → package-search-CrF2Iegl.js} +1 -1
- package/out/renderer/assets/{pieDiagram-DEJITSTG-D1LBRn_k.js → pieDiagram-DEJITSTG-0H6CGQQt.js} +7 -7
- package/out/renderer/assets/pieDiagram-DEJITSTG-0H6CGQQt.js.br +0 -0
- package/out/renderer/assets/pieDiagram-DEJITSTG-0H6CGQQt.js.gz +0 -0
- package/out/renderer/assets/{plus-CsV_3veW.js → plus-YNCXW-GD.js} +1 -1
- package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-89cdKeKP.js → quadrantDiagram-34T5L4WZ-D0aPKp5z.js} +3 -3
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-D0aPKp5z.js.br +0 -0
- package/out/renderer/assets/quadrantDiagram-34T5L4WZ-D0aPKp5z.js.gz +0 -0
- package/out/renderer/assets/{refresh-cw-CYW3HR-E.js → refresh-cw-Bvm578nW.js} +1 -1
- package/out/renderer/assets/{requirementDiagram-MS252O5E-BPmX5cbr.js → requirementDiagram-MS252O5E-BkzwapW_.js} +4 -4
- package/out/renderer/assets/requirementDiagram-MS252O5E-BkzwapW_.js.br +0 -0
- package/out/renderer/assets/requirementDiagram-MS252O5E-BkzwapW_.js.gz +0 -0
- package/out/renderer/assets/{resizable-C_plViAK.js → resizable-cStzNJ8V.js} +1 -1
- package/out/renderer/assets/resizable-cStzNJ8V.js.br +0 -0
- package/out/renderer/assets/resizable-cStzNJ8V.js.gz +0 -0
- package/out/renderer/assets/{sankeyDiagram-XADWPNL6-Cy6CP9QU.js → sankeyDiagram-XADWPNL6-Dbde7usj.js} +2 -2
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-Dbde7usj.js.br +0 -0
- package/out/renderer/assets/sankeyDiagram-XADWPNL6-Dbde7usj.js.gz +0 -0
- package/out/renderer/assets/{schedule-BRGzJU8Q.js → schedule-DNMCsk-G.js} +9 -10
- package/out/renderer/assets/schedule-DNMCsk-G.js.br +0 -0
- package/out/renderer/assets/schedule-DNMCsk-G.js.gz +0 -0
- package/out/renderer/assets/{search-BHyqy--Q.js → search-BEY9yGF_.js} +1 -1
- package/out/renderer/assets/{sequenceDiagram-FGHM5R23-B3c7Za1w.js → sequenceDiagram-FGHM5R23-DI8l1pSL.js} +4 -4
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-DI8l1pSL.js.br +0 -0
- package/out/renderer/assets/sequenceDiagram-FGHM5R23-DI8l1pSL.js.gz +0 -0
- package/out/renderer/assets/{session-DAyi31xW.js → session-Bn5k9ScR.js} +616 -55
- package/out/renderer/assets/session-Bn5k9ScR.js.br +0 -0
- package/out/renderer/assets/session-Bn5k9ScR.js.gz +0 -0
- package/out/renderer/assets/{setting-dialog-B9QpnCSy.js → setting-dialog-sqfPfGsy.js} +3 -3
- package/out/renderer/assets/setting-dialog-sqfPfGsy.js.br +0 -0
- package/out/renderer/assets/setting-dialog-sqfPfGsy.js.gz +0 -0
- package/out/renderer/assets/{settings-2-DTnwbGMG.js → settings-2-DRhoXOO8.js} +1 -1
- package/out/renderer/assets/{settings-agents-BrAPSjkm.js → settings-agents-Bntc31Nn.js} +10 -11
- package/out/renderer/assets/settings-agents-Bntc31Nn.js.br +0 -0
- package/out/renderer/assets/settings-agents-Bntc31Nn.js.gz +0 -0
- package/out/renderer/assets/{settings-general-Ck2OiZjy.js → settings-general-DhbLb9cP.js} +2 -2
- package/out/renderer/assets/settings-general-DhbLb9cP.js.br +0 -0
- package/out/renderer/assets/settings-general-DhbLb9cP.js.gz +0 -0
- package/out/renderer/assets/{settings-ilink-D0Br74W_.js → settings-ilink-C7nGGjwT.js} +3 -3
- package/out/renderer/assets/settings-ilink-C7nGGjwT.js.br +0 -0
- package/out/renderer/assets/settings-ilink-C7nGGjwT.js.gz +0 -0
- package/out/renderer/assets/{settings-image-generation-BdyKoUUZ.js → settings-image-generation-H2dgqG7Y.js} +6 -7
- package/out/renderer/assets/settings-image-generation-H2dgqG7Y.js.br +0 -0
- package/out/renderer/assets/settings-image-generation-H2dgqG7Y.js.gz +0 -0
- package/out/renderer/assets/{settings-layout-B7d1oQnz.js → settings-layout-ATto1xpJ.js} +9 -3
- package/out/renderer/assets/settings-layout-ATto1xpJ.js.br +0 -0
- package/out/renderer/assets/settings-layout-ATto1xpJ.js.gz +0 -0
- package/out/renderer/assets/{settings-mcp-DtnVGpCh.js → settings-mcp-DUdMuoJ-.js} +7 -8
- package/out/renderer/assets/settings-mcp-DUdMuoJ-.js.br +0 -0
- package/out/renderer/assets/settings-mcp-DUdMuoJ-.js.gz +0 -0
- package/out/renderer/assets/{settings-memory-Bff_D3Id.js → settings-memory-CJLG4aHW.js} +3 -3
- package/out/renderer/assets/settings-memory-CJLG4aHW.js.br +0 -0
- package/out/renderer/assets/settings-memory-CJLG4aHW.js.gz +0 -0
- package/out/renderer/assets/{settings-snippets-CuwNZ684.js → settings-snippets-B4VcnD5Z.js} +6 -7
- package/out/renderer/assets/settings-snippets-B4VcnD5Z.js.br +0 -0
- package/out/renderer/assets/settings-snippets-B4VcnD5Z.js.gz +0 -0
- package/out/renderer/assets/settings-speech-to-text-DQ7lfkTu.js +1054 -0
- package/out/renderer/assets/settings-speech-to-text-DQ7lfkTu.js.br +0 -0
- package/out/renderer/assets/settings-speech-to-text-DQ7lfkTu.js.gz +0 -0
- package/out/renderer/assets/{settings-webui-CcjZQw6G.js → settings-webui-DZf9O-6j.js} +2 -2
- package/out/renderer/assets/settings-webui-DZf9O-6j.js.br +0 -0
- package/out/renderer/assets/settings-webui-DZf9O-6j.js.gz +0 -0
- package/out/renderer/assets/{skills-installed-BR3EmTKD.js → skills-installed-Dp0r_4I-.js} +4 -4
- package/out/renderer/assets/skills-installed-Dp0r_4I-.js.br +0 -0
- package/out/renderer/assets/skills-installed-Dp0r_4I-.js.gz +0 -0
- package/out/renderer/assets/{skills-layout-Cgy95TdD.js → skills-layout-D-5rlY38.js} +2 -2
- package/out/renderer/assets/skills-layout-D-5rlY38.js.br +0 -0
- package/out/renderer/assets/skills-layout-D-5rlY38.js.gz +0 -0
- package/out/renderer/assets/{skills-skills-sh-7eO0Llg2.js → skills-skills-sh-CcLoIrSw.js} +4 -4
- package/out/renderer/assets/skills-skills-sh-CcLoIrSw.js.br +0 -0
- package/out/renderer/assets/skills-skills-sh-CcLoIrSw.js.gz +0 -0
- package/out/renderer/assets/{sortable.esm-BTWJnVbf.js → sortable.esm-knFxDx0Y.js} +1 -1
- package/out/renderer/assets/sortable.esm-knFxDx0Y.js.br +0 -0
- package/out/renderer/assets/sortable.esm-knFxDx0Y.js.gz +0 -0
- package/out/renderer/assets/{standard-schema-Dk273X__.js → standard-schema-dKXoCekr.js} +1 -1
- package/out/renderer/assets/standard-schema-dKXoCekr.js.br +0 -0
- package/out/renderer/assets/standard-schema-dKXoCekr.js.gz +0 -0
- package/out/renderer/assets/{stateDiagram-FHFEXIEX-C-7WuE0a.js → stateDiagram-FHFEXIEX-DWWz4PMv.js} +9 -9
- package/out/renderer/assets/stateDiagram-FHFEXIEX-DWWz4PMv.js.br +0 -0
- package/out/renderer/assets/stateDiagram-FHFEXIEX-DWWz4PMv.js.gz +0 -0
- package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-IZRTgRo8.js → stateDiagram-v2-QKLJ7IA2-Dm2qD5bg.js} +5 -5
- package/out/renderer/assets/{task-Bd1x6VfK.js → task-C5dyYbfn.js} +11 -12
- package/out/renderer/assets/task-C5dyYbfn.js.br +0 -0
- package/out/renderer/assets/task-C5dyYbfn.js.gz +0 -0
- package/out/renderer/assets/{textarea-CcqU8Ki7.js → textarea-DTqKlQbL.js} +1 -1
- package/out/renderer/assets/{timeline-definition-GMOUNBTQ-DVUMAatS.js → timeline-definition-GMOUNBTQ-A1tEoL9d.js} +3 -3
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-A1tEoL9d.js.br +0 -0
- package/out/renderer/assets/timeline-definition-GMOUNBTQ-A1tEoL9d.js.gz +0 -0
- package/out/renderer/assets/{vennDiagram-DHZGUBPP-BtKdpgmE.js → vennDiagram-DHZGUBPP-tNdYrJi_.js} +2 -2
- package/out/renderer/assets/vennDiagram-DHZGUBPP-tNdYrJi_.js.br +0 -0
- package/out/renderer/assets/vennDiagram-DHZGUBPP-tNdYrJi_.js.gz +0 -0
- package/out/renderer/assets/{wardley-RL74JXVD-DRlpukah.js → wardley-RL74JXVD-BxN5_Sp6.js} +4 -4
- package/out/renderer/assets/wardley-RL74JXVD-BxN5_Sp6.js.br +0 -0
- package/out/renderer/assets/wardley-RL74JXVD-BxN5_Sp6.js.gz +0 -0
- package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-c_iDOO-3.js → wardleyDiagram-NUSXRM2D-B_3jA8zU.js} +6 -6
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-B_3jA8zU.js.br +0 -0
- package/out/renderer/assets/wardleyDiagram-NUSXRM2D-B_3jA8zU.js.gz +0 -0
- package/out/renderer/assets/{wrench-C-pOIUrz.js → wrench-7r-g9MUq.js} +1 -1
- package/out/renderer/assets/wrench-7r-g9MUq.js.br +0 -0
- package/out/renderer/assets/wrench-7r-g9MUq.js.gz +0 -0
- package/out/renderer/assets/{xlsx-view-Ca3bToM7.js → xlsx-view-Bv0YhA5m.js} +9 -9
- package/out/renderer/assets/xlsx-view-Bv0YhA5m.js.br +0 -0
- package/out/renderer/assets/xlsx-view-Bv0YhA5m.js.gz +0 -0
- package/out/renderer/assets/{xychartDiagram-5P7HB3ND-D65drBbj.js → xychartDiagram-5P7HB3ND-NNVuzC4j.js} +3 -3
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-NNVuzC4j.js.br +0 -0
- package/out/renderer/assets/xychartDiagram-5P7HB3ND-NNVuzC4j.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/server/main.js +247 -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-OYMX7WX6-CrS7loi7.js.gz +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/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,22 +1,21 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./code-editor-
|
|
2
|
-
import {
|
|
3
|
-
import { S as Settings2 } from "./settings-2-
|
|
4
|
-
import { i as isValidMessageToDisplay, M as MessageBubble, A as ArrowUpToLine, S as Square, j as jsonToPrettyYamlExports, p as parseFileReference, c as CodeCompareView, r as resolveFileUrl, I as ImageView, P as PdfView, D as DocxView, a as PptxView, X as XlsxView, R as RotateCcw, F as Folders } from "./xlsx-view-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { A as ArrowLeft } from "./arrow-left-
|
|
9
|
-
import { aQ as CodeView, S as StreamMarkdown, aR as FileIcon } from "./mermaid-GHXKKRXX-
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import
|
|
16
|
-
import "./
|
|
17
|
-
import "./item-Cv-tnX8b.js";
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./code-editor-CEXlC4aV.js","./index-LmYTNvdF.js","./index-aGJ_yZib.css","./mermaid-GHXKKRXX-CZqkhGx7.js","./code-editor-BwxubRqT.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import { h as createLucideIcon, r as reactExports, am as formatErrorMessage, bq as ReactStore, br as popupStoreSelectors, bs as triggerHover, al as triggerPress, bt as escapeKey, bu as attachPreventUnmountOnClose, bv as closePress, bw as PATIENT_CLICK_THRESHOLD, ae as reactDomExports, bx as focusOut, by as setPopupOpenState, bz as createInitialPopupStoreState, bA as createPopupFloatingRootContext, bB as Timeout, bC as PopupTriggerMap, j as jsxRuntimeExports, bD as FloatingTree, bE as usePopupRootSync, bF as useImplicitActiveTrigger, bG as useOpenStateTransitions, ak as createChangeEventDetails, bH as imperativeAction, bI as PopupHandleAttachment, bJ as usePopupRootStore, bK as useDismiss, bL as usePopupInteractionProps, bM as usePopupHandleStore, ai as useBaseUiId, bN as useTriggerDataForwarding, bO as useHoverReferenceInteraction, bP as safePolygon, bQ as useClick, bR as useOpenMethodTriggerProps, aq as useButton, bS as useTriggerFocusGuards, ap as useRenderElement, bT as CLICK_TRIGGER_IDENTIFIER, bU as FocusGuard, bV as pressableTriggerOpenStateMapping, bW as triggerOpenStateMapping, bX as FloatingPortal, bY as POPUP_COLLISION_AVOIDANCE, bZ as useFloatingNodeId, at as useAnimationsFinished, b_ as useAnchorPositioning, au as useIsoLayoutEffect, b$ as useAnchoredPopupScrollLock, c0 as usePositioner, c1 as InternalBackdrop, c2 as inertValue, c3 as FloatingNode, aj as useStableCallback, c4 as useToolbarRootContext, av as useOpenChangeComplete, c5 as useHoverFloatingInteraction, c6 as createDefaultInitialFocus, c7 as FOCUSABLE_POPUP_PROPS, ba as COMPOSITE_KEYS, c8 as getDisabledMountTransitionStyles, c9 as FloatingFocusManager, ca as isHTMLElement, cb as popupTransitionStateMapping, u as useTranslation, b as useMessage, X as useNavigate, a as useAppStore, _ as Badge, cc as formatUpdatedTime, e as request, V as electron, ab as ALL_FEATURES, ac as FEATURE_I18N_KEYS, M as cn$1, c as Switch, B as Button, R as LoaderCircle, cd as buttonVariants, i as isWebUI, U as FolderOpen, C as Check, d as Copy, f as extractErrorMessage, aG as reduceFlushStreaming, aF as reduceSessionNotification, g as copyText, ad as React, ce as Tooltip, cf as TooltipTrigger, cg as TooltipContent, S as ScrollArea, a5 as Bot, ch as formatDuration, af as getDefaultExportFromCjs, ci as ReactDOM, Y as subscribe, cj as clientId, A as DropdownMenu, E as DropdownMenuTrigger, ck as ChevronDown, F as DropdownMenuContent, G as DropdownMenuItem, cl as v$2, J as generateUUID, cm as HoverCard, cn as HoverCardTrigger, co as HoverCardContent, cp as X$1, aI as Folder, L as Library, cq as DropdownMenuSub, cr as DropdownMenuSubTrigger, cs as DropdownMenuSubContent, ct as CircleQuestionMark, cu as ChevronUp, aH as Clock, aB as Tabs, aC as TabsList, aD as TabsTrigger, cv as z$1, a0 as CircleCheck, cw as __vitePreload, I as Input, m as ContextMenuContent, n as ContextMenuItem, o as ContextMenuSeparator, cx as Code, bk as EDITOR_LABELS, k as ContextMenu, l as ContextMenuTrigger, aE as webUIBaseUrl, aa as ChevronRight, cy as MessageSquare, cz as FolderPlus, P as Pencil, T as Trash2, cA as useProjectState, cB as TabsContent } from "./index-LmYTNvdF.js";
|
|
3
|
+
import { S as Settings2 } from "./settings-2-DRhoXOO8.js";
|
|
4
|
+
import { i as isValidMessageToDisplay, M as MessageBubble, A as ArrowUpToLine, S as Square, j as jsonToPrettyYamlExports, p as parseFileReference, c as CodeCompareView, r as resolveFileUrl, I as ImageView, P as PdfView, D as DocxView, a as PptxView, X as XlsxView, R as RotateCcw, F as Folders } from "./xlsx-view-Bv0YhA5m.js";
|
|
5
|
+
import { M as Mic, C as Clipboard } from "./mic-BgSvicCB.js";
|
|
6
|
+
import { I as Image, W as Wrench } from "./wrench-7r-g9MUq.js";
|
|
7
|
+
import { F as FileText } from "./file-text-nGCW6zu1.js";
|
|
8
|
+
import { A as ArrowLeft } from "./arrow-left-CxS1t3f7.js";
|
|
9
|
+
import { aQ as CodeView, S as StreamMarkdown, aR as FileIcon } from "./mermaid-GHXKKRXX-CZqkhGx7.js";
|
|
10
|
+
import { S as Search } from "./search-BEY9yGF_.js";
|
|
11
|
+
import { E as ExternalLink } from "./link-2-DHUPzNSt.js";
|
|
12
|
+
import { R as RefreshCw } from "./refresh-cw-Bvm578nW.js";
|
|
13
|
+
import { P as Plus } from "./plus-YNCXW-GD.js";
|
|
14
|
+
import { R as ResizablePanelGroup, a as ResizablePanel, b as ResizableHandle } from "./resizable-cStzNJ8V.js";
|
|
15
|
+
import "./collapsible-CMuCJUWG.js";
|
|
16
|
+
import "./item-BHEUMM9H.js";
|
|
18
17
|
import "./schemas-c0X-G5_P.js";
|
|
19
|
-
import "./ellipsis-
|
|
18
|
+
import "./ellipsis-D1agTYu1.js";
|
|
20
19
|
const __iconNode$k = [
|
|
21
20
|
["path", { d: "M12 5v14", key: "s699le" }],
|
|
22
21
|
["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
|
|
@@ -922,20 +921,34 @@ function ChatHeader({ session }) {
|
|
|
922
921
|
children: [
|
|
923
922
|
/* @__PURE__ */ jsxRuntimeExports.jsx(PopoverTrigger, { className: "flex size-7 items-center justify-center rounded-md text-sidebar-foreground/45 hover:bg-sidebar-accent/30 hover:text-sidebar-foreground/70 outline-none transition-colors data-pressed:bg-sidebar-accent/40", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Settings2, { className: "size-4" }) }),
|
|
924
923
|
/* @__PURE__ */ jsxRuntimeExports.jsx(PopoverPortal, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(PopoverPositioner, { side: "bottom", align: "end", sideOffset: 4, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(PopoverPopup, { className: "z-10 min-w-96 rounded-lg border border-border bg-popover text-popover-foreground shadow-lg outline-none p-1.5 origin-(--transform-origin) data-ending-style:scale-90 data-starting-style:scale-90 data-ending-style:opacity-0 data-starting-style:opacity-0 transition-[transform,opacity] duration-100", children: [
|
|
925
|
-
/* @__PURE__ */ jsxRuntimeExports.
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
924
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1 py-1", children: [
|
|
925
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
926
|
+
CopyableRow,
|
|
927
|
+
{
|
|
928
|
+
label: t("chatHeader.sessionId", "Session"),
|
|
929
|
+
value: session.id,
|
|
930
|
+
openFolderTitle: t("chatHeader.openSessionFolder", "Open Session Folder"),
|
|
931
|
+
onOpenFolder: async () => {
|
|
932
|
+
const dirPath = await request.getSessionDataSystemPath({
|
|
933
|
+
sessionId: session.id
|
|
934
|
+
});
|
|
935
|
+
if (dirPath) electron.revealInFinder(dirPath);
|
|
936
|
+
}
|
|
936
937
|
}
|
|
937
|
-
}
|
|
938
|
-
|
|
938
|
+
) }),
|
|
939
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
940
|
+
CopyableRow,
|
|
941
|
+
{
|
|
942
|
+
label: t("chatHeader.projectId", "Project"),
|
|
943
|
+
value: currentProjectInfo?.cwd ?? session.projectTitle,
|
|
944
|
+
openFolderTitle: t("chatHeader.openProjectFolder", "Open Project Folder"),
|
|
945
|
+
onOpenFolder: async () => {
|
|
946
|
+
const dirPath = currentProjectInfo?.cwd;
|
|
947
|
+
if (dirPath) electron.revealInFinder(dirPath);
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
) })
|
|
951
|
+
] }),
|
|
939
952
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border/50 my-1" }),
|
|
940
953
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-2 py-1 text-xs font-semibold text-foreground/80", children: t("constant.feature.title", "Features") }),
|
|
941
954
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: ALL_FEATURES.length >= 2 ? "grid grid-cols-2 gap-0.5" : "", children: ALL_FEATURES.map((feature) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
@@ -4314,6 +4327,539 @@ function nodesToMentionText(nodes) {
|
|
|
4314
4327
|
return `@[${prefix}${n.name}](${n.id})`;
|
|
4315
4328
|
}).join(" ");
|
|
4316
4329
|
}
|
|
4330
|
+
const TARGET_SAMPLE_RATE = 16e3;
|
|
4331
|
+
const FRAME_SAMPLES = 320;
|
|
4332
|
+
const workletSource = `
|
|
4333
|
+
class FelloPcmProcessor extends AudioWorkletProcessor {
|
|
4334
|
+
constructor() {
|
|
4335
|
+
super();
|
|
4336
|
+
this.buffer = [];
|
|
4337
|
+
this.position = 0;
|
|
4338
|
+
this.output = [];
|
|
4339
|
+
this.ratio = sampleRate / ${TARGET_SAMPLE_RATE};
|
|
4340
|
+
}
|
|
4341
|
+
process(inputs, outputs) {
|
|
4342
|
+
const input = inputs[0] && inputs[0][0];
|
|
4343
|
+
if (input) {
|
|
4344
|
+
for (let i = 0; i < input.length; i++) this.buffer.push(input[i]);
|
|
4345
|
+
while (this.position + 1 < this.buffer.length) {
|
|
4346
|
+
const index = Math.floor(this.position);
|
|
4347
|
+
const fraction = this.position - index;
|
|
4348
|
+
const sample = this.buffer[index] * (1 - fraction) + this.buffer[index + 1] * fraction;
|
|
4349
|
+
const clamped = Math.max(-1, Math.min(1, sample));
|
|
4350
|
+
this.output.push(clamped < 0 ? clamped * 32768 : clamped * 32767);
|
|
4351
|
+
this.position += this.ratio;
|
|
4352
|
+
if (this.output.length >= ${FRAME_SAMPLES}) {
|
|
4353
|
+
const pcm = new Int16Array(${FRAME_SAMPLES});
|
|
4354
|
+
for (let i = 0; i < ${FRAME_SAMPLES}; i++) pcm[i] = this.output[i];
|
|
4355
|
+
this.output = this.output.slice(${FRAME_SAMPLES});
|
|
4356
|
+
this.port.postMessage(pcm.buffer, [pcm.buffer]);
|
|
4357
|
+
}
|
|
4358
|
+
}
|
|
4359
|
+
const remove = Math.max(0, Math.floor(this.position));
|
|
4360
|
+
if (remove > 0) {
|
|
4361
|
+
this.buffer = this.buffer.slice(remove);
|
|
4362
|
+
this.position -= remove;
|
|
4363
|
+
}
|
|
4364
|
+
}
|
|
4365
|
+
const output = outputs[0] && outputs[0][0];
|
|
4366
|
+
if (output) output.fill(0);
|
|
4367
|
+
return true;
|
|
4368
|
+
}
|
|
4369
|
+
}
|
|
4370
|
+
registerProcessor("fello-pcm-processor", FelloPcmProcessor);
|
|
4371
|
+
`;
|
|
4372
|
+
function arrayBufferToBase64(buffer) {
|
|
4373
|
+
const bytes = new Uint8Array(buffer);
|
|
4374
|
+
let binary = "";
|
|
4375
|
+
const chunkSize = 32768;
|
|
4376
|
+
for (let offset = 0; offset < bytes.length; offset += chunkSize) {
|
|
4377
|
+
binary += String.fromCharCode(...bytes.subarray(offset, offset + chunkSize));
|
|
4378
|
+
}
|
|
4379
|
+
return btoa(binary);
|
|
4380
|
+
}
|
|
4381
|
+
function errorMessage(error) {
|
|
4382
|
+
return error instanceof Error ? error.message : String(error);
|
|
4383
|
+
}
|
|
4384
|
+
function useRealtimeAsr(options) {
|
|
4385
|
+
const { onTranscript, onError, onRecordingChange } = options;
|
|
4386
|
+
const configured = useAppStore((state) => state.speechToText.some((provider) => provider.active));
|
|
4387
|
+
const [recording, setRecording] = reactExports.useState(false);
|
|
4388
|
+
const [audioLevel, setAudioLevel] = reactExports.useState(0);
|
|
4389
|
+
const [inputDevices, setInputDevices] = reactExports.useState([]);
|
|
4390
|
+
const asrSessionIdRef = reactExports.useRef(null);
|
|
4391
|
+
const streamRef = reactExports.useRef(null);
|
|
4392
|
+
const audioContextRef = reactExports.useRef(null);
|
|
4393
|
+
const sourceRef = reactExports.useRef(null);
|
|
4394
|
+
const nodeRef = reactExports.useRef(null);
|
|
4395
|
+
const stoppedRef = reactExports.useRef(false);
|
|
4396
|
+
const stoppingRef = reactExports.useRef(false);
|
|
4397
|
+
const recordingRef = reactExports.useRef(false);
|
|
4398
|
+
const audioLevelValueRef = reactExports.useRef(0);
|
|
4399
|
+
const audioLevelFrameRef = reactExports.useRef(null);
|
|
4400
|
+
const stopRef = reactExports.useRef(async () => {
|
|
4401
|
+
});
|
|
4402
|
+
const callbacksRef = reactExports.useRef({ onTranscript, onError, onRecordingChange });
|
|
4403
|
+
callbacksRef.current = { onTranscript, onError, onRecordingChange };
|
|
4404
|
+
const setRecordingState = reactExports.useCallback((value) => {
|
|
4405
|
+
recordingRef.current = value;
|
|
4406
|
+
setRecording(value);
|
|
4407
|
+
callbacksRef.current.onRecordingChange?.(value);
|
|
4408
|
+
}, []);
|
|
4409
|
+
reactExports.useEffect(() => {
|
|
4410
|
+
const handleTranscript = (event) => {
|
|
4411
|
+
if (event.clientId !== clientId || event.asrSessionId !== asrSessionIdRef.current) return;
|
|
4412
|
+
callbacksRef.current.onTranscript?.({
|
|
4413
|
+
text: event.text,
|
|
4414
|
+
isFinal: event.isFinal,
|
|
4415
|
+
id: event.id,
|
|
4416
|
+
index: event.index
|
|
4417
|
+
});
|
|
4418
|
+
};
|
|
4419
|
+
const handleError = (event) => {
|
|
4420
|
+
if (event.clientId !== clientId || event.asrSessionId !== asrSessionIdRef.current) return;
|
|
4421
|
+
callbacksRef.current.onError?.(event.message);
|
|
4422
|
+
};
|
|
4423
|
+
const handleClosed = (event) => {
|
|
4424
|
+
if (event.clientId !== clientId || event.asrSessionId !== asrSessionIdRef.current) return;
|
|
4425
|
+
if (recordingRef.current && !stoppingRef.current) {
|
|
4426
|
+
callbacksRef.current.onError?.("实时语音识别连接已关闭。");
|
|
4427
|
+
void stopRef.current();
|
|
4428
|
+
}
|
|
4429
|
+
};
|
|
4430
|
+
subscribe.on("asr-transcript", handleTranscript);
|
|
4431
|
+
subscribe.on("asr-error", handleError);
|
|
4432
|
+
subscribe.on("asr-closed", handleClosed);
|
|
4433
|
+
return () => {
|
|
4434
|
+
subscribe.off("asr-transcript", handleTranscript);
|
|
4435
|
+
subscribe.off("asr-error", handleError);
|
|
4436
|
+
subscribe.off("asr-closed", handleClosed);
|
|
4437
|
+
};
|
|
4438
|
+
}, [setRecordingState]);
|
|
4439
|
+
const updateAudioLevel = reactExports.useCallback((buffer) => {
|
|
4440
|
+
const samples = new Int16Array(buffer);
|
|
4441
|
+
if (samples.length === 0) return;
|
|
4442
|
+
let sumSquares = 0;
|
|
4443
|
+
for (const sample of samples) {
|
|
4444
|
+
const normalized = sample / 32768;
|
|
4445
|
+
sumSquares += normalized * normalized;
|
|
4446
|
+
}
|
|
4447
|
+
const rms = Math.sqrt(sumSquares / samples.length);
|
|
4448
|
+
audioLevelValueRef.current = Math.min(1, rms * 4);
|
|
4449
|
+
if (audioLevelFrameRef.current !== null) return;
|
|
4450
|
+
audioLevelFrameRef.current = requestAnimationFrame(() => {
|
|
4451
|
+
audioLevelFrameRef.current = null;
|
|
4452
|
+
setAudioLevel(audioLevelValueRef.current);
|
|
4453
|
+
});
|
|
4454
|
+
}, []);
|
|
4455
|
+
const cleanupAudio = reactExports.useCallback(async () => {
|
|
4456
|
+
if (audioLevelFrameRef.current !== null) {
|
|
4457
|
+
cancelAnimationFrame(audioLevelFrameRef.current);
|
|
4458
|
+
audioLevelFrameRef.current = null;
|
|
4459
|
+
}
|
|
4460
|
+
audioLevelValueRef.current = 0;
|
|
4461
|
+
setAudioLevel(0);
|
|
4462
|
+
nodeRef.current?.disconnect();
|
|
4463
|
+
sourceRef.current?.disconnect();
|
|
4464
|
+
streamRef.current?.getTracks().forEach((track) => track.stop());
|
|
4465
|
+
streamRef.current = null;
|
|
4466
|
+
nodeRef.current = null;
|
|
4467
|
+
sourceRef.current = null;
|
|
4468
|
+
const context = audioContextRef.current;
|
|
4469
|
+
audioContextRef.current = null;
|
|
4470
|
+
await context?.close().catch(() => void 0);
|
|
4471
|
+
}, []);
|
|
4472
|
+
const refreshInputDevices = reactExports.useCallback(async () => {
|
|
4473
|
+
if (!navigator.mediaDevices?.enumerateDevices) return [];
|
|
4474
|
+
try {
|
|
4475
|
+
let devices = await navigator.mediaDevices.enumerateDevices();
|
|
4476
|
+
if (devices.length > 0 && devices.every((device) => !device.label)) {
|
|
4477
|
+
try {
|
|
4478
|
+
const permissionStream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
4479
|
+
permissionStream.getTracks().forEach((track) => track.stop());
|
|
4480
|
+
devices = await navigator.mediaDevices.enumerateDevices();
|
|
4481
|
+
} catch {
|
|
4482
|
+
}
|
|
4483
|
+
}
|
|
4484
|
+
const audioInputs = devices.filter((device) => device.kind === "audioinput").map((device, index) => ({
|
|
4485
|
+
deviceId: device.deviceId,
|
|
4486
|
+
label: device.label || `Microphone ${index + 1}`
|
|
4487
|
+
}));
|
|
4488
|
+
setInputDevices(audioInputs);
|
|
4489
|
+
return audioInputs;
|
|
4490
|
+
} catch (error) {
|
|
4491
|
+
callbacksRef.current.onError?.(errorMessage(error));
|
|
4492
|
+
return [];
|
|
4493
|
+
}
|
|
4494
|
+
}, []);
|
|
4495
|
+
const start = reactExports.useCallback(
|
|
4496
|
+
async (deviceId = "default") => {
|
|
4497
|
+
if (recordingRef.current || !configured) return;
|
|
4498
|
+
const asrSessionId = `asr_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
4499
|
+
asrSessionIdRef.current = asrSessionId;
|
|
4500
|
+
stoppedRef.current = false;
|
|
4501
|
+
stoppingRef.current = false;
|
|
4502
|
+
try {
|
|
4503
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
4504
|
+
audio: {
|
|
4505
|
+
channelCount: 1,
|
|
4506
|
+
echoCancellation: true,
|
|
4507
|
+
noiseSuppression: true,
|
|
4508
|
+
...deviceId !== "default" ? { deviceId: { exact: deviceId } } : {}
|
|
4509
|
+
}
|
|
4510
|
+
});
|
|
4511
|
+
streamRef.current = stream;
|
|
4512
|
+
const audioContext = new AudioContext();
|
|
4513
|
+
audioContextRef.current = audioContext;
|
|
4514
|
+
await audioContext.resume();
|
|
4515
|
+
const workletUrl = URL.createObjectURL(
|
|
4516
|
+
new Blob([workletSource], { type: "application/javascript" })
|
|
4517
|
+
);
|
|
4518
|
+
try {
|
|
4519
|
+
await audioContext.audioWorklet.addModule(workletUrl);
|
|
4520
|
+
} finally {
|
|
4521
|
+
URL.revokeObjectURL(workletUrl);
|
|
4522
|
+
}
|
|
4523
|
+
const source = audioContext.createMediaStreamSource(stream);
|
|
4524
|
+
const node = new AudioWorkletNode(audioContext, "fello-pcm-processor");
|
|
4525
|
+
const silentGain = audioContext.createGain();
|
|
4526
|
+
silentGain.gain.value = 0;
|
|
4527
|
+
node.port.onmessage = (message) => {
|
|
4528
|
+
if (stoppedRef.current || asrSessionIdRef.current !== asrSessionId) return;
|
|
4529
|
+
updateAudioLevel(message.data);
|
|
4530
|
+
void request.sendRealtimeAsrFrame({
|
|
4531
|
+
clientId,
|
|
4532
|
+
asrSessionId,
|
|
4533
|
+
audioB64: arrayBufferToBase64(message.data)
|
|
4534
|
+
}).catch((error) => callbacksRef.current.onError?.(errorMessage(error)));
|
|
4535
|
+
};
|
|
4536
|
+
sourceRef.current = source;
|
|
4537
|
+
nodeRef.current = node;
|
|
4538
|
+
await request.startRealtimeAsr({ clientId, asrSessionId });
|
|
4539
|
+
source.connect(node);
|
|
4540
|
+
node.connect(silentGain);
|
|
4541
|
+
silentGain.connect(audioContext.destination);
|
|
4542
|
+
setRecordingState(true);
|
|
4543
|
+
} catch (error) {
|
|
4544
|
+
await cleanupAudio();
|
|
4545
|
+
await request.stopRealtimeAsr({ clientId, asrSessionId }).catch(() => void 0);
|
|
4546
|
+
asrSessionIdRef.current = null;
|
|
4547
|
+
callbacksRef.current.onError?.(errorMessage(error));
|
|
4548
|
+
setRecordingState(false);
|
|
4549
|
+
}
|
|
4550
|
+
},
|
|
4551
|
+
[cleanupAudio, configured, setRecordingState, updateAudioLevel]
|
|
4552
|
+
);
|
|
4553
|
+
const stop = reactExports.useCallback(async () => {
|
|
4554
|
+
const asrSessionId = asrSessionIdRef.current;
|
|
4555
|
+
if (!asrSessionId) return;
|
|
4556
|
+
stoppedRef.current = true;
|
|
4557
|
+
stoppingRef.current = true;
|
|
4558
|
+
await cleanupAudio();
|
|
4559
|
+
await request.stopRealtimeAsr({ clientId, asrSessionId }).catch((error) => {
|
|
4560
|
+
callbacksRef.current.onError?.(errorMessage(error));
|
|
4561
|
+
});
|
|
4562
|
+
asrSessionIdRef.current = null;
|
|
4563
|
+
stoppingRef.current = false;
|
|
4564
|
+
setRecordingState(false);
|
|
4565
|
+
}, [cleanupAudio, setRecordingState]);
|
|
4566
|
+
stopRef.current = stop;
|
|
4567
|
+
reactExports.useEffect(() => {
|
|
4568
|
+
return () => {
|
|
4569
|
+
stoppedRef.current = true;
|
|
4570
|
+
void stopRef.current();
|
|
4571
|
+
};
|
|
4572
|
+
}, []);
|
|
4573
|
+
const toggle = reactExports.useCallback(() => {
|
|
4574
|
+
void (recordingRef.current ? stop() : start());
|
|
4575
|
+
}, [start, stop]);
|
|
4576
|
+
return {
|
|
4577
|
+
recording,
|
|
4578
|
+
audioLevel,
|
|
4579
|
+
configured,
|
|
4580
|
+
inputDevices,
|
|
4581
|
+
refreshInputDevices,
|
|
4582
|
+
start,
|
|
4583
|
+
stop,
|
|
4584
|
+
toggle
|
|
4585
|
+
};
|
|
4586
|
+
}
|
|
4587
|
+
const ASR_WAVEFORM_BARS = [0.35, 0.65, 0.95, 0.55, 0.8, 0.45, 0.9, 0.6, 0.38];
|
|
4588
|
+
const DEFAULT_MAX_DURATION = 5 * 60 * 1e3;
|
|
4589
|
+
const VOICE_INPUT_DEVICE_STORAGE_KEY = "fello.voice-input.device-id";
|
|
4590
|
+
function getInputCursor(input) {
|
|
4591
|
+
return input.selectionStart ?? input.value.length;
|
|
4592
|
+
}
|
|
4593
|
+
function VoiceInputButton({
|
|
4594
|
+
inputRef,
|
|
4595
|
+
disabled = false,
|
|
4596
|
+
className,
|
|
4597
|
+
maxDuration = DEFAULT_MAX_DURATION,
|
|
4598
|
+
ref
|
|
4599
|
+
}) {
|
|
4600
|
+
const { t } = useTranslation();
|
|
4601
|
+
const { toast } = useMessage();
|
|
4602
|
+
const asrApplyingRef = reactExports.useRef(false);
|
|
4603
|
+
const asrSegmentsRef = reactExports.useRef(/* @__PURE__ */ new Map());
|
|
4604
|
+
const asrTailRef = reactExports.useRef(0);
|
|
4605
|
+
const asrCurrentKeyRef = reactExports.useRef(null);
|
|
4606
|
+
const asrSequenceRef = reactExports.useRef(0);
|
|
4607
|
+
const freezeAsrSegments = reactExports.useCallback(() => {
|
|
4608
|
+
asrSegmentsRef.current.clear();
|
|
4609
|
+
asrCurrentKeyRef.current = null;
|
|
4610
|
+
const textarea = inputRef.current;
|
|
4611
|
+
if (textarea) asrTailRef.current = getInputCursor(textarea);
|
|
4612
|
+
}, [inputRef]);
|
|
4613
|
+
const applyAsrTranscript = reactExports.useCallback(
|
|
4614
|
+
(transcript) => {
|
|
4615
|
+
const textarea = inputRef.current;
|
|
4616
|
+
if (!textarea) return;
|
|
4617
|
+
const key = transcript.id ? `id:${transcript.id}` : transcript.index !== void 0 ? `index:${transcript.index}` : asrCurrentKeyRef.current ?? `stream:${asrSequenceRef.current++}`;
|
|
4618
|
+
let segment = asrSegmentsRef.current.get(key);
|
|
4619
|
+
if (!segment) {
|
|
4620
|
+
segment = { start: asrTailRef.current, length: 0 };
|
|
4621
|
+
asrSegmentsRef.current.set(key, segment);
|
|
4622
|
+
asrCurrentKeyRef.current = key;
|
|
4623
|
+
}
|
|
4624
|
+
textarea.focus();
|
|
4625
|
+
textarea.setSelectionRange(segment.start, segment.start + segment.length);
|
|
4626
|
+
asrApplyingRef.current = true;
|
|
4627
|
+
try {
|
|
4628
|
+
document.execCommand("insertText", false, transcript.text);
|
|
4629
|
+
} finally {
|
|
4630
|
+
asrApplyingRef.current = false;
|
|
4631
|
+
}
|
|
4632
|
+
textarea.ownerDocument.dispatchEvent(new Event("selectionchange"));
|
|
4633
|
+
segment.length = transcript.text.length;
|
|
4634
|
+
asrTailRef.current = segment.start + segment.length;
|
|
4635
|
+
if (transcript.isFinal) {
|
|
4636
|
+
asrSegmentsRef.current.delete(key);
|
|
4637
|
+
asrCurrentKeyRef.current = null;
|
|
4638
|
+
}
|
|
4639
|
+
},
|
|
4640
|
+
[inputRef]
|
|
4641
|
+
);
|
|
4642
|
+
const asr = useRealtimeAsr({
|
|
4643
|
+
onTranscript: applyAsrTranscript,
|
|
4644
|
+
onError: (message) => toast.error(message),
|
|
4645
|
+
onRecordingChange: (recording) => {
|
|
4646
|
+
if (!recording) freezeAsrSegments();
|
|
4647
|
+
}
|
|
4648
|
+
});
|
|
4649
|
+
const { start: startAsr, stop: stopAsr, refreshInputDevices } = asr;
|
|
4650
|
+
const handleStop = reactExports.useCallback(async () => {
|
|
4651
|
+
await stopAsr();
|
|
4652
|
+
}, [stopAsr]);
|
|
4653
|
+
reactExports.useImperativeHandle(
|
|
4654
|
+
ref,
|
|
4655
|
+
() => ({
|
|
4656
|
+
stop: handleStop
|
|
4657
|
+
}),
|
|
4658
|
+
[handleStop]
|
|
4659
|
+
);
|
|
4660
|
+
const handleStart = reactExports.useCallback(
|
|
4661
|
+
async (deviceId) => {
|
|
4662
|
+
const textarea = inputRef.current;
|
|
4663
|
+
if (!textarea) return;
|
|
4664
|
+
textarea.focus();
|
|
4665
|
+
const cursorPosition = getInputCursor(textarea);
|
|
4666
|
+
const before = textarea.value.slice(0, cursorPosition);
|
|
4667
|
+
if (before.length > 0 && !/\s$/.test(before)) {
|
|
4668
|
+
asrApplyingRef.current = true;
|
|
4669
|
+
try {
|
|
4670
|
+
document.execCommand("insertText", false, " ");
|
|
4671
|
+
} finally {
|
|
4672
|
+
asrApplyingRef.current = false;
|
|
4673
|
+
}
|
|
4674
|
+
}
|
|
4675
|
+
asrSegmentsRef.current.clear();
|
|
4676
|
+
asrCurrentKeyRef.current = null;
|
|
4677
|
+
asrTailRef.current = getInputCursor(textarea);
|
|
4678
|
+
await startAsr(deviceId);
|
|
4679
|
+
},
|
|
4680
|
+
[startAsr, inputRef]
|
|
4681
|
+
);
|
|
4682
|
+
const [savedDeviceId, setSavedDeviceId] = reactExports.useState(() => {
|
|
4683
|
+
try {
|
|
4684
|
+
return localStorage.getItem(VOICE_INPUT_DEVICE_STORAGE_KEY);
|
|
4685
|
+
} catch {
|
|
4686
|
+
return null;
|
|
4687
|
+
}
|
|
4688
|
+
});
|
|
4689
|
+
const [deviceMenuOpen, setDeviceMenuOpen] = reactExports.useState(false);
|
|
4690
|
+
const rememberDevice = reactExports.useCallback((deviceId) => {
|
|
4691
|
+
setSavedDeviceId(deviceId);
|
|
4692
|
+
try {
|
|
4693
|
+
localStorage.setItem(VOICE_INPUT_DEVICE_STORAGE_KEY, deviceId);
|
|
4694
|
+
} catch {
|
|
4695
|
+
}
|
|
4696
|
+
}, []);
|
|
4697
|
+
const handleSelectDevice = reactExports.useCallback(
|
|
4698
|
+
(deviceId) => {
|
|
4699
|
+
rememberDevice(deviceId);
|
|
4700
|
+
setDeviceMenuOpen(false);
|
|
4701
|
+
},
|
|
4702
|
+
[rememberDevice]
|
|
4703
|
+
);
|
|
4704
|
+
const handleMicClick = reactExports.useCallback(async () => {
|
|
4705
|
+
const devices = await refreshInputDevices();
|
|
4706
|
+
const hasSavedDevice = savedDeviceId != null && devices.some((device) => device.deviceId === savedDeviceId);
|
|
4707
|
+
if (hasSavedDevice) {
|
|
4708
|
+
await handleStart(savedDeviceId);
|
|
4709
|
+
} else {
|
|
4710
|
+
setDeviceMenuOpen(true);
|
|
4711
|
+
}
|
|
4712
|
+
}, [refreshInputDevices, handleStart, savedDeviceId]);
|
|
4713
|
+
const handleDeviceMenuChange = reactExports.useCallback(
|
|
4714
|
+
(open) => {
|
|
4715
|
+
setDeviceMenuOpen(open);
|
|
4716
|
+
if (open) void refreshInputDevices();
|
|
4717
|
+
},
|
|
4718
|
+
[refreshInputDevices]
|
|
4719
|
+
);
|
|
4720
|
+
reactExports.useEffect(() => {
|
|
4721
|
+
const textarea = inputRef.current;
|
|
4722
|
+
if (!textarea) return;
|
|
4723
|
+
const handleInput = () => {
|
|
4724
|
+
if (!asrApplyingRef.current && asr.recording) freezeAsrSegments();
|
|
4725
|
+
};
|
|
4726
|
+
textarea.addEventListener("input", handleInput);
|
|
4727
|
+
return () => textarea.removeEventListener("input", handleInput);
|
|
4728
|
+
}, [asr.recording, freezeAsrSegments, inputRef]);
|
|
4729
|
+
reactExports.useEffect(() => {
|
|
4730
|
+
if (disabled && asr.recording) void handleStop();
|
|
4731
|
+
}, [asr.recording, disabled, handleStop]);
|
|
4732
|
+
reactExports.useEffect(() => {
|
|
4733
|
+
if (!asr.recording || maxDuration <= 0 || !Number.isFinite(maxDuration)) return;
|
|
4734
|
+
const timer = setTimeout(() => void handleStop(), maxDuration);
|
|
4735
|
+
return () => clearTimeout(timer);
|
|
4736
|
+
}, [asr.recording, handleStop, maxDuration]);
|
|
4737
|
+
if (!asr.configured) return null;
|
|
4738
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
4739
|
+
"div",
|
|
4740
|
+
{
|
|
4741
|
+
className: cn$1(
|
|
4742
|
+
"relative inline-flex h-7 transition-[width] duration-300 ease-out",
|
|
4743
|
+
asr.recording ? "w-18" : "w-12.5",
|
|
4744
|
+
className
|
|
4745
|
+
),
|
|
4746
|
+
children: [
|
|
4747
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
4748
|
+
"div",
|
|
4749
|
+
{
|
|
4750
|
+
className: cn$1(
|
|
4751
|
+
"absolute inset-0 transition-[opacity,transform,visibility] duration-300 ease-out",
|
|
4752
|
+
asr.recording ? "visible scale-100 opacity-100" : "pointer-events-none invisible scale-90 opacity-0"
|
|
4753
|
+
),
|
|
4754
|
+
"aria-hidden": !asr.recording,
|
|
4755
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
4756
|
+
Button,
|
|
4757
|
+
{
|
|
4758
|
+
variant: "default",
|
|
4759
|
+
size: "sm",
|
|
4760
|
+
className: "h-full w-full rounded-lg bg-muted hover:bg-input border border-input text-amber-300/50 hover:text-amber-200",
|
|
4761
|
+
onClick: () => void handleStop(),
|
|
4762
|
+
"aria-label": t("chatInput.stopVoiceInput", "Stop voice input"),
|
|
4763
|
+
"aria-pressed": "true",
|
|
4764
|
+
title: t("chatInput.stopVoiceInput", "Stop voice input"),
|
|
4765
|
+
children: [
|
|
4766
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Mic, { className: "size-3.5 shrink-0 animate-pulse" }),
|
|
4767
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
4768
|
+
"span",
|
|
4769
|
+
{
|
|
4770
|
+
className: "flex h-4 flex-1 items-center justify-center gap-0.5 overflow-hidden",
|
|
4771
|
+
"aria-hidden": "true",
|
|
4772
|
+
children: ASR_WAVEFORM_BARS.map((scale, index) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
4773
|
+
"span",
|
|
4774
|
+
{
|
|
4775
|
+
className: "border-l rounded-full bg-amber-300 transition-[height] duration-75",
|
|
4776
|
+
style: {
|
|
4777
|
+
height: `${Math.max(2, Math.round(2 + asr.audioLevel * 16 * scale))}px`
|
|
4778
|
+
}
|
|
4779
|
+
},
|
|
4780
|
+
index
|
|
4781
|
+
))
|
|
4782
|
+
}
|
|
4783
|
+
)
|
|
4784
|
+
]
|
|
4785
|
+
}
|
|
4786
|
+
)
|
|
4787
|
+
}
|
|
4788
|
+
),
|
|
4789
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
4790
|
+
"div",
|
|
4791
|
+
{
|
|
4792
|
+
className: cn$1(
|
|
4793
|
+
"absolute inset-0 transition-[opacity,transform,visibility] duration-300 ease-out",
|
|
4794
|
+
asr.recording ? "pointer-events-none invisible scale-90 opacity-0" : "visible scale-100 opacity-100"
|
|
4795
|
+
),
|
|
4796
|
+
"aria-hidden": asr.recording,
|
|
4797
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DropdownMenu, { open: deviceMenuOpen, onOpenChange: handleDeviceMenuChange, children: [
|
|
4798
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full items-stretch", children: [
|
|
4799
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
4800
|
+
Button,
|
|
4801
|
+
{
|
|
4802
|
+
size: "sm",
|
|
4803
|
+
className: "h-full w-8 rounded-r-none border-r-0 bg-muted hover:bg-input border border-input text-amber-300/50 hover:text-amber-200",
|
|
4804
|
+
onClick: () => void handleMicClick(),
|
|
4805
|
+
disabled: disabled || !asr.configured,
|
|
4806
|
+
"aria-label": t("chatInput.voiceInput", "Voice input"),
|
|
4807
|
+
title: asr.configured ? t("chatInput.voiceInput", "Voice input") : t("chatInput.voiceInputNotConfigured", "Configure voice input in Settings"),
|
|
4808
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(Mic, { className: "size-3.5" })
|
|
4809
|
+
}
|
|
4810
|
+
),
|
|
4811
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
4812
|
+
DropdownMenuTrigger,
|
|
4813
|
+
{
|
|
4814
|
+
render: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
4815
|
+
Button,
|
|
4816
|
+
{
|
|
4817
|
+
size: "icon",
|
|
4818
|
+
className: "h-full w-4.5 rounded-l-none bg-muted hover:bg-input border border-input border-l-0 px-0 text-amber-300/50 hover:text-amber-200",
|
|
4819
|
+
disabled: disabled || !asr.configured,
|
|
4820
|
+
"aria-label": t("chatInput.selectVoiceInputDevice", "Select microphone"),
|
|
4821
|
+
title: t("chatInput.selectVoiceInputDevice", "Select microphone")
|
|
4822
|
+
}
|
|
4823
|
+
),
|
|
4824
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "size-3" })
|
|
4825
|
+
}
|
|
4826
|
+
)
|
|
4827
|
+
] }),
|
|
4828
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
4829
|
+
DropdownMenuContent,
|
|
4830
|
+
{
|
|
4831
|
+
side: "top",
|
|
4832
|
+
align: "center",
|
|
4833
|
+
className: "w-auto! max-w-72 min-w-(--anchor-width)",
|
|
4834
|
+
children: asr.inputDevices.length > 0 ? asr.inputDevices.map((device) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
4835
|
+
DropdownMenuItem,
|
|
4836
|
+
{
|
|
4837
|
+
onClick: () => handleSelectDevice(device.deviceId),
|
|
4838
|
+
className: "gap-2",
|
|
4839
|
+
children: [
|
|
4840
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
4841
|
+
Check,
|
|
4842
|
+
{
|
|
4843
|
+
className: cn$1(
|
|
4844
|
+
"size-3 shrink-0",
|
|
4845
|
+
device.deviceId === savedDeviceId ? "opacity-100" : "opacity-0"
|
|
4846
|
+
)
|
|
4847
|
+
}
|
|
4848
|
+
),
|
|
4849
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex min-w-0 flex-col gap-0.5 pr-3", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate", children: device.label }) })
|
|
4850
|
+
]
|
|
4851
|
+
},
|
|
4852
|
+
device.deviceId
|
|
4853
|
+
)) : /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuItem, { disabled: true, children: t("chatInput.noAudioInputDevices", "No audio input devices found") })
|
|
4854
|
+
}
|
|
4855
|
+
)
|
|
4856
|
+
] })
|
|
4857
|
+
}
|
|
4858
|
+
)
|
|
4859
|
+
]
|
|
4860
|
+
}
|
|
4861
|
+
);
|
|
4862
|
+
}
|
|
4317
4863
|
function readFileAsBase64(file) {
|
|
4318
4864
|
return new Promise((resolve, reject) => {
|
|
4319
4865
|
const reader = new FileReader();
|
|
@@ -4447,10 +4993,9 @@ function ChatInput({ session }) {
|
|
|
4447
4993
|
const promptCapabilities = initializeInfo?.agentCapabilities?.promptCapabilities;
|
|
4448
4994
|
const supportsImage = promptCapabilities?.image ?? false;
|
|
4449
4995
|
const supportsEmbedded = promptCapabilities?.embeddedContext ?? false;
|
|
4450
|
-
const
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
);
|
|
4996
|
+
const textareaRef = reactExports.useRef(null);
|
|
4997
|
+
const voiceInputRef = reactExports.useRef(null);
|
|
4998
|
+
const getTextarea = reactExports.useCallback(() => textareaRef.current, []);
|
|
4454
4999
|
const insertTriggerChar = reactExports.useCallback(
|
|
4455
5000
|
(char) => {
|
|
4456
5001
|
const textarea = getTextarea();
|
|
@@ -4617,6 +5162,7 @@ function ChatInput({ session }) {
|
|
|
4617
5162
|
[localInput, availableCommands]
|
|
4618
5163
|
);
|
|
4619
5164
|
const handleSubmit = reactExports.useCallback(async () => {
|
|
5165
|
+
await voiceInputRef.current?.stop();
|
|
4620
5166
|
v$2();
|
|
4621
5167
|
const state = useAppStore.getState().getSessionState(session.id);
|
|
4622
5168
|
const currentAttachments = state.draftAttachments;
|
|
@@ -4911,7 +5457,10 @@ function ChatInput({ session }) {
|
|
|
4911
5457
|
MentionsInput$1,
|
|
4912
5458
|
{
|
|
4913
5459
|
value: localInput,
|
|
4914
|
-
|
|
5460
|
+
inputRef: textareaRef,
|
|
5461
|
+
onChange: (_e3, newValue) => {
|
|
5462
|
+
setLocalInput(newValue);
|
|
5463
|
+
},
|
|
4915
5464
|
onBlur: handleBlur,
|
|
4916
5465
|
onKeyDown: handleKeyDown,
|
|
4917
5466
|
placeholder: disabled ? t("chatInput.placeholderDisabled") : t("chatInput.placeholderActive"),
|
|
@@ -5290,6 +5839,14 @@ function ChatInput({ session }) {
|
|
|
5290
5839
|
}
|
|
5291
5840
|
)
|
|
5292
5841
|
] }),
|
|
5842
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
5843
|
+
VoiceInputButton,
|
|
5844
|
+
{
|
|
5845
|
+
ref: voiceInputRef,
|
|
5846
|
+
inputRef: textareaRef,
|
|
5847
|
+
disabled
|
|
5848
|
+
}
|
|
5849
|
+
),
|
|
5293
5850
|
isStreaming ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
5294
5851
|
Button,
|
|
5295
5852
|
{
|
|
@@ -5522,13 +6079,12 @@ function AskUserOptions({
|
|
|
5522
6079
|
const [highlightedIndex, setHighlightedIndex] = reactExports.useState(null);
|
|
5523
6080
|
const [isDragOver, setIsDragOver] = reactExports.useState(false);
|
|
5524
6081
|
const inputContainerRef = reactExports.useRef(null);
|
|
6082
|
+
const textareaRef = reactExports.useRef(null);
|
|
6083
|
+
const voiceInputRef = reactExports.useRef(null);
|
|
5525
6084
|
const navigate = useNavigate();
|
|
5526
6085
|
const snippets = useAppStore((s15) => s15.snippets);
|
|
5527
6086
|
const fileInputRef = reactExports.useRef(null);
|
|
5528
|
-
const getTextarea = reactExports.useCallback(
|
|
5529
|
-
() => inputContainerRef.current?.querySelector("textarea"),
|
|
5530
|
-
[]
|
|
5531
|
-
);
|
|
6087
|
+
const getTextarea = reactExports.useCallback(() => textareaRef.current, []);
|
|
5532
6088
|
const insertTriggerChar = reactExports.useCallback(
|
|
5533
6089
|
(char) => {
|
|
5534
6090
|
const textarea = getTextarea();
|
|
@@ -5593,7 +6149,7 @@ function AskUserOptions({
|
|
|
5593
6149
|
}
|
|
5594
6150
|
if (paths.length === 0) return;
|
|
5595
6151
|
void (async () => {
|
|
5596
|
-
const textarea =
|
|
6152
|
+
const textarea = textareaRef.current;
|
|
5597
6153
|
if (!textarea) return;
|
|
5598
6154
|
textarea.focus();
|
|
5599
6155
|
const tags = await Promise.all(
|
|
@@ -5679,7 +6235,8 @@ function AskUserOptions({
|
|
|
5679
6235
|
window.addEventListener("keydown", handler);
|
|
5680
6236
|
return () => window.removeEventListener("keydown", handler);
|
|
5681
6237
|
}, [mode, hasOptions, request$1.options, handleSelectOption]);
|
|
5682
|
-
const handleSubmitInput = () => {
|
|
6238
|
+
const handleSubmitInput = async () => {
|
|
6239
|
+
await voiceInputRef.current?.stop();
|
|
5683
6240
|
const trimmed = resolveMentions(inputValue).trim();
|
|
5684
6241
|
request.respondAskUser({
|
|
5685
6242
|
sessionId: request$1.sessionId,
|
|
@@ -5693,12 +6250,12 @@ function AskUserOptions({
|
|
|
5693
6250
|
if (e.nativeEvent.isComposing) return;
|
|
5694
6251
|
if (e.key === "Enter" && !e.shiftKey) {
|
|
5695
6252
|
e.preventDefault();
|
|
5696
|
-
handleSubmitInput();
|
|
6253
|
+
void handleSubmitInput();
|
|
5697
6254
|
}
|
|
5698
6255
|
};
|
|
5699
6256
|
reactExports.useEffect(() => {
|
|
5700
6257
|
if (mode === "input") {
|
|
5701
|
-
|
|
6258
|
+
textareaRef.current?.focus();
|
|
5702
6259
|
}
|
|
5703
6260
|
}, [mode]);
|
|
5704
6261
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
|
|
@@ -5767,6 +6324,7 @@ function AskUserOptions({
|
|
|
5767
6324
|
MentionsInput$1,
|
|
5768
6325
|
{
|
|
5769
6326
|
value: inputValue,
|
|
6327
|
+
inputRef: textareaRef,
|
|
5770
6328
|
onChange: (_e3, newValue) => setInputValue(newValue),
|
|
5771
6329
|
onKeyDown: handleKeyDown,
|
|
5772
6330
|
placeholder: t("askUser.inputPlaceholder", "Type your response... (Enter to send)"),
|
|
@@ -5907,16 +6465,19 @@ function AskUserOptions({
|
|
|
5907
6465
|
)) : /* @__PURE__ */ jsxRuntimeExports.jsx(DropdownMenuItem, { onClick: () => navigate("/settings/snippets"), children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: t("chatInput.snippetsEmpty", "No snippets. Click to add in Settings.") }) }) })
|
|
5908
6466
|
] })
|
|
5909
6467
|
] }),
|
|
5910
|
-
/* @__PURE__ */ jsxRuntimeExports.
|
|
5911
|
-
|
|
5912
|
-
|
|
5913
|
-
|
|
5914
|
-
|
|
5915
|
-
|
|
5916
|
-
|
|
5917
|
-
|
|
5918
|
-
|
|
5919
|
-
|
|
6468
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
6469
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(VoiceInputButton, { ref: voiceInputRef, inputRef: textareaRef }),
|
|
6470
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
6471
|
+
Button,
|
|
6472
|
+
{
|
|
6473
|
+
size: "icon",
|
|
6474
|
+
className: "size-7 rounded-lg",
|
|
6475
|
+
onClick: handleSubmitInput,
|
|
6476
|
+
"aria-label": t("askUser.submit", "Submit"),
|
|
6477
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowUp, { className: "size-3.5" })
|
|
6478
|
+
}
|
|
6479
|
+
)
|
|
6480
|
+
] })
|
|
5920
6481
|
] })
|
|
5921
6482
|
]
|
|
5922
6483
|
}
|
|
@@ -6128,7 +6689,7 @@ function useFile(projectId, file, options = {}) {
|
|
|
6128
6689
|
};
|
|
6129
6690
|
}
|
|
6130
6691
|
const CodeEditor = reactExports.lazy(
|
|
6131
|
-
() => __vitePreload(() => import("./code-editor-
|
|
6692
|
+
() => __vitePreload(() => import("./code-editor-CEXlC4aV.js"), true ? __vite__mapDeps([0,1,2,3,4]) : void 0, import.meta.url).then((m) => ({ default: m.CodeEditor }))
|
|
6132
6693
|
);
|
|
6133
6694
|
const MAX_EDIT_SIZE = 1024 * 1024;
|
|
6134
6695
|
const EditPanel = reactExports.forwardRef(function EditPanel2({ projectId, filePath, content, loading = false, onCancel, onSaved }, ref) {
|