wind-agent-cli 1.37.2

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 (932) hide show
  1. package/LICENSE +718 -0
  2. package/README.md +26 -0
  3. package/dist/api-docs.html +901 -0
  4. package/dist/assets/CodeEditor-B2Wf7Fg0.js +110 -0
  5. package/dist/assets/FileTree-N2IkkHlv.js +127 -0
  6. package/dist/assets/GitPanel-DZCeuFZ2.js +29 -0
  7. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  8. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  9. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  10. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  11. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  12. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  13. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  14. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  15. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  16. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  17. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  18. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  19. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  20. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  21. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  22. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  23. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  24. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  25. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  26. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  27. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  28. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  29. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  30. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  31. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  32. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  33. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  34. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  35. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  36. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  37. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  38. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  39. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  44. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  45. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  46. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  47. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  48. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  49. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  50. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  51. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  52. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  53. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  54. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  55. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  56. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  57. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  58. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  59. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  60. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  61. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  62. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  63. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  64. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  65. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  66. package/dist/assets/MarkdownPreview-C0tqYnVu.js +41 -0
  67. package/dist/assets/PluginTabContent-Bnuf-fb8.js +1 -0
  68. package/dist/assets/Shell-BfFnMZ-f.js +81 -0
  69. package/dist/assets/Shell-qxJ8_QYu.css +32 -0
  70. package/dist/assets/StandaloneShell-QmyYwNAl.js +1 -0
  71. package/dist/assets/TaskMasterPanel-fMsmvN9L.js +32 -0
  72. package/dist/assets/abnfDiagram-N423BO3Z-DjPU7HLs.js +1 -0
  73. package/dist/assets/arc-Pdq6Tvr3.js +1 -0
  74. package/dist/assets/architectureDiagram-T3A2C74G-D0JnT0Vh.js +36 -0
  75. package/dist/assets/blockDiagram-VBNYF7ZC-DpaEf3mv.js +132 -0
  76. package/dist/assets/c4Diagram-5PPSVZJV-MpqlPGFi.js +10 -0
  77. package/dist/assets/channel-Bm0ZLE4z.js +1 -0
  78. package/dist/assets/chunk-2GRJ4B5K-DoSdNo8u.js +1 -0
  79. package/dist/assets/chunk-2Q5K7J3B-CE7I3uMn.js +1 -0
  80. package/dist/assets/chunk-5RXB4S5H-B4UQ8snD.js +231 -0
  81. package/dist/assets/chunk-5VM5RSS4-B55XgqHZ.js +15 -0
  82. package/dist/assets/chunk-6Q2QTUOP-BS1KpefW.js +88 -0
  83. package/dist/assets/chunk-GF5L2VYU-DkEPedJP.js +206 -0
  84. package/dist/assets/chunk-JWPE2WC7-DOtkNhMm.js +1 -0
  85. package/dist/assets/chunk-KBJHAD2P-BXLjviqM.js +1 -0
  86. package/dist/assets/chunk-RYQCIY6F-C50fjNNz.js +1 -0
  87. package/dist/assets/chunk-XXDRQBXY-QBYqCkb7.js +1 -0
  88. package/dist/assets/classDiagram-JCYQIIEL-DqEOcNxw.js +1 -0
  89. package/dist/assets/classDiagram-v2-OCEON4UE-DqEOcNxw.js +1 -0
  90. package/dist/assets/code-xml-VK1YfShP.js +6 -0
  91. package/dist/assets/cose-bilkent-JH36ORCC-DrVTo1Nh.js +1 -0
  92. package/dist/assets/cynefin-VYW2F7L2-DnJa_OlQ.js +178 -0
  93. package/dist/assets/cynefinDiagram-MW4NZA55-CCxBjw9E.js +62 -0
  94. package/dist/assets/cytoscape.esm-C10L9Icf.js +331 -0
  95. package/dist/assets/dagre-VZM6K2ZE-C_GvE4lu.js +4 -0
  96. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  97. package/dist/assets/diagram-7IWD3JNH-pFzs9HEu.js +30 -0
  98. package/dist/assets/diagram-B4RE2ZJO-CcehQC7x.js +3 -0
  99. package/dist/assets/diagram-LBJQPF4R-hfKcrrxe.js +24 -0
  100. package/dist/assets/diagram-Q27KOJAE-C1semJfK.js +24 -0
  101. package/dist/assets/diagram-UB23O5K3-57hvXQXO.js +41 -0
  102. package/dist/assets/ebnfDiagram-BXEA7PRR-9KIAlAVw.js +1 -0
  103. package/dist/assets/erDiagram-JOGREHBK-B7OzJ767.js +85 -0
  104. package/dist/assets/flowDiagram-UKHOOZJN-CJV8fQPR.js +156 -0
  105. package/dist/assets/ganttDiagram-PKOTCBZU-CbMNWWQu.js +292 -0
  106. package/dist/assets/gitGraphDiagram-DS77QQ5N-I_vZ5waO.js +106 -0
  107. package/dist/assets/graph-Cx-EqisW.js +1 -0
  108. package/dist/assets/index-DFnVoqpx.js +1174 -0
  109. package/dist/assets/index-DlSeAkw_.js +11 -0
  110. package/dist/assets/index-GFhXZyl2.js +62 -0
  111. package/dist/assets/index-ZHwIojzi.js +1 -0
  112. package/dist/assets/index-t1w8KNxn.css +1 -0
  113. package/dist/assets/infoDiagram-6WML65LV-Dh20Tsbq.js +2 -0
  114. package/dist/assets/init-Gi6I4Gst.js +1 -0
  115. package/dist/assets/ishikawaDiagram-WSZJBQD7-DH2Sm3ko.js +70 -0
  116. package/dist/assets/journeyDiagram-NVQOT4AX-BNFQqlVu.js +139 -0
  117. package/dist/assets/kanban-definition-27J2QSJJ-B3iL0ztJ.js +89 -0
  118. package/dist/assets/layout-D6BstSzF.js +1 -0
  119. package/dist/assets/linear-Cwe9dEKA.js +1 -0
  120. package/dist/assets/map-CV9uif0g.js +1 -0
  121. package/dist/assets/mermaid.core-BYRQSshi.js +312 -0
  122. package/dist/assets/mindmap-definition-FAOFIHXS-BgfBYMzr.js +96 -0
  123. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  124. package/dist/assets/pegDiagram-VL7TDLO6-CNYpECr8.js +1 -0
  125. package/dist/assets/pieDiagram-7S7Q4E2Y-DeSrxc4I.js +39 -0
  126. package/dist/assets/quadrantDiagram-CIZ2JOQS-BXVVQsa6.js +7 -0
  127. package/dist/assets/railroadDiagram-AXF67PYL-JTroIW8F.js +1 -0
  128. package/dist/assets/requirementDiagram-LRYGKXZP-C1Z_inLz.js +84 -0
  129. package/dist/assets/sankeyDiagram-W5VNT64P-DCJgKFUk.js +40 -0
  130. package/dist/assets/sequenceDiagram-SI44F4Z6-D8Wrx5Vc.js +162 -0
  131. package/dist/assets/sizeCapture-X5ZJPWSS-CXqD68vD.js +1 -0
  132. package/dist/assets/stateDiagram-OKZ733FA-CF0Ekqjo.js +1 -0
  133. package/dist/assets/stateDiagram-v2-UEYNNEHI-DARLpEFJ.js +1 -0
  134. package/dist/assets/swimlanes-SLNWSIFB-DVIax_k4.js +2 -0
  135. package/dist/assets/swimlanesDiagram-ULZ7WXOC-CrgDgaY8.js +8 -0
  136. package/dist/assets/timeline-definition-Z64GVDOM-DSqk3ApG.js +120 -0
  137. package/dist/assets/vendor-react-whEHfigN.js +59 -0
  138. package/dist/assets/vennDiagram-T6HMQDX7-DNbTqyG5.js +34 -0
  139. package/dist/assets/wardleyDiagram-T6FBY63Y-BNCpsFZV.js +78 -0
  140. package/dist/assets/xychartDiagram-ELKLHX3M-XsVZphHr.js +7 -0
  141. package/dist/clear-cache.html +85 -0
  142. package/dist/convert-icons.md +53 -0
  143. package/dist/favicon.png +0 -0
  144. package/dist/favicon.svg +9 -0
  145. package/dist/generate-icons.js +49 -0
  146. package/dist/icons/claude-ai-icon.svg +1 -0
  147. package/dist/icons/codex-white.svg +3 -0
  148. package/dist/icons/codex.svg +3 -0
  149. package/dist/icons/cursor-white.svg +12 -0
  150. package/dist/icons/cursor.svg +1 -0
  151. package/dist/icons/icon-128x128.png +0 -0
  152. package/dist/icons/icon-128x128.svg +12 -0
  153. package/dist/icons/icon-144x144.png +0 -0
  154. package/dist/icons/icon-144x144.svg +12 -0
  155. package/dist/icons/icon-152x152.png +0 -0
  156. package/dist/icons/icon-152x152.svg +12 -0
  157. package/dist/icons/icon-192x192.png +0 -0
  158. package/dist/icons/icon-192x192.svg +12 -0
  159. package/dist/icons/icon-384x384.png +0 -0
  160. package/dist/icons/icon-384x384.svg +12 -0
  161. package/dist/icons/icon-512x512.png +0 -0
  162. package/dist/icons/icon-512x512.svg +12 -0
  163. package/dist/icons/icon-72x72.png +0 -0
  164. package/dist/icons/icon-72x72.svg +12 -0
  165. package/dist/icons/icon-96x96.png +0 -0
  166. package/dist/icons/icon-96x96.svg +12 -0
  167. package/dist/icons/icon-template.svg +12 -0
  168. package/dist/index.html +58 -0
  169. package/dist/logo-128.png +0 -0
  170. package/dist/logo-256.png +0 -0
  171. package/dist/logo-32.png +0 -0
  172. package/dist/logo-512.png +0 -0
  173. package/dist/logo-64.png +0 -0
  174. package/dist/logo.svg +17 -0
  175. package/dist/manifest.json +61 -0
  176. package/dist/screenshots/cli-selection.png +0 -0
  177. package/dist/screenshots/desktop-main.png +0 -0
  178. package/dist/screenshots/mobile-chat.png +0 -0
  179. package/dist/screenshots/new-session.png +0 -0
  180. package/dist/screenshots/tools-modal.png +0 -0
  181. package/dist/sw.js +124 -0
  182. package/dist-server/scripts/fix-codex-sdk-windows-hide.js +47 -0
  183. package/dist-server/scripts/fix-codex-sdk-windows-hide.js.map +1 -0
  184. package/dist-server/server/index.js +339 -0
  185. package/dist-server/server/index.js.map +1 -0
  186. package/dist-server/server/load-env.js +45 -0
  187. package/dist-server/server/load-env.js.map +1 -0
  188. package/dist-server/server/modules/agent/agent.module.js +38 -0
  189. package/dist-server/server/modules/agent/agent.module.js.map +1 -0
  190. package/dist-server/server/modules/agent/agent.routes.js +1161 -0
  191. package/dist-server/server/modules/agent/agent.routes.js.map +1 -0
  192. package/dist-server/server/modules/agent/index.js +3 -0
  193. package/dist-server/server/modules/agent/index.js.map +1 -0
  194. package/dist-server/server/modules/agent/tests/agent.routes.test.js +176 -0
  195. package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -0
  196. package/dist-server/server/modules/assets/assets.routes.js +130 -0
  197. package/dist-server/server/modules/assets/assets.routes.js.map +1 -0
  198. package/dist-server/server/modules/assets/index.js +4 -0
  199. package/dist-server/server/modules/assets/index.js.map +1 -0
  200. package/dist-server/server/modules/assets/services/image-assets.service.js +95 -0
  201. package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -0
  202. package/dist-server/server/modules/assets/tests/image-assets.service.test.js +56 -0
  203. package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -0
  204. package/dist-server/server/modules/auth/auth.middleware.js +133 -0
  205. package/dist-server/server/modules/auth/auth.middleware.js.map +1 -0
  206. package/dist-server/server/modules/auth/auth.module.js +29 -0
  207. package/dist-server/server/modules/auth/auth.module.js.map +1 -0
  208. package/dist-server/server/modules/auth/auth.routes.js +45 -0
  209. package/dist-server/server/modules/auth/auth.routes.js.map +1 -0
  210. package/dist-server/server/modules/auth/auth.service.js +113 -0
  211. package/dist-server/server/modules/auth/auth.service.js.map +1 -0
  212. package/dist-server/server/modules/auth/index.js +9 -0
  213. package/dist-server/server/modules/auth/index.js.map +1 -0
  214. package/dist-server/server/modules/auth/tests/auth.service.test.js +80 -0
  215. package/dist-server/server/modules/auth/tests/auth.service.test.js.map +1 -0
  216. package/dist-server/server/modules/browser-use/browser-use-mcp.js +352 -0
  217. package/dist-server/server/modules/browser-use/browser-use-mcp.js.map +1 -0
  218. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js +107 -0
  219. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js.map +1 -0
  220. package/dist-server/server/modules/browser-use/browser-use-runtime.js +10 -0
  221. package/dist-server/server/modules/browser-use/browser-use-runtime.js.map +1 -0
  222. package/dist-server/server/modules/browser-use/browser-use.routes.js +93 -0
  223. package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -0
  224. package/dist-server/server/modules/browser-use/browser-use.service.js +687 -0
  225. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -0
  226. package/dist-server/server/modules/browser-use/index.js +11 -0
  227. package/dist-server/server/modules/browser-use/index.js.map +1 -0
  228. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +8 -0
  229. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -0
  230. package/dist-server/server/modules/cli/cli.js +17 -0
  231. package/dist-server/server/modules/cli/cli.js.map +1 -0
  232. package/dist-server/server/modules/cli/cli.module.js +85 -0
  233. package/dist-server/server/modules/cli/cli.module.js.map +1 -0
  234. package/dist-server/server/modules/cli/cli.service.js +225 -0
  235. package/dist-server/server/modules/cli/cli.service.js.map +1 -0
  236. package/dist-server/server/modules/cli/index.js +3 -0
  237. package/dist-server/server/modules/cli/index.js.map +1 -0
  238. package/dist-server/server/modules/cli/sandbox.service.js +332 -0
  239. package/dist-server/server/modules/cli/sandbox.service.js.map +1 -0
  240. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +154 -0
  241. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -0
  242. package/dist-server/server/modules/cli/tests/cli.service.test.js +82 -0
  243. package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -0
  244. package/dist-server/server/modules/cli/tests/sandbox.service.test.js +56 -0
  245. package/dist-server/server/modules/cli/tests/sandbox.service.test.js.map +1 -0
  246. package/dist-server/server/modules/commands/commands.module.js +20 -0
  247. package/dist-server/server/modules/commands/commands.module.js.map +1 -0
  248. package/dist-server/server/modules/commands/commands.routes.js +547 -0
  249. package/dist-server/server/modules/commands/commands.routes.js.map +1 -0
  250. package/dist-server/server/modules/commands/index.js +3 -0
  251. package/dist-server/server/modules/commands/index.js.map +1 -0
  252. package/dist-server/server/modules/commands/tests/commands.test.js +144 -0
  253. package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
  254. package/dist-server/server/modules/database/connection.js +125 -0
  255. package/dist-server/server/modules/database/connection.js.map +1 -0
  256. package/dist-server/server/modules/database/index.js +18 -0
  257. package/dist-server/server/modules/database/index.js.map +1 -0
  258. package/dist-server/server/modules/database/init-db.js +18 -0
  259. package/dist-server/server/modules/database/init-db.js.map +1 -0
  260. package/dist-server/server/modules/database/migrations.js +434 -0
  261. package/dist-server/server/modules/database/migrations.js.map +1 -0
  262. package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
  263. package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
  264. package/dist-server/server/modules/database/repositories/app-config.js +47 -0
  265. package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
  266. package/dist-server/server/modules/database/repositories/credentials.js +68 -0
  267. package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
  268. package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
  269. package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
  270. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +100 -0
  271. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js.map +1 -0
  272. package/dist-server/server/modules/database/repositories/notification-preferences.js +82 -0
  273. package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
  274. package/dist-server/server/modules/database/repositories/projects.db.js +172 -0
  275. package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
  276. package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
  277. package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
  278. package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
  279. package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
  280. package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
  281. package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
  282. package/dist-server/server/modules/database/repositories/sessions.db.js +375 -0
  283. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
  284. package/dist-server/server/modules/database/repositories/users.js +88 -0
  285. package/dist-server/server/modules/database/repositories/users.js.map +1 -0
  286. package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
  287. package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
  288. package/dist-server/server/modules/database/schema.js +199 -0
  289. package/dist-server/server/modules/database/schema.js.map +1 -0
  290. package/dist-server/server/modules/database/tests/projects.db.integration.test.js +64 -0
  291. package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -0
  292. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
  293. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
  294. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +79 -0
  295. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -0
  296. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +93 -0
  297. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -0
  298. package/dist-server/server/modules/file-tree/file-tree.module.js +95 -0
  299. package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
  300. package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
  301. package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
  302. package/dist-server/server/modules/file-tree/file-tree.service.js +584 -0
  303. package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
  304. package/dist-server/server/modules/file-tree/index.js +3 -0
  305. package/dist-server/server/modules/file-tree/index.js.map +1 -0
  306. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
  307. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
  308. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +311 -0
  309. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
  310. package/dist-server/server/modules/git/git-branch.service.js +15 -0
  311. package/dist-server/server/modules/git/git-branch.service.js.map +1 -0
  312. package/dist-server/server/modules/git/git-parsing.service.js +61 -0
  313. package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
  314. package/dist-server/server/modules/git/git.module.js +14 -0
  315. package/dist-server/server/modules/git/git.module.js.map +1 -0
  316. package/dist-server/server/modules/git/git.routes.js +1348 -0
  317. package/dist-server/server/modules/git/git.routes.js.map +1 -0
  318. package/dist-server/server/modules/git/index.js +3 -0
  319. package/dist-server/server/modules/git/index.js.map +1 -0
  320. package/dist-server/server/modules/git/tests/git-branch.service.test.js +52 -0
  321. package/dist-server/server/modules/git/tests/git-branch.service.test.js.map +1 -0
  322. package/dist-server/server/modules/git/tests/git-init.routes.test.js +177 -0
  323. package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
  324. package/dist-server/server/modules/git/tests/git.test.js +80 -0
  325. package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
  326. package/dist-server/server/modules/notifications/index.js +20 -0
  327. package/dist-server/server/modules/notifications/index.js.map +1 -0
  328. package/dist-server/server/modules/notifications/notifications.routes.js +115 -0
  329. package/dist-server/server/modules/notifications/notifications.routes.js.map +1 -0
  330. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js +97 -0
  331. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js.map +1 -0
  332. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +249 -0
  333. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -0
  334. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
  335. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
  336. package/dist-server/server/modules/notifications/vapid-keys.service.js +28 -0
  337. package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
  338. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js +79 -0
  339. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js.map +1 -0
  340. package/dist-server/server/modules/plugins/index.js +9 -0
  341. package/dist-server/server/modules/plugins/index.js.map +1 -0
  342. package/dist-server/server/modules/plugins/plugin-process.service.js +191 -0
  343. package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
  344. package/dist-server/server/modules/plugins/plugin-registry.service.js +414 -0
  345. package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
  346. package/dist-server/server/modules/plugins/plugins.module.js +30 -0
  347. package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
  348. package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
  349. package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
  350. package/dist-server/server/modules/plugins/plugins.service.js +123 -0
  351. package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
  352. package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
  353. package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
  354. package/dist-server/server/modules/projects/index.js +9 -0
  355. package/dist-server/server/modules/projects/index.js.map +1 -0
  356. package/dist-server/server/modules/projects/projects.routes.js +205 -0
  357. package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
  358. package/dist-server/server/modules/projects/services/project-clone.service.js +220 -0
  359. package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
  360. package/dist-server/server/modules/projects/services/project-delete.service.js +78 -0
  361. package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
  362. package/dist-server/server/modules/projects/services/project-management.service.js +90 -0
  363. package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
  364. package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
  365. package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
  366. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +167 -0
  367. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
  368. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +188 -0
  369. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
  370. package/dist-server/server/modules/projects/tests/project-clone.service.test.js +126 -0
  371. package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
  372. package/dist-server/server/modules/projects/tests/project-management.service.test.js +85 -0
  373. package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
  374. package/dist-server/server/modules/projects/tests/project-star.service.test.js +95 -0
  375. package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
  376. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +87 -0
  377. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
  378. package/dist-server/server/modules/providers/index.js +9 -0
  379. package/dist-server/server/modules/providers/index.js.map +1 -0
  380. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +132 -0
  381. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
  382. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
  383. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
  384. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +249 -0
  385. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -0
  386. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +928 -0
  387. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -0
  388. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +141 -0
  389. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -0
  390. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +586 -0
  391. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
  392. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +205 -0
  393. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -0
  394. package/dist-server/server/modules/providers/list/claude/claude.provider.js +21 -0
  395. package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
  396. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +180 -0
  397. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -0
  398. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
  399. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
  400. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
  401. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
  402. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +109 -0
  403. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -0
  404. package/dist-server/server/modules/providers/list/codex/codex-native-command.service.js +22 -0
  405. package/dist-server/server/modules/providers/list/codex/codex-native-command.service.js.map +1 -0
  406. package/dist-server/server/modules/providers/list/codex/codex-native-runtime.provider.js +473 -0
  407. package/dist-server/server/modules/providers/list/codex/codex-native-runtime.provider.js.map +1 -0
  408. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +462 -0
  409. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
  410. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +145 -0
  411. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
  412. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +822 -0
  413. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
  414. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +62 -0
  415. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -0
  416. package/dist-server/server/modules/providers/list/codex/codex.provider.js +21 -0
  417. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
  418. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
  419. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
  420. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
  421. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
  422. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +100 -0
  423. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -0
  424. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js +303 -0
  425. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
  426. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +111 -0
  427. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
  428. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +566 -0
  429. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
  430. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js +35 -0
  431. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js.map +1 -0
  432. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +21 -0
  433. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
  434. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js +91 -0
  435. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js.map +1 -0
  436. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js +181 -0
  437. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js.map +1 -0
  438. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +177 -0
  439. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -0
  440. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +368 -0
  441. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
  442. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +225 -0
  443. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
  444. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +136 -0
  445. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -0
  446. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +404 -0
  447. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -0
  448. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js +62 -0
  449. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js.map +1 -0
  450. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +21 -0
  451. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -0
  452. package/dist-server/server/modules/providers/provider.registry.js +31 -0
  453. package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
  454. package/dist-server/server/modules/providers/provider.routes.js +651 -0
  455. package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
  456. package/dist-server/server/modules/providers/services/mcp.service.js +84 -0
  457. package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
  458. package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
  459. package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
  460. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +67 -0
  461. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -0
  462. package/dist-server/server/modules/providers/services/provider-models.service.js +289 -0
  463. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -0
  464. package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
  465. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
  466. package/dist-server/server/modules/providers/services/provider-token-usage.service.js +268 -0
  467. package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
  468. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +974 -0
  469. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
  470. package/dist-server/server/modules/providers/services/session-synchronizer.service.js +56 -0
  471. package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
  472. package/dist-server/server/modules/providers/services/session-watch-scheduler.js +130 -0
  473. package/dist-server/server/modules/providers/services/session-watch-scheduler.js.map +1 -0
  474. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +310 -0
  475. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
  476. package/dist-server/server/modules/providers/services/sessions.service.js +349 -0
  477. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
  478. package/dist-server/server/modules/providers/services/skills.service.js +22 -0
  479. package/dist-server/server/modules/providers/services/skills.service.js.map +1 -0
  480. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +13 -0
  481. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
  482. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
  483. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
  484. package/dist-server/server/modules/providers/shared/skills/skills.provider.js +207 -0
  485. package/dist-server/server/modules/providers/shared/skills/skills.provider.js.map +1 -0
  486. package/dist-server/server/modules/providers/tests/claude-auth.test.js +122 -0
  487. package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
  488. package/dist-server/server/modules/providers/tests/claude-sessions.test.js +44 -0
  489. package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
  490. package/dist-server/server/modules/providers/tests/codex-app-server.client.test.js +65 -0
  491. package/dist-server/server/modules/providers/tests/codex-app-server.client.test.js.map +1 -0
  492. package/dist-server/server/modules/providers/tests/codex-native-command.service.test.js +192 -0
  493. package/dist-server/server/modules/providers/tests/codex-native-command.service.test.js.map +1 -0
  494. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.js +26 -0
  495. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.js.map +1 -0
  496. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide.test.js +13 -0
  497. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide.test.js.map +1 -0
  498. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +202 -0
  499. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -0
  500. package/dist-server/server/modules/providers/tests/mcp.test.js +291 -0
  501. package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
  502. package/dist-server/server/modules/providers/tests/opencode-models.test.js +19 -0
  503. package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -0
  504. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +424 -0
  505. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -0
  506. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js +205 -0
  507. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
  508. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +268 -0
  509. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -0
  510. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +126 -0
  511. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
  512. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +166 -0
  513. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
  514. package/dist-server/server/modules/providers/tests/provider.routes.test.js +161 -0
  515. package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
  516. package/dist-server/server/modules/providers/tests/session-watch-scheduler.test.js +76 -0
  517. package/dist-server/server/modules/providers/tests/session-watch-scheduler.test.js.map +1 -0
  518. package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
  519. package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
  520. package/dist-server/server/modules/providers/tests/sessions-watcher-filter.test.js +22 -0
  521. package/dist-server/server/modules/providers/tests/sessions-watcher-filter.test.js.map +1 -0
  522. package/dist-server/server/modules/providers/tests/sessions.service.test.js +87 -0
  523. package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
  524. package/dist-server/server/modules/providers/tests/skills.test.js +398 -0
  525. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -0
  526. package/dist-server/server/modules/settings/index.js +3 -0
  527. package/dist-server/server/modules/settings/index.js.map +1 -0
  528. package/dist-server/server/modules/settings/settings.module.js +35 -0
  529. package/dist-server/server/modules/settings/settings.module.js.map +1 -0
  530. package/dist-server/server/modules/settings/settings.routes.js +34 -0
  531. package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
  532. package/dist-server/server/modules/settings/settings.service.js +116 -0
  533. package/dist-server/server/modules/settings/settings.service.js.map +1 -0
  534. package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
  535. package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
  536. package/dist-server/server/modules/system/index.js +3 -0
  537. package/dist-server/server/modules/system/index.js.map +1 -0
  538. package/dist-server/server/modules/system/system.module.js +44 -0
  539. package/dist-server/server/modules/system/system.module.js.map +1 -0
  540. package/dist-server/server/modules/system/system.routes.js +16 -0
  541. package/dist-server/server/modules/system/system.routes.js.map +1 -0
  542. package/dist-server/server/modules/system/system.service.js +45 -0
  543. package/dist-server/server/modules/system/system.service.js.map +1 -0
  544. package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
  545. package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
  546. package/dist-server/server/modules/taskmaster/index.js +3 -0
  547. package/dist-server/server/modules/taskmaster/index.js.map +1 -0
  548. package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
  549. package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
  550. package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
  551. package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
  552. package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
  553. package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
  554. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +132 -0
  555. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
  556. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
  557. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
  558. package/dist-server/server/modules/user/index.js +3 -0
  559. package/dist-server/server/modules/user/index.js.map +1 -0
  560. package/dist-server/server/modules/user/tests/user.service.test.js +53 -0
  561. package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
  562. package/dist-server/server/modules/user/user.module.js +47 -0
  563. package/dist-server/server/modules/user/user.module.js.map +1 -0
  564. package/dist-server/server/modules/user/user.routes.js +44 -0
  565. package/dist-server/server/modules/user/user.routes.js.map +1 -0
  566. package/dist-server/server/modules/user/user.service.js +59 -0
  567. package/dist-server/server/modules/user/user.service.js.map +1 -0
  568. package/dist-server/server/modules/voice/index.js +3 -0
  569. package/dist-server/server/modules/voice/index.js.map +1 -0
  570. package/dist-server/server/modules/voice/tests/voice.service.test.js +86 -0
  571. package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
  572. package/dist-server/server/modules/voice/voice.module.js +44 -0
  573. package/dist-server/server/modules/voice/voice.module.js.map +1 -0
  574. package/dist-server/server/modules/voice/voice.routes.js +87 -0
  575. package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
  576. package/dist-server/server/modules/voice/voice.service.js +148 -0
  577. package/dist-server/server/modules/voice/voice.service.js.map +1 -0
  578. package/dist-server/server/modules/websocket/index.js +4 -0
  579. package/dist-server/server/modules/websocket/index.js.map +1 -0
  580. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +266 -0
  581. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -0
  582. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +105 -0
  583. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -0
  584. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +310 -0
  585. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
  586. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
  587. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
  588. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +570 -0
  589. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
  590. package/dist-server/server/modules/websocket/services/terminal-replay-store.js +161 -0
  591. package/dist-server/server/modules/websocket/services/terminal-replay-store.js.map +1 -0
  592. package/dist-server/server/modules/websocket/services/websocket-auth.service.js +36 -0
  593. package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
  594. package/dist-server/server/modules/websocket/services/websocket-server.service.js +91 -0
  595. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
  596. package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
  597. package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
  598. package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
  599. package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
  600. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js +40 -0
  601. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
  602. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +249 -0
  603. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -0
  604. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +346 -0
  605. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
  606. package/dist-server/server/modules/websocket/tests/terminal-replay-store.test.js +65 -0
  607. package/dist-server/server/modules/websocket/tests/terminal-replay-store.test.js.map +1 -0
  608. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
  609. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
  610. package/dist-server/server/modules/worktrees/index.js +3 -0
  611. package/dist-server/server/modules/worktrees/index.js.map +1 -0
  612. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
  613. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
  614. package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
  615. package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
  616. package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
  617. package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
  618. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
  619. package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
  620. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
  621. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
  622. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
  623. package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
  624. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
  625. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
  626. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
  627. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
  628. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
  629. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
  630. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
  631. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
  632. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
  633. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
  634. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
  635. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
  636. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
  637. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
  638. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
  639. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
  640. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
  641. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
  642. package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
  643. package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
  644. package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
  645. package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
  646. package/dist-server/server/shared/claude-cli-path.js +103 -0
  647. package/dist-server/server/shared/claude-cli-path.js.map +1 -0
  648. package/dist-server/server/shared/frontmatter.js +16 -0
  649. package/dist-server/server/shared/frontmatter.js.map +1 -0
  650. package/dist-server/server/shared/image-attachments.js +343 -0
  651. package/dist-server/server/shared/image-attachments.js.map +1 -0
  652. package/dist-server/server/shared/interfaces.js +2 -0
  653. package/dist-server/server/shared/interfaces.js.map +1 -0
  654. package/dist-server/server/shared/tests/claude-cli-path.test.js +45 -0
  655. package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -0
  656. package/dist-server/server/shared/tests/image-attachments.test.js +262 -0
  657. package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -0
  658. package/dist-server/server/shared/tests/slice-tail-page.test.js +35 -0
  659. package/dist-server/server/shared/tests/slice-tail-page.test.js.map +1 -0
  660. package/dist-server/server/shared/types.js +2 -0
  661. package/dist-server/server/shared/types.js.map +1 -0
  662. package/dist-server/server/shared/utils.js +966 -0
  663. package/dist-server/server/shared/utils.js.map +1 -0
  664. package/dist-server/shared/networkHosts.js +20 -0
  665. package/dist-server/shared/networkHosts.js.map +1 -0
  666. package/electron/assets/logo-macos.icns +0 -0
  667. package/electron/assets/logo-macos.png +0 -0
  668. package/electron/assets/logo-windows.ico +0 -0
  669. package/electron/cloud.js +260 -0
  670. package/electron/desktopNotifications.js +378 -0
  671. package/electron/desktopWindow.js +766 -0
  672. package/electron/launcher/index.html +14 -0
  673. package/electron/launcher/launcher.css +801 -0
  674. package/electron/launcher/launcher.js +687 -0
  675. package/electron/localServer.js +549 -0
  676. package/electron/main.js +944 -0
  677. package/electron/preload.cjs +60 -0
  678. package/electron/scripts/generate-macos-icon.js +62 -0
  679. package/electron/serverInstaller.js +277 -0
  680. package/electron/tabs.js +87 -0
  681. package/electron/viewHost.js +331 -0
  682. package/package.json +259 -0
  683. package/public/api-docs.html +901 -0
  684. package/scripts/fix-codex-sdk-windows-hide.js +66 -0
  685. package/scripts/fix-node-pty.js +67 -0
  686. package/scripts/promote-dist-server.mjs +50 -0
  687. package/scripts/release/build-server-bundle.js +176 -0
  688. package/scripts/release/prepare-desktop-app.js +152 -0
  689. package/server/index.ts +400 -0
  690. package/server/load-env.ts +47 -0
  691. package/server/modules/agent/agent.module.ts +52 -0
  692. package/server/modules/agent/agent.routes.ts +1287 -0
  693. package/server/modules/agent/index.ts +2 -0
  694. package/server/modules/agent/tests/agent.routes.test.ts +205 -0
  695. package/server/modules/assets/assets.routes.ts +150 -0
  696. package/server/modules/assets/index.ts +3 -0
  697. package/server/modules/assets/services/image-assets.service.ts +127 -0
  698. package/server/modules/assets/tests/image-assets.service.test.ts +74 -0
  699. package/server/modules/auth/auth.middleware.ts +163 -0
  700. package/server/modules/auth/auth.module.ts +38 -0
  701. package/server/modules/auth/auth.routes.ts +57 -0
  702. package/server/modules/auth/auth.service.ts +155 -0
  703. package/server/modules/auth/index.ts +9 -0
  704. package/server/modules/auth/tests/auth.service.test.ts +95 -0
  705. package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -0
  706. package/server/modules/browser-use/browser-use-mcp.ts +386 -0
  707. package/server/modules/browser-use/browser-use-runtime.ts +10 -0
  708. package/server/modules/browser-use/browser-use.routes.ts +96 -0
  709. package/server/modules/browser-use/browser-use.service.ts +836 -0
  710. package/server/modules/browser-use/index.ts +11 -0
  711. package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -0
  712. package/server/modules/cli/cli.module.ts +95 -0
  713. package/server/modules/cli/cli.service.ts +260 -0
  714. package/server/modules/cli/cli.ts +19 -0
  715. package/server/modules/cli/index.ts +2 -0
  716. package/server/modules/cli/sandbox.service.ts +413 -0
  717. package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -0
  718. package/server/modules/cli/tests/cli.service.test.ts +98 -0
  719. package/server/modules/cli/tests/sandbox.service.test.ts +64 -0
  720. package/server/modules/commands/commands.module.ts +22 -0
  721. package/server/modules/commands/commands.routes.ts +655 -0
  722. package/server/modules/commands/index.ts +2 -0
  723. package/server/modules/commands/tests/commands.test.ts +171 -0
  724. package/server/modules/database/connection.ts +143 -0
  725. package/server/modules/database/index.ts +17 -0
  726. package/server/modules/database/init-db.ts +17 -0
  727. package/server/modules/database/migrations.ts +515 -0
  728. package/server/modules/database/repositories/api-keys.ts +119 -0
  729. package/server/modules/database/repositories/app-config.ts +53 -0
  730. package/server/modules/database/repositories/credentials.ts +106 -0
  731. package/server/modules/database/repositories/github-tokens.ts +100 -0
  732. package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -0
  733. package/server/modules/database/repositories/notification-preferences.ts +117 -0
  734. package/server/modules/database/repositories/projects.db.ts +196 -0
  735. package/server/modules/database/repositories/provider-models.ts +168 -0
  736. package/server/modules/database/repositories/push-subscriptions.ts +80 -0
  737. package/server/modules/database/repositories/scan-state.db.ts +42 -0
  738. package/server/modules/database/repositories/sessions.db.ts +524 -0
  739. package/server/modules/database/repositories/users.ts +140 -0
  740. package/server/modules/database/repositories/vapid-keys.ts +57 -0
  741. package/server/modules/database/schema.ts +210 -0
  742. package/server/modules/database/tests/projects.db.integration.test.ts +72 -0
  743. package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
  744. package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -0
  745. package/server/modules/database/tests/sessions.db.integration.test.ts +116 -0
  746. package/server/modules/file-tree/file-tree.module.ts +116 -0
  747. package/server/modules/file-tree/file-tree.routes.ts +258 -0
  748. package/server/modules/file-tree/file-tree.service.ts +675 -0
  749. package/server/modules/file-tree/index.ts +2 -0
  750. package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
  751. package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -0
  752. package/server/modules/git/git-branch.service.ts +43 -0
  753. package/server/modules/git/git-parsing.service.ts +66 -0
  754. package/server/modules/git/git.module.ts +22 -0
  755. package/server/modules/git/git.routes.ts +1601 -0
  756. package/server/modules/git/index.ts +2 -0
  757. package/server/modules/git/tests/git-branch.service.test.ts +60 -0
  758. package/server/modules/git/tests/git-init.routes.test.ts +179 -0
  759. package/server/modules/git/tests/git.test.ts +106 -0
  760. package/server/modules/notifications/index.ts +24 -0
  761. package/server/modules/notifications/notifications.routes.ts +127 -0
  762. package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -0
  763. package/server/modules/notifications/services/notification-orchestrator.service.js +310 -0
  764. package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
  765. package/server/modules/notifications/vapid-keys.service.ts +38 -0
  766. package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -0
  767. package/server/modules/plugins/index.ts +9 -0
  768. package/server/modules/plugins/plugin-process.service.ts +217 -0
  769. package/server/modules/plugins/plugin-registry.service.ts +459 -0
  770. package/server/modules/plugins/plugins.module.ts +33 -0
  771. package/server/modules/plugins/plugins.routes.ts +66 -0
  772. package/server/modules/plugins/plugins.service.ts +147 -0
  773. package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
  774. package/server/modules/projects/index.ts +11 -0
  775. package/server/modules/projects/projects.routes.ts +273 -0
  776. package/server/modules/projects/services/project-clone.service.ts +323 -0
  777. package/server/modules/projects/services/project-delete.service.ts +90 -0
  778. package/server/modules/projects/services/project-management.service.ts +144 -0
  779. package/server/modules/projects/services/project-star.service.ts +78 -0
  780. package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -0
  781. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -0
  782. package/server/modules/projects/tests/project-clone.service.test.ts +183 -0
  783. package/server/modules/projects/tests/project-management.service.test.ts +117 -0
  784. package/server/modules/projects/tests/project-star.service.test.ts +123 -0
  785. package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -0
  786. package/server/modules/providers/README.md +380 -0
  787. package/server/modules/providers/index.ts +10 -0
  788. package/server/modules/providers/list/claude/claude-auth.provider.ts +160 -0
  789. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
  790. package/server/modules/providers/list/claude/claude-models.provider.ts +294 -0
  791. package/server/modules/providers/list/claude/claude-runtime.provider.js +1068 -0
  792. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -0
  793. package/server/modules/providers/list/claude/claude-sessions.provider.ts +684 -0
  794. package/server/modules/providers/list/claude/claude-skills.provider.ts +265 -0
  795. package/server/modules/providers/list/claude/claude.provider.ts +30 -0
  796. package/server/modules/providers/list/codex/codex-app-server.client.ts +226 -0
  797. package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
  798. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
  799. package/server/modules/providers/list/codex/codex-models.provider.ts +123 -0
  800. package/server/modules/providers/list/codex/codex-native-command.service.ts +31 -0
  801. package/server/modules/providers/list/codex/codex-native-runtime.provider.ts +577 -0
  802. package/server/modules/providers/list/codex/codex-runtime.provider.js +533 -0
  803. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +203 -0
  804. package/server/modules/providers/list/codex/codex-sessions.provider.ts +938 -0
  805. package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -0
  806. package/server/modules/providers/list/codex/codex.provider.ts +30 -0
  807. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
  808. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
  809. package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -0
  810. package/server/modules/providers/list/cursor/cursor-runtime.provider.js +385 -0
  811. package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +159 -0
  812. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -0
  813. package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -0
  814. package/server/modules/providers/list/cursor/cursor.provider.ts +30 -0
  815. package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -0
  816. package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -0
  817. package/server/modules/providers/list/opencode/opencode-models.provider.ts +203 -0
  818. package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -0
  819. package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -0
  820. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -0
  821. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -0
  822. package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -0
  823. package/server/modules/providers/list/opencode/opencode.provider.ts +30 -0
  824. package/server/modules/providers/provider.registry.ts +36 -0
  825. package/server/modules/providers/provider.routes.ts +877 -0
  826. package/server/modules/providers/services/mcp.service.ts +109 -0
  827. package/server/modules/providers/services/provider-auth.service.ts +26 -0
  828. package/server/modules/providers/services/provider-capabilities.service.ts +97 -0
  829. package/server/modules/providers/services/provider-models.service.ts +401 -0
  830. package/server/modules/providers/services/provider-runtime.service.ts +108 -0
  831. package/server/modules/providers/services/provider-token-usage.service.ts +357 -0
  832. package/server/modules/providers/services/session-conversations-search.service.ts +1321 -0
  833. package/server/modules/providers/services/session-synchronizer.service.ts +74 -0
  834. package/server/modules/providers/services/session-watch-scheduler.ts +183 -0
  835. package/server/modules/providers/services/sessions-watcher.service.ts +377 -0
  836. package/server/modules/providers/services/sessions.service.ts +471 -0
  837. package/server/modules/providers/services/skills.service.ts +39 -0
  838. package/server/modules/providers/shared/base/abstract.provider.ts +32 -0
  839. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
  840. package/server/modules/providers/shared/skills/skills.provider.ts +287 -0
  841. package/server/modules/providers/tests/claude-auth.test.ts +150 -0
  842. package/server/modules/providers/tests/claude-sessions.test.ts +61 -0
  843. package/server/modules/providers/tests/codex-app-server.client.test.ts +74 -0
  844. package/server/modules/providers/tests/codex-native-command.service.test.ts +223 -0
  845. package/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.ts +33 -0
  846. package/server/modules/providers/tests/codex-sdk-windows-hide.test.ts +20 -0
  847. package/server/modules/providers/tests/codex-sessions.test.ts +231 -0
  848. package/server/modules/providers/tests/mcp.test.ts +349 -0
  849. package/server/modules/providers/tests/opencode-models.test.ts +41 -0
  850. package/server/modules/providers/tests/opencode-sessions.test.ts +522 -0
  851. package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -0
  852. package/server/modules/providers/tests/provider-models.service.test.ts +353 -0
  853. package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -0
  854. package/server/modules/providers/tests/provider-token-usage.service.test.ts +186 -0
  855. package/server/modules/providers/tests/provider.routes.test.ts +244 -0
  856. package/server/modules/providers/tests/session-watch-scheduler.test.ts +87 -0
  857. package/server/modules/providers/tests/sessions-details.test.ts +73 -0
  858. package/server/modules/providers/tests/sessions-watcher-filter.test.ts +27 -0
  859. package/server/modules/providers/tests/sessions.service.test.ts +127 -0
  860. package/server/modules/providers/tests/skills.test.ts +692 -0
  861. package/server/modules/settings/index.ts +2 -0
  862. package/server/modules/settings/settings.module.ts +50 -0
  863. package/server/modules/settings/settings.routes.ts +51 -0
  864. package/server/modules/settings/settings.service.ts +186 -0
  865. package/server/modules/settings/tests/settings.service.test.ts +54 -0
  866. package/server/modules/system/index.ts +2 -0
  867. package/server/modules/system/system.module.ts +62 -0
  868. package/server/modules/system/system.routes.ts +21 -0
  869. package/server/modules/system/system.service.ts +76 -0
  870. package/server/modules/system/tests/system.service.test.ts +118 -0
  871. package/server/modules/taskmaster/index.ts +2 -0
  872. package/server/modules/taskmaster/taskmaster.module.ts +24 -0
  873. package/server/modules/taskmaster/taskmaster.routes.ts +1482 -0
  874. package/server/modules/taskmaster/taskmaster.service.ts +132 -0
  875. package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -0
  876. package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
  877. package/server/modules/user/index.ts +2 -0
  878. package/server/modules/user/tests/user.service.test.ts +61 -0
  879. package/server/modules/user/user.module.ts +58 -0
  880. package/server/modules/user/user.routes.ts +50 -0
  881. package/server/modules/user/user.service.ts +85 -0
  882. package/server/modules/voice/index.ts +2 -0
  883. package/server/modules/voice/tests/voice.service.test.ts +98 -0
  884. package/server/modules/voice/voice.module.ts +47 -0
  885. package/server/modules/voice/voice.routes.ts +113 -0
  886. package/server/modules/voice/voice.service.ts +192 -0
  887. package/server/modules/websocket/README.md +273 -0
  888. package/server/modules/websocket/index.ts +3 -0
  889. package/server/modules/websocket/services/chat-run-registry.service.ts +343 -0
  890. package/server/modules/websocket/services/chat-session-writer.service.ts +145 -0
  891. package/server/modules/websocket/services/chat-websocket.service.ts +425 -0
  892. package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
  893. package/server/modules/websocket/services/shell-websocket.service.ts +776 -0
  894. package/server/modules/websocket/services/terminal-replay-store.ts +218 -0
  895. package/server/modules/websocket/services/websocket-auth.service.ts +59 -0
  896. package/server/modules/websocket/services/websocket-server.service.ts +127 -0
  897. package/server/modules/websocket/services/websocket-state.service.ts +16 -0
  898. package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
  899. package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -0
  900. package/server/modules/websocket/tests/chat-run-registry.test.ts +282 -0
  901. package/server/modules/websocket/tests/shell-websocket.service.test.ts +432 -0
  902. package/server/modules/websocket/tests/terminal-replay-store.test.ts +79 -0
  903. package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
  904. package/server/modules/worktrees/index.ts +2 -0
  905. package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
  906. package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
  907. package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
  908. package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
  909. package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
  910. package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
  911. package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
  912. package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
  913. package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
  914. package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
  915. package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
  916. package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
  917. package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
  918. package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
  919. package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
  920. package/server/modules/worktrees/worktrees.module.ts +113 -0
  921. package/server/modules/worktrees/worktrees.routes.ts +116 -0
  922. package/server/shared/claude-cli-path.ts +139 -0
  923. package/server/shared/frontmatter.ts +18 -0
  924. package/server/shared/image-attachments.ts +435 -0
  925. package/server/shared/interfaces.ts +179 -0
  926. package/server/shared/tests/claude-cli-path.test.ts +61 -0
  927. package/server/shared/tests/image-attachments.test.ts +353 -0
  928. package/server/shared/tests/slice-tail-page.test.ts +42 -0
  929. package/server/shared/types.ts +1268 -0
  930. package/server/shared/utils.ts +1161 -0
  931. package/server/tsconfig.json +40 -0
  932. package/shared/networkHosts.js +22 -0
@@ -0,0 +1,1268 @@
1
+ import type { IncomingMessage } from 'node:http';
2
+ import type { Readable } from 'node:stream';
3
+
4
+ //----------------- HTTP RESPONSE SHAPES ------------
5
+ /**
6
+ * Canonical success envelope used by backend APIs that return a structured payload.
7
+ *
8
+ * Use this for route handlers that need a stable `success/data` shape so frontend
9
+ * consumers can parse responses consistently across endpoints.
10
+ */
11
+ export type ApiSuccessShape<TData = unknown> = {
12
+ success: true;
13
+ data: TData;
14
+ };
15
+
16
+ /**
17
+ * Generic plain-object record used when parsing loosely typed JSON payloads.
18
+ *
19
+ * Use this only after runtime shape checks, not as a replacement for validated
20
+ * domain models.
21
+ */
22
+ export type AnyRecord = Record<string, any>;
23
+
24
+ // ---------------------------
25
+ //----------------- WEBSOCKET TRANSPORT TYPES ------------
26
+ /**
27
+ * Minimal websocket client contract used by backend broadcaster services.
28
+ *
29
+ * Any transport object added to `connectedClients` must implement these two
30
+ * members so shared services can safely send JSON strings and check whether the
31
+ * socket is still open before broadcasting.
32
+ */
33
+ export type RealtimeClientConnection = {
34
+ readyState: number;
35
+ send(data: string): void;
36
+ };
37
+
38
+ /**
39
+ * Authenticated user payload attached to websocket upgrade requests.
40
+ *
41
+ * Platform and OSS auth flows currently use either `id` or `userId`; both are
42
+ * represented here so websocket handlers can resolve a stable writer user id.
43
+ */
44
+ export type AuthenticatedWebSocketUser = {
45
+ id?: string | number;
46
+ userId?: string | number;
47
+ username?: string;
48
+ [key: string]: unknown;
49
+ };
50
+
51
+ /**
52
+ * HTTP upgrade request shape after websocket authentication succeeds.
53
+ *
54
+ * `verifyClient` populates `request.user` with the authenticated payload, and
55
+ * downstream websocket handlers rely on this extended request type.
56
+ */
57
+ export type AuthenticatedWebSocketRequest = IncomingMessage & {
58
+ user?: AuthenticatedWebSocketUser;
59
+ };
60
+
61
+ // ---------------------------
62
+ //----------------- PROVIDER MESSAGE MODEL ------------
63
+ /**
64
+ * Providers supported by the unified server runtime.
65
+ *
66
+ * Use this as the source of truth whenever a function or payload needs to identify
67
+ * a specific LLM integration.
68
+ */
69
+ export type LLMProvider = 'claude' | 'codex' | 'cursor' | 'opencode';
70
+
71
+ /**
72
+ * One selectable model row in a provider model catalog.
73
+ */
74
+ export type ProviderModelOption = {
75
+ value: string;
76
+ label: string;
77
+ description?: string;
78
+ /** Stable SQLite row id used only by model-management actions. */
79
+ recordId?: number;
80
+ /** True for user-created rows; false for immutable CloudCLI defaults. */
81
+ isCustom?: boolean;
82
+ effort?: {
83
+ default?: string;
84
+ values: {
85
+ value: string;
86
+ description?: string;
87
+ }[];
88
+ };
89
+ };
90
+
91
+ /**
92
+ * Provider model catalog returned by `GET /api/providers/:provider/models`.
93
+ */
94
+ export type ProviderModelsDefinition = {
95
+ OPTIONS: ProviderModelOption[];
96
+ DEFAULT: string;
97
+ };
98
+
99
+ /**
100
+ * One persisted custom-model row in the provider model library.
101
+ *
102
+ * Provider modules use this shape at the database boundary. Predefined models
103
+ * never use this type because they remain source-controlled in provider
104
+ * adapters. `modelId` is sent to the provider runtime, while `model` is the
105
+ * user-supplied display name shown in pickers.
106
+ */
107
+ export type CustomProviderModelRecord = {
108
+ recordId: number;
109
+ provider: LLMProvider;
110
+ modelId: string;
111
+ model: string;
112
+ sortOrder: number;
113
+ };
114
+
115
+ /**
116
+ * User-editable values accepted when creating or changing a custom model.
117
+ *
118
+ * `id` must be the exact provider-facing model identifier and cannot contain
119
+ * whitespace. `model` is a concise display name. The provider is supplied by
120
+ * the route path so a row can never be moved across providers accidentally.
121
+ */
122
+ export type CustomProviderModelInput = {
123
+ id: string;
124
+ model: string;
125
+ };
126
+
127
+ // ---------------------------
128
+ //----------------- PROVIDER ACTIVE MODEL TYPES ------------
129
+ /**
130
+ * Provider-neutral result for the model that is actively driving a session or
131
+ * provider runtime at the time of lookup.
132
+ *
133
+ * `model` must always be populated. Provider adapters should use the
134
+ * provider-specific lookup method requested by the caller, and only fall back
135
+ * to the provider catalog `DEFAULT` value when the active model cannot be read.
136
+ */
137
+ export type ProviderCurrentActiveModel = {
138
+ model: string;
139
+ };
140
+
141
+ /**
142
+ * Where a resolved session model came from.
143
+ *
144
+ * `session` means the app has recorded a model for this session (the user
145
+ * picked one, or the session has been sent on at least once) and that value is
146
+ * authoritative. `provider` means the session predates any app-recorded model
147
+ * and the value was read back from the provider's own session state — the case
148
+ * for sessions started directly in a provider CLI. `default` means neither was
149
+ * available and the catalog default is standing in.
150
+ *
151
+ * Routes surface this so the frontend can tell a real selection apart from a
152
+ * placeholder without re-deriving the precedence chain.
153
+ */
154
+ export type ProviderSessionModelSource = 'session' | 'provider' | 'default';
155
+
156
+ /**
157
+ * The model one session runs with, its persisted reasoning effort when one has
158
+ * been recorded, and where the model answer came from.
159
+ *
160
+ * Returned by `providerModelsService.resolveSessionModel` and used by the
161
+ * `/models`, `/cost` and `/status` commands, the active-model route, and the
162
+ * composer's model picker so every surface agrees on one answer.
163
+ */
164
+ export type ProviderSessionModel = {
165
+ provider: LLMProvider;
166
+ sessionId: string | null;
167
+ model: string;
168
+ /** NULL means this session has not recorded an effort choice yet. */
169
+ effort: string | null;
170
+ source: ProviderSessionModelSource;
171
+ };
172
+
173
+ /**
174
+ * Message/event variants emitted by provider adapters and normalized transports.
175
+ *
176
+ * Keep this union in sync with event kinds produced by provider session adapters.
177
+ */
178
+ export type MessageKind =
179
+ | 'text'
180
+ | 'tool_use'
181
+ | 'tool_result'
182
+ | 'thinking'
183
+ | 'stream_delta'
184
+ | 'stream_end'
185
+ | 'error'
186
+ | 'complete'
187
+ | 'status'
188
+ | 'permission_request'
189
+ | 'permission_cancelled'
190
+ | 'session_created'
191
+ | 'interactive_prompt'
192
+ | 'task_notification';
193
+
194
+ /**
195
+ * Event kinds added by the chat gateway layer on top of provider message kinds.
196
+ *
197
+ * These are app-level realtime events (subscription acks, sidebar deltas,
198
+ * project loading progress, protocol failures) that are not produced by any
199
+ * provider adapter. Together with `MessageKind` they form the complete set of
200
+ * `kind` values a websocket client can receive, so the frontend only ever
201
+ * needs one kind-based switch.
202
+ */
203
+ export type GatewayEventKind =
204
+ | 'chat_subscribed'
205
+ | 'session_upserted'
206
+ | 'loading_progress'
207
+ | 'protocol_error';
208
+
209
+ /**
210
+ * Complete set of `kind` values emitted to websocket clients.
211
+ *
212
+ * Every server-to-client websocket frame carries a `kind` from this union.
213
+ * Provider runtimes emit `MessageKind` values; gateway services emit
214
+ * `GatewayEventKind` values.
215
+ */
216
+ export type ServerEventKind = MessageKind | GatewayEventKind;
217
+
218
+ /**
219
+ * Provider-neutral message envelope used in REST responses and realtime channels.
220
+ *
221
+ * Every provider-specific message must be converted into this shape before being
222
+ * emitted outside provider-specific modules.
223
+ */
224
+ export type NormalizedMessage = {
225
+ id: string;
226
+ sessionId: string;
227
+ timestamp: string;
228
+ provider: LLMProvider;
229
+ kind: MessageKind;
230
+ /**
231
+ * Monotonic per-run sequence number assigned by the chat run registry when a
232
+ * live event is forwarded to the websocket. History messages loaded over
233
+ * REST do not carry it. Clients use it with `chat.subscribe` to replay only
234
+ * the live events they missed across websocket reconnects.
235
+ */
236
+ seq?: number;
237
+ role?: 'user' | 'assistant';
238
+ content?: string;
239
+ /**
240
+ * Optional display-oriented metadata used by providers that need to expose
241
+ * richer transcript artifacts without introducing a brand-new message kind.
242
+ *
243
+ * Current Claude usage:
244
+ * - local slash commands expose parsed command fields
245
+ * - compact summaries are flagged so the UI can treat them differently later
246
+ */
247
+ displayText?: string;
248
+ commandName?: string;
249
+ commandMessage?: string;
250
+ commandArgs?: string;
251
+ isLocalCommand?: boolean;
252
+ isLocalCommandStdout?: boolean;
253
+ isCompactSummary?: boolean;
254
+ images?: unknown;
255
+ /** Non-image files attached to a user turn after provider history normalization. */
256
+ files?: unknown;
257
+ toolName?: string;
258
+ toolInput?: unknown;
259
+ toolId?: string;
260
+ toolResult?: {
261
+ content?: string;
262
+ isError?: boolean;
263
+ toolUseResult?: unknown;
264
+ };
265
+ isError?: boolean;
266
+ text?: string;
267
+ tokens?: number;
268
+ canInterrupt?: boolean;
269
+ requestId?: string;
270
+ input?: unknown;
271
+ context?: unknown;
272
+ reason?: string;
273
+ newSessionId?: string;
274
+ status?: string;
275
+ summary?: string;
276
+ tokenBudget?: unknown;
277
+ subagentTools?: unknown;
278
+ toolUseResult?: unknown;
279
+ sequence?: number;
280
+ rowid?: number;
281
+ [key: string]: unknown;
282
+ };
283
+
284
+ /**
285
+ * Output gateway shared by WebSocket and SSE provider runs.
286
+ *
287
+ * Runtime adapters only depend on this structural surface, which keeps them
288
+ * independent from the transport that ultimately delivers normalized events.
289
+ */
290
+ export type ProviderRuntimeWriter = {
291
+ send(data: unknown): void;
292
+ setSessionId?(sessionId: string): void;
293
+ userId?: string | number | null;
294
+ isWebSocketWriter?: boolean;
295
+ isSSEStreamWriter?: boolean;
296
+ };
297
+
298
+ //----------------- CODEX APP-SERVER PROTOCOL EVENTS ------------
299
+
300
+ /**
301
+ * Provider-neutral subset of one Codex app-server notification.
302
+ *
303
+ * The Codex JSON-RPC client emits this shape to its runtime adapter. Method and
304
+ * parameter validation stays in the adapter because the protocol can add new
305
+ * notification variants independently of CloudCLI releases.
306
+ */
307
+ export type CodexAppServerNotification = {
308
+ method: string;
309
+ params: AnyRecord;
310
+ };
311
+
312
+ /**
313
+ * Server-initiated Codex JSON-RPC request that may require a UI response.
314
+ *
315
+ * The Codex client forwards approval-capable requests to the runtime while it
316
+ * rejects request methods that CloudCLI does not implement.
317
+ */
318
+ export type CodexAppServerRequest = {
319
+ id: number;
320
+ method: string;
321
+ params: AnyRecord;
322
+ };
323
+
324
+ /**
325
+ * Terminal process event emitted by the Codex JSON-RPC client.
326
+ *
327
+ * Runtime operations subscribe to this event so an unexpected CLI exit always
328
+ * settles the chat run even when Codex cannot emit its normal turn completion.
329
+ */
330
+ export type CodexAppServerExit = {
331
+ error: Error;
332
+ };
333
+
334
+ // ---------------------------
335
+
336
+ export type ProviderPermissionDecision = {
337
+ allow: boolean;
338
+ updatedInput?: unknown;
339
+ message?: string;
340
+ rememberEntry?: unknown;
341
+ };
342
+
343
+ export type ProviderRuntimePermissionGateway = {
344
+ resolve(requestId: string, decision: ProviderPermissionDecision): void;
345
+ listPending(sessionId: string): unknown[];
346
+ };
347
+
348
+ /**
349
+ * Provider-scoped application capabilities supplied to a runtime for one run.
350
+ *
351
+ * Keeping these lookups outside concrete SDK/CLI adapters prevents the
352
+ * adapters from importing services that resolve back through providerRegistry.
353
+ */
354
+ export type ProviderRuntimeContext = {
355
+ resolveProviderSessionId(sessionId: string | null | undefined): string | null;
356
+ resolveResumeModel(
357
+ sessionId: string | undefined,
358
+ requestedModel?: string | null,
359
+ ): Promise<string | undefined>;
360
+ getProviderModels(): Promise<ProviderModelsDefinition>;
361
+ normalizeMessage(raw: unknown, sessionId: string | null): NormalizedMessage[];
362
+ isProviderInstalled(): Promise<boolean>;
363
+ };
364
+
365
+ export type ProviderRunFunction = (
366
+ command: string,
367
+ options: AnyRecord,
368
+ writer: ProviderRuntimeWriter,
369
+ ) => Promise<unknown>;
370
+
371
+ /**
372
+ * Shared options used to fetch historical provider messages.
373
+ *
374
+ * Consumers should pass provider-specific lookup hints (`projectPath`) only
375
+ * when the selected provider requires them.
376
+ *
377
+ * `providerSessionId` is the provider-native session id from the sessions
378
+ * index (transcript file name / provider database key). Provider adapters
379
+ * must use it — never the app-facing session id they were called with — when
380
+ * matching transcript rows on disk, because app-created sessions use an
381
+ * app-allocated id that the provider has never seen.
382
+ */
383
+ export type FetchHistoryOptions = {
384
+ projectPath?: string;
385
+ limit?: number | null;
386
+ offset?: number;
387
+ providerSessionId?: string;
388
+ };
389
+
390
+ /**
391
+ * Standardized response payload returned from provider history readers.
392
+ *
393
+ * Use this as the contract for APIs that return paginated conversation history.
394
+ */
395
+ export type FetchHistoryResult = {
396
+ messages: NormalizedMessage[];
397
+ total: number;
398
+ hasMore: boolean;
399
+ offset: number;
400
+ limit: number | null;
401
+ tokenUsage?: unknown;
402
+ };
403
+
404
+ // ---------------------------
405
+ //----------------- PROVIDER SKILL TYPES ------------
406
+ /**
407
+ * Scope where a provider skill definition was discovered.
408
+ *
409
+ * Provider skill adapters should use this to describe the origin of each
410
+ * skill markdown file without leaking provider-specific folder names into route
411
+ * contracts. `repo` is used for Codex repository lookup locations, while
412
+ * `project` is used for providers that treat workspace-local skills as project
413
+ * scoped.
414
+ */
415
+ export type ProviderSkillScope = 'user' | 'project' | 'plugin' | 'repo' | 'admin' | 'system';
416
+
417
+ /**
418
+ * Shared input accepted by provider skill listing operations.
419
+ *
420
+ * Routes pass `workspacePath` when a caller wants project/repository skills for
421
+ * a specific folder. Providers should fall back to the backend process cwd when
422
+ * this option is omitted.
423
+ */
424
+ export type ProviderSkillListOptions = {
425
+ workspacePath?: string;
426
+ };
427
+
428
+ /**
429
+ * One supporting file bundled with an uploaded provider skill.
430
+ *
431
+ * `relativePath` is resolved below the installed skill directory and must never
432
+ * be absolute or contain traversal segments. Text files may use `utf8`; binary
433
+ * scripts and assets should use `base64` so JSON transport does not corrupt
434
+ * their bytes.
435
+ */
436
+ export type ProviderSkillCreateFile = {
437
+ relativePath: string;
438
+ content: string;
439
+ encoding: 'utf8' | 'base64';
440
+ };
441
+
442
+ /**
443
+ * One skill markdown payload submitted for provider-managed installation.
444
+ *
445
+ * `content` is the raw markdown body that will be written to `SKILL.md`.
446
+ * `directoryName` lets callers control the target folder name explicitly when
447
+ * they want stable filesystem paths that differ from the markdown front matter
448
+ * `name` field. `fileName` is optional upload metadata used only as a final
449
+ * fallback when no directory name or front matter name is present. `files`
450
+ * carries scripts, references, and other files from a complete skill folder.
451
+ */
452
+ export type ProviderSkillCreateEntry = {
453
+ content: string;
454
+ directoryName?: string;
455
+ fileName?: string;
456
+ files?: ProviderSkillCreateFile[];
457
+ };
458
+
459
+ /**
460
+ * Shared input accepted by provider skill creation operations.
461
+ *
462
+ * The service layer batches multiple skill definitions in one request. Each
463
+ * entry can contain only markdown or a complete skill folder.
464
+ */
465
+ export type ProviderSkillCreateInput = {
466
+ entries: ProviderSkillCreateEntry[];
467
+ };
468
+
469
+ export type ProviderSkillRemoveInput = {
470
+ directoryName: string;
471
+ };
472
+
473
+ /**
474
+ * Normalized skill record returned by provider skill adapters.
475
+ *
476
+ * The `command` value is the exact invocation text the selected provider expects
477
+ * for this skill. Claude plugin skills use a namespaced command such as
478
+ * `/plugin-name:skill-name`, while Codex skills use the `$skill-name` form.
479
+ * `sourcePath` points to the skill markdown file that produced the record so
480
+ * callers can distinguish duplicate skill names across scopes.
481
+ */
482
+ export type ProviderSkill = {
483
+ provider: LLMProvider;
484
+ name: string;
485
+ description: string;
486
+ command: string;
487
+ scope: ProviderSkillScope;
488
+ sourcePath: string;
489
+ pluginName?: string;
490
+ pluginId?: string;
491
+ };
492
+
493
+ /**
494
+ * Internal source descriptor consumed by shared provider skill discovery logic.
495
+ *
496
+ * Concrete provider adapters build these records from their native lookup rules.
497
+ * The shared skills provider then scans `rootDir` for child skill markdown files
498
+ * and uses `commandForSkill` or `commandPrefix` to produce the provider-specific
499
+ * invocation command. Set `recursive` only when a provider stores skills under
500
+ * arbitrary nested folders below the source root.
501
+ */
502
+ export type ProviderSkillSource = {
503
+ scope: ProviderSkillScope;
504
+ rootDir: string;
505
+ recursive?: boolean;
506
+ commandPrefix?: '/' | '$';
507
+ commandForSkill?: (skillName: string) => string;
508
+ pluginName?: string;
509
+ pluginId?: string;
510
+ };
511
+
512
+ // ---------------------------
513
+ //----------------- SHARED ERROR TYPES ------------
514
+ /**
515
+ * Optional metadata used when constructing application-level errors.
516
+ *
517
+ * `statusCode` should reflect the HTTP response status, while `code` identifies
518
+ * the stable machine-readable error category.
519
+ */
520
+ export type AppErrorOptions = {
521
+ code?: string;
522
+ statusCode?: number;
523
+ details?: unknown;
524
+ };
525
+
526
+ // ---------------------------
527
+ //----------------- MCP TYPES ------------
528
+ /**
529
+ * Scope where an MCP server definition is stored and resolved.
530
+ *
531
+ * `user` is global for a user account, `local` is provider-local, and `project`
532
+ * is tied to a specific project path.
533
+ */
534
+ export type McpScope = 'user' | 'local' | 'project';
535
+
536
+ /**
537
+ * Transport protocol used by an MCP server definition.
538
+ */
539
+ export type McpTransport = 'stdio' | 'http' | 'sse';
540
+
541
+ /**
542
+ * Normalized MCP server model exposed to frontend and route handlers.
543
+ *
544
+ * Provider adapters should map provider-native config to this structure before
545
+ * returning results.
546
+ */
547
+ export type ProviderMcpServer = {
548
+ provider: LLMProvider;
549
+ name: string;
550
+ scope: McpScope;
551
+ transport: McpTransport;
552
+ command?: string;
553
+ args?: string[];
554
+ env?: Record<string, string>;
555
+ cwd?: string;
556
+ url?: string;
557
+ headers?: Record<string, string>;
558
+ envVars?: string[];
559
+ bearerTokenEnvVar?: string;
560
+ envHttpHeaders?: Record<string, string>;
561
+ };
562
+
563
+ /**
564
+ * Payload for create/update MCP server operations.
565
+ *
566
+ * Routes and services should accept this type, validate it, and then persist it
567
+ * through provider-specific MCP repositories.
568
+ */
569
+ export type UpsertProviderMcpServerInput = {
570
+ name: string;
571
+ scope?: McpScope;
572
+ transport: McpTransport;
573
+ workspacePath?: string;
574
+ command?: string;
575
+ args?: string[];
576
+ env?: Record<string, string>;
577
+ cwd?: string;
578
+ url?: string;
579
+ headers?: Record<string, string>;
580
+ envVars?: string[];
581
+ bearerTokenEnvVar?: string;
582
+ envHttpHeaders?: Record<string, string>;
583
+ };
584
+
585
+ // ---------------------------
586
+ //----------------- PROVIDER AUTH TYPES ------------
587
+ /**
588
+ * Authentication status result returned by provider health checks.
589
+ *
590
+ * This shape is consumed by settings/status endpoints to report installation and
591
+ * credential state for each provider.
592
+ */
593
+ export type ProviderAuthStatus = {
594
+ installed: boolean;
595
+ provider: LLMProvider;
596
+ authenticated: boolean;
597
+ email: string | null;
598
+ method: string | null;
599
+ error?: string;
600
+ };
601
+
602
+ // ---------------------------
603
+ //----------------- SHARED DATABASE CREDENTIAL TYPES ------------
604
+ /**
605
+ * Safe credential view returned by credential listing APIs.
606
+ *
607
+ * This intentionally excludes the raw credential secret while still exposing
608
+ * metadata needed for UI rendering and management operations.
609
+ */
610
+ export type CredentialPublicRow = {
611
+ id: number;
612
+ credential_name: string;
613
+ credential_type: string;
614
+ description: string | null;
615
+ created_at: string;
616
+ is_active: number;
617
+ };
618
+
619
+ /**
620
+ * Result returned after creating a credential record.
621
+ *
622
+ * Use this return shape when callers need the created id and display metadata,
623
+ * but must never receive the stored secret value.
624
+ */
625
+ export type CreateCredentialResult = {
626
+ id: number | bigint;
627
+ credentialName: string;
628
+ credentialType: string;
629
+ };
630
+
631
+ // ---------------------------
632
+ //----------------- PROJECT PERSISTENCE TYPES ------------
633
+ /**
634
+ * Canonical project row shape returned by the projects repository.
635
+ *
636
+ * Use this type whenever backend services need to pass around one database
637
+ * project record without leaking raw SQL row typing across modules.
638
+ */
639
+ export type ProjectRepositoryRow = {
640
+ project_id: string;
641
+ project_path: string;
642
+ custom_project_name: string | null;
643
+ isStarred: number;
644
+ isArchived: number;
645
+ };
646
+
647
+ /**
648
+ * Result category returned by `projectsDb.createProjectPath`.
649
+ *
650
+ * `created` means a fresh row was inserted, `reactivated_archived` means an
651
+ * existing archived path was accepted and updated, and `active_conflict` means
652
+ * an already-active path blocked project creation.
653
+ */
654
+ export type CreateProjectPathOutcome =
655
+ | 'created'
656
+ | 'reactivated_archived'
657
+ | 'active_conflict';
658
+
659
+ /**
660
+ * Structured result returned by project-path upsert operations.
661
+ *
662
+ * Services should use this result to decide whether a request succeeded,
663
+ * should return a conflict, or needs follow-up retrieval of row metadata.
664
+ */
665
+ export type CreateProjectPathResult = {
666
+ outcome: CreateProjectPathOutcome;
667
+ project: ProjectRepositoryRow | null;
668
+ };
669
+
670
+ /**
671
+ * Validation result for user-supplied workspace/project paths.
672
+ *
673
+ * `resolvedPath` is present only when validation succeeds. `error` is present
674
+ * only when validation fails and is suitable for user-facing diagnostics.
675
+ */
676
+ export type WorkspacePathValidationResult = {
677
+ valid: boolean;
678
+ resolvedPath?: string;
679
+ error?: string;
680
+ };
681
+
682
+ // ---------------------------
683
+ //----------------- GIT WORKTREE MANAGEMENT ------------
684
+ /**
685
+ * Captured output of one completed `git` invocation.
686
+ *
687
+ * Returned by `GitCommandRunner` implementations so worktree services can read
688
+ * both streams without caring about process plumbing.
689
+ */
690
+ export type GitCommandResult = {
691
+ stdout: string;
692
+ stderr: string;
693
+ };
694
+
695
+ /**
696
+ * Executes `git <args>` inside `cwd` and resolves with the captured output.
697
+ *
698
+ * All worktree services receive their git access through this contract so
699
+ * tests can inject a fake runner instead of spawning real processes. The
700
+ * promise must reject (with `stderr` attached when available) on a non-zero
701
+ * exit code.
702
+ */
703
+ export type GitCommandRunner = (args: string[], cwd: string) => Promise<GitCommandResult>;
704
+
705
+ /**
706
+ * One entry parsed from `git worktree list --porcelain`.
707
+ *
708
+ * This is the raw repository-level view (path/HEAD/branch/flags) before any
709
+ * enrichment with project links or ahead/behind counts. `branch` is null for
710
+ * detached-HEAD worktrees.
711
+ */
712
+ export type WorktreePorcelainEntry = {
713
+ path: string;
714
+ headSha: string | null;
715
+ branch: string | null;
716
+ isDetached: boolean;
717
+ isLocked: boolean;
718
+ isPrunable: boolean;
719
+ };
720
+
721
+ /**
722
+ * Fully enriched worktree row served to the UI.
723
+ *
724
+ * Extends the porcelain entry with everything the Worktrees panel renders:
725
+ * dirty-file count, ahead/behind relative to the base branch (the branch
726
+ * checked out in the main worktree), last-commit metadata, and the CloudCLI
727
+ * project row linked to the worktree directory (if one was registered).
728
+ */
729
+ export type WorktreeDescriptor = {
730
+ path: string;
731
+ branch: string | null;
732
+ headSha: string | null;
733
+ isMain: boolean;
734
+ isCurrent: boolean;
735
+ isLocked: boolean;
736
+ isDetached: boolean;
737
+ changedFileCount: number;
738
+ ahead: number;
739
+ behind: number;
740
+ lastCommitSubject: string | null;
741
+ lastCommitDate: string | null;
742
+ linkedProjectId: string | null;
743
+ linkedProjectArchived: boolean;
744
+ };
745
+
746
+ /**
747
+ * Response payload of `GET /api/worktrees`.
748
+ *
749
+ * `baseBranch` is the branch checked out in the main worktree — the merge
750
+ * target offered by the UI. `worktrees` always lists the main worktree first.
751
+ */
752
+ export type WorktreeListResult = {
753
+ repositoryRoot: string;
754
+ baseBranch: string | null;
755
+ worktrees: WorktreeDescriptor[];
756
+ };
757
+
758
+ // ---------------------------
759
+ //----------------- WORKTREE SERVICE INPUTS AND RESULTS ------------
760
+ /**
761
+ * Input accepted by the worktree-listing workflow.
762
+ *
763
+ * `projectPath` may point at the main checkout or any linked worktree. The
764
+ * service uses Git to resolve the complete repository-level worktree list.
765
+ */
766
+ export type ListWorktreesInput = {
767
+ projectPath: string;
768
+ };
769
+
770
+ /**
771
+ * Input accepted when creating a linked Git worktree.
772
+ *
773
+ * `branch` is checked out when it already exists, otherwise it is created from
774
+ * `baseBranch`. When `baseBranch` is omitted, the main worktree branch is used.
775
+ */
776
+ export type CreateWorktreeInput = {
777
+ projectPath: string;
778
+ branch: string;
779
+ baseBranch?: string | null;
780
+ };
781
+
782
+ /**
783
+ * Result of successfully creating a linked Git worktree.
784
+ *
785
+ * `createdBranch` distinguishes a new branch from an existing branch checkout,
786
+ * allowing API clients to accurately describe what Git changed.
787
+ */
788
+ export type CreateWorktreeResult = {
789
+ worktreePath: string;
790
+ branch: string;
791
+ createdBranch: boolean;
792
+ };
793
+
794
+ /**
795
+ * Result of atomically creating and registering a worktree for project use.
796
+ *
797
+ * The Worktrees application service compensates the Git creation if project
798
+ * registration fails, so routes only receive this shape after both steps pass.
799
+ */
800
+ export type CreateAndOpenWorktreeResult = CreateWorktreeResult & {
801
+ project: WorktreeProjectView;
802
+ };
803
+
804
+ /**
805
+ * Input accepted when registering an existing worktree as a CloudCLI project.
806
+ *
807
+ * The service verifies that `worktreePath` belongs to the repository containing
808
+ * `projectPath` before it creates or restores any project record.
809
+ */
810
+ export type OpenWorktreeInput = {
811
+ projectPath: string;
812
+ worktreePath: string;
813
+ };
814
+
815
+ /**
816
+ * Project view returned after a worktree is opened in CloudCLI.
817
+ *
818
+ * This deliberately mirrors the project-selection payload used by the Projects
819
+ * module so the frontend can switch to the worktree without another lookup.
820
+ */
821
+ export type WorktreeProjectView = {
822
+ projectId: string;
823
+ path: string;
824
+ fullPath: string;
825
+ displayName: string;
826
+ isStarred: boolean;
827
+ sessions: [];
828
+ sessionMeta: { hasMore: false; total: 0 };
829
+ };
830
+
831
+ /**
832
+ * Input accepted when removing a linked Git worktree.
833
+ *
834
+ * `force` permits removal with local changes. `deleteBranch` requests
835
+ * best-effort branch cleanup after the worktree directory is removed.
836
+ */
837
+ export type RemoveWorktreeInput = {
838
+ projectPath: string;
839
+ worktreePath: string;
840
+ force?: boolean;
841
+ deleteBranch?: boolean;
842
+ };
843
+
844
+ /**
845
+ * Result of removing a linked Git worktree.
846
+ *
847
+ * `archivalError` reports best-effort project archival failure after Git has
848
+ * already removed the worktree, allowing callers to represent partial success.
849
+ */
850
+ export type RemoveWorktreeResult = {
851
+ removedPath: string;
852
+ branch: string | null;
853
+ branchDeleted: boolean;
854
+ archivedProjectId: string | null;
855
+ archivalError: string | null;
856
+ };
857
+
858
+ /**
859
+ * Input accepted when merging a linked worktree into the main worktree branch.
860
+ *
861
+ * The service verifies both worktrees are clean, supports squash and regular
862
+ * merges, and may remove the source worktree after a successful merge.
863
+ */
864
+ export type MergeWorktreeInput = {
865
+ projectPath: string;
866
+ worktreePath: string;
867
+ squash?: boolean;
868
+ message?: string | null;
869
+ removeAfterMerge?: boolean;
870
+ };
871
+
872
+ /**
873
+ * Result of a completed worktree merge.
874
+ *
875
+ * `removedWorktree` is populated only when post-merge removal succeeds.
876
+ * `cleanupError` reports failed optional removal without misrepresenting the
877
+ * already-completed merge as a failure.
878
+ */
879
+ export type MergeWorktreeResult = {
880
+ mergedBranch: string;
881
+ targetBranch: string;
882
+ squash: boolean;
883
+ removedWorktree: RemoveWorktreeResult | null;
884
+ cleanupError: string | null;
885
+ };
886
+
887
+ // ---------------------------
888
+ //----------------- WORKTREE MODULE DEPENDENCY CONTRACTS ------------
889
+ /**
890
+ * Filesystem capability required by the Worktrees module.
891
+ *
892
+ * Production wiring checks the real filesystem; unit tests provide a small
893
+ * deterministic fake so worktree creation never touches developer directories.
894
+ */
895
+ export type WorktreeFileSystem = {
896
+ pathExists(candidatePath: string): Promise<boolean>;
897
+ };
898
+
899
+ /**
900
+ * Project-management boundary consumed by Worktrees workflows.
901
+ *
902
+ * The Worktrees module uses this contract instead of importing Database or
903
+ * Projects internals. Production adapters delegate through those modules'
904
+ * `index.ts` barrels, while unit tests supply in-memory functions.
905
+ */
906
+ export type WorktreeProjectGateway = {
907
+ getProjectPathById(projectId: string): string | null;
908
+ getProjectByPath(projectPath: string): ProjectRepositoryRow | null;
909
+ createProject(input: {
910
+ projectPath: string;
911
+ customName: string;
912
+ }): Promise<{
913
+ outcome: 'created' | 'reactivated_archived';
914
+ project: { projectId: string };
915
+ }>;
916
+ restoreProject(projectId: string): void | Promise<void>;
917
+ archiveProject(projectId: string): void | Promise<void>;
918
+ };
919
+
920
+ /**
921
+ * Complete application-service surface used by the Worktrees HTTP router.
922
+ *
923
+ * Routes parse transport values and call these functions; they do not import
924
+ * repositories, filesystem adapters, Git runners, or individual service files.
925
+ */
926
+ export type WorktreeServices = {
927
+ resolveProjectPath(projectId: string): string;
928
+ list(input: ListWorktreesInput): Promise<WorktreeListResult>;
929
+ create(input: CreateWorktreeInput): Promise<CreateWorktreeResult>;
930
+ createAndOpen(input: CreateWorktreeInput): Promise<CreateAndOpenWorktreeResult>;
931
+ open(input: OpenWorktreeInput): Promise<WorktreeProjectView>;
932
+ merge(input: MergeWorktreeInput): Promise<MergeWorktreeResult>;
933
+ remove(input: RemoveWorktreeInput): Promise<RemoveWorktreeResult>;
934
+ };
935
+
936
+ // ---------------------------
937
+ //----------------- FILE TREE MODULE CONTRACTS ------------
938
+ /**
939
+ * One filesystem item returned by the File Tree API.
940
+ *
941
+ * The service populates metadata without following symlinks and recursively
942
+ * attaches `children` only while the requested depth permits traversal. The
943
+ * frontend uses the absolute `path` as the stable identifier for editor and
944
+ * file-operation requests.
945
+ */
946
+ export type FileTreeNode = {
947
+ name: string;
948
+ path: string;
949
+ type: 'file' | 'directory';
950
+ size: number;
951
+ modified: string | null;
952
+ permissions: string;
953
+ permissionsRwx: string;
954
+ isSymlink?: boolean;
955
+ children?: FileTreeNode[];
956
+ };
957
+
958
+ /**
959
+ * Minimal directory-entry shape required during File Tree traversal.
960
+ *
961
+ * Production adapts Node `Dirent` objects to this structural contract. Tests
962
+ * provide small handwritten entries and therefore never read real directories.
963
+ */
964
+ export type FileTreeDirectoryEntry = {
965
+ name: string;
966
+ isDirectory(): boolean;
967
+ };
968
+
969
+ /**
970
+ * Minimal file-stat shape used for tree metadata and delete decisions.
971
+ *
972
+ * The numeric mode is converted to octal and rwx strings for the UI. `lstat`
973
+ * supplies symlink state while `stat` is used when deciding file versus folder
974
+ * deletion behavior.
975
+ */
976
+ export type FileTreeStats = {
977
+ size: number;
978
+ mtime: Date;
979
+ mode: number;
980
+ isDirectory(): boolean;
981
+ isSymbolicLink(): boolean;
982
+ };
983
+
984
+ /**
985
+ * Complete filesystem capability injected into File Tree services.
986
+ *
987
+ * The production composition root delegates these operations to Node's fs
988
+ * APIs. Unit tests provide deterministic path-keyed fakes so service tests
989
+ * cannot inspect, write, rename, or delete developer files.
990
+ */
991
+ export type FileTreeFileSystem = {
992
+ access(candidatePath: string): Promise<void>;
993
+ stat(candidatePath: string): Promise<FileTreeStats>;
994
+ lstat(candidatePath: string): Promise<FileTreeStats>;
995
+ // Streamed rather than returned as an array so a directory with millions of
996
+ // children is abandoned at the entry limit instead of being materialized.
997
+ openDirectory(directoryPath: string): AsyncIterable<FileTreeDirectoryEntry>;
998
+ realpath(candidatePath: string): Promise<string>;
999
+ readTextFile(filePath: string): Promise<string>;
1000
+ writeTextFile(filePath: string, content: string): Promise<void>;
1001
+ makeDirectory(directoryPath: string, recursive: boolean): Promise<void>;
1002
+ rename(oldPath: string, newPath: string): Promise<void>;
1003
+ removeDirectory(directoryPath: string): Promise<void>;
1004
+ unlink(filePath: string): Promise<void>;
1005
+ copyFile(sourcePath: string, destinationPath: string): Promise<void>;
1006
+ createReadStream(filePath: string): Readable;
1007
+ };
1008
+
1009
+ /**
1010
+ * Project lookup boundary consumed by File Tree workflows.
1011
+ *
1012
+ * File Tree services resolve DB-assigned project ids through this contract and
1013
+ * never import the Database module or its repositories directly.
1014
+ */
1015
+ export type FileTreeProjectGateway = {
1016
+ getProjectPathById(projectId: string): string | null | Promise<string | null>;
1017
+ };
1018
+
1019
+ /**
1020
+ * Workspace validation boundary used by filesystem browsing and folder creation.
1021
+ *
1022
+ * The injected validator enforces the configured workspace root and resolves
1023
+ * symlinks before the File Tree service exposes or mutates paths.
1024
+ */
1025
+ export type FileTreeWorkspaceGateway = {
1026
+ rootPath: string;
1027
+ validatePath(candidatePath: string): Promise<WorkspacePathValidationResult>;
1028
+ };
1029
+
1030
+ /**
1031
+ * Uploaded-file record passed from the Multer transport adapter into the File
1032
+ * Tree service.
1033
+ *
1034
+ * Transport-specific field names are normalized so upload workflows do not
1035
+ * depend on Express or Multer types.
1036
+ */
1037
+ export type FileTreeUploadedFile = {
1038
+ originalName: string;
1039
+ temporaryPath: string;
1040
+ size: number;
1041
+ mimeType: string;
1042
+ };
1043
+
1044
+ /**
1045
+ * Logger boundary for expected File Tree diagnostics.
1046
+ *
1047
+ * Production delegates to the server console. Unit tests use no-op or captured
1048
+ * loggers and never patch the global console singleton.
1049
+ */
1050
+ export type FileTreeLogger = {
1051
+ error(message: string, error?: unknown): void;
1052
+ };
1053
+
1054
+ /**
1055
+ * Required production dependencies for the File Tree application service.
1056
+ *
1057
+ * Filesystem, project lookup, workspace policy, MIME detection, concurrency,
1058
+ * and logging are all explicit so service construction has no hidden process,
1059
+ * repository, or machine-wide defaults.
1060
+ */
1061
+ export type FileTreeServiceDependencies = {
1062
+ fileSystem: FileTreeFileSystem;
1063
+ projects: FileTreeProjectGateway;
1064
+ workspace: FileTreeWorkspaceGateway;
1065
+ resolveMimeType(filePath: string): string;
1066
+ fileSystemConcurrency: number;
1067
+ logger: FileTreeLogger;
1068
+ };
1069
+
1070
+ /**
1071
+ * Complete File Tree application-service surface consumed by HTTP routes.
1072
+ *
1073
+ * Routes parse transport inputs and call these methods; they never resolve
1074
+ * project repositories, validate filesystem ownership, or perform filesystem
1075
+ * mutations themselves.
1076
+ */
1077
+ export type FileTreeServices = {
1078
+ browseWorkspace(inputPath: string | null): Promise<{
1079
+ path: string;
1080
+ suggestions: Array<{ path: string; name: string; type: 'directory' }>;
1081
+ }>;
1082
+ createWorkspaceFolder(folderPath: string): Promise<{ success: true; path: string }>;
1083
+ readTextFile(projectId: string, filePath: string): Promise<{ content: string; path: string }>;
1084
+ openFile(projectId: string, filePath: string): Promise<{ contentType: string; stream: Readable }>;
1085
+ saveTextFile(projectId: string, filePath: string, content: string): Promise<{
1086
+ success: true;
1087
+ path: string;
1088
+ message: string;
1089
+ }>;
1090
+ listProjectFiles(
1091
+ projectId: string,
1092
+ options?: { respectGitignore: boolean },
1093
+ ): Promise<FileTreeNode[]>;
1094
+ createEntry(input: {
1095
+ projectId: string;
1096
+ parentPath: string;
1097
+ type: 'file' | 'directory';
1098
+ name: string;
1099
+ }): Promise<{ success: true; path: string; name: string; type: 'file' | 'directory'; message: string }>;
1100
+ renameEntry(input: { projectId: string; oldPath: string; newName: string }): Promise<{
1101
+ success: true;
1102
+ oldPath: string;
1103
+ newPath: string;
1104
+ newName: string;
1105
+ message: string;
1106
+ }>;
1107
+ deleteEntry(input: { projectId: string; targetPath: string }): Promise<{
1108
+ success: true;
1109
+ path: string;
1110
+ type: 'file' | 'directory';
1111
+ message: string;
1112
+ }>;
1113
+ storeUploadedFiles(input: {
1114
+ projectId: string;
1115
+ targetPath: string;
1116
+ relativePaths: string[];
1117
+ requestedFileCount: number;
1118
+ files: FileTreeUploadedFile[];
1119
+ }): Promise<{
1120
+ success: true;
1121
+ files: Array<{ name: string; path: string; size: number; mimeType: string }>;
1122
+ uploadedCount: number;
1123
+ requestedFileCount: number;
1124
+ targetPath: string;
1125
+ message: string;
1126
+ }>;
1127
+ };
1128
+
1129
+ // ---------------------------
1130
+ //----------------- VOICE MODULE CONTRACTS ------------
1131
+ /**
1132
+ * Per-request voice settings parsed from authenticated HTTP headers.
1133
+ *
1134
+ * The Voice routes create this value from the optional `x-voice-*` headers and
1135
+ * pass it to the Voice service. Empty values mean "use the server-configured
1136
+ * default"; the backend base URL is intentionally absent because clients must
1137
+ * never control the server's outbound destination.
1138
+ */
1139
+ export type VoiceRequestOverrides = {
1140
+ apiKey?: string;
1141
+ sttModel?: string;
1142
+ ttsModel?: string;
1143
+ ttsVoice?: string;
1144
+ ttsFormat?: string;
1145
+ };
1146
+
1147
+ /**
1148
+ * Uploaded audio accepted by the Voice transcription service.
1149
+ *
1150
+ * Routes translate Multer's transport-specific file object into this minimal
1151
+ * shape so the service does not depend on Express or Multer types.
1152
+ */
1153
+ export type VoiceAudioUpload = {
1154
+ bytes: Buffer;
1155
+ mimeType: string;
1156
+ fileName: string;
1157
+ };
1158
+
1159
+ /**
1160
+ * Successful speech payload returned by the Voice service.
1161
+ *
1162
+ * The route copies `contentType` to the client response and pipes `body`
1163
+ * without buffering the complete synthesized audio in application memory.
1164
+ */
1165
+ export type VoiceSpeechPayload = {
1166
+ contentType: string;
1167
+ body: ReadableStream<Uint8Array> | null;
1168
+ };
1169
+
1170
+ /**
1171
+ * Explicit service result used by Voice routes instead of transport-aware
1172
+ * exceptions.
1173
+ *
1174
+ * Services return `ok: false` with the exact client status/message for expected
1175
+ * backend, validation, and timeout failures. Routes only translate the result
1176
+ * into HTTP output, while unexpected programming errors still reject normally.
1177
+ */
1178
+ export type VoiceServiceResult<TValue> =
1179
+ | { ok: true; value: TValue }
1180
+ | { ok: false; status: number; error: string };
1181
+
1182
+ /**
1183
+ * Complete application-service surface consumed by the Voice HTTP router.
1184
+ *
1185
+ * The composition root supplies a concrete implementation with environment
1186
+ * configuration and an injected outbound HTTP adapter. Unit tests use the same
1187
+ * contract with handwritten fetch fakes and never patch global state.
1188
+ */
1189
+ export type VoiceService = {
1190
+ getHealth(): { configured: boolean };
1191
+ transcribe(input: {
1192
+ audio: VoiceAudioUpload;
1193
+ overrides: VoiceRequestOverrides;
1194
+ }): Promise<VoiceServiceResult<{ text: string }>>;
1195
+ synthesizeSpeech(input: {
1196
+ text: string;
1197
+ overrides: VoiceRequestOverrides;
1198
+ }): Promise<VoiceServiceResult<VoiceSpeechPayload>>;
1199
+ };
1200
+
1201
+ // ---------------------------
1202
+ //----------------- CLI MODULE CONTRACTS ------------
1203
+ /**
1204
+ * Output boundary used by the CLI and Sandbox services.
1205
+ *
1206
+ * Production wiring delegates to the real console. Unit tests collect these
1207
+ * calls in arrays, which keeps command assertions deterministic and avoids
1208
+ * monkey-patching the global console singleton.
1209
+ */
1210
+ export type CliOutput = {
1211
+ log(message?: string): void;
1212
+ error(message?: string): void;
1213
+ };
1214
+
1215
+ /**
1216
+ * Minimal synchronous filesystem surface shared by CLI status reporting and
1217
+ * sandbox workspace validation.
1218
+ *
1219
+ * The production composition root adapts Node's filesystem module. Tests supply
1220
+ * path-keyed fakes, so service tests never inspect or modify the real machine.
1221
+ */
1222
+ export type CliFileSystem = {
1223
+ pathExists(filePath: string): boolean;
1224
+ getFileStats(filePath: string): { size: number; modifiedAt: Date };
1225
+ };
1226
+
1227
+ /**
1228
+ * Mutable environment view owned by the CLI application.
1229
+ *
1230
+ * CLI options update this object before the server starts. Production passes
1231
+ * `process.env`; tests pass a plain record to verify option precedence without
1232
+ * changing process-wide environment state.
1233
+ */
1234
+ export type CliEnvironment = Record<string, string | undefined>;
1235
+
1236
+ /**
1237
+ * Package metadata displayed by CLI help, status, version, and update commands.
1238
+ *
1239
+ * The composition root reads this once from the application package file and
1240
+ * injects only the fields the service needs.
1241
+ */
1242
+ export type CliPackageMetadata = {
1243
+ version: string;
1244
+ homepage?: string;
1245
+ bugsUrl?: string;
1246
+ };
1247
+
1248
+ /**
1249
+ * Executable CLI application returned by the CLI composition root.
1250
+ *
1251
+ * The thin executable entrypoint passes `process.argv` arguments to `run` and
1252
+ * copies the returned code to `process.exitCode`. Tests invoke the same method
1253
+ * directly with isolated dependencies.
1254
+ */
1255
+ export type CliApplication = {
1256
+ run(argumentsList: string[]): Promise<number>;
1257
+ };
1258
+
1259
+ /**
1260
+ * Sandbox command service consumed by the top-level CLI command dispatcher.
1261
+ *
1262
+ * Keeping this behind one required dependency lets CLI tests use a tiny fake,
1263
+ * while focused Sandbox tests exercise subprocess and filesystem behavior with
1264
+ * their own handwritten adapters.
1265
+ */
1266
+ export type SandboxCommandService = {
1267
+ execute(argumentsList: string[]): Promise<number>;
1268
+ };