@runeya/runeya 2.0.13 → 2.0.16

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 (237) hide show
  1. package/agent/index.js +236 -15
  2. package/agent/index.js.map +1 -1
  3. package/agent-manager-7IDZTNVZ-HVRWIXYW.js +8 -0
  4. package/{chunk-AJW7LDO5.js → chunk-AHOJAT74.js} +9 -3
  5. package/chunk-AHOJAT74.js.map +1 -0
  6. package/{dist-HGCFHXO4.js → dist-P3HYK2SI.js} +334 -92
  7. package/dist-P3HYK2SI.js.map +1 -0
  8. package/index.js +1 -1
  9. package/package.json +1 -1
  10. package/web/assets/{AddressBar.vue-B6BOLYmO.js → AddressBar.vue-BZnGu8vW.js} +1 -1
  11. package/web/assets/{AgentScalarChatInterface.vue-DKSmjtvV.js → AgentScalarChatInterface.vue-QkKS0oIt.js} +1 -1
  12. package/web/assets/{AgentTerminalPage-BZ6jaRAs.js → AgentTerminalPage-CfI3DoEO.js} +1 -1
  13. package/web/assets/AiChatPage-C_j-aspS.js +1 -0
  14. package/web/assets/{AppLayout-B7-y0tBI.css → AppLayout-Cf8sRK63.css} +1 -1
  15. package/web/assets/{AppLayout-DnMCPCO8.js → AppLayout-CgU4s6lb.js} +1 -1
  16. package/web/assets/{AuditPage-CTdEvLE-.js → AuditPage-C42BeKr5.js} +1 -1
  17. package/web/assets/{CodeInput.vue-Sp2dM8hl.js → CodeInput.vue-BGBOdacc.js} +1 -1
  18. package/web/assets/{Collection.vue-CdPjaC9d.js → Collection.vue-Vub9L9if.js} +1 -1
  19. package/web/assets/{CollectionAuthentication.vue-DMPykUah.js → CollectionAuthentication.vue-DMa9nYTH.js} +1 -1
  20. package/web/assets/CollectionCookies.vue-Dr_bErXS.js +1 -0
  21. package/web/assets/{CollectionEnvironment.vue-DKab6xJJ.js → CollectionEnvironment.vue-CcS_RH1F.js} +1 -1
  22. package/web/assets/{CollectionOverview.vue-DlODh8Vk.js → CollectionOverview.vue-Cm3m-3IA.js} +1 -1
  23. package/web/assets/CollectionScripts.vue-DwfCDW_N.js +1 -0
  24. package/web/assets/{CollectionServers.vue-Br-QackN.js → CollectionServers.vue-CDU7RCJI.js} +1 -1
  25. package/web/assets/{CollectionSettings.vue-Cm6NQbDm.js → CollectionSettings.vue-QApKyKpx.js} +1 -1
  26. package/web/assets/CollectionSync.vue-2mc6W9Vb.js +1 -0
  27. package/web/assets/{CommandActionInput.vue-CZ3-rqSL.js → CommandActionInput.vue-CSydiKjM.js} +1 -1
  28. package/web/assets/{Cookies.vue-Duz-a-ga.js → Cookies.vue-2UMujX_l.js} +1 -1
  29. package/web/assets/DashboardPage-CSkUCQHY.css +1 -0
  30. package/web/assets/DashboardPage-Dt5zSm2a.js +1 -0
  31. package/web/assets/{DataTable.vue-Dorr-r7J.js → DataTable.vue-BKb6QQRz.js} +1 -1
  32. package/web/assets/{DataTableCheckbox.vue-CATn-YYp.js → DataTableCheckbox.vue-DC2n-xeZ.js} +1 -1
  33. package/web/assets/{DataTableHeader.vue-C3SUSaR8.js → DataTableHeader.vue-Cbolg5AE.js} +1 -1
  34. package/web/assets/{DataTableInput.vue-_06pwPUA.js → DataTableInput.vue-DoVPLXed.js} +1 -1
  35. package/web/assets/{DeleteSidebarListElement.vue-DoqRnMXx.js → DeleteSidebarListElement.vue-Br-Lvh7k.js} +1 -1
  36. package/web/assets/{EditSidebarListElement.vue-BqTw6Tho.js → EditSidebarListElement.vue-BVJ4wsTf.js} +1 -1
  37. package/web/assets/{EditorIcon-CbpIT0A1.js → EditorIcon-D3F3QHD_.js} +1 -1
  38. package/web/assets/{EmptyState.vue-Bur5L0a4.js → EmptyState.vue-DMCTVrXN.js} +1 -1
  39. package/web/assets/{Environment.vue-C50lH9cP.js → Environment.vue-CEBYjegx.js} +1 -1
  40. package/web/assets/{EnvironmentForm-BDfzXuHx.js → EnvironmentForm-D9pUNi_S.js} +1 -1
  41. package/web/assets/{EnvironmentFormPage-CLylRN6B.js → EnvironmentFormPage-BQwHvpiH.js} +1 -1
  42. package/web/assets/{EnvironmentListPage-DlUT6LnX.js → EnvironmentListPage-BEX6YTjm.js} +1 -1
  43. package/web/assets/{EnvironmentModal.vue-Dz5CArRX.js → EnvironmentModal.vue-Bipjnu_F.js} +1 -1
  44. package/web/assets/{EnvironmentSelector-DHoYUCTH.js → EnvironmentSelector-BsLO-o9W.js} +1 -1
  45. package/web/assets/{Form.vue-BzZCMgN1.js → Form.vue-CwujTuIH.js} +1 -1
  46. package/web/assets/{IconSelector.vue-BCmeqlrs.js → IconSelector.vue-xGa1snoB.js} +1 -1
  47. package/web/assets/KanbanBoardPage-CS0DFaYQ.js +2 -0
  48. package/web/assets/KanbanBoardPage-GHv836NO.css +1 -0
  49. package/web/assets/{KanbanListPage-BLdNz80q.js → KanbanListPage-BlycDa8i.js} +1 -1
  50. package/web/assets/{LaunchProjectPage-DjRA2D3h.js → LaunchProjectPage-CQPXVRR8.js} +1 -1
  51. package/web/assets/{LaunchServicesPage-CKaGcu3z.js → LaunchServicesPage-DIc47d5w.js} +1 -1
  52. package/web/assets/{LogViewer-CtX_6uFM.js → LogViewer-D-j9SP-8.js} +1 -1
  53. package/web/assets/{ProcessControls-BY-_9zo7.js → ProcessControls-D3MHr6vJ.js} +1 -1
  54. package/web/assets/{ProcessDetailPage-Bqis1qMA.js → ProcessDetailPage-DArVdn5O.js} +1 -1
  55. package/web/assets/{ProcessMetrics-DQybvwcA.js → ProcessMetrics-tRbudcTQ.js} +1 -1
  56. package/web/assets/{ProjectDetailPage-FBPonwd5.js → ProjectDetailPage-DQWbqmra.js} +1 -1
  57. package/web/assets/{ProjectListPage-xwlVXN8A.js → ProjectListPage-BArhG94f.js} +1 -1
  58. package/web/assets/{RandomJobTestPage-0pqne-FD.js → RandomJobTestPage-cx0kQXnf.js} +1 -1
  59. package/web/assets/{Request.vue-Db4XEPKt.js → Request.vue-B9DoYtI8.js} +1 -1
  60. package/web/assets/{RequestAuth.vue-CK1A6ySt.js → RequestAuth.vue-CqHxzl6g.js} +1 -1
  61. package/web/assets/{RequestRoot.vue-BLF0GGT5.js → RequestRoot.vue-C28ISMld.js} +1 -1
  62. package/web/assets/{ScalarAsciiArt.vue-BPdUsXWj.js → ScalarAsciiArt.vue-BYd0f-av.js} +1 -1
  63. package/web/assets/{ScalarIconEyeSlash.vue-BBDBShRO.js → ScalarIconEyeSlash.vue-Ct2ktTXq.js} +1 -1
  64. package/web/assets/{ScalarIconTrash.vue-Tpr15aNY.js → ScalarIconTrash.vue-DQO_gQ8s.js} +1 -1
  65. package/web/assets/{ScenarioEditorPage-DNuo-2Gi.js → ScenarioEditorPage-DP06DP64.js} +1 -1
  66. package/web/assets/{ServerVariablesForm.vue-XLQ145gw.js → ServerVariablesForm.vue-D11m7aiX.js} +1 -1
  67. package/web/assets/{ServiceControlsBar-CCTGcA1t.js → ServiceControlsBar-DMq83CtH.js} +1 -1
  68. package/web/assets/{ServiceDetailPage-BELECRic.css → ServiceDetailPage-BngfQIAo.css} +1 -1
  69. package/web/assets/ServiceDetailPage-Cn1MTG_u.js +2 -0
  70. package/web/assets/{ServiceFormPage-F3boRKs-.js → ServiceFormPage-CyIValC5.js} +1 -1
  71. package/web/assets/{Settings.vue-D_1yQu6i.js → Settings.vue-CCeUjK5z.js} +1 -1
  72. package/web/assets/{SettingsPage-CgJN_IL7.css → SettingsPage-BhGoaUHP.css} +1 -1
  73. package/web/assets/SettingsPage-LVnvVA93.js +225 -0
  74. package/web/assets/{SetupKeyPage-BcaSoLjU.js → SetupKeyPage-DOxR0hTs.js} +1 -1
  75. package/web/assets/{SetupPage-mCVAKLtm.js → SetupPage-DTQqk8IW.js} +1 -1
  76. package/web/assets/{Sidebar.vue-De4YlW0c.js → Sidebar.vue-BLpHEfAt.js} +1 -1
  77. package/web/assets/{SidebarButton.vue-CctYiTRp.js → SidebarButton.vue-CNMSjNtm.js} +1 -1
  78. package/web/assets/{SidebarListElement.vue-Cv7jUZIM.js → SidebarListElement.vue-DSsy6NQT.js} +1 -1
  79. package/web/assets/TiptapEditor-DzMKh7Iq.css +1 -0
  80. package/web/assets/TiptapEditor-TuQki585.js +181 -0
  81. package/web/assets/{UnlockPage-BSpzyZnd.js → UnlockPage-D4x8qq_i.js} +1 -1
  82. package/web/assets/{VariablesTable-Dn3IvplD.js → VariablesTable-BP8KuwPI.js} +1 -1
  83. package/web/assets/{ViewLayout.vue-fiagi8zc.js → ViewLayout.vue-Dui_p5J4.js} +1 -1
  84. package/web/assets/{ViewLayoutContent.vue-BehGrsED.js → ViewLayoutContent.vue-CZRQTJFb.js} +1 -1
  85. package/web/assets/{ViewLayoutSection.vue-D4icCgQI.js → ViewLayoutSection.vue-C87DZ2QU.js} +1 -1
  86. package/web/assets/WikiPage-BrgnqOvx.js +1 -0
  87. package/web/assets/WikiView-CMF4PzXp.css +1 -0
  88. package/web/assets/WikiView-Decl55xY.js +1 -0
  89. package/web/assets/{active-entities-CkBGjwu9.js → active-entities-DEkfqGrE.js} +1 -1
  90. package/web/assets/{api-reference-D1EfYtPj.js → api-reference-DP5iGzGP.js} +1 -1
  91. package/web/assets/{autocomplete-CjBHTJWh.js → autocomplete-DcAAfn0y.js} +1 -1
  92. package/web/assets/{card-CsmU2iiY.js → card-DyK4dvjg.js} +1 -1
  93. package/web/assets/{checkbox-B5XZqi1U.js → checkbox-Csn61_gJ.js} +1 -1
  94. package/web/assets/{chip-C4pSomPm.js → chip-DkjFl7f-.js} +1 -1
  95. package/web/assets/{column-CR3Hix4J.js → column-DyznW54C.js} +1 -1
  96. package/web/assets/{core-CtGUajLi.js → core-BXP8Yp-2.js} +1 -1
  97. package/web/assets/{cssMode-nuznbveH.js → cssMode-C9nCeku9.js} +1 -1
  98. package/web/assets/{dist--ZlcDulO.js → dist-DKLcX5kd.js} +1 -1
  99. package/web/assets/{dist-DH_zJr7W.js → dist-DM4_kDGf.js} +1 -1
  100. package/web/assets/{dist-WjGUyWSO.js → dist-DOfPSpzL.js} +1 -1
  101. package/web/assets/{dist-CXkMrHNP.js → dist-zqENM1-W.js} +1 -1
  102. package/web/assets/{divider-CnJlD7qO.js → divider-BJQexqne.js} +1 -1
  103. package/web/assets/{fieldset-D9zY6R6s.js → fieldset-BPm9DkKy.js} +1 -1
  104. package/web/assets/{freemarker2-Bw43sOne.js → freemarker2-BaJGEPal.js} +1 -1
  105. package/web/assets/{handlebars-C8qgW7u6.js → handlebars-BQFn9RdQ.js} +1 -1
  106. package/web/assets/{html-Dy9PKnkr.js → html-Cr5a-EYz.js} +1 -1
  107. package/web/assets/{htmlMode-o8EU0tqo.js → htmlMode-CC9GYLNa.js} +1 -1
  108. package/web/assets/{index-CIcE6DNv.js → index-CV_lCcKm.js} +5 -5
  109. package/web/assets/{javascript-CuRngcUR.js → javascript-mDqsZBlu.js} +1 -1
  110. package/web/assets/{jsonMode-CsUIxwQq.js → jsonMode-B54JAo3i.js} +1 -1
  111. package/web/assets/{keyboard-DhkINir5.js → keyboard-BALpgxzI.js} +1 -1
  112. package/web/assets/{lib-E9M4L9vE.js → lib-CbGVmNqI.js} +1 -1
  113. package/web/assets/{library-BXoSag-V.js → library-DL2YIihE.js} +1 -1
  114. package/web/assets/{liquid-CraMnqaK.js → liquid-DiGHjG_L.js} +1 -1
  115. package/web/assets/{mdx-DPSW5q1A.js → mdx-D6dV5_Hg.js} +1 -1
  116. package/web/assets/{mediaTypes-DDACekzr.js → mediaTypes-97PR9Ryv.js} +1 -1
  117. package/web/assets/{message-DKOCajc6.js → message-CkvY1zpy.js} +1 -1
  118. package/web/assets/{minus-CtlH9Syh.js → minus-Cz1A1nRX.js} +1 -1
  119. package/web/assets/{multiselect-sshNnjnF.js → multiselect-Cg_IvTVL.js} +1 -1
  120. package/web/assets/{password-Dv9g39jb.js → password-DnBPksM5.js} +1 -1
  121. package/web/assets/{plus-CG5Ui-l-.js → plus-DLza1kmt.js} +1 -1
  122. package/web/assets/{pretty-ms-D2BVTeMx.js → pretty-ms-CFs2lDEt.js} +1 -1
  123. package/web/assets/process.store-DOZqELYx.js +1 -0
  124. package/web/assets/{project.store-CVbXSH5d.js → project.store-1ZxiIOdG.js} +1 -1
  125. package/web/assets/{python-BLq8fVkV.js → python-CBOkbLwS.js} +1 -1
  126. package/web/assets/{radiobutton-Bz_ltBfM.js → radiobutton-Bzj_cgKU.js} +1 -1
  127. package/web/assets/{razor-CVrBU-Fk.js → razor-DbhB_XzZ.js} +1 -1
  128. package/web/assets/router-BXlVOZht.js +1 -0
  129. package/web/assets/{settings.store-vM-8jbAF.js → settings.store-Qq6Gc2CT.js} +1 -1
  130. package/web/assets/{store-CTKZgNiD.js → store-Cuguy-ft.js} +1 -1
  131. package/web/assets/{tabpanel-DaZzgdrv.js → tabpanel-BkIDALQ8.js} +1 -1
  132. package/web/assets/trpc-BFwMZelk.js +1 -0
  133. package/web/assets/{tsMode-DO5zEzzD.js → tsMode-B48YcNcc.js} +1 -1
  134. package/web/assets/{typescript-Do-K_3Jj.js → typescript-DNe7mq9Z.js} +1 -1
  135. package/web/assets/{urls-BlVUwVFM.js → urls-Bhy-NKbg.js} +1 -1
  136. package/web/assets/{use-tree-walker-xoEX554A.js → use-tree-walker-DGf54lqT.js} +1 -1
  137. package/web/assets/useAiChatDrawer-C-QgDgQO.js +1 -0
  138. package/web/assets/{useClipboard-B3J6cGK-.js → useClipboard-Ba0ZMSjV.js} +1 -1
  139. package/web/assets/{useLayout-DHrumlpr.js → useLayout-CmsWxVhO.js} +1 -1
  140. package/web/assets/{usePluginManager-BEbBxZnF.js → usePluginManager-DBLyufEz.js} +1 -1
  141. package/web/assets/{useSidebar-BCBwVF2x.js → useSidebar-BWKBo0y4.js} +1 -1
  142. package/web/assets/{vue-router-CuFIegGa.js → vue-router-By6H_4a-.js} +1 -1
  143. package/web/assets/{xml-BolCsFLY.js → xml-zVv61nBe.js} +1 -1
  144. package/web/assets/{yaml-5iZTkCV3.js → yaml-DJ0ncxUH.js} +1 -1
  145. package/web/index.html +1 -1
  146. package/agent-manager-3DHUF2DC-KN6O7WSA.js +0 -8
  147. package/chunk-AJW7LDO5.js.map +0 -1
  148. package/dist-HGCFHXO4.js.map +0 -1
  149. package/web/assets/AiChatPage-C1r42kX7.js +0 -1
  150. package/web/assets/CollectionCookies.vue-DqNgVtd-.js +0 -1
  151. package/web/assets/CollectionScripts.vue-B2gkfo4d.js +0 -1
  152. package/web/assets/CollectionSync.vue-bB7sdahP.js +0 -1
  153. package/web/assets/DashboardPage-gZJ4_s8T.css +0 -1
  154. package/web/assets/DashboardPage-hIc9wP_Q.js +0 -1
  155. package/web/assets/KanbanBoardPage-DoXgFMvo.js +0 -141
  156. package/web/assets/KanbanBoardPage-hqNojI5j.css +0 -1
  157. package/web/assets/ServiceDetailPage-UVg73scN.js +0 -2
  158. package/web/assets/SettingsPage-Cg78lQZF.js +0 -225
  159. package/web/assets/process.store-CutdTiYB.js +0 -1
  160. package/web/assets/router-CuxdGfLF.js +0 -1
  161. package/web/assets/trpc-BIjF6nTt.js +0 -1
  162. package/web/assets/useAiChatDrawer-BJugMTj0.js +0 -1
  163. /package/{agent-manager-3DHUF2DC-KN6O7WSA.js.map → agent-manager-7IDZTNVZ-HVRWIXYW.js.map} +0 -0
  164. /package/web/assets/{_plugin-vue_export-helper-C08BWUE4.js → _plugin-vue_export-helper-BVSTY9ge.js} +0 -0
  165. /package/web/assets/{abap-BMPR0rjj.js → abap-DktqfXDx.js} +0 -0
  166. /package/web/assets/{apex-DYC4uYYf.js → apex-C84w8VGC.js} +0 -0
  167. /package/web/assets/{azcli-GZlxEjpa.js → azcli-Cs5iRzPw.js} +0 -0
  168. /package/web/assets/{base64-VLYHbiMn.js → base64-CG47Jc3Y.js} +0 -0
  169. /package/web/assets/{bat-Cv8OxItG.js → bat-Bxztgnvx.js} +0 -0
  170. /package/web/assets/{bicep-CuCbE6Ue.js → bicep-EmTmx6Fy.js} +0 -0
  171. /package/web/assets/{cameligo-BEPX3585.js → cameligo-DZYk6cOD.js} +0 -0
  172. /package/web/assets/{clojure--6rbXIPY.js → clojure-QYeZgX63.js} +0 -0
  173. /package/web/assets/{coffee-ByvVcDGX.js → coffee-DP64XG_I.js} +0 -0
  174. /package/web/assets/{cpp-CECtPnZp.js → cpp-Dz6-l8vs.js} +0 -0
  175. /package/web/assets/{csharp-DyYyZ8UX.js → csharp-CcVGRY-t.js} +0 -0
  176. /package/web/assets/{csp-B9apvcI9.js → csp-Cqpt0M-R.js} +0 -0
  177. /package/web/assets/{css-CfdBNbB0.js → css-BEjT2o3U.js} +0 -0
  178. /package/web/assets/{cypher-BPqQq4XX.js → cypher-CFsKHT39.js} +0 -0
  179. /package/web/assets/{dart-BLToxiYU.js → dart-Dd8xW03D.js} +0 -0
  180. /package/web/assets/{dist-COg0nRYK.js → dist-BPIMeATj.js} +0 -0
  181. /package/web/assets/{dockerfile-CKo5jN7V.js → dockerfile-MHoTmcM0.js} +0 -0
  182. /package/web/assets/{ecl-qo8pi1Ty.js → ecl-DDOk3_u-.js} +0 -0
  183. /package/web/assets/{elixir-Dv1YAMPJ.js → elixir-BrvvYQkl.js} +0 -0
  184. /package/web/assets/{flow9-BKTKs1nN.js → flow9-Desf9xEz.js} +0 -0
  185. /package/web/assets/{fsharp-BPoxgmtD.js → fsharp-B8Icgpa6.js} +0 -0
  186. /package/web/assets/{go-DgJ-2ryf.js → go-Do5MIzaM.js} +0 -0
  187. /package/web/assets/{graphql-YTK8zpFe.js → graphql-CiG6oX7b.js} +0 -0
  188. /package/web/assets/{hcl-tYOvwaJ3.js → hcl-C-xKM4WW.js} +0 -0
  189. /package/web/assets/{ini-BTZ3lNbM.js → ini-DXIR0OjP.js} +0 -0
  190. /package/web/assets/{java-boRe0CIQ.js → java-Dy8EfEt9.js} +0 -0
  191. /package/web/assets/{julia-K6BtoWYX.js → julia-DkrFX1s_.js} +0 -0
  192. /package/web/assets/{kotlin-CglG00z4.js → kotlin-Dar7GDKm.js} +0 -0
  193. /package/web/assets/{less-DlnIYk4g.js → less-DzP6DgzU.js} +0 -0
  194. /package/web/assets/{lexon-D4aKXJ0J.js → lexon-DptP6qTd.js} +0 -0
  195. /package/web/assets/{lua-DeQCQ0IN.js → lua-CCVwtOWf.js} +0 -0
  196. /package/web/assets/{m3-yCjRJP_i.js → m3-DrEvvio5.js} +0 -0
  197. /package/web/assets/{markdown-C2IT79AR.js → markdown-ruxuCKkk.js} +0 -0
  198. /package/web/assets/{mips-BAnhwv_D.js → mips-BQqMOsEB.js} +0 -0
  199. /package/web/assets/{msdax-D1jHDTih.js → msdax-phO8WA3n.js} +0 -0
  200. /package/web/assets/{mysql-CTJU-jL7.js → mysql-CTdeo58Q.js} +0 -0
  201. /package/web/assets/{objective-c-CwxzUA28.js → objective-c-jhQ0iM6X.js} +0 -0
  202. /package/web/assets/{pascal-DpSQp86i.js → pascal-C8SkzMHp.js} +0 -0
  203. /package/web/assets/{pascaligo-C4F0Gc12.js → pascaligo-ArPaQLGJ.js} +0 -0
  204. /package/web/assets/{perl-87HvGh3u.js → perl-DdJtSHIR.js} +0 -0
  205. /package/web/assets/{pgsql-DUB3YVHd.js → pgsql-DzJ8nWb2.js} +0 -0
  206. /package/web/assets/{php-gpgbnwXh.js → php-CCjtAB9z.js} +0 -0
  207. /package/web/assets/{pla-9VH1h0qA.js → pla-BcEbmw3g.js} +0 -0
  208. /package/web/assets/{postiats-DYNil0RB.js → postiats-Fpcus-uJ.js} +0 -0
  209. /package/web/assets/{powerquery-Cyj_QMWN.js → powerquery-Cu-9g7NG.js} +0 -0
  210. /package/web/assets/{powershell-BxsWzjwy.js → powershell-DO2fUGfn.js} +0 -0
  211. /package/web/assets/{protobuf-CpB35fc2.js → protobuf-DQup7qRj.js} +0 -0
  212. /package/web/assets/{pug-CQ3BHXrf.js → pug-Duim2NdD.js} +0 -0
  213. /package/web/assets/{qsharp-hvdiA16n.js → qsharp-CytI7IVT.js} +0 -0
  214. /package/web/assets/{r-BcpSD-1e.js → r-DZINbLk_.js} +0 -0
  215. /package/web/assets/{redis-B2JGUU7L.js → redis-Bf0SVuM0.js} +0 -0
  216. /package/web/assets/{redshift-DtV7K8A1.js → redshift-oHIhn4rc.js} +0 -0
  217. /package/web/assets/{restructuredtext-avYcqBCA.js → restructuredtext-B3n-oeH1.js} +0 -0
  218. /package/web/assets/{ruby-B75_Tp8C.js → ruby-DXTCv0Dq.js} +0 -0
  219. /package/web/assets/{rust-CHon-ZXH.js → rust-BM9bjpGj.js} +0 -0
  220. /package/web/assets/{sb-iehvyQKY.js → sb-BU8bPS70.js} +0 -0
  221. /package/web/assets/{scala-LBw1ennX.js → scala-BP9uGS4X.js} +0 -0
  222. /package/web/assets/{scheme-BRK_sKgt.js → scheme-rmkEHrlu.js} +0 -0
  223. /package/web/assets/{scss-CzbUsG5V.js → scss-BtCDKYlG.js} +0 -0
  224. /package/web/assets/{shell-DdtWj1FH.js → shell-CG1BTV1P.js} +0 -0
  225. /package/web/assets/{solidity-CBYPsj6K.js → solidity-DAYsr878.js} +0 -0
  226. /package/web/assets/{sophia-BAmZLhFu.js → sophia-DLSOk_-J.js} +0 -0
  227. /package/web/assets/{sparql-DzxQz_25.js → sparql-C_sea8Qf.js} +0 -0
  228. /package/web/assets/{sql-CtZa8xg5.js → sql-zI2PRpPJ.js} +0 -0
  229. /package/web/assets/{st-3yAXYt2f.js → st-VM0k3m2K.js} +0 -0
  230. /package/web/assets/{swift-nwo4k0Qx.js → swift-DAxKPUqq.js} +0 -0
  231. /package/web/assets/{systemverilog-38mUSYaO.js → systemverilog-D3gk_LvQ.js} +0 -0
  232. /package/web/assets/{tcl-DfkL3MZ2.js → tcl-YQSEIPQI.js} +0 -0
  233. /package/web/assets/{twig-C2_DTvv-.js → twig-Bt5uw3P4.js} +0 -0
  234. /package/web/assets/{typespec-Dn7A_7aO.js → typespec-CF_qDuWb.js} +0 -0
  235. /package/web/assets/{vb-ByZEqbuQ.js → vb-DERgblZJ.js} +0 -0
  236. /package/web/assets/{w3c-keyname-CXRaQfIQ.js → w3c-keyname-B0Po4pAC.js} +0 -0
  237. /package/web/assets/{wgsl-BqCLRRs9.js → wgsl-BrfJ-tM_.js} +0 -0
@@ -34,7 +34,7 @@ import {
34
34
  nativeParsers,
35
35
  serviceStore,
36
36
  traefikManager
37
- } from "./chunk-AJW7LDO5.js";
37
+ } from "./chunk-AHOJAT74.js";
38
38
  import {
39
39
  generateKanbanPopulatePrompt,
40
40
  generateKanbanSystemPrompt,
@@ -177,34 +177,38 @@ import { EventEmitter as EventEmitter3 } from "events";
177
177
  import { z as z20 } from "zod";
178
178
  import { TRPCError as TRPCError17 } from "@trpc/server";
179
179
  import { z as z21 } from "zod";
180
- import { chmod as chmod8, stat as stat3 } from "fs/promises";
181
- import { join as join14 } from "path";
182
- import { writeFile as writeFile10 } from "fs/promises";
180
+ import { z as z22 } from "zod";
181
+ import { TRPCError as TRPCError18 } from "@trpc/server";
182
+ import { readFile as readFile12, readdir as readdir4, stat as stat3, realpath, writeFile as writeFile10, mkdir as mkdir13, rename as rename9, rm as rm2 } from "fs/promises";
183
+ import { resolve as resolvePath, join as join14, relative, sep as sep3, dirname as dirname3 } from "path";
184
+ import { chmod as chmod8, stat as stat4 } from "fs/promises";
183
185
  import { join as join15 } from "path";
186
+ import { writeFile as writeFile11 } from "fs/promises";
187
+ import { join as join16 } from "path";
184
188
  import { createRequire } from "module";
185
189
  import { randomBytes as randomBytes3, createCipheriv, createDecipheriv } from "crypto";
186
190
  import { randomUUID as randomUUID10 } from "crypto";
187
191
  import {
188
- readFile as readFile12,
189
- writeFile as writeFile11,
190
- rename as rename9,
191
- mkdir as mkdir13,
192
+ readFile as readFile13,
193
+ writeFile as writeFile12,
194
+ rename as rename10,
195
+ mkdir as mkdir14,
192
196
  access as access2,
193
- readdir as readdir4
197
+ readdir as readdir5
194
198
  } from "fs/promises";
195
- import { join as join16 } from "path";
196
- import { randomBytes as randomBytes4, createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2 } from "crypto";
197
- import { readFile as readFile13, writeFile as writeFile12, chmod as chmod9, stat as stat4, rename as rename10 } from "fs/promises";
198
199
  import { join as join17 } from "path";
200
+ import { randomBytes as randomBytes4, createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2 } from "crypto";
201
+ import { readFile as readFile14, writeFile as writeFile13, chmod as chmod9, stat as stat5, rename as rename11 } from "fs/promises";
202
+ import { join as join18 } from "path";
199
203
  import { Entry } from "@napi-rs/keyring";
200
204
  import { hashRaw as argon2HashRaw } from "@node-rs/argon2";
201
- import { join as join18 } from "path";
202
- import { stat as stat5 } from "fs/promises";
205
+ import { join as join19 } from "path";
206
+ import { stat as stat6 } from "fs/promises";
203
207
  import rateLimit from "express-rate-limit";
204
208
  import { existsSync as existsSync2, createReadStream } from "fs";
205
- import { mkdir as mkdir14 } from "fs/promises";
209
+ import { mkdir as mkdir15 } from "fs/promises";
206
210
  import multer from "multer";
207
- import { resolve as resolvePath } from "path";
211
+ import { resolve as resolvePath2 } from "path";
208
212
  import dotenv from "dotenv";
209
213
  var jwtSecret = null;
210
214
  var jwtSecretGeneratedAt = 0;
@@ -408,7 +412,7 @@ function requireEnvAction(ctx, environmentId, action, serviceId) {
408
412
  });
409
413
  }
410
414
  var startedAt = Date.now();
411
- var appVersion = process.env["RUNEYA_VERSION"] ?? (true ? "2.0.11" : "dev");
415
+ var appVersion = process.env["RUNEYA_VERSION"] ?? (true ? "2.0.15" : "dev");
412
416
  var healthRouter = router({
413
417
  check: publicProcedure.meta({ openapi: { method: "GET", path: "/health", tags: ["health"], summary: "Health check" } }).output(z.object({ status: z.literal("ok"), uptime: z.number(), version: z.string() })).query(() => {
414
418
  return {
@@ -1332,6 +1336,7 @@ var serviceRouter = router({
1332
1336
  ports: z3.array(z3.number().int().min(1).max(65535)).max(20).optional(),
1333
1337
  groups: z3.array(z3.string().max(200)).max(20).optional(),
1334
1338
  description: z3.string().max(2e3).optional(),
1339
+ docsPath: z3.string().max(4096).optional(),
1335
1340
  url: z3.string().max(2048).optional(),
1336
1341
  localUrls: z3.array(z3.object({
1337
1342
  url: z3.string().max(253),
@@ -1382,6 +1387,7 @@ var serviceRouter = router({
1382
1387
  ports: z3.array(z3.number().int().min(1).max(65535)).max(20).optional(),
1383
1388
  groups: z3.array(z3.string().max(200)).max(20).optional(),
1384
1389
  description: z3.string().max(2e3).optional(),
1390
+ docsPath: z3.string().max(4096).optional(),
1385
1391
  url: z3.string().max(2048).optional(),
1386
1392
  localUrls: z3.array(z3.object({
1387
1393
  url: z3.string().max(253),
@@ -2230,7 +2236,7 @@ var settingsRouter = router({
2230
2236
  /**
2231
2237
  * Update settings (mode, cloudUrl)
2232
2238
  */
2233
- update: protectedProcedure.input(SettingsSchema.pick({ mode: true, cloudUrl: true }).partial()).mutation(async ({ input }) => {
2239
+ update: protectedProcedure.input(SettingsSchema.pick({ mode: true, cloudUrl: true, globalDocsPath: true }).partial()).mutation(async ({ input }) => {
2234
2240
  const current = await settingsManager.getSettings();
2235
2241
  const updated = {
2236
2242
  ...current,
@@ -5070,7 +5076,7 @@ function tailTranscript(opts) {
5070
5076
  };
5071
5077
  }
5072
5078
  async function getAgentManager() {
5073
- const { agentManager: agentManager2 } = await import("./agent-manager-3DHUF2DC-KN6O7WSA.js");
5079
+ const { agentManager: agentManager2 } = await import("./agent-manager-7IDZTNVZ-HVRWIXYW.js");
5074
5080
  return agentManager2;
5075
5081
  }
5076
5082
  function buildPtyArgs(params, sessionId, opts) {
@@ -5243,7 +5249,7 @@ async function runClaudeViaPty(params) {
5243
5249
  });
5244
5250
  }
5245
5251
  async function getAgentManager2() {
5246
- const { agentManager: agentManager2 } = await import("./agent-manager-3DHUF2DC-KN6O7WSA.js");
5252
+ const { agentManager: agentManager2 } = await import("./agent-manager-7IDZTNVZ-HVRWIXYW.js");
5247
5253
  return agentManager2;
5248
5254
  }
5249
5255
  function createClaudeStreamState() {
@@ -5816,7 +5822,7 @@ async function shutdownCodexAppServer() {
5816
5822
  }
5817
5823
  }
5818
5824
  async function getAgentManager3() {
5819
- const { agentManager: agentManager2 } = await import("./agent-manager-3DHUF2DC-KN6O7WSA.js");
5825
+ const { agentManager: agentManager2 } = await import("./agent-manager-7IDZTNVZ-HVRWIXYW.js");
5820
5826
  return agentManager2;
5821
5827
  }
5822
5828
  function parseRuneyaCurlCommand(command) {
@@ -6733,6 +6739,19 @@ var chatRouter = router({
6733
6739
  delete: protectedProcedure.input(z14.object({ id: Id128Schema })).mutation(async ({ input }) => {
6734
6740
  const existing = await conversationStore.get(input.id);
6735
6741
  if (!existing) throw new TRPCError10({ code: "NOT_FOUND", message: "Conversation not found" });
6742
+ for (const agent of agentManager.listAgents()) {
6743
+ const agentId = agent.config.id;
6744
+ agentManager.agentQuery(
6745
+ agentId,
6746
+ "ai.findPtyBySession",
6747
+ { sessionId: input.id }
6748
+ ).then((pty3) => {
6749
+ if (pty3?.status === "running") {
6750
+ return agentManager.agentMutation(agentId, "ai.kill", { spawnId: pty3.spawnId });
6751
+ }
6752
+ }).catch(() => {
6753
+ });
6754
+ }
6736
6755
  await conversationStore.delete(input.id);
6737
6756
  await scenarioRunStore.deleteRunDir(input.id);
6738
6757
  imageStorageService.deleteByContextId(input.id).catch(
@@ -10007,6 +10026,228 @@ var utilityRouter = router({
10007
10026
  return { waited: input.ms };
10008
10027
  })
10009
10028
  });
10029
+ var SCOPE_SCHEMA = z22.union([
10030
+ z22.literal("global"),
10031
+ z22.string().regex(/^service:[A-Za-z0-9_-]{1,128}$/, "Invalid service scope")
10032
+ ]);
10033
+ var REL_PATH_SCHEMA = z22.string().min(1).max(512).regex(/^[A-Za-z0-9_./-]+$/).refine((p) => !p.includes("..") && !p.startsWith("/"), {
10034
+ message: "Path must be a relative path without traversal"
10035
+ });
10036
+ var MAX_FILES = 500;
10037
+ var MAX_DEPTH = 8;
10038
+ var MAX_FILE_BYTES = 2e6;
10039
+ var IGNORED_DIRS = /* @__PURE__ */ new Set([
10040
+ "node_modules",
10041
+ ".git",
10042
+ "dist",
10043
+ "build",
10044
+ ".next",
10045
+ ".turbo",
10046
+ ".cache",
10047
+ "coverage",
10048
+ ".yarn",
10049
+ ".pnpm-store",
10050
+ "target",
10051
+ "out"
10052
+ ]);
10053
+ var DocsEntrySchema = z22.lazy(() => z22.union([
10054
+ z22.object({ type: z22.literal("file"), name: z22.string(), path: z22.string() }),
10055
+ z22.object({ type: z22.literal("dir"), name: z22.string(), path: z22.string(), children: z22.array(DocsEntrySchema) })
10056
+ ]));
10057
+ async function resolveScope(scope) {
10058
+ if (scope === "global") {
10059
+ const settings = await settingsManager.getSettings();
10060
+ const sub = (settings.globalDocsPath?.trim() || "wiki").replace(/^[\\/]+|[\\/]+$/g, "");
10061
+ if (sub.includes("..") || sub.includes("\0")) {
10062
+ throw new TRPCError18({ code: "BAD_REQUEST", message: "Sous-chemin invalide" });
10063
+ }
10064
+ const dataDirAbs = resolvePath(env.DATA_DIR);
10065
+ await mkdir13(dataDirAbs, { recursive: true });
10066
+ const base = dirname3(await realpath(dataDirAbs));
10067
+ const target = resolvePath(base, sub);
10068
+ if (target !== base && !(target + sep3).startsWith(base + sep3)) {
10069
+ throw new TRPCError18({ code: "FORBIDDEN", message: "Hors du dossier de donn\xE9es du serveur" });
10070
+ }
10071
+ await mkdir13(target, { recursive: true });
10072
+ const root = await realpath(target);
10073
+ if (root !== base && !(root + sep3).startsWith(base + sep3)) {
10074
+ throw new TRPCError18({ code: "FORBIDDEN", message: "Le dossier wiki r\xE9sout hors du dossier de donn\xE9es" });
10075
+ }
10076
+ return { mode: "local", root };
10077
+ }
10078
+ const serviceId = scope.slice("service:".length);
10079
+ const service = await serviceStore.get(serviceId);
10080
+ if (!service) throw new TRPCError18({ code: "NOT_FOUND", message: "Service introuvable" });
10081
+ const agentId = await resolveEffectiveAgentId(service);
10082
+ if (!agentId) throw new TRPCError18({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9 pour ce service" });
10083
+ const cwd = (service.docsPath?.trim() || service.cwd || ".").toString();
10084
+ return { mode: "agent", agentId, cwd };
10085
+ }
10086
+ async function walkLocal(root, dir, depth, counter) {
10087
+ if (depth > MAX_DEPTH || counter.n >= MAX_FILES) return [];
10088
+ let entries;
10089
+ try {
10090
+ entries = await readdir4(dir, { withFileTypes: true });
10091
+ } catch {
10092
+ return [];
10093
+ }
10094
+ const out = [];
10095
+ for (const e of entries) {
10096
+ if (counter.n >= MAX_FILES) break;
10097
+ if (e.name.startsWith(".") && e.name !== ".") continue;
10098
+ const abs = join14(dir, e.name);
10099
+ const rel = relative(root, abs).split(sep3).join("/");
10100
+ if (e.isDirectory()) {
10101
+ if (IGNORED_DIRS.has(e.name)) continue;
10102
+ const children = await walkLocal(root, abs, depth + 1, counter);
10103
+ out.push({ type: "dir", name: e.name, path: rel, children });
10104
+ } else if (e.isFile() && /\.(md|markdown)$/i.test(e.name)) {
10105
+ counter.n += 1;
10106
+ out.push({ type: "file", name: e.name, path: rel });
10107
+ }
10108
+ }
10109
+ out.sort((a, b) => {
10110
+ if (a.type !== b.type) return a.type === "dir" ? -1 : 1;
10111
+ return a.name.localeCompare(b.name);
10112
+ });
10113
+ return out;
10114
+ }
10115
+ async function resolveSafeLocal(root, relPath, requireExist) {
10116
+ if (relPath.includes("..") || relPath.startsWith("/")) {
10117
+ throw new TRPCError18({ code: "BAD_REQUEST", message: "Chemin invalide" });
10118
+ }
10119
+ const target = resolvePath(root, relPath);
10120
+ if (requireExist) {
10121
+ let real;
10122
+ try {
10123
+ real = await realpath(target);
10124
+ } catch {
10125
+ throw new TRPCError18({ code: "NOT_FOUND", message: "Chemin introuvable" });
10126
+ }
10127
+ if (real !== root && !(real + sep3).startsWith(root + sep3)) {
10128
+ throw new TRPCError18({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
10129
+ }
10130
+ return real;
10131
+ }
10132
+ const parent = dirname3(target);
10133
+ let realParent;
10134
+ try {
10135
+ realParent = await realpath(parent);
10136
+ } catch {
10137
+ realParent = parent;
10138
+ }
10139
+ if (realParent !== root && !(realParent + sep3).startsWith(root + sep3)) {
10140
+ throw new TRPCError18({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
10141
+ }
10142
+ return resolvePath(realParent, target.slice(parent.length).replace(/^[\\/]+/, ""));
10143
+ }
10144
+ var wikiRouter = router({
10145
+ list: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA })).output(z22.object({ root: z22.string(), entries: z22.array(DocsEntrySchema), truncated: z22.boolean() })).query(async ({ input }) => {
10146
+ const target = await resolveScope(input.scope);
10147
+ if (target.mode === "agent") {
10148
+ return agentManager.agentQuery(target.agentId, "wiki.listRepoMarkdown", { cwd: target.cwd });
10149
+ }
10150
+ const counter = { n: 0 };
10151
+ const entries = await walkLocal(target.root, target.root, 0, counter);
10152
+ return { root: target.root, entries, truncated: counter.n >= MAX_FILES };
10153
+ }),
10154
+ read: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).output(z22.object({ path: z22.string(), content: z22.string() })).query(async ({ input }) => {
10155
+ if (!/\.(md|markdown)$/i.test(input.path)) {
10156
+ throw new TRPCError18({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
10157
+ }
10158
+ const target = await resolveScope(input.scope);
10159
+ if (target.mode === "agent") {
10160
+ return agentManager.agentQuery(target.agentId, "wiki.readRepoMarkdown", { cwd: target.cwd, path: input.path });
10161
+ }
10162
+ const file = await resolveSafeLocal(target.root, input.path, true);
10163
+ const s = await stat3(file);
10164
+ if (!s.isFile()) throw new TRPCError18({ code: "BAD_REQUEST", message: "Pas un fichier" });
10165
+ if (s.size > MAX_FILE_BYTES) throw new TRPCError18({ code: "PAYLOAD_TOO_LARGE", message: "Fichier trop volumineux" });
10166
+ const content = await readFile12(file, "utf-8");
10167
+ return { path: input.path, content };
10168
+ }),
10169
+ write: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA, content: z22.string().max(5e6) })).mutation(async ({ input }) => {
10170
+ if (!/\.(md|markdown)$/i.test(input.path)) {
10171
+ throw new TRPCError18({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
10172
+ }
10173
+ const target = await resolveScope(input.scope);
10174
+ if (target.mode === "agent") {
10175
+ return agentManager.agentMutation(target.agentId, "wiki.writeMarkdown", { cwd: target.cwd, path: input.path, content: input.content });
10176
+ }
10177
+ const file = await resolveSafeLocal(target.root, input.path, false);
10178
+ await mkdir13(dirname3(file), { recursive: true });
10179
+ await writeFile10(file, input.content, "utf-8");
10180
+ return { path: input.path, ok: true };
10181
+ }),
10182
+ createFile: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
10183
+ if (!/\.(md|markdown)$/i.test(input.path)) {
10184
+ throw new TRPCError18({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
10185
+ }
10186
+ const target = await resolveScope(input.scope);
10187
+ if (target.mode === "agent") {
10188
+ return agentManager.agentMutation(target.agentId, "wiki.createFile", { cwd: target.cwd, path: input.path });
10189
+ }
10190
+ const file = await resolveSafeLocal(target.root, input.path, false);
10191
+ try {
10192
+ await stat3(file);
10193
+ throw new TRPCError18({ code: "CONFLICT", message: "Fichier d\xE9j\xE0 existant" });
10194
+ } catch (err) {
10195
+ if (err instanceof TRPCError18) throw err;
10196
+ }
10197
+ await mkdir13(dirname3(file), { recursive: true });
10198
+ await writeFile10(file, "", "utf-8");
10199
+ return { path: input.path, ok: true };
10200
+ }),
10201
+ createDir: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
10202
+ const target = await resolveScope(input.scope);
10203
+ if (target.mode === "agent") {
10204
+ return agentManager.agentMutation(target.agentId, "wiki.createDir", { cwd: target.cwd, path: input.path });
10205
+ }
10206
+ const dir = await resolveSafeLocal(target.root, input.path, false);
10207
+ await mkdir13(dir, { recursive: true });
10208
+ return { path: input.path, ok: true };
10209
+ }),
10210
+ rename: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, fromPath: REL_PATH_SCHEMA, toPath: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
10211
+ const target = await resolveScope(input.scope);
10212
+ if (target.mode === "agent") {
10213
+ return agentManager.agentMutation(target.agentId, "wiki.renamePath", { cwd: target.cwd, fromPath: input.fromPath, toPath: input.toPath });
10214
+ }
10215
+ const from = await resolveSafeLocal(target.root, input.fromPath, true);
10216
+ const to = await resolveSafeLocal(target.root, input.toPath, false);
10217
+ try {
10218
+ await stat3(to);
10219
+ throw new TRPCError18({ code: "CONFLICT", message: "La cible existe d\xE9j\xE0" });
10220
+ } catch (err) {
10221
+ if (err instanceof TRPCError18) throw err;
10222
+ }
10223
+ await mkdir13(dirname3(to), { recursive: true });
10224
+ await rename9(from, to);
10225
+ return { fromPath: input.fromPath, toPath: input.toPath, ok: true };
10226
+ }),
10227
+ ensureRoot: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA })).mutation(async ({ input }) => {
10228
+ if (input.scope === "global") {
10229
+ await resolveScope("global");
10230
+ return { ok: true };
10231
+ }
10232
+ const serviceId = input.scope.slice("service:".length);
10233
+ const service = await serviceStore.get(serviceId);
10234
+ if (!service) throw new TRPCError18({ code: "NOT_FOUND", message: "Service introuvable" });
10235
+ const agentId = await resolveEffectiveAgentId(service);
10236
+ if (!agentId) throw new TRPCError18({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9" });
10237
+ const cwd = (service.docsPath?.trim() || service.cwd || ".").toString();
10238
+ return agentManager.agentMutation(agentId, "wiki.ensureRoot", { cwd });
10239
+ }),
10240
+ delete: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
10241
+ const target = await resolveScope(input.scope);
10242
+ if (target.mode === "agent") {
10243
+ return agentManager.agentMutation(target.agentId, "wiki.deletePath", { cwd: target.cwd, path: input.path });
10244
+ }
10245
+ const fp = await resolveSafeLocal(target.root, input.path, true);
10246
+ if (fp === target.root) throw new TRPCError18({ code: "FORBIDDEN", message: "Impossible de supprimer la racine" });
10247
+ await rm2(fp, { recursive: true, force: true });
10248
+ return { path: input.path, ok: true };
10249
+ })
10250
+ });
10010
10251
  var appRouter = router({
10011
10252
  health: healthRouter,
10012
10253
  project: projectRouter,
@@ -10026,7 +10267,8 @@ var appRouter = router({
10026
10267
  kanban: kanbanRouter,
10027
10268
  kanbanQueue: kanbanQueueRouter,
10028
10269
  terminal: terminalRouter,
10029
- utility: utilityRouter
10270
+ utility: utilityRouter,
10271
+ wiki: wikiRouter
10030
10272
  });
10031
10273
  function errorHandler(err, _req, res, _next) {
10032
10274
  console.error("[server] Unhandled error:", err);
@@ -10066,9 +10308,9 @@ var SENSITIVE_FILES = [
10066
10308
  var SECURE_MODE = 384;
10067
10309
  async function ensureFilePermissions() {
10068
10310
  for (const filename of SENSITIVE_FILES) {
10069
- const filepath = join14(env.DATA_DIR, filename);
10311
+ const filepath = join15(env.DATA_DIR, filename);
10070
10312
  try {
10071
- const stats = await stat3(filepath);
10313
+ const stats = await stat4(filepath);
10072
10314
  const mode = stats.mode & 511;
10073
10315
  if (mode !== SECURE_MODE) {
10074
10316
  console.warn("[security] File", filename, "has mode", mode.toString(8) + ", fixing to 600");
@@ -10114,8 +10356,8 @@ conversations.private.json
10114
10356
  *.log.*
10115
10357
  `;
10116
10358
  async function ensureDataGitignore(dataDir) {
10117
- const gitignorePath = join15(dataDir, ".gitignore");
10118
- await writeFile10(gitignorePath, GITIGNORE_CONTENT, "utf-8");
10359
+ const gitignorePath = join16(dataDir, ".gitignore");
10360
+ await writeFile11(gitignorePath, GITIGNORE_CONTENT, "utf-8");
10119
10361
  }
10120
10362
  var _require = createRequire(import.meta.url);
10121
10363
  var PARSER_ID_MAP = {
@@ -10223,7 +10465,7 @@ async function getSodium() {
10223
10465
  return _sodium;
10224
10466
  }
10225
10467
  async function decryptLegacyFile(filePath, key, sodium) {
10226
- const raw = (await readFile12(filePath, "utf-8")).trim();
10468
+ const raw = (await readFile13(filePath, "utf-8")).trim();
10227
10469
  if (!raw || raw === "[]" || raw === "{}") {
10228
10470
  try {
10229
10471
  return JSON.parse(raw);
@@ -10243,14 +10485,14 @@ async function decryptLegacyFile(filePath, key, sodium) {
10243
10485
  }
10244
10486
  async function atomicWrite(path, data) {
10245
10487
  const tmp = path + ".tmp";
10246
- await writeFile11(tmp, JSON.stringify(data, null, 2), "utf-8");
10247
- await rename9(tmp, path);
10488
+ await writeFile12(tmp, JSON.stringify(data, null, 2), "utf-8");
10489
+ await rename10(tmp, path);
10248
10490
  }
10249
10491
  async function runLegacyMigration(dataDir) {
10250
10492
  const { resolve: resolve5 } = await import("path");
10251
10493
  const abCwd = resolve5(process.cwd());
10252
- const legacyRoot = join16(abCwd, env.DATA_DIR);
10253
- const legacyKeyPath = join16(legacyRoot, "dbs", "encryption-key.json");
10494
+ const legacyRoot = join17(abCwd, env.DATA_DIR);
10495
+ const legacyKeyPath = join17(legacyRoot, "dbs", "encryption-key.json");
10254
10496
  try {
10255
10497
  await access2(legacyKeyPath);
10256
10498
  } catch {
@@ -10258,20 +10500,20 @@ async function runLegacyMigration(dataDir) {
10258
10500
  }
10259
10501
  console.log("[legacy-migration] Legacy Runeya data detected, starting migration\u2026");
10260
10502
  const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").substring(0, 19);
10261
- const legacyTmp = join16(abCwd, ".runeya-tmp");
10262
- await rename9(legacyRoot, legacyTmp);
10263
- await mkdir13(dataDir, { recursive: true });
10264
- const legacyOld = join16(dataDir, `backup-${timestamp}`);
10265
- await rename9(legacyTmp, legacyOld);
10503
+ const legacyTmp = join17(abCwd, ".runeya-tmp");
10504
+ await rename10(legacyRoot, legacyTmp);
10505
+ await mkdir14(dataDir, { recursive: true });
10506
+ const legacyOld = join17(dataDir, `backup-${timestamp}`);
10507
+ await rename10(legacyTmp, legacyOld);
10266
10508
  console.log(`[legacy-migration] Legacy data backed up to ${legacyOld}`);
10267
- const keyJson = JSON.parse(await readFile12(join16(legacyOld, "dbs", "encryption-key.json"), "utf-8"));
10509
+ const keyJson = JSON.parse(await readFile13(join17(legacyOld, "dbs", "encryption-key.json"), "utf-8"));
10268
10510
  const sodium = await getSodium();
10269
10511
  const sodiumKey = sodium.from_base64(keyJson.encryptionKey);
10270
10512
  const keyBuffer = Buffer.from(sodiumKey);
10271
10513
  const runyeaKeyHex = keyBuffer.toString("hex");
10272
10514
  await setEncryptionKey(runyeaKeyHex);
10273
10515
  console.log("[legacy-migration] Encryption key loaded in memory (temporary)");
10274
- const dbsDir = join16(legacyOld, "dbs");
10516
+ const dbsDir = join17(legacyOld, "dbs");
10275
10517
  async function readEncrypted(filePath) {
10276
10518
  try {
10277
10519
  return await decryptLegacyFile(filePath, sodiumKey, sodium);
@@ -10280,29 +10522,29 @@ async function runLegacyMigration(dataDir) {
10280
10522
  return null;
10281
10523
  }
10282
10524
  }
10283
- const envsDir = join16(dbsDir, "envs");
10284
- const envFiles = (await readdir4(envsDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
10525
+ const envsDir = join17(dbsDir, "envs");
10526
+ const envFiles = (await readdir5(envsDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
10285
10527
  const legacyEnvs = {};
10286
10528
  for (const file of envFiles) {
10287
10529
  const name = file.replace(".encrypted.json", "");
10288
- legacyEnvs[name] = await readEncrypted(join16(envsDir, file));
10530
+ legacyEnvs[name] = await readEncrypted(join17(envsDir, file));
10289
10531
  }
10290
- const servicesDir = join16(dbsDir, "services");
10291
- const serviceFiles = (await readdir4(servicesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
10532
+ const servicesDir = join17(dbsDir, "services");
10533
+ const serviceFiles = (await readdir5(servicesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
10292
10534
  const legacyServices = {};
10293
10535
  for (const file of serviceFiles) {
10294
10536
  const name = file.replace(".encrypted.json", "");
10295
10537
  if (!name) continue;
10296
- const data = await readEncrypted(join16(servicesDir, file));
10538
+ const data = await readEncrypted(join17(servicesDir, file));
10297
10539
  if (data?.label) legacyServices[name] = data;
10298
10540
  }
10299
- const overridesDir = join16(dbsDir, "overrides");
10300
- const overrideFiles = (await readdir4(overridesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
10541
+ const overridesDir = join17(dbsDir, "overrides");
10542
+ const overrideFiles = (await readdir5(overridesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
10301
10543
  const legacyServiceOverrides = {};
10302
10544
  const legacyEnvOverrides = {};
10303
10545
  for (const file of overrideFiles) {
10304
10546
  const baseName = file.replace(".encrypted.json", "");
10305
- const data = await readEncrypted(join16(overridesDir, file));
10547
+ const data = await readEncrypted(join17(overridesDir, file));
10306
10548
  if (!data) continue;
10307
10549
  if (baseName.endsWith("-envs")) {
10308
10550
  legacyServiceOverrides[baseName.slice(0, -5)] = data;
@@ -10310,11 +10552,11 @@ async function runLegacyMigration(dataDir) {
10310
10552
  legacyEnvOverrides[baseName.slice(0, -12)] = data;
10311
10553
  }
10312
10554
  }
10313
- const parsersDir = join16(dbsDir, "parsers");
10314
- const parserFiles = (await readdir4(parsersDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
10555
+ const parsersDir = join17(dbsDir, "parsers");
10556
+ const parserFiles = (await readdir5(parsersDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
10315
10557
  const legacyParsers = [];
10316
10558
  for (const file of parserFiles) {
10317
- const data = await readEncrypted(join16(parsersDir, file));
10559
+ const data = await readEncrypted(join17(parsersDir, file));
10318
10560
  if (data?.id) legacyParsers.push(data);
10319
10561
  }
10320
10562
  const projectMonoId = randomUUID10();
@@ -10655,7 +10897,7 @@ async function runLegacyMigration(dataDir) {
10655
10897
  }
10656
10898
  let existingSettings = {};
10657
10899
  try {
10658
- existingSettings = JSON.parse(await readFile12(join16(dataDir, "settings.json"), "utf-8"));
10900
+ existingSettings = JSON.parse(await readFile13(join17(dataDir, "settings.json"), "utf-8"));
10659
10901
  } catch {
10660
10902
  }
10661
10903
  const migratedParsers = legacyParsers.map((p) => ({
@@ -10676,11 +10918,11 @@ ${p.transform ?? ""}`,
10676
10918
  ...migratedParsers
10677
10919
  ]
10678
10920
  };
10679
- await atomicWrite(join16(dataDir, "projects.json"), runeProjects);
10680
- await atomicWrite(join16(dataDir, "services.json"), runeServices);
10681
- await atomicWrite(join16(dataDir, "environments.json"), runeEnvs);
10682
- await atomicWrite(join16(dataDir, "environment-overrides.json"), flatOverrides);
10683
- await atomicWrite(join16(dataDir, "settings.json"), newSettings);
10921
+ await atomicWrite(join17(dataDir, "projects.json"), runeProjects);
10922
+ await atomicWrite(join17(dataDir, "services.json"), runeServices);
10923
+ await atomicWrite(join17(dataDir, "environments.json"), runeEnvs);
10924
+ await atomicWrite(join17(dataDir, "environment-overrides.json"), flatOverrides);
10925
+ await atomicWrite(join17(dataDir, "settings.json"), newSettings);
10684
10926
  const svcEnvCount = runeEnvs.filter((e) => e.scope === "service").length;
10685
10927
  console.log(`[legacy-migration] Written: ${runeProjects.length} projects, ${runeServices.length} services, ${runeEnvs.length} environments (${svcEnvCount} service-scoped)`);
10686
10928
  console.log(`[legacy-migration] Overrides: ${Object.keys(flatOverrides).length}, custom parsers: ${migratedParsers.length} (all disabled \u2014 rewrite required)`);
@@ -10691,12 +10933,12 @@ ${p.transform ?? ""}`,
10691
10933
  }
10692
10934
  async function findLegacyKeyInBackup(dataDir) {
10693
10935
  try {
10694
- const entries = await readdir4(dataDir);
10936
+ const entries = await readdir5(dataDir);
10695
10937
  const backupDirs = entries.filter((e) => e.startsWith("backup-")).sort().reverse();
10696
10938
  for (const dir of backupDirs) {
10697
- const keyJsonPath = join16(dataDir, dir, "dbs", "encryption-key.json");
10939
+ const keyJsonPath = join17(dataDir, dir, "dbs", "encryption-key.json");
10698
10940
  try {
10699
- const raw = await readFile12(keyJsonPath, "utf-8");
10941
+ const raw = await readFile13(keyJsonPath, "utf-8");
10700
10942
  const parsed = JSON.parse(raw);
10701
10943
  if (!parsed.encryptionKey) continue;
10702
10944
  const sodium = await getSodium();
@@ -10718,14 +10960,14 @@ async function runOverrideOnlyMigration(dataDir) {
10718
10960
  const abDataDir = resolve5(dataDir);
10719
10961
  const abCwd = resolve5(process.cwd());
10720
10962
  const candidateDirs = [
10721
- join16(abCwd, ".runeya", "dbs", "overrides"),
10722
- join16(abDataDir, "dbs", "overrides")
10963
+ join17(abCwd, ".runeya", "dbs", "overrides"),
10964
+ join17(abDataDir, "dbs", "overrides")
10723
10965
  ];
10724
10966
  let overridesDir = null;
10725
10967
  let overrideFiles = [];
10726
10968
  for (const dir of candidateDirs) {
10727
10969
  try {
10728
- const files = (await readdir4(dir)).filter((f) => f.endsWith(".encrypted.json"));
10970
+ const files = (await readdir5(dir)).filter((f) => f.endsWith(".encrypted.json"));
10729
10971
  if (files.length > 0) {
10730
10972
  overridesDir = dir;
10731
10973
  overrideFiles = files;
@@ -10735,7 +10977,7 @@ async function runOverrideOnlyMigration(dataDir) {
10735
10977
  }
10736
10978
  }
10737
10979
  if (!overridesDir || overrideFiles.length === 0) return false;
10738
- const legacyKeyPath = join16(overridesDir, "..", "encryption-key.json");
10980
+ const legacyKeyPath = join17(overridesDir, "..", "encryption-key.json");
10739
10981
  try {
10740
10982
  await access2(legacyKeyPath);
10741
10983
  return false;
@@ -10753,7 +10995,7 @@ async function runOverrideOnlyMigration(dataDir) {
10753
10995
  const envNameToId = {};
10754
10996
  let envsRaw;
10755
10997
  try {
10756
- envsRaw = JSON.parse(await readFile12(join16(abDataDir, "environments.json"), "utf-8"));
10998
+ envsRaw = JSON.parse(await readFile13(join17(abDataDir, "environments.json"), "utf-8"));
10757
10999
  for (const _env of envsRaw) {
10758
11000
  const env2 = _env;
10759
11001
  if (env2["name"] && env2["id"]) {
@@ -10772,7 +11014,7 @@ async function runOverrideOnlyMigration(dataDir) {
10772
11014
  let servicesRaw = [];
10773
11015
  const serviceNameToId = {};
10774
11016
  try {
10775
- servicesRaw = JSON.parse(await readFile12(join16(abDataDir, "services.json"), "utf-8"));
11017
+ servicesRaw = JSON.parse(await readFile13(join17(abDataDir, "services.json"), "utf-8"));
10776
11018
  for (const _svc of servicesRaw) {
10777
11019
  const svc = _svc;
10778
11020
  if (svc["name"] && svc["id"]) serviceNameToId[svc["name"]] = svc["id"];
@@ -10789,7 +11031,7 @@ async function runOverrideOnlyMigration(dataDir) {
10789
11031
  const envName = baseName.slice(0, -"-environment".length);
10790
11032
  let data;
10791
11033
  try {
10792
- data = await decryptLegacyFile(join16(overridesDir, file), sodiumKey, sodium);
11034
+ data = await decryptLegacyFile(join17(overridesDir, file), sodiumKey, sodium);
10793
11035
  } catch (err) {
10794
11036
  console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
10795
11037
  continue;
@@ -10816,7 +11058,7 @@ async function runOverrideOnlyMigration(dataDir) {
10816
11058
  }
10817
11059
  }
10818
11060
  if (Object.keys(flatOverrides).length > 0) {
10819
- await atomicWrite(join16(abDataDir, "environment-overrides.json"), flatOverrides);
11061
+ await atomicWrite(join17(abDataDir, "environment-overrides.json"), flatOverrides);
10820
11062
  console.log(`[override-migration] Written ${Object.keys(flatOverrides).length} override(s) to environment-overrides.json`);
10821
11063
  }
10822
11064
  let envsModified = false;
@@ -10826,7 +11068,7 @@ async function runOverrideOnlyMigration(dataDir) {
10826
11068
  const serviceName = baseName.slice(0, -"-envs".length);
10827
11069
  let data;
10828
11070
  try {
10829
- data = await decryptLegacyFile(join16(overridesDir, file), sodiumKey, sodium);
11071
+ data = await decryptLegacyFile(join17(overridesDir, file), sodiumKey, sodium);
10830
11072
  } catch (err) {
10831
11073
  console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
10832
11074
  continue;
@@ -10885,12 +11127,12 @@ async function runOverrideOnlyMigration(dataDir) {
10885
11127
  }
10886
11128
  }
10887
11129
  if (envsModified) {
10888
- await atomicWrite(join16(abDataDir, "environments.json"), envsRaw);
11130
+ await atomicWrite(join17(abDataDir, "environments.json"), envsRaw);
10889
11131
  console.log("[override-migration] Merged service overrides into environments.json");
10890
11132
  }
10891
11133
  const migratedDir = overridesDir.replace(/overrides$/, "overrides-migrated");
10892
11134
  try {
10893
- await rename9(overridesDir, migratedDir);
11135
+ await rename10(overridesDir, migratedDir);
10894
11136
  console.log(`[override-migration] Moved overrides/ \u2192 overrides-migrated/`);
10895
11137
  } catch (err) {
10896
11138
  console.warn(`[override-migration] Could not rename overrides dir: ${err.message}`);
@@ -10907,9 +11149,9 @@ var CANARY_PLAINTEXT = "runeya:v1:key-verification";
10907
11149
  var MAX_KEY_FILE_SIZE = 1024;
10908
11150
  var ARGON2_OPTIONS = { memoryCost: 65536, timeCost: 3, parallelism: 4, outputLen: 32 };
10909
11151
  async function readKeyFile(filePath) {
10910
- const s = await stat4(filePath);
11152
+ const s = await stat5(filePath);
10911
11153
  if (s.size > MAX_KEY_FILE_SIZE) throw new Error(`Fichier suspect : ${filePath} (${s.size} octets)`);
10912
- return readFile13(filePath);
11154
+ return readFile14(filePath);
10913
11155
  }
10914
11156
  function aesEncrypt(key, plaintext) {
10915
11157
  const iv = randomBytes4(12);
@@ -10928,7 +11170,7 @@ function aesDecrypt(key, data) {
10928
11170
  }
10929
11171
  async function getPepperFromFile(dataDir) {
10930
11172
  try {
10931
- const raw = await readKeyFile(join17(dataDir, PEPPER_FILENAME));
11173
+ const raw = await readKeyFile(join18(dataDir, PEPPER_FILENAME));
10932
11174
  const hex = raw.toString("utf-8").trim();
10933
11175
  if (/^[0-9a-f]{64}$/i.test(hex)) return Buffer.from(hex, "hex");
10934
11176
  } catch {
@@ -10936,11 +11178,11 @@ async function getPepperFromFile(dataDir) {
10936
11178
  return null;
10937
11179
  }
10938
11180
  async function writePepperToFile(dataDir, pepper) {
10939
- const filePath = join17(dataDir, PEPPER_FILENAME);
11181
+ const filePath = join18(dataDir, PEPPER_FILENAME);
10940
11182
  const tmpPath = filePath + ".tmp";
10941
- await writeFile12(tmpPath, pepper.toString("hex"), "utf-8");
11183
+ await writeFile13(tmpPath, pepper.toString("hex"), "utf-8");
10942
11184
  await chmod9(tmpPath, 384);
10943
- await rename10(tmpPath, filePath);
11185
+ await rename11(tmpPath, filePath);
10944
11186
  }
10945
11187
  function tryKeyringGet() {
10946
11188
  try {
@@ -10987,14 +11229,14 @@ async function writeEncryptedKey(dataDir, masterPassword, encryptionKey) {
10987
11229
  const payload = aesEncrypt(derivedKey, encryptionKey);
10988
11230
  const fileContent = Buffer.concat([salt, payload]);
10989
11231
  const encoded = fileContent.toString("base64");
10990
- const filePath = join17(dataDir, ENCRYPTED_KEY_FILENAME);
11232
+ const filePath = join18(dataDir, ENCRYPTED_KEY_FILENAME);
10991
11233
  const tmpPath = filePath + ".tmp";
10992
- await writeFile12(tmpPath, encoded, "utf-8");
11234
+ await writeFile13(tmpPath, encoded, "utf-8");
10993
11235
  await chmod9(tmpPath, 384);
10994
- await rename10(tmpPath, filePath);
11236
+ await rename11(tmpPath, filePath);
10995
11237
  }
10996
11238
  async function readEncryptedKey(dataDir, masterPassword) {
10997
- const filePath = join17(dataDir, ENCRYPTED_KEY_FILENAME);
11239
+ const filePath = join18(dataDir, ENCRYPTED_KEY_FILENAME);
10998
11240
  const raw = await readKeyFile(filePath);
10999
11241
  const fileContent = Buffer.from(raw.toString("utf-8").trim(), "base64");
11000
11242
  const salt = fileContent.subarray(0, 16);
@@ -11014,13 +11256,13 @@ async function getPepperFromKeychain(dataDir) {
11014
11256
  }
11015
11257
  async function writeVerifyFile(dataDir, encryptionKey) {
11016
11258
  const payload = aesEncrypt(encryptionKey, Buffer.from(CANARY_PLAINTEXT, "utf-8"));
11017
- const filePath = join17(dataDir, VERIFY_FILENAME);
11259
+ const filePath = join18(dataDir, VERIFY_FILENAME);
11018
11260
  const tmpPath = filePath + ".tmp";
11019
- await writeFile12(tmpPath, payload.toString("base64"), "utf-8");
11020
- await rename10(tmpPath, filePath);
11261
+ await writeFile13(tmpPath, payload.toString("base64"), "utf-8");
11262
+ await rename11(tmpPath, filePath);
11021
11263
  }
11022
11264
  async function verifyEncryptionKey(dataDir, encryptionKey) {
11023
- const filePath = join17(dataDir, VERIFY_FILENAME);
11265
+ const filePath = join18(dataDir, VERIFY_FILENAME);
11024
11266
  const raw = await readKeyFile(filePath);
11025
11267
  const payload = Buffer.from(raw.toString("utf-8").trim(), "base64");
11026
11268
  const plaintext = aesDecrypt(encryptionKey, payload);
@@ -11030,7 +11272,7 @@ async function verifyEncryptionKey(dataDir, encryptionKey) {
11030
11272
  }
11031
11273
  async function hasVerifyFile(dataDir) {
11032
11274
  try {
11033
- await stat4(join17(dataDir, VERIFY_FILENAME));
11275
+ await stat5(join18(dataDir, VERIFY_FILENAME));
11034
11276
  return true;
11035
11277
  } catch {
11036
11278
  return false;
@@ -11038,7 +11280,7 @@ async function hasVerifyFile(dataDir) {
11038
11280
  }
11039
11281
  async function hasEncryptedKeyFile(dataDir) {
11040
11282
  try {
11041
- await stat4(join17(dataDir, ENCRYPTED_KEY_FILENAME));
11283
+ await stat5(join18(dataDir, ENCRYPTED_KEY_FILENAME));
11042
11284
  return true;
11043
11285
  } catch {
11044
11286
  return false;
@@ -11052,17 +11294,17 @@ async function getServerState() {
11052
11294
  let hasVerify = false;
11053
11295
  let hasData = false;
11054
11296
  try {
11055
- await stat5(join18(dataDir, ENCRYPTED_KEY_FILENAME2));
11297
+ await stat6(join19(dataDir, ENCRYPTED_KEY_FILENAME2));
11056
11298
  hasEncFile = true;
11057
11299
  } catch {
11058
11300
  }
11059
11301
  try {
11060
- await stat5(join18(dataDir, VERIFY_FILENAME2));
11302
+ await stat6(join19(dataDir, VERIFY_FILENAME2));
11061
11303
  hasVerify = true;
11062
11304
  } catch {
11063
11305
  }
11064
11306
  try {
11065
- await stat5(join18(dataDir, "projects.json"));
11307
+ await stat6(join19(dataDir, "projects.json"));
11066
11308
  hasData = true;
11067
11309
  } catch {
11068
11310
  }
@@ -11448,7 +11690,7 @@ async function createLocalServer() {
11448
11690
  console.log("[server] Premier lancement \u2014 setup requis");
11449
11691
  }
11450
11692
  }
11451
- if (!existsSync2(env.DATA_DIR)) await mkdir14(env.DATA_DIR);
11693
+ if (!existsSync2(env.DATA_DIR)) await mkdir15(env.DATA_DIR);
11452
11694
  const absoluteDataDir = resolve4(env.DATA_DIR);
11453
11695
  console.log(`[server] Data directory: ${absoluteDataDir}`);
11454
11696
  await ensureDataGitignore(env.DATA_DIR);
@@ -11916,7 +12158,7 @@ async function pullEnv(opts) {
11916
12158
  }
11917
12159
  dotenv.config({ quiet: true });
11918
12160
  if (process.env["DATA_DIR"]) {
11919
- const resolved = resolvePath(process.env["DATA_DIR"], "..");
12161
+ const resolved = resolvePath2(process.env["DATA_DIR"], "..");
11920
12162
  process.chdir(resolved);
11921
12163
  console.log(`[server] Working directory: ${resolved} (from DATA_DIR)`);
11922
12164
  }
@@ -11989,4 +12231,4 @@ export {
11989
12231
  createLocalServer,
11990
12232
  pullEnv
11991
12233
  };
11992
- //# sourceMappingURL=dist-HGCFHXO4.js.map
12234
+ //# sourceMappingURL=dist-P3HYK2SI.js.map