@runeya/runeya 2.0.10 → 2.0.13

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 (278) hide show
  1. package/agent/index.js +434 -28
  2. package/agent/index.js.map +1 -1
  3. package/agent-manager-3DHUF2DC-KN6O7WSA.js +8 -0
  4. package/{chunk-DODGBBTE.js → chunk-AJW7LDO5.js} +28 -8
  5. package/chunk-AJW7LDO5.js.map +1 -0
  6. package/{dist-HZBWBT6S.js → dist-HGCFHXO4.js} +1308 -408
  7. package/dist-HGCFHXO4.js.map +1 -0
  8. package/index.js +5 -1
  9. package/index.js.map +1 -1
  10. package/mcp-server/index.js +139 -1
  11. package/mcp-server/index.js.map +1 -1
  12. package/package.json +1 -1
  13. package/web/assets/{AddressBar.vue-D_8vQPIF.js → AddressBar.vue-B6BOLYmO.js} +1 -1
  14. package/web/assets/AgentScalarChatInterface.vue-DKSmjtvV.js +13 -0
  15. package/web/assets/AgentTerminalPage-BZ6jaRAs.js +1 -0
  16. package/web/assets/AgentTerminalPage-anYDkj7H.css +1 -0
  17. package/web/assets/AiChatPage-C1r42kX7.js +1 -0
  18. package/web/assets/AppLayout-B7-y0tBI.css +1 -0
  19. package/web/assets/AppLayout-DnMCPCO8.js +1 -0
  20. package/web/assets/AuditPage-CTdEvLE-.js +1 -0
  21. package/web/assets/{CodeInput.vue-nIhSM0FX.js → CodeInput.vue-Sp2dM8hl.js} +1 -1
  22. package/web/assets/{Collection.vue-CkwnxBu4.js → Collection.vue-CdPjaC9d.js} +1 -1
  23. package/web/assets/{CollectionAuthentication.vue-CiZinGpr.js → CollectionAuthentication.vue-DMPykUah.js} +1 -1
  24. package/web/assets/CollectionCookies.vue-DqNgVtd-.js +1 -0
  25. package/web/assets/{CollectionEnvironment.vue-3bWtuG1B.js → CollectionEnvironment.vue-DKab6xJJ.js} +1 -1
  26. package/web/assets/{CollectionOverview.vue-BheZFfD3.js → CollectionOverview.vue-DlODh8Vk.js} +1 -1
  27. package/web/assets/CollectionScripts.vue-B2gkfo4d.js +1 -0
  28. package/web/assets/{CollectionServers.vue-Ja8mYDaK.js → CollectionServers.vue-Br-QackN.js} +1 -1
  29. package/web/assets/{CollectionSettings.vue-DOB9JUg8.js → CollectionSettings.vue-Cm6NQbDm.js} +1 -1
  30. package/web/assets/CollectionSync.vue-bB7sdahP.js +1 -0
  31. package/web/assets/{CommandActionInput.vue-BBijVqe7.js → CommandActionInput.vue-CZ3-rqSL.js} +1 -1
  32. package/web/assets/{Cookies.vue-DgVzSolJ.js → Cookies.vue-Duz-a-ga.js} +1 -1
  33. package/web/assets/DashboardPage-hIc9wP_Q.js +1 -0
  34. package/web/assets/{DataTable.vue-DXTWz2Vi.js → DataTable.vue-Dorr-r7J.js} +1 -1
  35. package/web/assets/{DataTableCheckbox.vue-BA5yHmxd.js → DataTableCheckbox.vue-CATn-YYp.js} +1 -1
  36. package/web/assets/{DataTableHeader.vue-U2le7KBO.js → DataTableHeader.vue-C3SUSaR8.js} +1 -1
  37. package/web/assets/{DataTableInput.vue-DpeNUUXc.js → DataTableInput.vue-_06pwPUA.js} +1 -1
  38. package/web/assets/{DeleteSidebarListElement.vue-C2SV2geU.js → DeleteSidebarListElement.vue-DoqRnMXx.js} +1 -1
  39. package/web/assets/{EditSidebarListElement.vue-DvvYjTMO.js → EditSidebarListElement.vue-BqTw6Tho.js} +1 -1
  40. package/web/assets/{EditorIcon-BPEaZrXC.js → EditorIcon-CbpIT0A1.js} +1 -1
  41. package/web/assets/{EmptyState.vue-Be8_w2rR.js → EmptyState.vue-Bur5L0a4.js} +1 -1
  42. package/web/assets/{Environment.vue-D0PdeVIp.js → Environment.vue-C50lH9cP.js} +1 -1
  43. package/web/assets/{EnvironmentForm-Dm3dFrSU.js → EnvironmentForm-BDfzXuHx.js} +2 -2
  44. package/web/assets/EnvironmentFormPage-CLylRN6B.js +1 -0
  45. package/web/assets/EnvironmentListPage-DlUT6LnX.js +1 -0
  46. package/web/assets/{EnvironmentModal.vue-Bssf0U5X.js → EnvironmentModal.vue-Dz5CArRX.js} +1 -1
  47. package/web/assets/EnvironmentSelector-DHoYUCTH.js +1 -0
  48. package/web/assets/{Form.vue-Dv4a31zh.js → Form.vue-BzZCMgN1.js} +1 -1
  49. package/web/assets/{IconSelector.vue-BsYvff6K.js → IconSelector.vue-BCmeqlrs.js} +1 -1
  50. package/web/assets/KanbanBoardPage-DoXgFMvo.js +141 -0
  51. package/web/assets/{KanbanBoardPage-7nOYpwHn.css → KanbanBoardPage-hqNojI5j.css} +1 -1
  52. package/web/assets/KanbanListPage-BLdNz80q.js +1 -0
  53. package/web/assets/LaunchProjectPage-DjRA2D3h.js +1 -0
  54. package/web/assets/LaunchServicesPage-CKaGcu3z.js +1 -0
  55. package/web/assets/LogViewer-CtX_6uFM.js +3 -0
  56. package/web/assets/{ProcessControls-DfFxf6jZ.js → ProcessControls-BY-_9zo7.js} +1 -1
  57. package/web/assets/ProcessDetailPage-Bqis1qMA.js +1 -0
  58. package/web/assets/{ProcessMetrics-CLa8mdh2.js → ProcessMetrics-DQybvwcA.js} +2 -2
  59. package/web/assets/ProjectDetailPage-FBPonwd5.js +1 -0
  60. package/web/assets/ProjectListPage-xwlVXN8A.js +1 -0
  61. package/web/assets/{RandomJobTestPage-D2OB5pqD.js → RandomJobTestPage-0pqne-FD.js} +1 -1
  62. package/web/assets/{Request.vue-DHQd9eyp.js → Request.vue-Db4XEPKt.js} +1 -1
  63. package/web/assets/{RequestAuth.vue-CEVOgzEk.js → RequestAuth.vue-CK1A6ySt.js} +1 -1
  64. package/web/assets/RequestRoot.vue-BLF0GGT5.js +19 -0
  65. package/web/assets/{ScalarAsciiArt.vue-CyYmv9BB.js → ScalarAsciiArt.vue-BPdUsXWj.js} +1 -1
  66. package/web/assets/{ScalarIconEyeSlash.vue-qR90sHHe.js → ScalarIconEyeSlash.vue-BBDBShRO.js} +1 -1
  67. package/web/assets/{ScalarIconTrash.vue-Ll6Zw6_W.js → ScalarIconTrash.vue-Tpr15aNY.js} +1 -1
  68. package/web/assets/ScenarioEditorPage-DNuo-2Gi.js +14 -0
  69. package/web/assets/{ServerVariablesForm.vue-D9sjD4AT.js → ServerVariablesForm.vue-XLQ145gw.js} +1 -1
  70. package/web/assets/ServiceControlsBar-CCTGcA1t.js +1 -0
  71. package/web/assets/{ServiceDetailPage-znbWajpt.css → ServiceDetailPage-BELECRic.css} +1 -1
  72. package/web/assets/ServiceDetailPage-UVg73scN.js +2 -0
  73. package/web/assets/ServiceFormPage-F3boRKs-.js +1 -0
  74. package/web/assets/{Settings.vue-DWPIjz57.js → Settings.vue-D_1yQu6i.js} +1 -1
  75. package/web/assets/SettingsPage-Cg78lQZF.js +225 -0
  76. package/web/assets/SetupKeyPage-BcaSoLjU.js +1 -0
  77. package/web/assets/SetupPage-mCVAKLtm.js +1 -0
  78. package/web/assets/{Sidebar.vue-DVHNacfA.js → Sidebar.vue-De4YlW0c.js} +1 -1
  79. package/web/assets/{SidebarButton.vue-C4QDgSym.js → SidebarButton.vue-CctYiTRp.js} +1 -1
  80. package/web/assets/{SidebarListElement.vue-Ch1aI_Bz.js → SidebarListElement.vue-Cv7jUZIM.js} +1 -1
  81. package/web/assets/UnlockPage-BSpzyZnd.js +1 -0
  82. package/web/assets/VariablesTable-Dn3IvplD.js +1 -0
  83. package/web/assets/{VariablesTable-BtdK5olT.css → VariablesTable-W4rxlL35.css} +1 -1
  84. package/web/assets/{ViewLayout.vue-svdAMKVP.js → ViewLayout.vue-fiagi8zc.js} +1 -1
  85. package/web/assets/{ViewLayoutContent.vue-CAixUN8B.js → ViewLayoutContent.vue-BehGrsED.js} +1 -1
  86. package/web/assets/{ViewLayoutSection.vue-C9VAyihF.js → ViewLayoutSection.vue-D4icCgQI.js} +1 -1
  87. package/web/assets/{active-entities-Dpd4ny38.js → active-entities-CkBGjwu9.js} +1 -1
  88. package/web/assets/api-reference-D1EfYtPj.js +1 -0
  89. package/web/assets/{autocomplete-Do-EC8XW.js → autocomplete-CjBHTJWh.js} +4 -4
  90. package/web/assets/{card-CeTOcGyS.js → card-CsmU2iiY.js} +1 -1
  91. package/web/assets/{checkbox-C2hHZbMO.js → checkbox-B5XZqi1U.js} +3 -3
  92. package/web/assets/{chip-CD3EONN7.js → chip-C4pSomPm.js} +1 -1
  93. package/web/assets/column-CR3Hix4J.js +763 -0
  94. package/web/assets/{core-Dq8cnTTd.js → core-CtGUajLi.js} +1 -1
  95. package/web/assets/cssMode-nuznbveH.js +4 -0
  96. package/web/assets/{dist-CQoPOD_o.js → dist--ZlcDulO.js} +11 -11
  97. package/web/assets/{dist-BmCpMB7W.js → dist-CXkMrHNP.js} +1 -1
  98. package/web/assets/{dist-US_vG96F.js → dist-DH_zJr7W.js} +1 -1
  99. package/web/assets/{dist-CiBpb7F_.js → dist-WjGUyWSO.js} +1 -1
  100. package/web/assets/{divider-C7F2jaMI.js → divider-CnJlD7qO.js} +1 -1
  101. package/web/assets/{fieldset-kJDAoVaz.js → fieldset-D9zY6R6s.js} +1 -1
  102. package/web/assets/{freemarker2-qyf3DfQl.js → freemarker2-Bw43sOne.js} +1 -1
  103. package/web/assets/handlebars-C8qgW7u6.js +1 -0
  104. package/web/assets/html-Dy9PKnkr.js +1 -0
  105. package/web/assets/htmlMode-o8EU0tqo.js +4 -0
  106. package/web/assets/index-9i25DNQ4.css +1 -0
  107. package/web/assets/index-CIcE6DNv.js +4308 -0
  108. package/web/assets/{javascript-Nwj2LVeE.js → javascript-CuRngcUR.js} +1 -1
  109. package/web/assets/{jsonMode-xQ2R28Fq.js → jsonMode-CsUIxwQq.js} +1 -1
  110. package/web/assets/{keyboard-CidI6qyD.js → keyboard-DhkINir5.js} +1 -1
  111. package/web/assets/{lib-Bpt_o5V9.js → lib-E9M4L9vE.js} +1 -1
  112. package/web/assets/{library-CcEqwrWR.js → library-BXoSag-V.js} +1 -1
  113. package/web/assets/liquid-CraMnqaK.js +1 -0
  114. package/web/assets/mdx-DPSW5q1A.js +1 -0
  115. package/web/assets/{mediaTypes-pLZCmXiT.js → mediaTypes-DDACekzr.js} +1 -1
  116. package/web/assets/{message-B6M86BRU.js → message-DKOCajc6.js} +1 -1
  117. package/web/assets/{minus-wesZvWq4.js → minus-CtlH9Syh.js} +1 -1
  118. package/web/assets/{multiselect-CHEmtEFg.js → multiselect-sshNnjnF.js} +3 -3
  119. package/web/assets/{password-ISam7EYg.js → password-Dv9g39jb.js} +4 -4
  120. package/web/assets/{plus-BBMmFC_c.js → plus-CG5Ui-l-.js} +6 -6
  121. package/web/assets/{pretty-ms-Bj2IaA2r.js → pretty-ms-D2BVTeMx.js} +1 -1
  122. package/web/assets/process.store-CutdTiYB.js +1 -0
  123. package/web/assets/project.store-CVbXSH5d.js +1 -0
  124. package/web/assets/python-BLq8fVkV.js +1 -0
  125. package/web/assets/{radiobutton-DwoOAEAF.js → radiobutton-Bz_ltBfM.js} +2 -2
  126. package/web/assets/razor-CVrBU-Fk.js +1 -0
  127. package/web/assets/router-CuxdGfLF.js +1 -0
  128. package/web/assets/{settings.store-BGScNTnu.js → settings.store-vM-8jbAF.js} +1 -1
  129. package/web/assets/store-CTKZgNiD.js +1840 -0
  130. package/web/assets/{tabpanel-DBInUEl5.js → tabpanel-DaZzgdrv.js} +3 -3
  131. package/web/assets/trpc-BIjF6nTt.js +1 -0
  132. package/web/assets/{tsMode-C7uad5vV.js → tsMode-DO5zEzzD.js} +1 -1
  133. package/web/assets/typescript-Do-K_3Jj.js +1 -0
  134. package/web/assets/{urls-BuNgEu0U.js → urls-BlVUwVFM.js} +1 -1
  135. package/web/assets/{use-tree-walker-CJHEPXgB.js → use-tree-walker-xoEX554A.js} +1 -1
  136. package/web/assets/useAiChatDrawer-BJugMTj0.js +1 -0
  137. package/web/assets/{useClipboard-DtO-z5Ls.js → useClipboard-B3J6cGK-.js} +1 -1
  138. package/web/assets/{useLayout-D-FCdkqa.js → useLayout-DHrumlpr.js} +1 -1
  139. package/web/assets/{usePluginManager-CPTBi3rk.js → usePluginManager-BEbBxZnF.js} +1 -1
  140. package/web/assets/{useSidebar-BoK12gD1.js → useSidebar-BCBwVF2x.js} +1 -1
  141. package/web/assets/{vue-router-DSROI5EH.js → vue-router-CuFIegGa.js} +1 -1
  142. package/web/assets/xml-BolCsFLY.js +1 -0
  143. package/web/assets/yaml-5iZTkCV3.js +1 -0
  144. package/web/index.html +2 -2
  145. package/agent-manager-A4E5CXFT-6PJDFN7J.js +0 -8
  146. package/chunk-DODGBBTE.js.map +0 -1
  147. package/dist-HZBWBT6S.js.map +0 -1
  148. package/web/assets/AgentScalarChatInterface.vue-Be-LbA03.js +0 -13
  149. package/web/assets/AgentTerminalPage-BZmmd1H1.js +0 -36
  150. package/web/assets/AgentTerminalPage-EX_n6P3x.css +0 -1
  151. package/web/assets/AiChatPage-kTk6yC6d.js +0 -1
  152. package/web/assets/AppLayout-CDtyYNWp.css +0 -1
  153. package/web/assets/AppLayout-jbNML_m4.js +0 -1
  154. package/web/assets/AuditPage-S4kDjrZ5.js +0 -1
  155. package/web/assets/CollectionCookies.vue-BLEJqAhX.js +0 -1
  156. package/web/assets/CollectionScripts.vue-CsY6tWxk.js +0 -1
  157. package/web/assets/CollectionSync.vue-B-uKwdTU.js +0 -1
  158. package/web/assets/DashboardPage-BwZPpURp.js +0 -1
  159. package/web/assets/EnvironmentFormPage-ByVELlly.js +0 -1
  160. package/web/assets/EnvironmentListPage-DvaTK4NF.js +0 -1
  161. package/web/assets/EnvironmentSelector-4kpQpg5e.js +0 -1
  162. package/web/assets/KanbanBoardPage-7rLK-ucb.js +0 -141
  163. package/web/assets/KanbanListPage-Dn35VrDc.js +0 -1
  164. package/web/assets/LaunchProjectPage-Byemtd9C.js +0 -1
  165. package/web/assets/LaunchServicesPage-CHiV6T5Y.js +0 -1
  166. package/web/assets/LogViewer-KtrKiUZw.js +0 -3
  167. package/web/assets/ProcessDetailPage-BOI85Xo7.js +0 -1
  168. package/web/assets/ProjectDetailPage-CTEt0DSq.js +0 -1
  169. package/web/assets/ProjectListPage-BrTIxp9K.js +0 -1
  170. package/web/assets/RequestRoot.vue-BEtC7IEP.js +0 -19
  171. package/web/assets/ScenarioEditorPage-xCx9aW1X.js +0 -14
  172. package/web/assets/ServiceControlsBar-DKYIgScL.js +0 -1
  173. package/web/assets/ServiceDetailPage-B5qBCc9A.js +0 -2
  174. package/web/assets/ServiceFormPage-BNpWmyj_.js +0 -1
  175. package/web/assets/SettingsPage-C5lWJT0Z.js +0 -225
  176. package/web/assets/SetupKeyPage-BiqO4PQr.js +0 -1
  177. package/web/assets/SetupPage-FEUuQSQ2.js +0 -1
  178. package/web/assets/UnlockPage-Dhg0hoP-.js +0 -1
  179. package/web/assets/VariablesTable-DFJHJ9DF.js +0 -1
  180. package/web/assets/api-reference-C9jD1TQ9.js +0 -1
  181. package/web/assets/column-xfOef4Rh.js +0 -763
  182. package/web/assets/cssMode-BzsFOrHs.js +0 -4
  183. package/web/assets/editor.store-Dzhoqquh.js +0 -1
  184. package/web/assets/handlebars-Dt_j38Ok.js +0 -1
  185. package/web/assets/html-BM6JBSDe.js +0 -1
  186. package/web/assets/htmlMode-BWrj-eTf.js +0 -4
  187. package/web/assets/index-DXutsd9M.css +0 -1
  188. package/web/assets/index-Dviyssba.js +0 -4220
  189. package/web/assets/liquid-CNc1r-Ln.js +0 -1
  190. package/web/assets/mdx-D5yTipSh.js +0 -1
  191. package/web/assets/process.store-cvjJzD3H.js +0 -1
  192. package/web/assets/project.store-C94-7i6c.js +0 -1
  193. package/web/assets/python-BOLsEvIQ.js +0 -1
  194. package/web/assets/razor-JsBDv4HY.js +0 -1
  195. package/web/assets/router-BgHCboHx.js +0 -1
  196. package/web/assets/store-a88gBDkh.js +0 -1840
  197. package/web/assets/tag-CQlI4fJK.js +0 -54
  198. package/web/assets/trpc-CgAubgRH.js +0 -1
  199. package/web/assets/typescript-C2IozRX9.js +0 -1
  200. package/web/assets/useAiChatDrawer-D6TRHaNu.js +0 -1
  201. package/web/assets/xml-DtJwg-5S.js +0 -1
  202. package/web/assets/yaml-sPGHMYDm.js +0 -1
  203. /package/{agent-manager-A4E5CXFT-6PJDFN7J.js.map → agent-manager-3DHUF2DC-KN6O7WSA.js.map} +0 -0
  204. /package/web/assets/{_plugin-vue_export-helper-BVSTY9ge.js → _plugin-vue_export-helper-C08BWUE4.js} +0 -0
  205. /package/web/assets/{abap-BF8nUS5p.js → abap-BMPR0rjj.js} +0 -0
  206. /package/web/assets/{apex-Bbj_Fak2.js → apex-DYC4uYYf.js} +0 -0
  207. /package/web/assets/{azcli-B8w3JS7J.js → azcli-GZlxEjpa.js} +0 -0
  208. /package/web/assets/{base64-CG47Jc3Y.js → base64-VLYHbiMn.js} +0 -0
  209. /package/web/assets/{bat-CaNuqacB.js → bat-Cv8OxItG.js} +0 -0
  210. /package/web/assets/{bicep-DAvnLugW.js → bicep-CuCbE6Ue.js} +0 -0
  211. /package/web/assets/{cameligo-BlI8LCmP.js → cameligo-BEPX3585.js} +0 -0
  212. /package/web/assets/{clojure-CxxhrBQl.js → clojure--6rbXIPY.js} +0 -0
  213. /package/web/assets/{coffee-SkbnTBhO.js → coffee-ByvVcDGX.js} +0 -0
  214. /package/web/assets/{cpp-Dm2HJxj0.js → cpp-CECtPnZp.js} +0 -0
  215. /package/web/assets/{csharp-BOGHPGcq.js → csharp-DyYyZ8UX.js} +0 -0
  216. /package/web/assets/{csp-CMA_7tOs.js → csp-B9apvcI9.js} +0 -0
  217. /package/web/assets/{css-DU8LSGcn.js → css-CfdBNbB0.js} +0 -0
  218. /package/web/assets/{cypher-BZPsEDmT.js → cypher-BPqQq4XX.js} +0 -0
  219. /package/web/assets/{dart-C1tIJhFk.js → dart-BLToxiYU.js} +0 -0
  220. /package/web/assets/{dist-BPIMeATj.js → dist-COg0nRYK.js} +0 -0
  221. /package/web/assets/{dockerfile-z4dmGi5q.js → dockerfile-CKo5jN7V.js} +0 -0
  222. /package/web/assets/{ecl-Rv9JwhOI.js → ecl-qo8pi1Ty.js} +0 -0
  223. /package/web/assets/{elixir-DL6xFSed.js → elixir-Dv1YAMPJ.js} +0 -0
  224. /package/web/assets/{flow9-DFZ52-2d.js → flow9-BKTKs1nN.js} +0 -0
  225. /package/web/assets/{fsharp-RvVOB9Dm.js → fsharp-BPoxgmtD.js} +0 -0
  226. /package/web/assets/{go-B2USMDMv.js → go-DgJ-2ryf.js} +0 -0
  227. /package/web/assets/{graphql-CsHpCYeJ.js → graphql-YTK8zpFe.js} +0 -0
  228. /package/web/assets/{hcl-CK021J-J.js → hcl-tYOvwaJ3.js} +0 -0
  229. /package/web/assets/{ini-v1EoSUxR.js → ini-BTZ3lNbM.js} +0 -0
  230. /package/web/assets/{java-CUXpSPxY.js → java-boRe0CIQ.js} +0 -0
  231. /package/web/assets/{julia-DwKveiZg.js → julia-K6BtoWYX.js} +0 -0
  232. /package/web/assets/{kotlin-SsG_4ZBt.js → kotlin-CglG00z4.js} +0 -0
  233. /package/web/assets/{less-BviquM8A.js → less-DlnIYk4g.js} +0 -0
  234. /package/web/assets/{lexon-C8G_qWst.js → lexon-D4aKXJ0J.js} +0 -0
  235. /package/web/assets/{lua-xqYje_o5.js → lua-DeQCQ0IN.js} +0 -0
  236. /package/web/assets/{m3-B5PetinG.js → m3-yCjRJP_i.js} +0 -0
  237. /package/web/assets/{markdown-BksexNux.js → markdown-C2IT79AR.js} +0 -0
  238. /package/web/assets/{mips-DKSTezUQ.js → mips-BAnhwv_D.js} +0 -0
  239. /package/web/assets/{msdax-SeFNE86e.js → msdax-D1jHDTih.js} +0 -0
  240. /package/web/assets/{mysql-5TQWJDdB.js → mysql-CTJU-jL7.js} +0 -0
  241. /package/web/assets/{objective-c-DeaYl08g.js → objective-c-CwxzUA28.js} +0 -0
  242. /package/web/assets/{pascal-CGBtIfZg.js → pascal-DpSQp86i.js} +0 -0
  243. /package/web/assets/{pascaligo-B85wuk0w.js → pascaligo-C4F0Gc12.js} +0 -0
  244. /package/web/assets/{perl-Bl61zsEQ.js → perl-87HvGh3u.js} +0 -0
  245. /package/web/assets/{pgsql-KgXv5Cq7.js → pgsql-DUB3YVHd.js} +0 -0
  246. /package/web/assets/{php-KRRf0kxu.js → php-gpgbnwXh.js} +0 -0
  247. /package/web/assets/{pla-CFpO6lSz.js → pla-9VH1h0qA.js} +0 -0
  248. /package/web/assets/{postiats-B0jQ-DXO.js → postiats-DYNil0RB.js} +0 -0
  249. /package/web/assets/{powerquery-T9Ge5xUx.js → powerquery-Cyj_QMWN.js} +0 -0
  250. /package/web/assets/{powershell-rmYjKoE4.js → powershell-BxsWzjwy.js} +0 -0
  251. /package/web/assets/{protobuf-B--9ME3E.js → protobuf-CpB35fc2.js} +0 -0
  252. /package/web/assets/{pug-y0-ppnAV.js → pug-CQ3BHXrf.js} +0 -0
  253. /package/web/assets/{qsharp-DobgOAC8.js → qsharp-hvdiA16n.js} +0 -0
  254. /package/web/assets/{r-BHQZIThn.js → r-BcpSD-1e.js} +0 -0
  255. /package/web/assets/{redis-DMHMVIni.js → redis-B2JGUU7L.js} +0 -0
  256. /package/web/assets/{redshift-ilRjY5HF.js → redshift-DtV7K8A1.js} +0 -0
  257. /package/web/assets/{restructuredtext-jr4YYJbv.js → restructuredtext-avYcqBCA.js} +0 -0
  258. /package/web/assets/{ruby-D-h_0NIs.js → ruby-B75_Tp8C.js} +0 -0
  259. /package/web/assets/{rust-VxeTSQU2.js → rust-CHon-ZXH.js} +0 -0
  260. /package/web/assets/{sb-BlhKufrP.js → sb-iehvyQKY.js} +0 -0
  261. /package/web/assets/{scala-IAk6nSCU.js → scala-LBw1ennX.js} +0 -0
  262. /package/web/assets/{scheme-Dggdm5LS.js → scheme-BRK_sKgt.js} +0 -0
  263. /package/web/assets/{scss-Bzj9Cp1q.js → scss-CzbUsG5V.js} +0 -0
  264. /package/web/assets/{shell-CSwYJdGJ.js → shell-DdtWj1FH.js} +0 -0
  265. /package/web/assets/{solidity-DnWqIXnk.js → solidity-CBYPsj6K.js} +0 -0
  266. /package/web/assets/{sophia-ClaYC_5N.js → sophia-BAmZLhFu.js} +0 -0
  267. /package/web/assets/{sparql-CfjIZAcz.js → sparql-DzxQz_25.js} +0 -0
  268. /package/web/assets/{sql-DxdJ7snd.js → sql-CtZa8xg5.js} +0 -0
  269. /package/web/assets/{st-DJgQE1uj.js → st-3yAXYt2f.js} +0 -0
  270. /package/web/assets/{swift-5cz3wIvv.js → swift-nwo4k0Qx.js} +0 -0
  271. /package/web/assets/{systemverilog-C8-7QuIt.js → systemverilog-38mUSYaO.js} +0 -0
  272. /package/web/assets/{tcl-C99u42o5.js → tcl-DfkL3MZ2.js} +0 -0
  273. /package/web/assets/{twig-Cv9kOcBK.js → twig-C2_DTvv-.js} +0 -0
  274. /package/web/assets/{typespec-DF1s-ehc.js → typespec-Dn7A_7aO.js} +0 -0
  275. /package/web/assets/{uuid-6HQMUkhT.js → uuid-H0yY5A03.js} +0 -0
  276. /package/web/assets/{vb-4mpz9ITX.js → vb-ByZEqbuQ.js} +0 -0
  277. /package/web/assets/{w3c-keyname-emj7Fjc1.js → w3c-keyname-CXRaQfIQ.js} +0 -0
  278. /package/web/assets/{wgsl-xExw6Z08.js → wgsl-BqCLRRs9.js} +0 -0
package/agent/index.js CHANGED
@@ -766,7 +766,10 @@ var ProjectSchema = z3.object({
766
766
  // NOTE: activeEnvironmentId is runtime-only (not persisted to JSON)
767
767
  // It's initialized to 'local' by default at load time
768
768
  activeEnvironmentId: z3.string().max(128).optional(),
769
- environmentIds: z3.array(z3.string().max(128)).max(100).default([])
769
+ environmentIds: z3.array(z3.string().max(128)).max(100).default([]),
770
+ // Ordre d'affichage des groupes de services dans la sidebar (noms de groupes).
771
+ // Les groupes absents de cette liste sont affichés après, par ordre alphabétique.
772
+ groupOrder: z3.array(z3.string().max(200)).max(100).default([])
770
773
  });
771
774
  var CreateProjectSchema = ProjectSchema.omit({ id: true }).partial().required({ name: true });
772
775
  var UpdateProjectSchema = ProjectSchema.partial().required({ id: true });
@@ -3153,7 +3156,7 @@ var HealthChecker = class extends EventEmitter6 {
3153
3156
  this.stopChecking(id);
3154
3157
  }
3155
3158
  }
3156
- async checkHttp(processId, path, timeout, maxRetries, method = "GET", expectedStatus = 200) {
3159
+ async checkHttp(processId, path3, timeout, maxRetries, method = "GET", expectedStatus = 200) {
3157
3160
  const proc = processStore.get(processId);
3158
3161
  if (!proc || proc.state !== "running") {
3159
3162
  this.updateResult(processId, "unknown", 0);
@@ -3164,7 +3167,7 @@ var HealthChecker = class extends EventEmitter6 {
3164
3167
  this.updateResult(processId, "unknown", 0);
3165
3168
  return;
3166
3169
  }
3167
- const url = `http://localhost:${port}${path}`;
3170
+ const url = `http://localhost:${port}${path3}`;
3168
3171
  let failures = this.failureCounts.get(processId) ?? 0;
3169
3172
  try {
3170
3173
  const response = await fetch(url, {
@@ -4509,7 +4512,20 @@ async function getGitStatus(cwd) {
4509
4512
  upstream = (await git(["rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], cwd, true)).trim();
4510
4513
  } catch {
4511
4514
  }
4512
- return { branch, staged, unstaged, untracked, ahead, behind, upstream };
4515
+ let additions = 0;
4516
+ let deletions = 0;
4517
+ try {
4518
+ const numstat = await git(["diff", "--numstat", "HEAD"], cwd, true);
4519
+ for (const line of numstat.split("\n").filter(Boolean)) {
4520
+ const [add, del] = line.split(" ");
4521
+ const a = parseInt(add ?? "", 10);
4522
+ const d = parseInt(del ?? "", 10);
4523
+ if (!Number.isNaN(a)) additions += a;
4524
+ if (!Number.isNaN(d)) deletions += d;
4525
+ }
4526
+ } catch {
4527
+ }
4528
+ return { branch, staged, unstaged, untracked, ahead, behind, upstream, additions, deletions };
4513
4529
  }
4514
4530
  var gitRouter = router({
4515
4531
  /** Check if a working directory exists and optionally verify its git remote */
@@ -4667,6 +4683,13 @@ var gitRouter = router({
4667
4683
  await git(["restore", "--staged", "--", ...input.paths], cwd);
4668
4684
  return { ok: true };
4669
4685
  }),
4686
+ /** Unstage all files */
4687
+ unstageAll: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA })).mutation(async ({ input }) => {
4688
+ const cwd = assertCwdExists(input.cwd);
4689
+ await assertGitRepo(cwd);
4690
+ await git(["reset", "--"], cwd);
4691
+ return { ok: true };
4692
+ }),
4670
4693
  /** Commit staged changes */
4671
4694
  commit: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA, message: z24.string().min(1).max(4096) })).mutation(async ({ input }) => {
4672
4695
  const cwd = assertCwdExists(input.cwd);
@@ -4795,6 +4818,54 @@ var gitRouter = router({
4795
4818
  }
4796
4819
  }
4797
4820
  return remotes;
4821
+ }),
4822
+ /** List stash entries */
4823
+ stashList: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA })).query(async ({ input }) => {
4824
+ const cwd = assertCwdExists(input.cwd);
4825
+ await assertGitRepo(cwd);
4826
+ const output = await git(["stash", "list", "--format=%gd%s"], cwd, true);
4827
+ const entries = [];
4828
+ for (const line of output.split("\n").filter(Boolean)) {
4829
+ const [ref, message = ""] = line.split("");
4830
+ const m = /stash@\{(\d+)\}/.exec(ref ?? "");
4831
+ if (m) entries.push({ index: parseInt(m[1], 10), ref, message });
4832
+ }
4833
+ return entries;
4834
+ }),
4835
+ /** Stash current changes */
4836
+ stashPush: protectedProcedure.input(z24.object({
4837
+ cwd: CWD_SCHEMA,
4838
+ message: z24.string().max(4096).optional(),
4839
+ includeUntracked: z24.boolean().default(true)
4840
+ })).mutation(async ({ input }) => {
4841
+ const cwd = assertCwdExists(input.cwd);
4842
+ await assertGitRepo(cwd);
4843
+ const args = ["stash", "push"];
4844
+ if (input.includeUntracked) args.push("--include-untracked");
4845
+ if (input.message) args.push("-m", input.message);
4846
+ const output = await git(args, cwd);
4847
+ return { ok: true, output: output.trim() };
4848
+ }),
4849
+ /** Apply a stash entry and remove it from the list */
4850
+ stashPop: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA, index: z24.number().int().min(0).max(1e3).default(0) })).mutation(async ({ input }) => {
4851
+ const cwd = assertCwdExists(input.cwd);
4852
+ await assertGitRepo(cwd);
4853
+ const output = await git(["stash", "pop", `stash@{${input.index}}`], cwd);
4854
+ return { ok: true, output: output.trim() };
4855
+ }),
4856
+ /** Apply a stash entry without removing it from the list */
4857
+ stashApply: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA, index: z24.number().int().min(0).max(1e3).default(0) })).mutation(async ({ input }) => {
4858
+ const cwd = assertCwdExists(input.cwd);
4859
+ await assertGitRepo(cwd);
4860
+ const output = await git(["stash", "apply", `stash@{${input.index}}`], cwd);
4861
+ return { ok: true, output: output.trim() };
4862
+ }),
4863
+ /** Drop a stash entry */
4864
+ stashDrop: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA, index: z24.number().int().min(0).max(1e3).default(0) })).mutation(async ({ input }) => {
4865
+ const cwd = assertCwdExists(input.cwd);
4866
+ await assertGitRepo(cwd);
4867
+ const output = await git(["stash", "drop", `stash@{${input.index}}`], cwd);
4868
+ return { ok: true, output: output.trim() };
4798
4869
  })
4799
4870
  });
4800
4871
  function runGitRaw(args, timeoutMs, extraEnv) {
@@ -4831,11 +4902,60 @@ import { spawn as spawn4 } from "child_process";
4831
4902
  import { EventEmitter as EventEmitter9 } from "events";
4832
4903
  import { randomUUID as randomUUID5 } from "crypto";
4833
4904
  import { fileURLToPath } from "url";
4905
+ import { createRequire } from "module";
4906
+ import { existsSync as existsSync2 } from "fs";
4907
+ import * as pty2 from "node-pty";
4908
+ function resolveMcpServerPath() {
4909
+ try {
4910
+ const req = createRequire(import.meta.url);
4911
+ return req.resolve("@runeya/packages-mcp-server");
4912
+ } catch {
4913
+ }
4914
+ const candidates = [
4915
+ new URL("../../../packages/mcp-server/dist/index.js", import.meta.url),
4916
+ new URL("../../../../packages/mcp-server/dist/index.js", import.meta.url),
4917
+ new URL("../mcp-server/index.js", import.meta.url)
4918
+ ];
4919
+ for (const c of candidates) {
4920
+ const p = fileURLToPath(c);
4921
+ if (existsSync2(p)) return p;
4922
+ }
4923
+ throw new Error("Could not locate @runeya/packages-mcp-server (built dist not found)");
4924
+ }
4834
4925
  var MAX_BUFFER_LINES = 1e5;
4835
4926
  var MAX_CONCURRENT_SPAWNS = 10;
4836
4927
  var CLEANUP_INTERVAL_MS = 6e4;
4837
4928
  var TTL_ACKED_MS = 5 * 6e4;
4838
4929
  var TTL_UNACKED_MS = 24 * 36e5;
4930
+ function resolveSpawnEnvAndArgs(opts) {
4931
+ const runeyaEnv = {
4932
+ ...opts.mcpApiBaseUrl ? { RUNEYA_BASE_URL: opts.mcpApiBaseUrl } : {},
4933
+ ...opts.mcpApiToken ? { RUNEYA_API_TOKEN: opts.mcpApiToken } : {}
4934
+ };
4935
+ const env2 = { ...process.env, ...opts.env, ...runeyaEnv };
4936
+ const args = [...opts.args];
4937
+ if (opts.enableMcp && opts.cli === "claude") {
4938
+ try {
4939
+ const mcpServerPath = resolveMcpServerPath();
4940
+ const mcpConfig = JSON.stringify({
4941
+ mcpServers: {
4942
+ runeya: {
4943
+ command: "node",
4944
+ args: [mcpServerPath],
4945
+ env: {
4946
+ ...env2.RUNEYA_BASE_URL ? { RUNEYA_BASE_URL: env2.RUNEYA_BASE_URL } : {},
4947
+ ...env2.RUNEYA_API_TOKEN ? { RUNEYA_API_TOKEN: env2.RUNEYA_API_TOKEN } : {}
4948
+ }
4949
+ }
4950
+ }
4951
+ });
4952
+ args.push("--mcp-config", mcpConfig);
4953
+ } catch (err) {
4954
+ console.warn("[ai-spawn-manager] Failed to resolve MCP server path:", err.message);
4955
+ }
4956
+ }
4957
+ return { env: env2, args };
4958
+ }
4839
4959
  var AiSpawnManager = class {
4840
4960
  spawns = /* @__PURE__ */ new Map();
4841
4961
  cleanupInterval = null;
@@ -4849,28 +4969,11 @@ var AiSpawnManager = class {
4849
4969
  }
4850
4970
  const spawnId = randomUUID5();
4851
4971
  const emitter = new EventEmitter9();
4852
- const args = [...opts.args];
4853
- if (opts.enableMcp && opts.cli === "claude") {
4854
- try {
4855
- const mcpServerPath = fileURLToPath(new URL("../mcp-server/index.js", import.meta.url));
4856
- const mcpConfig = JSON.stringify({
4857
- mcpServers: {
4858
- runeya: {
4859
- command: "node",
4860
- args: [mcpServerPath],
4861
- env: opts.mcpApiBaseUrl ? { RUNEYA_BASE_URL: opts.mcpApiBaseUrl } : {}
4862
- }
4863
- }
4864
- });
4865
- args.push("--mcp-config", mcpConfig);
4866
- } catch (err) {
4867
- console.warn("[ai-spawn-manager] Failed to resolve MCP server path:", err.message);
4868
- }
4869
- }
4972
+ const { env: env2, args } = resolveSpawnEnvAndArgs(opts);
4870
4973
  const proc = spawn4(opts.cli, args, {
4871
4974
  stdio: ["pipe", "pipe", "pipe"],
4872
4975
  shell: false,
4873
- env: opts.env ? { ...process.env, ...opts.env } : process.env,
4976
+ env: env2,
4874
4977
  cwd: opts.cwd || void 0
4875
4978
  });
4876
4979
  const entry = {
@@ -4880,10 +4983,12 @@ var AiSpawnManager = class {
4880
4983
  exitCode: null,
4881
4984
  buffer: [],
4882
4985
  proc,
4986
+ ptyProc: null,
4883
4987
  emitter,
4884
4988
  createdAt: Date.now(),
4885
4989
  doneAt: null,
4886
- acked: false
4990
+ acked: false,
4991
+ lastChunkAt: null
4887
4992
  };
4888
4993
  this.spawns.set(spawnId, entry);
4889
4994
  if (opts.stdinData) {
@@ -4968,8 +5073,98 @@ var AiSpawnManager = class {
4968
5073
  }
4969
5074
  return true;
4970
5075
  }
5076
+ if (entry.ptyProc) {
5077
+ try {
5078
+ entry.ptyProc.kill();
5079
+ } catch {
5080
+ }
5081
+ return true;
5082
+ }
4971
5083
  return false;
4972
5084
  }
5085
+ // ── PTY mode ────────────────────────────────────────────────────────────
5086
+ spawnPty(opts) {
5087
+ const running = [...this.spawns.values()].filter((s) => s.status === "running").length;
5088
+ if (running >= MAX_CONCURRENT_SPAWNS) {
5089
+ throw new Error(`Max concurrent AI spawns reached (${MAX_CONCURRENT_SPAWNS})`);
5090
+ }
5091
+ const spawnId = randomUUID5();
5092
+ const emitter = new EventEmitter9();
5093
+ const { env: env2, args } = resolveSpawnEnvAndArgs(opts);
5094
+ const ptyProc = pty2.spawn(opts.cli, args, {
5095
+ name: "xterm-256color",
5096
+ cols: opts.cols ?? 120,
5097
+ rows: opts.rows ?? 30,
5098
+ cwd: opts.cwd || process.cwd(),
5099
+ env: env2
5100
+ });
5101
+ const entry = {
5102
+ spawnId,
5103
+ sessionId: opts.sessionId,
5104
+ cli: opts.cli,
5105
+ status: "running",
5106
+ exitCode: null,
5107
+ buffer: [],
5108
+ proc: null,
5109
+ ptyProc,
5110
+ emitter,
5111
+ createdAt: Date.now(),
5112
+ doneAt: null,
5113
+ acked: false,
5114
+ lastChunkAt: null
5115
+ };
5116
+ this.spawns.set(spawnId, entry);
5117
+ ptyProc.onData((data) => {
5118
+ this.pushChunk(entry, { type: "pty-data", data });
5119
+ });
5120
+ ptyProc.onExit(({ exitCode }) => {
5121
+ entry.status = exitCode === 0 ? "done" : "error";
5122
+ entry.exitCode = exitCode;
5123
+ entry.doneAt = Date.now();
5124
+ entry.ptyProc = null;
5125
+ this.pushChunk(entry, { type: "exit", data: "", code: exitCode });
5126
+ });
5127
+ console.log(`[ai-spawn-manager] Spawned PTY ${opts.cli} (${spawnId}), args: ${opts.args.length}, cwd: ${opts.cwd ?? "(default)"}, ${opts.cols ?? 120}x${opts.rows ?? 30}`);
5128
+ return spawnId;
5129
+ }
5130
+ writePty(spawnId, data) {
5131
+ const entry = this.spawns.get(spawnId);
5132
+ if (!entry || !entry.ptyProc) return false;
5133
+ try {
5134
+ entry.ptyProc.write(data);
5135
+ return true;
5136
+ } catch {
5137
+ return false;
5138
+ }
5139
+ }
5140
+ /** Return a running PTY spawn matching the given logical sessionId, if any. */
5141
+ findPtyBySessionId(sessionId) {
5142
+ for (const entry of this.spawns.values()) {
5143
+ if (entry.sessionId === sessionId && entry.status === "running" && entry.ptyProc !== null) {
5144
+ return {
5145
+ spawnId: entry.spawnId,
5146
+ cli: entry.cli,
5147
+ status: entry.status,
5148
+ exitCode: entry.exitCode,
5149
+ bufferLength: entry.buffer.length,
5150
+ createdAt: entry.createdAt,
5151
+ doneAt: entry.doneAt,
5152
+ lastChunkAt: entry.lastChunkAt
5153
+ };
5154
+ }
5155
+ }
5156
+ return null;
5157
+ }
5158
+ resizePty(spawnId, cols, rows) {
5159
+ const entry = this.spawns.get(spawnId);
5160
+ if (!entry || !entry.ptyProc) return false;
5161
+ try {
5162
+ entry.ptyProc.resize(cols, rows);
5163
+ return true;
5164
+ } catch {
5165
+ return false;
5166
+ }
5167
+ }
4973
5168
  list() {
4974
5169
  return [...this.spawns.values()].map((e) => ({
4975
5170
  spawnId: e.spawnId,
@@ -4978,7 +5173,8 @@ var AiSpawnManager = class {
4978
5173
  exitCode: e.exitCode,
4979
5174
  bufferLength: e.buffer.length,
4980
5175
  createdAt: e.createdAt,
4981
- doneAt: e.doneAt
5176
+ doneAt: e.doneAt,
5177
+ lastChunkAt: e.lastChunkAt
4982
5178
  }));
4983
5179
  }
4984
5180
  ack(spawnId) {
@@ -4993,6 +5189,9 @@ var AiSpawnManager = class {
4993
5189
  entry.buffer.shift();
4994
5190
  }
4995
5191
  entry.buffer.push(chunk);
5192
+ if (chunk.type === "stdout" || chunk.type === "stderr" || chunk.type === "pty-data") {
5193
+ entry.lastChunkAt = Date.now();
5194
+ }
4996
5195
  entry.emitter.emit("chunk");
4997
5196
  if (chunk.type === "exit") {
4998
5197
  entry.emitter.emit("done");
@@ -5025,13 +5224,19 @@ var AiSpawnManager = class {
5025
5224
  } catch {
5026
5225
  }
5027
5226
  }
5227
+ if (entry.ptyProc) {
5228
+ try {
5229
+ entry.ptyProc.kill();
5230
+ } catch {
5231
+ }
5232
+ }
5028
5233
  }
5029
5234
  }
5030
5235
  };
5031
5236
  var aiSpawnManager = new AiSpawnManager();
5032
5237
 
5033
5238
  // src/services/codex-app-server-manager.ts
5034
- import { spawn as spawn5 } from "child_process";
5239
+ import { spawn as spawn6 } from "child_process";
5035
5240
  import { createInterface as createInterface2 } from "readline";
5036
5241
  import { EventEmitter as EventEmitter10 } from "events";
5037
5242
  var REQUEST_TIMEOUT_MS = 3e5;
@@ -5059,7 +5264,7 @@ var CodexAppServerManager = class extends EventEmitter10 {
5059
5264
  }
5060
5265
  }
5061
5266
  async doConnect() {
5062
- this.proc = spawn5("codex", ["app-server"], {
5267
+ this.proc = spawn6("codex", ["app-server"], {
5063
5268
  stdio: ["pipe", "pipe", "pipe"],
5064
5269
  env: { ...process.env, ...this.extraEnv }
5065
5270
  });
@@ -5170,7 +5375,142 @@ var CodexAppServerManager = class extends EventEmitter10 {
5170
5375
  };
5171
5376
  var codexAppServerManager = new CodexAppServerManager();
5172
5377
 
5378
+ // src/services/ai-context-files.ts
5379
+ import { mkdir as mkdir4, writeFile as writeFile4 } from "fs/promises";
5380
+ import path from "path";
5381
+ import os2 from "os";
5382
+ var ROOT_DIR_NAME = "runeya-ai-context";
5383
+ function sanitizeName(name) {
5384
+ let safe = name.replace(/[^A-Za-z0-9._-]/g, "_");
5385
+ if (!safe || safe === "." || safe === "..") safe = "context";
5386
+ if (!/\.[A-Za-z0-9]+$/.test(safe)) safe += ".md";
5387
+ return safe;
5388
+ }
5389
+ function sanitizeSessionId(sessionId) {
5390
+ const safe = sessionId.replace(/[^A-Za-z0-9._-]/g, "_");
5391
+ return safe || "session";
5392
+ }
5393
+ async function writeContextFiles(sessionId, files) {
5394
+ const baseDir = path.join(os2.tmpdir(), ROOT_DIR_NAME, sanitizeSessionId(sessionId));
5395
+ await mkdir4(baseDir, { recursive: true });
5396
+ const paths = [];
5397
+ const usedNames = /* @__PURE__ */ new Set();
5398
+ for (let i = 0; i < files.length; i++) {
5399
+ const file = files[i];
5400
+ let name = sanitizeName(file.name);
5401
+ if (usedNames.has(name)) {
5402
+ const ext = path.extname(name);
5403
+ const base = name.slice(0, name.length - ext.length);
5404
+ name = `${base}-${i}${ext}`;
5405
+ }
5406
+ usedNames.add(name);
5407
+ const fullPath = path.join(baseDir, name);
5408
+ await writeFile4(fullPath, file.content, "utf8");
5409
+ paths.push(fullPath);
5410
+ }
5411
+ return paths;
5412
+ }
5413
+
5414
+ // src/services/ai-paste-image.ts
5415
+ import { mkdir as mkdir5, writeFile as writeFile5, unlink as unlink2 } from "fs/promises";
5416
+ import path2 from "path";
5417
+ import os3 from "os";
5418
+ import { randomUUID as randomUUID6 } from "crypto";
5419
+ import { spawn as spawn7 } from "child_process";
5420
+ var TMP_DIR_NAME = "runeya-ai-paste";
5421
+ var MIME_TO_EXT = {
5422
+ "image/png": "png",
5423
+ "image/jpeg": "jpg",
5424
+ "image/jpg": "jpg",
5425
+ "image/gif": "gif",
5426
+ "image/webp": "webp",
5427
+ "image/bmp": "bmp"
5428
+ };
5429
+ function extForMime(mime) {
5430
+ return MIME_TO_EXT[mime.toLowerCase()] ?? "png";
5431
+ }
5432
+ function runCmd(cmd, args, stdin, timeoutMs = 5e3) {
5433
+ return new Promise((resolve) => {
5434
+ let settled = false;
5435
+ const settle = (code, stderr) => {
5436
+ if (settled) return;
5437
+ settled = true;
5438
+ resolve({ code, stderr });
5439
+ };
5440
+ try {
5441
+ const child = spawn7(cmd, args, { stdio: ["pipe", "ignore", "pipe"] });
5442
+ let stderr = "";
5443
+ child.stderr.on("data", (c) => {
5444
+ stderr += c.toString();
5445
+ });
5446
+ child.on("error", (err) => settle(127, err.message));
5447
+ child.on("exit", (code) => settle(code ?? 1, stderr));
5448
+ const t2 = setTimeout(() => {
5449
+ try {
5450
+ child.kill("SIGKILL");
5451
+ } catch {
5452
+ }
5453
+ settle(124, "timeout");
5454
+ }, timeoutMs);
5455
+ child.on("exit", () => clearTimeout(t2));
5456
+ if (stdin) {
5457
+ child.stdin.on("error", () => {
5458
+ });
5459
+ child.stdin.end(stdin);
5460
+ } else {
5461
+ child.stdin.end();
5462
+ }
5463
+ } catch (err) {
5464
+ settle(127, err.message);
5465
+ }
5466
+ });
5467
+ }
5468
+ async function savePastedImage(base64, mimeType, sessionId) {
5469
+ const buf = Buffer.from(base64, "base64");
5470
+ if (buf.length === 0) throw new Error("Empty image payload");
5471
+ const ext = extForMime(mimeType);
5472
+ const baseDir = path2.join(
5473
+ os3.tmpdir(),
5474
+ TMP_DIR_NAME,
5475
+ sessionId ? sessionId.replace(/[^A-Za-z0-9._-]/g, "_") : "default"
5476
+ );
5477
+ await mkdir5(baseDir, { recursive: true });
5478
+ const tmpPath = path2.join(baseDir, `paste-${Date.now()}-${randomUUID6().slice(0, 8)}.${ext}`);
5479
+ await writeFile5(tmpPath, buf);
5480
+ const { method, error } = await tryWriteClipboard(buf, mimeType, tmpPath);
5481
+ return { tmpPath, clipboardMethod: method, clipboardError: error };
5482
+ }
5483
+ async function tryWriteClipboard(buf, mimeType, tmpPath) {
5484
+ const normalizedMime = mimeType.toLowerCase();
5485
+ const errors = [];
5486
+ if (process.platform === "darwin") {
5487
+ const klass = normalizedMime === "image/jpeg" || normalizedMime === "image/jpg" ? "JPEG picture" : "PNGf";
5488
+ const script = `set the clipboard to (read (POSIX file "${tmpPath.replace(/"/g, '\\"')}") as \xABclass ${klass}\xBB)`;
5489
+ const r = await runCmd("osascript", ["-e", script]);
5490
+ if (r.code === 0) return { method: "pbcopy" };
5491
+ errors.push(`osascript: ${r.stderr.trim()}`);
5492
+ }
5493
+ if (process.platform === "linux") {
5494
+ const r = await runCmd("xclip", ["-selection", "clipboard", "-t", normalizedMime, "-i"], buf);
5495
+ if (r.code === 0) return { method: "xclip" };
5496
+ errors.push(`xclip: ${r.stderr.trim() || `exit ${r.code}`}`);
5497
+ const r2 = await runCmd("wl-copy", ["--type", normalizedMime], buf);
5498
+ if (r2.code === 0) return { method: "wl-copy" };
5499
+ errors.push(`wl-copy: ${r2.stderr.trim() || `exit ${r2.code}`}`);
5500
+ }
5501
+ if (process.platform === "win32") {
5502
+ const ps = `Add-Type -AssemblyName System.Windows.Forms; Add-Type -AssemblyName System.Drawing; $img = [System.Drawing.Image]::FromFile("${tmpPath.replace(/\\/g, "\\\\")}"); [System.Windows.Forms.Clipboard]::SetImage($img); $img.Dispose()`;
5503
+ const r = await runCmd("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", ps]);
5504
+ if (r.code === 0) return { method: "powershell" };
5505
+ errors.push(`powershell: ${r.stderr.trim() || `exit ${r.code}`}`);
5506
+ }
5507
+ return { method: null, error: errors.join(" | ") || "no clipboard tool available" };
5508
+ }
5509
+
5173
5510
  // src/trpc/routers/ai.ts
5511
+ var MAX_CONTEXT_FILES = 20;
5512
+ var MAX_CONTEXT_FILE_BYTES = 1e6;
5513
+ var MAX_CONTEXT_TOTAL_BYTES = 5e6;
5174
5514
  var aiRouter = router({
5175
5515
  /** Spawn an AI CLI process. Returns a spawnId for streaming. */
5176
5516
  spawn: protectedProcedure.input(z25.object({
@@ -5180,7 +5520,8 @@ var aiRouter = router({
5180
5520
  cwd: z25.string().max(4096).optional(),
5181
5521
  stdinData: z25.string().max(1e7).optional(),
5182
5522
  enableMcp: z25.boolean().optional(),
5183
- mcpApiBaseUrl: z25.string().max(512).optional()
5523
+ mcpApiBaseUrl: z25.string().max(512).optional(),
5524
+ mcpApiToken: z25.string().max(8192).optional()
5184
5525
  })).mutation(({ input }) => {
5185
5526
  const spawnId = aiSpawnManager.spawn(input);
5186
5527
  return { spawnId };
@@ -5201,6 +5542,71 @@ var aiRouter = router({
5201
5542
  });
5202
5543
  }
5203
5544
  }),
5545
+ /** Spawn an AI CLI process in a PTY (interactive mode). Returns spawnId. */
5546
+ spawnPty: protectedProcedure.input(z25.object({
5547
+ cli: z25.string().max(64),
5548
+ args: z25.array(z25.string().max(5e5)),
5549
+ env: z25.record(z25.string().max(256), z25.string().max(5e5)).optional(),
5550
+ cwd: z25.string().max(4096).optional(),
5551
+ cols: z25.number().int().min(1).max(1e3).optional(),
5552
+ rows: z25.number().int().min(1).max(1e3).optional(),
5553
+ sessionId: z25.string().max(128).optional(),
5554
+ enableMcp: z25.boolean().optional(),
5555
+ mcpApiBaseUrl: z25.string().max(512).optional(),
5556
+ mcpApiToken: z25.string().max(8192).optional()
5557
+ })).mutation(({ input }) => {
5558
+ const spawnId = aiSpawnManager.spawnPty(input);
5559
+ return { spawnId };
5560
+ }),
5561
+ /** Find a running PTY spawn by its logical sessionId (for re-attach). */
5562
+ findPtyBySession: protectedProcedure.input(z25.object({ sessionId: z25.string().max(128) })).query(({ input }) => {
5563
+ return aiSpawnManager.findPtyBySessionId(input.sessionId);
5564
+ }),
5565
+ /** Write input to a PTY spawn (user keystrokes). */
5566
+ writePty: protectedProcedure.input(z25.object({
5567
+ spawnId: z25.string().max(128),
5568
+ data: z25.string().max(1e6)
5569
+ })).mutation(({ input }) => {
5570
+ const ok = aiSpawnManager.writePty(input.spawnId, input.data);
5571
+ return { ok };
5572
+ }),
5573
+ /** Write attached-context files for an AI session to a temp dir. Returns absolute paths. */
5574
+ writeContextFiles: protectedProcedure.input(z25.object({
5575
+ sessionId: z25.string().min(1).max(128),
5576
+ files: z25.array(z25.object({
5577
+ name: z25.string().min(1).max(256),
5578
+ content: z25.string().max(MAX_CONTEXT_FILE_BYTES)
5579
+ })).min(1).max(MAX_CONTEXT_FILES)
5580
+ }).refine(
5581
+ (val) => val.files.reduce((sum, f) => sum + f.content.length, 0) <= MAX_CONTEXT_TOTAL_BYTES,
5582
+ { message: `Total context size exceeds ${MAX_CONTEXT_TOTAL_BYTES} bytes` }
5583
+ )).mutation(async ({ input }) => {
5584
+ const paths = await writeContextFiles(input.sessionId, input.files);
5585
+ return { paths };
5586
+ }),
5587
+ /**
5588
+ * Save a pasted image to disk and try to populate the agent's system clipboard
5589
+ * so Claude's native paste detection picks it up. Returns the tmp path and
5590
+ * which clipboard method (if any) succeeded — caller decides whether to send
5591
+ * Ctrl+V (\x16) or inject `@<path>` into the PTY.
5592
+ */
5593
+ pasteImage: protectedProcedure.input(z25.object({
5594
+ sessionId: z25.string().max(128).optional(),
5595
+ mimeType: z25.string().max(64),
5596
+ base64: z25.string().max(15e6)
5597
+ })).mutation(async ({ input }) => {
5598
+ const res = await savePastedImage(input.base64, input.mimeType, input.sessionId);
5599
+ return res;
5600
+ }),
5601
+ /** Resize a PTY spawn. */
5602
+ resizePty: protectedProcedure.input(z25.object({
5603
+ spawnId: z25.string().max(128),
5604
+ cols: z25.number().int().min(1).max(1e3),
5605
+ rows: z25.number().int().min(1).max(1e3)
5606
+ })).mutation(({ input }) => {
5607
+ const ok = aiSpawnManager.resizePty(input.spawnId, input.cols, input.rows);
5608
+ return { ok };
5609
+ }),
5204
5610
  /** Kill a running AI spawn. */
5205
5611
  kill: protectedProcedure.input(z25.object({ spawnId: z25.string().max(128) })).mutation(({ input }) => {
5206
5612
  const killed = aiSpawnManager.kill(input.spawnId);