@zythum02/fello-server 0.1.51 → 0.1.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/out/renderer/assets/{_baseUniq-DdWCC-Go.js → _baseUniq-CJr3HkLS.js} +1 -1
  2. package/out/renderer/assets/_baseUniq-CJr3HkLS.js.br +0 -0
  3. package/out/renderer/assets/_baseUniq-CJr3HkLS.js.gz +0 -0
  4. package/out/renderer/assets/{arc-B_en4gJt.js → arc-POsBroTF.js} +1 -1
  5. package/out/renderer/assets/arc-POsBroTF.js.br +0 -0
  6. package/out/renderer/assets/arc-POsBroTF.js.gz +0 -0
  7. package/out/renderer/assets/{architectureDiagram-Q4EWVU46-W-l3dTvZ.js → architectureDiagram-Q4EWVU46-CmToUhDb.js} +6 -6
  8. package/out/renderer/assets/architectureDiagram-Q4EWVU46-CmToUhDb.js.br +0 -0
  9. package/out/renderer/assets/architectureDiagram-Q4EWVU46-CmToUhDb.js.gz +0 -0
  10. package/out/renderer/assets/{arrow-left-BwbOF_G_.js → arrow-left-CxS1t3f7.js} +1 -1
  11. package/out/renderer/assets/{automation--izxbhlj.js → automation-Cyz3eLWp.js} +7 -8
  12. package/out/renderer/assets/automation-Cyz3eLWp.js.br +0 -0
  13. package/out/renderer/assets/automation-Cyz3eLWp.js.gz +0 -0
  14. package/out/renderer/assets/{blockDiagram-DXYQGD6D-BdxXOr8Y.js → blockDiagram-DXYQGD6D-M2nnTg9f.js} +7 -7
  15. package/out/renderer/assets/blockDiagram-DXYQGD6D-M2nnTg9f.js.br +0 -0
  16. package/out/renderer/assets/blockDiagram-DXYQGD6D-M2nnTg9f.js.gz +0 -0
  17. package/out/renderer/assets/{c4Diagram-AHTNJAMY-C_8XgPtT.js → c4Diagram-AHTNJAMY-CwLtsy_0.js} +3 -3
  18. package/out/renderer/assets/c4Diagram-AHTNJAMY-CwLtsy_0.js.br +0 -0
  19. package/out/renderer/assets/c4Diagram-AHTNJAMY-CwLtsy_0.js.gz +0 -0
  20. package/out/renderer/assets/{channel-BsSLbHzl.js → channel-BUNDMqpH.js} +1 -1
  21. package/out/renderer/assets/{chunk-4BX2VUAB-CADGLBio.js → chunk-4BX2VUAB-B2qXmkDT.js} +1 -1
  22. package/out/renderer/assets/{chunk-4TB4RGXK-C7h57GNs.js → chunk-4TB4RGXK-DXLZpPY5.js} +5 -5
  23. package/out/renderer/assets/chunk-4TB4RGXK-DXLZpPY5.js.br +0 -0
  24. package/out/renderer/assets/chunk-4TB4RGXK-DXLZpPY5.js.gz +0 -0
  25. package/out/renderer/assets/{chunk-55IACEB6-Cw-dv2b3.js → chunk-55IACEB6-CJeyefxI.js} +1 -1
  26. package/out/renderer/assets/{chunk-EDXVE4YY-BPjYyS5o.js → chunk-EDXVE4YY-CNjJEQfY.js} +1 -1
  27. package/out/renderer/assets/chunk-EDXVE4YY-CNjJEQfY.js.br +0 -0
  28. package/out/renderer/assets/chunk-EDXVE4YY-CNjJEQfY.js.gz +0 -0
  29. package/out/renderer/assets/{chunk-FMBD7UC4-DhJ5Z89u.js → chunk-FMBD7UC4-DOAOsjRu.js} +1 -1
  30. package/out/renderer/assets/{chunk-OYMX7WX6-D5Q5ZCl0.js → chunk-OYMX7WX6-BG4B1VQ7.js} +3 -3
  31. package/out/renderer/assets/chunk-OYMX7WX6-BG4B1VQ7.js.br +0 -0
  32. package/out/renderer/assets/chunk-OYMX7WX6-BG4B1VQ7.js.gz +0 -0
  33. package/out/renderer/assets/{chunk-QZHKN3VN-SsM-5KS-.js → chunk-QZHKN3VN-B9zfXYIQ.js} +1 -1
  34. package/out/renderer/assets/{chunk-YZCP3GAM-AbfctYy8.js → chunk-YZCP3GAM-jeoI2tsD.js} +1 -1
  35. package/out/renderer/assets/chunk-YZCP3GAM-jeoI2tsD.js.br +0 -0
  36. package/out/renderer/assets/chunk-YZCP3GAM-jeoI2tsD.js.gz +0 -0
  37. package/out/renderer/assets/{circle-x-CxFDvVH_.js → circle-x-B1kBsMlS.js} +1 -1
  38. package/out/renderer/assets/{classDiagram-v2-HSJHXN6E-7ZGV_42k.js → classDiagram-6PBFFD2Q-DWPFF3Yt.js} +7 -7
  39. package/out/renderer/assets/{classDiagram-6PBFFD2Q-7ZGV_42k.js → classDiagram-v2-HSJHXN6E-DWPFF3Yt.js} +7 -7
  40. package/out/renderer/assets/{clone-D2_BL2Tz.js → clone-Dcvr9oKv.js} +1 -1
  41. package/out/renderer/assets/{code-editor-cp9haQUT.js → code-editor-CEXlC4aV.js} +2 -2
  42. package/out/renderer/assets/code-editor-CEXlC4aV.js.br +0 -0
  43. package/out/renderer/assets/code-editor-CEXlC4aV.js.gz +0 -0
  44. package/out/renderer/assets/{collapsible-BHMUDZxc.js → collapsible-CMuCJUWG.js} +1 -1
  45. package/out/renderer/assets/collapsible-CMuCJUWG.js.br +0 -0
  46. package/out/renderer/assets/collapsible-CMuCJUWG.js.gz +0 -0
  47. package/out/renderer/assets/{cose-bilkent-S5V4N54A-CVcE9aWV.js → cose-bilkent-S5V4N54A-B3bgImVS.js} +2 -2
  48. package/out/renderer/assets/cose-bilkent-S5V4N54A-B3bgImVS.js.br +0 -0
  49. package/out/renderer/assets/cose-bilkent-S5V4N54A-B3bgImVS.js.gz +0 -0
  50. package/out/renderer/assets/{dagre-KV5264BT-zrX-TFsi.js → dagre-KV5264BT-DTbumBA_.js} +7 -7
  51. package/out/renderer/assets/dagre-KV5264BT-DTbumBA_.js.br +0 -0
  52. package/out/renderer/assets/dagre-KV5264BT-DTbumBA_.js.gz +0 -0
  53. package/out/renderer/assets/{diagram-5BDNPKRD-Ct9NrJP9.js → diagram-5BDNPKRD-B34Y6e8q.js} +7 -7
  54. package/out/renderer/assets/diagram-5BDNPKRD-B34Y6e8q.js.br +0 -0
  55. package/out/renderer/assets/diagram-5BDNPKRD-B34Y6e8q.js.gz +0 -0
  56. package/out/renderer/assets/{diagram-G4DWMVQ6-tTGWcCd_.js → diagram-G4DWMVQ6-BBiBmFR4.js} +7 -7
  57. package/out/renderer/assets/diagram-G4DWMVQ6-BBiBmFR4.js.br +0 -0
  58. package/out/renderer/assets/diagram-G4DWMVQ6-BBiBmFR4.js.gz +0 -0
  59. package/out/renderer/assets/{diagram-MMDJMWI5-CpmcnN2B.js → diagram-MMDJMWI5-P-YslDjG.js} +6 -6
  60. package/out/renderer/assets/diagram-MMDJMWI5-P-YslDjG.js.br +0 -0
  61. package/out/renderer/assets/diagram-MMDJMWI5-P-YslDjG.js.gz +0 -0
  62. package/out/renderer/assets/{diagram-TYMM5635-DKTR2xS9.js → diagram-TYMM5635-D_cLard_.js} +6 -6
  63. package/out/renderer/assets/diagram-TYMM5635-D_cLard_.js.br +0 -0
  64. package/out/renderer/assets/diagram-TYMM5635-D_cLard_.js.gz +0 -0
  65. package/out/renderer/assets/{ellipsis-8708fodN.js → ellipsis-D1agTYu1.js} +1 -1
  66. package/out/renderer/assets/{erDiagram-SMLLAGMA-BW13EXAs.js → erDiagram-SMLLAGMA-C1MHqKvC.js} +5 -5
  67. package/out/renderer/assets/erDiagram-SMLLAGMA-C1MHqKvC.js.br +0 -0
  68. package/out/renderer/assets/erDiagram-SMLLAGMA-C1MHqKvC.js.gz +0 -0
  69. package/out/renderer/assets/{field-Be86bgEh.js → field-DR3J0r9e.js} +1 -1
  70. package/out/renderer/assets/field-DR3J0r9e.js.br +0 -0
  71. package/out/renderer/assets/field-DR3J0r9e.js.gz +0 -0
  72. package/out/renderer/assets/{file-text-CMw1QH-C.js → file-text-nGCW6zu1.js} +1 -1
  73. package/out/renderer/assets/{flowDiagram-DWJPFMVM-C3oZAKxX.js → flowDiagram-DWJPFMVM-DprlEc3Z.js} +7 -7
  74. package/out/renderer/assets/flowDiagram-DWJPFMVM-DprlEc3Z.js.br +0 -0
  75. package/out/renderer/assets/flowDiagram-DWJPFMVM-DprlEc3Z.js.gz +0 -0
  76. package/out/renderer/assets/{ganttDiagram-T4ZO3ILL-BARJrpDB.js → ganttDiagram-T4ZO3ILL-CbTdumBm.js} +3 -3
  77. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-CbTdumBm.js.br +0 -0
  78. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-CbTdumBm.js.gz +0 -0
  79. package/out/renderer/assets/{gitGraphDiagram-UUTBAWPF-D0gl3Row.js → gitGraphDiagram-UUTBAWPF-06bme-w8.js} +7 -7
  80. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-06bme-w8.js.br +0 -0
  81. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-06bme-w8.js.gz +0 -0
  82. package/out/renderer/assets/{graph-DB7hnlLW.js → graph-BZhxluo9.js} +2 -2
  83. package/out/renderer/assets/graph-BZhxluo9.js.br +0 -0
  84. package/out/renderer/assets/graph-BZhxluo9.js.gz +0 -0
  85. package/out/renderer/assets/{highlighted-body-OFNGDK62-J87DvYBX.js → highlighted-body-OFNGDK62-CvDMJtXf.js} +2 -2
  86. package/out/renderer/assets/{index-Co8mzhyV.js → index-LmYTNvdF.js} +913 -453
  87. package/out/renderer/assets/index-LmYTNvdF.js.br +0 -0
  88. package/out/renderer/assets/index-LmYTNvdF.js.gz +0 -0
  89. package/out/renderer/assets/index-aGJ_yZib.css +382 -0
  90. package/out/renderer/assets/index-aGJ_yZib.css.br +0 -0
  91. package/out/renderer/assets/index-aGJ_yZib.css.gz +0 -0
  92. package/out/renderer/assets/{infoDiagram-42DDH7IO-BrfLG_LC.js → infoDiagram-42DDH7IO-DqivEzWL.js} +5 -5
  93. package/out/renderer/assets/infoDiagram-42DDH7IO-DqivEzWL.js.br +0 -0
  94. package/out/renderer/assets/infoDiagram-42DDH7IO-DqivEzWL.js.gz +0 -0
  95. package/out/renderer/assets/{ishikawaDiagram-UXIWVN3A-CO0cyvTq.js → ishikawaDiagram-UXIWVN3A-BKcg_z4w.js} +2 -2
  96. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-BKcg_z4w.js.br +0 -0
  97. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-BKcg_z4w.js.gz +0 -0
  98. package/out/renderer/assets/{item-CvcokSWl.js → item-BHEUMM9H.js} +1 -1
  99. package/out/renderer/assets/item-BHEUMM9H.js.br +0 -0
  100. package/out/renderer/assets/item-BHEUMM9H.js.gz +0 -0
  101. package/out/renderer/assets/{journeyDiagram-VCZTEJTY-D3F2Iu5P.js → journeyDiagram-VCZTEJTY-Bvv8xuxQ.js} +5 -5
  102. package/out/renderer/assets/journeyDiagram-VCZTEJTY-Bvv8xuxQ.js.br +0 -0
  103. package/out/renderer/assets/journeyDiagram-VCZTEJTY-Bvv8xuxQ.js.gz +0 -0
  104. package/out/renderer/assets/{kanban-definition-6JOO6SKY-CC_drlaB.js → kanban-definition-6JOO6SKY-C-gRMpeM.js} +3 -3
  105. package/out/renderer/assets/kanban-definition-6JOO6SKY-C-gRMpeM.js.br +0 -0
  106. package/out/renderer/assets/kanban-definition-6JOO6SKY-C-gRMpeM.js.gz +0 -0
  107. package/out/renderer/assets/{layout-B_3n1To1.js → layout-B4dSyItA.js} +4 -4
  108. package/out/renderer/assets/layout-B4dSyItA.js.br +0 -0
  109. package/out/renderer/assets/layout-B4dSyItA.js.gz +0 -0
  110. package/out/renderer/assets/{linear-AxwRZ_jw.js → linear-CoVhuer7.js} +1 -1
  111. package/out/renderer/assets/linear-CoVhuer7.js.br +0 -0
  112. package/out/renderer/assets/linear-CoVhuer7.js.gz +0 -0
  113. package/out/renderer/assets/{link-2-4A51Gs15.js → link-2-DHUPzNSt.js} +1 -1
  114. package/out/renderer/assets/{mermaid-GHXKKRXX-DFOJYe_t.js → mermaid-GHXKKRXX-CZqkhGx7.js} +54 -54
  115. package/out/renderer/assets/mermaid-GHXKKRXX-CZqkhGx7.js.br +0 -0
  116. package/out/renderer/assets/mermaid-GHXKKRXX-CZqkhGx7.js.gz +0 -0
  117. package/out/renderer/assets/mic-BgSvicCB.js +22 -0
  118. package/out/renderer/assets/{min-Dip7FmOo.js → min-emzuJjmk.js} +2 -2
  119. package/out/renderer/assets/min-emzuJjmk.js.br +0 -0
  120. package/out/renderer/assets/min-emzuJjmk.js.gz +0 -0
  121. package/out/renderer/assets/{mindmap-definition-QFDTVHPH-D9aiLrpe.js → mindmap-definition-QFDTVHPH-DQ4JNECm.js} +4 -4
  122. package/out/renderer/assets/mindmap-definition-QFDTVHPH-DQ4JNECm.js.br +0 -0
  123. package/out/renderer/assets/mindmap-definition-QFDTVHPH-DQ4JNECm.js.gz +0 -0
  124. package/out/renderer/assets/{open-guide-KaWHLGYU.js → open-guide-CfLO-Sdk.js} +1 -1
  125. package/out/renderer/assets/{package-search-CNALSYvi.js → package-search-CrF2Iegl.js} +1 -1
  126. package/out/renderer/assets/{pieDiagram-DEJITSTG-BX_34lAP.js → pieDiagram-DEJITSTG-0H6CGQQt.js} +7 -7
  127. package/out/renderer/assets/pieDiagram-DEJITSTG-0H6CGQQt.js.br +0 -0
  128. package/out/renderer/assets/pieDiagram-DEJITSTG-0H6CGQQt.js.gz +0 -0
  129. package/out/renderer/assets/{plus-DOVKq0d7.js → plus-YNCXW-GD.js} +1 -1
  130. package/out/renderer/assets/{quadrantDiagram-34T5L4WZ-G09qfNO8.js → quadrantDiagram-34T5L4WZ-D0aPKp5z.js} +3 -3
  131. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-D0aPKp5z.js.br +0 -0
  132. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-D0aPKp5z.js.gz +0 -0
  133. package/out/renderer/assets/{refresh-cw-DGB7KSZ3.js → refresh-cw-Bvm578nW.js} +1 -1
  134. package/out/renderer/assets/{requirementDiagram-MS252O5E-sJPY8r9J.js → requirementDiagram-MS252O5E-BkzwapW_.js} +4 -4
  135. package/out/renderer/assets/requirementDiagram-MS252O5E-BkzwapW_.js.br +0 -0
  136. package/out/renderer/assets/requirementDiagram-MS252O5E-BkzwapW_.js.gz +0 -0
  137. package/out/renderer/assets/{resizable-C5jomC3Y.js → resizable-cStzNJ8V.js} +1 -1
  138. package/out/renderer/assets/resizable-cStzNJ8V.js.br +0 -0
  139. package/out/renderer/assets/resizable-cStzNJ8V.js.gz +0 -0
  140. package/out/renderer/assets/{sankeyDiagram-XADWPNL6-DHIS2ISZ.js → sankeyDiagram-XADWPNL6-Dbde7usj.js} +2 -2
  141. package/out/renderer/assets/sankeyDiagram-XADWPNL6-Dbde7usj.js.br +0 -0
  142. package/out/renderer/assets/sankeyDiagram-XADWPNL6-Dbde7usj.js.gz +0 -0
  143. package/out/renderer/assets/{schedule-BoqPUAOI.js → schedule-DNMCsk-G.js} +9 -10
  144. package/out/renderer/assets/schedule-DNMCsk-G.js.br +0 -0
  145. package/out/renderer/assets/schedule-DNMCsk-G.js.gz +0 -0
  146. package/out/renderer/assets/{search-DdqhQVGJ.js → search-BEY9yGF_.js} +1 -1
  147. package/out/renderer/assets/{sequenceDiagram-FGHM5R23-Boc12Em2.js → sequenceDiagram-FGHM5R23-DI8l1pSL.js} +4 -4
  148. package/out/renderer/assets/sequenceDiagram-FGHM5R23-DI8l1pSL.js.br +0 -0
  149. package/out/renderer/assets/sequenceDiagram-FGHM5R23-DI8l1pSL.js.gz +0 -0
  150. package/out/renderer/assets/{session-DgU3TDDV.js → session-Bn5k9ScR.js} +1540 -182
  151. package/out/renderer/assets/session-Bn5k9ScR.js.br +0 -0
  152. package/out/renderer/assets/session-Bn5k9ScR.js.gz +0 -0
  153. package/out/renderer/assets/{setting-dialog-4pmkQ7WP.js → setting-dialog-sqfPfGsy.js} +3 -3
  154. package/out/renderer/assets/setting-dialog-sqfPfGsy.js.br +0 -0
  155. package/out/renderer/assets/setting-dialog-sqfPfGsy.js.gz +0 -0
  156. package/out/renderer/assets/{settings-2-CI8inOtS.js → settings-2-DRhoXOO8.js} +1 -1
  157. package/out/renderer/assets/{settings-agents-C4u0s-iR.js → settings-agents-Bntc31Nn.js} +10 -11
  158. package/out/renderer/assets/settings-agents-Bntc31Nn.js.br +0 -0
  159. package/out/renderer/assets/settings-agents-Bntc31Nn.js.gz +0 -0
  160. package/out/renderer/assets/{settings-general-BkLSJoHB.js → settings-general-DhbLb9cP.js} +2 -2
  161. package/out/renderer/assets/settings-general-DhbLb9cP.js.br +0 -0
  162. package/out/renderer/assets/settings-general-DhbLb9cP.js.gz +0 -0
  163. package/out/renderer/assets/{settings-ilink-6ZrgPpeO.js → settings-ilink-C7nGGjwT.js} +3 -3
  164. package/out/renderer/assets/settings-ilink-C7nGGjwT.js.br +0 -0
  165. package/out/renderer/assets/settings-ilink-C7nGGjwT.js.gz +0 -0
  166. package/out/renderer/assets/{settings-image-generation-B6YIO6o_.js → settings-image-generation-H2dgqG7Y.js} +6 -7
  167. package/out/renderer/assets/settings-image-generation-H2dgqG7Y.js.br +0 -0
  168. package/out/renderer/assets/settings-image-generation-H2dgqG7Y.js.gz +0 -0
  169. package/out/renderer/assets/{settings-layout-Cf7GMXFZ.js → settings-layout-ATto1xpJ.js} +9 -3
  170. package/out/renderer/assets/settings-layout-ATto1xpJ.js.br +0 -0
  171. package/out/renderer/assets/settings-layout-ATto1xpJ.js.gz +0 -0
  172. package/out/renderer/assets/{settings-mcp-CJvL5Siz.js → settings-mcp-DUdMuoJ-.js} +7 -8
  173. package/out/renderer/assets/settings-mcp-DUdMuoJ-.js.br +0 -0
  174. package/out/renderer/assets/settings-mcp-DUdMuoJ-.js.gz +0 -0
  175. package/out/renderer/assets/{settings-memory-CvkppfHy.js → settings-memory-CJLG4aHW.js} +3 -3
  176. package/out/renderer/assets/settings-memory-CJLG4aHW.js.br +0 -0
  177. package/out/renderer/assets/settings-memory-CJLG4aHW.js.gz +0 -0
  178. package/out/renderer/assets/{settings-snippets-CO_jL3O3.js → settings-snippets-B4VcnD5Z.js} +6 -7
  179. package/out/renderer/assets/settings-snippets-B4VcnD5Z.js.br +0 -0
  180. package/out/renderer/assets/settings-snippets-B4VcnD5Z.js.gz +0 -0
  181. package/out/renderer/assets/settings-speech-to-text-DQ7lfkTu.js +1054 -0
  182. package/out/renderer/assets/settings-speech-to-text-DQ7lfkTu.js.br +0 -0
  183. package/out/renderer/assets/settings-speech-to-text-DQ7lfkTu.js.gz +0 -0
  184. package/out/renderer/assets/{settings-webui-5n5mI55N.js → settings-webui-DZf9O-6j.js} +2 -2
  185. package/out/renderer/assets/settings-webui-DZf9O-6j.js.br +0 -0
  186. package/out/renderer/assets/settings-webui-DZf9O-6j.js.gz +0 -0
  187. package/out/renderer/assets/{skills-installed-BqjN4mEl.js → skills-installed-Dp0r_4I-.js} +4 -4
  188. package/out/renderer/assets/skills-installed-Dp0r_4I-.js.br +0 -0
  189. package/out/renderer/assets/skills-installed-Dp0r_4I-.js.gz +0 -0
  190. package/out/renderer/assets/{skills-layout-C8b-pe9X.js → skills-layout-D-5rlY38.js} +2 -2
  191. package/out/renderer/assets/skills-layout-D-5rlY38.js.br +0 -0
  192. package/out/renderer/assets/skills-layout-D-5rlY38.js.gz +0 -0
  193. package/out/renderer/assets/{skills-skills-sh-Bh8KQ3PF.js → skills-skills-sh-CcLoIrSw.js} +4 -4
  194. package/out/renderer/assets/skills-skills-sh-CcLoIrSw.js.br +0 -0
  195. package/out/renderer/assets/skills-skills-sh-CcLoIrSw.js.gz +0 -0
  196. package/out/renderer/assets/{sortable.esm-DARmP-Qe.js → sortable.esm-knFxDx0Y.js} +1 -1
  197. package/out/renderer/assets/sortable.esm-knFxDx0Y.js.br +0 -0
  198. package/out/renderer/assets/sortable.esm-knFxDx0Y.js.gz +0 -0
  199. package/out/renderer/assets/{standard-schema-CtFhVVG9.js → standard-schema-dKXoCekr.js} +1 -1
  200. package/out/renderer/assets/standard-schema-dKXoCekr.js.br +0 -0
  201. package/out/renderer/assets/standard-schema-dKXoCekr.js.gz +0 -0
  202. package/out/renderer/assets/{stateDiagram-FHFEXIEX-Da2gV_KD.js → stateDiagram-FHFEXIEX-DWWz4PMv.js} +9 -9
  203. package/out/renderer/assets/stateDiagram-FHFEXIEX-DWWz4PMv.js.br +0 -0
  204. package/out/renderer/assets/stateDiagram-FHFEXIEX-DWWz4PMv.js.gz +0 -0
  205. package/out/renderer/assets/{stateDiagram-v2-QKLJ7IA2-D44mYiaY.js → stateDiagram-v2-QKLJ7IA2-Dm2qD5bg.js} +5 -5
  206. package/out/renderer/assets/{task-Ca7ur8ku.js → task-C5dyYbfn.js} +11 -12
  207. package/out/renderer/assets/task-C5dyYbfn.js.br +0 -0
  208. package/out/renderer/assets/task-C5dyYbfn.js.gz +0 -0
  209. package/out/renderer/assets/{textarea-BCC4Oh3S.js → textarea-DTqKlQbL.js} +1 -1
  210. package/out/renderer/assets/{timeline-definition-GMOUNBTQ-egFv4rLM.js → timeline-definition-GMOUNBTQ-A1tEoL9d.js} +3 -3
  211. package/out/renderer/assets/timeline-definition-GMOUNBTQ-A1tEoL9d.js.br +0 -0
  212. package/out/renderer/assets/timeline-definition-GMOUNBTQ-A1tEoL9d.js.gz +0 -0
  213. package/out/renderer/assets/{vennDiagram-DHZGUBPP-CnOs99wX.js → vennDiagram-DHZGUBPP-tNdYrJi_.js} +2 -2
  214. package/out/renderer/assets/vennDiagram-DHZGUBPP-tNdYrJi_.js.br +0 -0
  215. package/out/renderer/assets/vennDiagram-DHZGUBPP-tNdYrJi_.js.gz +0 -0
  216. package/out/renderer/assets/{wardley-RL74JXVD-Bb1llXhX.js → wardley-RL74JXVD-BxN5_Sp6.js} +4 -4
  217. package/out/renderer/assets/wardley-RL74JXVD-BxN5_Sp6.js.br +0 -0
  218. package/out/renderer/assets/wardley-RL74JXVD-BxN5_Sp6.js.gz +0 -0
  219. package/out/renderer/assets/{wardleyDiagram-NUSXRM2D-BupfUxsI.js → wardleyDiagram-NUSXRM2D-B_3jA8zU.js} +6 -6
  220. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-B_3jA8zU.js.br +0 -0
  221. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-B_3jA8zU.js.gz +0 -0
  222. package/out/renderer/assets/{wrench-Dj1S5dhM.js → wrench-7r-g9MUq.js} +1 -1
  223. package/out/renderer/assets/wrench-7r-g9MUq.js.br +0 -0
  224. package/out/renderer/assets/wrench-7r-g9MUq.js.gz +0 -0
  225. package/out/renderer/assets/{xlsx-view-DIarHecR.js → xlsx-view-Bv0YhA5m.js} +10 -10
  226. package/out/renderer/assets/xlsx-view-Bv0YhA5m.js.br +0 -0
  227. package/out/renderer/assets/xlsx-view-Bv0YhA5m.js.gz +0 -0
  228. package/out/renderer/assets/{xychartDiagram-5P7HB3ND-CtPNxvT_.js → xychartDiagram-5P7HB3ND-NNVuzC4j.js} +3 -3
  229. package/out/renderer/assets/xychartDiagram-5P7HB3ND-NNVuzC4j.js.br +0 -0
  230. package/out/renderer/assets/xychartDiagram-5P7HB3ND-NNVuzC4j.js.gz +0 -0
  231. package/out/renderer/index.html +2 -2
  232. package/out/renderer/index.html.br +0 -0
  233. package/out/renderer/index.html.gz +0 -0
  234. package/out/server/main.js +602 -68
  235. package/package.json +3 -1
  236. package/resources/tree-sitter-wasm/tree-sitter-dart.wasm +0 -0
  237. package/out/renderer/assets/_baseUniq-DdWCC-Go.js.br +0 -0
  238. package/out/renderer/assets/_baseUniq-DdWCC-Go.js.gz +0 -0
  239. package/out/renderer/assets/arc-B_en4gJt.js.br +0 -0
  240. package/out/renderer/assets/arc-B_en4gJt.js.gz +0 -0
  241. package/out/renderer/assets/architectureDiagram-Q4EWVU46-W-l3dTvZ.js.br +0 -0
  242. package/out/renderer/assets/architectureDiagram-Q4EWVU46-W-l3dTvZ.js.gz +0 -0
  243. package/out/renderer/assets/automation--izxbhlj.js.br +0 -0
  244. package/out/renderer/assets/automation--izxbhlj.js.gz +0 -0
  245. package/out/renderer/assets/blockDiagram-DXYQGD6D-BdxXOr8Y.js.br +0 -0
  246. package/out/renderer/assets/blockDiagram-DXYQGD6D-BdxXOr8Y.js.gz +0 -0
  247. package/out/renderer/assets/c4Diagram-AHTNJAMY-C_8XgPtT.js.br +0 -0
  248. package/out/renderer/assets/c4Diagram-AHTNJAMY-C_8XgPtT.js.gz +0 -0
  249. package/out/renderer/assets/chunk-4TB4RGXK-C7h57GNs.js.br +0 -0
  250. package/out/renderer/assets/chunk-4TB4RGXK-C7h57GNs.js.gz +0 -0
  251. package/out/renderer/assets/chunk-EDXVE4YY-BPjYyS5o.js.br +0 -0
  252. package/out/renderer/assets/chunk-EDXVE4YY-BPjYyS5o.js.gz +0 -0
  253. package/out/renderer/assets/chunk-OYMX7WX6-D5Q5ZCl0.js.br +0 -0
  254. package/out/renderer/assets/chunk-OYMX7WX6-D5Q5ZCl0.js.gz +0 -0
  255. package/out/renderer/assets/chunk-YZCP3GAM-AbfctYy8.js.br +0 -0
  256. package/out/renderer/assets/chunk-YZCP3GAM-AbfctYy8.js.gz +0 -0
  257. package/out/renderer/assets/clipboard-D6ZpW5GH.js +0 -15
  258. package/out/renderer/assets/code-editor-cp9haQUT.js.br +0 -0
  259. package/out/renderer/assets/code-editor-cp9haQUT.js.gz +0 -0
  260. package/out/renderer/assets/collapsible-BHMUDZxc.js.br +0 -0
  261. package/out/renderer/assets/collapsible-BHMUDZxc.js.gz +0 -0
  262. package/out/renderer/assets/context-menu-K6z5uSmg.js +0 -282
  263. package/out/renderer/assets/context-menu-K6z5uSmg.js.br +0 -0
  264. package/out/renderer/assets/context-menu-K6z5uSmg.js.gz +0 -0
  265. package/out/renderer/assets/cose-bilkent-S5V4N54A-CVcE9aWV.js.br +0 -0
  266. package/out/renderer/assets/cose-bilkent-S5V4N54A-CVcE9aWV.js.gz +0 -0
  267. package/out/renderer/assets/dagre-KV5264BT-zrX-TFsi.js.br +0 -0
  268. package/out/renderer/assets/dagre-KV5264BT-zrX-TFsi.js.gz +0 -0
  269. package/out/renderer/assets/diagram-5BDNPKRD-Ct9NrJP9.js.br +0 -0
  270. package/out/renderer/assets/diagram-5BDNPKRD-Ct9NrJP9.js.gz +0 -0
  271. package/out/renderer/assets/diagram-G4DWMVQ6-tTGWcCd_.js.br +0 -0
  272. package/out/renderer/assets/diagram-G4DWMVQ6-tTGWcCd_.js.gz +0 -0
  273. package/out/renderer/assets/diagram-MMDJMWI5-CpmcnN2B.js.br +0 -0
  274. package/out/renderer/assets/diagram-MMDJMWI5-CpmcnN2B.js.gz +0 -0
  275. package/out/renderer/assets/diagram-TYMM5635-DKTR2xS9.js.br +0 -0
  276. package/out/renderer/assets/diagram-TYMM5635-DKTR2xS9.js.gz +0 -0
  277. package/out/renderer/assets/erDiagram-SMLLAGMA-BW13EXAs.js.br +0 -0
  278. package/out/renderer/assets/erDiagram-SMLLAGMA-BW13EXAs.js.gz +0 -0
  279. package/out/renderer/assets/field-Be86bgEh.js.br +0 -0
  280. package/out/renderer/assets/field-Be86bgEh.js.gz +0 -0
  281. package/out/renderer/assets/flowDiagram-DWJPFMVM-C3oZAKxX.js.br +0 -0
  282. package/out/renderer/assets/flowDiagram-DWJPFMVM-C3oZAKxX.js.gz +0 -0
  283. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-BARJrpDB.js.br +0 -0
  284. package/out/renderer/assets/ganttDiagram-T4ZO3ILL-BARJrpDB.js.gz +0 -0
  285. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-D0gl3Row.js.br +0 -0
  286. package/out/renderer/assets/gitGraphDiagram-UUTBAWPF-D0gl3Row.js.gz +0 -0
  287. package/out/renderer/assets/graph-DB7hnlLW.js.br +0 -0
  288. package/out/renderer/assets/graph-DB7hnlLW.js.gz +0 -0
  289. package/out/renderer/assets/index-Co8mzhyV.js.br +0 -0
  290. package/out/renderer/assets/index-Co8mzhyV.js.gz +0 -0
  291. package/out/renderer/assets/index-iHYS74sQ.css +0 -382
  292. package/out/renderer/assets/index-iHYS74sQ.css.br +0 -0
  293. package/out/renderer/assets/index-iHYS74sQ.css.gz +0 -0
  294. package/out/renderer/assets/infoDiagram-42DDH7IO-BrfLG_LC.js.br +0 -0
  295. package/out/renderer/assets/infoDiagram-42DDH7IO-BrfLG_LC.js.gz +0 -0
  296. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-CO0cyvTq.js.br +0 -0
  297. package/out/renderer/assets/ishikawaDiagram-UXIWVN3A-CO0cyvTq.js.gz +0 -0
  298. package/out/renderer/assets/item-CvcokSWl.js.br +0 -0
  299. package/out/renderer/assets/item-CvcokSWl.js.gz +0 -0
  300. package/out/renderer/assets/journeyDiagram-VCZTEJTY-D3F2Iu5P.js.br +0 -0
  301. package/out/renderer/assets/journeyDiagram-VCZTEJTY-D3F2Iu5P.js.gz +0 -0
  302. package/out/renderer/assets/kanban-definition-6JOO6SKY-CC_drlaB.js.br +0 -0
  303. package/out/renderer/assets/kanban-definition-6JOO6SKY-CC_drlaB.js.gz +0 -0
  304. package/out/renderer/assets/layout-B_3n1To1.js.br +0 -0
  305. package/out/renderer/assets/layout-B_3n1To1.js.gz +0 -0
  306. package/out/renderer/assets/linear-AxwRZ_jw.js.br +0 -0
  307. package/out/renderer/assets/linear-AxwRZ_jw.js.gz +0 -0
  308. package/out/renderer/assets/mermaid-GHXKKRXX-DFOJYe_t.js.br +0 -0
  309. package/out/renderer/assets/mermaid-GHXKKRXX-DFOJYe_t.js.gz +0 -0
  310. package/out/renderer/assets/min-Dip7FmOo.js.br +0 -0
  311. package/out/renderer/assets/min-Dip7FmOo.js.gz +0 -0
  312. package/out/renderer/assets/mindmap-definition-QFDTVHPH-D9aiLrpe.js.br +0 -0
  313. package/out/renderer/assets/mindmap-definition-QFDTVHPH-D9aiLrpe.js.gz +0 -0
  314. package/out/renderer/assets/pieDiagram-DEJITSTG-BX_34lAP.js.br +0 -0
  315. package/out/renderer/assets/pieDiagram-DEJITSTG-BX_34lAP.js.gz +0 -0
  316. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-G09qfNO8.js.br +0 -0
  317. package/out/renderer/assets/quadrantDiagram-34T5L4WZ-G09qfNO8.js.gz +0 -0
  318. package/out/renderer/assets/requirementDiagram-MS252O5E-sJPY8r9J.js.br +0 -0
  319. package/out/renderer/assets/requirementDiagram-MS252O5E-sJPY8r9J.js.gz +0 -0
  320. package/out/renderer/assets/resizable-C5jomC3Y.js.br +0 -0
  321. package/out/renderer/assets/resizable-C5jomC3Y.js.gz +0 -0
  322. package/out/renderer/assets/sankeyDiagram-XADWPNL6-DHIS2ISZ.js.br +0 -0
  323. package/out/renderer/assets/sankeyDiagram-XADWPNL6-DHIS2ISZ.js.gz +0 -0
  324. package/out/renderer/assets/schedule-BoqPUAOI.js.br +0 -0
  325. package/out/renderer/assets/schedule-BoqPUAOI.js.gz +0 -0
  326. package/out/renderer/assets/sequenceDiagram-FGHM5R23-Boc12Em2.js.br +0 -0
  327. package/out/renderer/assets/sequenceDiagram-FGHM5R23-Boc12Em2.js.gz +0 -0
  328. package/out/renderer/assets/session-DgU3TDDV.js.br +0 -0
  329. package/out/renderer/assets/session-DgU3TDDV.js.gz +0 -0
  330. package/out/renderer/assets/setting-dialog-4pmkQ7WP.js.br +0 -0
  331. package/out/renderer/assets/setting-dialog-4pmkQ7WP.js.gz +0 -0
  332. package/out/renderer/assets/settings-agents-C4u0s-iR.js.br +0 -0
  333. package/out/renderer/assets/settings-agents-C4u0s-iR.js.gz +0 -0
  334. package/out/renderer/assets/settings-general-BkLSJoHB.js.br +0 -0
  335. package/out/renderer/assets/settings-general-BkLSJoHB.js.gz +0 -0
  336. package/out/renderer/assets/settings-ilink-6ZrgPpeO.js.br +0 -0
  337. package/out/renderer/assets/settings-ilink-6ZrgPpeO.js.gz +0 -0
  338. package/out/renderer/assets/settings-image-generation-B6YIO6o_.js.br +0 -0
  339. package/out/renderer/assets/settings-image-generation-B6YIO6o_.js.gz +0 -0
  340. package/out/renderer/assets/settings-layout-Cf7GMXFZ.js.br +0 -0
  341. package/out/renderer/assets/settings-layout-Cf7GMXFZ.js.gz +0 -0
  342. package/out/renderer/assets/settings-mcp-CJvL5Siz.js.br +0 -0
  343. package/out/renderer/assets/settings-mcp-CJvL5Siz.js.gz +0 -0
  344. package/out/renderer/assets/settings-memory-CvkppfHy.js.br +0 -0
  345. package/out/renderer/assets/settings-memory-CvkppfHy.js.gz +0 -0
  346. package/out/renderer/assets/settings-snippets-CO_jL3O3.js.br +0 -0
  347. package/out/renderer/assets/settings-snippets-CO_jL3O3.js.gz +0 -0
  348. package/out/renderer/assets/settings-webui-5n5mI55N.js.br +0 -0
  349. package/out/renderer/assets/settings-webui-5n5mI55N.js.gz +0 -0
  350. package/out/renderer/assets/skills-installed-BqjN4mEl.js.br +0 -0
  351. package/out/renderer/assets/skills-installed-BqjN4mEl.js.gz +0 -0
  352. package/out/renderer/assets/skills-layout-C8b-pe9X.js.br +0 -0
  353. package/out/renderer/assets/skills-layout-C8b-pe9X.js.gz +0 -0
  354. package/out/renderer/assets/skills-skills-sh-Bh8KQ3PF.js.br +0 -0
  355. package/out/renderer/assets/skills-skills-sh-Bh8KQ3PF.js.gz +0 -0
  356. package/out/renderer/assets/sortable.esm-DARmP-Qe.js.br +0 -0
  357. package/out/renderer/assets/sortable.esm-DARmP-Qe.js.gz +0 -0
  358. package/out/renderer/assets/standard-schema-CtFhVVG9.js.br +0 -0
  359. package/out/renderer/assets/standard-schema-CtFhVVG9.js.gz +0 -0
  360. package/out/renderer/assets/stateDiagram-FHFEXIEX-Da2gV_KD.js.br +0 -0
  361. package/out/renderer/assets/stateDiagram-FHFEXIEX-Da2gV_KD.js.gz +0 -0
  362. package/out/renderer/assets/task-Ca7ur8ku.js.br +0 -0
  363. package/out/renderer/assets/task-Ca7ur8ku.js.gz +0 -0
  364. package/out/renderer/assets/timeline-definition-GMOUNBTQ-egFv4rLM.js.br +0 -0
  365. package/out/renderer/assets/timeline-definition-GMOUNBTQ-egFv4rLM.js.gz +0 -0
  366. package/out/renderer/assets/vennDiagram-DHZGUBPP-CnOs99wX.js.br +0 -0
  367. package/out/renderer/assets/vennDiagram-DHZGUBPP-CnOs99wX.js.gz +0 -0
  368. package/out/renderer/assets/wardley-RL74JXVD-Bb1llXhX.js.br +0 -0
  369. package/out/renderer/assets/wardley-RL74JXVD-Bb1llXhX.js.gz +0 -0
  370. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-BupfUxsI.js.br +0 -0
  371. package/out/renderer/assets/wardleyDiagram-NUSXRM2D-BupfUxsI.js.gz +0 -0
  372. package/out/renderer/assets/wrench-Dj1S5dhM.js.br +0 -0
  373. package/out/renderer/assets/wrench-Dj1S5dhM.js.gz +0 -0
  374. package/out/renderer/assets/xlsx-view-DIarHecR.js.br +0 -0
  375. package/out/renderer/assets/xlsx-view-DIarHecR.js.gz +0 -0
  376. package/out/renderer/assets/xychartDiagram-5P7HB3ND-CtPNxvT_.js.br +0 -0
  377. package/out/renderer/assets/xychartDiagram-5P7HB3ND-CtPNxvT_.js.gz +0 -0
@@ -231,6 +231,25 @@ function readSettings() {
231
231
  model: p.model,
232
232
  active: typeof p.active === "boolean" ? p.active : false
233
233
  })) : [];
234
+ const speechToText = Array.isArray(rawObj?.speechToText) ? rawObj.speechToText.filter((value) => isObject(value)).filter((value) => {
235
+ const provider = value.provider;
236
+ return typeof value.id === "string" && typeof value.name === "string" && typeof value.apiKey === "string" && (provider === "volcengine" || provider === "dashscope" || provider === "openai" || provider === "iflytek");
237
+ }).map((value) => ({
238
+ id: value.id,
239
+ name: value.name,
240
+ provider: value.provider,
241
+ apiKey: value.apiKey,
242
+ appId: typeof value.appId === "string" ? value.appId : void 0,
243
+ apiSecret: typeof value.apiSecret === "string" ? value.apiSecret : void 0,
244
+ resourceId: typeof value.resourceId === "string" ? value.resourceId : void 0,
245
+ model: typeof value.model === "string" ? value.model : void 0,
246
+ baseUrl: typeof value.baseUrl === "string" ? value.baseUrl : void 0,
247
+ workspaceId: typeof value.workspaceId === "string" ? value.workspaceId : void 0,
248
+ region: value.region === "cn-beijing" || value.region === "ap-southeast-1" ? value.region : void 0,
249
+ workspace: typeof value.workspace === "string" ? value.workspace : void 0,
250
+ language: typeof value.language === "string" ? value.language : void 0,
251
+ active: typeof value.active === "boolean" ? value.active : false
252
+ })) : [];
234
253
  const editor = (() => {
235
254
  const raw2 = rawObj && isObject(rawObj.editor) ? rawObj.editor : null;
236
255
  if (raw2 && typeof raw2.name === "string" && raw2.name.trim()) {
@@ -249,7 +268,8 @@ function readSettings() {
249
268
  sound,
250
269
  proxy,
251
270
  snippets,
252
- imageGeneration
271
+ imageGeneration,
272
+ speechToText
253
273
  };
254
274
  } catch {
255
275
  return DEFAULT_SETTINGS;
@@ -351,6 +371,22 @@ function getSettings() {
351
371
  extraBody: p.extraBody ?? void 0,
352
372
  model: p.model,
353
373
  active: p.active
374
+ })),
375
+ speechToText: (meta.speechToText ?? []).map((p) => ({
376
+ id: p.id,
377
+ name: p.name,
378
+ provider: p.provider,
379
+ apiKey: p.apiKey,
380
+ appId: p.appId,
381
+ apiSecret: p.apiSecret,
382
+ resourceId: p.resourceId,
383
+ model: p.model,
384
+ baseUrl: p.baseUrl,
385
+ workspaceId: p.workspaceId,
386
+ region: p.region,
387
+ workspace: p.workspace,
388
+ language: p.language,
389
+ active: p.active
354
390
  }))
355
391
  };
356
392
  }
@@ -506,7 +542,23 @@ function updateSettings(settings) {
506
542
  extraBody: p.extraBody ?? void 0,
507
543
  model: p.model,
508
544
  active: p.active
509
- })) : prevMeta.imageGeneration
545
+ })) : prevMeta.imageGeneration,
546
+ speechToText: settings.speechToText ? settings.speechToText.map((p) => ({
547
+ id: p.id,
548
+ name: p.name,
549
+ provider: p.provider,
550
+ apiKey: p.apiKey,
551
+ appId: p.appId?.trim() || void 0,
552
+ apiSecret: p.apiSecret?.trim() || void 0,
553
+ resourceId: p.resourceId?.trim() || void 0,
554
+ model: p.model?.trim() || void 0,
555
+ baseUrl: p.baseUrl?.trim() || void 0,
556
+ workspaceId: p.workspaceId?.trim() || void 0,
557
+ region: p.region,
558
+ workspace: p.workspace?.trim() || void 0,
559
+ language: p.language?.trim() || void 0,
560
+ active: p.active
561
+ })) : prevMeta.speechToText
510
562
  };
511
563
  writeSettings(meta);
512
564
  }
@@ -913,6 +965,35 @@ function readTerminalOutput(sessionIdOrSubSessionId, terminalId) {
913
965
  if (!existsSync3(filePath)) return null;
914
966
  return readFileSync3(filePath, "utf-8");
915
967
  }
968
+ function appendTokenUsage(sessionId, record) {
969
+ const dir = sessionDir(sessionId);
970
+ if (!dir) return;
971
+ mkdirSync3(dir, { recursive: true });
972
+ const filePath = join5(dir, "token-usage.jsonl");
973
+ appendFileSync(filePath, JSON.stringify(record) + "\n");
974
+ }
975
+ function isSessionTokenUsage(value) {
976
+ if (!value || typeof value !== "object") return false;
977
+ const record = value;
978
+ if (!record || typeof record.timestamp !== "number" || !record.usage) return false;
979
+ if (typeof record.usage !== "object") return false;
980
+ const usage = record.usage;
981
+ return typeof usage.totalTokens === "number" && typeof usage.inputTokens === "number" && typeof usage.outputTokens === "number";
982
+ }
983
+ function readTokenUsage(sessionId) {
984
+ const dir = sessionDir(sessionId);
985
+ if (!dir) return [];
986
+ const filePath = join5(dir, "token-usage.jsonl");
987
+ if (!existsSync3(filePath)) return [];
988
+ const content = readFileSync3(filePath, "utf-8");
989
+ return content.split("\n").filter((line) => line.trim()).map((line) => {
990
+ try {
991
+ return JSON.parse(line);
992
+ } catch {
993
+ return null;
994
+ }
995
+ }).filter((value) => isSessionTokenUsage(value));
996
+ }
916
997
  var storageOps = {
917
998
  getSettings,
918
999
  updateSettings,
@@ -932,7 +1013,9 @@ var storageOps = {
932
1013
  appendSessionMessage,
933
1014
  readSessionMessages,
934
1015
  appendTerminalOutput,
935
- readTerminalOutput
1016
+ readTerminalOutput,
1017
+ appendTokenUsage,
1018
+ readTokenUsage
936
1019
  };
937
1020
 
938
1021
  // src/backend/i18n.ts
@@ -4918,7 +5001,7 @@ async function executeSubagent(params, subSessionId, taskName, taskPrompt, signa
4918
5001
  }
4919
5002
  return accumulatedText || "[No output produced]";
4920
5003
  } catch (error) {
4921
- const errorMessage = error instanceof Error ? error.message : String(error);
5004
+ const errorMessage2 = error instanceof Error ? error.message : String(error);
4922
5005
  const conn3 = params.getConnection();
4923
5006
  if (conn3) {
4924
5007
  await sendSubagentStatusUpdate(
@@ -4936,7 +5019,7 @@ async function executeSubagent(params, subSessionId, taskName, taskPrompt, signa
4936
5019
  sessionUpdate: "agent_message_chunk",
4937
5020
  content: { type: "text", text: `
4938
5021
 
4939
- **Error:** ${errorMessage}` }
5022
+ **Error:** ${errorMessage2}` }
4940
5023
  }
4941
5024
  });
4942
5025
  }
@@ -4944,7 +5027,7 @@ async function executeSubagent(params, subSessionId, taskName, taskPrompt, signa
4944
5027
  if (signal.aborted) {
4945
5028
  return accumulatedText || "[Cancelled]";
4946
5029
  }
4947
- return accumulatedText || `[Error: ${errorMessage}]`;
5030
+ return accumulatedText || `[Error: ${errorMessage2}]`;
4948
5031
  } finally {
4949
5032
  await closeACPClientTools(subAcp);
4950
5033
  }
@@ -5049,6 +5132,183 @@ Results from all sub-agents are returned when they all complete.`,
5049
5132
  };
5050
5133
  }
5051
5134
 
5135
+ // src/agents/token-breakdown.ts
5136
+ var _countTokens = null;
5137
+ var _formatFunctionDefinitions = null;
5138
+ async function getTokenizer() {
5139
+ if (!_countTokens) {
5140
+ const mod = await import("gpt-tokenizer");
5141
+ _countTokens = mod.countTokens;
5142
+ }
5143
+ if (!_formatFunctionDefinitions) {
5144
+ const mod = await import("gpt-tokenizer/esm/functionCalling");
5145
+ _formatFunctionDefinitions = mod.formatFunctionDefinitions;
5146
+ }
5147
+ return {
5148
+ countTokens: _countTokens,
5149
+ formatFunctionDefinitions: _formatFunctionDefinitions
5150
+ };
5151
+ }
5152
+ async function estimateToolsDefinitionTokens(tools) {
5153
+ const { countTokens, formatFunctionDefinitions } = await getTokenizer();
5154
+ const entries = Object.entries(tools);
5155
+ if (entries.length === 0) {
5156
+ return { total: 0, perTool: [] };
5157
+ }
5158
+ const functionDefs = entries.map(([name, tool4]) => ({
5159
+ name,
5160
+ description: typeof tool4.description === "string" ? tool4.description : void 0,
5161
+ parameters: extractJsonSchema(tool4)
5162
+ }));
5163
+ const totalFormatted = formatFunctionDefinitions(functionDefs);
5164
+ const total = countTokens(totalFormatted) + 9;
5165
+ const emptyNamespaceTokens = countTokens("namespace functions {\n\n} // namespace functions");
5166
+ const perTool = functionDefs.map((fn) => {
5167
+ const singleFormatted = formatFunctionDefinitions([fn]);
5168
+ const singleTotal = countTokens(singleFormatted) + 9;
5169
+ return {
5170
+ name: fn.name,
5171
+ tokens: Math.max(0, singleTotal - emptyNamespaceTokens)
5172
+ };
5173
+ });
5174
+ return { total, perTool };
5175
+ }
5176
+ async function estimateInputComposition(params) {
5177
+ const { countTokens } = await getTokenizer();
5178
+ const systemPromptTokens = countTokens(params.systemPrompt) + 3;
5179
+ const toolsDef = await estimateToolsDefinitionTokens(params.tools);
5180
+ const historyTokens = params.historyText ? countTokens(params.historyText) : 0;
5181
+ const userMessageTokens = countTokens(params.userMessageText) + 3;
5182
+ const estimatedTotal = systemPromptTokens + toolsDef.total + historyTokens + userMessageTokens + 3;
5183
+ return {
5184
+ systemPrompt: systemPromptTokens,
5185
+ toolsDefinition: toolsDef,
5186
+ history: historyTokens,
5187
+ userMessage: userMessageTokens,
5188
+ userMessageText: params.userMessageText,
5189
+ estimatedTotal,
5190
+ delta: params.actualInputTokens - estimatedTotal
5191
+ };
5192
+ }
5193
+ function buildStepBreakdown(steps) {
5194
+ const stepDetails = steps.map((step, idx) => {
5195
+ const next = steps[idx + 1];
5196
+ const usage = step.usage;
5197
+ const toolCallEstimates = buildToolCallEstimates(step, next);
5198
+ return {
5199
+ stepNumber: step.stepNumber,
5200
+ finishReason: step.finishReason,
5201
+ inputTokens: usage.inputTokens ?? 0,
5202
+ outputTokens: usage.outputTokens ?? 0,
5203
+ inputDetails: {
5204
+ cacheReadTokens: usage.inputTokenDetails?.cacheReadTokens ?? void 0,
5205
+ cacheWriteTokens: usage.inputTokenDetails?.cacheWriteTokens ?? void 0,
5206
+ noCacheTokens: usage.inputTokenDetails?.noCacheTokens ?? void 0
5207
+ },
5208
+ outputDetails: {
5209
+ textTokens: usage.outputTokenDetails?.textTokens ?? void 0,
5210
+ reasoningTokens: usage.outputTokenDetails?.reasoningTokens ?? void 0
5211
+ },
5212
+ toolCalls: toolCallEstimates,
5213
+ performance: {
5214
+ stepTimeMs: step.performance.stepTimeMs,
5215
+ responseTimeMs: step.performance.responseTimeMs,
5216
+ timeToFirstOutputMs: step.performance.timeToFirstOutputMs ?? void 0,
5217
+ outputTokensPerSecond: step.performance.outputTokensPerSecond ?? void 0
5218
+ }
5219
+ };
5220
+ });
5221
+ const totalTimeMs = steps.reduce((sum, s) => sum + s.performance.stepTimeMs, 0);
5222
+ const lastStep = steps[steps.length - 1];
5223
+ const effectiveOutputTokensPerSecond = lastStep?.performance.effectiveOutputTokensPerSecond ?? 0;
5224
+ return {
5225
+ steps: stepDetails,
5226
+ performance: { totalTimeMs, effectiveOutputTokensPerSecond }
5227
+ };
5228
+ }
5229
+ function buildToolCallEstimates(step, next) {
5230
+ if (step.toolCalls.length === 0) return [];
5231
+ const usage = step.usage;
5232
+ const outputTokens = usage.outputTokens ?? 0;
5233
+ const textTokens = usage.outputTokenDetails?.textTokens ?? 0;
5234
+ const reasoningTokens = usage.outputTokenDetails?.reasoningTokens ?? 0;
5235
+ const totalToolCallOutput = Math.max(0, outputTokens - textTokens - reasoningTokens);
5236
+ let totalToolResultInput = 0;
5237
+ if (next) {
5238
+ const nextInput = next.usage.inputTokens ?? 0;
5239
+ const currentInput = usage.inputTokens ?? 0;
5240
+ const currentOutput = usage.outputTokens ?? 0;
5241
+ totalToolResultInput = Math.max(0, nextInput - currentInput - currentOutput);
5242
+ }
5243
+ const count = step.toolCalls.length;
5244
+ const toolExecutionMs = step.performance.toolExecutionMs;
5245
+ return step.toolCalls.map((tc) => ({
5246
+ toolName: tc.toolName,
5247
+ args: serializeToolCallArgs(tc.input),
5248
+ argumentsOutputTokens: Math.round(totalToolCallOutput / count),
5249
+ resultInputTokens: Math.round(totalToolResultInput / count),
5250
+ executionMs: toolExecutionMs?.[tc.toolCallId] ?? void 0
5251
+ }));
5252
+ }
5253
+ function serializeToolCallArgs(input) {
5254
+ if (input == null) return "";
5255
+ if (typeof input === "string") return input;
5256
+ try {
5257
+ return JSON.stringify(input);
5258
+ } catch {
5259
+ return String(input);
5260
+ }
5261
+ }
5262
+ function extractJsonSchema(tool4) {
5263
+ const schema = tool4.inputSchema;
5264
+ if (!schema) return void 0;
5265
+ if (typeof schema === "object" && schema !== null && "jsonSchema" in schema) {
5266
+ const jsonSchema = schema.jsonSchema;
5267
+ if (typeof jsonSchema === "object" && jsonSchema !== null) {
5268
+ return jsonSchema;
5269
+ }
5270
+ }
5271
+ if (typeof schema === "object" && schema !== null && "_def" in schema) {
5272
+ return void 0;
5273
+ }
5274
+ if (typeof schema === "object" && schema !== null) {
5275
+ return schema;
5276
+ }
5277
+ return void 0;
5278
+ }
5279
+ function serializeMessagesForCounting(messages) {
5280
+ const serializedMessages = [];
5281
+ for (const msg of messages) {
5282
+ const serializedParts = [];
5283
+ if (typeof msg.content === "string") {
5284
+ serializedParts.push(msg.content);
5285
+ } else if (Array.isArray(msg.content)) {
5286
+ for (const part of msg.content) {
5287
+ if (typeof part === "string") {
5288
+ serializedParts.push(part);
5289
+ continue;
5290
+ }
5291
+ if (part && typeof part === "object" && "text" in part) {
5292
+ serializedParts.push(String(part.text));
5293
+ continue;
5294
+ }
5295
+ if (part != null) {
5296
+ const serializedPart = JSON.stringify(part);
5297
+ if (serializedPart !== void 0) serializedParts.push(serializedPart);
5298
+ }
5299
+ }
5300
+ } else if (msg.content != null) {
5301
+ const serializedContent = JSON.stringify(msg.content);
5302
+ if (serializedContent !== void 0) serializedParts.push(serializedContent);
5303
+ }
5304
+ if (serializedParts.length > 0) {
5305
+ const role = msg.role ? `[${msg.role}] ` : "";
5306
+ serializedMessages.push(`${role}${serializedParts.join("\n")}`);
5307
+ }
5308
+ }
5309
+ return serializedMessages.join("\n");
5310
+ }
5311
+
5052
5312
  // src/agents/openai-compatible-agent.ts
5053
5313
  var MODEL_CONFIG_ID = "model";
5054
5314
  var THOUGHT_LEVEL_CONFIG_ID = "thought_level";
@@ -5145,6 +5405,12 @@ function buildSafeUserMessage(prompt) {
5145
5405
  var AVAILABLE_COMMANDS = [
5146
5406
  { name: "compact", description: "Compress conversation context" }
5147
5407
  ];
5408
+ var COMPACT_PROMPT = `Compress the conversation into a structured markdown summary.
5409
+ Include: key decisions, code changes (with file paths),
5410
+ technical context, and pending tasks.
5411
+ Use headings and bullet points for clarity.
5412
+ Detect the user's commonly used language from the conversation history and respond in that language.
5413
+ Output only the summary.`;
5148
5414
  var OpenaiCompatibleAgent = class {
5149
5415
  sessions = /* @__PURE__ */ new Map();
5150
5416
  provider;
@@ -5323,16 +5589,70 @@ var OpenaiCompatibleAgent = class {
5323
5589
  );
5324
5590
  }
5325
5591
  }
5326
- async pushAvailableCommands(sessionId) {
5592
+ async pushUsageUpdate(sessionId, usageUpdate) {
5593
+ if (!this.connection) return;
5594
+ await this.connection.sessionUpdate({
5595
+ sessionId,
5596
+ update: {
5597
+ sessionUpdate: "usage_update",
5598
+ ...usageUpdate
5599
+ }
5600
+ });
5601
+ }
5602
+ async pushAvailableCommands(sessionId, commands) {
5327
5603
  if (!this.connection) return;
5328
5604
  await this.connection.sessionUpdate({
5329
5605
  sessionId,
5330
5606
  update: {
5331
5607
  sessionUpdate: "available_commands_update",
5332
- availableCommands: AVAILABLE_COMMANDS
5608
+ availableCommands: commands
5333
5609
  }
5334
5610
  });
5335
5611
  }
5612
+ /**
5613
+ * Build per-turn token breakdown metadata (best-effort).
5614
+ * Shared by normal prompts and slash commands (e.g. /compact).
5615
+ * Must never throw — breakdown is optional metadata that must not fail the prompt.
5616
+ */
5617
+ async buildTokenBreakdown(params) {
5618
+ try {
5619
+ const stepBreakdown = buildStepBreakdown(params.steps);
5620
+ const historyText = serializeMessagesForCounting(params.history);
5621
+ const userMessageText = serializeMessagesForCounting([params.userMessage]);
5622
+ const inputComposition = await estimateInputComposition({
5623
+ systemPrompt: params.systemPrompt,
5624
+ tools: params.tools,
5625
+ historyText,
5626
+ userMessageText,
5627
+ actualInputTokens: params.steps[0]?.usage.inputTokens ?? 0
5628
+ });
5629
+ return {
5630
+ stepCount: params.steps.length,
5631
+ inputComposition,
5632
+ steps: stepBreakdown.steps,
5633
+ performance: stepBreakdown.performance
5634
+ };
5635
+ } catch (error) {
5636
+ const message = error instanceof Error ? error.message : String(error);
5637
+ console.warn(
5638
+ `[OpenaiCompatibleAgent] Failed to build token breakdown for a prompt: ${message}`
5639
+ );
5640
+ return {
5641
+ stepCount: params.steps.length,
5642
+ inputComposition: {
5643
+ systemPrompt: 0,
5644
+ toolsDefinition: { total: 0, perTool: [] },
5645
+ history: 0,
5646
+ userMessage: 0,
5647
+ userMessageText: "",
5648
+ estimatedTotal: 0,
5649
+ delta: 0
5650
+ },
5651
+ steps: [],
5652
+ performance: { totalTimeMs: 0, effectiveOutputTokensPerSecond: 0 }
5653
+ };
5654
+ }
5655
+ }
5336
5656
  async newSession(params) {
5337
5657
  const modelState = await this.getModels();
5338
5658
  const sessionId = randomUUID6();
@@ -5355,7 +5675,7 @@ var OpenaiCompatibleAgent = class {
5355
5675
  this.sessions.set(sessionId, session);
5356
5676
  await this.persistSessionState(session);
5357
5677
  setTimeout(() => {
5358
- this.pushAvailableCommands(sessionId).catch(() => {
5678
+ this.pushAvailableCommands(sessionId, AVAILABLE_COMMANDS).catch(() => {
5359
5679
  });
5360
5680
  }, 500);
5361
5681
  return {
@@ -5403,21 +5723,18 @@ var OpenaiCompatibleAgent = class {
5403
5723
  if (!currentModelExists) {
5404
5724
  active.modelId = modelState.currentModelId || null;
5405
5725
  }
5406
- if (persistedState) {
5407
- active.contextUsedTokens = persistedState.contextUsedTokens;
5408
- }
5409
- if (this.connection) {
5410
- await this.connection.sessionUpdate({
5411
- sessionId: params.sessionId,
5412
- update: {
5413
- sessionUpdate: "usage_update",
5414
- used: active.contextUsedTokens,
5415
- size: this.contextWindowTokens
5416
- }
5417
- });
5418
- }
5726
+ const contextUsageUpdate = {
5727
+ used: persistedState?.contextUsedTokens ?? 0,
5728
+ size: this.contextWindowTokens
5729
+ };
5730
+ active.contextUsedTokens = contextUsageUpdate.used;
5419
5731
  await this.persistSessionState(active);
5420
- await this.pushAvailableCommands(params.sessionId);
5732
+ setTimeout(() => {
5733
+ this.pushUsageUpdate(params.sessionId, contextUsageUpdate).catch(() => {
5734
+ });
5735
+ this.pushAvailableCommands(params.sessionId, AVAILABLE_COMMANDS).catch(() => {
5736
+ });
5737
+ }, 500);
5421
5738
  return {
5422
5739
  configOptions: await this.buildConfigOptions(active.modelId, active.thoughtLevel)
5423
5740
  };
@@ -5476,18 +5793,14 @@ var OpenaiCompatibleAgent = class {
5476
5793
  }
5477
5794
  return { stopReason: "end_turn" };
5478
5795
  }
5796
+ const historyBeforeCompact = session.history.slice();
5479
5797
  const summaryResult = await generateText2({
5480
5798
  model: this.provider.chatModel(session.modelId),
5481
5799
  messages: [
5482
- ...session.history,
5800
+ ...historyBeforeCompact,
5483
5801
  {
5484
5802
  role: "user",
5485
- content: `Compress the conversation into a structured markdown summary.
5486
- Include: key decisions, code changes (with file paths),
5487
- technical context, and pending tasks.
5488
- Use headings and bullet points for clarity.
5489
- Detect the user's commonly used language from the conversation history and respond in that language.
5490
- Output only the summary.`
5803
+ content: COMPACT_PROMPT
5491
5804
  }
5492
5805
  ],
5493
5806
  maxOutputTokens: 5e3
@@ -5516,18 +5829,28 @@ var OpenaiCompatibleAgent = class {
5516
5829
  const summaryUsage = summaryResult.finalStep.usage;
5517
5830
  const outputTokens = summaryUsage.outputTokens ?? 0;
5518
5831
  session.contextUsedTokens = outputTokens;
5519
- if (this.connection) {
5520
- await this.connection.sessionUpdate({
5521
- sessionId,
5522
- update: {
5523
- sessionUpdate: "usage_update",
5524
- used: session.contextUsedTokens,
5525
- size: this.contextWindowTokens
5526
- }
5527
- });
5528
- }
5832
+ await this.pushUsageUpdate(sessionId, {
5833
+ used: session.contextUsedTokens,
5834
+ size: this.contextWindowTokens
5835
+ });
5529
5836
  await this.persistSessionState(session);
5530
- return { stopReason: "end_turn" };
5837
+ const tokenBreakdown = await this.buildTokenBreakdown({
5838
+ systemPrompt: "",
5839
+ tools: {},
5840
+ history: historyBeforeCompact,
5841
+ userMessage: { role: "user", content: COMPACT_PROMPT },
5842
+ steps: summaryResult.steps
5843
+ });
5844
+ const usage = {
5845
+ totalTokens: summaryUsage.totalTokens ?? 0,
5846
+ inputTokens: summaryUsage.inputTokens ?? 0,
5847
+ outputTokens: summaryUsage.outputTokens ?? 0,
5848
+ thoughtTokens: summaryUsage.outputTokenDetails?.reasoningTokens,
5849
+ cachedReadTokens: summaryUsage.inputTokenDetails?.cacheReadTokens,
5850
+ cachedWriteTokens: summaryUsage.inputTokenDetails?.cacheWriteTokens,
5851
+ _meta: { fello: { tokenBreakdown } }
5852
+ };
5853
+ return { stopReason: "end_turn", usage };
5531
5854
  }
5532
5855
  async prompt(params) {
5533
5856
  const session = this.sessions.get(params.sessionId);
@@ -5626,15 +5949,16 @@ var OpenaiCompatibleAgent = class {
5626
5949
  getModel: () => this.provider.chatModel(session.modelId),
5627
5950
  parentSignal: abortController.signal
5628
5951
  });
5952
+ const allTools = {
5953
+ ...sharedTools,
5954
+ ...subagentTool,
5955
+ ...imageAnalysisTool
5956
+ };
5629
5957
  const result = streamText2({
5630
5958
  model: this.provider.chatModel(session.modelId),
5631
5959
  system: systemPrompt,
5632
5960
  messages: [...session.history, userMessage],
5633
- tools: {
5634
- ...sharedTools,
5635
- ...subagentTool,
5636
- ...imageAnalysisTool
5637
- },
5961
+ tools: allTools,
5638
5962
  stopWhen: isStepCount2(128),
5639
5963
  abortSignal: abortController.signal,
5640
5964
  providerOptions: {
@@ -5690,30 +6014,38 @@ var OpenaiCompatibleAgent = class {
5690
6014
  });
5691
6015
  }
5692
6016
  }
5693
- const response = await result.response;
5694
- session.history.push(userMessage, ...response.messages);
5695
- await this.appendSessionHistory(session.id, userMessage, ...response.messages);
5696
- const [turnUsage, finalStep] = await Promise.all([result.usage, result.finalStep]);
6017
+ const [turnUsage, finalStep, steps, responseMessages] = await Promise.all([
6018
+ result.usage,
6019
+ result.finalStep,
6020
+ result.steps,
6021
+ result.responseMessages
6022
+ ]);
5697
6023
  const finalStepUsage = finalStep.usage;
5698
- session.contextUsedTokens = (finalStepUsage.inputTokens ?? 0) + (finalStepUsage.outputTokens ?? 0);
6024
+ const contextUsedTokens = (finalStepUsage.inputTokens ?? 0) + (finalStepUsage.outputTokens ?? 0);
6025
+ const historyBeforeTurn = session.history.slice();
6026
+ session.history.push(userMessage, ...responseMessages);
6027
+ await this.appendSessionHistory(session.id, userMessage, ...responseMessages);
6028
+ session.contextUsedTokens = contextUsedTokens;
6029
+ const tokenBreakdown = await this.buildTokenBreakdown({
6030
+ systemPrompt,
6031
+ tools: allTools,
6032
+ history: historyBeforeTurn,
6033
+ userMessage,
6034
+ steps
6035
+ });
5699
6036
  const usage = {
5700
6037
  totalTokens: turnUsage.totalTokens ?? 0,
5701
6038
  inputTokens: turnUsage.inputTokens ?? 0,
5702
6039
  outputTokens: turnUsage.outputTokens ?? 0,
5703
6040
  thoughtTokens: turnUsage.outputTokenDetails?.reasoningTokens,
5704
6041
  cachedReadTokens: turnUsage.inputTokenDetails?.cacheReadTokens,
5705
- cachedWriteTokens: turnUsage.inputTokenDetails?.cacheWriteTokens
6042
+ cachedWriteTokens: turnUsage.inputTokenDetails?.cacheWriteTokens,
6043
+ _meta: { fello: { tokenBreakdown } }
5706
6044
  };
5707
- if (this.connection) {
5708
- await this.connection.sessionUpdate({
5709
- sessionId: params.sessionId,
5710
- update: {
5711
- sessionUpdate: "usage_update",
5712
- used: session.contextUsedTokens,
5713
- size: this.contextWindowTokens
5714
- }
5715
- });
5716
- }
6045
+ await this.pushUsageUpdate(params.sessionId, {
6046
+ used: session.contextUsedTokens,
6047
+ size: this.contextWindowTokens
6048
+ });
5717
6049
  return {
5718
6050
  stopReason: "end_turn",
5719
6051
  usage
@@ -9246,6 +9578,11 @@ function createSessionModule(ctx, deps) {
9246
9578
  if (!session) throw new Error("Session does not exist");
9247
9579
  return { messages: notif.mergeNotifications(storage.readSessionMessages(sessionId)) };
9248
9580
  }
9581
+ async function getSessionTokenUsage({ sessionId }) {
9582
+ const session = storage.getSession(sessionId);
9583
+ if (!session) throw new Error("Session does not exist");
9584
+ return { records: storage.readTokenUsage(sessionId) };
9585
+ }
9249
9586
  async function sendPrompt({
9250
9587
  sessionId,
9251
9588
  contents
@@ -9356,6 +9693,15 @@ function createSessionModule(ctx, deps) {
9356
9693
  isStreaming: false,
9357
9694
  ...promptResponse?.usage ? { lastTurnUsage: promptResponse.usage } : {}
9358
9695
  });
9696
+ if (promptResponse?.usage?._meta) {
9697
+ try {
9698
+ storage.appendTokenUsage(sessionId, {
9699
+ timestamp: Date.now(),
9700
+ usage: promptResponse.usage
9701
+ });
9702
+ } catch {
9703
+ }
9704
+ }
9359
9705
  const updated2 = storage.getSession(sessionId);
9360
9706
  if (updated2) sendEvent("session-changed", { session: updated2 });
9361
9707
  const bridge = ilinkState.getBridge();
@@ -9629,6 +9975,7 @@ function createSessionModule(ctx, deps) {
9629
9975
  newSession,
9630
9976
  loadSession,
9631
9977
  getSessionHistory,
9978
+ getSessionTokenUsage,
9632
9979
  sendPrompt,
9633
9980
  cancelPrompt,
9634
9981
  updateSession: updateSession2,
@@ -10421,13 +10768,13 @@ function createAutomationModule(ctx, deps) {
10421
10768
  sendEvent("task-update", { scheduleId, task });
10422
10769
  return task;
10423
10770
  } catch (err) {
10424
- const errorMessage = err instanceof Error ? err.message : String(err);
10771
+ const errorMessage2 = err instanceof Error ? err.message : String(err);
10425
10772
  task.completedAt = Date.now();
10426
10773
  task.status = "error";
10427
- task.error = errorMessage;
10774
+ task.error = errorMessage2;
10428
10775
  store.saveTask(scheduleId, task);
10429
10776
  sendEvent("task-update", { scheduleId, task });
10430
- console.error(`[Automation] Task failed:`, errorMessage);
10777
+ console.error(`[Automation] Task failed:`, errorMessage2);
10431
10778
  return task;
10432
10779
  } finally {
10433
10780
  runningTasks.delete(scheduleId);
@@ -11074,7 +11421,7 @@ async function callOpenAICompatibleApi(provider, request) {
11074
11421
  }
11075
11422
  function createImageGenerationModule(ctx, deps) {
11076
11423
  const { storage } = ctx;
11077
- function getActiveProvider() {
11424
+ function getActiveProvider2() {
11078
11425
  const settings = storage.getSettings();
11079
11426
  const provider = settings.imageGeneration?.find((p) => p.active);
11080
11427
  if (!provider) {
@@ -11085,7 +11432,7 @@ function createImageGenerationModule(ctx, deps) {
11085
11432
  return provider;
11086
11433
  }
11087
11434
  async function generateImage(sessionId, request) {
11088
- const provider = getActiveProvider();
11435
+ const provider = getActiveProvider2();
11089
11436
  const apiResult = await callOpenAICompatibleApi(provider, request);
11090
11437
  const shareDir = storage.sessionShareDir(sessionId);
11091
11438
  if (!shareDir) throw new Error(`Session not found: ${sessionId}`);
@@ -11483,6 +11830,178 @@ function createToolboxModule(_ctx) {
11483
11830
  };
11484
11831
  }
11485
11832
 
11833
+ // src/backend/speech/manager.ts
11834
+ import { Buffer as Buffer2 } from "node:buffer";
11835
+ import {
11836
+ createASRClient
11837
+ } from "unified-realtime-asr";
11838
+ var DEFAULT_DASHSCOPE_MODEL = "fun-asr-flash-8k-realtime";
11839
+ var DEFAULT_OPENAI_MODEL = "gpt-4o-transcribe";
11840
+ function optionalString(value) {
11841
+ const trimmed = value?.trim();
11842
+ return trimmed || void 0;
11843
+ }
11844
+ function required(value, name) {
11845
+ const result = optionalString(value);
11846
+ if (!result) throw new Error(`\u5B9E\u65F6\u8BED\u97F3\u8BC6\u522B\u914D\u7F6E\u7F3A\u5C11 ${name}\u3002`);
11847
+ return result;
11848
+ }
11849
+ function buildOptions(provider) {
11850
+ return {
11851
+ language: optionalString(provider.language) ?? "zh-CN",
11852
+ sampleRate: 16e3,
11853
+ channels: 1,
11854
+ format: "pcm",
11855
+ interimResults: true,
11856
+ punctuation: true,
11857
+ autoReconnect: false,
11858
+ transcriptionModel: provider.provider === "openai" ? optionalString(provider.model) ?? DEFAULT_OPENAI_MODEL : void 0
11859
+ };
11860
+ }
11861
+ function buildConfig(provider) {
11862
+ const options = buildOptions(provider);
11863
+ const url = optionalString(provider.baseUrl);
11864
+ switch (provider.provider) {
11865
+ case "volcengine":
11866
+ return {
11867
+ provider: "volcengine",
11868
+ apiKey: required(provider.apiKey, "API Key"),
11869
+ resourceId: optionalString(provider.resourceId),
11870
+ appId: optionalString(provider.appId),
11871
+ url,
11872
+ options
11873
+ };
11874
+ case "dashscope":
11875
+ return {
11876
+ provider: "dashscope",
11877
+ apiKey: required(provider.apiKey, "API Key"),
11878
+ model: optionalString(provider.model) ?? DEFAULT_DASHSCOPE_MODEL,
11879
+ workspaceId: optionalString(provider.workspaceId),
11880
+ region: provider.region,
11881
+ workspace: optionalString(provider.workspace),
11882
+ url,
11883
+ options
11884
+ };
11885
+ case "openai":
11886
+ return {
11887
+ provider: "openai",
11888
+ apiKey: required(provider.apiKey, "API Key"),
11889
+ url,
11890
+ options
11891
+ };
11892
+ case "iflytek":
11893
+ return {
11894
+ provider: "iflytek",
11895
+ appId: required(provider.appId, "App ID"),
11896
+ apiKey: required(provider.apiKey, "API Key"),
11897
+ apiSecret: required(provider.apiSecret, "API Secret"),
11898
+ url,
11899
+ options
11900
+ };
11901
+ }
11902
+ }
11903
+ function getActiveProvider(ctx) {
11904
+ const provider = ctx.storage.getSettings().speechToText.find((item) => item.active);
11905
+ if (!provider) {
11906
+ throw new Error("\u8BF7\u5148\u5728\u8BBE\u7F6E \u2192 \u8BED\u97F3\u8BC6\u522B\u4E2D\u914D\u7F6E\u5E76\u542F\u7528\u4E00\u4E2A Provider\u3002");
11907
+ }
11908
+ return provider;
11909
+ }
11910
+ function errorMessage(error) {
11911
+ return error instanceof Error ? error.message : String(error);
11912
+ }
11913
+ function createAsrManager(ctx) {
11914
+ const sessions = /* @__PURE__ */ new Map();
11915
+ const keyOf2 = (clientId, asrSessionId) => `${clientId}:${asrSessionId}`;
11916
+ const emitError = (session, error) => {
11917
+ ctx.sendEvent("asr-error", {
11918
+ clientId: session.clientId,
11919
+ asrSessionId: session.asrSessionId,
11920
+ message: errorMessage(error)
11921
+ });
11922
+ };
11923
+ const emitTranscript = (session, transcript) => {
11924
+ ctx.sendEvent("asr-transcript", {
11925
+ clientId: session.clientId,
11926
+ asrSessionId: session.asrSessionId,
11927
+ text: transcript.text,
11928
+ isFinal: transcript.isFinal,
11929
+ id: transcript.id,
11930
+ index: transcript.index,
11931
+ speaker: transcript.speaker
11932
+ });
11933
+ };
11934
+ return {
11935
+ async start(clientId, asrSessionId) {
11936
+ const key = keyOf2(clientId, asrSessionId);
11937
+ if (sessions.has(key)) return { ok: true };
11938
+ const provider = getActiveProvider(ctx);
11939
+ const client2 = createASRClient(buildConfig(provider));
11940
+ const active = { clientId, asrSessionId, client: client2 };
11941
+ sessions.set(key, active);
11942
+ client2.on("transcript", (transcript) => {
11943
+ if (sessions.get(key) === active) emitTranscript(active, transcript);
11944
+ });
11945
+ client2.on("error", (error) => {
11946
+ if (sessions.get(key) === active) emitError(active, error);
11947
+ });
11948
+ client2.on("close", (info) => {
11949
+ if (sessions.get(key) !== active) return;
11950
+ sessions.delete(key);
11951
+ ctx.sendEvent("asr-closed", {
11952
+ clientId,
11953
+ asrSessionId,
11954
+ code: info?.code,
11955
+ reason: info?.reason
11956
+ });
11957
+ });
11958
+ try {
11959
+ await client2.connect();
11960
+ return { ok: true };
11961
+ } catch (error) {
11962
+ sessions.delete(key);
11963
+ client2.removeAllListeners();
11964
+ throw new Error(errorMessage(error));
11965
+ }
11966
+ },
11967
+ frame(clientId, asrSessionId, audioB64) {
11968
+ const active = sessions.get(keyOf2(clientId, asrSessionId));
11969
+ if (!active) return;
11970
+ try {
11971
+ active.client.sendAudio(Buffer2.from(audioB64, "base64"));
11972
+ } catch (error) {
11973
+ emitError(active, error);
11974
+ }
11975
+ },
11976
+ async stop(clientId, asrSessionId) {
11977
+ const key = keyOf2(clientId, asrSessionId);
11978
+ const active = sessions.get(key);
11979
+ if (!active) return;
11980
+ try {
11981
+ await active.client.close();
11982
+ } catch (error) {
11983
+ emitError(active, error);
11984
+ } finally {
11985
+ if (sessions.get(key) === active) sessions.delete(key);
11986
+ active.client.removeAllListeners();
11987
+ }
11988
+ },
11989
+ async closeAll() {
11990
+ await Promise.all(
11991
+ Array.from(sessions.values(), async (active) => {
11992
+ try {
11993
+ await active.client.close();
11994
+ } catch {
11995
+ } finally {
11996
+ active.client.removeAllListeners();
11997
+ }
11998
+ })
11999
+ );
12000
+ sessions.clear();
12001
+ }
12002
+ };
12003
+ }
12004
+
11486
12005
  // src/backend/backend.ts
11487
12006
  function initBackend(emitter) {
11488
12007
  const listeners = [];
@@ -11508,6 +12027,7 @@ function initBackend(emitter) {
11508
12027
  const _inference = createInferenceModule(ctx, { skills, search, toolbox });
11509
12028
  const memory = createMemoryModule(ctx, { inference: _inference });
11510
12029
  const imageGeneration = createImageGenerationModule(ctx, { ilink: ilink.state });
12030
+ const asr = createAsrManager(ctx);
11511
12031
  const session = createSessionModule(ctx, {
11512
12032
  bridgeConnect,
11513
12033
  askUser,
@@ -11666,6 +12186,9 @@ function initBackend(emitter) {
11666
12186
  async getSessionHistory(params) {
11667
12187
  return session.getSessionHistory(params);
11668
12188
  },
12189
+ async getSessionTokenUsage(params) {
12190
+ return session.getSessionTokenUsage(params);
12191
+ },
11669
12192
  async sendPrompt(params) {
11670
12193
  return session.sendPrompt(params);
11671
12194
  },
@@ -11892,11 +12415,22 @@ function initBackend(emitter) {
11892
12415
  },
11893
12416
  async getMemorySystemFilePath({ projectId }) {
11894
12417
  return memory.getFilePath(projectId);
12418
+ },
12419
+ // Realtime ASR
12420
+ async startRealtimeAsr({ clientId, asrSessionId }) {
12421
+ return asr.start(clientId, asrSessionId);
12422
+ },
12423
+ async sendRealtimeAsrFrame({ clientId, asrSessionId, audioB64 }) {
12424
+ asr.frame(clientId, asrSessionId, audioB64);
12425
+ },
12426
+ async stopRealtimeAsr({ clientId, asrSessionId }) {
12427
+ await asr.stop(clientId, asrSessionId);
11895
12428
  }
11896
12429
  };
11897
12430
  webui.setHandlers(backendHandlers2);
11898
12431
  async function closeBackend2() {
11899
12432
  automation.stopAllCrons();
12433
+ await asr.closeAll();
11900
12434
  webui.stop();
11901
12435
  await ilink.stopIlink({ logout: false });
11902
12436
  session.clearSession();
@@ -11912,7 +12446,7 @@ function initBackend(emitter) {
11912
12446
  }
11913
12447
 
11914
12448
  // package.json
11915
- var version = "0.1.51";
12449
+ var version = "0.1.53";
11916
12450
 
11917
12451
  // src/server/main.ts
11918
12452
  var port;