@zythum02/fello-server 0.1.28 → 0.1.29

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.
Files changed (55) hide show
  1. package/out/renderer/assets/{_baseUniq-C01H-TTl.js → _baseUniq-BApwm7pv.js} +1 -1
  2. package/out/renderer/assets/{arc-BXqrFYj-.js → arc-yKenDsmO.js} +1 -1
  3. package/out/renderer/assets/{architectureDiagram-Q4EWVU46-DlFz_4yO.js → architectureDiagram-Q4EWVU46-C31yFVWH.js} +5 -5
  4. package/out/renderer/assets/{blockDiagram-DXYQGD6D-B_jYpKkP.js → blockDiagram-DXYQGD6D-6liCvTXv.js} +6 -6
  5. package/out/renderer/assets/{c4Diagram-AHTNJAMY-DWRXz6-S.js → c4Diagram-AHTNJAMY-Co_b_6bH.js} +2 -2
  6. package/out/renderer/assets/{channel-iMh-jYBg.js → channel-Dc_jjyUr.js} +1 -1
  7. package/out/renderer/assets/{chunk-4BX2VUAB-CDXuLHIo.js → chunk-4BX2VUAB-Cg18SQei.js} +1 -1
  8. package/out/renderer/assets/{chunk-4TB4RGXK-Bs-z-5kA.js → chunk-4TB4RGXK-CvSqwINq.js} +5 -5
  9. package/out/renderer/assets/{chunk-55IACEB6-DBmLw2WJ.js → chunk-55IACEB6-CfBiPWtx.js} +1 -1
  10. package/out/renderer/assets/{chunk-EDXVE4YY-BhsDT27O.js → chunk-EDXVE4YY-DMjVfNdS.js} +1 -1
  11. package/out/renderer/assets/{chunk-FMBD7UC4-C_qJYK5q.js → chunk-FMBD7UC4-BbpFqyFG.js} +1 -1
  12. package/out/renderer/assets/{chunk-OYMX7WX6-DIh7s3uw.js → chunk-OYMX7WX6-Cf724x--.js} +3 -3
  13. package/out/renderer/assets/{chunk-QZHKN3VN-CYa45CSJ.js → chunk-QZHKN3VN-4ZNIwknr.js} +1 -1
  14. package/out/renderer/assets/{chunk-YZCP3GAM-BeF07Xv_.js → chunk-YZCP3GAM-D1j7xGGR.js} +1 -1
  15. package/out/renderer/assets/{classDiagram-6PBFFD2Q-B12_6ldG.js → classDiagram-6PBFFD2Q-OFMeoPav.js} +6 -6
  16. package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-B12_6ldG.js → classDiagram-v2-HSJHXN6E-OFMeoPav.js} +6 -6
  17. package/out/renderer/assets/{clone-1GZJZPn3.js → clone-Cm3RO2Zl.js} +1 -1
  18. package/out/renderer/assets/{cose-bilkent-S5V4N54A-CuSnz9Ro.js → cose-bilkent-S5V4N54A-lCfWcP6y.js} +1 -1
  19. package/out/renderer/assets/{dagre-KV5264BT-LHPLEy9g.js → dagre-KV5264BT-4I0h4wyh.js} +6 -6
  20. package/out/renderer/assets/{diagram-5BDNPKRD-DWjP3Jzr.js → diagram-5BDNPKRD-C1mEpAlt.js} +6 -6
  21. package/out/renderer/assets/{diagram-G4DWMVQ6-CM3uASto.js → diagram-G4DWMVQ6-C_g_DZm9.js} +6 -6
  22. package/out/renderer/assets/{diagram-MMDJMWI5-X5oh5RON.js → diagram-MMDJMWI5-Di6wZV6-.js} +5 -5
  23. package/out/renderer/assets/{diagram-TYMM5635-iO4Xohj9.js → diagram-TYMM5635-aF8hIDx1.js} +5 -5
  24. package/out/renderer/assets/{erDiagram-SMLLAGMA-4xwE7Ysd.js → erDiagram-SMLLAGMA-Bk9QFZ27.js} +4 -4
  25. package/out/renderer/assets/{flowDiagram-DWJPFMVM-DoIqEJWm.js → flowDiagram-DWJPFMVM-Dfg0LLup.js} +6 -6
  26. package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-C48vXSUK.js → ganttDiagram-T4ZO3ILL-lTjaJTs0.js} +2 -2
  27. package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-D3YiiEhK.js → gitGraphDiagram-UUTBAWPF-C74WBszH.js} +6 -6
  28. package/out/renderer/assets/{graph-CYPfPCZi.js → graph-DGEX1eV1.js} +2 -2
  29. package/out/renderer/assets/{highlighted-body-OFNGDK62-B6M-kMLU.js → highlighted-body-OFNGDK62-DQWoSdTY.js} +1 -1
  30. package/out/renderer/assets/{index-Dabo17L1.js → index-BZzw3jIU.js} +1506 -244
  31. package/out/renderer/assets/index-Cv3lJTlc.css +382 -0
  32. package/out/renderer/assets/{infoDiagram-42DDH7IO-ur7rRidE.js → infoDiagram-42DDH7IO-CR4ZLAM1.js} +4 -4
  33. package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-fJSipMV8.js → ishikawaDiagram-UXIWVN3A-uXL-4FGw.js} +1 -1
  34. package/out/renderer/assets/{journeyDiagram-VCZTEJTY-TxjKxXBo.js → journeyDiagram-VCZTEJTY-Ds2OL3Lo.js} +4 -4
  35. package/out/renderer/assets/{kanban-definition-6JOO6SKY-DJwjRjlE.js → kanban-definition-6JOO6SKY-CZ1CZVyP.js} +2 -2
  36. package/out/renderer/assets/{layout-BT1ASsLg.js → layout-CNGveWdi.js} +4 -4
  37. package/out/renderer/assets/{linear-ecuEcPGt.js → linear-CnHAiAJ3.js} +1 -1
  38. package/out/renderer/assets/{min-BYCDJeWK.js → min-D63AfN0e.js} +2 -2
  39. package/out/renderer/assets/{mindmap-definition-QFDTVHPH-D2MxZmzw.js → mindmap-definition-QFDTVHPH-C3U3xkIJ.js} +3 -3
  40. package/out/renderer/assets/{pieDiagram-DEJITSTG-Cew7QWxE.js → pieDiagram-DEJITSTG-C8AxK_-F.js} +6 -6
  41. package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-CrZCtVJh.js → quadrantDiagram-34T5L4WZ-BdiZmi7w.js} +2 -2
  42. package/out/renderer/assets/{requirementDiagram-MS252O5E-C69IGxW8.js → requirementDiagram-MS252O5E-BHIfl5Tz.js} +3 -3
  43. package/out/renderer/assets/{sankeyDiagram-XADWPNL6-B2tuS_nG.js → sankeyDiagram-XADWPNL6-SthTR8cL.js} +1 -1
  44. package/out/renderer/assets/{sequenceDiagram-FGHM5R23-Dv_lOZN1.js → sequenceDiagram-FGHM5R23-COKEbCYM.js} +3 -3
  45. package/out/renderer/assets/{stateDiagram-FHFEXIEX-D9dJAqtV.js → stateDiagram-FHFEXIEX-7zRGBf7O.js} +8 -8
  46. package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-CQXoaDY1.js → stateDiagram-v2-QKLJ7IA2-BqHJ_ZBX.js} +4 -4
  47. package/out/renderer/assets/{timeline-definition-GMOUNBTQ-DnnX0Ml0.js → timeline-definition-GMOUNBTQ-AvZAT5J-.js} +2 -2
  48. package/out/renderer/assets/{vennDiagram-DHZGUBPP-BCIC8HTk.js → vennDiagram-DHZGUBPP-oSTndBDY.js} +1 -1
  49. package/out/renderer/assets/{wardley-RL74JXVD-B35jxdMa.js → wardley-RL74JXVD-C8hIuf19.js} +3 -3
  50. package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-D3rjXear.js → wardleyDiagram-NUSXRM2D-Dv2kSOMM.js} +5 -5
  51. package/out/renderer/assets/{xychartDiagram-5P7HB3ND-095YR9W9.js → xychartDiagram-5P7HB3ND-J9z4uuMK.js} +2 -2
  52. package/out/renderer/index.html +2 -2
  53. package/out/server/main.js +695 -159
  54. package/package.json +3 -1
  55. package/out/renderer/assets/index-D8H7Q_md.css +0 -382
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./dagre-KV5264BT-LHPLEy9g.js","./graph-CYPfPCZi.js","./_baseUniq-C01H-TTl.js","./layout-BT1ASsLg.js","./min-BYCDJeWK.js","./clone-1GZJZPn3.js","./cose-bilkent-S5V4N54A-CuSnz9Ro.js","./cytoscape.esm-Bm8DJGmZ.js","./c4Diagram-AHTNJAMY-DWRXz6-S.js","./chunk-YZCP3GAM-BeF07Xv_.js","./flowDiagram-DWJPFMVM-DoIqEJWm.js","./chunk-FMBD7UC4-C_qJYK5q.js","./chunk-55IACEB6-DBmLw2WJ.js","./chunk-EDXVE4YY-BhsDT27O.js","./channel-iMh-jYBg.js","./erDiagram-SMLLAGMA-4xwE7Ysd.js","./gitGraphDiagram-UUTBAWPF-D3YiiEhK.js","./chunk-4BX2VUAB-CDXuLHIo.js","./chunk-QZHKN3VN-CYa45CSJ.js","./wardley-RL74JXVD-B35jxdMa.js","./ganttDiagram-T4ZO3ILL-C48vXSUK.js","./linear-ecuEcPGt.js","./init-ZxktEp_H.js","./defaultLocale-B2RvLBDe.js","./infoDiagram-42DDH7IO-ur7rRidE.js","./pieDiagram-DEJITSTG-Cew7QWxE.js","./arc-BXqrFYj-.js","./ordinal-CxptdPJm.js","./quadrantDiagram-34T5L4WZ-CrZCtVJh.js","./xychartDiagram-5P7HB3ND-095YR9W9.js","./requirementDiagram-MS252O5E-C69IGxW8.js","./sequenceDiagram-FGHM5R23-Dv_lOZN1.js","./classDiagram-6PBFFD2Q-B12_6ldG.js","./chunk-4TB4RGXK-Bs-z-5kA.js","./classDiagram-v2-HSJHXN6E-B12_6ldG.js","./stateDiagram-FHFEXIEX-D9dJAqtV.js","./chunk-OYMX7WX6-DIh7s3uw.js","./stateDiagram-v2-QKLJ7IA2-CQXoaDY1.js","./journeyDiagram-VCZTEJTY-TxjKxXBo.js","./timeline-definition-GMOUNBTQ-DnnX0Ml0.js","./mindmap-definition-QFDTVHPH-D2MxZmzw.js","./kanban-definition-6JOO6SKY-DJwjRjlE.js","./sankeyDiagram-XADWPNL6-B2tuS_nG.js","./diagram-TYMM5635-iO4Xohj9.js","./diagram-MMDJMWI5-X5oh5RON.js","./blockDiagram-DXYQGD6D-B_jYpKkP.js","./diagram-5BDNPKRD-DWjP3Jzr.js","./architectureDiagram-Q4EWVU46-DlFz_4yO.js","./diagram-G4DWMVQ6-CM3uASto.js","./wardleyDiagram-NUSXRM2D-D3rjXear.js","./angular-html-BYG42TJr.js","./html-GC16tDh9.js","./javascript-BsAkV7mL.js","./css-BtVcDqlU.js","./angular-ts-BftcHvZ6.js","./scss-Dq-LbI_c.js","./apl-CGZawg-A.js","./xml-BMzZeaqs.js","./java-BfXh-0uJ.js","./json-TjWBGEk1.js","./astro-BxdWOZvM.js","./typescript-CP6ECzON.js","./postcss-kj1IbjVd.js","./tsx-CmGGo4Hm.js","./blade-BbH7YAUi.js","./html-derivative-HU9p64q4.js","./sql-DzUuSofg.js","./bsl-DwPS0BId.js","./sdbl-BBUhycGU.js","./cairo-BtYx2aM5.js","./python-CrdIx4PZ.js","./cobol-B8r1pfPr.js","./coffee-XLjtuEYs.js","./cpp-zh2ePAE_.js","./regexp-BxWeO75u.js","./glsl-CGsiYPcu.js","./c-C4VtT7JA.js","./crystal-BqBRy7Ec.js","./shellscript-CQ8MXh-D.js","./edge-CnHxQ_FD.js","./elixir-B_LIBv5J.js","./elm-BlO7pcFp.js","./erb-Bzn22wO6.js","./ruby-C13Bjepi.js","./haml-DrIklt7F.js","./graphql-CwmtR1ib.js","./jsx-BPmvoin2.js","./lua-BVbbqwZC.js","./yaml-B_vW5iTY.js","./erlang-Ch5kuXHm.js","./markdown-F_EULe_G.js","./fortran-fixed-form-CpmOyvS5.js","./fortran-free-form-5X94ETMi.js","./fsharp-5vtGqRR9.js","./gdresource-B5TLWiFO.js","./gdshader-BEzE4j_3.js","./gdscript-CNW3Aj-d.js","./git-commit-PP9xCApN.js","./diff-BEdzuHlE.js","./git-rebase-D-XQSvDj.js","./glimmer-js-h2QNNiD7.js","./glimmer-ts-Bk3uX6Ae.js","./hack-BTX3ICIE.js","./handlebars-yWFGGD2R.js","./http-DjsOm9E4.js","./hurl-Am2cDU4f.js","./csv-Ba84L8e5.js","./hxml-Jle7oGdm.js","./haxe-BpobLYM9.js","./jinja-FkIlHBgj.js","./jison-BkdOIOd4.js","./julia-CU_UwNb8.js","./r-Dpdc-Kyk.js","./just-tGFryTtU.js","./perl-HITCDkgu.js","./latex-B0gTO9uZ.js","./tex-CGVqF8nD.js","./liquid-QmJ_LYTW.js","./marko-BAWrmNIa.js","./less-BAzLMJNR.js","./mdc-Ca0ft0PS.js","./nextflow-B166B-y1.js","./nextflow-groovy-BOO9s0iq.js","./nginx-BFAkI5_-.js","./nim-B3PAIZ4D.js","./php-C2HieitX.js","./pug-BwQB43qN.js","./qml-jtL8okyu.js","./razor-gBXW6YBJ.js","./csharp-DxX_6tHh.js","./rst-by6KAwTb.js","./cmake-CDfQILeU.js","./sas-BLBgC3TA.js","./shaderlab-C07uO3dL.js","./hlsl-TRzjajlb.js","./shellsession-CkeTp4M1.js","./soy-BHaHgMUy.js","./sparql-DswowMAp.js","./turtle-BnC7StHY.js","./stata-Dl7wDdBE.js","./surrealql-Bs3vUeKA.js","./svelte-fC0HkEkx.js","./templ-CSEiQwNm.js","./go-DRMr3iML.js","./ts-tags-cG2hZuda.js","./twig-CwEEYIBf.js","./vue-K-7Ga-y8.js","./vue-html-DhreShjd.js","./vue-vine-rMIwOpFf.js","./stylus-DXFa_2Jl.js","./xsl-CnwVr_6q.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./dagre-KV5264BT-4I0h4wyh.js","./graph-DGEX1eV1.js","./_baseUniq-BApwm7pv.js","./layout-CNGveWdi.js","./min-D63AfN0e.js","./clone-Cm3RO2Zl.js","./cose-bilkent-S5V4N54A-lCfWcP6y.js","./cytoscape.esm-Bm8DJGmZ.js","./c4Diagram-AHTNJAMY-Co_b_6bH.js","./chunk-YZCP3GAM-D1j7xGGR.js","./flowDiagram-DWJPFMVM-Dfg0LLup.js","./chunk-FMBD7UC4-BbpFqyFG.js","./chunk-55IACEB6-CfBiPWtx.js","./chunk-EDXVE4YY-DMjVfNdS.js","./channel-Dc_jjyUr.js","./erDiagram-SMLLAGMA-Bk9QFZ27.js","./gitGraphDiagram-UUTBAWPF-C74WBszH.js","./chunk-4BX2VUAB-Cg18SQei.js","./chunk-QZHKN3VN-4ZNIwknr.js","./wardley-RL74JXVD-C8hIuf19.js","./ganttDiagram-T4ZO3ILL-lTjaJTs0.js","./linear-CnHAiAJ3.js","./init-ZxktEp_H.js","./defaultLocale-B2RvLBDe.js","./infoDiagram-42DDH7IO-CR4ZLAM1.js","./pieDiagram-DEJITSTG-C8AxK_-F.js","./arc-yKenDsmO.js","./ordinal-CxptdPJm.js","./quadrantDiagram-34T5L4WZ-BdiZmi7w.js","./xychartDiagram-5P7HB3ND-J9z4uuMK.js","./requirementDiagram-MS252O5E-BHIfl5Tz.js","./sequenceDiagram-FGHM5R23-COKEbCYM.js","./classDiagram-6PBFFD2Q-OFMeoPav.js","./chunk-4TB4RGXK-CvSqwINq.js","./classDiagram-v2-HSJHXN6E-OFMeoPav.js","./stateDiagram-FHFEXIEX-7zRGBf7O.js","./chunk-OYMX7WX6-Cf724x--.js","./stateDiagram-v2-QKLJ7IA2-BqHJ_ZBX.js","./journeyDiagram-VCZTEJTY-Ds2OL3Lo.js","./timeline-definition-GMOUNBTQ-AvZAT5J-.js","./mindmap-definition-QFDTVHPH-C3U3xkIJ.js","./kanban-definition-6JOO6SKY-CZ1CZVyP.js","./sankeyDiagram-XADWPNL6-SthTR8cL.js","./diagram-TYMM5635-aF8hIDx1.js","./diagram-MMDJMWI5-Di6wZV6-.js","./blockDiagram-DXYQGD6D-6liCvTXv.js","./diagram-5BDNPKRD-C1mEpAlt.js","./architectureDiagram-Q4EWVU46-C31yFVWH.js","./diagram-G4DWMVQ6-C_g_DZm9.js","./wardleyDiagram-NUSXRM2D-Dv2kSOMM.js","./angular-html-BYG42TJr.js","./html-GC16tDh9.js","./javascript-BsAkV7mL.js","./css-BtVcDqlU.js","./angular-ts-BftcHvZ6.js","./scss-Dq-LbI_c.js","./apl-CGZawg-A.js","./xml-BMzZeaqs.js","./java-BfXh-0uJ.js","./json-TjWBGEk1.js","./astro-BxdWOZvM.js","./typescript-CP6ECzON.js","./postcss-kj1IbjVd.js","./tsx-CmGGo4Hm.js","./blade-BbH7YAUi.js","./html-derivative-HU9p64q4.js","./sql-DzUuSofg.js","./bsl-DwPS0BId.js","./sdbl-BBUhycGU.js","./cairo-BtYx2aM5.js","./python-CrdIx4PZ.js","./cobol-B8r1pfPr.js","./coffee-XLjtuEYs.js","./cpp-zh2ePAE_.js","./regexp-BxWeO75u.js","./glsl-CGsiYPcu.js","./c-C4VtT7JA.js","./crystal-BqBRy7Ec.js","./shellscript-CQ8MXh-D.js","./edge-CnHxQ_FD.js","./elixir-B_LIBv5J.js","./elm-BlO7pcFp.js","./erb-Bzn22wO6.js","./ruby-C13Bjepi.js","./haml-DrIklt7F.js","./graphql-CwmtR1ib.js","./jsx-BPmvoin2.js","./lua-BVbbqwZC.js","./yaml-B_vW5iTY.js","./erlang-Ch5kuXHm.js","./markdown-F_EULe_G.js","./fortran-fixed-form-CpmOyvS5.js","./fortran-free-form-5X94ETMi.js","./fsharp-5vtGqRR9.js","./gdresource-B5TLWiFO.js","./gdshader-BEzE4j_3.js","./gdscript-CNW3Aj-d.js","./git-commit-PP9xCApN.js","./diff-BEdzuHlE.js","./git-rebase-D-XQSvDj.js","./glimmer-js-h2QNNiD7.js","./glimmer-ts-Bk3uX6Ae.js","./hack-BTX3ICIE.js","./handlebars-yWFGGD2R.js","./http-DjsOm9E4.js","./hurl-Am2cDU4f.js","./csv-Ba84L8e5.js","./hxml-Jle7oGdm.js","./haxe-BpobLYM9.js","./jinja-FkIlHBgj.js","./jison-BkdOIOd4.js","./julia-CU_UwNb8.js","./r-Dpdc-Kyk.js","./just-tGFryTtU.js","./perl-HITCDkgu.js","./latex-B0gTO9uZ.js","./tex-CGVqF8nD.js","./liquid-QmJ_LYTW.js","./marko-BAWrmNIa.js","./less-BAzLMJNR.js","./mdc-Ca0ft0PS.js","./nextflow-B166B-y1.js","./nextflow-groovy-BOO9s0iq.js","./nginx-BFAkI5_-.js","./nim-B3PAIZ4D.js","./php-C2HieitX.js","./pug-BwQB43qN.js","./qml-jtL8okyu.js","./razor-gBXW6YBJ.js","./csharp-DxX_6tHh.js","./rst-by6KAwTb.js","./cmake-CDfQILeU.js","./sas-BLBgC3TA.js","./shaderlab-C07uO3dL.js","./hlsl-TRzjajlb.js","./shellsession-CkeTp4M1.js","./soy-BHaHgMUy.js","./sparql-DswowMAp.js","./turtle-BnC7StHY.js","./stata-Dl7wDdBE.js","./surrealql-Bs3vUeKA.js","./svelte-fC0HkEkx.js","./templ-CSEiQwNm.js","./go-DRMr3iML.js","./ts-tags-cG2hZuda.js","./twig-CwEEYIBf.js","./vue-K-7Ga-y8.js","./vue-html-DhreShjd.js","./vue-vine-rMIwOpFf.js","./stylus-DXFa_2Jl.js","./xsl-CnwVr_6q.js"])))=>i.map(i=>d[i]);
2
2
  function _mergeNamespaces(n2, m2) {
3
3
  for (var i3 = 0; i3 < m2.length; i3++) {
4
4
  const e2 = m2[i3];
@@ -15082,10 +15082,10 @@ const useTranslation = (ns2, props = {}) => {
15082
15082
  }
15083
15083
  return ret;
15084
15084
  };
15085
- const sidebar$1 = { "welcome": "Welcome", "skills": "Skills", "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", "renameChat": "Rename Chat", "deleteChat": "Delete Chat", "enterNewProjectName": "Enter a new project name.", "enterNewChatName": "Enter a new chat 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 chats in it?\nThis action cannot be undone.', "deleteChatConfirm": 'Delete chat "{{title}}"?\nThis action cannot be undone.', "cancel": "Cancel", "save": "Save", "settings": "Settings", "agents": "Agents", "addProjectFailed": "Failed to add project.", "newChatFailed": "Failed to create a new chat.", "loadSessionFailed": "Failed to load session.", "revealInFinderFailed": "Failed to reveal in Finder.", "projectExists": "Project already exists.", "projectNameEmpty": "Project name cannot be empty.", "chatNameEmpty": "Chat name cannot be empty.", "newChat": "New Chat", "projectActions": "Project actions for {{title}}", "createChatInProject": "Create chat in {{title}}", "chatActions": "Chat actions for {{title}}", "ilinkSetActive": "Set WeChat Active", "ilinkUnsetActive": "Unset WeChat Active", "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" } };
15085
+ 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", "renameChat": "Rename Chat", "deleteChat": "Delete Chat", "enterNewProjectName": "Enter a new project name.", "enterNewChatName": "Enter a new chat 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 chats in it?\nThis action cannot be undone.', "deleteChatConfirm": 'Delete chat "{{title}}"?\nThis action cannot be undone.', "cancel": "Cancel", "save": "Save", "settings": "Settings", "agents": "Agents", "addProjectFailed": "Failed to add project.", "newChatFailed": "Failed to create a new chat.", "loadSessionFailed": "Failed to load session.", "revealInFinderFailed": "Failed to reveal in Finder.", "projectExists": "Project already exists.", "projectNameEmpty": "Project name cannot be empty.", "chatNameEmpty": "Chat name cannot be empty.", "newChat": "New Chat", "projectActions": "Project actions for {{title}}", "createChatInProject": "Create chat in {{title}}", "chatActions": "Chat actions for {{title}}", "ilinkSetActive": "Set WeChat Active", "ilinkUnsetActive": "Unset WeChat Active", "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" } };
15086
15086
  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 " } };
15087
15087
  const contextMenu$1 = { "cut": "Cut", "copy": "Copy", "paste": "Paste", "selectAll": "Select All" };
15088
- const settings$1 = { "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.", "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." }, "agents": { "desc": "Manage agent configurations and startup commands.", "description": "Configure agents", "title": "Agents", "addAgent": "Add Agent", "addStdioAgent": "Add Stdio Agent", "addApiAgent": "Add API Agent", "editAgent": "Edit 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)", "command": "Command", "args": "Arguments", "envVars": "Environment Variables (JSON)", "envJson": "Environment Variables (JSON)", "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.", "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", "addMcp": "Add MCP Server", "addStdioMcp": "Add Stdio MCP", "addHttpMcp": "Add HTTP 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.", "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", "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", "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." }, "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." } } };
15088
+ const settings$1 = { "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.", "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." }, "agents": { "desc": "Manage agent configurations and startup commands.", "description": "Configure agents", "title": "Agents", "addAgent": "Add Agent", "addStdioAgent": "Add Stdio Agent", "addApiAgent": "Add API Agent", "editAgent": "Edit 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", "command": "Command", "args": "Arguments", "envVars": "Environment Variables (JSON)", "envJson": "Environment Variables (JSON)", "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.", "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", "addMcp": "Add MCP Server", "addStdioMcp": "Add Stdio MCP", "addHttpMcp": "Add HTTP 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.", "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", "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", "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." }, "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." } } };
15089
15089
  const chat$1 = { "failedToLoadSession": "Failed to load session.", "failedToUpdateMcpServers": "Failed to update MCP servers." };
15090
15090
  const planBubble$1 = { "title": "Plan", "summary": "{{completed}} / {{total}} completed", "status": { "pending": "Pending", "inProgress": "In progress", "completed": "Completed" }, "priority": { "high": "High", "medium": "Medium", "low": "Low" } };
15091
15091
  const constant$5 = { "feature": { "title": "Features", "askUser": "Ask Me", "skills": "Skills" } };
@@ -15113,6 +15113,7 @@ const fileDetail$1 = { "fileNotFound": "File not found", "fileTooLarge": "File i
15113
15113
  const htmlDetail$1 = { "fileNotFound": "File not found or inaccessible", "errorLoading": "Failed to load", "loadFailed": "Page load failed", "retry": "Retry", "openInBrowser": "Open in browser", "webuiNotEnabled": "Enable WebUI first to open in browser", "open": "Open", "refresh": "Refresh" };
15114
15114
  const welcome$1 = { "title": "Fello", "desc": "Yet another Agent client based on the ACP protocol. Connect with the agent and begin collaborating.", "hint": "Start a new chat from the sidebar", "getStarted": "Get Started", "stepAgent": "Configure Agent", "stepAgentDesc": "Add an AI agent (local Stdio or API) to power your conversations", "stepAgentDone": "{{count}} agent(s) configured", "stepProject": "Add Project", "stepProjectDesc": "Select a local project folder as your workspace", "stepProjectDone": "{{count}} project(s) added", "stepChat": "Start Chat", "stepChatDesc": "Create a new AI conversation in your project", "allDone": "All set! Start a new chat from the sidebar" };
15115
15115
  const askUser$1 = { "title": "Request", "other": "Other...", "back": "Back", "inputPlaceholder": "Type your response... (Enter to send)", "submit": "Submit" };
15116
+ const automation$1 = { "title": "Automation", "agent": "Agent", "alwaysDisabled": "always disabled", "anyMoment": "Any moment now", "back": "Back", "cancel": "Cancel", "create": "Create", "createFirst": "Create your first schedule", "delete": "Delete", "deleteConfirm": 'Delete "{{name}}" permanently?', "deleteTaskConfirm": "Delete this task permanently?", "deleteTaskTitle": "Delete Task", "deleteTitle": "Delete Schedule", "dialogDesc": "Configure the automated task schedule and prompt.", "editSchedule": "Edit Schedule", "editSettings": "Edit settings", "features": "Features", "lastRun": "Last", "lessThanMinute": "Less than 1 min", "manual": "Manual", "manualDesc": "Manual trigger only. No automatic scheduling.", "mcpServers": "MCP Servers", "newSchedule": "New Schedule", "nextRun": "Next", "noFiles": "No files generated", "noSchedules": "No schedules yet", "noTasksDesc": 'No runs yet. Click "Trigger now" to start the first run.', "prompt": "Prompt", "promptPlaceholder": "What should the agent do?", "save": "Save", "schedule": "Schedule", "scheduleName": "Schedule Name", "scheduleNamePlaceholder": "e.g. Morning Standup Summary", "scheduleNotFound": "Schedule not found", "schedules": "schedules", "selectFileToPreview": "Select a file to preview", "selectTaskToPreview": "Select a task to preview files", "timedExecution": "Timed (cron)", "triggerNow": "Trigger now", "validation": { "nameRequired": "Name is required", "agentRequired": "Agent is required", "promptRequired": "Prompt is required" }, "cron": { "at": "at", "atMinute": "at min", "custom": "Custom", "daily": "Every day", "hourly": "Every N hours", "weekdays": "Weekdays", "weekly": "Every week", "nextRun": "Next run", "nextRunIn": "Next run in", "lastRun": "Last run", "days": { "0": "Sun", "1": "Mon", "2": "Tue", "3": "Wed", "4": "Thu", "5": "Fri", "6": "Sat" } } };
15116
15117
  const en$4 = {
15117
15118
  sidebar: sidebar$1,
15118
15119
  skills: skills$1,
@@ -15144,12 +15145,13 @@ const en$4 = {
15144
15145
  fileDetail: fileDetail$1,
15145
15146
  htmlDetail: htmlDetail$1,
15146
15147
  welcome: welcome$1,
15147
- askUser: askUser$1
15148
+ askUser: askUser$1,
15149
+ automation: automation$1
15148
15150
  };
15149
- const sidebar = { "welcome": "欢迎使用", "skills": "技能", "projects": "项目", "noProjects": "暂无项目", "noProjectsHint": "添加一个项目文件夹开始", "addProject": "添加项目", "noAgentsHint": "请先配置 Agent", "configureAgent": "配置 Agent", "revealInFinder": "在访达中显示", "rename": "重命名", "delete": "删除", "renameProject": "重命名项目", "renameChat": "重命名会话", "deleteChat": "删除会话", "enterNewProjectName": "请输入新的项目名称。", "enterNewChatName": "请输入新的会话名称。", "addProjectTitle": "添加项目", "enterProjectPath": "请输入服务器上的项目绝对路径:", "pathCannotBeEmpty": "路径不能为空", "webuiEnabled": "已启用 WebUI", "deleteProject": "删除项目", "deleteProjectConfirm": "是否删除项目“{{title}}”及其所有会话?\n此操作无法撤销。", "deleteChatConfirm": "是否删除会话“{{title}}”?\n此操作无法撤销。", "cancel": "取消", "save": "保存", "settings": "设置", "agents": "智能体", "addProjectFailed": "添加项目失败。", "newChatFailed": "创建新会话失败。", "loadSessionFailed": "加载会话失败。", "revealInFinderFailed": "在访达中显示失败。", "projectExists": "项目已存在。", "projectNameEmpty": "项目名称不能为空。", "chatNameEmpty": "会话名称不能为空。", "newChat": "新会话", "projectActions": "项目操作:{{title}}", "createChatInProject": "在 {{title}} 中创建会话", "chatActions": "会话操作:{{title}}", "ilinkSetActive": "设为微信活跃会话", "ilinkUnsetActive": "取消微信活跃", "newSessionDialog": { "title": "新建会话", "agent": "智能体", "selectAgent": "选择智能体", "mcp": "MCP", "noMcp": "未配置 MCP 服务器", "permission": "权限", "permissionAsk": "每次询问", "permissionAllowAll": "全部允许", "create": "创建" } };
15151
+ const sidebar = { "welcome": "欢迎使用", "skills": "技能", "automation": "自动化", "projects": "项目", "noProjects": "暂无项目", "noProjectsHint": "添加一个项目文件夹开始", "addProject": "添加项目", "noAgentsHint": "请先配置 Agent", "configureAgent": "配置 Agent", "revealInFinder": "在访达中显示", "rename": "重命名", "delete": "删除", "renameProject": "重命名项目", "renameChat": "重命名会话", "deleteChat": "删除会话", "enterNewProjectName": "请输入新的项目名称。", "enterNewChatName": "请输入新的会话名称。", "addProjectTitle": "添加项目", "enterProjectPath": "请输入服务器上的项目绝对路径:", "pathCannotBeEmpty": "路径不能为空", "webuiEnabled": "已启用 WebUI", "deleteProject": "删除项目", "deleteProjectConfirm": "是否删除项目“{{title}}”及其所有会话?\n此操作无法撤销。", "deleteChatConfirm": "是否删除会话“{{title}}”?\n此操作无法撤销。", "cancel": "取消", "save": "保存", "settings": "设置", "agents": "智能体", "addProjectFailed": "添加项目失败。", "newChatFailed": "创建新会话失败。", "loadSessionFailed": "加载会话失败。", "revealInFinderFailed": "在访达中显示失败。", "projectExists": "项目已存在。", "projectNameEmpty": "项目名称不能为空。", "chatNameEmpty": "会话名称不能为空。", "newChat": "新会话", "projectActions": "项目操作:{{title}}", "createChatInProject": "在 {{title}} 中创建会话", "chatActions": "会话操作:{{title}}", "ilinkSetActive": "设为微信活跃会话", "ilinkUnsetActive": "取消微信活跃", "newSessionDialog": { "title": "新建会话", "agent": "智能体", "selectAgent": "选择智能体", "mcp": "MCP", "noMcp": "未配置 MCP 服务器", "permission": "权限", "permissionAsk": "每次询问", "permissionAllowAll": "全部允许", "create": "创建" } };
15150
15152
  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": "作者: " } };
15151
15153
  const contextMenu = { "cut": "剪切", "copy": "复制", "paste": "粘贴", "selectAll": "全选" };
15152
- const settings = { "themeDesc": "自定义应用的外观", "languageDesc": "选择应用显示的语言", "title": "设置", "general": { "title": "通用", "desc": "管理应用设置。", "theme": "主题", "light": "浅色", "dark": "深色", "system": "跟随系统", "language": "语言", "english": "English", "chinese": "简体中文", "saveThemeFailed": "保存主题设置失败。", "saveLanguageFailed": "保存语言设置失败。", "groupAppearance": "外观", "groupProject": "项目", "autoWatchFiles": "自动监听文件", "autoWatchFilesDesc": "自动监听项目文件变更", "saveFileWatcherFailed": "保存文件监听设置失败。", "groupSound": "音效", "soundEnabled": "音效", "soundEnabledDesc": "播放通知音效", "soundVolume": "音量", "soundVolumeDesc": "调整通知音量", "soundTheme": "音效风格", "soundThemeDesc": "选择音效风格", "soundSoft": "柔和", "soundCrisp": "清脆", "soundTest": "试听", "soundTestDesc": "预览当前音效效果", "soundTestPlay": "播放", "saveSoundFailed": "保存音效设置失败。" }, "agents": { "desc": "管理智能体的配置和启动命令。", "description": "配置智能体", "title": "智能体", "addAgent": "添加智能体", "addStdioAgent": "添加 Stdio Agent", "addApiAgent": "添加 API Agent", "editAgent": "编辑智能体", "dialogDesc": "配置智能体 ID、命令、参数和环境变量。", "apiDialogDesc": "配置 API 智能体的提供商、端点和认证信息。", "agentId": "智能体 ID (名称)", "apiProvider": "提供商", "apiBaseUrl": "Base URL", "apiKey": "API Key", "apiHeaders": "请求头 (JSON)", "contextWindowTokens": "上下文窗口 (token)", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noAgents": "未配置任何智能体", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的智能体。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "errorContextWindowTokens": "上下文窗口必须为正整数。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除智能体", "confirmDeleteDesc": "确定要删除此智能体吗?此操作无法撤销。", "validation": { "enterId": "请输入智能体 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "selectProvider": "请选择提供商。", "enterBaseUrl": "请输入 Base URL。", "enterApiKey": "请输入 API Key。", "enterCommand": "请输入命令。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。", "positiveInteger": "必须为正整数。" } }, "mcp": { "desc": "管理 MCP 服务器的配置和启动命令。", "description": "配置 MCP 服务器", "title": "MCP 服务器", "addMcp": "添加 MCP 服务器", "addStdioMcp": "添加 Stdio MCP", "addHttpMcp": "添加 HTTP 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 和请求头。", "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", "enable": "启用 WebUI", "enableDesc": "允许通过浏览器远程访问 Fello 界面", "enableAccess": "启用 WebUI 访问", "port": "端口:", "token": "Token:", "autoGenerated": "自动生成", "accessUrl": "访问地址", "accessDesc": "注意:此地址包含临时访问令牌,应用重启后将失效。", "copy": "复制", "note": "注意:此地址包含临时访问令牌,应用重启后将失效。", "updateFailed": "更新配置失败。", "disabledInWebUI": "WebUI 配置在浏览器中不可用。" }, "ilink": { "title": "微信 iLink", "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 思考时最大连续保活消息数。" }, "snippets": { "title": "快捷短语", "desc": "管理可复用的文本片段,快速插入到对话中。", "description": "配置快捷短语", "add": "添加短语", "edit": "编辑短语", "delete": "删除", "save": "保存", "cancel": "取消", "empty": "暂无快捷短语", "saveFailed": "保存快捷短语失败。", "titleLabel": "标题", "titlePlaceholder": "标题", "contentLabel": "内容", "contentPlaceholder": "内容", "dialogDesc": "配置短语的标题和内容。", "confirmDeleteTitle": "删除短语", "confirmDeleteDesc": "确定要删除此短语吗?此操作无法撤销。", "validation": { "enterTitle": "请输入标题。", "enterContent": "请输入内容。" } } };
15154
+ const settings = { "themeDesc": "自定义应用的外观", "languageDesc": "选择应用显示的语言", "title": "设置", "general": { "title": "通用", "desc": "管理应用设置。", "theme": "主题", "light": "浅色", "dark": "深色", "system": "跟随系统", "language": "语言", "english": "English", "chinese": "简体中文", "saveThemeFailed": "保存主题设置失败。", "saveLanguageFailed": "保存语言设置失败。", "groupAppearance": "外观", "groupProject": "项目", "autoWatchFiles": "自动监听文件", "autoWatchFilesDesc": "自动监听项目文件变更", "saveFileWatcherFailed": "保存文件监听设置失败。", "groupSound": "音效", "soundEnabled": "音效", "soundEnabledDesc": "播放通知音效", "soundVolume": "音量", "soundVolumeDesc": "调整通知音量", "soundTheme": "音效风格", "soundThemeDesc": "选择音效风格", "soundSoft": "柔和", "soundCrisp": "清脆", "soundTest": "试听", "soundTestDesc": "预览当前音效效果", "soundTestPlay": "播放", "saveSoundFailed": "保存音效设置失败。" }, "agents": { "desc": "管理智能体的配置和启动命令。", "description": "配置智能体", "title": "智能体", "addAgent": "添加智能体", "addStdioAgent": "添加 Stdio Agent", "addApiAgent": "添加 API Agent", "editAgent": "编辑智能体", "dialogDesc": "配置智能体 ID、命令、参数和环境变量。", "apiDialogDesc": "配置 API 智能体的提供商、端点和认证信息。", "agentId": "智能体 ID (名称)", "apiProvider": "提供商", "apiBaseUrl": "Base URL", "apiKey": "API Key", "apiHeaders": "请求头 (JSON)", "contextWindowTokens": "上下文窗口 (token)", "modelIdTemplate": "Model Id 模版", "command": "命令", "args": "参数", "envVars": "环境变量 (JSON)", "envJson": "环境变量 (JSON)", "cancel": "取消", "save": "保存", "edit": "编辑", "delete": "删除", "dragToReorder": "拖拽排序", "noAgents": "未配置任何智能体", "errorIdCommand": "ID 和命令不能为空。", "errorDuplicateId": "已存在具有该 ID 的智能体。", "errorEnvJson": "环境变量必须是有效的 JSON 对象。", "errorContextWindowTokens": "上下文窗口必须为正整数。", "updateFailed": "更新配置失败。", "confirmDeleteTitle": "删除智能体", "confirmDeleteDesc": "确定要删除此智能体吗?此操作无法撤销。", "validation": { "enterId": "请输入智能体 ID。", "idFormat": "只允许字母、数字、_ 和 -。", "selectProvider": "请选择提供商。", "enterBaseUrl": "请输入 Base URL。", "enterApiKey": "请输入 API Key。", "enterCommand": "请输入命令。", "jsonObject": "必须是有效的 JSON 对象(值为字符串)。", "positiveInteger": "必须为正整数。" } }, "mcp": { "desc": "管理 MCP 服务器的配置和启动命令。", "description": "配置 MCP 服务器", "title": "MCP 服务器", "addMcp": "添加 MCP 服务器", "addStdioMcp": "添加 Stdio MCP", "addHttpMcp": "添加 HTTP 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 和请求头。", "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", "enable": "启用 WebUI", "enableDesc": "允许通过浏览器远程访问 Fello 界面", "enableAccess": "启用 WebUI 访问", "port": "端口:", "token": "Token:", "autoGenerated": "自动生成", "accessUrl": "访问地址", "accessDesc": "注意:此地址包含临时访问令牌,应用重启后将失效。", "copy": "复制", "note": "注意:此地址包含临时访问令牌,应用重启后将失效。", "updateFailed": "更新配置失败。", "disabledInWebUI": "WebUI 配置在浏览器中不可用。" }, "ilink": { "title": "微信 iLink", "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 思考时最大连续保活消息数。" }, "snippets": { "title": "快捷短语", "desc": "管理可复用的文本片段,快速插入到对话中。", "description": "配置快捷短语", "add": "添加短语", "edit": "编辑短语", "delete": "删除", "save": "保存", "cancel": "取消", "empty": "暂无快捷短语", "saveFailed": "保存快捷短语失败。", "titleLabel": "标题", "titlePlaceholder": "标题", "contentLabel": "内容", "contentPlaceholder": "内容", "dialogDesc": "配置短语的标题和内容。", "confirmDeleteTitle": "删除短语", "confirmDeleteDesc": "确定要删除此短语吗?此操作无法撤销。", "validation": { "enterTitle": "请输入标题。", "enterContent": "请输入内容。" } } };
15153
15155
  const chat = { "failedToLoadSession": "加载会话失败。", "failedToUpdateMcpServers": "更新 MCP 服务器失败。" };
15154
15156
  const planBubble = { "title": "计划", "summary": "已完成 {{completed}} / {{total}}", "status": { "pending": "等待中", "inProgress": "进行中", "completed": "已完成" }, "priority": { "high": "高优先级", "medium": "中优先级", "low": "低优先级" } };
15155
15157
  const constant$4 = { "feature": { "title": "功能", "askUser": "向我提问", "skills": "技能" } };
@@ -15177,6 +15179,7 @@ const fileDetail = { "fileNotFound": "文件不存在", "fileTooLarge": "该文
15177
15179
  const htmlDetail = { "fileNotFound": "文件不存在或无法访问", "errorLoading": "加载失败", "loadFailed": "页面加载失败", "retry": "重试", "openInBrowser": "在浏览器中打开", "webuiNotEnabled": "请先启用 WebUI 才能在浏览器中打开", "open": "打开", "refresh": "刷新" };
15178
15180
  const welcome = { "title": "Fello", "desc": "又一个基于 ACP 协议的 Agent 客户端,连接智能体并开始协作。", "hint": "从左侧边栏新建会话开始", "getStarted": "开始使用", "stepAgent": "配置 Agent", "stepAgentDesc": "添加一个 AI 智能体(本地 Stdio 或 API)来驱动对话", "stepAgentDone": "已配置 {{count}} 个 Agent", "stepProject": "添加项目", "stepProjectDesc": "选择一个本地项目文件夹作为工作区", "stepProjectDone": "已添加 {{count}} 个项目", "stepChat": "开始会话", "stepChatDesc": "在项目中创建一个新的 AI 对话", "allDone": "一切就绪!从左侧边栏开始新会话吧" };
15179
15181
  const askUser = { "title": "请求", "other": "其他...", "back": "返回", "inputPlaceholder": "输入你的回复...(回车发送)", "submit": "提交" };
15182
+ const automation = { "title": "自动化", "agent": "智能体", "alwaysDisabled": "始终禁用", "anyMoment": "即将执行", "back": "返回", "cancel": "取消", "create": "创建", "createFirst": "创建你的第一个调度", "delete": "删除", "deleteConfirm": "确定永久删除「{{name}}」?", "deleteTaskConfirm": "确定永久删除此任务?", "deleteTaskTitle": "删除任务", "deleteTitle": "删除调度", "dialogDesc": "配置自动化任务的调度规则和 Prompt。", "editSchedule": "编辑调度", "editSettings": "编辑设置", "features": "功能", "lastRun": "上次", "lessThanMinute": "不到 1 分钟", "manual": "手动", "manualDesc": "仅手动触发,无自动调度。", "mcpServers": "MCP 服务器", "newSchedule": "新建调度", "nextRun": "下次", "noFiles": "暂无生成文件", "noSchedules": "暂无调度", "noTasksDesc": "暂无运行记录。点击「立即触发」开始第一次运行。", "prompt": "提示词", "promptPlaceholder": "智能体需要执行什么任务?", "save": "保存", "schedule": "调度", "scheduleName": "调度名称", "scheduleNamePlaceholder": "例如:每日站会摘要", "scheduleNotFound": "调度未找到", "schedules": "调度", "selectFileToPreview": "选择文件预览", "selectTaskToPreview": "选择任务查看文件", "timedExecution": "定时(cron)", "triggerNow": "立即触发", "validation": { "nameRequired": "名称不能为空", "agentRequired": "请选择智能体", "promptRequired": "提示词不能为空" }, "cron": { "at": "在", "atMinute": "第", "custom": "自定义", "daily": "每天", "hourly": "每隔 N 小时", "weekdays": "工作日", "weekly": "每周", "nextRun": "下次执行", "nextRunIn": "距离下次执行还有", "lastRun": "上次执行", "days": { "0": "周日", "1": "周一", "2": "周二", "3": "周三", "4": "周四", "5": "周五", "6": "周六" } } };
15180
15183
  const zhCN = {
15181
15184
  sidebar,
15182
15185
  skills,
@@ -15208,7 +15211,8 @@ const zhCN = {
15208
15211
  fileDetail,
15209
15212
  htmlDetail,
15210
15213
  welcome,
15211
- askUser
15214
+ askUser,
15215
+ automation
15212
15216
  };
15213
15217
  instance.use(initReactI18next).init({
15214
15218
  resources: {
@@ -18846,6 +18850,8 @@ bridge.on(
18846
18850
  );
18847
18851
  bridge.on("prompt-start", (payload) => emit("prompt-start", payload));
18848
18852
  bridge.on("prompt-end", (payload) => emit("prompt-end", payload));
18853
+ bridge.on("schedules-changed", (payload) => emit("schedules-changed", payload));
18854
+ bridge.on("task-update", (payload) => emit("task-update", payload));
18849
18855
  void invokeIPC("registerClient", { clientId }).catch(() => {
18850
18856
  });
18851
18857
  function calculateUserMessageChunk(state2, update2) {
@@ -29284,35 +29290,35 @@ const createLucideIcon = (iconName, iconNode) => {
29284
29290
  Component.displayName = toPascalCase(iconName);
29285
29291
  return Component;
29286
29292
  };
29287
- const __iconNode$1b = [
29293
+ const __iconNode$1e = [
29288
29294
  ["path", { d: "M12 5v14", key: "s699le" }],
29289
29295
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
29290
29296
  ];
29291
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$1b);
29292
- const __iconNode$1a = [
29297
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$1e);
29298
+ const __iconNode$1d = [
29293
29299
  ["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
29294
29300
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
29295
29301
  ];
29296
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1a);
29297
- const __iconNode$19 = [
29302
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1d);
29303
+ const __iconNode$1c = [
29298
29304
  ["path", { d: "m16 3 4 4-4 4", key: "1x1c3m" }],
29299
29305
  ["path", { d: "M20 7H4", key: "zbl0bi" }],
29300
29306
  ["path", { d: "m8 21-4-4 4-4", key: "h9nckh" }],
29301
29307
  ["path", { d: "M4 17h16", key: "g4d7ey" }]
29302
29308
  ];
29303
- const ArrowRightLeft = createLucideIcon("arrow-right-left", __iconNode$19);
29304
- const __iconNode$18 = [
29309
+ const ArrowRightLeft = createLucideIcon("arrow-right-left", __iconNode$1c);
29310
+ const __iconNode$1b = [
29305
29311
  ["path", { d: "M5 3h14", key: "7usisc" }],
29306
29312
  ["path", { d: "m18 13-6-6-6 6", key: "1kf1n9" }],
29307
29313
  ["path", { d: "M12 7v14", key: "1akyts" }]
29308
29314
  ];
29309
- const ArrowUpToLine = createLucideIcon("arrow-up-to-line", __iconNode$18);
29310
- const __iconNode$17 = [
29315
+ const ArrowUpToLine = createLucideIcon("arrow-up-to-line", __iconNode$1b);
29316
+ const __iconNode$1a = [
29311
29317
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
29312
29318
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
29313
29319
  ];
29314
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$17);
29315
- const __iconNode$16 = [
29320
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$1a);
29321
+ const __iconNode$19 = [
29316
29322
  ["path", { d: "M12 7v6", key: "lw1j43" }],
29317
29323
  ["path", { d: "M15 10H9", key: "o6yqo3" }],
29318
29324
  [
@@ -29323,8 +29329,8 @@ const __iconNode$16 = [
29323
29329
  }
29324
29330
  ]
29325
29331
  ];
29326
- const BookmarkPlus = createLucideIcon("bookmark-plus", __iconNode$16);
29327
- const __iconNode$15 = [
29332
+ const BookmarkPlus = createLucideIcon("bookmark-plus", __iconNode$19);
29333
+ const __iconNode$18 = [
29328
29334
  ["path", { d: "M12 8V4H8", key: "hb8ula" }],
29329
29335
  ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
29330
29336
  ["path", { d: "M2 14h2", key: "vft8re" }],
@@ -29332,8 +29338,8 @@ const __iconNode$15 = [
29332
29338
  ["path", { d: "M15 13v2", key: "1xurst" }],
29333
29339
  ["path", { d: "M9 13v2", key: "rq6x2g" }]
29334
29340
  ];
29335
- const Bot = createLucideIcon("bot", __iconNode$15);
29336
- const __iconNode$14 = [
29341
+ const Bot = createLucideIcon("bot", __iconNode$18);
29342
+ const __iconNode$17 = [
29337
29343
  ["path", { d: "M12 18V5", key: "adv99a" }],
29338
29344
  ["path", { d: "M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4", key: "1e3is1" }],
29339
29345
  ["path", { d: "M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5", key: "1gqd8o" }],
@@ -29343,57 +29349,63 @@ const __iconNode$14 = [
29343
29349
  ["path", { d: "M6 18a4 4 0 0 1-2-7.464", key: "k1g0md" }],
29344
29350
  ["path", { d: "M6.003 5.125a4 4 0 0 0-2.526 5.77", key: "q97ue3" }]
29345
29351
  ];
29346
- const Brain = createLucideIcon("brain", __iconNode$14);
29347
- const __iconNode$13 = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
29348
- const Check = createLucideIcon("check", __iconNode$13);
29349
- const __iconNode$12 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
29350
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$12);
29351
- const __iconNode$11 = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
29352
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$11);
29353
- const __iconNode$10 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
29354
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$10);
29355
- const __iconNode$$ = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
29356
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$$);
29357
- const __iconNode$_ = [
29352
+ const Brain = createLucideIcon("brain", __iconNode$17);
29353
+ const __iconNode$16 = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
29354
+ const Check = createLucideIcon("check", __iconNode$16);
29355
+ const __iconNode$15 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
29356
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$15);
29357
+ const __iconNode$14 = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
29358
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$14);
29359
+ const __iconNode$13 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
29360
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$13);
29361
+ const __iconNode$12 = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
29362
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$12);
29363
+ const __iconNode$11 = [
29358
29364
  ["path", { d: "m7 20 5-5 5 5", key: "13a0gw" }],
29359
29365
  ["path", { d: "m7 4 5 5 5-5", key: "1kwcof" }]
29360
29366
  ];
29361
- const ChevronsDownUp = createLucideIcon("chevrons-down-up", __iconNode$_);
29362
- const __iconNode$Z = [
29367
+ const ChevronsDownUp = createLucideIcon("chevrons-down-up", __iconNode$11);
29368
+ const __iconNode$10 = [
29363
29369
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
29364
29370
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
29365
29371
  ];
29366
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$Z);
29367
- const __iconNode$Y = [
29372
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$10);
29373
+ const __iconNode$$ = [
29368
29374
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
29369
29375
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
29370
29376
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
29371
29377
  ];
29372
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$Y);
29373
- const __iconNode$X = [
29378
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$$);
29379
+ const __iconNode$_ = [
29374
29380
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
29375
29381
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
29376
29382
  ];
29377
- const CircleCheck = createLucideIcon("circle-check", __iconNode$X);
29378
- const __iconNode$W = [
29383
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$_);
29384
+ const __iconNode$Z = [
29379
29385
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
29380
29386
  ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
29381
29387
  ["path", { d: "M12 17h.01", key: "p32p05" }]
29382
29388
  ];
29383
- const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$W);
29384
- const __iconNode$V = [["circle", { cx: "12", cy: "12", r: "6", key: "1vlfrh" }]];
29385
- const CircleSmall = createLucideIcon("circle-small", __iconNode$V);
29386
- const __iconNode$U = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
29387
- const Circle = createLucideIcon("circle", __iconNode$U);
29388
- const __iconNode$T = [
29389
+ const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$Z);
29390
+ const __iconNode$Y = [["circle", { cx: "12", cy: "12", r: "6", key: "1vlfrh" }]];
29391
+ const CircleSmall = createLucideIcon("circle-small", __iconNode$Y);
29392
+ const __iconNode$X = [
29393
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
29394
+ ["path", { d: "m15 9-6 6", key: "1uzhvr" }],
29395
+ ["path", { d: "m9 9 6 6", key: "z0biqf" }]
29396
+ ];
29397
+ const CircleX = createLucideIcon("circle-x", __iconNode$X);
29398
+ const __iconNode$W = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
29399
+ const Circle = createLucideIcon("circle", __iconNode$W);
29400
+ const __iconNode$V = [
29389
29401
  ["path", { d: "M11 14h10", key: "1w8e9d" }],
29390
29402
  ["path", { d: "M16 4h2a2 2 0 0 1 2 2v1.344", key: "1e62lh" }],
29391
29403
  ["path", { d: "m17 18 4-4-4-4", key: "z2g111" }],
29392
29404
  ["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" }],
29393
29405
  ["rect", { x: "8", y: "2", width: "8", height: "4", rx: "1", key: "ublpy" }]
29394
29406
  ];
29395
- const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$T);
29396
- const __iconNode$S = [
29407
+ const ClipboardPaste = createLucideIcon("clipboard-paste", __iconNode$V);
29408
+ const __iconNode$U = [
29397
29409
  ["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
29398
29410
  [
29399
29411
  "path",
@@ -29403,25 +29415,31 @@ const __iconNode$S = [
29403
29415
  }
29404
29416
  ]
29405
29417
  ];
29406
- const Clipboard = createLucideIcon("clipboard", __iconNode$S);
29407
- const __iconNode$R = [
29418
+ const Clipboard = createLucideIcon("clipboard", __iconNode$U);
29419
+ const __iconNode$T = [
29420
+ ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }],
29421
+ ["path", { d: "M22 12a10 10 0 1 0-11 9.95", key: "17dhok" }],
29422
+ ["path", { d: "m22 16-5.5 5.5L14 19", key: "1eibut" }]
29423
+ ];
29424
+ const ClockCheck = createLucideIcon("clock-check", __iconNode$T);
29425
+ const __iconNode$S = [
29408
29426
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
29409
29427
  ["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" }]
29410
29428
  ];
29411
- const Copy = createLucideIcon("copy", __iconNode$R);
29412
- const __iconNode$Q = [
29429
+ const Copy = createLucideIcon("copy", __iconNode$S);
29430
+ const __iconNode$R = [
29413
29431
  ["path", { d: "M12 15V3", key: "m9g1x1" }],
29414
29432
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
29415
29433
  ["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
29416
29434
  ];
29417
- const Download = createLucideIcon("download", __iconNode$Q);
29418
- const __iconNode$P = [
29435
+ const Download = createLucideIcon("download", __iconNode$R);
29436
+ const __iconNode$Q = [
29419
29437
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
29420
29438
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
29421
29439
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
29422
29440
  ];
29423
- const ExternalLink = createLucideIcon("external-link", __iconNode$P);
29424
- const __iconNode$O = [
29441
+ const ExternalLink = createLucideIcon("external-link", __iconNode$Q);
29442
+ const __iconNode$P = [
29425
29443
  [
29426
29444
  "path",
29427
29445
  {
@@ -29433,8 +29451,8 @@ const __iconNode$O = [
29433
29451
  ["path", { d: "M10 12.5 8 15l2 2.5", key: "1tg20x" }],
29434
29452
  ["path", { d: "m14 12.5 2 2.5-2 2.5", key: "yinavb" }]
29435
29453
  ];
29436
- const FileCode = createLucideIcon("file-code", __iconNode$O);
29437
- const __iconNode$N = [
29454
+ const FileCode = createLucideIcon("file-code", __iconNode$P);
29455
+ const __iconNode$O = [
29438
29456
  [
29439
29457
  "path",
29440
29458
  {
@@ -29446,8 +29464,8 @@ const __iconNode$N = [
29446
29464
  ["path", { d: "M9 15h6", key: "cctwl0" }],
29447
29465
  ["path", { d: "M12 18v-6", key: "17g6i2" }]
29448
29466
  ];
29449
- const FilePlus = createLucideIcon("file-plus", __iconNode$N);
29450
- const __iconNode$M = [
29467
+ const FilePlus = createLucideIcon("file-plus", __iconNode$O);
29468
+ const __iconNode$N = [
29451
29469
  [
29452
29470
  "path",
29453
29471
  {
@@ -29460,8 +29478,8 @@ const __iconNode$M = [
29460
29478
  ["path", { d: "M16 13H8", key: "t4e002" }],
29461
29479
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
29462
29480
  ];
29463
- const FileText = createLucideIcon("file-text", __iconNode$M);
29464
- const __iconNode$L = [
29481
+ const FileText = createLucideIcon("file-text", __iconNode$N);
29482
+ const __iconNode$M = [
29465
29483
  [
29466
29484
  "path",
29467
29485
  {
@@ -29471,8 +29489,8 @@ const __iconNode$L = [
29471
29489
  ],
29472
29490
  ["path", { d: "M2 10h20", key: "1ir3d8" }]
29473
29491
  ];
29474
- const FolderClosed = createLucideIcon("folder-closed", __iconNode$L);
29475
- const __iconNode$K = [
29492
+ const FolderClosed = createLucideIcon("folder-closed", __iconNode$M);
29493
+ const __iconNode$L = [
29476
29494
  [
29477
29495
  "path",
29478
29496
  {
@@ -29481,8 +29499,8 @@ const __iconNode$K = [
29481
29499
  }
29482
29500
  ]
29483
29501
  ];
29484
- const FolderOpen = createLucideIcon("folder-open", __iconNode$K);
29485
- const __iconNode$J = [
29502
+ const FolderOpen = createLucideIcon("folder-open", __iconNode$L);
29503
+ const __iconNode$K = [
29486
29504
  ["path", { d: "M12 10v6", key: "1bos4e" }],
29487
29505
  ["path", { d: "M9 13h6", key: "1uhe8q" }],
29488
29506
  [
@@ -29493,8 +29511,8 @@ const __iconNode$J = [
29493
29511
  }
29494
29512
  ]
29495
29513
  ];
29496
- const FolderPlus = createLucideIcon("folder-plus", __iconNode$J);
29497
- const __iconNode$I = [
29514
+ const FolderPlus = createLucideIcon("folder-plus", __iconNode$K);
29515
+ const __iconNode$J = [
29498
29516
  [
29499
29517
  "path",
29500
29518
  {
@@ -29503,8 +29521,8 @@ const __iconNode$I = [
29503
29521
  }
29504
29522
  ]
29505
29523
  ];
29506
- const Folder$1 = createLucideIcon("folder", __iconNode$I);
29507
- const __iconNode$H = [
29524
+ const Folder$1 = createLucideIcon("folder", __iconNode$J);
29525
+ const __iconNode$I = [
29508
29526
  [
29509
29527
  "path",
29510
29528
  {
@@ -29517,20 +29535,20 @@ const __iconNode$H = [
29517
29535
  { d: "M3 8.268a2 2 0 0 0-1 1.738V19a2 2 0 0 0 2 2h11a2 2 0 0 0 1.732-1", key: "yxbcw3" }
29518
29536
  ]
29519
29537
  ];
29520
- const Folders = createLucideIcon("folders", __iconNode$H);
29521
- const __iconNode$G = [
29538
+ const Folders = createLucideIcon("folders", __iconNode$I);
29539
+ const __iconNode$H = [
29522
29540
  ["path", { d: "M15 6a9 9 0 0 0-9 9V3", key: "1cii5b" }],
29523
29541
  ["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
29524
29542
  ["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }]
29525
29543
  ];
29526
- const GitBranch = createLucideIcon("git-branch", __iconNode$G);
29527
- const __iconNode$F = [
29544
+ const GitBranch = createLucideIcon("git-branch", __iconNode$H);
29545
+ const __iconNode$G = [
29528
29546
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
29529
29547
  ["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
29530
29548
  ["path", { d: "M2 12h20", key: "9i4pu4" }]
29531
29549
  ];
29532
- const Globe = createLucideIcon("globe", __iconNode$F);
29533
- const __iconNode$E = [
29550
+ const Globe = createLucideIcon("globe", __iconNode$G);
29551
+ const __iconNode$F = [
29534
29552
  ["circle", { cx: "9", cy: "12", r: "1", key: "1vctgf" }],
29535
29553
  ["circle", { cx: "9", cy: "5", r: "1", key: "hp0tcf" }],
29536
29554
  ["circle", { cx: "9", cy: "19", r: "1", key: "fkjjf6" }],
@@ -29538,8 +29556,8 @@ const __iconNode$E = [
29538
29556
  ["circle", { cx: "15", cy: "5", r: "1", key: "19l28e" }],
29539
29557
  ["circle", { cx: "15", cy: "19", r: "1", key: "f4zoj3" }]
29540
29558
  ];
29541
- const GripVertical = createLucideIcon("grip-vertical", __iconNode$E);
29542
- const __iconNode$D = [
29559
+ const GripVertical = createLucideIcon("grip-vertical", __iconNode$F);
29560
+ const __iconNode$E = [
29543
29561
  ["path", { d: "m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9", key: "1hayfq" }],
29544
29562
  ["path", { d: "m18 15 4-4", key: "16gjal" }],
29545
29563
  [
@@ -29550,8 +29568,8 @@ const __iconNode$D = [
29550
29568
  }
29551
29569
  ]
29552
29570
  ];
29553
- const Hammer = createLucideIcon("hammer", __iconNode$D);
29554
- const __iconNode$C = [
29571
+ const Hammer = createLucideIcon("hammer", __iconNode$E);
29572
+ const __iconNode$D = [
29555
29573
  ["path", { d: "M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8", key: "5wwlr5" }],
29556
29574
  [
29557
29575
  "path",
@@ -29561,27 +29579,27 @@ const __iconNode$C = [
29561
29579
  }
29562
29580
  ]
29563
29581
  ];
29564
- const House = createLucideIcon("house", __iconNode$C);
29565
- const __iconNode$B = [
29582
+ const House = createLucideIcon("house", __iconNode$D);
29583
+ const __iconNode$C = [
29566
29584
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
29567
29585
  ["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
29568
29586
  ["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
29569
29587
  ];
29570
- const Image$1 = createLucideIcon("image", __iconNode$B);
29571
- const __iconNode$A = [
29588
+ const Image$1 = createLucideIcon("image", __iconNode$C);
29589
+ const __iconNode$B = [
29572
29590
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
29573
29591
  ["path", { d: "M12 16v-4", key: "1dtifu" }],
29574
29592
  ["path", { d: "M12 8h.01", key: "e9boi3" }]
29575
29593
  ];
29576
- const Info$1 = createLucideIcon("info", __iconNode$A);
29577
- const __iconNode$z = [
29594
+ const Info$1 = createLucideIcon("info", __iconNode$B);
29595
+ const __iconNode$A = [
29578
29596
  ["path", { d: "m16 6 4 14", key: "ji33uf" }],
29579
29597
  ["path", { d: "M12 6v14", key: "1n7gus" }],
29580
29598
  ["path", { d: "M8 8v12", key: "1gg7y9" }],
29581
29599
  ["path", { d: "M4 4v16", key: "6qkkli" }]
29582
29600
  ];
29583
- const Library = createLucideIcon("library", __iconNode$z);
29584
- const __iconNode$y = [
29601
+ const Library = createLucideIcon("library", __iconNode$A);
29602
+ const __iconNode$z = [
29585
29603
  [
29586
29604
  "path",
29587
29605
  {
@@ -29592,23 +29610,23 @@ const __iconNode$y = [
29592
29610
  ["path", { d: "M9 18h6", key: "x1upvd" }],
29593
29611
  ["path", { d: "M10 22h4", key: "ceow96" }]
29594
29612
  ];
29595
- const Lightbulb = createLucideIcon("lightbulb", __iconNode$y);
29596
- const __iconNode$x = [
29613
+ const Lightbulb = createLucideIcon("lightbulb", __iconNode$z);
29614
+ const __iconNode$y = [
29597
29615
  ["path", { d: "M9 17H7A5 5 0 0 1 7 7", key: "10o201" }],
29598
29616
  ["path", { d: "M15 7h2a5 5 0 0 1 4 8", key: "1d3206" }],
29599
29617
  ["line", { x1: "8", x2: "12", y1: "12", y2: "12", key: "rvw6j4" }],
29600
29618
  ["line", { x1: "2", x2: "22", y1: "2", y2: "22", key: "a6p6uj" }]
29601
29619
  ];
29602
- const Link2Off = createLucideIcon("link-2-off", __iconNode$x);
29603
- const __iconNode$w = [
29620
+ const Link2Off = createLucideIcon("link-2-off", __iconNode$y);
29621
+ const __iconNode$x = [
29604
29622
  ["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
29605
29623
  ["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
29606
29624
  ["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
29607
29625
  ];
29608
- const Link2 = createLucideIcon("link-2", __iconNode$w);
29609
- const __iconNode$v = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
29610
- const LoaderCircle = createLucideIcon("loader-circle", __iconNode$v);
29611
- const __iconNode$u = [
29626
+ const Link2 = createLucideIcon("link-2", __iconNode$x);
29627
+ const __iconNode$w = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
29628
+ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$w);
29629
+ const __iconNode$v = [
29612
29630
  [
29613
29631
  "path",
29614
29632
  {
@@ -29619,8 +29637,8 @@ const __iconNode$u = [
29619
29637
  ["path", { d: "M8 12h8", key: "1wcyev" }],
29620
29638
  ["path", { d: "M12 8v8", key: "napkw2" }]
29621
29639
  ];
29622
- const MessageCirclePlus = createLucideIcon("message-circle-plus", __iconNode$u);
29623
- const __iconNode$t = [
29640
+ const MessageCirclePlus = createLucideIcon("message-circle-plus", __iconNode$v);
29641
+ const __iconNode$u = [
29624
29642
  [
29625
29643
  "path",
29626
29644
  {
@@ -29629,8 +29647,8 @@ const __iconNode$t = [
29629
29647
  }
29630
29648
  ]
29631
29649
  ];
29632
- const MessageCircle = createLucideIcon("message-circle", __iconNode$t);
29633
- const __iconNode$s = [
29650
+ const MessageCircle = createLucideIcon("message-circle", __iconNode$u);
29651
+ const __iconNode$t = [
29634
29652
  [
29635
29653
  "path",
29636
29654
  {
@@ -29641,8 +29659,8 @@ const __iconNode$s = [
29641
29659
  ["path", { d: "M12 8v6", key: "1ib9pf" }],
29642
29660
  ["path", { d: "M9 11h6", key: "1fldmi" }]
29643
29661
  ];
29644
- const MessageSquarePlus = createLucideIcon("message-square-plus", __iconNode$s);
29645
- const __iconNode$r = [
29662
+ const MessageSquarePlus = createLucideIcon("message-square-plus", __iconNode$t);
29663
+ const __iconNode$s = [
29646
29664
  [
29647
29665
  "path",
29648
29666
  {
@@ -29651,10 +29669,10 @@ const __iconNode$r = [
29651
29669
  }
29652
29670
  ]
29653
29671
  ];
29654
- const MessageSquare = createLucideIcon("message-square", __iconNode$r);
29655
- const __iconNode$q = [["path", { d: "M5 12h14", key: "1ays0h" }]];
29656
- const Minus = createLucideIcon("minus", __iconNode$q);
29657
- const __iconNode$p = [
29672
+ const MessageSquare = createLucideIcon("message-square", __iconNode$s);
29673
+ const __iconNode$r = [["path", { d: "M5 12h14", key: "1ays0h" }]];
29674
+ const Minus = createLucideIcon("minus", __iconNode$r);
29675
+ const __iconNode$q = [
29658
29676
  ["path", { d: "M12 2v20", key: "t6zp3m" }],
29659
29677
  ["path", { d: "m15 19-3 3-3-3", key: "11eu04" }],
29660
29678
  ["path", { d: "m19 9 3 3-3 3", key: "1mg7y2" }],
@@ -29662,8 +29680,8 @@ const __iconNode$p = [
29662
29680
  ["path", { d: "m5 9-3 3 3 3", key: "j64kie" }],
29663
29681
  ["path", { d: "m9 5 3-3 3 3", key: "l8vdw6" }]
29664
29682
  ];
29665
- const Move = createLucideIcon("move", __iconNode$p);
29666
- const __iconNode$o = [
29683
+ const Move = createLucideIcon("move", __iconNode$q);
29684
+ const __iconNode$p = [
29667
29685
  ["path", { d: "M2 6h4", key: "aawbzj" }],
29668
29686
  ["path", { d: "M2 10h4", key: "l0bgd4" }],
29669
29687
  ["path", { d: "M2 14h4", key: "1gsvsf" }],
@@ -29671,8 +29689,8 @@ const __iconNode$o = [
29671
29689
  ["rect", { width: "16", height: "20", x: "4", y: "2", rx: "2", key: "1nb95v" }],
29672
29690
  ["path", { d: "M16 2v20", key: "rotuqe" }]
29673
29691
  ];
29674
- const Notebook = createLucideIcon("notebook", __iconNode$o);
29675
- const __iconNode$n = [
29692
+ const Notebook = createLucideIcon("notebook", __iconNode$p);
29693
+ const __iconNode$o = [
29676
29694
  ["path", { d: "m15 9-6 6", key: "1uzhvr" }],
29677
29695
  [
29678
29696
  "path",
@@ -29683,8 +29701,8 @@ const __iconNode$n = [
29683
29701
  ],
29684
29702
  ["path", { d: "m9 9 6 6", key: "z0biqf" }]
29685
29703
  ];
29686
- const OctagonX = createLucideIcon("octagon-x", __iconNode$n);
29687
- const __iconNode$m = [
29704
+ const OctagonX = createLucideIcon("octagon-x", __iconNode$o);
29705
+ const __iconNode$n = [
29688
29706
  ["path", { d: "M12 22V12", key: "d0xqtd" }],
29689
29707
  ["path", { d: "M20.27 18.27 22 20", key: "er2am" }],
29690
29708
  [
@@ -29698,8 +29716,8 @@ const __iconNode$m = [
29698
29716
  ["path", { d: "m7.5 4.27 8.997 5.148", key: "9yrvtv" }],
29699
29717
  ["circle", { cx: "18.5", cy: "16.5", r: "2.5", key: "ke13xx" }]
29700
29718
  ];
29701
- const PackageSearch = createLucideIcon("package-search", __iconNode$m);
29702
- const __iconNode$l = [
29719
+ const PackageSearch = createLucideIcon("package-search", __iconNode$n);
29720
+ const __iconNode$m = [
29703
29721
  [
29704
29722
  "path",
29705
29723
  {
@@ -29708,8 +29726,8 @@ const __iconNode$l = [
29708
29726
  }
29709
29727
  ]
29710
29728
  ];
29711
- const Paperclip = createLucideIcon("paperclip", __iconNode$l);
29712
- const __iconNode$k = [
29729
+ const Paperclip = createLucideIcon("paperclip", __iconNode$m);
29730
+ const __iconNode$l = [
29713
29731
  [
29714
29732
  "path",
29715
29733
  {
@@ -29719,7 +29737,17 @@ const __iconNode$k = [
29719
29737
  ],
29720
29738
  ["path", { d: "m15 5 4 4", key: "1mk7zo" }]
29721
29739
  ];
29722
- const Pencil = createLucideIcon("pencil", __iconNode$k);
29740
+ const Pencil = createLucideIcon("pencil", __iconNode$l);
29741
+ const __iconNode$k = [
29742
+ [
29743
+ "path",
29744
+ {
29745
+ d: "M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",
29746
+ key: "10ikf1"
29747
+ }
29748
+ ]
29749
+ ];
29750
+ const Play = createLucideIcon("play", __iconNode$k);
29723
29751
  const __iconNode$j = [
29724
29752
  ["path", { d: "M5 12h14", key: "1ays0h" }],
29725
29753
  ["path", { d: "M12 5v14", key: "s699le" }]
@@ -41226,6 +41254,17 @@ function Sidebar() {
41226
41254
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal select-none uppercase", children: t2("sidebar.skills") })
41227
41255
  ]
41228
41256
  }
41257
+ ),
41258
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
41259
+ "div",
41260
+ {
41261
+ onClick: () => handleNavigate("/automation"),
41262
+ className: `mt-0.5 group flex h-8 cursor-default items-center gap-2 rounded-md px-1.5 text-xs font-normal transition-colors ${currentPath.startsWith("/automation") ? "bg-sidebar-accent text-sidebar-accent-foreground" : "text-sidebar-foreground/70 hover:bg-sidebar-accent hover:text-sidebar-foreground/95"}`,
41263
+ children: [
41264
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ClockCheck, { className: "size-3.5" }),
41265
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal select-none uppercase", children: t2("sidebar.automation", "Automation") })
41266
+ ]
41267
+ }
41229
41268
  )
41230
41269
  ] }),
41231
41270
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-3 pb-2 pt-2", children: [
@@ -41943,7 +41982,7 @@ function Welcome() {
41943
41982
  children: [
41944
41983
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "absolute bottom-3 right-4 text-[11px] text-muted-foreground/40 z-10 pointer-events-none", children: [
41945
41984
  "v",
41946
- "0.1.28"
41985
+ "0.1.29"
41947
41986
  ] }),
41948
41987
  /* @__PURE__ */ jsxRuntimeExports.jsx(
41949
41988
  "div",
@@ -68611,7 +68650,7 @@ var lr$2 = (e2) => {
68611
68650
  for (; t2 > 0 && e2[t2 - 1] === `
68612
68651
  `; ) t2--;
68613
68652
  return e2.slice(0, t2);
68614
- }, cr$1 = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-OFNGDK62-B6M-kMLU.js"), true ? [] : void 0, import.meta.url).then((e2) => ({ default: e2.HighlightedCodeBlockBody }))), st$4 = ({ code: e2, language: t2, className: o4, children: n2, isIncomplete: r3 = false, startLine: s16, lineNumbers: a2, ...l6 }) => {
68653
+ }, cr$1 = reactExports.lazy(() => __vitePreload(() => import("./highlighted-body-OFNGDK62-DQWoSdTY.js"), true ? [] : void 0, import.meta.url).then((e2) => ({ default: e2.HighlightedCodeBlockBody }))), st$4 = ({ code: e2, language: t2, className: o4, children: n2, isIncomplete: r3 = false, startLine: s16, lineNumbers: a2, ...l6 }) => {
68615
68654
  let i3 = y$9(), d2 = reactExports.useMemo(() => lr$2(e2), [e2]), c2 = reactExports.useMemo(() => ({ bg: "transparent", fg: "inherit", tokens: d2.split(`
68616
68655
  `).map((p3) => [{ content: p3, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [d2]);
68617
68656
  return jsxRuntimeExports.jsx(nt$4.Provider, { value: { code: e2 }, children: jsxRuntimeExports.jsxs(ot$4, { isIncomplete: r3, language: t2, children: [jsxRuntimeExports.jsx(rt$3, { language: t2 }), n2 ? jsxRuntimeExports.jsx("div", { className: i3("pointer-events-none sticky top-2 z-10 -mt-10 flex h-8 items-center justify-end"), children: jsxRuntimeExports.jsx("div", { className: i3("pointer-events-auto flex shrink-0 items-center gap-2 rounded-md border border-sidebar bg-sidebar/80 px-1.5 py-1 supports-[backdrop-filter]:bg-sidebar/70 supports-[backdrop-filter]:backdrop-blur"), "data-streamdown": "code-block-actions", children: n2 }) }) : null, jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: jsxRuntimeExports.jsx(At$2, { className: o4, language: t2, lineNumbers: a2, result: c2, startLine: s16, ...l6 }), children: jsxRuntimeExports.jsx(cr$1, { className: o4, code: d2, language: t2, lineNumbers: a2, raw: c2, startLine: s16, ...l6 }) })] }) });
@@ -93452,12 +93491,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
93452
93491
  registerLayoutLoaders([
93453
93492
  {
93454
93493
  name: "dagre",
93455
- loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-KV5264BT-LHPLEy9g.js"), true ? __vite__mapDeps([0,1,2,3,4,5]) : void 0, import.meta.url), "loader")
93494
+ loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-KV5264BT-4I0h4wyh.js"), true ? __vite__mapDeps([0,1,2,3,4,5]) : void 0, import.meta.url), "loader")
93456
93495
  },
93457
93496
  ...[
93458
93497
  {
93459
93498
  name: "cose-bilkent",
93460
- loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-CuSnz9Ro.js"), true ? __vite__mapDeps([6,7]) : void 0, import.meta.url), "loader")
93499
+ loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-lCfWcP6y.js"), true ? __vite__mapDeps([6,7]) : void 0, import.meta.url), "loader")
93461
93500
  }
93462
93501
  ]
93463
93502
  ]);
@@ -93913,7 +93952,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
93913
93952
  }, "detector");
93914
93953
  var loader = /* @__PURE__ */ __name(async () => {
93915
93954
  const { diagram: diagram2 } = await __vitePreload(async () => {
93916
- const { diagram: diagram22 } = await import("./c4Diagram-AHTNJAMY-DWRXz6-S.js");
93955
+ const { diagram: diagram22 } = await import("./c4Diagram-AHTNJAMY-Co_b_6bH.js");
93917
93956
  return { diagram: diagram22 };
93918
93957
  }, true ? __vite__mapDeps([8,9]) : void 0, import.meta.url);
93919
93958
  return { id, diagram: diagram2 };
@@ -93933,7 +93972,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
93933
93972
  }, "detector");
93934
93973
  var loader2 = /* @__PURE__ */ __name(async () => {
93935
93974
  const { diagram: diagram2 } = await __vitePreload(async () => {
93936
- const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-DoIqEJWm.js");
93975
+ const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-Dfg0LLup.js");
93937
93976
  return { diagram: diagram22 };
93938
93977
  }, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
93939
93978
  return { id: id2, diagram: diagram2 };
@@ -93959,7 +93998,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
93959
93998
  }, "detector");
93960
93999
  var loader3 = /* @__PURE__ */ __name(async () => {
93961
94000
  const { diagram: diagram2 } = await __vitePreload(async () => {
93962
- const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-DoIqEJWm.js");
94001
+ const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-Dfg0LLup.js");
93963
94002
  return { diagram: diagram22 };
93964
94003
  }, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
93965
94004
  return { id: id3, diagram: diagram2 };
@@ -93976,7 +94015,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
93976
94015
  }, "detector");
93977
94016
  var loader4 = /* @__PURE__ */ __name(async () => {
93978
94017
  const { diagram: diagram2 } = await __vitePreload(async () => {
93979
- const { diagram: diagram22 } = await import("./erDiagram-SMLLAGMA-4xwE7Ysd.js");
94018
+ const { diagram: diagram22 } = await import("./erDiagram-SMLLAGMA-Bk9QFZ27.js");
93980
94019
  return { diagram: diagram22 };
93981
94020
  }, true ? __vite__mapDeps([15,12,13,14]) : void 0, import.meta.url);
93982
94021
  return { id: id4, diagram: diagram2 };
@@ -93993,7 +94032,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
93993
94032
  }, "detector");
93994
94033
  var loader5 = /* @__PURE__ */ __name(async () => {
93995
94034
  const { diagram: diagram2 } = await __vitePreload(async () => {
93996
- const { diagram: diagram22 } = await import("./gitGraphDiagram-UUTBAWPF-D3YiiEhK.js");
94035
+ const { diagram: diagram22 } = await import("./gitGraphDiagram-UUTBAWPF-C74WBszH.js");
93997
94036
  return { diagram: diagram22 };
93998
94037
  }, true ? __vite__mapDeps([16,17,18,19,4,2]) : void 0, import.meta.url);
93999
94038
  return { id: id5, diagram: diagram2 };
@@ -94010,7 +94049,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
94010
94049
  }, "detector");
94011
94050
  var loader6 = /* @__PURE__ */ __name(async () => {
94012
94051
  const { diagram: diagram2 } = await __vitePreload(async () => {
94013
- const { diagram: diagram22 } = await import("./ganttDiagram-T4ZO3ILL-C48vXSUK.js");
94052
+ const { diagram: diagram22 } = await import("./ganttDiagram-T4ZO3ILL-lTjaJTs0.js");
94014
94053
  return { diagram: diagram22 };
94015
94054
  }, true ? __vite__mapDeps([20,21,22,23]) : void 0, import.meta.url);
94016
94055
  return { id: id6, diagram: diagram2 };
@@ -94027,7 +94066,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
94027
94066
  }, "detector");
94028
94067
  var loader7 = /* @__PURE__ */ __name(async () => {
94029
94068
  const { diagram: diagram2 } = await __vitePreload(async () => {
94030
- const { diagram: diagram22 } = await import("./infoDiagram-42DDH7IO-ur7rRidE.js");
94069
+ const { diagram: diagram22 } = await import("./infoDiagram-42DDH7IO-CR4ZLAM1.js");
94031
94070
  return { diagram: diagram22 };
94032
94071
  }, true ? __vite__mapDeps([24,19,4,2]) : void 0, import.meta.url);
94033
94072
  return { id: id7, diagram: diagram2 };
@@ -94043,7 +94082,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
94043
94082
  }, "detector");
94044
94083
  var loader8 = /* @__PURE__ */ __name(async () => {
94045
94084
  const { diagram: diagram2 } = await __vitePreload(async () => {
94046
- const { diagram: diagram22 } = await import("./pieDiagram-DEJITSTG-Cew7QWxE.js");
94085
+ const { diagram: diagram22 } = await import("./pieDiagram-DEJITSTG-C8AxK_-F.js");
94047
94086
  return { diagram: diagram22 };
94048
94087
  }, true ? __vite__mapDeps([25,17,19,4,2,26,27,22]) : void 0, import.meta.url);
94049
94088
  return { id: id8, diagram: diagram2 };
@@ -94059,7 +94098,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
94059
94098
  }, "detector");
94060
94099
  var loader9 = /* @__PURE__ */ __name(async () => {
94061
94100
  const { diagram: diagram2 } = await __vitePreload(async () => {
94062
- const { diagram: diagram22 } = await import("./quadrantDiagram-34T5L4WZ-CrZCtVJh.js");
94101
+ const { diagram: diagram22 } = await import("./quadrantDiagram-34T5L4WZ-BdiZmi7w.js");
94063
94102
  return { diagram: diagram22 };
94064
94103
  }, true ? __vite__mapDeps([28,21,22,23]) : void 0, import.meta.url);
94065
94104
  return { id: id9, diagram: diagram2 };
@@ -94076,7 +94115,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
94076
94115
  }, "detector");
94077
94116
  var loader10 = /* @__PURE__ */ __name(async () => {
94078
94117
  const { diagram: diagram2 } = await __vitePreload(async () => {
94079
- const { diagram: diagram22 } = await import("./xychartDiagram-5P7HB3ND-095YR9W9.js");
94118
+ const { diagram: diagram22 } = await import("./xychartDiagram-5P7HB3ND-J9z4uuMK.js");
94080
94119
  return { diagram: diagram22 };
94081
94120
  }, true ? __vite__mapDeps([29,22,27,21,23]) : void 0, import.meta.url);
94082
94121
  return { id: id10, diagram: diagram2 };
@@ -94093,7 +94132,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
94093
94132
  }, "detector");
94094
94133
  var loader11 = /* @__PURE__ */ __name(async () => {
94095
94134
  const { diagram: diagram2 } = await __vitePreload(async () => {
94096
- const { diagram: diagram22 } = await import("./requirementDiagram-MS252O5E-C69IGxW8.js");
94135
+ const { diagram: diagram22 } = await import("./requirementDiagram-MS252O5E-BHIfl5Tz.js");
94097
94136
  return { diagram: diagram22 };
94098
94137
  }, true ? __vite__mapDeps([30,12,13]) : void 0, import.meta.url);
94099
94138
  return { id: id11, diagram: diagram2 };
@@ -94110,7 +94149,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
94110
94149
  }, "detector");
94111
94150
  var loader12 = /* @__PURE__ */ __name(async () => {
94112
94151
  const { diagram: diagram2 } = await __vitePreload(async () => {
94113
- const { diagram: diagram22 } = await import("./sequenceDiagram-FGHM5R23-Dv_lOZN1.js");
94152
+ const { diagram: diagram22 } = await import("./sequenceDiagram-FGHM5R23-COKEbCYM.js");
94114
94153
  return { diagram: diagram22 };
94115
94154
  }, true ? __vite__mapDeps([31,9,18]) : void 0, import.meta.url);
94116
94155
  return { id: id12, diagram: diagram2 };
@@ -94130,7 +94169,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
94130
94169
  }, "detector");
94131
94170
  var loader13 = /* @__PURE__ */ __name(async () => {
94132
94171
  const { diagram: diagram2 } = await __vitePreload(async () => {
94133
- const { diagram: diagram22 } = await import("./classDiagram-6PBFFD2Q-B12_6ldG.js");
94172
+ const { diagram: diagram22 } = await import("./classDiagram-6PBFFD2Q-OFMeoPav.js");
94134
94173
  return { diagram: diagram22 };
94135
94174
  }, true ? __vite__mapDeps([32,33,11,9,12,13]) : void 0, import.meta.url);
94136
94175
  return { id: id13, diagram: diagram2 };
@@ -94150,7 +94189,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
94150
94189
  }, "detector");
94151
94190
  var loader14 = /* @__PURE__ */ __name(async () => {
94152
94191
  const { diagram: diagram2 } = await __vitePreload(async () => {
94153
- const { diagram: diagram22 } = await import("./classDiagram-v2-HSJHXN6E-B12_6ldG.js");
94192
+ const { diagram: diagram22 } = await import("./classDiagram-v2-HSJHXN6E-OFMeoPav.js");
94154
94193
  return { diagram: diagram22 };
94155
94194
  }, true ? __vite__mapDeps([34,33,11,9,12,13]) : void 0, import.meta.url);
94156
94195
  return { id: id14, diagram: diagram2 };
@@ -94170,7 +94209,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
94170
94209
  }, "detector");
94171
94210
  var loader15 = /* @__PURE__ */ __name(async () => {
94172
94211
  const { diagram: diagram2 } = await __vitePreload(async () => {
94173
- const { diagram: diagram22 } = await import("./stateDiagram-FHFEXIEX-D9dJAqtV.js");
94212
+ const { diagram: diagram22 } = await import("./stateDiagram-FHFEXIEX-7zRGBf7O.js");
94174
94213
  return { diagram: diagram22 };
94175
94214
  }, true ? __vite__mapDeps([35,36,12,13,1,2,3,4]) : void 0, import.meta.url);
94176
94215
  return { id: id15, diagram: diagram2 };
@@ -94193,7 +94232,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
94193
94232
  }, "detector");
94194
94233
  var loader16 = /* @__PURE__ */ __name(async () => {
94195
94234
  const { diagram: diagram2 } = await __vitePreload(async () => {
94196
- const { diagram: diagram22 } = await import("./stateDiagram-v2-QKLJ7IA2-CQXoaDY1.js");
94235
+ const { diagram: diagram22 } = await import("./stateDiagram-v2-QKLJ7IA2-BqHJ_ZBX.js");
94197
94236
  return { diagram: diagram22 };
94198
94237
  }, true ? __vite__mapDeps([37,36,12,13]) : void 0, import.meta.url);
94199
94238
  return { id: id16, diagram: diagram2 };
@@ -94210,7 +94249,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
94210
94249
  }, "detector");
94211
94250
  var loader17 = /* @__PURE__ */ __name(async () => {
94212
94251
  const { diagram: diagram2 } = await __vitePreload(async () => {
94213
- const { diagram: diagram22 } = await import("./journeyDiagram-VCZTEJTY-TxjKxXBo.js");
94252
+ const { diagram: diagram22 } = await import("./journeyDiagram-VCZTEJTY-Ds2OL3Lo.js");
94214
94253
  return { diagram: diagram22 };
94215
94254
  }, true ? __vite__mapDeps([38,11,9,26]) : void 0, import.meta.url);
94216
94255
  return { id: id17, diagram: diagram2 };
@@ -94280,7 +94319,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
94280
94319
  }, "detector");
94281
94320
  var loader18 = /* @__PURE__ */ __name(async () => {
94282
94321
  const { diagram: diagram2 } = await __vitePreload(async () => {
94283
- const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-DoIqEJWm.js");
94322
+ const { diagram: diagram22 } = await import("./flowDiagram-DWJPFMVM-Dfg0LLup.js");
94284
94323
  return { diagram: diagram22 };
94285
94324
  }, true ? __vite__mapDeps([10,11,9,12,13,14]) : void 0, import.meta.url);
94286
94325
  return { id: id18, diagram: diagram2 };
@@ -94297,7 +94336,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
94297
94336
  }, "detector");
94298
94337
  var loader19 = /* @__PURE__ */ __name(async () => {
94299
94338
  const { diagram: diagram2 } = await __vitePreload(async () => {
94300
- const { diagram: diagram22 } = await import("./timeline-definition-GMOUNBTQ-DnnX0Ml0.js");
94339
+ const { diagram: diagram22 } = await import("./timeline-definition-GMOUNBTQ-AvZAT5J-.js");
94301
94340
  return { diagram: diagram22 };
94302
94341
  }, true ? __vite__mapDeps([39,26]) : void 0, import.meta.url);
94303
94342
  return { id: id19, diagram: diagram2 };
@@ -94314,7 +94353,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
94314
94353
  }, "detector");
94315
94354
  var loader20 = /* @__PURE__ */ __name(async () => {
94316
94355
  const { diagram: diagram2 } = await __vitePreload(async () => {
94317
- const { diagram: diagram22 } = await import("./mindmap-definition-QFDTVHPH-D2MxZmzw.js");
94356
+ const { diagram: diagram22 } = await import("./mindmap-definition-QFDTVHPH-C3U3xkIJ.js");
94318
94357
  return { diagram: diagram22 };
94319
94358
  }, true ? __vite__mapDeps([40,12,13]) : void 0, import.meta.url);
94320
94359
  return { id: id20, diagram: diagram2 };
@@ -94331,7 +94370,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
94331
94370
  }, "detector");
94332
94371
  var loader21 = /* @__PURE__ */ __name(async () => {
94333
94372
  const { diagram: diagram2 } = await __vitePreload(async () => {
94334
- const { diagram: diagram22 } = await import("./kanban-definition-6JOO6SKY-DJwjRjlE.js");
94373
+ const { diagram: diagram22 } = await import("./kanban-definition-6JOO6SKY-CZ1CZVyP.js");
94335
94374
  return { diagram: diagram22 };
94336
94375
  }, true ? __vite__mapDeps([41,11]) : void 0, import.meta.url);
94337
94376
  return { id: id21, diagram: diagram2 };
@@ -94348,7 +94387,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
94348
94387
  }, "detector");
94349
94388
  var loader22 = /* @__PURE__ */ __name(async () => {
94350
94389
  const { diagram: diagram2 } = await __vitePreload(async () => {
94351
- const { diagram: diagram22 } = await import("./sankeyDiagram-XADWPNL6-B2tuS_nG.js");
94390
+ const { diagram: diagram22 } = await import("./sankeyDiagram-XADWPNL6-SthTR8cL.js");
94352
94391
  return { diagram: diagram22 };
94353
94392
  }, true ? __vite__mapDeps([42,27,22]) : void 0, import.meta.url);
94354
94393
  return { id: id22, diagram: diagram2 };
@@ -94365,7 +94404,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
94365
94404
  }, "detector");
94366
94405
  var loader23 = /* @__PURE__ */ __name(async () => {
94367
94406
  const { diagram: diagram2 } = await __vitePreload(async () => {
94368
- const { diagram: diagram22 } = await import("./diagram-TYMM5635-iO4Xohj9.js");
94407
+ const { diagram: diagram22 } = await import("./diagram-TYMM5635-aF8hIDx1.js");
94369
94408
  return { diagram: diagram22 };
94370
94409
  }, true ? __vite__mapDeps([43,17,19,4,2]) : void 0, import.meta.url);
94371
94410
  return { id: id23, diagram: diagram2 };
@@ -94381,7 +94420,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
94381
94420
  }, "detector");
94382
94421
  var loader24 = /* @__PURE__ */ __name(async () => {
94383
94422
  const { diagram: diagram2 } = await __vitePreload(async () => {
94384
- const { diagram: diagram22 } = await import("./diagram-MMDJMWI5-X5oh5RON.js");
94423
+ const { diagram: diagram22 } = await import("./diagram-MMDJMWI5-Di6wZV6-.js");
94385
94424
  return { diagram: diagram22 };
94386
94425
  }, true ? __vite__mapDeps([44,17,19,4,2]) : void 0, import.meta.url);
94387
94426
  return { id: id24, diagram: diagram2 };
@@ -94397,7 +94436,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
94397
94436
  }, "detector");
94398
94437
  var loader25 = /* @__PURE__ */ __name(async () => {
94399
94438
  const { diagram: diagram2 } = await __vitePreload(async () => {
94400
- const { diagram: diagram22 } = await import("./blockDiagram-DXYQGD6D-B_jYpKkP.js");
94439
+ const { diagram: diagram22 } = await import("./blockDiagram-DXYQGD6D-6liCvTXv.js");
94401
94440
  return { diagram: diagram22 };
94402
94441
  }, true ? __vite__mapDeps([45,11,5,1,2,14]) : void 0, import.meta.url);
94403
94442
  return { id: id25, diagram: diagram2 };
@@ -94414,7 +94453,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
94414
94453
  }, "detector");
94415
94454
  var loader26 = /* @__PURE__ */ __name(async () => {
94416
94455
  const { diagram: diagram2 } = await __vitePreload(async () => {
94417
- const { diagram: diagram22 } = await import("./diagram-5BDNPKRD-DWjP3Jzr.js");
94456
+ const { diagram: diagram22 } = await import("./diagram-5BDNPKRD-C1mEpAlt.js");
94418
94457
  return { diagram: diagram22 };
94419
94458
  }, true ? __vite__mapDeps([46,17,18,19,4,2]) : void 0, import.meta.url);
94420
94459
  return { id: id26, diagram: diagram2 };
@@ -94431,7 +94470,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
94431
94470
  }, "detector");
94432
94471
  var loader27 = /* @__PURE__ */ __name(async () => {
94433
94472
  const { diagram: diagram2 } = await __vitePreload(async () => {
94434
- const { diagram: diagram22 } = await import("./architectureDiagram-Q4EWVU46-DlFz_4yO.js");
94473
+ const { diagram: diagram22 } = await import("./architectureDiagram-Q4EWVU46-C31yFVWH.js");
94435
94474
  return { diagram: diagram22 };
94436
94475
  }, true ? __vite__mapDeps([47,17,19,4,2,7]) : void 0, import.meta.url);
94437
94476
  return { id: id27, diagram: diagram2 };
@@ -94448,7 +94487,7 @@ var detector28 = /* @__PURE__ */ __name((txt) => {
94448
94487
  }, "detector");
94449
94488
  var loader28 = /* @__PURE__ */ __name(async () => {
94450
94489
  const { diagram: diagram2 } = await __vitePreload(async () => {
94451
- const { diagram: diagram22 } = await import("./ishikawaDiagram-UXIWVN3A-fJSipMV8.js");
94490
+ const { diagram: diagram22 } = await import("./ishikawaDiagram-UXIWVN3A-uXL-4FGw.js");
94452
94491
  return { diagram: diagram22 };
94453
94492
  }, true ? [] : void 0, import.meta.url);
94454
94493
  return { id: id28, diagram: diagram2 };
@@ -94464,7 +94503,7 @@ var detector29 = /* @__PURE__ */ __name((txt) => {
94464
94503
  }, "detector");
94465
94504
  var loader29 = /* @__PURE__ */ __name(async () => {
94466
94505
  const { diagram: diagram2 } = await __vitePreload(async () => {
94467
- const { diagram: diagram22 } = await import("./vennDiagram-DHZGUBPP-BCIC8HTk.js");
94506
+ const { diagram: diagram22 } = await import("./vennDiagram-DHZGUBPP-oSTndBDY.js");
94468
94507
  return { diagram: diagram22 };
94469
94508
  }, true ? [] : void 0, import.meta.url);
94470
94509
  return { id: id29, diagram: diagram2 };
@@ -94481,7 +94520,7 @@ var detector30 = /* @__PURE__ */ __name((txt) => {
94481
94520
  }, "detector");
94482
94521
  var loader30 = /* @__PURE__ */ __name(async () => {
94483
94522
  const { diagram: diagram2 } = await __vitePreload(async () => {
94484
- const { diagram: diagram22 } = await import("./diagram-G4DWMVQ6-CM3uASto.js");
94523
+ const { diagram: diagram22 } = await import("./diagram-G4DWMVQ6-C_g_DZm9.js");
94485
94524
  return { diagram: diagram22 };
94486
94525
  }, true ? __vite__mapDeps([48,13,17,19,4,2,23,27,22]) : void 0, import.meta.url);
94487
94526
  return { id: id30, diagram: diagram2 };
@@ -94497,7 +94536,7 @@ var detector31 = /* @__PURE__ */ __name((text2) => {
94497
94536
  }, "detector");
94498
94537
  var loader31 = /* @__PURE__ */ __name(async () => {
94499
94538
  const { diagram: diagram2 } = await __vitePreload(async () => {
94500
- const { diagram: diagram22 } = await import("./wardleyDiagram-NUSXRM2D-D3rjXear.js");
94539
+ const { diagram: diagram22 } = await import("./wardleyDiagram-NUSXRM2D-Dv2kSOMM.js");
94501
94540
  return { diagram: diagram22 };
94502
94541
  }, true ? __vite__mapDeps([49,17,19,4,2]) : void 0, import.meta.url);
94503
94542
  return { id: id31, diagram: diagram2 };
@@ -101355,7 +101394,7 @@ var displayWrap = function displayWrap2(node2, settings2) {
101355
101394
  }
101356
101395
  return node2;
101357
101396
  };
101358
- var buildTree = function buildTree2(tree, expression, settings2) {
101397
+ var buildTree$1 = function buildTree(tree, expression, settings2) {
101359
101398
  var options = optionsFromSettings(settings2);
101360
101399
  var katexNode;
101361
101400
  if (settings2.output === "mathml") {
@@ -109983,7 +110022,7 @@ var renderToDomTree = function renderToDomTree2(expression, options) {
109983
110022
  var settings2 = new Settings(options);
109984
110023
  try {
109985
110024
  var tree = parseTree(expression, settings2);
109986
- return buildTree(tree, expression, settings2);
110025
+ return buildTree$1(tree, expression, settings2);
109987
110026
  } catch (error) {
109988
110027
  return renderError(error, expression, settings2);
109989
110028
  }
@@ -137981,8 +138020,8 @@ function Chat({ session: session2 }) {
137981
138020
  /* @__PURE__ */ jsxRuntimeExports.jsx(AskUserDialog, { sessionId: session2.id })
137982
138021
  ] });
137983
138022
  }
137984
- const IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "gif", "webp", "avif", "bmp", "svg", "ico"];
137985
- const FILE_EXT_MAP = {
138023
+ const IMAGE_EXTENSIONS$1 = ["png", "jpg", "jpeg", "gif", "webp", "avif", "bmp", "svg", "ico"];
138024
+ const FILE_EXT_MAP$1 = {
137986
138025
  pdf: "pdf",
137987
138026
  docx: "docx",
137988
138027
  pptx: "pptx",
@@ -137991,11 +138030,11 @@ const FILE_EXT_MAP = {
137991
138030
  html: "html",
137992
138031
  htm: "html"
137993
138032
  };
137994
- function getFileKind(filename) {
138033
+ function getFileKind$1(filename) {
137995
138034
  if (!filename) return null;
137996
138035
  const ext = filename.split(".").pop()?.toLowerCase() || "";
137997
- if (IMAGE_EXTENSIONS.includes(ext)) return "image";
137998
- if (ext in FILE_EXT_MAP) return FILE_EXT_MAP[ext];
138036
+ if (IMAGE_EXTENSIONS$1.includes(ext)) return "image";
138037
+ if (ext in FILE_EXT_MAP$1) return FILE_EXT_MAP$1[ext];
137999
138038
  if (ext === "md") return "markdown";
138000
138039
  return "text";
138001
138040
  }
@@ -138314,7 +138353,7 @@ function SearchBar({
138314
138353
  )
138315
138354
  ] });
138316
138355
  }
138317
- function CodeDetail({ projectId, file }) {
138356
+ function CodeDetail$1({ projectId, file }) {
138318
138357
  const { t: t2 } = useTranslation();
138319
138358
  const { content: content2, gitContent, loading, errorMsg } = useFile(projectId, file, { gitHead: true });
138320
138359
  const [viewMode, setViewMode] = reactExports.useState("code");
@@ -138435,7 +138474,7 @@ function CodeDetail({ projectId, file }) {
138435
138474
  /* @__PURE__ */ jsxRuntimeExports.jsx(FileViewTabs, { viewMode, viewModes, onViewModeChange: setViewMode })
138436
138475
  ] });
138437
138476
  }
138438
- function MarkdownDetail({ projectId, file }) {
138477
+ function MarkdownDetail$1({ projectId, file }) {
138439
138478
  const { t: t2 } = useTranslation();
138440
138479
  const { content: content2, gitContent, loading, errorMsg } = useFile(projectId, file, { gitHead: true });
138441
138480
  const [viewMode, setViewMode] = reactExports.useState("preview");
@@ -140631,7 +140670,7 @@ function Controls() {
140631
140670
  )
140632
140671
  ] });
140633
140672
  }
140634
- function ImageDetail({ projectId, file }) {
140673
+ function ImageDetail$1({ projectId, file }) {
140635
140674
  const { content: content2, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
140636
140675
  if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
140637
140676
  if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
@@ -171686,7 +171725,7 @@ function PdfView({ data }) {
171686
171725
  ) }) })
171687
171726
  ] });
171688
171727
  }
171689
- function PdfDetail({ projectId, file }) {
171728
+ function PdfDetail$1({ projectId, file }) {
171690
171729
  const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
171691
171730
  if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
171692
171731
  if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
@@ -178022,7 +178061,7 @@ function DocxView({ data }) {
178022
178061
  )
178023
178062
  ] });
178024
178063
  }
178025
- function DocxDetail({ projectId, file }) {
178064
+ function DocxDetail$1({ projectId, file }) {
178026
178065
  const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
178027
178066
  if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
178028
178067
  if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
@@ -182134,7 +182173,7 @@ function PptxView({ data }) {
182134
182173
  )
182135
182174
  ] });
182136
182175
  }
182137
- function PptxDetail({ projectId, file }) {
182176
+ function PptxDetail$1({ projectId, file }) {
182138
182177
  const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
182139
182178
  if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
182140
182179
  if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
@@ -208901,13 +208940,13 @@ function XlsxView({ data }) {
208901
208940
  /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "flex-1 w-full min-h-0 overflow-hidden", children: loading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-muted-foreground text-center mt-10", children: t2("fileDetail.loading") }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: containerRef, className: "xlsx-preview p-2" }) })
208902
208941
  ] });
208903
208942
  }
208904
- function XlsxDetail({ projectId, file }) {
208943
+ function XlsxDetail$1({ projectId, file }) {
208905
208944
  const { arrayBuffer, loading, errorMsg } = useFile(projectId, file, { encoding: "base64" });
208906
208945
  if (loading) return /* @__PURE__ */ jsxRuntimeExports.jsx(LoadingState, {});
208907
208946
  if (errorMsg) return /* @__PURE__ */ jsxRuntimeExports.jsx(ErrorState, { message: errorMsg });
208908
208947
  return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(XlsxView, { data: arrayBuffer, filename: file }) });
208909
208948
  }
208910
- function HtmlDetail({ projectId, file }) {
208949
+ function HtmlDetail$1({ projectId, file }) {
208911
208950
  const { t: t2 } = useTranslation();
208912
208951
  const iframeRef = reactExports.useRef(null);
208913
208952
  const [hasError, setHasError] = reactExports.useState(false);
@@ -209156,9 +209195,9 @@ function FallbackDetail({ projectId, file }) {
209156
209195
  )
209157
209196
  ] });
209158
209197
  }
209159
- function FileDetail({ projectId, file, onClose }) {
209198
+ function FileDetail$1({ projectId, file, onClose }) {
209160
209199
  const { t: t2 } = useTranslation();
209161
- const fileKind = getFileKind(file);
209200
+ const fileKind = getFileKind$1(file);
209162
209201
  const [fileModified, setFileModified] = reactExports.useState(false);
209163
209202
  const [refreshKey, setRefreshKey] = reactExports.useState(0);
209164
209203
  reactExports.useEffect(() => {
@@ -209223,7 +209262,7 @@ function FileDetail({ projectId, file, onClose }) {
209223
209262
  ]
209224
209263
  }
209225
209264
  ),
209226
- projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative flex-1 min-h-0 overflow-hidden", children: fileKind === "text" ? /* @__PURE__ */ jsxRuntimeExports.jsx(CodeDetail, { projectId, file }, refreshKey) : fileKind === "markdown" ? /* @__PURE__ */ jsxRuntimeExports.jsx(MarkdownDetail, { projectId, file }, refreshKey) : fileKind === "image" ? /* @__PURE__ */ jsxRuntimeExports.jsx(ImageDetail, { projectId, file }, refreshKey) : fileKind === "pdf" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PdfDetail, { projectId, file }, refreshKey) : fileKind === "docx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(DocxDetail, { projectId, file }, refreshKey) : fileKind === "pptx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PptxDetail, { projectId, file }, refreshKey) : fileKind === "xlsx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(XlsxDetail, { projectId, file }, refreshKey) : fileKind === "html" ? /* @__PURE__ */ jsxRuntimeExports.jsx(HtmlDetail, { projectId, file }, refreshKey) : /* @__PURE__ */ jsxRuntimeExports.jsx(FallbackDetail, { projectId, file }) })
209265
+ projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative flex-1 min-h-0 overflow-hidden", children: fileKind === "text" ? /* @__PURE__ */ jsxRuntimeExports.jsx(CodeDetail$1, { projectId, file }, refreshKey) : fileKind === "markdown" ? /* @__PURE__ */ jsxRuntimeExports.jsx(MarkdownDetail$1, { projectId, file }, refreshKey) : fileKind === "image" ? /* @__PURE__ */ jsxRuntimeExports.jsx(ImageDetail$1, { projectId, file }, refreshKey) : fileKind === "pdf" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PdfDetail$1, { projectId, file }, refreshKey) : fileKind === "docx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(DocxDetail$1, { projectId, file }, refreshKey) : fileKind === "pptx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PptxDetail$1, { projectId, file }, refreshKey) : fileKind === "xlsx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(XlsxDetail$1, { projectId, file }, refreshKey) : fileKind === "html" ? /* @__PURE__ */ jsxRuntimeExports.jsx(HtmlDetail$1, { projectId, file }, refreshKey) : /* @__PURE__ */ jsxRuntimeExports.jsx(FallbackDetail, { projectId, file }) })
209227
209266
  ] });
209228
209267
  }
209229
209268
  var zs = Object.defineProperty;
@@ -217915,7 +217954,7 @@ function Detail({ detailType, projectId, file, terminalId, onClose }) {
217915
217954
  const { t: t2 } = useTranslation();
217916
217955
  if (!detailType) return null;
217917
217956
  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col h-full min-h-0 overflow-hidden bg-background", children: [
217918
- detailType === "file" && projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx(FileDetail, { projectId, file, onClose }),
217957
+ detailType === "file" && projectId && file && /* @__PURE__ */ jsxRuntimeExports.jsx(FileDetail$1, { projectId, file, onClose }),
217919
217958
  detailType === "terminal" && projectId && terminalId && /* @__PURE__ */ jsxRuntimeExports.jsx(TerminalDetail, { terminalId, projectId, onClose }),
217920
217959
  (!detailType || detailType === "file" && (!projectId || !file) || detailType === "terminal" && (!projectId || !terminalId)) && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex h-full items-center justify-center text-xs text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: t2("detail.noContent", "No content") }) })
217921
217960
  ] });
@@ -219305,7 +219344,7 @@ function TerminalPanel({
219305
219344
  )) }) })
219306
219345
  ] });
219307
219346
  }
219308
- function Panel({
219347
+ function Panel$1({
219309
219348
  tab: tab2,
219310
219349
  onTabChange,
219311
219350
  projectId,
@@ -221589,7 +221628,7 @@ function Session({ session: session2 }) {
221589
221628
  minSize: 250,
221590
221629
  maxSize: 400,
221591
221630
  children: /* @__PURE__ */ jsxRuntimeExports.jsx(
221592
- Panel,
221631
+ Panel$1,
221593
221632
  {
221594
221633
  tab: panelTab,
221595
221634
  onTabChange: (tab2) => setPanelTab(tab2),
@@ -233317,7 +233356,8 @@ const schema$3 = object({
233317
233356
  baseUrl: string().trim().min(1, "settings.agents.validation.enterBaseUrl"),
233318
233357
  apiKey: string().trim().min(1, "settings.agents.validation.enterApiKey"),
233319
233358
  headersRaw: string().refine(isValidStringMap$2, "settings.agents.validation.jsonObject"),
233320
- contextWindowTokens: string().refine(isValidContextWindow, "settings.agents.validation.positiveInteger")
233359
+ contextWindowTokens: string().refine(isValidContextWindow, "settings.agents.validation.positiveInteger"),
233360
+ modelIdTemplate: string()
233321
233361
  });
233322
233362
  function SettingsAgentApiDialog({
233323
233363
  open: open2,
@@ -233335,7 +233375,8 @@ function SettingsAgentApiDialog({
233335
233375
  baseUrl: "",
233336
233376
  apiKey: "",
233337
233377
  headersRaw: "",
233338
- contextWindowTokens: ""
233378
+ contextWindowTokens: "",
233379
+ modelIdTemplate: ""
233339
233380
  }
233340
233381
  });
233341
233382
  reactExports.useEffect(() => {
@@ -233346,7 +233387,8 @@ function SettingsAgentApiDialog({
233346
233387
  baseUrl: initialAgent?.baseUrl ?? "",
233347
233388
  apiKey: initialAgent?.apiKey ?? "",
233348
233389
  headersRaw: initialAgent && Object.keys(initialAgent.headers || {}).length > 0 ? JSON.stringify(initialAgent.headers) : "",
233349
- contextWindowTokens: initialAgent?.contextWindowTokens?.toString() ?? ""
233390
+ contextWindowTokens: initialAgent?.contextWindowTokens?.toString() ?? "",
233391
+ modelIdTemplate: initialAgent?.modelIdTemplate ?? ""
233350
233392
  });
233351
233393
  }, [initialAgent, open2, form]);
233352
233394
  const onSubmit = async (data) => {
@@ -233358,7 +233400,8 @@ function SettingsAgentApiDialog({
233358
233400
  baseUrl: data.baseUrl.trim(),
233359
233401
  apiKey: data.apiKey.trim(),
233360
233402
  headers: parseStringMap$2(data.headersRaw),
233361
- contextWindowTokens: data.contextWindowTokens.trim() ? Number(data.contextWindowTokens) : void 0
233403
+ contextWindowTokens: data.contextWindowTokens.trim() ? Number(data.contextWindowTokens) : void 0,
233404
+ modelIdTemplate: data.modelIdTemplate.trim() || void 0
233362
233405
  });
233363
233406
  };
233364
233407
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "sm:max-w-lg", children: [
@@ -233370,75 +233413,77 @@ function SettingsAgentApiDialog({
233370
233413
  ) })
233371
233414
  ] }),
233372
233415
  /* @__PURE__ */ jsxRuntimeExports.jsx("form", { id: "form-api-agent", onSubmit: form.handleSubmit(onSubmit), children: /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { className: "py-2", children: [
233373
- /* @__PURE__ */ jsxRuntimeExports.jsx(
233374
- Controller,
233375
- {
233376
- name: "id",
233377
- control: form.control,
233378
- render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
233379
- /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "api-id", className: "text-[11px] text-muted-foreground", children: t2("settings.agents.agentId") }),
233380
- /* @__PURE__ */ jsxRuntimeExports.jsx(
233381
- Input,
233382
- {
233383
- ...field,
233384
- id: "api-id",
233385
- placeholder: t2("settings.agents.agentId"),
233386
- "aria-invalid": fieldState.invalid,
233387
- disabled: !!initialAgent?.id,
233388
- className: "h-8 text-xs! text-foreground/70 focus-visible:ring-0.5"
233389
- }
233390
- ),
233391
- fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
233392
- FieldError,
233393
- {
233394
- errors: [
233395
- {
233396
- message: t2(
233397
- fieldState.error?.message ?? "",
233398
- fieldState.error?.message ?? ""
233399
- )
233400
- }
233401
- ]
233402
- }
233403
- )
233404
- ] })
233405
- }
233406
- ),
233407
- /* @__PURE__ */ jsxRuntimeExports.jsx(
233408
- Controller,
233409
- {
233410
- name: "provider",
233411
- control: form.control,
233412
- render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
233413
- /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "api-provider", className: "text-[11px] text-muted-foreground", children: t2("settings.agents.apiProvider", "Provider") }),
233414
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { name: field.name, value: field.value, onValueChange: field.onChange, children: [
233416
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
233417
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
233418
+ Controller,
233419
+ {
233420
+ name: "id",
233421
+ control: form.control,
233422
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
233423
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "api-id", className: "text-[11px] text-muted-foreground", children: t2("settings.agents.agentId") }),
233415
233424
  /* @__PURE__ */ jsxRuntimeExports.jsx(
233416
- SelectTrigger,
233425
+ Input,
233417
233426
  {
233418
- id: "api-provider",
233427
+ ...field,
233428
+ id: "api-id",
233429
+ placeholder: t2("settings.agents.agentId"),
233419
233430
  "aria-invalid": fieldState.invalid,
233420
- className: "w-full text-[11px]! font-mono",
233421
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {})
233431
+ disabled: !!initialAgent?.id,
233432
+ className: "h-8 text-xs! text-foreground/70 focus-visible:ring-0.5"
233422
233433
  }
233423
233434
  ),
233424
- /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "openai-compatible", children: "openai-compatible" }) })
233425
- ] }),
233426
- fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
233427
- FieldError,
233428
- {
233429
- errors: [
233435
+ fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
233436
+ FieldError,
233437
+ {
233438
+ errors: [
233439
+ {
233440
+ message: t2(
233441
+ fieldState.error?.message ?? "",
233442
+ fieldState.error?.message ?? ""
233443
+ )
233444
+ }
233445
+ ]
233446
+ }
233447
+ )
233448
+ ] })
233449
+ }
233450
+ ),
233451
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
233452
+ Controller,
233453
+ {
233454
+ name: "provider",
233455
+ control: form.control,
233456
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
233457
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "api-provider", className: "text-[11px] text-muted-foreground", children: t2("settings.agents.apiProvider", "Provider") }),
233458
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { name: field.name, value: field.value, onValueChange: field.onChange, children: [
233459
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
233460
+ SelectTrigger,
233430
233461
  {
233431
- message: t2(
233432
- fieldState.error?.message ?? "",
233433
- fieldState.error?.message ?? ""
233434
- )
233462
+ id: "api-provider",
233463
+ "aria-invalid": fieldState.invalid,
233464
+ className: "w-full text-[11px]! font-mono",
233465
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {})
233435
233466
  }
233436
- ]
233437
- }
233438
- )
233439
- ] })
233440
- }
233441
- ),
233467
+ ),
233468
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "openai-compatible", children: "openai-compatible" }) })
233469
+ ] }),
233470
+ fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
233471
+ FieldError,
233472
+ {
233473
+ errors: [
233474
+ {
233475
+ message: t2(
233476
+ fieldState.error?.message ?? "",
233477
+ fieldState.error?.message ?? ""
233478
+ )
233479
+ }
233480
+ ]
233481
+ }
233482
+ )
233483
+ ] })
233484
+ }
233485
+ )
233486
+ ] }),
233442
233487
  /* @__PURE__ */ jsxRuntimeExports.jsx(
233443
233488
  Controller,
233444
233489
  {
@@ -233519,7 +233564,7 @@ function SettingsAgentApiDialog({
233519
233564
  id: "api-headers",
233520
233565
  placeholder: '{ "name": "value" }',
233521
233566
  "aria-invalid": fieldState.invalid,
233522
- className: "text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
233567
+ className: "text-[11px]! min-h-14 font-mono text-foreground/70 focus-visible:ring-0.5"
233523
233568
  }
233524
233569
  ),
233525
233570
  fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -233596,6 +233641,39 @@ function SettingsAgentApiDialog({
233596
233641
  )
233597
233642
  ] })
233598
233643
  }
233644
+ ),
233645
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
233646
+ Controller,
233647
+ {
233648
+ name: "modelIdTemplate",
233649
+ control: form.control,
233650
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { "data-invalid": fieldState.invalid, children: [
233651
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "api-model-template", className: "text-[11px] text-muted-foreground", children: t2("settings.agents.modelIdTemplate", "Model Id Template") }),
233652
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
233653
+ Input,
233654
+ {
233655
+ ...field,
233656
+ id: "api-model-template",
233657
+ placeholder: "{id}",
233658
+ "aria-invalid": fieldState.invalid,
233659
+ className: "h-8 text-[11px]! font-mono text-foreground/70 focus-visible:ring-0.5"
233660
+ }
233661
+ ),
233662
+ fieldState.invalid && /* @__PURE__ */ jsxRuntimeExports.jsx(
233663
+ FieldError,
233664
+ {
233665
+ errors: [
233666
+ {
233667
+ message: t2(
233668
+ fieldState.error?.message ?? "",
233669
+ fieldState.error?.message ?? ""
233670
+ )
233671
+ }
233672
+ ]
233673
+ }
233674
+ )
233675
+ ] })
233676
+ }
233599
233677
  )
233600
233678
  ] }) }),
233601
233679
  /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
@@ -235271,7 +235349,7 @@ function SkillsLayout() {
235271
235349
  /* @__PURE__ */ jsxRuntimeExports.jsx(
235272
235350
  "div",
235273
235351
  {
235274
- className: "h-12 shrink-0 border-b border-border flex items-center px-6",
235352
+ className: "h-12 shrink-0 border-b border-border flex items-center px-4",
235275
235353
  style: { WebkitAppRegion: "drag" },
235276
235354
  children: /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: t2("skills.title") })
235277
235355
  }
@@ -235683,6 +235761,1188 @@ function SkillsSh() {
235683
235761
  }) }) : !isLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col items-center justify-center py-20 text-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: t2("skills.skillsSh.noResults") }) }) : null }) })
235684
235762
  ] });
235685
235763
  }
235764
+ const HOURS = Array.from({ length: 24 }, (_2, i3) => i3);
235765
+ const MINUTES = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];
235766
+ const INTERVALS = [1, 2, 3, 4, 6, 8, 12];
235767
+ const DAYS_OF_WEEK_VALUES = ["1", "2", "3", "4", "5", "6", "0"];
235768
+ function detectPreset(expr) {
235769
+ const parts = expr.trim().split(/\s+/);
235770
+ if (parts.length !== 5) return "custom";
235771
+ const [min2, hr2, dom, mon, dow] = parts;
235772
+ if (hr2.startsWith("*/") && dom === "*" && mon === "*" && dow === "*") {
235773
+ const n2 = parseInt(hr2.slice(2));
235774
+ if (!isNaN(n2) && INTERVALS.includes(n2)) return "hourly";
235775
+ }
235776
+ const h3 = parseInt(hr2), m2 = parseInt(min2);
235777
+ if (isNaN(h3) || isNaN(m2)) return "custom";
235778
+ if (dom === "*" && mon === "*" && dow === "*") return "daily";
235779
+ if (dom === "*" && mon === "*" && dow === "1-5") return "weekdays";
235780
+ if (dom === "*" && mon === "*" && /^\d$/.test(dow)) return "weekly";
235781
+ return "custom";
235782
+ }
235783
+ function parseParts(expr) {
235784
+ const parts = expr.trim().split(/\s+/);
235785
+ if (parts.length !== 5) return { hour: 9, minute: 0, interval: 2, dow: "1" };
235786
+ const [min2, hr2] = parts;
235787
+ const dow = parts[4];
235788
+ if (hr2.startsWith("*/")) return { hour: 9, minute: parseInt(min2) || 0, interval: parseInt(hr2.slice(2)) || 2, dow: /^\d$/.test(dow) ? dow : "1" };
235789
+ return { hour: parseInt(hr2) || 9, minute: parseInt(min2) || 0, interval: 2, dow: /^\d$/.test(dow) ? dow : "1" };
235790
+ }
235791
+ function buildCron(preset, hour, minute, interval2, dow) {
235792
+ switch (preset) {
235793
+ case "daily":
235794
+ return `${minute} ${hour} * * *`;
235795
+ case "weekdays":
235796
+ return `${minute} ${hour} * * 1-5`;
235797
+ case "weekly":
235798
+ return `${minute} ${hour} * * ${dow}`;
235799
+ case "hourly":
235800
+ return `${minute} */${interval2} * * *`;
235801
+ default:
235802
+ return `${minute} ${hour} * * *`;
235803
+ }
235804
+ }
235805
+ function CronEditor({ value, onChange, timezone }) {
235806
+ const { t: t2 } = useTranslation();
235807
+ const [preset, setPreset] = reactExports.useState(() => detectPreset(value));
235808
+ const [parts, setParts] = reactExports.useState(() => parseParts(value));
235809
+ reactExports.useEffect(() => {
235810
+ const detected = detectPreset(value);
235811
+ if (detected !== "custom") {
235812
+ setPreset(detected);
235813
+ setParts(parseParts(value));
235814
+ }
235815
+ }, [value]);
235816
+ const handlePresetChange = (p3) => {
235817
+ setPreset(p3);
235818
+ if (p3 !== "custom") {
235819
+ onChange(buildCron(p3, parts.hour, parts.minute, parts.interval, parts.dow));
235820
+ }
235821
+ };
235822
+ const updateParts = (patch2) => {
235823
+ const next2 = { ...parts, ...patch2 };
235824
+ setParts(next2);
235825
+ if (preset !== "custom") {
235826
+ onChange(buildCron(preset, next2.hour, next2.minute, next2.interval, next2.dow));
235827
+ }
235828
+ };
235829
+ const presetItems = [
235830
+ { value: "daily", label: t2("automation.cron.daily", "Every day") },
235831
+ { value: "weekdays", label: t2("automation.cron.weekdays", "Weekdays") },
235832
+ { value: "weekly", label: t2("automation.cron.weekly", "Every week") },
235833
+ { value: "hourly", label: t2("automation.cron.hourly", "Every N hours") },
235834
+ { value: "custom", label: t2("automation.cron.custom", "Custom") }
235835
+ ];
235836
+ const intervalItems = INTERVALS.map((n2) => ({ value: String(n2), label: `${n2}h` }));
235837
+ const minuteItems = MINUTES.map((m2) => ({ value: String(m2), label: `${String(m2).padStart(2, "0")}` }));
235838
+ const hourItems = HOURS.map((h3) => ({ value: String(h3), label: String(h3).padStart(2, "0") }));
235839
+ const dowItems = DAYS_OF_WEEK_VALUES.map((v4) => ({
235840
+ value: v4,
235841
+ label: t2(`automation.cron.days.${v4}`, ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][parseInt(v4)])
235842
+ }));
235843
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2.5", children: [
235844
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
235845
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: presetItems, value: preset, onValueChange: (v4) => {
235846
+ if (v4) handlePresetChange(v4);
235847
+ }, children: [
235848
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-8 text-xs! w-32 shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
235849
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: presetItems.map((p3) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: p3.value, children: p3.label }, p3.value)) })
235850
+ ] }),
235851
+ preset === "custom" ? /* @__PURE__ */ jsxRuntimeExports.jsx(
235852
+ Input,
235853
+ {
235854
+ value,
235855
+ onChange: (e2) => onChange(e2.target.value),
235856
+ placeholder: "min hour day month weekday",
235857
+ className: "h-8 text-xs! font-mono text-foreground/70 focus-visible:ring-0.5 flex-1"
235858
+ }
235859
+ ) : preset === "hourly" ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
235860
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: intervalItems, value: String(parts.interval), onValueChange: (v4) => {
235861
+ if (v4) updateParts({ interval: parseInt(v4) });
235862
+ }, children: [
235863
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
235864
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: intervalItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
235865
+ ] }),
235866
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: t2("automation.cron.atMinute", "at min") }),
235867
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: minuteItems, value: String(parts.minute), onValueChange: (v4) => {
235868
+ if (v4) updateParts({ minute: parseInt(v4) });
235869
+ }, children: [
235870
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
235871
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: minuteItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
235872
+ ] })
235873
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
235874
+ preset === "weekly" && /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: dowItems, value: parts.dow, onValueChange: (v4) => {
235875
+ if (v4) updateParts({ dow: v4 });
235876
+ }, children: [
235877
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-18", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
235878
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: dowItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
235879
+ ] }),
235880
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: t2("automation.cron.at", "at") }),
235881
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: hourItems, value: String(parts.hour), onValueChange: (v4) => {
235882
+ if (v4) updateParts({ hour: parseInt(v4) });
235883
+ }, children: [
235884
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
235885
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: hourItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
235886
+ ] }),
235887
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: ":" }),
235888
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { items: minuteItems, value: String(parts.minute), onValueChange: (v4) => {
235889
+ if (v4) updateParts({ minute: parseInt(v4) });
235890
+ }, children: [
235891
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { className: "h-7 text-xs! w-15", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
235892
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: minuteItems.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: item.value, children: item.label }, item.value)) })
235893
+ ] })
235894
+ ] })
235895
+ ] }),
235896
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-[11px] text-muted-foreground", children: [
235897
+ value,
235898
+ " · ",
235899
+ t2("automation.cron.nextRun", "Next run"),
235900
+ ": ",
235901
+ formatNextCron(value),
235902
+ timezone && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-1 text-muted-foreground/50", children: [
235903
+ "(",
235904
+ timezone,
235905
+ ")"
235906
+ ] })
235907
+ ] })
235908
+ ] });
235909
+ }
235910
+ function formatNextCron(expr) {
235911
+ try {
235912
+ const next2 = getNextCronDate(expr);
235913
+ if (!next2) return "—";
235914
+ return next2.toLocaleString(void 0, { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" });
235915
+ } catch {
235916
+ return "—";
235917
+ }
235918
+ }
235919
+ function getNextCronDate(expr) {
235920
+ const parts = expr.trim().split(/\s+/);
235921
+ if (parts.length !== 5) return null;
235922
+ const [minF, hrF, , , dowF] = parts;
235923
+ const now2 = /* @__PURE__ */ new Date();
235924
+ for (let d2 = 0; d2 < 8; d2++) {
235925
+ const candidate = new Date(now2.getTime() + d2 * 864e5);
235926
+ const dow = candidate.getDay();
235927
+ if (dowF !== "*") {
235928
+ if (dowF === "1-5" && (dow === 0 || dow === 6)) continue;
235929
+ else if (/^\d$/.test(dowF) && dow !== parseInt(dowF)) continue;
235930
+ else if (dowF.includes(",") && !dowF.split(",").map(Number).includes(dow)) continue;
235931
+ }
235932
+ if (hrF.startsWith("*/")) {
235933
+ const interval2 = parseInt(hrF.slice(2)) || 1;
235934
+ const minute = parseInt(minF) || 0;
235935
+ for (let h3 = 0; h3 < 24; h3 += interval2) {
235936
+ candidate.setHours(h3, minute, 0, 0);
235937
+ if (candidate > now2) return candidate;
235938
+ }
235939
+ } else {
235940
+ const h3 = parseInt(hrF), m2 = parseInt(minF);
235941
+ if (isNaN(h3) || isNaN(m2)) return null;
235942
+ candidate.setHours(h3, m2, 0, 0);
235943
+ if (candidate > now2) return candidate;
235944
+ }
235945
+ }
235946
+ return null;
235947
+ }
235948
+ function SettingDialog({ schedule: schedule2, open: open2, onOpenChange, onSuccess }) {
235949
+ const isEdit = !!schedule2;
235950
+ const { t: t2 } = useTranslation();
235951
+ const { toast: toast2 } = useMessage();
235952
+ const configuredAgents = useAppStore((s16) => s16.configuredAgents);
235953
+ const configuredMcpServers = useAppStore((s16) => s16.configuredMcpServers);
235954
+ const enabledAgents = reactExports.useMemo(() => configuredAgents.filter((a2) => !a2.disabled), [configuredAgents]);
235955
+ const enabledMcpServers = reactExports.useMemo(() => configuredMcpServers.filter((s16) => !s16.disabled), [configuredMcpServers]);
235956
+ const [timezone, setTimezone] = reactExports.useState("");
235957
+ reactExports.useEffect(() => {
235958
+ request.getServerTimezone().then(setTimezone).catch(() => {
235959
+ });
235960
+ }, []);
235961
+ const [name2, setName] = reactExports.useState(isEdit ? schedule2.name : "");
235962
+ const [agentId, setAgentId] = reactExports.useState(isEdit ? schedule2.agentId : enabledAgents[0]?.id ?? "");
235963
+ const [prompt, setPrompt] = reactExports.useState(isEdit ? schedule2.prompt : "");
235964
+ const [cronType, setCronType] = reactExports.useState(isEdit ? schedule2.cron.type : "cron");
235965
+ const [cronExpr, setCronExpr] = reactExports.useState(isEdit ? schedule2.cron.expr ?? "0 9 * * 1-5" : "0 9 * * 1-5");
235966
+ const [features, setFeatures] = reactExports.useState(isEdit ? schedule2.features ?? ["skills"] : ["skills"]);
235967
+ const [mcpServerIds, setMcpServerIds] = reactExports.useState(isEdit ? schedule2.mcpServers ?? [] : enabledMcpServers.map((s16) => s16.id));
235968
+ const [saving, setSaving] = reactExports.useState(false);
235969
+ reactExports.useEffect(() => {
235970
+ if (!open2) return;
235971
+ if (schedule2) {
235972
+ setName(schedule2.name);
235973
+ setAgentId(schedule2.agentId);
235974
+ setPrompt(schedule2.prompt);
235975
+ setCronType(schedule2.cron.type);
235976
+ setCronExpr(schedule2.cron.expr ?? "0 9 * * 1-5");
235977
+ setFeatures(schedule2.features ?? ["skills"]);
235978
+ setMcpServerIds(schedule2.mcpServers ?? []);
235979
+ } else {
235980
+ setName("");
235981
+ setAgentId(enabledAgents[0]?.id ?? "");
235982
+ setPrompt("");
235983
+ setCronType("cron");
235984
+ setCronExpr("0 9 * * 1-5");
235985
+ setFeatures(["skills"]);
235986
+ setMcpServerIds(enabledMcpServers.map((s16) => s16.id));
235987
+ }
235988
+ }, [schedule2, open2]);
235989
+ const handleSave = async () => {
235990
+ if (!name2.trim()) return void toast2.error(t2("automation.validation.nameRequired", "Name is required"));
235991
+ if (!agentId) return void toast2.error(t2("automation.validation.agentRequired", "Agent is required"));
235992
+ if (!prompt.trim()) return void toast2.error(t2("automation.validation.promptRequired", "Prompt is required"));
235993
+ setSaving(true);
235994
+ try {
235995
+ if (isEdit) {
235996
+ await request.updateSchedule({
235997
+ scheduleId: schedule2.id,
235998
+ updates: {
235999
+ name: name2.trim(),
236000
+ agentId,
236001
+ prompt: prompt.trim(),
236002
+ cron: { type: cronType, expr: cronType === "cron" ? cronExpr.trim() : void 0 },
236003
+ features,
236004
+ mcpServers: mcpServerIds
236005
+ }
236006
+ });
236007
+ } else {
236008
+ await request.createSchedule({
236009
+ name: name2.trim(),
236010
+ agentId,
236011
+ prompt: prompt.trim(),
236012
+ cron: { type: cronType, expr: cronType === "cron" ? cronExpr.trim() : void 0 },
236013
+ features,
236014
+ mcpServers: mcpServerIds
236015
+ });
236016
+ }
236017
+ onSuccess();
236018
+ onOpenChange(false);
236019
+ } catch (err) {
236020
+ toast2.error(String(err));
236021
+ } finally {
236022
+ setSaving(false);
236023
+ }
236024
+ };
236025
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: open2, onOpenChange: (open22, eventDetails) => {
236026
+ if (!open22 && (eventDetails?.reason === "escape-key" || eventDetails?.reason === "outside-press")) return;
236027
+ onOpenChange(open22);
236028
+ }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "sm:max-w-3xl", children: [
236029
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [
236030
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: isEdit ? t2("automation.editSchedule", "Edit Schedule") : t2("automation.newSchedule", "New Schedule") }),
236031
+ /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: t2("automation.dialogDesc", "Configure the automated task schedule and prompt.") })
236032
+ ] }),
236033
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-5", children: [
236034
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { children: [
236035
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-[2fr_1fr] gap-3", children: [
236036
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
236037
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "auto-name", className: "text-[11px] text-muted-foreground", children: t2("automation.scheduleName", "Schedule Name") }),
236038
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
236039
+ Input,
236040
+ {
236041
+ id: "auto-name",
236042
+ placeholder: t2("automation.scheduleNamePlaceholder", "e.g. Morning Standup Summary"),
236043
+ value: name2,
236044
+ onChange: (e2) => setName(e2.target.value),
236045
+ className: "h-8 text-[11px]! text-foreground/70 focus-visible:ring-0.5"
236046
+ }
236047
+ )
236048
+ ] }),
236049
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
236050
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "auto-agent", className: "text-[11px] text-muted-foreground", children: t2("automation.agent", "Agent") }),
236051
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: agentId, onValueChange: (v4) => {
236052
+ if (v4) setAgentId(v4);
236053
+ }, children: [
236054
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "auto-agent", className: "w-full text-[11px]! text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, {}) }),
236055
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: enabledAgents.map((a2) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: a2.id, children: a2.id }, a2.id)) })
236056
+ ] })
236057
+ ] })
236058
+ ] }),
236059
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
236060
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { htmlFor: "auto-prompt", className: "text-[11px] text-muted-foreground", children: t2("automation.prompt", "Prompt") }),
236061
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
236062
+ Textarea,
236063
+ {
236064
+ id: "auto-prompt",
236065
+ placeholder: t2("automation.promptPlaceholder", "What should the agent do?"),
236066
+ value: prompt,
236067
+ onChange: (e2) => setPrompt(e2.target.value),
236068
+ className: "text-xs! min-h-46 flex-1 text-foreground/70 focus-visible:ring-0.5"
236069
+ }
236070
+ )
236071
+ ] })
236072
+ ] }),
236073
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(FieldGroup, { children: [
236074
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
236075
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: t2("automation.features", "Features") }),
236076
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1", children: [
236077
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded border bg-secondary/50 px-2 h-7", children: [
236078
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `text-xs truncate ${features.includes("skills") ? "text-muted-foreground" : "text-muted-foreground/50"}`, children: t2("constant.feature.skills", "Skills") }),
236079
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
236080
+ Switch,
236081
+ {
236082
+ size: "sm",
236083
+ checked: features.includes("skills"),
236084
+ onCheckedChange: (c2) => setFeatures(c2 ? ["skills"] : [])
236085
+ }
236086
+ )
236087
+ ] }),
236088
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded border bg-secondary/50 px-2 h-7", children: [
236089
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs truncate text-muted-foreground/50", children: [
236090
+ t2("constant.feature.askUser", "Ask User"),
236091
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-[10px] ml-1", children: [
236092
+ "(",
236093
+ t2("automation.alwaysDisabled", "always disabled"),
236094
+ ")"
236095
+ ] })
236096
+ ] }),
236097
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Switch, { size: "sm", checked: false, disabled: true })
236098
+ ] })
236099
+ ] })
236100
+ ] }),
236101
+ configuredMcpServers.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
236102
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: t2("automation.mcpServers", "MCP Servers") }),
236103
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: configuredMcpServers.length > 5 ? "grid grid-cols-2 gap-1" : "flex flex-col gap-1", children: configuredMcpServers.map((s16) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between rounded border bg-secondary/50 px-2 h-7", children: [
236104
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `text-xs truncate ${mcpServerIds.includes(s16.id) ? "text-muted-foreground" : "text-muted-foreground/50"}`, title: s16.id, children: s16.id }),
236105
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
236106
+ Switch,
236107
+ {
236108
+ size: "sm",
236109
+ checked: mcpServerIds.includes(s16.id),
236110
+ onCheckedChange: (c2) => {
236111
+ setMcpServerIds((prev2) => c2 ? [...prev2, s16.id] : prev2.filter((id32) => id32 !== s16.id));
236112
+ }
236113
+ }
236114
+ )
236115
+ ] }, s16.id)) })
236116
+ ] }),
236117
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Field, { children: [
236118
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FieldLabel, { className: "text-[11px] text-muted-foreground", children: t2("automation.schedule", "Schedule") }),
236119
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2", children: [
236120
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "flex items-center gap-2 text-[11px] text-foreground/70 cursor-pointer", children: [
236121
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Switch, { checked: cronType === "cron", onCheckedChange: (c2) => setCronType(c2 ? "cron" : "manual") }),
236122
+ t2("automation.timedExecution", "Timed (cron)")
236123
+ ] }),
236124
+ cronType === "cron" ? /* @__PURE__ */ jsxRuntimeExports.jsx(CronEditor, { value: cronExpr, onChange: setCronExpr, timezone }) : /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] text-muted-foreground", children: t2("automation.manualDesc", "Manual trigger only. No automatic scheduling.") })
236125
+ ] })
236126
+ ] })
236127
+ ] })
236128
+ ] }),
236129
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogFooter, { children: [
236130
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => onOpenChange(false), className: "h-7 text-xs", children: t2("automation.cancel", "Cancel") }),
236131
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { type: "button", size: "sm", disabled: saving, onClick: handleSave, className: "h-7 text-xs", children: [
236132
+ saving && /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3 animate-spin mr-1" }),
236133
+ isEdit ? t2("automation.save", "Save") : t2("automation.create", "Create")
236134
+ ] })
236135
+ ] })
236136
+ ] }) });
236137
+ }
236138
+ function Automation() {
236139
+ const { t: t2 } = useTranslation();
236140
+ const navigate = useNavigate();
236141
+ const { confirm: confirm2, toast: toast2 } = useMessage();
236142
+ const [schedules, setSchedules] = reactExports.useState([]);
236143
+ const [loading, setLoading] = reactExports.useState(true);
236144
+ const [newDialogOpen, setNewDialogOpen] = reactExports.useState(false);
236145
+ const [editSchedule, setEditSchedule] = reactExports.useState(null);
236146
+ const [timezone, setTimezone] = reactExports.useState("");
236147
+ reactExports.useEffect(() => {
236148
+ request.getServerTimezone().then(setTimezone).catch(() => {
236149
+ });
236150
+ }, []);
236151
+ const loadSchedules = reactExports.useCallback(async () => {
236152
+ try {
236153
+ const list2 = await request.listSchedules();
236154
+ setSchedules(list2 ?? []);
236155
+ } catch (err) {
236156
+ console.error("Failed to load schedules:", err);
236157
+ } finally {
236158
+ setLoading(false);
236159
+ }
236160
+ }, []);
236161
+ reactExports.useEffect(() => {
236162
+ void loadSchedules();
236163
+ }, [loadSchedules]);
236164
+ reactExports.useEffect(() => {
236165
+ const handleChanged = () => void loadSchedules();
236166
+ subscribe$1.on("schedules-changed", handleChanged);
236167
+ return () => subscribe$1.off("schedules-changed", handleChanged);
236168
+ }, [loadSchedules]);
236169
+ const handleTrigger = async (scheduleId) => {
236170
+ try {
236171
+ const task = await request.triggerSchedule({ scheduleId });
236172
+ navigate(`/automation/schedule/${scheduleId}/task/${task.id}`);
236173
+ } catch (err) {
236174
+ toast2.error(String(err));
236175
+ }
236176
+ };
236177
+ const handleDelete2 = async (schedule2) => {
236178
+ await confirm2({
236179
+ title: t2("automation.deleteTitle", "Delete Schedule"),
236180
+ content: t2("automation.deleteConfirm", 'Delete "{{name}}" permanently?', { name: schedule2.name }),
236181
+ buttons: [
236182
+ { text: t2("automation.cancel", "Cancel"), value: null, variant: "outline" },
236183
+ {
236184
+ text: t2("automation.delete", "Delete"),
236185
+ value: async () => {
236186
+ await request.deleteSchedule({ scheduleId: schedule2.id });
236187
+ await loadSchedules();
236188
+ return "deleted";
236189
+ },
236190
+ variant: "destructive"
236191
+ }
236192
+ ]
236193
+ });
236194
+ };
236195
+ const formatNextRun = (schedule2) => {
236196
+ if (!schedule2.nextRunAt) return "-";
236197
+ const diff = schedule2.nextRunAt - Date.now();
236198
+ if (diff <= 0) return t2("automation.anyMoment", "Any moment now");
236199
+ if (diff < 60 * 1e3) return t2("automation.lessThanMinute", "Less than 1 min");
236200
+ if (diff < 60 * 60 * 1e3) return `${Math.ceil(diff / 6e4)} min`;
236201
+ const hours = Math.floor(diff / 36e5);
236202
+ const mins = Math.ceil(diff % 36e5 / 6e4);
236203
+ return `${hours}h ${mins}m`;
236204
+ };
236205
+ const getScheduleLabel = (schedule2) => {
236206
+ if (schedule2.cron.type === "manual") return t2("automation.manual", "Manual");
236207
+ return schedule2.cron.expr ?? "-";
236208
+ };
236209
+ if (loading) {
236210
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
236211
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-12 shrink-0 border-b border-border flex items-center px-6", style: { WebkitAppRegion: "drag" }, children: [
236212
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: t2("automation.title", "Automation") }),
236213
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs text-muted-foreground font-normal ml-1.5", children: [
236214
+ "· schedules: ",
236215
+ schedules.length
236216
+ ] })
236217
+ ] }),
236218
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-1 items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-6 animate-spin text-muted-foreground" }) })
236219
+ ] });
236220
+ }
236221
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
236222
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
236223
+ "div",
236224
+ {
236225
+ className: "h-12 shrink-0 border-b border-border flex items-center justify-between pl-4 pr-2",
236226
+ style: { WebkitAppRegion: "drag" },
236227
+ children: [
236228
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
236229
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: t2("automation.title", "Automation") }),
236230
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs text-muted-foreground font-normal", children: [
236231
+ "· ",
236232
+ t2("automation.schedules", "schedules"),
236233
+ ": ",
236234
+ schedules.length
236235
+ ] })
236236
+ ] }),
236237
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { WebkitAppRegion: "no-drag" }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "default", size: "sm", className: "h-7 text-xs", onClick: () => setNewDialogOpen(true), children: [
236238
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-3" }),
236239
+ t2("automation.newSchedule", "New Schedule")
236240
+ ] }) })
236241
+ ]
236242
+ }
236243
+ ),
236244
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-5 py-4 w-full max-w-4xl mx-auto", children: schedules.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center py-16 text-sm text-muted-foreground", children: [
236245
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-1", children: t2("automation.noSchedules", "No schedules yet") }),
236246
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "outline", size: "sm", className: "h-7 text-xs mt-2", onClick: () => setNewDialogOpen(true), children: [
236247
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "size-3 mr-1" }),
236248
+ t2("automation.createFirst", "Create your first schedule")
236249
+ ] })
236250
+ ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ItemGroup, { className: "gap-0", children: schedules.map((schedule2, index2) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
236251
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
236252
+ Item,
236253
+ {
236254
+ size: "sm",
236255
+ className: "hover:bg-muted",
236256
+ onClick: () => navigate(`/automation/schedule/${schedule2.id}`),
236257
+ children: [
236258
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ItemContent, { children: [
236259
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ItemTitle, { className: "truncate", children: [
236260
+ schedule2.name,
236261
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-normal text-muted-foreground ml-2 uppercase", children: schedule2.agentId })
236262
+ ] }),
236263
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ItemDescription, { className: "line-clamp-1 text-xs", children: [
236264
+ getScheduleLabel(schedule2),
236265
+ schedule2.lastRunAt && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
236266
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1.5", children: "·" }),
236267
+ t2("automation.cron.lastRun", "Last run"),
236268
+ ": ",
236269
+ new Date(schedule2.lastRunAt).toLocaleString()
236270
+ ] }),
236271
+ schedule2.nextRunAt && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
236272
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1.5", children: "·" }),
236273
+ t2("automation.cron.nextRun", "Next run"),
236274
+ ": ",
236275
+ new Date(schedule2.nextRunAt).toLocaleString(),
236276
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1.5", children: "·" }),
236277
+ t2("automation.cron.nextRunIn", "Next run in"),
236278
+ " ",
236279
+ formatNextRun(schedule2),
236280
+ timezone && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-muted-foreground/50 ml-0.5", children: [
236281
+ "(",
236282
+ timezone,
236283
+ ")"
236284
+ ] })
236285
+ ] })
236286
+ ] })
236287
+ ] }),
236288
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ItemActions, { className: "gap-0.5", children: [
236289
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
236290
+ Button,
236291
+ {
236292
+ variant: "ghost",
236293
+ size: "icon",
236294
+ className: "size-7 text-foreground/50 hover:text-foreground hover:bg-accent",
236295
+ onClick: (e2) => {
236296
+ e2.stopPropagation();
236297
+ void handleTrigger(schedule2.id);
236298
+ },
236299
+ title: t2("automation.triggerNow", "Trigger now"),
236300
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Play, { className: "size-3.5" })
236301
+ }
236302
+ ),
236303
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
236304
+ Button,
236305
+ {
236306
+ variant: "ghost",
236307
+ size: "icon",
236308
+ className: "size-7 text-foreground/50 hover:text-foreground hover:bg-accent",
236309
+ onClick: (e2) => {
236310
+ e2.stopPropagation();
236311
+ setEditSchedule(schedule2);
236312
+ },
236313
+ title: t2("automation.editSettings", "Edit settings"),
236314
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Settings2, { className: "size-3.5" })
236315
+ }
236316
+ ),
236317
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
236318
+ Button,
236319
+ {
236320
+ variant: "ghost",
236321
+ size: "icon",
236322
+ className: "size-7 text-destructive/50 hover:text-destructive hover:bg-destructive/10",
236323
+ onClick: (e2) => {
236324
+ e2.stopPropagation();
236325
+ void handleDelete2(schedule2);
236326
+ },
236327
+ title: t2("automation.delete", "Delete"),
236328
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5" })
236329
+ }
236330
+ )
236331
+ ] })
236332
+ ]
236333
+ }
236334
+ ),
236335
+ index2 < schedules.length - 1 && /* @__PURE__ */ jsxRuntimeExports.jsx(ItemSeparator, {})
236336
+ ] }, schedule2.id)) }) }) }),
236337
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
236338
+ SettingDialog,
236339
+ {
236340
+ open: newDialogOpen,
236341
+ onOpenChange: setNewDialogOpen,
236342
+ onSuccess: () => void loadSchedules()
236343
+ }
236344
+ ),
236345
+ editSchedule && /* @__PURE__ */ jsxRuntimeExports.jsx(
236346
+ SettingDialog,
236347
+ {
236348
+ schedule: editSchedule,
236349
+ open: editSchedule !== null,
236350
+ onOpenChange: (open2) => {
236351
+ if (!open2) setEditSchedule(null);
236352
+ },
236353
+ onSuccess: () => void loadSchedules()
236354
+ }
236355
+ )
236356
+ ] });
236357
+ }
236358
+ function Schedule() {
236359
+ const { scheduleId } = useParams();
236360
+ const { t: t2 } = useTranslation();
236361
+ const navigate = useNavigate();
236362
+ const location2 = useLocation();
236363
+ const { confirm: confirm2 } = useMessage();
236364
+ const hasTaskRoute = location2.pathname.includes("/task/");
236365
+ const [schedule2, setSchedule] = reactExports.useState(null);
236366
+ const [tasks, setTasks] = reactExports.useState([]);
236367
+ const [loading, setLoading] = reactExports.useState(true);
236368
+ const [editDialogOpen, setEditDialogOpen] = reactExports.useState(false);
236369
+ const [timezone, setTimezone] = reactExports.useState("");
236370
+ reactExports.useEffect(() => {
236371
+ request.getServerTimezone().then(setTimezone).catch(() => {
236372
+ });
236373
+ }, []);
236374
+ const loadData = reactExports.useCallback(async () => {
236375
+ if (!scheduleId) return;
236376
+ try {
236377
+ const [scheduleData, tasksData] = await Promise.all([
236378
+ request.listSchedules().then((list2) => list2.find((s16) => s16.id === scheduleId)),
236379
+ request.getTasks({ scheduleId })
236380
+ ]);
236381
+ setSchedule(scheduleData ?? null);
236382
+ setTasks(tasksData ?? []);
236383
+ } catch {
236384
+ } finally {
236385
+ setLoading(false);
236386
+ }
236387
+ }, [scheduleId]);
236388
+ reactExports.useEffect(() => {
236389
+ void loadData();
236390
+ }, [loadData]);
236391
+ reactExports.useEffect(() => {
236392
+ const h3 = () => void loadData();
236393
+ subscribe$1.on("schedules-changed", h3);
236394
+ return () => subscribe$1.off("schedules-changed", h3);
236395
+ }, [loadData]);
236396
+ reactExports.useEffect(() => {
236397
+ const h3 = (p3) => {
236398
+ if (p3.scheduleId === scheduleId) {
236399
+ setTasks((prev2) => {
236400
+ const idx = prev2.findIndex((t22) => t22.id === p3.task.id);
236401
+ if (idx >= 0) {
236402
+ const n2 = [...prev2];
236403
+ n2[idx] = p3.task;
236404
+ return n2;
236405
+ }
236406
+ return [p3.task, ...prev2];
236407
+ });
236408
+ }
236409
+ };
236410
+ subscribe$1.on("task-update", h3);
236411
+ return () => subscribe$1.off("task-update", h3);
236412
+ }, [scheduleId]);
236413
+ const handleTrigger = async () => {
236414
+ if (!scheduleId) return;
236415
+ try {
236416
+ await request.triggerSchedule({ scheduleId });
236417
+ } catch {
236418
+ }
236419
+ };
236420
+ const handleDeleteTask = async (task) => {
236421
+ if (!scheduleId) return;
236422
+ await confirm2({
236423
+ title: t2("automation.deleteTaskTitle", "Delete Task"),
236424
+ content: t2("automation.deleteTaskConfirm", "Delete this task permanently?"),
236425
+ buttons: [
236426
+ { text: t2("automation.cancel", "Cancel"), value: null, variant: "outline" },
236427
+ {
236428
+ text: t2("automation.delete", "Delete"),
236429
+ value: async () => {
236430
+ await request.deleteTask({ scheduleId, taskId: task.id });
236431
+ setTasks((prev2) => prev2.filter((t22) => t22.id !== task.id));
236432
+ return "deleted";
236433
+ },
236434
+ variant: "destructive"
236435
+ }
236436
+ ]
236437
+ });
236438
+ };
236439
+ const getTaskIcon = (task) => {
236440
+ switch (task.status) {
236441
+ case "running":
236442
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-3.5 animate-spin text-blue-500" });
236443
+ case "success":
236444
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheck, { className: "size-3.5 text-green-500" });
236445
+ case "error":
236446
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(CircleX, { className: "size-3.5 text-red-500" });
236447
+ }
236448
+ };
236449
+ if (loading) {
236450
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
236451
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-12 shrink-0 border-b border-border flex items-center px-6", style: { WebkitAppRegion: "drag" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium", children: "—" }) }),
236452
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-1 items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-6 animate-spin text-muted-foreground" }) })
236453
+ ] });
236454
+ }
236455
+ if (!schedule2) {
236456
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col items-center justify-center relative overflow-hidden gap-3", children: [
236457
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute left-0 top-0 right-0 h-12", style: { WebkitAppRegion: "drag" } }),
236458
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-normal text-muted-foreground", children: t2("automation.scheduleNotFound", "Schedule not found") }),
236459
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "outline", size: "sm", className: "h-7 text-xs", onClick: () => navigate("/automation"), children: [
236460
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "size-3" }),
236461
+ t2("automation.back", "Back")
236462
+ ] })
236463
+ ] });
236464
+ }
236465
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "flex min-w-0 flex-1 flex-col relative overflow-hidden", children: [
236466
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "h-12 shrink-0 border-b border-border flex items-center gap-1 px-2", style: { WebkitAppRegion: "drag" }, children: [
236467
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { WebkitAppRegion: "no-drag" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "icon", className: "size-7 shrink-0", onClick: () => navigate("/automation"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "size-3.5" }) }) }),
236468
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
236469
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-sm font-medium truncate", children: schedule2.name }),
236470
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", className: "px-1 text-[10px] uppercase shrink-0", children: schedule2.agentId })
236471
+ ] }),
236472
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-xs text-muted-foreground hidden sm:block shrink-0 mr-2", children: [
236473
+ schedule2.cron.type === "cron" ? schedule2.cron.expr : t2("automation.manual", "Manual"),
236474
+ schedule2.nextRunAt && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
236475
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/40 mx-1", children: "·" }),
236476
+ t2("automation.cron.nextRun", "Next"),
236477
+ ": ",
236478
+ new Date(schedule2.nextRunAt).toLocaleString(),
236479
+ timezone && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-muted-foreground/50 ml-0.5", children: [
236480
+ "(",
236481
+ timezone,
236482
+ ")"
236483
+ ] })
236484
+ ] })
236485
+ ] }),
236486
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", style: { WebkitAppRegion: "no-drag" }, children: [
236487
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "icon", className: "size-7", onClick: () => setEditDialogOpen(true), title: t2("automation.editSettings", "Edit settings"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(Settings2, { className: "size-3.5" }) }),
236488
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "default", size: "sm", className: "h-7 text-xs shrink-0", onClick: handleTrigger, children: [
236489
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Play, { className: "size-3 mr-1" }),
236490
+ t2("automation.triggerNow", "Trigger now")
236491
+ ] })
236492
+ ] })
236493
+ ] }),
236494
+ tasks.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-1 flex-col items-center justify-center gap-2 text-center px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t2("automation.noTasksDesc", 'No runs yet. Click "Trigger now" to start the first run.') }) }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(ResizablePanelGroup, { className: "flex-1 min-h-0", children: [
236495
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ResizablePanel, { id: "taskList", groupResizeBehavior: "preserve-pixel-size", defaultSize: 200, minSize: 180, maxSize: 400, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-full flex flex-col", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: [...tasks].sort((a2, b2) => b2.startedAt - a2.startedAt).map((task) => {
236496
+ const isActive = location2.pathname.endsWith(`/task/${task.id}`);
236497
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenu, { children: [
236498
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
236499
+ ContextMenuTrigger,
236500
+ {
236501
+ render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
236502
+ className: `group border-b border-border flex h-10 cursor-default items-center px-3 text-xs font-normal transition-colors ${isActive ? "bg-accent/70 hover:bg-accent text-accent-foreground/95" : "text-foreground/70 hover:bg-accent hover:text-foreground"}`,
236503
+ onClick: () => navigate(`/automation/schedule/${scheduleId}/task/${task.id}`),
236504
+ children: [
236505
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-w-0 flex-1 items-baseline gap-2", children: [
236506
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "truncate", children: new Date(task.startedAt).toLocaleDateString() }),
236507
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground truncate text-[11px]", children: new Date(task.startedAt).toLocaleTimeString() })
236508
+ ] }),
236509
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "shrink-0 ml-2", children: getTaskIcon(task) })
236510
+ ]
236511
+ }
236512
+ ),
236513
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
236514
+ ContextMenuItem,
236515
+ {
236516
+ variant: "destructive",
236517
+ onClick: () => void handleDeleteTask(task),
236518
+ children: [
236519
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "size-3.5 mr-2" }),
236520
+ t2("automation.delete", "Delete")
236521
+ ]
236522
+ }
236523
+ ) })
236524
+ ] }, task.id);
236525
+ }) }) }) }) }),
236526
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ResizableHandle, { className: "bg-border/70" }),
236527
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ResizablePanel, { id: "right", children: hasTaskRoute ? /* @__PURE__ */ jsxRuntimeExports.jsx(Outlet, {}) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col items-center justify-center h-full gap-2 text-center px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: t2("automation.selectTaskToPreview", "Select a task to preview files") }) }) })
236528
+ ] }),
236529
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
236530
+ SettingDialog,
236531
+ {
236532
+ schedule: schedule2,
236533
+ open: editDialogOpen,
236534
+ onOpenChange: setEditDialogOpen,
236535
+ onSuccess: () => void loadData()
236536
+ }
236537
+ )
236538
+ ] });
236539
+ }
236540
+ const IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "gif", "webp", "avif", "bmp", "svg", "ico"];
236541
+ const FILE_EXT_MAP = {
236542
+ pdf: "pdf",
236543
+ docx: "docx",
236544
+ pptx: "pptx",
236545
+ xlsx: "xlsx",
236546
+ xls: "xlsx",
236547
+ html: "html",
236548
+ htm: "html"
236549
+ };
236550
+ function getFileKind(filename) {
236551
+ if (!filename) return null;
236552
+ const ext = filename.split(".").pop()?.toLowerCase() || "";
236553
+ if (IMAGE_EXTENSIONS.includes(ext)) return "image";
236554
+ if (ext in FILE_EXT_MAP) return FILE_EXT_MAP[ext];
236555
+ if (ext === "md") return "markdown";
236556
+ return "text";
236557
+ }
236558
+ function CodeDetail({ fileName, content: content2 }) {
236559
+ const displayContent = reactExports.useMemo(() => {
236560
+ if (fileName.endsWith(".json")) {
236561
+ try {
236562
+ return JSON.stringify(JSON.parse(content2), null, 2);
236563
+ } catch {
236564
+ return content2;
236565
+ }
236566
+ }
236567
+ return content2;
236568
+ }, [fileName, content2]);
236569
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "w-full h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(CodeView, { className: "min-h-full", content: displayContent, filename: fileName }) });
236570
+ }
236571
+ function MarkdownDetail({ fileName, content: content2 }) {
236572
+ const { t: t2 } = useTranslation();
236573
+ const [viewMode, setViewMode] = reactExports.useState("preview");
236574
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative h-full overflow-hidden", children: [
236575
+ viewMode === "preview" ? /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "w-full h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4 max-w-3xl", children: /* @__PURE__ */ jsxRuntimeExports.jsx(StreamMarkdown, { children: content2 }) }) }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "w-full h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(CodeView, { className: "min-h-full", content: content2, filename: fileName }) }),
236576
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute bottom-4 left-0 right-0 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
236577
+ Tabs,
236578
+ {
236579
+ value: viewMode,
236580
+ onValueChange: (v4) => setViewMode(v4),
236581
+ className: "pointer-events-auto",
236582
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs(TabsList, { className: "h-8 border border-border shadow-lg", children: [
236583
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "preview", className: "text-xs min-w-18", children: t2("fileDetail.preview", "Preview") }),
236584
+ /* @__PURE__ */ jsxRuntimeExports.jsx(TabsTrigger, { value: "code", className: "text-xs min-w-18", children: t2("fileDetail.code", "Code") })
236585
+ ] })
236586
+ }
236587
+ ) })
236588
+ ] });
236589
+ }
236590
+ function ImageDetail({ fileName }) {
236591
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
236592
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Image$1, { className: "size-8" }),
236593
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
236594
+ ] }) });
236595
+ }
236596
+ function PdfDetail({ fileName }) {
236597
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
236598
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
236599
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
236600
+ ] }) });
236601
+ }
236602
+ function DocxDetail({ fileName }) {
236603
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
236604
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
236605
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
236606
+ ] }) });
236607
+ }
236608
+ function PptxDetail({ fileName }) {
236609
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
236610
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
236611
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
236612
+ ] }) });
236613
+ }
236614
+ function XlsxDetail({ fileName }) {
236615
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
236616
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "size-8" }),
236617
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs", children: fileName })
236618
+ ] }) });
236619
+ }
236620
+ function HtmlDetail({ content: content2 }) {
236621
+ const srcDoc = reactExports.useMemo(() => {
236622
+ if (content2.trim().startsWith("<") && !content2.toLowerCase().includes("<!doctype") && !content2.toLowerCase().includes("<html")) {
236623
+ return `<!DOCTYPE html><html><head><meta charset="utf-8"></head><body>${content2}</body></html>`;
236624
+ }
236625
+ return content2;
236626
+ }, [content2]);
236627
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
236628
+ "iframe",
236629
+ {
236630
+ srcDoc,
236631
+ className: "w-full h-full border-0 bg-white",
236632
+ title: "HTML Preview",
236633
+ sandbox: "allow-scripts"
236634
+ }
236635
+ );
236636
+ }
236637
+ function isBinaryContent(content2) {
236638
+ const len = Math.min(content2.length, 512);
236639
+ let nullCount = 0;
236640
+ let nonPrintableCount = 0;
236641
+ for (let i3 = 0; i3 < len; i3++) {
236642
+ const code2 = content2.charCodeAt(i3);
236643
+ if (code2 === 0) nullCount++;
236644
+ else if (code2 < 8 || code2 > 13 && code2 < 32) nonPrintableCount++;
236645
+ }
236646
+ return nullCount > 0 || nonPrintableCount > len * 0.3;
236647
+ }
236648
+ function FileDetail({ fileName, fileContent, fileLoading, hasTask, hasFiles }) {
236649
+ const { t: t2 } = useTranslation();
236650
+ const fileKind = reactExports.useMemo(() => getFileKind(fileName), [fileName]);
236651
+ const isUnsupportedBinary = reactExports.useMemo(() => {
236652
+ if (!fileContent || !fileName) return false;
236653
+ if (fileKind === "image" || fileKind === "pdf" || fileKind === "docx" || fileKind === "pptx" || fileKind === "xlsx") return false;
236654
+ return isBinaryContent(fileContent);
236655
+ }, [fileContent, fileName, fileKind]);
236656
+ if (!hasTask) {
236657
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full text-xs text-muted-foreground", children: t2("automation.selectTaskToPreview", "Select a task to preview files") });
236658
+ }
236659
+ if (!hasFiles) {
236660
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full text-xs text-muted-foreground", children: t2("automation.noFiles", "No files generated") });
236661
+ }
236662
+ if (!fileName) {
236663
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full text-xs text-muted-foreground", children: t2("automation.selectFileToPreview", "Select a file to preview") });
236664
+ }
236665
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col w-full h-full min-w-0 relative overflow-hidden", children: [
236666
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-10 shrink-0 border-b border-border flex items-center justify-between gap-2 px-2 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center min-w-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 flex items-center gap-1.5", children: [
236667
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { name: fileName, className: "size-4 shrink-0 text-muted-foreground/80" }),
236668
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col min-w-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs truncate leading-tight text-foreground/60", children: fileName }) })
236669
+ ] }) }) }),
236670
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative flex-1 min-h-0 overflow-hidden", children: fileLoading ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center py-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-4 animate-spin text-muted-foreground" }) }) : isUnsupportedBinary ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full text-xs text-muted-foreground", children: t2("fileDetail.fileFormatNotSupported", "File format not supported for preview") }) : fileKind === "image" ? /* @__PURE__ */ jsxRuntimeExports.jsx(ImageDetail, { fileName, content: fileContent ?? "" }) : fileKind === "markdown" ? /* @__PURE__ */ jsxRuntimeExports.jsx(MarkdownDetail, { fileName, content: fileContent ?? "" }) : fileKind === "html" ? /* @__PURE__ */ jsxRuntimeExports.jsx(HtmlDetail, { fileName, content: fileContent ?? "" }) : fileKind === "pdf" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PdfDetail, { fileName, content: fileContent ?? "" }) : fileKind === "docx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(DocxDetail, { fileName, content: fileContent ?? "" }) : fileKind === "pptx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(PptxDetail, { fileName, content: fileContent ?? "" }) : fileKind === "xlsx" ? /* @__PURE__ */ jsxRuntimeExports.jsx(XlsxDetail, { fileName, content: fileContent ?? "" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(CodeDetail, { fileName, content: fileContent ?? "" }) })
236671
+ ] });
236672
+ }
236673
+ function buildTree2(paths) {
236674
+ const root2 = [];
236675
+ for (const fullPath of paths) {
236676
+ const parts = fullPath.split("/");
236677
+ let current = root2;
236678
+ for (let i3 = 0; i3 < parts.length; i3++) {
236679
+ const part = parts[i3];
236680
+ const isLast = i3 === parts.length - 1;
236681
+ const nodePath = parts.slice(0, i3 + 1).join("/");
236682
+ let existing = current.find((n2) => n2.name === part);
236683
+ if (!existing) {
236684
+ existing = {
236685
+ name: part,
236686
+ path: nodePath,
236687
+ isFolder: !isLast,
236688
+ children: !isLast ? [] : void 0
236689
+ };
236690
+ current.push(existing);
236691
+ }
236692
+ if (existing.children) current = existing.children;
236693
+ }
236694
+ }
236695
+ return root2;
236696
+ }
236697
+ function FileTree({
236698
+ nodes,
236699
+ depth,
236700
+ selectedFile,
236701
+ onSelectFile,
236702
+ openFolders,
236703
+ toggleFolder,
236704
+ onCopyRelativePath,
236705
+ onCopyAbsolutePath,
236706
+ onRevealInFinder
236707
+ }) {
236708
+ const { t: t2 } = useTranslation();
236709
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: nodes.map((node2) => {
236710
+ if (node2.isFolder) {
236711
+ const isOpen = openFolders.has(node2.path);
236712
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
236713
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
236714
+ "div",
236715
+ {
236716
+ className: cn$5(
236717
+ "flex h-6 cursor-default select-none items-center gap-1.5 px-1.5 text-sx leading-none text-foreground/60 hover:bg-primary/5 hover:text-foreground"
236718
+ ),
236719
+ style: { paddingLeft: `${depth * 16 + 6}px` },
236720
+ onClick: () => toggleFolder(node2.path),
236721
+ children: [
236722
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
236723
+ ChevronRight,
236724
+ {
236725
+ className: cn$5("size-3.5 shrink-0 text-muted-foreground transition-transform", isOpen && "rotate-90")
236726
+ }
236727
+ ),
236728
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Folder$1, { className: "size-4 shrink-0 text-muted-foreground/90" }),
236729
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal", children: node2.name })
236730
+ ]
236731
+ }
236732
+ ),
236733
+ isOpen && node2.children && /* @__PURE__ */ jsxRuntimeExports.jsx(
236734
+ FileTree,
236735
+ {
236736
+ nodes: node2.children,
236737
+ depth: depth + 1,
236738
+ selectedFile,
236739
+ onSelectFile,
236740
+ openFolders,
236741
+ toggleFolder,
236742
+ onCopyRelativePath,
236743
+ onCopyAbsolutePath,
236744
+ onRevealInFinder
236745
+ }
236746
+ )
236747
+ ] }, node2.path);
236748
+ }
236749
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenu, { children: [
236750
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
236751
+ ContextMenuTrigger,
236752
+ {
236753
+ render: /* @__PURE__ */ jsxRuntimeExports.jsx("div", {}),
236754
+ className: cn$5(
236755
+ "flex h-6 cursor-default select-none items-center gap-1.5 px-1.5 text-sx leading-none text-foreground/60 hover:bg-primary/5 hover:text-foreground",
236756
+ selectedFile === node2.path && "text-foreground bg-primary/6"
236757
+ ),
236758
+ style: { paddingLeft: `${depth * 16 + 6}px` },
236759
+ onClick: () => onSelectFile(node2.path),
236760
+ children: [
236761
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-3.5 shrink-0" }),
236762
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FileIcon, { name: node2.name, className: "size-4 shrink-0 text-muted-foreground/90" }),
236763
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "flex-1 truncate leading-normal", children: node2.name })
236764
+ ]
236765
+ }
236766
+ ),
236767
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuContent, { children: [
236768
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onCopyRelativePath(node2.path), children: [
236769
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3.5 mr-2" }),
236770
+ t2("filePanel.copyPath", "Copy Path")
236771
+ ] }),
236772
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onCopyAbsolutePath(node2.path), children: [
236773
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Copy, { className: "size-3.5 mr-2" }),
236774
+ t2("filePanel.copyAbsolutePath", "Copy Absolute Path")
236775
+ ] }),
236776
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ContextMenuSeparator, {}),
236777
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(ContextMenuItem, { onClick: () => onRevealInFinder(node2.path), children: [
236778
+ /* @__PURE__ */ jsxRuntimeExports.jsx(FolderOpen, { className: "size-3.5 mr-2" }),
236779
+ t2("filePanel.revealInFinder", "Reveal in Finder")
236780
+ ] })
236781
+ ] })
236782
+ ] }, node2.path);
236783
+ }) });
236784
+ }
236785
+ function Panel({
236786
+ files,
236787
+ selectedFile,
236788
+ hasTask,
236789
+ onSelectFile,
236790
+ onCopyRelativePath,
236791
+ onCopyAbsolutePath,
236792
+ onRevealInFinder
236793
+ }) {
236794
+ const { t: t2 } = useTranslation();
236795
+ const [openFolders, setOpenFolders] = reactExports.useState(/* @__PURE__ */ new Set());
236796
+ const tree = reactExports.useMemo(() => buildTree2(files), [files]);
236797
+ reactExports.useEffect(() => {
236798
+ const allFolders = /* @__PURE__ */ new Set();
236799
+ for (const f2 of files) {
236800
+ const parts = f2.split("/");
236801
+ for (let i3 = 1; i3 < parts.length; i3++) {
236802
+ allFolders.add(parts.slice(0, i3).join("/"));
236803
+ }
236804
+ }
236805
+ setOpenFolders(allFolders);
236806
+ }, [files]);
236807
+ const toggleFolder = (path2) => {
236808
+ setOpenFolders((prev2) => {
236809
+ const next2 = new Set(prev2);
236810
+ if (next2.has(path2)) next2.delete(path2);
236811
+ else next2.add(path2);
236812
+ return next2;
236813
+ });
236814
+ };
236815
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-full min-h-0 flex-col text-xs w-full", children: [
236816
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-10 items-center gap-0.5 border-b border-border", children: [
236817
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex text-muted-foreground items-center gap-1 px-3", children: [
236818
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Folders, { className: "size-4" }),
236819
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-medium text-nowrap", children: t2("automation.files", "Files") })
236820
+ ] }),
236821
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ml-auto mr-2 flex items-center gap-0.5", children: tree.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx(
236822
+ "button",
236823
+ {
236824
+ className: "flex size-6 items-center justify-center text-muted-foreground hover:text-foreground rounded",
236825
+ onClick: () => setOpenFolders(/* @__PURE__ */ new Set()),
236826
+ title: t2("filePanel.collapseFolders", "Collapse folders"),
236827
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronsDownUp, { className: "size-3.5" })
236828
+ }
236829
+ ) })
236830
+ ] }),
236831
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollArea, { className: "min-h-0 flex-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "py-1", children: !hasTask ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-3 py-4 text-xs text-muted-foreground text-center", children: t2("automation.selectTask", "Select a task") }) : files.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-3 py-4 text-xs text-muted-foreground text-center", children: t2("automation.noFiles", "No files") }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
236832
+ FileTree,
236833
+ {
236834
+ nodes: tree,
236835
+ depth: 0,
236836
+ selectedFile,
236837
+ onSelectFile,
236838
+ openFolders,
236839
+ toggleFolder,
236840
+ onCopyRelativePath,
236841
+ onCopyAbsolutePath,
236842
+ onRevealInFinder
236843
+ }
236844
+ ) }) })
236845
+ ] });
236846
+ }
236847
+ function Task() {
236848
+ const { scheduleId, taskId } = useParams();
236849
+ const { t: t2 } = useTranslation();
236850
+ const [taskFiles, setTaskFiles] = reactExports.useState([]);
236851
+ const [selectedFile, setSelectedFile] = reactExports.useState(null);
236852
+ const [fileContent, setFileContent] = reactExports.useState(null);
236853
+ const [fileLoading, setFileLoading] = reactExports.useState(false);
236854
+ const [loading, setLoading] = reactExports.useState(true);
236855
+ const loadFiles = reactExports.useCallback(async () => {
236856
+ if (!scheduleId || !taskId) return;
236857
+ try {
236858
+ const files = await request.getTaskFiles({ scheduleId, taskId });
236859
+ setTaskFiles(files ?? []);
236860
+ const readme = (files ?? []).find((f2) => f2.toLowerCase() === "readme.md");
236861
+ setSelectedFile(readme ?? null);
236862
+ setFileContent(null);
236863
+ } catch {
236864
+ setTaskFiles([]);
236865
+ } finally {
236866
+ setLoading(false);
236867
+ }
236868
+ }, [scheduleId, taskId]);
236869
+ reactExports.useEffect(() => {
236870
+ setLoading(true);
236871
+ void loadFiles();
236872
+ }, [loadFiles]);
236873
+ reactExports.useEffect(() => {
236874
+ const handler = (payload) => {
236875
+ if (payload.scheduleId === scheduleId && payload.task?.id === taskId && payload.task.status !== "running") {
236876
+ void loadFiles();
236877
+ }
236878
+ };
236879
+ subscribe$1.on("task-update", handler);
236880
+ return () => subscribe$1.off("task-update", handler);
236881
+ }, [scheduleId, taskId, loadFiles]);
236882
+ reactExports.useEffect(() => {
236883
+ if (!selectedFile || !scheduleId || !taskId) {
236884
+ setFileContent(null);
236885
+ return;
236886
+ }
236887
+ setFileLoading(true);
236888
+ (async () => {
236889
+ try {
236890
+ const content2 = await request.readTaskFile({ scheduleId, taskId, filePath: selectedFile });
236891
+ setFileContent(content2 ?? null);
236892
+ } catch {
236893
+ setFileContent("// Error loading file");
236894
+ } finally {
236895
+ setFileLoading(false);
236896
+ }
236897
+ })();
236898
+ }, [selectedFile, scheduleId, taskId]);
236899
+ if (loading) {
236900
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-center h-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "size-5 animate-spin text-muted-foreground" }) });
236901
+ }
236902
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(ResizablePanelGroup, { className: "h-full", children: [
236903
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ResizablePanel, { id: "fileDetail", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
236904
+ FileDetail,
236905
+ {
236906
+ fileName: selectedFile,
236907
+ fileContent,
236908
+ fileLoading,
236909
+ hasTask: true,
236910
+ hasFiles: taskFiles.length > 0
236911
+ }
236912
+ ) }),
236913
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ResizableHandle, { className: "bg-border/70" }),
236914
+ /* @__PURE__ */ jsxRuntimeExports.jsx(ResizablePanel, { id: "filePanel", groupResizeBehavior: "preserve-pixel-size", defaultSize: 250, minSize: 250, maxSize: 400, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
236915
+ Panel,
236916
+ {
236917
+ files: taskFiles,
236918
+ selectedFile,
236919
+ hasTask: true,
236920
+ onSelectFile: setSelectedFile,
236921
+ onCopyRelativePath: async (file) => {
236922
+ try {
236923
+ await copyText(file);
236924
+ } catch {
236925
+ }
236926
+ },
236927
+ onCopyAbsolutePath: async (file) => {
236928
+ try {
236929
+ const abs2 = await request.getTaskFileSystemPath({ scheduleId, taskId, filePath: file });
236930
+ await copyText(abs2);
236931
+ } catch {
236932
+ }
236933
+ },
236934
+ onRevealInFinder: async (file) => {
236935
+ if (isWebUI) return;
236936
+ try {
236937
+ const abs2 = await request.getTaskFileSystemPath({ scheduleId, taskId, filePath: file });
236938
+ await electron.revealInFinder(abs2);
236939
+ } catch {
236940
+ }
236941
+ }
236942
+ }
236943
+ ) })
236944
+ ] });
236945
+ }
235686
236946
  function SessionWrapper() {
235687
236947
  const { sessionId } = useParams();
235688
236948
  const sessionInfo = useAppStore((s16) => s16.sessions.find((x2) => x2.id === sessionId));
@@ -235715,7 +236975,9 @@ function AppRouter() {
235715
236975
  /* @__PURE__ */ jsxRuntimeExports.jsxs(Route, { path: "/skills", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsLayout, {}), children: [
235716
236976
  /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "installed", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsInstalled, {}) }),
235717
236977
  /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "skills-sh", element: /* @__PURE__ */ jsxRuntimeExports.jsx(SkillsSh, {}) })
235718
- ] })
236978
+ ] }),
236979
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "/automation", element: /* @__PURE__ */ jsxRuntimeExports.jsx(Automation, {}) }),
236980
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "/automation/schedule/:scheduleId", element: /* @__PURE__ */ jsxRuntimeExports.jsx(Schedule, {}), children: /* @__PURE__ */ jsxRuntimeExports.jsx(Route, { path: "task/:taskId", element: /* @__PURE__ */ jsxRuntimeExports.jsx(Task, {}) }) })
235719
236981
  ] })
235720
236982
  ] });
235721
236983
  }