@ai-projector/ide 0.0.0-stage → 0.11.0

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 (877) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -2
  3. package/bin/install-desktop +17 -0
  4. package/bin/install-desktop.cmd +11 -0
  5. package/bin/projector +22 -0
  6. package/bin/projector.cmd +11 -0
  7. package/dist/assets/CodeViewer-BAgvP3Yx.js +1 -0
  8. package/dist/assets/CodeViewer-QIU6uQDH.css +1 -0
  9. package/dist/assets/DiscussionView-83kZBzfq.js +2 -0
  10. package/dist/assets/DiscussionView-kEJZ0OhC.css +1 -0
  11. package/dist/assets/EditorSettings-CPklwfT-.js +13 -0
  12. package/dist/assets/EditorSettings-DVhn0sGg.css +1 -0
  13. package/dist/assets/HtmlViewer-C3Mf1IEK.css +1 -0
  14. package/dist/assets/HtmlViewer-CGHhO9bM.js +2 -0
  15. package/dist/assets/ImageViewport-BXN_-Ztv.css +1 -0
  16. package/dist/assets/ImageViewport-lPITcKgO.js +1 -0
  17. package/dist/assets/IssueView-CfdeTTKs.js +1 -0
  18. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  19. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  20. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  21. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  22. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  23. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  24. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  25. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  26. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  27. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  28. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  29. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  30. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  31. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  32. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  33. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  34. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  35. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  36. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  37. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  38. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  39. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  40. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  41. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  42. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  43. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  44. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  45. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  46. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  47. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  48. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  49. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  50. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  51. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  52. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  53. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  54. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  55. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  56. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  57. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  58. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  59. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  60. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  61. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  62. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  63. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  64. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  65. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  66. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  67. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  68. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  69. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  70. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  71. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  72. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  73. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  74. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  75. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  76. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  77. package/dist/assets/MarkdownViewer-3VG5ygRT.css +1 -0
  78. package/dist/assets/MarkdownViewer-DKZvt6XG.js +2 -0
  79. package/dist/assets/PullRequestView-Bce3nQML.js +3 -0
  80. package/dist/assets/PullRequestView-F_M37BOq.css +1 -0
  81. package/dist/assets/ReleaseView-BKH8Kb3T.css +1 -0
  82. package/dist/assets/ReleaseView-DO-R7ktE.js +2 -0
  83. package/dist/assets/SplitPanes-BJR26w00.css +1 -0
  84. package/dist/assets/SplitPanes-DR126xV8.js +1 -0
  85. package/dist/assets/SvgViewer-CEIl2Ob2.js +2 -0
  86. package/dist/assets/SvgViewer-DyAp20sd.css +1 -0
  87. package/dist/assets/TerminalView-CDAJ5gmT.js +16 -0
  88. package/dist/assets/TerminalView-DnkOpsvR.css +1 -0
  89. package/dist/assets/TrackerDetail-CV0Qqzx3.js +1 -0
  90. package/dist/assets/TrackerDetail-OFp4ONUm.css +1 -0
  91. package/dist/assets/UiPanel-CND7Qs_n.js +1 -0
  92. package/dist/assets/UiPanel-CS77nWcC.css +1 -0
  93. package/dist/assets/UiViewerPage-BOvnLith.css +1 -0
  94. package/dist/assets/UiViewerPage-z_s1uFHO.js +2 -0
  95. package/dist/assets/VisualMarkdownEditor-CcbKSvtd.css +1 -0
  96. package/dist/assets/VisualMarkdownEditor-CwwWF0eb.js +1069 -0
  97. package/dist/assets/_plugin-vue_export-helper-C4wFX7Eq.js +24 -0
  98. package/dist/assets/apl-gfMMiTNf.js +1 -0
  99. package/dist/assets/asciiarmor-C_eisQCp.js +1 -0
  100. package/dist/assets/asn1-DCl_8MCW.js +1 -0
  101. package/dist/assets/asterisk-BEn0Cwpx.js +1 -0
  102. package/dist/assets/brainfuck-D5EjA2JK.js +1 -0
  103. package/dist/assets/clike-xvONpD0Z.js +1 -0
  104. package/dist/assets/clojure-BflJGmDX.js +1 -0
  105. package/dist/assets/cmake-84nbDH0I.js +1 -0
  106. package/dist/assets/cobol-DHLQUbN7.js +1 -0
  107. package/dist/assets/coffeescript-De_zI4J0.js +1 -0
  108. package/dist/assets/commonlisp-DgAKBe0r.js +1 -0
  109. package/dist/assets/compiler-dom.esm-bundler-B0iuTsih.js +9 -0
  110. package/dist/assets/crystal-Bl6YKCG_.js +1 -0
  111. package/dist/assets/css-CnaYoQib.js +1 -0
  112. package/dist/assets/cypher-p9eYesGn.js +1 -0
  113. package/dist/assets/d-DWkQyNnU.js +1 -0
  114. package/dist/assets/diff-ChtP43wD.js +1 -0
  115. package/dist/assets/dist-23D313r2.js +13 -0
  116. package/dist/assets/dist-9YLT-RM-.js +11 -0
  117. package/dist/assets/dist-9guQ6tUS.js +1 -0
  118. package/dist/assets/dist-B1XyTjRF.js +1 -0
  119. package/dist/assets/dist-BA_HKdx1.js +2 -0
  120. package/dist/assets/dist-BVEl6uFx.js +1 -0
  121. package/dist/assets/dist-B_hKnsNE.js +1 -0
  122. package/dist/assets/dist-BnsBZm0f.js +1 -0
  123. package/dist/assets/dist-Br4AY_oy.js +1 -0
  124. package/dist/assets/dist-BuiJgwGF.js +9 -0
  125. package/dist/assets/dist-C-1XYtJO.js +1 -0
  126. package/dist/assets/dist-C1mn-4rn.js +1 -0
  127. package/dist/assets/dist-CRLdLpSX.js +2 -0
  128. package/dist/assets/dist-CpgyHBvu.js +1 -0
  129. package/dist/assets/dist-CrRIwgTS.js +1 -0
  130. package/dist/assets/dist-CxoUUhWx.js +1 -0
  131. package/dist/assets/dist-CyRvGpIP.js +1 -0
  132. package/dist/assets/dist-Dqsd8MyB.js +1 -0
  133. package/dist/assets/dist-DrZek4TY.js +1 -0
  134. package/dist/assets/dist-DzAS050M.js +23 -0
  135. package/dist/assets/dist-NMUsQt1c.js +1 -0
  136. package/dist/assets/dist-b78ZWHZy.js +1 -0
  137. package/dist/assets/dist-dwBOnDaY.js +2 -0
  138. package/dist/assets/dist-gPzXCSJV.js +6 -0
  139. package/dist/assets/dist-p1Xy77w3.js +1 -0
  140. package/dist/assets/dist-tNJpR9Y1.js +1 -0
  141. package/dist/assets/dockerfile-DJkHQgkl.js +1 -0
  142. package/dist/assets/dtd-DTF72YNO.js +1 -0
  143. package/dist/assets/dylan-S7ucR4pR.js +1 -0
  144. package/dist/assets/ebnf-D4c0_ac3.js +1 -0
  145. package/dist/assets/ecl-BVIeWmwY.js +1 -0
  146. package/dist/assets/editor-theme-DuQQ8n56.js +1 -0
  147. package/dist/assets/eiffel-BEjRio4Q.js +1 -0
  148. package/dist/assets/elm-Cshzl8qu.js +1 -0
  149. package/dist/assets/erlang-BV0c4Hdn.js +1 -0
  150. package/dist/assets/events.worker-C2Opu9Sc.js +1 -0
  151. package/dist/assets/external-link-BFTqPI03.js +1 -0
  152. package/dist/assets/factor-LKH5gN8L.js +1 -0
  153. package/dist/assets/fcl-ClOhbFR7.js +1 -0
  154. package/dist/assets/forth-D6RzAl64.js +1 -0
  155. package/dist/assets/fortran-Bt6PBEDR.js +1 -0
  156. package/dist/assets/gas-BHEdbvp9.js +1 -0
  157. package/dist/assets/gherkin-oBAE_ms0.js +1 -0
  158. package/dist/assets/github-emoji-C2UmmDoA.js +169 -0
  159. package/dist/assets/github-emoji-qJihbtN6.css +1 -0
  160. package/dist/assets/groovy-CUrWKPia.js +1 -0
  161. package/dist/assets/haskell-BRsoo5mP.js +1 -0
  162. package/dist/assets/haxe-DjVOVvNP.js +1 -0
  163. package/dist/assets/http-CLVgA2GD.js +1 -0
  164. package/dist/assets/hub-rvbmNftk.js +1 -0
  165. package/dist/assets/idl-BUZw3wgd.js +1 -0
  166. package/dist/assets/javascript-lS2r2ifg.js +1 -0
  167. package/dist/assets/julia-CQfgDRfP.js +1 -0
  168. package/dist/assets/livescript-BXxG0Yva.js +1 -0
  169. package/dist/assets/lua-DPCEkfD_.js +1 -0
  170. package/dist/assets/main-CgMl4Qjs.css +1 -0
  171. package/dist/assets/main-DEEGhxlk.js +186 -0
  172. package/dist/assets/mathematica-u8YMmbU0.js +1 -0
  173. package/dist/assets/mbox-BEMVcqjs.js +1 -0
  174. package/dist/assets/mirc-C9zpzAZU.js +1 -0
  175. package/dist/assets/mllike-B45xgp2S.js +1 -0
  176. package/dist/assets/modelica-CqHI_q-D.js +1 -0
  177. package/dist/assets/mscgen-qgSLujhx.js +1 -0
  178. package/dist/assets/mumps-BSzj6Xyz.js +1 -0
  179. package/dist/assets/nginx-C-ORUuei.js +1 -0
  180. package/dist/assets/nsis-viPvXFiq.js +1 -0
  181. package/dist/assets/ntriples-CzMBulkp.js +1 -0
  182. package/dist/assets/octave-D2Q8cUp1.js +1 -0
  183. package/dist/assets/oz-BwTct_5T.js +1 -0
  184. package/dist/assets/pascal-Dp_KdFgX.js +1 -0
  185. package/dist/assets/perl-BkSkiI9m.js +1 -0
  186. package/dist/assets/pig-AF4Hwhju.js +1 -0
  187. package/dist/assets/powershell-D8WpQPaX.js +1 -0
  188. package/dist/assets/preload-helper-BLdHbfdN.js +1 -0
  189. package/dist/assets/properties-C357ku5U.js +1 -0
  190. package/dist/assets/protobuf-D1ij_kNL.js +1 -0
  191. package/dist/assets/pug-BqCHZ5xT.js +1 -0
  192. package/dist/assets/puppet-BZyAS7I4.js +1 -0
  193. package/dist/assets/python-B_1Jd8HM.js +1 -0
  194. package/dist/assets/q-B9NhS7L_.js +1 -0
  195. package/dist/assets/r-CxDmU1I4.js +1 -0
  196. package/dist/assets/rpm-gpDK5sbt.js +1 -0
  197. package/dist/assets/ruby-ChfNwlCY.js +1 -0
  198. package/dist/assets/sas-C2OyD2Y6.js +1 -0
  199. package/dist/assets/scheme-D9qYN0V5.js +1 -0
  200. package/dist/assets/shared.esm-bundler-EUzHGNqQ.js +2 -0
  201. package/dist/assets/shared.worker-DpKROrNH.js +1 -0
  202. package/dist/assets/shell-DwuoZtxw.js +1 -0
  203. package/dist/assets/sieve-tLWDfEkZ.js +1 -0
  204. package/dist/assets/simple-mode-DXiLM1-G.js +1 -0
  205. package/dist/assets/smalltalk-BLp5-jwC.js +1 -0
  206. package/dist/assets/solr-B78wSQJQ.js +1 -0
  207. package/dist/assets/sparql-Dz-mlCAC.js +1 -0
  208. package/dist/assets/spreadsheet-CTIncYxj.js +1 -0
  209. package/dist/assets/sql-DuQMFDvy.js +1 -0
  210. package/dist/assets/stex-DNzd62Q_.js +1 -0
  211. package/dist/assets/styles-C07CLvbW.js +2 -0
  212. package/dist/assets/styles-CX3Ni7dk.css +1 -0
  213. package/dist/assets/stylus-BOVgKnng.js +1 -0
  214. package/dist/assets/swift-DKB6_1j6.js +1 -0
  215. package/dist/assets/tcl-BGfruO1u.js +1 -0
  216. package/dist/assets/textile-C4jVoHG1.js +1 -0
  217. package/dist/assets/tiddlywiki-VlUiK86J.js +1 -0
  218. package/dist/assets/tiki-CvUEFusT.js +1 -0
  219. package/dist/assets/toml-BPTmHmyx.js +1 -0
  220. package/dist/assets/troff-C2dAgh7P.js +1 -0
  221. package/dist/assets/ttcn-PPSTk1ow.js +1 -0
  222. package/dist/assets/ttcn-cfg-2b4Gb5sE.js +1 -0
  223. package/dist/assets/turtle-Cx3rYX2g.js +1 -0
  224. package/dist/assets/vb-BthdM_4N.js +1 -0
  225. package/dist/assets/vbscript-D9f6rSsU.js +1 -0
  226. package/dist/assets/velocity-CqftRsjg.js +1 -0
  227. package/dist/assets/verilog-CjI9Y6RI.js +1 -0
  228. package/dist/assets/vhdl-kS471soi.js +1 -0
  229. package/dist/assets/webidl-D5jiJvOU.js +1 -0
  230. package/dist/assets/xquery-BKJx4mf9.js +1 -0
  231. package/dist/assets/yacas-CXXgtw0p.js +1 -0
  232. package/dist/assets/z80-Co3PbHdE.js +1 -0
  233. package/dist/favicon.svg +5 -0
  234. package/dist/file-icons/LICENSE-lucide.txt +43 -0
  235. package/dist/file-icons/NOTICE.md +8 -0
  236. package/dist/file-icons/icons/archive.svg +1 -0
  237. package/dist/file-icons/icons/assets.svg +1 -0
  238. package/dist/file-icons/icons/audio.svg +1 -0
  239. package/dist/file-icons/icons/c.svg +1 -0
  240. package/dist/file-icons/icons/components.svg +1 -0
  241. package/dist/file-icons/icons/config.svg +1 -0
  242. package/dist/file-icons/icons/cpp.svg +1 -0
  243. package/dist/file-icons/icons/css.svg +1 -0
  244. package/dist/file-icons/icons/database.svg +1 -0
  245. package/dist/file-icons/icons/docker.svg +1 -0
  246. package/dist/file-icons/icons/env.svg +1 -0
  247. package/dist/file-icons/icons/executable.svg +1 -0
  248. package/dist/file-icons/icons/file.svg +1 -0
  249. package/dist/file-icons/icons/folder-open.svg +1 -0
  250. package/dist/file-icons/icons/folder.svg +1 -0
  251. package/dist/file-icons/icons/font.svg +1 -0
  252. package/dist/file-icons/icons/git.svg +1 -0
  253. package/dist/file-icons/icons/go.svg +1 -0
  254. package/dist/file-icons/icons/graphql.svg +1 -0
  255. package/dist/file-icons/icons/html.svg +1 -0
  256. package/dist/file-icons/icons/ignore.svg +1 -0
  257. package/dist/file-icons/icons/image.svg +1 -0
  258. package/dist/file-icons/icons/java.svg +1 -0
  259. package/dist/file-icons/icons/javascript.svg +1 -0
  260. package/dist/file-icons/icons/json.svg +1 -0
  261. package/dist/file-icons/icons/kotlin.svg +1 -0
  262. package/dist/file-icons/icons/license.svg +1 -0
  263. package/dist/file-icons/icons/lock.svg +1 -0
  264. package/dist/file-icons/icons/markdown.svg +1 -0
  265. package/dist/file-icons/icons/package.svg +1 -0
  266. package/dist/file-icons/icons/php.svg +1 -0
  267. package/dist/file-icons/icons/python.svg +1 -0
  268. package/dist/file-icons/icons/react.svg +1 -0
  269. package/dist/file-icons/icons/ruby.svg +1 -0
  270. package/dist/file-icons/icons/rust.svg +1 -0
  271. package/dist/file-icons/icons/sass.svg +1 -0
  272. package/dist/file-icons/icons/shell.svg +1 -0
  273. package/dist/file-icons/icons/source.svg +1 -0
  274. package/dist/file-icons/icons/svelte.svg +1 -0
  275. package/dist/file-icons/icons/swift.svg +1 -0
  276. package/dist/file-icons/icons/tests.svg +1 -0
  277. package/dist/file-icons/icons/toml.svg +1 -0
  278. package/dist/file-icons/icons/typescript.svg +1 -0
  279. package/dist/file-icons/icons/video.svg +1 -0
  280. package/dist/file-icons/icons/vite.svg +1 -0
  281. package/dist/file-icons/icons/vue.svg +1 -0
  282. package/dist/file-icons/icons/yaml.svg +1 -0
  283. package/dist/file-icons/theme.json +572 -0
  284. package/dist/file-icons/theme.schema.json +137 -0
  285. package/dist/github.svg +1 -0
  286. package/dist/gitlab.svg +1 -0
  287. package/dist/hub.html +19 -0
  288. package/dist/icons/apple-touch-icon.png +0 -0
  289. package/dist/icons/icon-192.png +0 -0
  290. package/dist/icons/icon-512.png +0 -0
  291. package/dist/icons/maskable-512.png +0 -0
  292. package/dist/index.html +39 -0
  293. package/dist/manifest.webmanifest +37 -0
  294. package/dist/sw.js +81 -0
  295. package/package.json +61 -3
  296. package/packages/cli/app/agent-host.js +163 -0
  297. package/packages/cli/app/desktop.js +77 -0
  298. package/packages/cli/app/fix-node-pty.js +52 -0
  299. package/packages/cli/app/import-companion-key.js +57 -0
  300. package/packages/cli/app/install-desktop.js +4 -0
  301. package/packages/cli/app/launch.js +134 -0
  302. package/packages/cli/app/restart.js +32 -0
  303. package/packages/cli/commands/logs.js +10 -0
  304. package/packages/cli/commands/open.js +49 -0
  305. package/packages/cli/commands/projects.js +18 -0
  306. package/packages/cli/commands/run.js +39 -0
  307. package/packages/cli/commands/search.js +19 -0
  308. package/packages/cli/commands/server.js +32 -0
  309. package/packages/cli/commands/status.js +42 -0
  310. package/packages/cli/common/output.js +13 -0
  311. package/packages/cli/modules/api/index.js +60 -0
  312. package/packages/cli/modules/arguments/index.js +188 -0
  313. package/packages/cli/modules/command-runtime/index.js +24 -0
  314. package/packages/cli/modules/projects/index.js +118 -0
  315. package/packages/cli/modules/server/index.js +226 -0
  316. package/packages/cli/modules/server-process/index.js +204 -0
  317. package/packages/core/modules/agent-features/index.js +8 -0
  318. package/packages/core/modules/agent-judge/index.js +73 -0
  319. package/packages/core/modules/agent-read/index.js +25 -0
  320. package/packages/core/modules/agent-role/index.js +187 -0
  321. package/packages/core/modules/agent-task/contract.js +34 -0
  322. package/packages/core/modules/agent-task/index.js +1 -0
  323. package/packages/core/modules/agent-widgets/bars/index.js +11 -0
  324. package/packages/core/modules/agent-widgets/button/index.js +19 -0
  325. package/packages/core/modules/agent-widgets/card/index.js +13 -0
  326. package/packages/core/modules/agent-widgets/checks/index.js +19 -0
  327. package/packages/core/modules/agent-widgets/chips/index.js +15 -0
  328. package/packages/core/modules/agent-widgets/columns/index.js +12 -0
  329. package/packages/core/modules/agent-widgets/donut/index.js +11 -0
  330. package/packages/core/modules/agent-widgets/field/index.js +39 -0
  331. package/packages/core/modules/agent-widgets/form/index.js +18 -0
  332. package/packages/core/modules/agent-widgets/git-info/index.js +29 -0
  333. package/packages/core/modules/agent-widgets/image/index.js +22 -0
  334. package/packages/core/modules/agent-widgets/inline-icon/index.js +45 -0
  335. package/packages/core/modules/agent-widgets/input/index.js +16 -0
  336. package/packages/core/modules/agent-widgets/intelligent-form/index.js +32 -0
  337. package/packages/core/modules/agent-widgets/line/index.js +12 -0
  338. package/packages/core/modules/agent-widgets/row/index.js +11 -0
  339. package/packages/core/modules/agent-widgets/safe-secret-show/index.js +21 -0
  340. package/packages/core/modules/agent-widgets/slider/index.js +18 -0
  341. package/packages/core/modules/agent-widgets/stat/index.js +16 -0
  342. package/packages/core/modules/agent-widgets/steps/index.js +14 -0
  343. package/packages/core/modules/agent-widgets/tab/index.js +12 -0
  344. package/packages/core/modules/agent-widgets/tabs/index.js +24 -0
  345. package/packages/core/modules/agents-integration/claude/index.js +1 -0
  346. package/packages/core/modules/agents-integration/codex/index.js +1 -0
  347. package/packages/core/modules/agents-integration/cursor/index.js +1 -0
  348. package/packages/core/modules/agents-integration/kimi/index.js +1 -0
  349. package/packages/core/modules/agents-integration/opencode/index.js +1 -0
  350. package/packages/core/modules/app-paths/index.js +14 -0
  351. package/packages/core/modules/app-paths/logs.js +194 -0
  352. package/packages/core/modules/app-paths/network-mode.js +24 -0
  353. package/packages/core/modules/app-paths/paths.js +40 -0
  354. package/packages/core/modules/app-paths/server-mode.js +18 -0
  355. package/packages/core/modules/appearance/index.js +35 -0
  356. package/packages/core/modules/browser/index.js +86 -0
  357. package/packages/core/modules/devcontainer/classify.js +101 -0
  358. package/packages/core/modules/devcontainer/contract.js +1 -0
  359. package/packages/core/modules/devcontainer/index.js +1 -0
  360. package/packages/core/modules/directories/contract.js +1 -0
  361. package/packages/core/modules/directories/index.js +1 -0
  362. package/packages/core/modules/docker/contract.js +1 -0
  363. package/packages/core/modules/docker/index.js +1 -0
  364. package/packages/core/modules/editor-themes/index.js +17 -0
  365. package/packages/core/modules/environment/index.js +1 -0
  366. package/packages/core/modules/file-icons/contract.js +177 -0
  367. package/packages/core/modules/file-icons/index.js +1 -0
  368. package/packages/core/modules/github/index.js +23 -0
  369. package/packages/core/modules/gitlab/index.js +164 -0
  370. package/packages/core/modules/hub/index.js +1 -0
  371. package/packages/core/modules/hub/protocol.js +19 -0
  372. package/packages/core/modules/ide/agent-command.js +48 -0
  373. package/packages/core/modules/ide/command-help.js +73 -0
  374. package/packages/core/modules/ide/commands.js +191 -0
  375. package/packages/core/modules/ide/index.js +6 -0
  376. package/packages/core/modules/ide/keybinding-editor.js +34 -0
  377. package/packages/core/modules/ide/keybindings.js +45 -0
  378. package/packages/core/modules/ide/palette.js +33 -0
  379. package/packages/core/modules/ide/safety.js +10 -0
  380. package/packages/core/modules/launcher/actions.js +5 -0
  381. package/packages/core/modules/launcher/index.js +5 -0
  382. package/packages/core/modules/launcher/launcher-model.js +236 -0
  383. package/packages/core/modules/launcher/launcher.js +76 -0
  384. package/packages/core/modules/launcher/query.js +42 -0
  385. package/packages/core/modules/network-mode/index.js +3 -0
  386. package/packages/core/modules/network-mode/network-mode.js +8 -0
  387. package/packages/core/modules/os/bash.js +11 -0
  388. package/packages/core/modules/os/contract.js +1 -0
  389. package/packages/core/modules/os/index.js +3 -0
  390. package/packages/core/modules/os/modules/darwin/catalog.js +108 -0
  391. package/packages/core/modules/os/modules/darwin/directories.js +40 -0
  392. package/packages/core/modules/os/modules/darwin/docker.js +15 -0
  393. package/packages/core/modules/os/modules/darwin/gtk.js +6 -0
  394. package/packages/core/modules/os/modules/darwin/helper.swift +172 -0
  395. package/packages/core/modules/os/modules/darwin/index.js +12 -0
  396. package/packages/core/modules/os/modules/darwin/install-desktop.js +135 -0
  397. package/packages/core/modules/os/modules/darwin/processes.js +97 -0
  398. package/packages/core/modules/os/modules/darwin/resident.js +235 -0
  399. package/packages/core/modules/os/modules/darwin/secrets.js +53 -0
  400. package/packages/core/modules/os/modules/darwin/shell.js +105 -0
  401. package/packages/core/modules/os/modules/darwin/shortcut.js +61 -0
  402. package/packages/core/modules/os/modules/darwin/tools.js +52 -0
  403. package/packages/core/modules/os/modules/darwin/windows.js +135 -0
  404. package/packages/core/modules/os/modules/linux/bus.js +48 -0
  405. package/packages/core/modules/os/modules/linux/catalog.js +47 -0
  406. package/packages/core/modules/os/modules/linux/directories.js +49 -0
  407. package/packages/core/modules/os/modules/linux/docker.js +48 -0
  408. package/packages/core/modules/os/modules/linux/index.js +53 -0
  409. package/packages/core/modules/os/modules/linux/install-desktop.js +66 -0
  410. package/packages/core/modules/os/modules/linux/processes.js +85 -0
  411. package/packages/core/modules/os/modules/linux/resident.js +139 -0
  412. package/packages/core/modules/os/modules/linux/secrets.js +118 -0
  413. package/packages/core/modules/os/modules/linux/shortcut.js +124 -0
  414. package/packages/core/modules/os/modules/linux/tools.js +14 -0
  415. package/packages/core/modules/os/modules/linux/tray.js +190 -0
  416. package/packages/core/modules/os/modules/linux/windows.js +187 -0
  417. package/packages/core/modules/os/modules/windows/agent-process.js +60 -0
  418. package/packages/core/modules/os/modules/windows/alert.js +20 -0
  419. package/packages/core/modules/os/modules/windows/catalog.js +91 -0
  420. package/packages/core/modules/os/modules/windows/color-scheme.js +26 -0
  421. package/packages/core/modules/os/modules/windows/directories.js +101 -0
  422. package/packages/core/modules/os/modules/windows/docker.js +17 -0
  423. package/packages/core/modules/os/modules/windows/git.js +42 -0
  424. package/packages/core/modules/os/modules/windows/hwnd.js +275 -0
  425. package/packages/core/modules/os/modules/windows/index.js +28 -0
  426. package/packages/core/modules/os/modules/windows/install-desktop.js +140 -0
  427. package/packages/core/modules/os/modules/windows/kill-tree.js +26 -0
  428. package/packages/core/modules/os/modules/windows/processes.js +300 -0
  429. package/packages/core/modules/os/modules/windows/ps.js +73 -0
  430. package/packages/core/modules/os/modules/windows/resident-pipe.js +206 -0
  431. package/packages/core/modules/os/modules/windows/resident.js +286 -0
  432. package/packages/core/modules/os/modules/windows/secrets.js +110 -0
  433. package/packages/core/modules/os/modules/windows/shell.js +288 -0
  434. package/packages/core/modules/os/modules/windows/shortcut.js +82 -0
  435. package/packages/core/modules/os/modules/windows/tools.js +273 -0
  436. package/packages/core/modules/os/modules/windows/windows.js +133 -0
  437. package/packages/core/modules/os/os.js +175 -0
  438. package/packages/core/modules/os/session-env.js +11 -0
  439. package/packages/core/modules/os-posix/agent-process.js +105 -0
  440. package/packages/core/modules/os-posix/contract.js +1 -0
  441. package/packages/core/modules/os-posix/git.js +26 -0
  442. package/packages/core/modules/os-posix/index.js +4 -0
  443. package/packages/core/modules/os-posix/tools.js +258 -0
  444. package/packages/core/modules/os-posix/xdg.js +8 -0
  445. package/packages/core/modules/project/contract.js +1 -0
  446. package/packages/core/modules/project/index.js +1 -0
  447. package/packages/core/modules/project/ref.js +126 -0
  448. package/packages/core/modules/server-mode/index.js +3 -0
  449. package/packages/core/modules/server-mode/server-mode.js +13 -0
  450. package/packages/core/modules/terminal/contract.js +1 -0
  451. package/packages/core/modules/terminal/index.js +1 -0
  452. package/packages/core/modules/usage-analytics/index.js +80 -0
  453. package/packages/core/modules/widget-catalog/guide.js +76 -0
  454. package/packages/core/modules/widget-catalog/index.js +219 -0
  455. package/packages/core/modules/workspace/changes.js +114 -0
  456. package/packages/core/modules/workspace/contract.js +1 -0
  457. package/packages/core/modules/workspace/file-size.js +12 -0
  458. package/packages/core/modules/workspace/files-exclude.js +119 -0
  459. package/packages/core/modules/workspace/git-decorations.js +4 -0
  460. package/packages/core/modules/workspace/git-graph.js +35 -0
  461. package/packages/core/modules/workspace/index.js +11 -0
  462. package/packages/core/modules/workspace/paths.js +16 -0
  463. package/packages/core/modules/workspace/pipeline-status.js +86 -0
  464. package/packages/core/modules/workspace/pull-requests.js +1 -0
  465. package/packages/core/modules/workspace/pull-status.js +56 -0
  466. package/packages/core/modules/workspace/scope.js +34 -0
  467. package/packages/core/modules/workspace/search.js +28 -0
  468. package/packages/core/modules/workspace/tree-page.js +25 -0
  469. package/packages/server/app/agents.js +30 -0
  470. package/packages/server/app/api.js +159 -0
  471. package/packages/server/app/claude-runner.js +17 -0
  472. package/packages/server/app/dev-plugin.js +76 -0
  473. package/packages/server/app/dev-runtime.js +119 -0
  474. package/packages/server/app/features.js +35 -0
  475. package/packages/server/app/plugin.js +140 -0
  476. package/packages/server/app/projector-runner.js +15 -0
  477. package/packages/server/app/runtime-contract.js +1 -0
  478. package/packages/server/app/standalone.js +42 -0
  479. package/packages/server/app/static.js +57 -0
  480. package/packages/server/app/widgets-mcp.js +36 -0
  481. package/packages/server/app/widgets.js +54 -0
  482. package/packages/server/middlewares/local-origin.js +4 -0
  483. package/packages/server/modules/access/access.js +118 -0
  484. package/packages/server/modules/access/connections.js +36 -0
  485. package/packages/server/modules/access/http.js +93 -0
  486. package/packages/server/modules/access/hub.js +19 -0
  487. package/packages/server/modules/access/index.js +6 -0
  488. package/packages/server/modules/access/lan-url.js +21 -0
  489. package/packages/server/modules/access/password.js +68 -0
  490. package/packages/server/modules/access/session.js +38 -0
  491. package/packages/server/modules/agent/agent-host.js +46 -0
  492. package/packages/server/modules/agent/agent-runs.js +162 -0
  493. package/packages/server/modules/agent/attachments.js +88 -0
  494. package/packages/server/modules/agent/backend.js +1 -0
  495. package/packages/server/modules/agent/chat-archive.js +67 -0
  496. package/packages/server/modules/agent/command-bridge.js +94 -0
  497. package/packages/server/modules/agent/controls.js +10 -0
  498. package/packages/server/modules/agent/event-streams.js +40 -0
  499. package/packages/server/modules/agent/history-store.js +320 -0
  500. package/packages/server/modules/agent/history.js +160 -0
  501. package/packages/server/modules/agent/hosted-process.js +279 -0
  502. package/packages/server/modules/agent/hosted-run.js +85 -0
  503. package/packages/server/modules/agent/hosted-runner.js +126 -0
  504. package/packages/server/modules/agent/index.js +35 -0
  505. package/packages/server/modules/agent/injection.js +14 -0
  506. package/packages/server/modules/agent/jobs-diff.js +114 -0
  507. package/packages/server/modules/agent/jobs-files.js +65 -0
  508. package/packages/server/modules/agent/jobs-followup.js +66 -0
  509. package/packages/server/modules/agent/jobs-live.js +180 -0
  510. package/packages/server/modules/agent/jobs-store.js +59 -0
  511. package/packages/server/modules/agent/jobs-worktree.js +161 -0
  512. package/packages/server/modules/agent/jobs.js +316 -0
  513. package/packages/server/modules/agent/judge-store.js +21 -0
  514. package/packages/server/modules/agent/lens-request.js +34 -0
  515. package/packages/server/modules/agent/queue-store.js +21 -0
  516. package/packages/server/modules/agent/recent-chats.js +63 -0
  517. package/packages/server/modules/agent/registry.js +108 -0
  518. package/packages/server/modules/agent/replay.js +84 -0
  519. package/packages/server/modules/agent/request.js +132 -0
  520. package/packages/server/modules/agent/role-store.js +21 -0
  521. package/packages/server/modules/agent/run-hub.js +105 -0
  522. package/packages/server/modules/agent/run-request.js +208 -0
  523. package/packages/server/modules/agent/secret-show.js +108 -0
  524. package/packages/server/modules/agent/side-request.js +142 -0
  525. package/packages/server/modules/agent/usage-history.js +62 -0
  526. package/packages/server/modules/agent/worktrees.js +136 -0
  527. package/packages/server/modules/agent-features/catalog.js +18 -0
  528. package/packages/server/modules/agent-features/index.js +2 -0
  529. package/packages/server/modules/agent-features/store.js +172 -0
  530. package/packages/server/modules/agent-mcp/index.js +106 -0
  531. package/packages/server/modules/agent-roles/index.js +3 -0
  532. package/packages/server/modules/agent-roles/project.js +231 -0
  533. package/packages/server/modules/agent-roles/runtime.js +68 -0
  534. package/packages/server/modules/agent-roles/store.js +190 -0
  535. package/packages/server/modules/agents/acp/acp-backend.js +320 -0
  536. package/packages/server/modules/agents/acp/acp-client.js +153 -0
  537. package/packages/server/modules/agents/acp/acp-controls.js +179 -0
  538. package/packages/server/modules/agents/acp/acp-dialect.js +82 -0
  539. package/packages/server/modules/agents/acp/acp-elicitation.js +135 -0
  540. package/packages/server/modules/agents/acp/acp-events.js +340 -0
  541. package/packages/server/modules/agents/acp/acp-process.js +78 -0
  542. package/packages/server/modules/agents/acp/acp-programs.js +11 -0
  543. package/packages/server/modules/agents/acp/acp-tools.js +208 -0
  544. package/packages/server/modules/agents/acp/index.js +4 -0
  545. package/packages/server/modules/agents/acp/mcp-config.js +100 -0
  546. package/packages/server/modules/agents/claude-code/claude-code-backend.js +342 -0
  547. package/packages/server/modules/agents/claude-code/claude-code-checkpoints.js +97 -0
  548. package/packages/server/modules/agents/claude-code/claude-code-env.js +46 -0
  549. package/packages/server/modules/agents/claude-code/claude-code-events.js +299 -0
  550. package/packages/server/modules/agents/claude-code/claude-code-input.js +97 -0
  551. package/packages/server/modules/agents/claude-code/claude-code-replay.js +71 -0
  552. package/packages/server/modules/agents/claude-code/claude-code-sessions.js +207 -0
  553. package/packages/server/modules/agents/claude-code/claude-code-times.js +42 -0
  554. package/packages/server/modules/agents/claude-code/index.js +2 -0
  555. package/packages/server/modules/agents/claude-code/questions.js +51 -0
  556. package/packages/server/modules/agents/codex/dialect.js +130 -0
  557. package/packages/server/modules/agents/codex/forms.js +24 -0
  558. package/packages/server/modules/agents/codex/index.js +17 -0
  559. package/packages/server/modules/agents/cursor/dialect.js +66 -0
  560. package/packages/server/modules/agents/cursor/images.js +12 -0
  561. package/packages/server/modules/agents/cursor/index.js +30 -0
  562. package/packages/server/modules/agents/cursor/plan.js +44 -0
  563. package/packages/server/modules/agents/cursor/questions.js +37 -0
  564. package/packages/server/modules/agents/cursor/selection.js +29 -0
  565. package/packages/server/modules/agents/cursor/task.js +32 -0
  566. package/packages/server/modules/agents/cursor/todos.js +69 -0
  567. package/packages/server/modules/agents/ide-mcp/config.js +40 -0
  568. package/packages/server/modules/agents/ide-mcp/index.js +1 -0
  569. package/packages/server/modules/agents/ide-mcp/server.js +154 -0
  570. package/packages/server/modules/agents/kimi/dialect.js +18 -0
  571. package/packages/server/modules/agents/kimi/index.js +11 -0
  572. package/packages/server/modules/agents/opencode/dialect.js +232 -0
  573. package/packages/server/modules/agents/opencode/index.js +21 -0
  574. package/packages/server/modules/agents/opencode/read.js +46 -0
  575. package/packages/server/modules/agents/opencode/sessions.js +69 -0
  576. package/packages/server/modules/agents/projector/agent-lens.js +110 -0
  577. package/packages/server/modules/agents/projector/agent-tools.js +290 -0
  578. package/packages/server/modules/agents/projector/answer-doctor.js +32 -0
  579. package/packages/server/modules/agents/projector/form-doctor.js +33 -0
  580. package/packages/server/modules/agents/projector/index.js +12 -0
  581. package/packages/server/modules/agents/projector/project-instructions.js +34 -0
  582. package/packages/server/modules/agents/projector/projector-backend.js +350 -0
  583. package/packages/server/modules/agents/projector/projector-budget.js +70 -0
  584. package/packages/server/modules/agents/projector/projector-compaction.js +128 -0
  585. package/packages/server/modules/agents/projector/projector-controls.js +70 -0
  586. package/packages/server/modules/agents/projector/projector-guard.js +196 -0
  587. package/packages/server/modules/agents/projector/projector-history.js +87 -0
  588. package/packages/server/modules/agents/projector/projector-hooks.js +201 -0
  589. package/packages/server/modules/agents/projector/projector-input.js +40 -0
  590. package/packages/server/modules/agents/projector/projector-mcp-config.js +1 -0
  591. package/packages/server/modules/agents/projector/projector-mcp.js +119 -0
  592. package/packages/server/modules/agents/projector/projector-memory.js +92 -0
  593. package/packages/server/modules/agents/projector/projector-retry.js +52 -0
  594. package/packages/server/modules/agents/projector/projector-review.js +40 -0
  595. package/packages/server/modules/agents/projector/projector-side.js +56 -0
  596. package/packages/server/modules/agents/projector/projector-skills.js +143 -0
  597. package/packages/server/modules/agents/projector/projector-task.js +235 -0
  598. package/packages/server/modules/agents/projector/projector-usage.js +19 -0
  599. package/packages/server/modules/agents/projector/projector-web-search.js +76 -0
  600. package/packages/server/modules/agents/projector/projector-web.js +172 -0
  601. package/packages/server/modules/agents/projector/prompts.js +46 -0
  602. package/packages/server/modules/agents/projector/secrets/secret-destination.js +226 -0
  603. package/packages/server/modules/agents/projector/secrets/secret-show.js +23 -0
  604. package/packages/server/modules/agents/projector/secrets/secret-tools.js +124 -0
  605. package/packages/server/modules/agents/projector/tool-spec.js +4 -0
  606. package/packages/server/modules/agents/projector/tool-specs.js +167 -0
  607. package/packages/server/modules/agents/projector/widgets.js +4 -0
  608. package/packages/server/modules/agents/widgets-mcp/config.js +34 -0
  609. package/packages/server/modules/agents/widgets-mcp/index.js +1 -0
  610. package/packages/server/modules/agents-integration/_/usage-cache.js +19 -0
  611. package/packages/server/modules/agents-integration/claude/client.js +33 -0
  612. package/packages/server/modules/agents-integration/claude/index.js +1 -0
  613. package/packages/server/modules/agents-integration/claude/usage.js +49 -0
  614. package/packages/server/modules/agents-integration/codex/cli.js +86 -0
  615. package/packages/server/modules/agents-integration/codex/index.js +1 -0
  616. package/packages/server/modules/agents-integration/codex/usage.js +45 -0
  617. package/packages/server/modules/agents-integration/cursor/client.js +40 -0
  618. package/packages/server/modules/agents-integration/cursor/credentials.js +34 -0
  619. package/packages/server/modules/agents-integration/cursor/index.js +1 -0
  620. package/packages/server/modules/agents-integration/cursor/usage.js +59 -0
  621. package/packages/server/modules/agents-integration/kimi/client.js +48 -0
  622. package/packages/server/modules/agents-integration/kimi/credential-config.js +167 -0
  623. package/packages/server/modules/agents-integration/kimi/credentials.js +261 -0
  624. package/packages/server/modules/agents-integration/kimi/index.js +1 -0
  625. package/packages/server/modules/agents-integration/kimi/usage.js +149 -0
  626. package/packages/server/modules/agents-integration/opencode/client.js +30 -0
  627. package/packages/server/modules/agents-integration/opencode/credentials.js +36 -0
  628. package/packages/server/modules/agents-integration/opencode/index.js +1 -0
  629. package/packages/server/modules/agents-integration/opencode/usage.js +47 -0
  630. package/packages/server/modules/appearance/index.js +38 -0
  631. package/packages/server/modules/browser/cookies.js +112 -0
  632. package/packages/server/modules/browser/guard.js +55 -0
  633. package/packages/server/modules/browser/index.js +2 -0
  634. package/packages/server/modules/browser/key.js +34 -0
  635. package/packages/server/modules/browser/proxy.js +255 -0
  636. package/packages/server/modules/browser/rewrite.js +82 -0
  637. package/packages/server/modules/devcontainer/discovery.js +85 -0
  638. package/packages/server/modules/devcontainer/exec.js +81 -0
  639. package/packages/server/modules/devcontainer/index.js +4 -0
  640. package/packages/server/modules/devcontainer/launch.js +51 -0
  641. package/packages/server/modules/devcontainer/state.js +68 -0
  642. package/packages/server/modules/devcontainer/trust.js +41 -0
  643. package/packages/server/modules/directories/directories.js +34 -0
  644. package/packages/server/modules/directories/index.js +1 -0
  645. package/packages/server/modules/docker/actions.js +121 -0
  646. package/packages/server/modules/docker/daemon.js +72 -0
  647. package/packages/server/modules/docker/index.js +4 -0
  648. package/packages/server/modules/docker/settings.js +127 -0
  649. package/packages/server/modules/docker/snapshot.js +105 -0
  650. package/packages/server/modules/environments/execution.js +125 -0
  651. package/packages/server/modules/environments/index.js +3 -0
  652. package/packages/server/modules/environments/reconcile.js +62 -0
  653. package/packages/server/modules/environments/settings.js +58 -0
  654. package/packages/server/modules/events/implementation.js +85 -0
  655. package/packages/server/modules/events/index.js +1 -0
  656. package/packages/server/modules/folder-picker/index.js +1 -0
  657. package/packages/server/modules/folder-picker/pick-folder.js +2 -0
  658. package/packages/server/modules/git-import/clone.js +47 -0
  659. package/packages/server/modules/git-import/container.js +57 -0
  660. package/packages/server/modules/git-import/import.js +82 -0
  661. package/packages/server/modules/git-import/index.js +4 -0
  662. package/packages/server/modules/git-import/jobs.js +68 -0
  663. package/packages/server/modules/github/api.js +260 -0
  664. package/packages/server/modules/github/browser.js +185 -0
  665. package/packages/server/modules/github/clone.js +55 -0
  666. package/packages/server/modules/github/container.js +15 -0
  667. package/packages/server/modules/github/discussions.js +141 -0
  668. package/packages/server/modules/github/emojis.js +14 -0
  669. package/packages/server/modules/github/history.js +205 -0
  670. package/packages/server/modules/github/index.js +11 -0
  671. package/packages/server/modules/github/issues.js +81 -0
  672. package/packages/server/modules/github/navigation.js +35 -0
  673. package/packages/server/modules/github/pipelines.js +266 -0
  674. package/packages/server/modules/github/pulls.js +111 -0
  675. package/packages/server/modules/github/releases.js +241 -0
  676. package/packages/server/modules/gitlab/api.js +257 -0
  677. package/packages/server/modules/gitlab/base.js +24 -0
  678. package/packages/server/modules/gitlab/blob-search.js +110 -0
  679. package/packages/server/modules/gitlab/browser.js +296 -0
  680. package/packages/server/modules/gitlab/clone.js +78 -0
  681. package/packages/server/modules/gitlab/compare.js +68 -0
  682. package/packages/server/modules/gitlab/connection.js +55 -0
  683. package/packages/server/modules/gitlab/container.js +15 -0
  684. package/packages/server/modules/gitlab/history.js +127 -0
  685. package/packages/server/modules/gitlab/icon.js +67 -0
  686. package/packages/server/modules/gitlab/index.js +14 -0
  687. package/packages/server/modules/gitlab/issues.js +61 -0
  688. package/packages/server/modules/gitlab/merge-requests.js +287 -0
  689. package/packages/server/modules/gitlab/navigation.js +187 -0
  690. package/packages/server/modules/gitlab/oauth.js +250 -0
  691. package/packages/server/modules/gitlab/pipelines.js +240 -0
  692. package/packages/server/modules/gitlab/releases.js +226 -0
  693. package/packages/server/modules/gitlab/search.js +75 -0
  694. package/packages/server/modules/gitlab/trackers.js +96 -0
  695. package/packages/server/modules/http/download.js +50 -0
  696. package/packages/server/modules/http/http.js +8 -0
  697. package/packages/server/modules/http/index.js +2 -0
  698. package/packages/server/modules/hub/connector.js +114 -0
  699. package/packages/server/modules/hub/hub.js +142 -0
  700. package/packages/server/modules/hub/index.js +1 -0
  701. package/packages/server/modules/ide/editor-settings.js +37 -0
  702. package/packages/server/modules/ide/index.js +3 -0
  703. package/packages/server/modules/ide/keybindings.js +37 -0
  704. package/packages/server/modules/ide/mcp-bridge.js +150 -0
  705. package/packages/server/modules/instance/index.js +2 -0
  706. package/packages/server/modules/instance/instance.js +50 -0
  707. package/packages/server/modules/integration-store/index.js +2 -0
  708. package/packages/server/modules/integration-store/list.js +12 -0
  709. package/packages/server/modules/integration-store/store.js +141 -0
  710. package/packages/server/modules/judge/approval.js +35 -0
  711. package/packages/server/modules/judge/index.js +3 -0
  712. package/packages/server/modules/judge/settings.js +35 -0
  713. package/packages/server/modules/judge/verdict.js +141 -0
  714. package/packages/server/modules/launcher/browse.js +29 -0
  715. package/packages/server/modules/launcher/folders.js +138 -0
  716. package/packages/server/modules/launcher/hosted-search.js +43 -0
  717. package/packages/server/modules/launcher/index.js +12 -0
  718. package/packages/server/modules/launcher/launcher.js +352 -0
  719. package/packages/server/modules/launcher/potential.js +70 -0
  720. package/packages/server/modules/launcher/project-entries.js +165 -0
  721. package/packages/server/modules/network/eu-context.js +29 -0
  722. package/packages/server/modules/network/index.js +1 -0
  723. package/packages/server/modules/openai-gateway/config.js +125 -0
  724. package/packages/server/modules/openai-gateway/gateway.js +178 -0
  725. package/packages/server/modules/openai-gateway/index.js +7 -0
  726. package/packages/server/modules/preferences/index.js +7 -0
  727. package/packages/server/modules/preferences/preferences.js +142 -0
  728. package/packages/server/modules/processes/index.js +6 -0
  729. package/packages/server/modules/processes/processes.js +174 -0
  730. package/packages/server/modules/project-presentation/implementation.js +130 -0
  731. package/packages/server/modules/project-presentation/index.js +1 -0
  732. package/packages/server/modules/project-widgets/index.js +210 -0
  733. package/packages/server/modules/projects/discovery.js +179 -0
  734. package/packages/server/modules/projects/favicon.js +180 -0
  735. package/packages/server/modules/projects/index.js +11 -0
  736. package/packages/server/modules/projects/inspect.js +148 -0
  737. package/packages/server/modules/projects/remote-icon.js +39 -0
  738. package/packages/server/modules/projects/store.js +41 -0
  739. package/packages/server/modules/projects/types.js +1 -0
  740. package/packages/server/modules/providers/atomic-file.js +29 -0
  741. package/packages/server/modules/providers/balance.js +125 -0
  742. package/packages/server/modules/providers/index.js +15 -0
  743. package/packages/server/modules/providers/kinds.js +24 -0
  744. package/packages/server/modules/providers/model-list.js +16 -0
  745. package/packages/server/modules/providers/models.js +124 -0
  746. package/packages/server/modules/providers/openai-client.js +40 -0
  747. package/packages/server/modules/providers/provider-seeds.js +39 -0
  748. package/packages/server/modules/providers/provider-store.js +317 -0
  749. package/packages/server/modules/providers/quiet-model.js +36 -0
  750. package/packages/server/modules/providers/secret-obfuscation.js +48 -0
  751. package/packages/server/modules/providers/thinking.js +105 -0
  752. package/packages/server/modules/providers/types.js +1 -0
  753. package/packages/server/modules/restart/index.js +1 -0
  754. package/packages/server/modules/restart/restart.js +56 -0
  755. package/packages/server/modules/secrets/index.js +1 -0
  756. package/packages/server/modules/secrets/vault.js +51 -0
  757. package/packages/server/modules/spend/index.js +2 -0
  758. package/packages/server/modules/spend/ledger.js +82 -0
  759. package/packages/server/modules/spend/store.js +92 -0
  760. package/packages/server/modules/terminal/drop-files.js +42 -0
  761. package/packages/server/modules/terminal/index.js +15 -0
  762. package/packages/server/modules/terminal/link-files.js +44 -0
  763. package/packages/server/modules/terminal/scenario-folder.js +20 -0
  764. package/packages/server/modules/terminal/session-state.js +85 -0
  765. package/packages/server/modules/terminal/socket.js +159 -0
  766. package/packages/server/modules/terminal/terminal-activity.js +56 -0
  767. package/packages/server/modules/terminal/terminal-file.js +32 -0
  768. package/packages/server/modules/terminal/terminal-mouse.js +29 -0
  769. package/packages/server/modules/terminal/terminal.js +308 -0
  770. package/packages/server/modules/terminal/terminate.js +68 -0
  771. package/packages/server/modules/terminal-control/control.js +75 -0
  772. package/packages/server/modules/terminal-control/handlers.js +10 -0
  773. package/packages/server/modules/terminal-control/index.js +3 -0
  774. package/packages/server/modules/terminal-control/shared-socket.js +319 -0
  775. package/packages/server/modules/terminal-control/socket.js +153 -0
  776. package/packages/server/modules/transport/implementation.js +24 -0
  777. package/packages/server/modules/transport/index.js +2 -0
  778. package/packages/server/modules/transport/router.js +16 -0
  779. package/packages/server/modules/transport/types.js +1 -0
  780. package/packages/server/modules/usage-analytics/index.js +4 -0
  781. package/packages/server/modules/usage-analytics/limits.js +144 -0
  782. package/packages/server/modules/usage-analytics/overview.js +117 -0
  783. package/packages/server/modules/usage-analytics/providers.js +120 -0
  784. package/packages/server/modules/usage-analytics/store.js +152 -0
  785. package/packages/server/modules/window/desktop.js +24 -0
  786. package/packages/server/modules/window/index.js +8 -0
  787. package/packages/server/modules/window/window.js +86 -0
  788. package/packages/server/modules/workspace/archive.py +109 -0
  789. package/packages/server/modules/workspace/external-files.js +22 -0
  790. package/packages/server/modules/workspace/files-exclude.js +73 -0
  791. package/packages/server/modules/workspace/files.js +332 -0
  792. package/packages/server/modules/workspace/find-paths.js +92 -0
  793. package/packages/server/modules/workspace/git-branches.js +159 -0
  794. package/packages/server/modules/workspace/git-compare.js +121 -0
  795. package/packages/server/modules/workspace/git-history.js +182 -0
  796. package/packages/server/modules/workspace/git-sync.js +245 -0
  797. package/packages/server/modules/workspace/git-tree.js +126 -0
  798. package/packages/server/modules/workspace/git.js +276 -0
  799. package/packages/server/modules/workspace/ignored.js +23 -0
  800. package/packages/server/modules/workspace/import.js +190 -0
  801. package/packages/server/modules/workspace/index.js +15 -0
  802. package/packages/server/modules/workspace/paths.js +38 -0
  803. package/packages/server/modules/workspace/reveal.js +14 -0
  804. package/packages/server/modules/workspace/search.js +136 -0
  805. package/packages/server/modules/workspace/site.js +62 -0
  806. package/packages/server/modules/workspace/watcher.js +176 -0
  807. package/packages/server/routes/api/agent-answer-repair.js +35 -0
  808. package/packages/server/routes/api/agent-chats.js +77 -0
  809. package/packages/server/routes/api/agent-features.js +36 -0
  810. package/packages/server/routes/api/agent-form-repair.js +35 -0
  811. package/packages/server/routes/api/agent-hooks.js +35 -0
  812. package/packages/server/routes/api/agent-jobs.js +322 -0
  813. package/packages/server/routes/api/agent-judge.js +33 -0
  814. package/packages/server/routes/api/agent-lens.js +27 -0
  815. package/packages/server/routes/api/agent-mcp.js +41 -0
  816. package/packages/server/routes/api/agent-memory.js +33 -0
  817. package/packages/server/routes/api/agent-project-roles.js +112 -0
  818. package/packages/server/routes/api/agent-project-widgets.js +67 -0
  819. package/packages/server/routes/api/agent-roles.js +106 -0
  820. package/packages/server/routes/api/agent-secret-show.js +87 -0
  821. package/packages/server/routes/api/agent-side.js +70 -0
  822. package/packages/server/routes/api/agent-skills.js +31 -0
  823. package/packages/server/routes/api/agent-web.js +27 -0
  824. package/packages/server/routes/api/agent-worktrees.js +49 -0
  825. package/packages/server/routes/api/agent.js +269 -0
  826. package/packages/server/routes/api/analytics.js +21 -0
  827. package/packages/server/routes/api/app/hide.js +12 -0
  828. package/packages/server/routes/api/app/mode.js +49 -0
  829. package/packages/server/routes/api/app/network.js +54 -0
  830. package/packages/server/routes/api/app/open.js +33 -0
  831. package/packages/server/routes/api/app/quit.js +14 -0
  832. package/packages/server/routes/api/app/restart.js +18 -0
  833. package/packages/server/routes/api/appearance.js +70 -0
  834. package/packages/server/routes/api/browser.js +27 -0
  835. package/packages/server/routes/api/claude.js +15 -0
  836. package/packages/server/routes/api/codex.js +15 -0
  837. package/packages/server/routes/api/cursor.js +15 -0
  838. package/packages/server/routes/api/directories.js +16 -0
  839. package/packages/server/routes/api/docker.js +74 -0
  840. package/packages/server/routes/api/events.js +25 -0
  841. package/packages/server/routes/api/health.js +20 -0
  842. package/packages/server/routes/api/hub.js +26 -0
  843. package/packages/server/routes/api/ide/commands.js +72 -0
  844. package/packages/server/routes/api/ide/editor.js +37 -0
  845. package/packages/server/routes/api/ide/files-exclude.js +37 -0
  846. package/packages/server/routes/api/ide/keybindings.js +37 -0
  847. package/packages/server/routes/api/inspect.js +21 -0
  848. package/packages/server/routes/api/integrations/[...action].js +201 -0
  849. package/packages/server/routes/api/integrations/github-browse.js +190 -0
  850. package/packages/server/routes/api/kimi.js +15 -0
  851. package/packages/server/routes/api/launcher/icon.js +16 -0
  852. package/packages/server/routes/api/launcher/launch.js +27 -0
  853. package/packages/server/routes/api/launcher/search.js +20 -0
  854. package/packages/server/routes/api/launcher/settings.js +68 -0
  855. package/packages/server/routes/api/openai.js +94 -0
  856. package/packages/server/routes/api/opencode.js +15 -0
  857. package/packages/server/routes/api/pick-folder.js +12 -0
  858. package/packages/server/routes/api/preview-icon.js +21 -0
  859. package/packages/server/routes/api/projects/[id]/index.js +240 -0
  860. package/packages/server/routes/api/projects/[id]/site.js +59 -0
  861. package/packages/server/routes/api/projects/[id]/terminals.js +38 -0
  862. package/packages/server/routes/api/projects/[id]/workspace-read.js +126 -0
  863. package/packages/server/routes/api/projects/[id]/workspace.js +147 -0
  864. package/packages/server/routes/api/projects/index.js +62 -0
  865. package/packages/server/routes/api/providers/active.js +12 -0
  866. package/packages/server/routes/api/providers/balance.js +15 -0
  867. package/packages/server/routes/api/providers/models.js +19 -0
  868. package/packages/server/routes/api/providers.js +23 -0
  869. package/packages/server/routes/api/status.js +11 -0
  870. package/resources/icons/128.png +0 -0
  871. package/resources/icons/16.png +0 -0
  872. package/resources/icons/256.png +0 -0
  873. package/resources/icons/32.png +0 -0
  874. package/resources/icons/48.png +0 -0
  875. package/resources/icons/512.png +0 -0
  876. package/resources/icons/64.png +0 -0
  877. package/resources/icons/projector.svg +5 -0
@@ -0,0 +1,142 @@
1
+ import { asString } from "../transport/index.js";
2
+ import { selectionFrom } from "./controls.js";
3
+ import { historyTools } from "./request.js";
4
+ const QUESTION_CHARS = 4_000;
5
+ const HISTORY_TURNS = 200;
6
+ const HISTORY_CHARS = 80_000;
7
+ const TURN_CHARS = 20_000;
8
+ const THREAD_EXCHANGES = 20;
9
+ const THREAD_ANSWER_CHARS = 4_000;
10
+ const RUNNING_TOOLS = 20;
11
+ const PLAN_ITEMS = 30;
12
+ function text(value, limit) {
13
+ return asString(value).trim().slice(0, limit);
14
+ }
15
+ function exchanges(value) {
16
+ if (!Array.isArray(value))
17
+ return [];
18
+ return value.slice(-THREAD_EXCHANGES).flatMap((item) => {
19
+ if (!item || typeof item !== "object")
20
+ return [];
21
+ const row = item;
22
+ const question = text(row.question, QUESTION_CHARS);
23
+ const answer = text(row.answer, THREAD_ANSWER_CHARS);
24
+ return question && answer ? [{ question, answer }] : [];
25
+ });
26
+ }
27
+ /** Running tools a request reports; malformed rows are dropped and sizes bounded. */
28
+ export function runningToolsFrom(value) {
29
+ if (!Array.isArray(value))
30
+ return [];
31
+ return value.slice(0, RUNNING_TOOLS).flatMap((item) => {
32
+ if (!item || typeof item !== "object")
33
+ return [];
34
+ const row = item;
35
+ const name = text(row.name, 100);
36
+ if (!name)
37
+ return [];
38
+ return [
39
+ {
40
+ name,
41
+ ...(row.input ? { input: text(row.input, 500) } : {}),
42
+ ...(typeof row.startedAt === "number" && Number.isFinite(row.startedAt)
43
+ ? { startedAt: row.startedAt }
44
+ : {}),
45
+ },
46
+ ];
47
+ });
48
+ }
49
+ /** Plan items a request reports; malformed rows are dropped and sizes bounded. */
50
+ export function planItemsFrom(value) {
51
+ if (!Array.isArray(value))
52
+ return [];
53
+ return value.slice(0, PLAN_ITEMS).flatMap((item) => {
54
+ if (!item || typeof item !== "object")
55
+ return [];
56
+ const row = item;
57
+ const content = text(row.content, 300);
58
+ if (!content)
59
+ return [];
60
+ return [{ content, status: text(row.status, 40) || "pending" }];
61
+ });
62
+ }
63
+ const weight = (turn) => turn.content.length +
64
+ (turn.thoughts?.length ?? 0) +
65
+ (turn.tools ?? []).reduce((sum, tool) => sum + (tool.input?.length ?? 0) + tool.output.length, 0);
66
+ /** Oldest whole exchanges go first: the side question is about now, not the start of the chat. */
67
+ function fitHistory(turns) {
68
+ let total = turns.reduce((sum, turn) => sum + weight(turn), 0);
69
+ let start = 0;
70
+ while (start < turns.length && (total > HISTORY_CHARS || turns[start].role !== "user")) {
71
+ total -= weight(turns[start]);
72
+ start++;
73
+ while (start < turns.length && turns[start].role !== "user") {
74
+ total -= weight(turns[start]);
75
+ start++;
76
+ }
77
+ }
78
+ return turns.slice(start);
79
+ }
80
+ /** The visible conversation a request reports, cut to what a read-only answer needs. */
81
+ export function historyFrom(value) {
82
+ if (!Array.isArray(value))
83
+ return [];
84
+ return fitHistory(value.slice(-HISTORY_TURNS).flatMap((item) => {
85
+ if (!item || typeof item !== "object")
86
+ return [];
87
+ const row = item;
88
+ const role = row.role === "assistant" ? "assistant" : row.role === "user" ? "user" : null;
89
+ const content = asString(row.content).slice(0, TURN_CHARS);
90
+ const tools = historyTools(row.tools);
91
+ const thoughts = role === "assistant" ? asString(row.thoughts).slice(0, TURN_CHARS) : "";
92
+ if (!role || (!content.trim() && !thoughts && !tools.length))
93
+ return [];
94
+ return [
95
+ {
96
+ role,
97
+ content,
98
+ ...(thoughts ? { thoughts } : {}),
99
+ ...(tools.length ? { tools } : {}),
100
+ },
101
+ ];
102
+ }));
103
+ }
104
+ /** The question with what the side model should know before it can call the status tool. */
105
+ function sideMessage(question, thread, running, plan) {
106
+ const blocks = [];
107
+ if (thread.length)
108
+ blocks.push([
109
+ "Ранее в стороне спрашивали (это не часть основного разговора):",
110
+ ...thread.map((item, index) => `${index + 1}. Вопрос: ${item.question}\n Ответ: ${item.answer}`),
111
+ ].join("\n"));
112
+ if (running.length)
113
+ blocks.push([
114
+ "Сейчас выполняется:",
115
+ ...running.map((item) => `- ${item.name}${item.input ? `: ${item.input}` : ""}`),
116
+ ].join("\n"));
117
+ if (plan.length)
118
+ blocks.push(["Текущий план:", ...plan.map((item) => `- [${item.status}] ${item.content}`)].join("\n"));
119
+ blocks.push(`Вопрос в сторону:\n${question}`);
120
+ return blocks.join("\n\n");
121
+ }
122
+ /** A side question from `POST /api/agent/side`; malformed parts are dropped, sizes bounded. */
123
+ export function sideRequestFrom(body) {
124
+ const question = text(body.question, QUESTION_CHARS);
125
+ if (!question)
126
+ throw new Error("Напишите вопрос в сторону");
127
+ const thread = exchanges(body.thread);
128
+ const running = runningToolsFrom(body.running);
129
+ const plan = planItemsFrom(body.plan);
130
+ return {
131
+ question,
132
+ message: sideMessage(question, thread, running, plan),
133
+ history: historyFrom(body.history),
134
+ thread,
135
+ running,
136
+ plan,
137
+ chat: text(body.chat, 200),
138
+ projectId: text(body.projectId, 200),
139
+ selection: selectionFrom(body.selection),
140
+ providerId: text(body.providerId, 200) || undefined,
141
+ };
142
+ }
@@ -0,0 +1,62 @@
1
+ import { historyDatabase } from "./history-store.js";
2
+ const count = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
3
+ /** Chat id → where the chat belongs. Archived chats live under `archive:<id>` in the turns table. */
4
+ function chatPlaces() {
5
+ const db = historyDatabase();
6
+ const places = new Map();
7
+ const indexed = db.prepare("SELECT chat, scope, backend FROM chat_index").all();
8
+ for (const row of indexed)
9
+ places.set(row.chat, { backend: row.backend, project: row.scope });
10
+ const archived = db.prepare("SELECT id, project, backend FROM archives").all();
11
+ for (const row of archived)
12
+ places.set(`archive:${row.id}`, { backend: row.backend, project: row.project });
13
+ return places;
14
+ }
15
+ /**
16
+ * Answers with usage since `since`. Every saved version is counted: a branch that was abandoned
17
+ * still cost tokens. Chats that were deleted keep their answers out of reach of this store.
18
+ */
19
+ export function readAgentUsage(since = 0) {
20
+ const db = historyDatabase();
21
+ const places = chatPlaces();
22
+ const rows = db
23
+ .prepare("SELECT chat, data FROM turns WHERE data LIKE '%\"usage\"%'")
24
+ .all();
25
+ const records = [];
26
+ for (const row of rows) {
27
+ let turn;
28
+ try {
29
+ turn = JSON.parse(row.data);
30
+ }
31
+ catch {
32
+ continue;
33
+ }
34
+ const usage = turn.usage;
35
+ if (!usage || turn.role !== "assistant")
36
+ continue;
37
+ const at = typeof turn.at === "number" && Number.isFinite(turn.at) ? turn.at : 0;
38
+ if (at < since)
39
+ continue;
40
+ const place = places.get(row.chat);
41
+ const backend = place?.backend ?? (row.chat.includes(":") ? row.chat.split(":")[0] : "");
42
+ const cost = typeof usage.cost === "number" && Number.isFinite(usage.cost) && usage.cost >= 0
43
+ ? usage.cost
44
+ : undefined;
45
+ const model = typeof turn.context?.model === "string" && turn.context.model
46
+ ? turn.context.model
47
+ : undefined;
48
+ records.push({
49
+ chat: row.chat,
50
+ backend,
51
+ project: place?.project ?? "",
52
+ at,
53
+ input: count(usage.input),
54
+ output: count(usage.output),
55
+ cacheRead: count(usage.cacheRead),
56
+ cacheWrite: count(usage.cacheWrite),
57
+ ...(cost !== undefined ? { cost } : {}),
58
+ ...(model ? { model } : {}),
59
+ });
60
+ }
61
+ return records;
62
+ }
@@ -0,0 +1,136 @@
1
+ import { execFile } from "node:child_process";
2
+ import { randomBytes } from "node:crypto";
3
+ import { mkdir, stat } from "node:fs/promises";
4
+ import { join, relative } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { dataDir } from "../../../core/modules/app-paths/index.js";
7
+ const run = promisify(execFile);
8
+ const WORKTREE_ID = /^[0-9a-f]{8}$/;
9
+ const IDENTITY = {
10
+ GIT_AUTHOR_NAME: "Projector",
11
+ GIT_AUTHOR_EMAIL: "projector@localhost",
12
+ GIT_COMMITTER_NAME: "Projector",
13
+ GIT_COMMITTER_EMAIL: "projector@localhost",
14
+ };
15
+ const git = async (cwd, args, env = {}) => (await run("git", args, { cwd, env: { ...process.env, ...env }, maxBuffer: 16 * 1024 * 1024 })).stdout.trim();
16
+ const gitFailure = (error) => {
17
+ const { stderr, message } = error;
18
+ return (stderr || message || "git завершился с ошибкой").trim();
19
+ };
20
+ const branchOf = (id) => `projector/${id}`;
21
+ const folderOf = (projectId, id) => join(dataDir(), "worktrees", `${projectId}-${id}`);
22
+ /** Where a project folder lies inside its repository, so the copy can be entered at the same place. */
23
+ async function layout(projectPath) {
24
+ let root;
25
+ try {
26
+ root = await git(projectPath, ["rev-parse", "--show-toplevel"]);
27
+ }
28
+ catch {
29
+ throw new Error("Изолированная копия работает только в git-проекте");
30
+ }
31
+ return { root, inside: relative(root, projectPath) };
32
+ }
33
+ /** A separate copy of the project (a git worktree on its own branch) for one agent chat to work in. */
34
+ export async function createWorktree(projectId, projectPath) {
35
+ const { root, inside } = await layout(projectPath);
36
+ try {
37
+ await git(root, ["rev-parse", "--verify", "-q", "HEAD"]);
38
+ }
39
+ catch {
40
+ throw new Error("В git-репозитории нет ни одного коммита: сначала сделайте коммит, потом копия");
41
+ }
42
+ const id = randomBytes(4).toString("hex");
43
+ const folder = folderOf(projectId, id);
44
+ await mkdir(join(dataDir(), "worktrees"), { recursive: true, mode: 0o700 });
45
+ try {
46
+ await git(root, ["worktree", "add", "-b", branchOf(id), folder, "HEAD"]);
47
+ }
48
+ catch (error) {
49
+ throw new Error(`Не удалось создать копию проекта: ${gitFailure(error)}`);
50
+ }
51
+ return { id, branch: branchOf(id), cwd: join(folder, inside) };
52
+ }
53
+ /** The folder an agent works in for this copy; the identifier comes from a client, so it is checked. */
54
+ export async function worktreeCwd(projectId, id, projectPath) {
55
+ if (!WORKTREE_ID.test(id))
56
+ throw new Error("Некорректная изолированная копия");
57
+ const { inside } = await layout(projectPath);
58
+ const folder = folderOf(projectId, id);
59
+ try {
60
+ await stat(folder);
61
+ }
62
+ catch {
63
+ throw new Error("Изолированная копия уже удалена");
64
+ }
65
+ return join(folder, inside);
66
+ }
67
+ export async function worktreeStatus(projectId, id, projectPath) {
68
+ const cwd = await worktreeCwd(projectId, id, projectPath);
69
+ const { root } = await layout(cwd);
70
+ const lines = (await git(root, ["status", "--porcelain"])).split("\n").filter(Boolean);
71
+ const committed = (await git(root, ["diff", "--name-only", "HEAD", branchOf(id)])).split("\n");
72
+ return {
73
+ id,
74
+ branch: branchOf(id),
75
+ changed: new Set([...lines, ...committed.filter(Boolean)]).size,
76
+ };
77
+ }
78
+ /**
79
+ * Brings the copy's changes into the project: they are committed on the copy's branch and merged
80
+ * into the branch the project is on. A merge that cannot go through is undone and reported.
81
+ */
82
+ export async function mergeWorktree(projectId, id, projectPath) {
83
+ const cwd = await worktreeCwd(projectId, id, projectPath);
84
+ const copy = (await layout(cwd)).root;
85
+ const main = (await layout(projectPath)).root;
86
+ await git(copy, ["add", "-A"]);
87
+ const dirty = (await git(copy, ["status", "--porcelain"])) !== "";
88
+ if (dirty)
89
+ await git(copy, ["commit", "-m", "Изменения агента из изолированной копии"], IDENTITY);
90
+ const ahead = Number(await git(main, ["rev-list", "--count", `HEAD..${branchOf(id)}`]));
91
+ if (!ahead) {
92
+ await removeWorktree(projectId, id, projectPath);
93
+ return { merged: false, message: "В копии нет изменений: она удалена" };
94
+ }
95
+ try {
96
+ await git(main, ["merge", "--no-edit", branchOf(id)], IDENTITY);
97
+ }
98
+ catch (error) {
99
+ await git(main, ["merge", "--abort"]).catch(() => undefined);
100
+ throw new Error(`Слить не удалось, проект не изменён: ${gitFailure(error)}`);
101
+ }
102
+ await removeWorktree(projectId, id, projectPath);
103
+ return { merged: true, message: "Изменения влиты в проект, копия удалена" };
104
+ }
105
+ /**
106
+ * A second copy that starts from what a running job's copy has right now: its dirty work is
107
+ * committed on the copy's own branch and the fork branches off it. The source copy stays as is.
108
+ */
109
+ export async function forkWorktree(projectId, projectPath, sourceCwd) {
110
+ const source = (await layout(sourceCwd)).root;
111
+ const { root: main, inside } = await layout(projectPath);
112
+ const branch = (await git(source, ["rev-parse", "--abbrev-ref", "HEAD"])).trim();
113
+ if (!branch.startsWith("projector/"))
114
+ throw new Error("Форк доступен только изолированной копии Projector");
115
+ await git(source, ["add", "-A"]);
116
+ if ((await git(source, ["status", "--porcelain"])) !== "")
117
+ await git(source, ["commit", "-m", "Состояние перед форком"], IDENTITY);
118
+ const id = randomBytes(4).toString("hex");
119
+ const folder = folderOf(projectId, id);
120
+ await mkdir(join(dataDir(), "worktrees"), { recursive: true, mode: 0o700 });
121
+ try {
122
+ await git(main, ["worktree", "add", "-b", branchOf(id), folder, branch]);
123
+ }
124
+ catch (error) {
125
+ throw new Error(`Не удалось создать форк копии: ${gitFailure(error)}`);
126
+ }
127
+ return { id, branch: branchOf(id), cwd: join(folder, inside) };
128
+ }
129
+ /** Deletes the copy and its branch together with everything the agent did in it. */
130
+ export async function removeWorktree(projectId, id, projectPath) {
131
+ if (!WORKTREE_ID.test(id))
132
+ throw new Error("Некорректная изолированная копия");
133
+ const { root } = await layout(projectPath);
134
+ await git(root, ["worktree", "remove", "--force", folderOf(projectId, id)]).catch(() => undefined);
135
+ await git(root, ["branch", "-D", branchOf(id)]).catch(() => undefined);
136
+ }
@@ -0,0 +1,18 @@
1
+ import { createAgentFeatureCatalog, } from "../../../core/modules/agent-features/index.js";
2
+ /**
3
+ * The features this server offers and the agents it can give them to. Both are filled by the
4
+ * composition (`server/app/features.ts`), so this module never names a concrete ability or agent.
5
+ */
6
+ export const agentFeatureCatalog = createAgentFeatureCatalog();
7
+ const agents = new Map();
8
+ export const registerAgentFeature = (feature) => agentFeatureCatalog.register(feature);
9
+ export function registerFeatureAgent(agent) {
10
+ agents.set(agent.id, agent);
11
+ }
12
+ export function featureAgents() {
13
+ return [...agents.values()];
14
+ }
15
+ export function hasFeatureAgent(id) {
16
+ return agents.has(id);
17
+ }
18
+ export {};
@@ -0,0 +1,2 @@
1
+ export { agentFeatureCatalog, featureAgents, registerAgentFeature, registerFeatureAgent, } from "./catalog.js";
2
+ export { enabledFeatureText, enabledFeatures, FEATURE_PROMPT_END, featureEnabled, featurePrompt, featureSettings, featuresFile, sessionTitleWithoutInjected, setFeatureAgent, splitFeaturePrompt, } from "./store.js";
@@ -0,0 +1,172 @@
1
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { dataDir } from "../../../core/modules/app-paths/index.js";
4
+ import { agentFeatureCatalog, featureAgents, hasFeatureAgent, } from "./catalog.js";
5
+ /** Where the user's choices live: `$XDG_DATA_HOME/projector/agent/features.json`. */
6
+ export const featuresFile = () => join(dataDir(), "agent", "features.json");
7
+ function stateOf(text) {
8
+ try {
9
+ const data = JSON.parse(text);
10
+ const features = {};
11
+ if (data?.features && typeof data.features === "object")
12
+ for (const [id, value] of Object.entries(data.features))
13
+ if (Array.isArray(value))
14
+ features[id] = value.filter((agent) => typeof agent === "string");
15
+ return { features };
16
+ }
17
+ catch {
18
+ return { features: {} };
19
+ }
20
+ }
21
+ async function readState() {
22
+ try {
23
+ return stateOf(await readFile(featuresFile(), "utf8"));
24
+ }
25
+ catch {
26
+ return { features: {} };
27
+ }
28
+ }
29
+ /** Writes through a temporary file, so a failed save never leaves half a settings file. */
30
+ async function writeState(state) {
31
+ const path = featuresFile();
32
+ await mkdir(dirname(path), { recursive: true });
33
+ const temporary = `${path}.${process.pid}.tmp`;
34
+ await writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`, "utf8");
35
+ await rename(temporary, path);
36
+ }
37
+ /** The agents a feature is on for: the saved choice, or the feature's defaults before the first change. */
38
+ function enabledAgents(feature, state) {
39
+ const saved = state.features[feature.id];
40
+ const agents = saved ?? feature.defaults ?? [];
41
+ return agents.filter((id) => hasFeatureAgent(id));
42
+ }
43
+ /** What the island shows: every feature with every agent it can be given to. */
44
+ export async function featureSettings() {
45
+ const state = await readState();
46
+ return {
47
+ features: agentFeatureCatalog.list().map((feature) => ({
48
+ id: feature.id,
49
+ title: feature.title,
50
+ summary: feature.summary,
51
+ agents: featureAgents().map((agent) => ({
52
+ id: agent.id,
53
+ label: agent.label,
54
+ enabled: enabledAgents(feature, state).includes(agent.id),
55
+ })),
56
+ })),
57
+ file: featuresFile(),
58
+ };
59
+ }
60
+ /** One write at a time: two toggles read the same file and must not lose each other's change. */
61
+ let queue = Promise.resolve();
62
+ /** Turns one feature on or off for one agent; returns the state the island should show. */
63
+ export async function setFeatureAgent(featureId, agentId, enabled) {
64
+ const feature = agentFeatureCatalog.get(featureId);
65
+ if (!feature)
66
+ throw new Error(`Неизвестная возможность: ${featureId}`);
67
+ if (!hasFeatureAgent(agentId))
68
+ throw new Error(`Неизвестный агент: ${agentId}`);
69
+ const task = queue.then(async () => {
70
+ const state = await readState();
71
+ const current = enabledAgents(feature, state);
72
+ state.features[feature.id] = enabled
73
+ ? [...new Set([...current, agentId])]
74
+ : current.filter((id) => id !== agentId);
75
+ await writeState(state);
76
+ return featureSettings();
77
+ });
78
+ queue = task.catch(() => undefined);
79
+ return task;
80
+ }
81
+ /** The ids of the features the agent has on: the chat's choice, or the user's defaults. */
82
+ export async function enabledFeatures(agentId, features) {
83
+ if (features)
84
+ return agentFeatureCatalog
85
+ .list()
86
+ .filter((feature) => features.includes(feature.id))
87
+ .map((feature) => feature.id);
88
+ const state = await readState();
89
+ return agentFeatureCatalog
90
+ .list()
91
+ .filter((feature) => enabledAgents(feature, state).includes(agentId))
92
+ .map((feature) => feature.id);
93
+ }
94
+ export async function featureEnabled(agentId, featureId, features) {
95
+ return (await enabledFeatures(agentId, features)).includes(featureId);
96
+ }
97
+ /**
98
+ * The instructions of every feature the agent has on, or an empty string. `features` is the chat's
99
+ * own choice (an empty list means none); without it the user's defaults for the agent apply.
100
+ * Backends combine this text with their own prompt: Projector reads it into the system prompt,
101
+ * others into the first message of a session.
102
+ */
103
+ export async function enabledFeatureText(agentId, features) {
104
+ const ids = new Set(await enabledFeatures(agentId, features));
105
+ return agentFeatureCatalog
106
+ .list()
107
+ .filter((feature) => ids.has(feature.id))
108
+ .map((feature) => feature.instruction().trim())
109
+ .filter(Boolean)
110
+ .join("\n\n");
111
+ }
112
+ /** Marks where the injected abilities end and the user's own message begins. */
113
+ export const FEATURE_PROMPT_END = "<!-- projector:features:end -->";
114
+ /** The feature text framed for an agent that has no Projector prompt of its own. */
115
+ export async function featurePrompt(agentId, features, extra = "") {
116
+ const text = [extra.trim(), await enabledFeatureText(agentId, features)]
117
+ .filter(Boolean)
118
+ .join("\n\n");
119
+ if (!text)
120
+ return "";
121
+ return `[Projector] В этом чате включены дополнительные возможности Projector. Пользуйся ими, когда это уместно; обычные вопросы не загромождай.\n\n${text}\n\n${FEATURE_PROMPT_END}`;
122
+ }
123
+ /**
124
+ * Splits a native session's first message into the instructions Projector injected and what the
125
+ * user actually wrote. Sessions from before the marker are matched against the same prefix when
126
+ * the agent still has the same abilities.
127
+ */
128
+ export function splitFeaturePrompt(text, legacy) {
129
+ const marker = FEATURE_PROMPT_END;
130
+ const index = text.indexOf(marker);
131
+ let rest;
132
+ let injected;
133
+ if (index >= 0) {
134
+ injected = text.slice(0, index).trim() || undefined;
135
+ rest = text.slice(index + marker.length).trim();
136
+ }
137
+ else {
138
+ const prefix = legacy?.trim();
139
+ if (prefix && text.startsWith(prefix)) {
140
+ injected = prefix;
141
+ rest = text.slice(prefix.length).trim();
142
+ }
143
+ else {
144
+ rest = text;
145
+ }
146
+ }
147
+ // A resumed session also carries the replayed chat before the new message: the actual words
148
+ // are after this heading, the transcript itself is already shown as the session's own turns.
149
+ const heading = "Новое сообщение пользователя:\n";
150
+ const message = rest.lastIndexOf(heading);
151
+ if (message >= 0)
152
+ rest = rest.slice(message + heading.length).trim();
153
+ return { text: rest, ...(injected ? { injected } : {}) };
154
+ }
155
+ /**
156
+ * The title of a session an agent named after its first prompt: Projector's injected abilities
157
+ * are not the conversation, so the user's own words become the title. An old title whose prompt
158
+ * no longer matches the current abilities still ends with the message: its last paragraph is the
159
+ * best name available.
160
+ */
161
+ export function sessionTitleWithoutInjected(title, legacy) {
162
+ const split = splitFeaturePrompt(title, legacy);
163
+ if (split.text !== title)
164
+ return split.text || title;
165
+ if (!title.startsWith("[Projector]"))
166
+ return title;
167
+ const at = title.lastIndexOf("\n\n");
168
+ if (at < 0)
169
+ return title;
170
+ const tail = title.slice(at + 2).trim();
171
+ return tail && tail !== title ? tail : title;
172
+ }
@@ -0,0 +1,106 @@
1
+ import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { dataDir } from "../../../core/modules/app-paths/index.js";
4
+ /** `${NAME}` and `${NAME:-fallback}` in a config value, as Claude Code's own `.mcp.json` allows. */
5
+ function expand(value) {
6
+ return value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g, (_, name, fallback) => process.env[name] ?? fallback ?? "");
7
+ }
8
+ export const userMcpFile = () => join(dataDir(), "agent", "mcp.json");
9
+ async function readEntries(path) {
10
+ try {
11
+ const data = JSON.parse(await readFile(path, "utf8"));
12
+ return data.mcpServers && typeof data.mcpServers === "object" ? data.mcpServers : {};
13
+ }
14
+ catch {
15
+ return {};
16
+ }
17
+ }
18
+ const pairs = (value) => Object.fromEntries((value && typeof value === "object" ? Object.entries(value) : []).map(([name, item]) => [
19
+ name,
20
+ expand(String(item)),
21
+ ]));
22
+ function toConfig(name, source, entry) {
23
+ if (entry.disabled === true)
24
+ return undefined;
25
+ if (typeof entry.command === "string" && entry.command && (!entry.type || entry.type === "stdio"))
26
+ return {
27
+ name,
28
+ source,
29
+ command: expand(entry.command),
30
+ args: Array.isArray(entry.args) ? entry.args.map((item) => expand(String(item))) : [],
31
+ env: pairs(entry.env),
32
+ };
33
+ if ((entry.type === "http" || entry.type === "sse") && typeof entry.url === "string" && entry.url)
34
+ return {
35
+ name,
36
+ source,
37
+ url: expand(entry.url),
38
+ sse: entry.type === "sse",
39
+ headers: pairs(entry.headers),
40
+ };
41
+ return undefined;
42
+ }
43
+ /** The user's servers and the project's `.mcp.json`; a project server of the same name wins nothing over the user's. */
44
+ export async function mcpServerConfigs(cwd) {
45
+ const user = await readEntries(userMcpFile());
46
+ const project = cwd ? await readEntries(join(cwd, ".mcp.json")) : {};
47
+ return [
48
+ ...Object.entries(user).map(([name, entry]) => toConfig(name, "user", entry)),
49
+ ...Object.entries(project)
50
+ .filter(([name]) => !(name in user))
51
+ .map(([name, entry]) => toConfig(name, "project", entry)),
52
+ ].filter((item) => !!item);
53
+ }
54
+ /** Keeps only the servers a role names; an omitted list keeps every configured server. */
55
+ export function mcpConfigsForNames(configs, names) {
56
+ if (names === undefined)
57
+ return [...configs];
58
+ const wanted = new Set(names);
59
+ return configs.filter((config) => wanted.has(config.name));
60
+ }
61
+ /** The shape Claude Code's SDK takes in `mcpServers` for an explicit server. */
62
+ export function processMcpConfig(config) {
63
+ if ("command" in config)
64
+ return {
65
+ type: "stdio",
66
+ command: config.command,
67
+ args: config.args,
68
+ env: config.env,
69
+ };
70
+ return {
71
+ type: config.sse ? "sse" : "http",
72
+ url: config.url,
73
+ headers: config.headers,
74
+ };
75
+ }
76
+ /** The user's server list as written, for the settings page; empty when there is none yet. */
77
+ export async function readUserMcp() {
78
+ try {
79
+ return await readFile(userMcpFile(), "utf8");
80
+ }
81
+ catch {
82
+ return "";
83
+ }
84
+ }
85
+ /** Saves the user's server list after checking it is `{ "mcpServers": { ... } }`; empty text removes it. */
86
+ export async function writeUserMcp(text) {
87
+ const path = userMcpFile();
88
+ if (!text.trim()) {
89
+ await rm(path, { force: true });
90
+ return;
91
+ }
92
+ let data;
93
+ try {
94
+ data = JSON.parse(text);
95
+ }
96
+ catch (error) {
97
+ throw new Error(`Не JSON: ${error.message}`);
98
+ }
99
+ const servers = data?.mcpServers;
100
+ if (!servers || typeof servers !== "object" || Array.isArray(servers))
101
+ throw new Error('Нужен объект вида { "mcpServers": { "имя": { … } } }');
102
+ await mkdir(dirname(path), { recursive: true });
103
+ const temporary = `${path}.${process.pid}.tmp`;
104
+ await writeFile(temporary, text.trim() + "\n", { mode: 0o600 });
105
+ await rename(temporary, path);
106
+ }
@@ -0,0 +1,3 @@
1
+ export { createChatRole, deleteChatRole, readAgentRole, rolesFile, roleSettings, saveChatRole, saveServiceRole, resetServiceRole, serviceRoleSelection, } from "./store.js";
2
+ export { createProjectRole, deleteProjectRole, projectRoleState, projectRolesRelativeFile, projectRolesTrustFile, readProjectAgentRole, saveProjectRole, setProjectRoleTrust, } from "./project.js";
3
+ export { roleContext, rolePromptText, selectedNames } from "./runtime.js";