@runeya/runeya 2.0.70 → 2.0.71

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 +63 -10
  2. package/agent/index.js.map +1 -1
  3. package/agent-manager-UUSQK6S2.js +7 -0
  4. package/{chunk-YSJ6OJGN.js → chunk-Z3KAXI7V.js} +197 -12
  5. package/chunk-Z3KAXI7V.js.map +1 -0
  6. package/index.js +1 -1
  7. package/package.json +1 -1
  8. package/{src-6WVQ2FQV.js → src-Q3PSCMS7.js} +364 -435
  9. package/src-Q3PSCMS7.js.map +1 -0
  10. package/web/assets/{AgentScalarChatInterface.vue-vU3z8Etw.js → AgentScalarChatInterface.vue-Cin_Rbay.js} +1 -1
  11. package/web/assets/AgentTerminalPage-BD2w4XRc.css +1 -0
  12. package/web/assets/AgentTerminalPage-YgCQj_Mj.js +1 -0
  13. package/web/assets/AiChatPage-cIE_ZdF6.js +1 -0
  14. package/web/assets/{AppLayout-CvkK_Pp3.js → AppLayout-dYfSESzv.js} +1 -1
  15. package/web/assets/{AuditPage-BZuVgUf1.js → AuditPage-Bw3-G8ZM.js} +1 -1
  16. package/web/assets/CloudAccountPage-CA4dMsIm.js +1 -0
  17. package/web/assets/{CloudAccountPage-B__2SGAw.js → CloudAccountPage-DjljrEI_.js} +1 -1
  18. package/web/assets/{CloudMessagingPage-C5pD6Qsd.js → CloudMessagingPage-CbfH2vPo.js} +1 -1
  19. package/web/assets/{DashboardPage-66q5K841.js → DashboardPage-Cn3bUyhR.js} +1 -1
  20. package/web/assets/{DirectoryPickerDialog-wZYtGEZ9.js → DirectoryPickerDialog-BmsAi5gR.js} +1 -1
  21. package/web/assets/{EditorIcon-DUDLTmUd.js → EditorIcon-JRryeySJ.js} +1 -1
  22. package/web/assets/{EnvironmentForm-C0Q1pRdW.js → EnvironmentForm-BfF9IFRB.js} +1 -1
  23. package/web/assets/{EnvironmentFormPage-LO-mwupn.js → EnvironmentFormPage-CebWv3I_.js} +1 -1
  24. package/web/assets/{EnvironmentListPage-CvknyN3O.js → EnvironmentListPage-DDJGOHvR.js} +1 -1
  25. package/web/assets/{KanbanBoardPage-DUsAyowy.js → KanbanBoardPage-BMXyvHOl.js} +3 -3
  26. package/web/assets/{KanbanListPage-9RBCauSd.js → KanbanListPage-YMm_7vzg.js} +1 -1
  27. package/web/assets/{LaunchProjectPage-obaNCuEY.js → LaunchProjectPage-Da21oFjw.js} +1 -1
  28. package/web/assets/{LaunchServicesPage-CiWzQIyC.js → LaunchServicesPage-8YJT1stQ.js} +1 -1
  29. package/web/assets/{LogViewer-BiSD_TNt.js → LogViewer-BYNRWqlP.js} +1 -1
  30. package/web/assets/{OrgKeyPrompt-zhMl_nTd.js → OrgKeyPrompt-De8D0zzy.js} +1 -1
  31. package/web/assets/{ProcessControls-DMxvJmDe.js → ProcessControls-BPQXGKib.js} +1 -1
  32. package/web/assets/{ProcessDetailPage-CsCqQh2V.js → ProcessDetailPage-CVwMbU6x.js} +1 -1
  33. package/web/assets/{ProcessMetrics-DK4Dgdb0.js → ProcessMetrics-D7L708Em.js} +1 -1
  34. package/web/assets/{ProjectDetailPage-B0vJySvH.js → ProjectDetailPage-BjBN3hnN.js} +1 -1
  35. package/web/assets/{ProjectListPage-srxBmrbO.js → ProjectListPage-BRXKT6op.js} +1 -1
  36. package/web/assets/{RandomJobTestPage-jGfX-6W9.js → RandomJobTestPage-dhDNam5v.js} +1 -1
  37. package/web/assets/{ScenarioEditorPage-CxLy6gs7.js → ScenarioEditorPage-yOp4ZF14.js} +1 -1
  38. package/web/assets/{SendToChatDialog-AHkuFQjt.js → SendToChatDialog-o4y1Q-OD.js} +1 -1
  39. package/web/assets/{ServiceControlsBar-C8P9_qWK.js → ServiceControlsBar-BH1ZEFkK.js} +1 -1
  40. package/web/assets/{ServiceDetailPage-DTBpQegV.js → ServiceDetailPage-CFb0blqq.js} +1 -1
  41. package/web/assets/{ServiceFormPage-CsPSMWdD.js → ServiceFormPage-DzFQ_M1-.js} +1 -1
  42. package/web/assets/SettingsPage-Bcs3tnUy.js +2063 -0
  43. package/web/assets/{SettingsPage-uCS5lY2z.css → SettingsPage-CScovMi5.css} +1 -1
  44. package/web/assets/{UnlockPage-Bkp_hR-F.js → UnlockPage-BAxKs_K9.js} +1 -1
  45. package/web/assets/{VariablesTable-jo61MhbL.js → VariablesTable-CSuAPeF-.js} +1 -1
  46. package/web/assets/{VaultMigrationPage-D-Dxg5xH.js → VaultMigrationPage-BJX9kunL.js} +1 -1
  47. package/web/assets/{VersionBadge-CwNZLgqN.js → VersionBadge-B9Wvyvf6.js} +1 -1
  48. package/web/assets/WikiPage-CBZFOPL_.js +1 -0
  49. package/web/assets/{WikiView-BpJECJ2Y.js → WikiView-DxPrGyFy.js} +1 -1
  50. package/web/assets/{add-scalar-classes-CqLAxAGv.js → add-scalar-classes-vtTXFTZ6.js} +3 -3
  51. package/web/assets/auth-errors-DpUvxKid.js +1 -0
  52. package/web/assets/{autocomplete-CrMQ2sCk.js → autocomplete-BakcEoGP.js} +1 -1
  53. package/web/assets/{basic-shape-diamond.svg-CacrbinE.js → basic-shape-diamond.svg-C8K6YjGj.js} +1 -1
  54. package/web/assets/{basic-shape-hexagon.svg-GGJ54oyX.js → basic-shape-hexagon.svg-C9PeXR6S.js} +1 -1
  55. package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-CuWfwdJM.js → basic-shape-primary-circle-ellipse-round.svg-CfBLN6Yj.js} +1 -1
  56. package/web/assets/{basic-shape-primary-square-rectangle.svg-C2Bewjip.js → basic-shape-primary-square-rectangle.svg-D2QPBP5_.js} +1 -1
  57. package/web/assets/{basic-shape-shield.svg-DNtg0KuJ.js → basic-shape-shield.svg-ClsEFdja.js} +1 -1
  58. package/web/assets/{browser-XO2fm4BX.js → browser-CF5_9QqR.js} +1 -1
  59. package/web/assets/{browser-5NN8ieli.js → browser-D7ZckEFz.js} +1 -1
  60. package/web/assets/browser-DNbnH79q.js +6 -0
  61. package/web/assets/{card-CjcU4SfX.js → card-DcpoBJHQ.js} +1 -1
  62. package/web/assets/{checkbox-iq9mU5eP.js → checkbox-CfwNXlF_.js} +1 -1
  63. package/web/assets/{chip-BsccUnHb.js → chip-3tOoBrD7.js} +1 -1
  64. package/web/assets/{client-B9UJRQa-.js → client-CKBKBNVm.js} +1 -1
  65. package/web/assets/{cloud-chat.store-Dw2lzuBY.js → cloud-chat.store-Ci1DBP5j.js} +1 -1
  66. package/web/assets/{cloud-session-DIhbWyP5.js → cloud-session-CzYQ65k8.js} +1 -1
  67. package/web/assets/{column-BGKYk6b6.js → column-CVuKYYbZ.js} +1 -1
  68. package/web/assets/{computer-device-desktop-monitor.svg-DSwpF_ss.js → computer-device-desktop-monitor.svg-9f4DSNLj.js} +1 -1
  69. package/web/assets/{computer-device-desktop.svg-Caj_PZBV.js → computer-device-desktop.svg-BYoXiEOE.js} +1 -1
  70. package/web/assets/{computer-device-laptop.svg-Bv3ienI_.js → computer-device-laptop.svg-DR1sEMdL.js} +1 -1
  71. package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-IWlhEKx_.js → computer-device-mobile-phone-android-samsung-back.svg-B-AOaBuq.js} +1 -1
  72. package/web/assets/{computer-device-mobile-phone-android-samsung.svg-CglQAFq2.js → computer-device-mobile-phone-android-samsung.svg-Dw4z_H5H.js} +1 -1
  73. package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-CgjNnTTw.js → computer-device-mobile-phone-iphone-x-back.svg-BtqMb2Wo.js} +1 -1
  74. package/web/assets/{computer-device-mobile-phone-iphone-x.svg-CotZ-4M5.js → computer-device-mobile-phone-iphone-x.svg-eYEM_VXA.js} +1 -1
  75. package/web/assets/{computer-device-mobile-tablet-touch.svg-B2cemd61.js → computer-device-mobile-tablet-touch.svg-jLD41nvm.js} +1 -1
  76. package/web/assets/{computer-device-mobile-tablet.svg-8nPVs4u_.js → computer-device-mobile-tablet.svg-D_7_M1GK.js} +1 -1
  77. package/web/assets/{computer-device-network-ethernet-cat6.svg-Bl56Qw4v.js → computer-device-network-ethernet-cat6.svg-B_527QGY.js} +1 -1
  78. package/web/assets/{computer-device-network-lan-www.svg-C_x6Rf8N.js → computer-device-network-lan-www.svg-ClZIaUOH.js} +1 -1
  79. package/web/assets/{computer-device-network-wifi-connection.svg-oz6dsDQB.js → computer-device-network-wifi-connection.svg-DC4OCJY0.js} +1 -1
  80. package/web/assets/{computer-device-network-wifi-router.svg-BciHU6Nj.js → computer-device-network-wifi-router.svg-BWPpobCc.js} +1 -1
  81. package/web/assets/{cssMode-DSX5tYcm.js → cssMode-CXUrkdrQ.js} +1 -1
  82. package/web/assets/{divider-DnPOdDs3.js → divider-BrO5nkpd.js} +1 -1
  83. package/web/assets/docx-preview-tE714WSD.js +21 -0
  84. package/web/assets/{ecology-science-erlenmeyer-flask.svg-BzQP6y9L.js → ecology-science-erlenmeyer-flask.svg-o8D0ASmr.js} +1 -1
  85. package/web/assets/{fieldset-D9lkV70l.js → fieldset-LX5cdTvN.js} +1 -1
  86. package/web/assets/{freemarker2-D9yXX9Vw.js → freemarker2-DJ82s0fP.js} +1 -1
  87. package/web/assets/{handlebars-BmcjEksL.js → handlebars-BXFlY2Lu.js} +1 -1
  88. package/web/assets/{html-BQF9vZLL.js → html-CqDVypOC.js} +1 -1
  89. package/web/assets/{htmlMode-DxSRpgHE.js → htmlMode-DrHxdTQP.js} +1 -1
  90. package/web/assets/{image-flash-lightning.svg-DQX09uxo.js → image-flash-lightning.svg-BDPMOynq.js} +1 -1
  91. package/web/assets/{image-picture-flower.svg-CUBdrnoc.js → image-picture-flower.svg-D-AJaery.js} +1 -1
  92. package/web/assets/{index-enuBsJBa.js → index-a6DAapTb.js} +299 -299
  93. package/web/assets/{interface-alert-exclamation-diamond.svg-DXQdQSvN.js → interface-alert-exclamation-diamond.svg-CV7M0IVQ.js} +1 -1
  94. package/web/assets/{interface-alert-exclamation-triangle-warning.svg-BoCeNIlU.js → interface-alert-exclamation-triangle-warning.svg-B8NapiB7.js} +1 -1
  95. package/web/assets/{interface-alert-information-circle.svg-BCA57JL2.js → interface-alert-information-circle.svg-eQIFULjG.js} +1 -1
  96. package/web/assets/{interface-award-crown.svg-B1hTlsb0.js → interface-award-crown.svg-D-4fclUD.js} +1 -1
  97. package/web/assets/{interface-bookmark.svg-zf3cIGKM.js → interface-bookmark-tag.svg-Jy6EOdau.js} +1 -1
  98. package/web/assets/{interface-bookmark-tag.svg-AosfQ0Ip.js → interface-bookmark.svg-XdbYDqqk.js} +1 -1
  99. package/web/assets/{interface-calendar-date-one.svg-D58WqPie.js → interface-calendar-date-one.svg-BIoXVZrz.js} +1 -1
  100. package/web/assets/{interface-content-book-open-pages.svg-B74HWMlw.js → interface-content-book-open-pages.svg-DHwJbBvQ.js} +1 -1
  101. package/web/assets/{interface-content-book-page.svg-C2QWk62-.js → interface-content-book-page.svg-47msUBN_.js} +1 -1
  102. package/web/assets/{interface-content-file.svg-xKu0qAOQ.js → interface-content-file.svg-DXw9W8QM.js} +1 -1
  103. package/web/assets/interface-content-folder.svg-BikaY449.js +1 -0
  104. package/web/assets/{interface-content-folder.svg-ZkrY9WkQ.js → interface-content-folder.svg-BmK_IJv8.js} +1 -1
  105. package/web/assets/{interface-copy-clipboard.svg-BEkNG3vO.js → interface-copy-clipboard.svg-CQ1rQN0L.js} +1 -1
  106. package/web/assets/{interface-edit-attachment.svg-5ztQ3WTq.js → interface-edit-attachment.svg-C3aTaTh_.js} +1 -1
  107. package/web/assets/{interface-edit-binocular.svg-CC9U1Gnc.js → interface-edit-binocular.svg-B2Ue_tgs.js} +1 -1
  108. package/web/assets/{interface-edit-magic-wand.svg-CPl6ZoE9.js → interface-edit-magic-wand.svg-DDKse-Wy.js} +1 -1
  109. package/web/assets/{interface-edit-tool-paint-roller.svg-B85t7jG2.js → interface-edit-tool-paint-roller.svg-C2ABby1f.js} +1 -1
  110. package/web/assets/{interface-edit-tool-pencil.svg-BSTdqWUg.js → interface-edit-tool-pencil.svg-CNjYbknQ.js} +1 -1
  111. package/web/assets/{interface-favorite-award.svg-DbPr_WKt.js → interface-favorite-award.svg-DWqSHfIa.js} +1 -1
  112. package/web/assets/{interface-favorite-flag.svg-CgKYXc7k.js → interface-favorite-flag.svg-CNUsr98g.js} +1 -1
  113. package/web/assets/{interface-favorite-heart.svg-DfnXyJMg.js → interface-favorite-heart.svg-3Eb366FO.js} +1 -1
  114. package/web/assets/{interface-favorite-star.svg-0sT7jJMK.js → interface-favorite-star.svg-CVJ3aq1n.js} +1 -1
  115. package/web/assets/{interface-favorite-stars-sparkles.svg-BcM2EXgn.js → interface-favorite-stars-sparkles.svg-BfXhPBbs.js} +1 -1
  116. package/web/assets/{interface-hierarchy-flowchart.svg-BM62WcKt.js → interface-hierarchy-flowchart.svg-DzsqKrYq.js} +1 -1
  117. package/web/assets/{interface-home-house.svg-KqP7iMC4.js → interface-home-house.svg-BnXbuyZn.js} +1 -1
  118. package/web/assets/{interface-hyperlink.svg-DBKFbihR.js → interface-hyperlink.svg-BsmSmyP5.js} +1 -1
  119. package/web/assets/{interface-lighting-brightness.svg-DTkCS7PY.js → interface-lighting-brightness.svg-BywVQRo9.js} +1 -1
  120. package/web/assets/{interface-lock-closed.svg-Div5xlvI.js → interface-lock-closed.svg-BLPORc_h.js} +1 -1
  121. package/web/assets/{interface-lock-open-unlock.svg-Du5L_iMV.js → interface-lock-open-unlock.svg-CaYlbVmU.js} +1 -1
  122. package/web/assets/{interface-login-key.svg-28TYVVzH.js → interface-login-key.svg-D5F_9MJ0.js} +1 -1
  123. package/web/assets/{interface-search.svg-BS_owhIG.js → interface-search.svg-CF1D8GIV.js} +1 -1
  124. package/web/assets/{interface-setting-cog.svg-afYc0TQv.js → interface-setting-cog.svg-D4AOKG2g.js} +1 -1
  125. package/web/assets/{interface-share-megaphone-bullhorn.svg-BnW8HhjG.js → interface-share-megaphone-bullhorn.svg-BIfr2_va.js} +1 -1
  126. package/web/assets/{interface-share-rocket.svg-DvX_9178.js → interface-share-rocket.svg-NDd3dv1t.js} +1 -1
  127. package/web/assets/{interface-share-satellite.svg-B4nQqv6w.js → interface-share-satellite.svg-CVDJbmT-.js} +1 -1
  128. package/web/assets/{interface-share-space-ship.svg-Ciol-6JO.js → interface-share-space-ship.svg-D0ZLJNO2.js} +1 -1
  129. package/web/assets/{interface-share.svg-COm1OVr8.js → interface-share.svg-WpwbpOes.js} +1 -1
  130. package/web/assets/{interface-signal-square.svg-DXuF6sqG.js → interface-signal-square.svg-DnfzUw_B.js} +1 -1
  131. package/web/assets/{interface-time-clock-circle.svg-CWLe4mcs.js → interface-time-clock-circle.svg-BhxciNvX.js} +1 -1
  132. package/web/assets/{interface-time-hour-glass.svg-DXz9wBiv.js → interface-time-hour-glass.svg-DBzSaSHQ.js} +1 -1
  133. package/web/assets/{interface-users-multiple.svg-CXOw1J5l.js → interface-users-multiple.svg-BULh1giq.js} +1 -1
  134. package/web/assets/{interface-weather-moon.svg-B9H9xib3.js → interface-weather-moon.svg-D377V2os.js} +1 -1
  135. package/web/assets/{javascript-BY1URXQK.js → javascript-BTXoJ3Qy.js} +1 -1
  136. package/web/assets/{jsonMode-CxipJdzJ.js → jsonMode-D4a3Khim.js} +1 -1
  137. package/web/assets/{liquid-BbqI_ezD.js → liquid-DfO0R4Mk.js} +1 -1
  138. package/web/assets/{lspLanguageFeatures-BrbDxmfl.js → lspLanguageFeatures-BvPWuQFt.js} +1 -1
  139. package/web/assets/{mail-chat-bubble-square.svg-CAlBGAlW.js → mail-chat-bubble-square.svg-SK3IJ6QN.js} +1 -1
  140. package/web/assets/{mail-send-email-paper-airplane.svg-BoNc-FEY.js → mail-send-email-paper-airplane.svg-CJFA7B2E.js} +1 -1
  141. package/web/assets/{mail-send-envelope.svg-CnMOSib5.js → mail-send-envelope.svg-eO_-QNyE.js} +1 -1
  142. package/web/assets/{mdx-C4PcQ_oe.js → mdx-G_vwFSSe.js} +1 -1
  143. package/web/assets/{message-BWsbEnoG.js → message-CxPw04rG.js} +1 -1
  144. package/web/assets/{minus-BpDIA3FO.js → minus-Dp5ez1-1.js} +1 -1
  145. package/web/assets/{modal-DZYAJM4x.js → modal-CGT4d1lM.js} +1 -1
  146. package/web/assets/modal-D_N6NaGL.js +1 -0
  147. package/web/assets/{money-cashier-receipt.svg-DZQ9mrBZ.js → money-cashier-receipt.svg-EutWthy8.js} +1 -1
  148. package/web/assets/{money-currency-dollar-pay.svg-BCaw-GeJ.js → money-currency-dollar-pay.svg-MnLj-orw.js} +1 -1
  149. package/web/assets/{money-graph-arrow-increase.svg-DZXh-i2p.js → money-graph-arrow-increase.svg-CVCZ3TyJ.js} +1 -1
  150. package/web/assets/{money-graph-bar-chart-increase.svg-j_1tUlGM.js → money-graph-bar-chart-increase.svg-DiUmCuhj.js} +1 -1
  151. package/web/assets/{multiselect-CmjxW2sW.js → multiselect-C6uayHqj.js} +1 -1
  152. package/web/assets/{nature-ecology-leaf.svg-bajA57tM.js → nature-ecology-leaf.svg-ByaLs72Y.js} +1 -1
  153. package/web/assets/{password-W9W3PSE2.js → password-CxtOqagM.js} +1 -1
  154. package/web/assets/{phone-telephone.svg-DD5MGHqV.js → phone-telephone.svg-BKz6Jkwn.js} +1 -1
  155. package/web/assets/{plus-RuIcofM_.js → plus-BPT_7GGk.js} +1 -1
  156. package/web/assets/process.store-CMxuFjFg.js +1 -0
  157. package/web/assets/{programming-bug.svg-CjtqBc8Z.js → programming-bug.svg-BwSc8f0s.js} +1 -1
  158. package/web/assets/{programming-cloud.svg-BXQ_h3dK.js → programming-cloud.svg-CEIulNEp.js} +1 -1
  159. package/web/assets/{programming-computer-database-server.svg-D6TzOHsK.js → programming-computer-database-server.svg-Bc_F3NH0.js} +1 -1
  160. package/web/assets/{programming-computer-database.svg-Dmdh0lIx.js → programming-computer-database.svg-AYLkzJJE.js} +1 -1
  161. package/web/assets/{programming-module-four-layout.svg-CtGhpLhO.js → programming-module-four-layout.svg-DLpzPxNB.js} +1 -1
  162. package/web/assets/{programming-module-three.svg-hz_w8W7I.js → programming-module-three.svg-CcuZn8dz.js} +1 -1
  163. package/web/assets/{programming-module.svg-oDT_fQLn.js → programming-module.svg-BjbGpQeu.js} +1 -1
  164. package/web/assets/{programming-script-code.svg-CxHHTsaU.js → programming-script-code.svg-poyfodgC.js} +1 -1
  165. package/web/assets/{python-DH-AyaLR.js → python-DpMMlrWM.js} +1 -1
  166. package/web/assets/{razor-BUpT1gRX.js → razor-Ba_mg6U5.js} +1 -1
  167. package/web/assets/router-QZ5Z8Lh7.js +1 -0
  168. package/web/assets/settings-scope-D7umae8c.js +1 -0
  169. package/web/assets/{settings.store-Dj2nbYYG.js → settings.store-Dte8TdJb.js} +1 -1
  170. package/web/assets/{shopping-cart.svg-D1eK38-E.js → shopping-cart.svg-BX2KYVCw.js} +1 -1
  171. package/web/assets/{shopping-gift-present.svg-CxSfFNAS.js → shopping-gift-present.svg-BOl2vYLg.js} +1 -1
  172. package/web/assets/{shopping-shipping-box-parcel-package.svg-M5Njo2qJ.js → shopping-shipping-box-parcel-package.svg-gxfbOgnM.js} +1 -1
  173. package/web/assets/{src-CEK4EPEJ.js → src-D0LXRijj.js} +8 -8
  174. package/web/assets/{src-BTWvqafq.js → src-DWvNj-EG.js} +1 -1
  175. package/web/assets/{tabpanel-CWwOXePg.js → tabpanel-Bkt-f7d6.js} +1 -1
  176. package/web/assets/{tag-new-circle.svg-v_Go3fcT.js → tag-new-circle.svg-CTRMBJyc.js} +1 -1
  177. package/web/assets/{toggleswitch-C4A0_850.js → toggleswitch-DcDrXRKn.js} +1 -1
  178. package/web/assets/{travel-map-earth-globe.svg-Db2uRb3M.js → travel-map-earth-globe.svg-BPp4IapC.js} +1 -1
  179. package/web/assets/trpc-Dtgb4BMw.js +1 -0
  180. package/web/assets/{tsMode-CXB5XugS.js → tsMode-HfLOT-e5.js} +1 -1
  181. package/web/assets/{typescript-CHJkC9r6.js → typescript-DJAEsDnw.js} +1 -1
  182. package/web/assets/useAiChatDrawer-fzyQ-fyM.js +1 -0
  183. package/web/assets/useCloudOrg-BdpqnN19.css +1 -0
  184. package/web/assets/useCloudOrg-Bg7-icbW.js +97 -0
  185. package/web/assets/{useProjectCatalog-DDm0I6sX.js → useProjectCatalog-C95cDPIr.js} +1 -1
  186. package/web/assets/{xml-DB4EKWC9.js → xml-1frg7aol.js} +1 -1
  187. package/web/assets/{yaml-CqvLyuow.js → yaml-DXzDcMOS.js} +1 -1
  188. package/web/index.html +1 -1
  189. package/agent-manager-74WZPMVQ.js +0 -7
  190. package/chunk-YSJ6OJGN.js.map +0 -1
  191. package/src-6WVQ2FQV.js.map +0 -1
  192. package/web/assets/AgentTerminalPage-A8GIX6dZ.css +0 -1
  193. package/web/assets/AgentTerminalPage-DE3GUoXn.js +0 -1
  194. package/web/assets/AiChatPage-BIJczUeS.js +0 -1
  195. package/web/assets/CloudAccountPage-MSWkg9Ke.js +0 -1
  196. package/web/assets/SettingsPage-CmtRn6VJ.js +0 -2063
  197. package/web/assets/WikiPage-DZLKTPi3.js +0 -1
  198. package/web/assets/auth-errors-BOjTx5eo.js +0 -1
  199. package/web/assets/interface-content-folder.svg-DjEfXjEF.js +0 -1
  200. package/web/assets/modal-Fe2dzlxp.js +0 -1
  201. package/web/assets/process.store-COWqXNUm.js +0 -1
  202. package/web/assets/router-BIJ4goD-.js +0 -1
  203. package/web/assets/settings-scope-DGzA7Be-.js +0 -1
  204. package/web/assets/trpc-DfyQNjZd.js +0 -1
  205. package/web/assets/useAiChatDrawer-Cuhlc2BI.js +0 -1
  206. package/web/assets/useCloudOrg-DYOv1Oak.js +0 -93
  207. package/web/assets/useCloudOrg-Dc6yRgro.css +0 -1
  208. /package/{agent-manager-74WZPMVQ.js.map → agent-manager-UUSQK6S2.js.map} +0 -0
  209. /package/web/assets/{abap-Q7FyqTce.js → abap-BvxTqXT2.js} +0 -0
  210. /package/web/assets/{apex-DBNDq2a_.js → apex-CIPCCkBr.js} +0 -0
  211. /package/web/assets/{azcli-BHW8ozYN.js → azcli-Rs0NIwkA.js} +0 -0
  212. /package/web/assets/{bat-BL-_3Nfo.js → bat-BxAhM6gR.js} +0 -0
  213. /package/web/assets/{bicep-DR2vgumW.js → bicep-oV_ehPcG.js} +0 -0
  214. /package/web/assets/{cameligo-BCjoEAZU.js → cameligo-CJLaUyQs.js} +0 -0
  215. /package/web/assets/{clojure-zw1Irdul.js → clojure-CjvMureh.js} +0 -0
  216. /package/web/assets/{coffee-BdEjkiiW.js → coffee-motWC5XQ.js} +0 -0
  217. /package/web/assets/{cpp-DKUlBIAG.js → cpp-DiWIfYNM.js} +0 -0
  218. /package/web/assets/{csharp-BsNC4zVq.js → csharp-GBlGBeai.js} +0 -0
  219. /package/web/assets/{csp-X4Chv5_9.js → csp-tSyK5eO1.js} +0 -0
  220. /package/web/assets/{css-Dh0Dlycs.js → css-BkFK9HG_.js} +0 -0
  221. /package/web/assets/{cypher-BL_DRjGX.js → cypher-Bcp8PXr2.js} +0 -0
  222. /package/web/assets/{dart-DaM4j487.js → dart-uz9Rxe0M.js} +0 -0
  223. /package/web/assets/{dockerfile-Df5WJXAt.js → dockerfile-iJizx3Zp.js} +0 -0
  224. /package/web/assets/{ecl-BjUo3uTs.js → ecl-BalaS36Z.js} +0 -0
  225. /package/web/assets/{elixir-DrLHYSxt.js → elixir-D6CLrLGy.js} +0 -0
  226. /package/web/assets/{flow9-DKiuX7rg.js → flow9-CFt3-vVY.js} +0 -0
  227. /package/web/assets/{fsharp-CAN78557.js → fsharp-DGa7raxa.js} +0 -0
  228. /package/web/assets/{go-DGjr9vA5.js → go-wlqInk4z.js} +0 -0
  229. /package/web/assets/{graphql-CcoU3Cj2.js → graphql-CP1guigM.js} +0 -0
  230. /package/web/assets/{hcl-udfyCcTm.js → hcl-CK0UkKD0.js} +0 -0
  231. /package/web/assets/{ini-BVbXatjh.js → ini-Ch56nrUj.js} +0 -0
  232. /package/web/assets/{java-Drpmh61g.js → java-C9_WIayl.js} +0 -0
  233. /package/web/assets/{julia-asFGk-ZV.js → julia-Can2_mhR.js} +0 -0
  234. /package/web/assets/{kotlin-HmkKz1TT.js → kotlin-DUvGf_BX.js} +0 -0
  235. /package/web/assets/{less-C5i2m2Dn.js → less-DoTbG-rc.js} +0 -0
  236. /package/web/assets/{lexon-B3Xh2kL6.js → lexon-BFMO2_kL.js} +0 -0
  237. /package/web/assets/{lua-DnOtgOOu.js → lua-CC-QtBo7.js} +0 -0
  238. /package/web/assets/{m3-Brj4HNKq.js → m3-C51MyH5Q.js} +0 -0
  239. /package/web/assets/{markdown-C3-4Ntpz.js → markdown-CDwLHhgZ.js} +0 -0
  240. /package/web/assets/{mips-vFQKPHzn.js → mips-YuxZtPGU.js} +0 -0
  241. /package/web/assets/{msdax-D5MYLS2R.js → msdax-CJjWhmte.js} +0 -0
  242. /package/web/assets/{mysql-CRQHhUON.js → mysql-B1riwLaD.js} +0 -0
  243. /package/web/assets/{objective-c-8cZEp0HR.js → objective-c-drXT-gmc.js} +0 -0
  244. /package/web/assets/{pascal-BPn_2jro.js → pascal-KUYgrN-Z.js} +0 -0
  245. /package/web/assets/{pascaligo-L7QnU_8B.js → pascaligo-DQmQJP-r.js} +0 -0
  246. /package/web/assets/{perl-B9zSPnp3.js → perl-09XLBmCS.js} +0 -0
  247. /package/web/assets/{pgsql-DiRJukCJ.js → pgsql-BFj9IFFu.js} +0 -0
  248. /package/web/assets/{php-Dv4g8Lhr.js → php-UnC5BqwY.js} +0 -0
  249. /package/web/assets/{pla-CKAoz6vp.js → pla-BFuYrPHG.js} +0 -0
  250. /package/web/assets/{postiats-B_PYgUTS.js → postiats-n4ft3jnO.js} +0 -0
  251. /package/web/assets/{powerquery-CAagSyo-.js → powerquery-D-s-oFSc.js} +0 -0
  252. /package/web/assets/{powershell-Cj9BzLhS.js → powershell-CTboTf93.js} +0 -0
  253. /package/web/assets/{protobuf-DTRY4FFo.js → protobuf-Dt62GuJP.js} +0 -0
  254. /package/web/assets/{pug-qADGmCS8.js → pug-CEFWkUzw.js} +0 -0
  255. /package/web/assets/{qsharp-xkZT0ZOm.js → qsharp-B0DUmgPZ.js} +0 -0
  256. /package/web/assets/{r-C7wfNC2Z.js → r-BVnF0c4T.js} +0 -0
  257. /package/web/assets/{redis-BoccK80D.js → redis-DLl3KQXi.js} +0 -0
  258. /package/web/assets/{redshift-EL8PjTts.js → redshift-cif1I7h1.js} +0 -0
  259. /package/web/assets/{restructuredtext-CA6rgR7C.js → restructuredtext-PNfql36m.js} +0 -0
  260. /package/web/assets/{ruby-BymrInur.js → ruby-j3jxDjUN.js} +0 -0
  261. /package/web/assets/{rust-BTbPL-fg.js → rust-BaIO-mAt.js} +0 -0
  262. /package/web/assets/{sb-BTkOICcb.js → sb-D8XNVNUQ.js} +0 -0
  263. /package/web/assets/{scala-CzaUHeQF.js → scala-DiK9Ps90.js} +0 -0
  264. /package/web/assets/{scheme-DZe2DRuY.js → scheme-DPKqXHmF.js} +0 -0
  265. /package/web/assets/{scss-D5oFt9cg.js → scss-DpMwfP2H.js} +0 -0
  266. /package/web/assets/{shell-DCkIF5jZ.js → shell-Dw9mKVg2.js} +0 -0
  267. /package/web/assets/{solidity-CfOO4gXi.js → solidity-DTxo-7fe.js} +0 -0
  268. /package/web/assets/{sophia-0-sROOHR.js → sophia-BjA3Q87y.js} +0 -0
  269. /package/web/assets/{sparql-Dzzr9hol.js → sparql-q1EpMUqb.js} +0 -0
  270. /package/web/assets/{sql-DbXHiHh_.js → sql-CjcQ4wIr.js} +0 -0
  271. /package/web/assets/{st-DEaYV8xH.js → st-AuOpxVl7.js} +0 -0
  272. /package/web/assets/{swift-BQItveav.js → swift-BUWnv6f7.js} +0 -0
  273. /package/web/assets/{systemverilog-nE6YfGlx.js → systemverilog-FhXn-3OZ.js} +0 -0
  274. /package/web/assets/{tcl-Do7Q0SM0.js → tcl-B0lqcTtS.js} +0 -0
  275. /package/web/assets/{twig-B2CLZN2j.js → twig-B0OeGPVa.js} +0 -0
  276. /package/web/assets/{typespec-r9R1AgVi.js → typespec-Bmh6VX11.js} +0 -0
  277. /package/web/assets/{vb-DGnD02qr.js → vb-bmgX6veu.js} +0 -0
  278. /package/web/assets/{wgsl-C2fD4koY.js → wgsl-FflLnFqI.js} +0 -0
@@ -60,9 +60,11 @@ import {
60
60
  isVaultLocked,
61
61
  keyRoot,
62
62
  keyedFilePath,
63
+ killInstance,
63
64
  legacyMachineFilePath,
64
65
  legacyVaultRoot,
65
66
  listCloudVaults,
67
+ listInstances,
66
68
  listOrgVaults,
67
69
  loadFromEnv,
68
70
  localVaultRoot,
@@ -79,6 +81,7 @@ import {
79
81
  readOrgNames,
80
82
  refOfProjectAmong,
81
83
  refsOfProjectId,
84
+ registerInstance,
82
85
  registerProjectLoader,
83
86
  rememberFile,
84
87
  rememberOrgName,
@@ -93,11 +96,12 @@ import {
93
96
  stableEncryptValue,
94
97
  stampOrgCloud,
95
98
  traefikManager,
99
+ unregisterInstance,
96
100
  vaultFor,
97
101
  vaultIdOfRoot,
98
102
  wasRead,
99
103
  writeEntity
100
- } from "./chunk-YSJ6OJGN.js";
104
+ } from "./chunk-Z3KAXI7V.js";
101
105
 
102
106
  // ../server/src/create-server.ts
103
107
  import express from "express";
@@ -4852,20 +4856,20 @@ var settingsRouter = router({
4852
4856
  });
4853
4857
  if (config?.wildcardDomain?.trim()) {
4854
4858
  const sanitisedDomain = config.wildcardDomain.replace(/^\*\./, "").replace(/[^a-z0-9.-]/gi, "");
4855
- const probe2 = `probe.${sanitisedDomain}`;
4859
+ const probe = `probe.${sanitisedDomain}`;
4856
4860
  try {
4857
- const addresses = await dns.resolve4(probe2);
4861
+ const addresses = await dns.resolve4(probe);
4858
4862
  const pointsToLocalhost = addresses.some((a) => a === "127.0.0.1");
4859
4863
  checks.push({
4860
4864
  id: "dns_resolution",
4861
4865
  ok: pointsToLocalhost,
4862
- message: pointsToLocalhost ? `${probe2} \u2192 127.0.0.1 \u2713` : `${probe2} r\xE9sout vers ${addresses.join(", ")} (attendu : 127.0.0.1)`
4866
+ message: pointsToLocalhost ? `${probe} \u2192 127.0.0.1 \u2713` : `${probe} r\xE9sout vers ${addresses.join(", ")} (attendu : 127.0.0.1)`
4863
4867
  });
4864
4868
  } catch {
4865
4869
  checks.push({
4866
4870
  id: "dns_resolution",
4867
4871
  ok: false,
4868
- message: `${probe2} ne r\xE9sout pas \u2014 v\xE9rifiez le DNS wildcard`
4872
+ message: `${probe} ne r\xE9sout pas \u2014 v\xE9rifiez le DNS wildcard`
4869
4873
  });
4870
4874
  }
4871
4875
  }
@@ -7959,7 +7963,7 @@ function tailTranscript(opts) {
7959
7963
 
7960
7964
  // ../server/src/services/ai-runners/claude-pty-runner.ts
7961
7965
  async function getAgentManager() {
7962
- const { agentManager: agentManager2 } = await import("./agent-manager-74WZPMVQ.js");
7966
+ const { agentManager: agentManager2 } = await import("./agent-manager-UUSQK6S2.js");
7963
7967
  return agentManager2;
7964
7968
  }
7965
7969
  function buildPtyArgs(params, sessionId, opts) {
@@ -8700,7 +8704,7 @@ async function shutdownCodexAppServer() {
8700
8704
  }
8701
8705
  }
8702
8706
  async function getAgentManager2() {
8703
- const { agentManager: agentManager2 } = await import("./agent-manager-74WZPMVQ.js");
8707
+ const { agentManager: agentManager2 } = await import("./agent-manager-UUSQK6S2.js");
8704
8708
  return agentManager2;
8705
8709
  }
8706
8710
  function parseRuneyaCurlCommand(command) {
@@ -12697,7 +12701,8 @@ var debugRouter = router({
12697
12701
  });
12698
12702
 
12699
12703
  // ../server/src/trpc/routers/diagnostics.ts
12700
- import { z as z21 } from "zod";
12704
+ import { z as z20 } from "zod";
12705
+ import { TRPCError as TRPCError18 } from "@trpc/server";
12701
12706
 
12702
12707
  // ../server/src/services/log-buffer.ts
12703
12708
  import { EventEmitter as EventEmitter4 } from "events";
@@ -12765,132 +12770,10 @@ function onEntry(listener) {
12765
12770
  return () => emitter.off("entry", listener);
12766
12771
  }
12767
12772
 
12768
- // ../server/src/services/instance-registry.ts
12769
- import { mkdir as mkdir16, readdir as readdir5, readFile as readFile15, writeFile as writeFile14, rm as rm3 } from "fs/promises";
12770
- import { join as join19 } from "path";
12771
- import { z as z20 } from "zod";
12772
- var InstanceFileSchema = z20.object({
12773
- pid: z20.number().int().positive(),
12774
- port: z20.number().int().min(1).max(65535),
12775
- agentPort: z20.number().int().min(1).max(65535),
12776
- cwd: z20.string().max(4096),
12777
- dataDir: z20.string().max(4096),
12778
- version: z20.string().max(64),
12779
- fromDesktop: z20.boolean(),
12780
- startedAt: z20.number().int().nonnegative()
12781
- });
12782
- function registryDir() {
12783
- return join19(machineRoot(), "instances");
12784
- }
12785
- function fileFor(pid) {
12786
- return join19(registryDir(), `${pid}.json`);
12787
- }
12788
- function selfRecord() {
12789
- return {
12790
- pid: process.pid,
12791
- port: env.PORT,
12792
- agentPort: env.RUNEYA_AGENT_PORT,
12793
- cwd: process.cwd(),
12794
- dataDir: env.DATA_DIR,
12795
- version: process.env["RUNEYA_VERSION"] ?? "unknown",
12796
- fromDesktop: env.FROM_DESKTOP,
12797
- startedAt: Date.now()
12798
- };
12799
- }
12800
- async function registerInstance() {
12801
- try {
12802
- await mkdir16(registryDir(), { recursive: true });
12803
- await writeFile14(fileFor(process.pid), JSON.stringify(selfRecord(), null, 2));
12804
- } catch (err) {
12805
- console.log("[instances] Could not register this instance:", err.message);
12806
- }
12807
- }
12808
- async function unregisterInstance() {
12809
- await rm3(fileFor(process.pid), { force: true }).catch(() => {
12810
- });
12811
- }
12812
- function isProcessAlive(pid) {
12813
- try {
12814
- process.kill(pid, 0);
12815
- return true;
12816
- } catch (err) {
12817
- return err.code === "EPERM";
12818
- }
12819
- }
12820
- async function probe(port) {
12821
- try {
12822
- const res = await fetch(`http://127.0.0.1:${port}/api/trpc/health.check`, {
12823
- signal: AbortSignal.timeout(1500)
12824
- });
12825
- if (!res.ok) return { ok: false, uptimeMs: null, version: null };
12826
- const body = await res.json();
12827
- const data = body.result?.data;
12828
- return { ok: true, uptimeMs: data?.uptime ?? null, version: data?.version ?? null };
12829
- } catch {
12830
- return { ok: false, uptimeMs: null, version: null };
12831
- }
12832
- }
12833
- async function listInstances() {
12834
- let files;
12835
- try {
12836
- files = await readdir5(registryDir());
12837
- } catch {
12838
- return [];
12839
- }
12840
- const found = await Promise.all(
12841
- files.filter((f) => f.endsWith(".json")).map(async (name) => {
12842
- const path = join19(registryDir(), name);
12843
- let record;
12844
- try {
12845
- const parsed = InstanceFileSchema.safeParse(JSON.parse(await readFile15(path, "utf8")));
12846
- if (!parsed.success) {
12847
- await rm3(path, { force: true }).catch(() => {
12848
- });
12849
- return null;
12850
- }
12851
- record = parsed.data;
12852
- } catch {
12853
- return null;
12854
- }
12855
- if (!isProcessAlive(record.pid)) {
12856
- await rm3(path, { force: true }).catch(() => {
12857
- });
12858
- return null;
12859
- }
12860
- const { ok, uptimeMs, version } = await probe(record.port);
12861
- if (!ok) {
12862
- await rm3(path, { force: true }).catch(() => {
12863
- });
12864
- return null;
12865
- }
12866
- return {
12867
- ...record,
12868
- // Trust the live answer over the file: the file was written at boot
12869
- // and an upgraded instance would keep claiming its old version.
12870
- version: version ?? record.version,
12871
- reachable: true,
12872
- current: record.pid === process.pid,
12873
- uptimeMs
12874
- };
12875
- })
12876
- );
12877
- return dedupeByPort(found.filter((i) => i !== null)).sort((a, b) => Number(b.current) - Number(a.current) || a.port - b.port);
12878
- }
12879
- function dedupeByPort(instances) {
12880
- const byPort = /* @__PURE__ */ new Map();
12881
- for (const instance of instances) {
12882
- const kept = byPort.get(instance.port);
12883
- if (!kept || instance.current || !kept.current && instance.startedAt > kept.startedAt) {
12884
- byPort.set(instance.port, instance);
12885
- }
12886
- }
12887
- return [...byPort.values()];
12888
- }
12889
-
12890
12773
  // ../server/src/trpc/routers/diagnostics.ts
12891
12774
  var diagnosticsRouter = router({
12892
12775
  /** Backlog for a client that just opened the panel. */
12893
- recentLogs: protectedProcedure.input(z21.object({ limit: z21.number().int().min(1).max(2e3).default(500) }).optional()).query(({ input }) => recentEntries(input?.limit ?? 500)),
12776
+ recentLogs: protectedProcedure.input(z20.object({ limit: z20.number().int().min(1).max(2e3).default(500) }).optional()).query(({ input }) => recentEntries(input?.limit ?? 500)),
12894
12777
  /**
12895
12778
  * Live log stream.
12896
12779
  *
@@ -12899,7 +12782,7 @@ var diagnosticsRouter = router({
12899
12782
  * silently loses lines, which is precisely what someone watching a boot
12900
12783
  * failure cannot afford.
12901
12784
  */
12902
- streamLogs: protectedProcedure.input(z21.object({ afterSeq: z21.number().int().nonnegative().default(0) }).optional()).subscription(async function* ({ input, signal }) {
12785
+ streamLogs: protectedProcedure.input(z20.object({ afterSeq: z20.number().int().nonnegative().default(0) }).optional()).subscription(async function* ({ input, signal }) {
12903
12786
  for (const entry of entriesSince(input?.afterSeq ?? 0)) yield entry;
12904
12787
  const queue = [];
12905
12788
  let wake = null;
@@ -12924,11 +12807,33 @@ var diagnosticsRouter = router({
12924
12807
  }
12925
12808
  }),
12926
12809
  /** Every Runeya answering on this machine, this one included. */
12927
- instances: protectedProcedure.query(() => listInstances())
12810
+ instances: protectedProcedure.query(() => listInstances()),
12811
+ /**
12812
+ * Stop another Runeya on this machine — its agent first, then its server.
12813
+ *
12814
+ * The pid is a *selector*, not an instruction: it is looked up in the list
12815
+ * `listInstances()` has just vouched for, and anything absent from it is
12816
+ * refused. That is what keeps this from being a way to signal arbitrary
12817
+ * processes with the server's privileges.
12818
+ */
12819
+ killInstance: protectedProcedure.input(z20.object({ pid: z20.number().int().positive() })).mutation(async ({ input }) => {
12820
+ try {
12821
+ return await killInstance(input.pid);
12822
+ } catch (err) {
12823
+ const reason = err.message;
12824
+ if (reason === "instance-not-found") {
12825
+ throw new TRPCError18({ code: "NOT_FOUND", message: "No live Runeya instance with this pid." });
12826
+ }
12827
+ if (reason === "instance-is-current") {
12828
+ throw new TRPCError18({ code: "BAD_REQUEST", message: "This instance cannot stop itself." });
12829
+ }
12830
+ throw new TRPCError18({ code: "INTERNAL_SERVER_ERROR", message: reason });
12831
+ }
12832
+ })
12928
12833
  });
12929
12834
 
12930
12835
  // ../server/src/trpc/routers/kanban-queue.ts
12931
- import { z as z22 } from "zod";
12836
+ import { z as z21 } from "zod";
12932
12837
 
12933
12838
  // ../server/src/services/kanban-queue.ts
12934
12839
  import { randomUUID as randomUUID10 } from "crypto";
@@ -13116,36 +13021,36 @@ var kanbanQueue = new KanbanQueueService();
13116
13021
  // ../server/src/trpc/routers/kanban-queue.ts
13117
13022
  var kanbanQueueRouter = router({
13118
13023
  getState: protectedProcedure.query(() => kanbanQueue.getState()),
13119
- add: protectedProcedure.input(z22.object({
13120
- boardId: z22.string().max(128),
13121
- cardId: z22.string().max(128),
13122
- runner: z22.enum(["claude-code", "codex"]).optional(),
13123
- model: z22.string().max(128).optional(),
13124
- scenarioId: z22.string().max(128).optional(),
13024
+ add: protectedProcedure.input(z21.object({
13025
+ boardId: z21.string().max(128),
13026
+ cardId: z21.string().max(128),
13027
+ runner: z21.enum(["claude-code", "codex"]).optional(),
13028
+ model: z21.string().max(128).optional(),
13029
+ scenarioId: z21.string().max(128).optional(),
13125
13030
  // Le projet ouvert quand la carte a été mise en file : la conversation
13126
13031
  // qui en naîtra lui appartient, plutôt que de rester orpheline et de
13127
13032
  // s'afficher dans tous les projets.
13128
- projectId: z22.string().max(128).optional(),
13129
- orgId: z22.string().max(128).nullable().optional()
13033
+ projectId: z21.string().max(128).optional(),
13034
+ orgId: z21.string().max(128).nullable().optional()
13130
13035
  })).mutation(({ input }) => kanbanQueue.add(input)),
13131
- addColumn: protectedProcedure.input(z22.object({
13132
- boardId: z22.string().max(128),
13133
- columnId: z22.string().max(128),
13134
- runner: z22.enum(["claude-code", "codex"]).optional(),
13135
- model: z22.string().max(128).optional(),
13136
- scenarioId: z22.string().max(128).optional(),
13137
- projectId: z22.string().max(128).optional(),
13138
- orgId: z22.string().max(128).nullable().optional()
13036
+ addColumn: protectedProcedure.input(z21.object({
13037
+ boardId: z21.string().max(128),
13038
+ columnId: z21.string().max(128),
13039
+ runner: z21.enum(["claude-code", "codex"]).optional(),
13040
+ model: z21.string().max(128).optional(),
13041
+ scenarioId: z21.string().max(128).optional(),
13042
+ projectId: z21.string().max(128).optional(),
13043
+ orgId: z21.string().max(128).nullable().optional()
13139
13044
  })).mutation(async ({ input }) => {
13140
13045
  const { boardId, columnId, ...options } = input;
13141
13046
  return kanbanQueue.addColumn(boardId, columnId, options);
13142
13047
  }),
13143
- remove: protectedProcedure.input(z22.object({ itemId: z22.string().max(128) })).mutation(({ input }) => ({ removed: kanbanQueue.remove(input.itemId) })),
13048
+ remove: protectedProcedure.input(z21.object({ itemId: z21.string().max(128) })).mutation(({ input }) => ({ removed: kanbanQueue.remove(input.itemId) })),
13144
13049
  stopAll: protectedProcedure.mutation(() => {
13145
13050
  kanbanQueue.stopAll();
13146
13051
  return { ok: true };
13147
13052
  }),
13148
- setMaxConcurrent: protectedProcedure.input(z22.object({ max: z22.number().int().min(1).max(20) })).mutation(({ input }) => {
13053
+ setMaxConcurrent: protectedProcedure.input(z21.object({ max: z21.number().int().min(1).max(20) })).mutation(({ input }) => {
13149
13054
  kanbanQueue.setMaxConcurrent(input.max);
13150
13055
  return kanbanQueue.getState();
13151
13056
  }),
@@ -13179,12 +13084,12 @@ var kanbanQueueRouter = router({
13179
13084
  });
13180
13085
 
13181
13086
  // ../server/src/trpc/routers/kanban.ts
13182
- import { mkdir as mkdir17, readdir as readdir6, rm as rm4, stat as stat5, writeFile as writeFile15 } from "fs/promises";
13087
+ import { mkdir as mkdir16, readdir as readdir5, rm as rm3, stat as stat5, writeFile as writeFile14 } from "fs/promises";
13183
13088
  import { createHash } from "crypto";
13184
13089
  import { tmpdir } from "os";
13185
- import { join as join20 } from "path";
13186
- import { z as z23 } from "zod";
13187
- import { TRPCError as TRPCError18 } from "@trpc/server";
13090
+ import { join as join19 } from "path";
13091
+ import { z as z22 } from "zod";
13092
+ import { TRPCError as TRPCError19 } from "@trpc/server";
13188
13093
  function summarizeCard(card, boardId, columnTitle) {
13189
13094
  return {
13190
13095
  boardId,
@@ -13233,37 +13138,37 @@ function safeDecode(value) {
13233
13138
  }
13234
13139
  var MAX_ATTACHMENT_BYTES = 55 * 1024 * 1024;
13235
13140
  function attachmentCacheDir() {
13236
- return join20(tmpdir(), "runeya-kanban-attachments");
13141
+ return join19(tmpdir(), "runeya-kanban-attachments");
13237
13142
  }
13238
13143
  var ATTACHMENT_CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
13239
13144
  async function purgeStaleAttachments(dir, ttlMs = ATTACHMENT_CACHE_TTL_MS) {
13240
13145
  try {
13241
13146
  const cutoff = Date.now() - ttlMs;
13242
- for (const name of await readdir6(dir)) {
13243
- const path = join20(dir, name);
13147
+ for (const name of await readdir5(dir)) {
13148
+ const path = join19(dir, name);
13244
13149
  const info = await stat5(path).catch(() => null);
13245
- if (info && info.mtimeMs < cutoff) await rm4(path, { force: true });
13150
+ if (info && info.mtimeMs < cutoff) await rm3(path, { force: true });
13246
13151
  }
13247
13152
  } catch {
13248
13153
  }
13249
13154
  }
13250
13155
  function attachmentCacheDirs() {
13251
- return [attachmentCacheDir(), join20(machineRoot(), "kanban-attachments")];
13156
+ return [attachmentCacheDir(), join19(machineRoot(), "kanban-attachments")];
13252
13157
  }
13253
13158
  async function storeAttachment(id, name, body, dirs = attachmentCacheDirs()) {
13254
13159
  const refusals = [];
13255
13160
  for (const dir of dirs) {
13256
13161
  try {
13257
- await mkdir17(dir, { recursive: true });
13258
- const path = join20(dir, safeLocalName(id, name));
13259
- await writeFile15(path, body);
13162
+ await mkdir16(dir, { recursive: true });
13163
+ const path = join19(dir, safeLocalName(id, name));
13164
+ await writeFile14(path, body);
13260
13165
  void purgeStaleAttachments(dir);
13261
13166
  return path;
13262
13167
  } catch (err) {
13263
13168
  refusals.push(`${dir} (${err instanceof Error ? err.message : String(err)})`);
13264
13169
  }
13265
13170
  }
13266
- throw new TRPCError18({
13171
+ throw new TRPCError19({
13267
13172
  code: "INTERNAL_SERVER_ERROR",
13268
13173
  message: `Impossible d'\xE9crire la pi\xE8ce jointe sur cette machine. Emplacements essay\xE9s : ${refusals.join(" ; ")}. V\xE9rifiez les droits d'\xE9criture, ou l'espace disque.`
13269
13174
  });
@@ -13279,9 +13184,9 @@ var kanbanRouter = router({
13279
13184
  * card graph, so listing them in full would be megabytes to answer "which
13280
13185
  * boards exist?". Use `getBoard` for the cards of one.
13281
13186
  */
13282
- listBoards: protectedProcedure.input(z23.object({
13283
- includeArchived: z23.boolean().optional(),
13284
- organizationId: z23.string().max(128).optional()
13187
+ listBoards: protectedProcedure.input(z22.object({
13188
+ includeArchived: z22.boolean().optional(),
13189
+ organizationId: z22.string().max(128).optional()
13285
13190
  }).optional()).query(async ({ input }) => {
13286
13191
  const { organizationId, boards } = await kanbanStore.list(
13287
13192
  input?.includeArchived ?? false,
@@ -13307,7 +13212,7 @@ var kanbanRouter = router({
13307
13212
  };
13308
13213
  }),
13309
13214
  /** One board: its columns, and the cards in each. */
13310
- getBoard: protectedProcedure.input(z23.object({ boardId: z23.string().max(128) })).query(async ({ input }) => {
13215
+ getBoard: protectedProcedure.input(z22.object({ boardId: z22.string().max(128) })).query(async ({ input }) => {
13311
13216
  const board = await kanbanStore.get(input.boardId);
13312
13217
  if (!board) return { board: null };
13313
13218
  const { links } = await kanbanStore.cardLinks(input.boardId);
@@ -13346,11 +13251,11 @@ var kanbanRouter = router({
13346
13251
  * organization — or one board when `boardId` is given. Archived boards are
13347
13252
  * left out: they are what the team decided to stop looking at.
13348
13253
  */
13349
- searchCards: protectedProcedure.input(z23.object({
13350
- query: z23.string().min(1).max(256),
13351
- boardId: z23.string().max(128).optional(),
13352
- limit: z23.number().int().min(1).max(100).optional(),
13353
- organizationId: z23.string().max(128).optional()
13254
+ searchCards: protectedProcedure.input(z22.object({
13255
+ query: z22.string().min(1).max(256),
13256
+ boardId: z22.string().max(128).optional(),
13257
+ limit: z22.number().int().min(1).max(100).optional(),
13258
+ organizationId: z22.string().max(128).optional()
13354
13259
  })).query(async ({ input }) => {
13355
13260
  const needle = normalize(input.query);
13356
13261
  const ids = input.boardId ? [input.boardId] : (await kanbanStore.list(false, input.organizationId)).boards.map((b) => b.id);
@@ -13369,10 +13274,10 @@ var kanbanRouter = router({
13369
13274
  * qu'un `commentCount`, et rien n'en donnait le texte. Cette route est la
13370
13275
  * relecture, pour une seule carte : c'est le journal qui pèse, pas le reste.
13371
13276
  */
13372
- getCardComments: protectedProcedure.input(z23.object({
13373
- boardId: z23.string().max(128),
13374
- cardId: z23.string().max(128),
13375
- limit: z23.number().int().min(1).max(200).optional()
13277
+ getCardComments: protectedProcedure.input(z22.object({
13278
+ boardId: z22.string().max(128),
13279
+ cardId: z22.string().max(128),
13280
+ limit: z22.number().int().min(1).max(200).optional()
13376
13281
  })).query(async ({ input }) => {
13377
13282
  const history = await kanbanStore.cardHistory(input.boardId, input.cardId);
13378
13283
  const comments = history.filter((e) => e.type === "comment");
@@ -13401,18 +13306,18 @@ var kanbanRouter = router({
13401
13306
  * `getBoard` en donne déjà l'essentiel carte par carte ; cette route sert
13402
13307
  * quand c'est l'arbre lui-même qu'on veut, dates et auteurs compris.
13403
13308
  */
13404
- getCardLinks: protectedProcedure.input(z23.object({ boardId: z23.string().max(128) })).query(async ({ input }) => kanbanStore.cardLinks(input.boardId)),
13309
+ getCardLinks: protectedProcedure.input(z22.object({ boardId: z22.string().max(128) })).query(async ({ input }) => kanbanStore.cardLinks(input.boardId)),
13405
13310
  /**
13406
13311
  * Rattacher une carte à une carte parente, ou l'en détacher.
13407
13312
  *
13408
13313
  * Sans `parentCardId`, le lien est retiré. Le parent peut vivre sur un autre
13409
13314
  * tableau : `parentBoardId` le désigne alors, sinon c'est celui de la carte.
13410
13315
  */
13411
- setCardParent: protectedProcedure.input(z23.object({
13412
- boardId: z23.string().max(128),
13413
- cardId: z23.string().max(128),
13414
- parentCardId: z23.string().max(128).optional(),
13415
- parentBoardId: z23.string().max(128).optional()
13316
+ setCardParent: protectedProcedure.input(z22.object({
13317
+ boardId: z22.string().max(128),
13318
+ cardId: z22.string().max(128),
13319
+ parentCardId: z22.string().max(128).optional(),
13320
+ parentBoardId: z22.string().max(128).optional()
13416
13321
  })).mutation(async ({ input }) => {
13417
13322
  const ok = await kanbanStore.setCardParent(
13418
13323
  input.boardId,
@@ -13420,35 +13325,35 @@ var kanbanRouter = router({
13420
13325
  input.parentCardId ? { boardId: input.parentBoardId ?? input.boardId, cardId: input.parentCardId } : null
13421
13326
  );
13422
13327
  if (!ok) {
13423
- throw new TRPCError18({ code: "BAD_REQUEST", message: "The cloud refused the link (unknown card, or a cycle)." });
13328
+ throw new TRPCError19({ code: "BAD_REQUEST", message: "The cloud refused the link (unknown card, or a cycle)." });
13424
13329
  }
13425
13330
  return { ok: true };
13426
13331
  }),
13427
- moveCard: protectedProcedure.input(z23.object({
13428
- boardId: z23.string().max(128),
13429
- cardId: z23.string().max(128),
13430
- targetColumn: z23.string().max(256)
13332
+ moveCard: protectedProcedure.input(z22.object({
13333
+ boardId: z22.string().max(128),
13334
+ cardId: z22.string().max(128),
13335
+ targetColumn: z22.string().max(256)
13431
13336
  })).mutation(async ({ input }) => {
13432
13337
  await executeKanbanCommands(input.boardId, input.cardId, [
13433
13338
  { type: "move_card", columnTitle: input.targetColumn }
13434
13339
  ]);
13435
13340
  return { ok: true };
13436
13341
  }),
13437
- addComment: protectedProcedure.input(z23.object({
13438
- boardId: z23.string().max(128),
13439
- cardId: z23.string().max(128),
13440
- comment: z23.string().max(2e4)
13342
+ addComment: protectedProcedure.input(z22.object({
13343
+ boardId: z22.string().max(128),
13344
+ cardId: z22.string().max(128),
13345
+ comment: z22.string().max(2e4)
13441
13346
  })).mutation(async ({ input }) => {
13442
13347
  await executeKanbanCommands(input.boardId, input.cardId, [
13443
13348
  { type: "add_comment", comment: input.comment }
13444
13349
  ]);
13445
13350
  return { ok: true };
13446
13351
  }),
13447
- addCard: protectedProcedure.input(z23.object({
13448
- boardId: z23.string().max(128),
13449
- column: z23.string().max(256),
13450
- title: z23.string().max(512),
13451
- content: z23.string().max(2e4).optional()
13352
+ addCard: protectedProcedure.input(z22.object({
13353
+ boardId: z22.string().max(128),
13354
+ column: z22.string().max(256),
13355
+ title: z22.string().max(512),
13356
+ content: z22.string().max(2e4).optional()
13452
13357
  })).mutation(async ({ input }) => {
13453
13358
  await executeKanbanBoardCommands(input.boardId, [
13454
13359
  { type: "add_card", columnTitle: input.column, cardTitle: input.title, cardContent: input.content }
@@ -13460,28 +13365,28 @@ var kanbanRouter = router({
13460
13365
  * agent can open it with its own file tools. The bytes never go through the
13461
13366
  * prompt: the card context lists the attachments, this returns a path.
13462
13367
  */
13463
- downloadAttachment: protectedProcedure.input(z23.object({ attachmentId: z23.string().max(128) })).mutation(async ({ input }) => {
13368
+ downloadAttachment: protectedProcedure.input(z22.object({ attachmentId: z22.string().max(128) })).mutation(async ({ input }) => {
13464
13369
  const id = input.attachmentId;
13465
13370
  if (!ATTACHMENT_ID_REGEX.test(id)) {
13466
- throw new TRPCError18({ code: "BAD_REQUEST", message: "Invalid attachment id" });
13371
+ throw new TRPCError19({ code: "BAD_REQUEST", message: "Invalid attachment id" });
13467
13372
  }
13468
13373
  const res = await cloudFetch2(`/api/kanban/file/${id}`, { timeoutMs: 12e4 });
13469
13374
  if (res.status === 404) {
13470
- throw new TRPCError18({ code: "NOT_FOUND", message: `Attachment ${id} not found` });
13375
+ throw new TRPCError19({ code: "NOT_FOUND", message: `Attachment ${id} not found` });
13471
13376
  }
13472
13377
  if (!res.ok) {
13473
- throw new TRPCError18({
13378
+ throw new TRPCError19({
13474
13379
  code: res.status === 403 ? "FORBIDDEN" : "INTERNAL_SERVER_ERROR",
13475
13380
  message: `Cloud refused the attachment (HTTP ${res.status})`
13476
13381
  });
13477
13382
  }
13478
13383
  const declared = Number(res.headers.get("content-length") ?? 0);
13479
13384
  if (declared > MAX_ATTACHMENT_BYTES) {
13480
- throw new TRPCError18({ code: "PAYLOAD_TOO_LARGE", message: "Attachment too large to download" });
13385
+ throw new TRPCError19({ code: "PAYLOAD_TOO_LARGE", message: "Attachment too large to download" });
13481
13386
  }
13482
13387
  const body = Buffer.from(await res.arrayBuffer());
13483
13388
  if (body.length > MAX_ATTACHMENT_BYTES) {
13484
- throw new TRPCError18({ code: "PAYLOAD_TOO_LARGE", message: "Attachment too large to download" });
13389
+ throw new TRPCError19({ code: "PAYLOAD_TOO_LARGE", message: "Attachment too large to download" });
13485
13390
  }
13486
13391
  const contentType = res.headers.get("content-type") ?? "application/octet-stream";
13487
13392
  const disposition = res.headers.get("content-disposition") ?? "";
@@ -13493,20 +13398,21 @@ var kanbanRouter = router({
13493
13398
  });
13494
13399
 
13495
13400
  // ../server/src/trpc/routers/terminal.ts
13496
- import { z as z24 } from "zod";
13497
- import { TRPCError as TRPCError19 } from "@trpc/server";
13401
+ import { z as z23 } from "zod";
13402
+ import { TRPCError as TRPCError20 } from "@trpc/server";
13498
13403
  var terminalRouter = router({
13499
13404
  /** Create a PTY shell session on the target agent */
13500
- create: protectedProcedure.input(z24.object({
13501
- agentId: z24.string().max(128),
13502
- cwd: z24.string().max(512).optional(),
13405
+ create: protectedProcedure.input(z23.object({
13406
+ agentId: z23.string().max(128),
13407
+ cwd: z23.string().max(512).optional(),
13503
13408
  /** Anchors the terminal when no explicit cwd is given. */
13504
- serviceId: z24.string().max(128).optional(),
13505
- projectId: z24.string().max(128).optional(),
13409
+ serviceId: z23.string().max(128).optional(),
13410
+ projectId: z23.string().max(128).optional(),
13506
13411
  /** L'organisation du projet : un id seul peut en nommer un par organisation. */
13507
- orgId: z24.string().max(128).nullable().optional(),
13508
- cols: z24.number().int().min(1).max(512).optional(),
13509
- rows: z24.number().int().min(1).max(256).optional()
13412
+ orgId: z23.string().max(128).nullable().optional(),
13413
+ cols: z23.number().int().min(1).max(512).optional(),
13414
+ rows: z23.number().int().min(1).max(256).optional(),
13415
+ title: z23.string().max(128).optional()
13510
13416
  })).mutation(async ({ input }) => {
13511
13417
  const result = await agentManager.agentMutation(
13512
13418
  input.agentId,
@@ -13520,16 +13426,37 @@ var terminalRouter = router({
13520
13426
  orgId: input.orgId
13521
13427
  }),
13522
13428
  cols: input.cols,
13523
- rows: input.rows
13429
+ rows: input.rows,
13430
+ title: input.title
13524
13431
  }
13525
13432
  );
13526
13433
  return result;
13527
13434
  }),
13435
+ /** Les sessions PTY encore vivantes sur l'agent (onglets à retrouver) */
13436
+ list: protectedProcedure.input(z23.object({ agentId: z23.string().max(128) })).query(async ({ input }) => {
13437
+ return agentManager.agentQuery(
13438
+ input.agentId,
13439
+ "terminal.list"
13440
+ );
13441
+ }),
13442
+ /** Renommer un onglet */
13443
+ rename: protectedProcedure.input(z23.object({
13444
+ agentId: z23.string().max(128),
13445
+ sessionId: z23.string().max(128),
13446
+ title: z23.string().max(128)
13447
+ })).mutation(async ({ input }) => {
13448
+ await agentManager.agentMutation(
13449
+ input.agentId,
13450
+ "terminal.rename",
13451
+ { sessionId: input.sessionId, title: input.title }
13452
+ );
13453
+ return { ok: true };
13454
+ }),
13528
13455
  /** Send keystrokes / data to a PTY session */
13529
- write: protectedProcedure.input(z24.object({
13530
- agentId: z24.string().max(128),
13531
- sessionId: z24.string().max(128),
13532
- data: z24.string().max(65536)
13456
+ write: protectedProcedure.input(z23.object({
13457
+ agentId: z23.string().max(128),
13458
+ sessionId: z23.string().max(128),
13459
+ data: z23.string().max(65536)
13533
13460
  })).mutation(async ({ input }) => {
13534
13461
  await agentManager.agentMutation(
13535
13462
  input.agentId,
@@ -13539,11 +13466,11 @@ var terminalRouter = router({
13539
13466
  return { ok: true };
13540
13467
  }),
13541
13468
  /** Resize the PTY */
13542
- resize: protectedProcedure.input(z24.object({
13543
- agentId: z24.string().max(128),
13544
- sessionId: z24.string().max(128),
13545
- cols: z24.number().int().min(1).max(512),
13546
- rows: z24.number().int().min(1).max(256)
13469
+ resize: protectedProcedure.input(z23.object({
13470
+ agentId: z23.string().max(128),
13471
+ sessionId: z23.string().max(128),
13472
+ cols: z23.number().int().min(1).max(512),
13473
+ rows: z23.number().int().min(1).max(256)
13547
13474
  })).mutation(async ({ input }) => {
13548
13475
  await agentManager.agentMutation(
13549
13476
  input.agentId,
@@ -13553,9 +13480,9 @@ var terminalRouter = router({
13553
13480
  return { ok: true };
13554
13481
  }),
13555
13482
  /** Destroy a PTY session */
13556
- destroy: protectedProcedure.input(z24.object({
13557
- agentId: z24.string().max(128),
13558
- sessionId: z24.string().max(128)
13483
+ destroy: protectedProcedure.input(z23.object({
13484
+ agentId: z23.string().max(128),
13485
+ sessionId: z23.string().max(128)
13559
13486
  })).mutation(async ({ input }) => {
13560
13487
  await agentManager.agentMutation(
13561
13488
  input.agentId,
@@ -13565,9 +13492,11 @@ var terminalRouter = router({
13565
13492
  return { ok: true };
13566
13493
  }),
13567
13494
  /** Stream PTY output — proxied via AgentWSBridge dynamic subscription */
13568
- onData: protectedProcedure.input(z24.object({
13569
- agentId: z24.string().max(128),
13570
- sessionId: z24.string().max(128)
13495
+ onData: protectedProcedure.input(z23.object({
13496
+ agentId: z23.string().max(128),
13497
+ sessionId: z23.string().max(128),
13498
+ /** Rejouer l'historique de la session avant le flux temps réel. */
13499
+ replay: z23.boolean().optional()
13571
13500
  })).subscription(async function* ({ input }) {
13572
13501
  const queue = [];
13573
13502
  let resolve7 = null;
@@ -13577,7 +13506,7 @@ var terminalRouter = router({
13577
13506
  unsubscribe = agentManager.agentSubscribe(
13578
13507
  input.agentId,
13579
13508
  "terminal.onData",
13580
- { sessionId: input.sessionId },
13509
+ { sessionId: input.sessionId, replay: input.replay },
13581
13510
  (data) => {
13582
13511
  if (typeof data === "string") queue.push(data);
13583
13512
  if (resolve7) {
@@ -13594,7 +13523,7 @@ var terminalRouter = router({
13594
13523
  }
13595
13524
  );
13596
13525
  } catch (err) {
13597
- throw new TRPCError19({
13526
+ throw new TRPCError20({
13598
13527
  code: "BAD_REQUEST",
13599
13528
  message: `Cannot subscribe to terminal: ${err.message}`
13600
13529
  });
@@ -13616,11 +13545,11 @@ var terminalRouter = router({
13616
13545
  });
13617
13546
 
13618
13547
  // ../server/src/trpc/routers/utility.ts
13619
- import { z as z25 } from "zod";
13548
+ import { z as z24 } from "zod";
13620
13549
  var MAX_WAIT_MS = 5 * 60 * 1e3;
13621
13550
  var utilityRouter = router({
13622
- wait: protectedProcedure.input(z25.object({
13623
- ms: z25.number().int().min(0).max(MAX_WAIT_MS)
13551
+ wait: protectedProcedure.input(z24.object({
13552
+ ms: z24.number().int().min(0).max(MAX_WAIT_MS)
13624
13553
  })).mutation(async ({ input }) => {
13625
13554
  await new Promise((resolve7) => setTimeout(resolve7, input.ms));
13626
13555
  return { waited: input.ms };
@@ -13628,15 +13557,15 @@ var utilityRouter = router({
13628
13557
  });
13629
13558
 
13630
13559
  // ../server/src/trpc/routers/wiki.ts
13631
- import { z as z26 } from "zod";
13632
- import { TRPCError as TRPCError20 } from "@trpc/server";
13633
- import { readFile as readFile16, readdir as readdir7, stat as stat6, realpath, writeFile as writeFile16, mkdir as mkdir18, rename as rename12, rm as rm5 } from "fs/promises";
13634
- import { resolve as resolvePath, join as join21, relative, sep as sep3, dirname as dirname9 } from "path";
13635
- var SCOPE_SCHEMA = z26.union([
13636
- z26.literal("global"),
13637
- z26.string().regex(/^service:[A-Za-z0-9_-]{1,128}$/, "Invalid service scope")
13560
+ import { z as z25 } from "zod";
13561
+ import { TRPCError as TRPCError21 } from "@trpc/server";
13562
+ import { readFile as readFile15, readdir as readdir6, stat as stat6, realpath, writeFile as writeFile15, mkdir as mkdir17, rename as rename12, rm as rm4 } from "fs/promises";
13563
+ import { resolve as resolvePath, join as join20, relative, sep as sep3, dirname as dirname9 } from "path";
13564
+ var SCOPE_SCHEMA = z25.union([
13565
+ z25.literal("global"),
13566
+ z25.string().regex(/^service:[A-Za-z0-9_-]{1,128}$/, "Invalid service scope")
13638
13567
  ]);
13639
- var REL_PATH_SCHEMA = z26.string().min(1).max(512).regex(/^[A-Za-z0-9_./-]+$/).refine((p) => !p.includes("..") && !p.startsWith("/"), {
13568
+ var REL_PATH_SCHEMA = z25.string().min(1).max(512).regex(/^[A-Za-z0-9_./-]+$/).refine((p) => !p.includes("..") && !p.startsWith("/"), {
13640
13569
  message: "Path must be a relative path without traversal"
13641
13570
  });
13642
13571
  var MAX_FILES = 500;
@@ -13656,36 +13585,36 @@ var IGNORED_DIRS = /* @__PURE__ */ new Set([
13656
13585
  "target",
13657
13586
  "out"
13658
13587
  ]);
13659
- var DocsEntrySchema = z26.lazy(() => z26.union([
13660
- z26.object({ type: z26.literal("file"), name: z26.string(), path: z26.string() }),
13661
- z26.object({ type: z26.literal("dir"), name: z26.string(), path: z26.string(), children: z26.array(DocsEntrySchema) })
13588
+ var DocsEntrySchema = z25.lazy(() => z25.union([
13589
+ z25.object({ type: z25.literal("file"), name: z25.string(), path: z25.string() }),
13590
+ z25.object({ type: z25.literal("dir"), name: z25.string(), path: z25.string(), children: z25.array(DocsEntrySchema) })
13662
13591
  ]));
13663
13592
  async function resolveScope(scope) {
13664
13593
  if (scope === "global") {
13665
13594
  const settings = await settingsManager.getSettings();
13666
13595
  const sub = (settings.globalDocsPath?.trim() || "wiki").replace(/^[\\/]+|[\\/]+$/g, "");
13667
13596
  if (sub.includes("..") || sub.includes("\0")) {
13668
- throw new TRPCError20({ code: "BAD_REQUEST", message: "Sous-chemin invalide" });
13597
+ throw new TRPCError21({ code: "BAD_REQUEST", message: "Sous-chemin invalide" });
13669
13598
  }
13670
13599
  const dataDirAbs = resolvePath(env.DATA_DIR);
13671
- await mkdir18(dataDirAbs, { recursive: true });
13600
+ await mkdir17(dataDirAbs, { recursive: true });
13672
13601
  const base = dirname9(await realpath(dataDirAbs));
13673
13602
  const target = resolvePath(base, sub);
13674
13603
  if (target !== base && !(target + sep3).startsWith(base + sep3)) {
13675
- throw new TRPCError20({ code: "FORBIDDEN", message: "Hors du dossier de donn\xE9es du serveur" });
13604
+ throw new TRPCError21({ code: "FORBIDDEN", message: "Hors du dossier de donn\xE9es du serveur" });
13676
13605
  }
13677
- await mkdir18(target, { recursive: true });
13606
+ await mkdir17(target, { recursive: true });
13678
13607
  const root = await realpath(target);
13679
13608
  if (root !== base && !(root + sep3).startsWith(base + sep3)) {
13680
- throw new TRPCError20({ code: "FORBIDDEN", message: "Le dossier wiki r\xE9sout hors du dossier de donn\xE9es" });
13609
+ throw new TRPCError21({ code: "FORBIDDEN", message: "Le dossier wiki r\xE9sout hors du dossier de donn\xE9es" });
13681
13610
  }
13682
13611
  return { mode: "local", root };
13683
13612
  }
13684
13613
  const serviceId = scope.slice("service:".length);
13685
13614
  const service = await serviceStore.get(serviceId);
13686
- if (!service) throw new TRPCError20({ code: "NOT_FOUND", message: "Service introuvable" });
13615
+ if (!service) throw new TRPCError21({ code: "NOT_FOUND", message: "Service introuvable" });
13687
13616
  const agentId = await resolveEffectiveAgentId(service);
13688
- if (!agentId) throw new TRPCError20({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9 pour ce service" });
13617
+ if (!agentId) throw new TRPCError21({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9 pour ce service" });
13689
13618
  const cwd = await resolveWorkspaceCwd({ serviceId, override: service.docsPath?.trim() || void 0 });
13690
13619
  return { mode: "agent", agentId, cwd };
13691
13620
  }
@@ -13693,7 +13622,7 @@ async function walkLocal(root, dir, depth, counter) {
13693
13622
  if (depth > MAX_DEPTH || counter.n >= MAX_FILES) return [];
13694
13623
  let entries2;
13695
13624
  try {
13696
- entries2 = await readdir7(dir, { withFileTypes: true });
13625
+ entries2 = await readdir6(dir, { withFileTypes: true });
13697
13626
  } catch {
13698
13627
  return [];
13699
13628
  }
@@ -13701,7 +13630,7 @@ async function walkLocal(root, dir, depth, counter) {
13701
13630
  for (const e of entries2) {
13702
13631
  if (counter.n >= MAX_FILES) break;
13703
13632
  if (e.name.startsWith(".") && e.name !== ".") continue;
13704
- const abs = join21(dir, e.name);
13633
+ const abs = join20(dir, e.name);
13705
13634
  const rel = relative(root, abs).split(sep3).join("/");
13706
13635
  if (e.isDirectory()) {
13707
13636
  if (IGNORED_DIRS.has(e.name)) continue;
@@ -13720,7 +13649,7 @@ async function walkLocal(root, dir, depth, counter) {
13720
13649
  }
13721
13650
  async function resolveSafeLocal(root, relPath, requireExist) {
13722
13651
  if (relPath.includes("..") || relPath.startsWith("/")) {
13723
- throw new TRPCError20({ code: "BAD_REQUEST", message: "Chemin invalide" });
13652
+ throw new TRPCError21({ code: "BAD_REQUEST", message: "Chemin invalide" });
13724
13653
  }
13725
13654
  const target = resolvePath(root, relPath);
13726
13655
  if (requireExist) {
@@ -13728,10 +13657,10 @@ async function resolveSafeLocal(root, relPath, requireExist) {
13728
13657
  try {
13729
13658
  real = await realpath(target);
13730
13659
  } catch {
13731
- throw new TRPCError20({ code: "NOT_FOUND", message: "Chemin introuvable" });
13660
+ throw new TRPCError21({ code: "NOT_FOUND", message: "Chemin introuvable" });
13732
13661
  }
13733
13662
  if (real !== root && !(real + sep3).startsWith(root + sep3)) {
13734
- throw new TRPCError20({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
13663
+ throw new TRPCError21({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
13735
13664
  }
13736
13665
  return real;
13737
13666
  }
@@ -13743,12 +13672,12 @@ async function resolveSafeLocal(root, relPath, requireExist) {
13743
13672
  realParent = parent;
13744
13673
  }
13745
13674
  if (realParent !== root && !(realParent + sep3).startsWith(root + sep3)) {
13746
- throw new TRPCError20({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
13675
+ throw new TRPCError21({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
13747
13676
  }
13748
13677
  return resolvePath(realParent, target.slice(parent.length).replace(/^[\\/]+/, ""));
13749
13678
  }
13750
13679
  var wikiRouter = router({
13751
- list: protectedProcedure.input(z26.object({ scope: SCOPE_SCHEMA })).output(z26.object({ root: z26.string(), entries: z26.array(DocsEntrySchema), truncated: z26.boolean() })).query(async ({ input }) => {
13680
+ list: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA })).output(z25.object({ root: z25.string(), entries: z25.array(DocsEntrySchema), truncated: z25.boolean() })).query(async ({ input }) => {
13752
13681
  const target = await resolveScope(input.scope);
13753
13682
  if (target.mode === "agent") {
13754
13683
  return agentManager.agentQuery(target.agentId, "wiki.listRepoMarkdown", { cwd: target.cwd });
@@ -13757,9 +13686,9 @@ var wikiRouter = router({
13757
13686
  const entries2 = await walkLocal(target.root, target.root, 0, counter);
13758
13687
  return { root: target.root, entries: entries2, truncated: counter.n >= MAX_FILES };
13759
13688
  }),
13760
- read: protectedProcedure.input(z26.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).output(z26.object({ path: z26.string(), content: z26.string() })).query(async ({ input }) => {
13689
+ read: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).output(z25.object({ path: z25.string(), content: z25.string() })).query(async ({ input }) => {
13761
13690
  if (!/\.(md|markdown)$/i.test(input.path)) {
13762
- throw new TRPCError20({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
13691
+ throw new TRPCError21({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
13763
13692
  }
13764
13693
  const target = await resolveScope(input.scope);
13765
13694
  if (target.mode === "agent") {
@@ -13767,27 +13696,27 @@ var wikiRouter = router({
13767
13696
  }
13768
13697
  const file = await resolveSafeLocal(target.root, input.path, true);
13769
13698
  const s = await stat6(file);
13770
- if (!s.isFile()) throw new TRPCError20({ code: "BAD_REQUEST", message: "Pas un fichier" });
13771
- if (s.size > MAX_FILE_BYTES) throw new TRPCError20({ code: "PAYLOAD_TOO_LARGE", message: "Fichier trop volumineux" });
13772
- const content = await readFile16(file, "utf-8");
13699
+ if (!s.isFile()) throw new TRPCError21({ code: "BAD_REQUEST", message: "Pas un fichier" });
13700
+ if (s.size > MAX_FILE_BYTES) throw new TRPCError21({ code: "PAYLOAD_TOO_LARGE", message: "Fichier trop volumineux" });
13701
+ const content = await readFile15(file, "utf-8");
13773
13702
  return { path: input.path, content };
13774
13703
  }),
13775
- write: protectedProcedure.input(z26.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA, content: z26.string().max(5e6) })).mutation(async ({ input }) => {
13704
+ write: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA, content: z25.string().max(5e6) })).mutation(async ({ input }) => {
13776
13705
  if (!/\.(md|markdown)$/i.test(input.path)) {
13777
- throw new TRPCError20({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
13706
+ throw new TRPCError21({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
13778
13707
  }
13779
13708
  const target = await resolveScope(input.scope);
13780
13709
  if (target.mode === "agent") {
13781
13710
  return agentManager.agentMutation(target.agentId, "wiki.writeMarkdown", { cwd: target.cwd, path: input.path, content: input.content });
13782
13711
  }
13783
13712
  const file = await resolveSafeLocal(target.root, input.path, false);
13784
- await mkdir18(dirname9(file), { recursive: true });
13785
- await writeFile16(file, input.content, "utf-8");
13713
+ await mkdir17(dirname9(file), { recursive: true });
13714
+ await writeFile15(file, input.content, "utf-8");
13786
13715
  return { path: input.path, ok: true };
13787
13716
  }),
13788
- createFile: protectedProcedure.input(z26.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
13717
+ createFile: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
13789
13718
  if (!/\.(md|markdown)$/i.test(input.path)) {
13790
- throw new TRPCError20({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
13719
+ throw new TRPCError21({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
13791
13720
  }
13792
13721
  const target = await resolveScope(input.scope);
13793
13722
  if (target.mode === "agent") {
@@ -13796,24 +13725,24 @@ var wikiRouter = router({
13796
13725
  const file = await resolveSafeLocal(target.root, input.path, false);
13797
13726
  try {
13798
13727
  await stat6(file);
13799
- throw new TRPCError20({ code: "CONFLICT", message: "Fichier d\xE9j\xE0 existant" });
13728
+ throw new TRPCError21({ code: "CONFLICT", message: "Fichier d\xE9j\xE0 existant" });
13800
13729
  } catch (err) {
13801
- if (err instanceof TRPCError20) throw err;
13730
+ if (err instanceof TRPCError21) throw err;
13802
13731
  }
13803
- await mkdir18(dirname9(file), { recursive: true });
13804
- await writeFile16(file, "", "utf-8");
13732
+ await mkdir17(dirname9(file), { recursive: true });
13733
+ await writeFile15(file, "", "utf-8");
13805
13734
  return { path: input.path, ok: true };
13806
13735
  }),
13807
- createDir: protectedProcedure.input(z26.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
13736
+ createDir: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
13808
13737
  const target = await resolveScope(input.scope);
13809
13738
  if (target.mode === "agent") {
13810
13739
  return agentManager.agentMutation(target.agentId, "wiki.createDir", { cwd: target.cwd, path: input.path });
13811
13740
  }
13812
13741
  const dir = await resolveSafeLocal(target.root, input.path, false);
13813
- await mkdir18(dir, { recursive: true });
13742
+ await mkdir17(dir, { recursive: true });
13814
13743
  return { path: input.path, ok: true };
13815
13744
  }),
13816
- rename: protectedProcedure.input(z26.object({ scope: SCOPE_SCHEMA, fromPath: REL_PATH_SCHEMA, toPath: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
13745
+ rename: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, fromPath: REL_PATH_SCHEMA, toPath: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
13817
13746
  const target = await resolveScope(input.scope);
13818
13747
  if (target.mode === "agent") {
13819
13748
  return agentManager.agentMutation(target.agentId, "wiki.renamePath", { cwd: target.cwd, fromPath: input.fromPath, toPath: input.toPath });
@@ -13822,35 +13751,35 @@ var wikiRouter = router({
13822
13751
  const to = await resolveSafeLocal(target.root, input.toPath, false);
13823
13752
  try {
13824
13753
  await stat6(to);
13825
- throw new TRPCError20({ code: "CONFLICT", message: "La cible existe d\xE9j\xE0" });
13754
+ throw new TRPCError21({ code: "CONFLICT", message: "La cible existe d\xE9j\xE0" });
13826
13755
  } catch (err) {
13827
- if (err instanceof TRPCError20) throw err;
13756
+ if (err instanceof TRPCError21) throw err;
13828
13757
  }
13829
- await mkdir18(dirname9(to), { recursive: true });
13758
+ await mkdir17(dirname9(to), { recursive: true });
13830
13759
  await rename12(from, to);
13831
13760
  return { fromPath: input.fromPath, toPath: input.toPath, ok: true };
13832
13761
  }),
13833
- ensureRoot: protectedProcedure.input(z26.object({ scope: SCOPE_SCHEMA })).mutation(async ({ input }) => {
13762
+ ensureRoot: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA })).mutation(async ({ input }) => {
13834
13763
  if (input.scope === "global") {
13835
13764
  await resolveScope("global");
13836
13765
  return { ok: true };
13837
13766
  }
13838
13767
  const serviceId = input.scope.slice("service:".length);
13839
13768
  const service = await serviceStore.get(serviceId);
13840
- if (!service) throw new TRPCError20({ code: "NOT_FOUND", message: "Service introuvable" });
13769
+ if (!service) throw new TRPCError21({ code: "NOT_FOUND", message: "Service introuvable" });
13841
13770
  const agentId = await resolveEffectiveAgentId(service);
13842
- if (!agentId) throw new TRPCError20({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9" });
13771
+ if (!agentId) throw new TRPCError21({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9" });
13843
13772
  const cwd = await resolveWorkspaceCwd({ serviceId, override: service.docsPath?.trim() || void 0 });
13844
13773
  return agentManager.agentMutation(agentId, "wiki.ensureRoot", { cwd });
13845
13774
  }),
13846
- delete: protectedProcedure.input(z26.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
13775
+ delete: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
13847
13776
  const target = await resolveScope(input.scope);
13848
13777
  if (target.mode === "agent") {
13849
13778
  return agentManager.agentMutation(target.agentId, "wiki.deletePath", { cwd: target.cwd, path: input.path });
13850
13779
  }
13851
13780
  const fp = await resolveSafeLocal(target.root, input.path, true);
13852
- if (fp === target.root) throw new TRPCError20({ code: "FORBIDDEN", message: "Impossible de supprimer la racine" });
13853
- await rm5(fp, { recursive: true, force: true });
13781
+ if (fp === target.root) throw new TRPCError21({ code: "FORBIDDEN", message: "Impossible de supprimer la racine" });
13782
+ await rm4(fp, { recursive: true, force: true });
13854
13783
  return { path: input.path, ok: true };
13855
13784
  })
13856
13785
  });
@@ -13869,14 +13798,14 @@ var configRouter = router({
13869
13798
  });
13870
13799
 
13871
13800
  // ../server/src/trpc/routers/cloud-sync.ts
13872
- import { z as z27 } from "zod";
13873
- import { TRPCError as TRPCError21 } from "@trpc/server";
13801
+ import { z as z26 } from "zod";
13802
+ import { TRPCError as TRPCError22 } from "@trpc/server";
13874
13803
 
13875
13804
  // ../server/src/services/org-sync-scope.ts
13876
13805
  import { access as access2 } from "fs/promises";
13877
- import { join as join22 } from "path";
13806
+ import { join as join21 } from "path";
13878
13807
  async function isMaterialized(root) {
13879
- return access2(join22(root, "project.json")).then(() => true, () => false);
13808
+ return access2(join21(root, "project.json")).then(() => true, () => false);
13880
13809
  }
13881
13810
  async function orgsToSync() {
13882
13811
  const cloudUrl = getCloudApiUrl();
@@ -13938,16 +13867,16 @@ async function reconcileOrgCanary(orgId) {
13938
13867
 
13939
13868
  // ../server/src/services/cloud-sync-bridge.ts
13940
13869
  import { randomUUID as randomUUID11 } from "crypto";
13941
- import { mkdir as mkdir20, rm as rm6 } from "fs/promises";
13870
+ import { mkdir as mkdir19, rm as rm5 } from "fs/promises";
13942
13871
  import * as Y from "yjs";
13943
13872
 
13944
13873
  // ../server/src/services/org-lock.ts
13945
- import { open as open2, readFile as readFile17, unlink as unlink4, mkdir as mkdir19 } from "fs/promises";
13874
+ import { open as open2, readFile as readFile16, unlink as unlink4, mkdir as mkdir18 } from "fs/promises";
13946
13875
  import { readFileSync, unlinkSync } from "fs";
13947
- import { join as join23 } from "path";
13876
+ import { join as join22 } from "path";
13948
13877
  var held = /* @__PURE__ */ new Set();
13949
13878
  function lockPath(orgId) {
13950
- return join23(orgVaultRoot(orgId), "org.lock");
13879
+ return join22(orgVaultRoot(orgId), "org.lock");
13951
13880
  }
13952
13881
  function isRunning(pid) {
13953
13882
  if (!Number.isInteger(pid) || pid <= 0) return false;
@@ -13960,7 +13889,7 @@ function isRunning(pid) {
13960
13889
  }
13961
13890
  async function readLock(path) {
13962
13891
  try {
13963
- const parsed = JSON.parse(await readFile17(path, "utf-8"));
13892
+ const parsed = JSON.parse(await readFile16(path, "utf-8"));
13964
13893
  return typeof parsed?.pid === "number" ? parsed : null;
13965
13894
  } catch {
13966
13895
  return null;
@@ -13968,7 +13897,7 @@ async function readLock(path) {
13968
13897
  }
13969
13898
  async function acquireOrgLock(orgId) {
13970
13899
  const path = lockPath(orgId);
13971
- await mkdir19(orgVaultRoot(orgId), { recursive: true });
13900
+ await mkdir18(orgVaultRoot(orgId), { recursive: true });
13972
13901
  for (let attempt = 0; attempt < 2; attempt++) {
13973
13902
  try {
13974
13903
  const handle = await open2(path, "wx");
@@ -14379,7 +14308,7 @@ var OrgSyncConnection = class {
14379
14308
  }
14380
14309
  const isLocal = existing?.orgId === this.link.orgId;
14381
14310
  if (!inDoc && !isLocal) return false;
14382
- await mkdir20(projectVaultRoot(this.link.orgId, projectId), { recursive: true });
14311
+ await mkdir19(projectVaultRoot(this.link.orgId, projectId), { recursive: true });
14383
14312
  this.tracked.add(projectId);
14384
14313
  if (inDoc) await this.pullFromDoc([projectId]);
14385
14314
  else await this.reconcileLocalToDoc();
@@ -14395,7 +14324,7 @@ var OrgSyncConnection = class {
14395
14324
  async unfollowProject(projectId) {
14396
14325
  this.tracked.delete(projectId);
14397
14326
  await projectStore.forgetLocally({ id: projectId, orgId: this.link.orgId });
14398
- await rm6(projectVaultRoot(this.link.orgId, projectId), { recursive: true, force: true }).catch(() => {
14327
+ await rm5(projectVaultRoot(this.link.orgId, projectId), { recursive: true, force: true }).catch(() => {
14399
14328
  });
14400
14329
  }
14401
14330
  /**
@@ -14755,8 +14684,8 @@ var CloudSyncBridge = class {
14755
14684
  var cloudSyncBridge = new CloudSyncBridge();
14756
14685
 
14757
14686
  // ../server/src/services/key-adoption.ts
14758
- import { readdir as readdir8, readFile as readFile18, writeFile as writeFile17, mkdir as mkdir21, copyFile, rename as rename13, stat as stat7 } from "fs/promises";
14759
- import { join as join24 } from "path";
14687
+ import { readdir as readdir7, readFile as readFile17, writeFile as writeFile16, mkdir as mkdir20, copyFile, rename as rename13, stat as stat7 } from "fs/promises";
14688
+ import { join as join23 } from "path";
14760
14689
  import { createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2, randomBytes as randomBytes5 } from "crypto";
14761
14690
  var ALGORITHM = "aes-256-gcm";
14762
14691
  function isAgentTriplet(value) {
@@ -14813,7 +14742,7 @@ async function rootsOfOrg(orgId) {
14813
14742
  }
14814
14743
  async function jsonFilesIn(root) {
14815
14744
  try {
14816
- const entries2 = await readdir8(root, { withFileTypes: true });
14745
+ const entries2 = await readdir7(root, { withFileTypes: true });
14817
14746
  return entries2.filter((e) => e.isFile() && e.name.endsWith(".json")).map((e) => e.name);
14818
14747
  } catch {
14819
14748
  return [];
@@ -14836,10 +14765,10 @@ async function adoptOrgKey(orgId, newKey, masterPassword, now) {
14836
14765
  const touchedRoots = /* @__PURE__ */ new Set();
14837
14766
  for (const vaultRoot of await rootsOfOrg(orgId)) {
14838
14767
  for (const name of await jsonFilesIn(vaultRoot)) {
14839
- const path = join24(vaultRoot, name);
14768
+ const path = join23(vaultRoot, name);
14840
14769
  let parsed;
14841
14770
  try {
14842
- parsed = JSON.parse(await readFile18(path, "utf-8"));
14771
+ parsed = JSON.parse(await readFile17(path, "utf-8"));
14843
14772
  } catch {
14844
14773
  continue;
14845
14774
  }
@@ -14853,21 +14782,21 @@ async function adoptOrgKey(orgId, newKey, masterPassword, now) {
14853
14782
  const stamp = now.toISOString().replace(/[:.]/g, "-").substring(0, 19);
14854
14783
  const backups = [];
14855
14784
  for (const vaultRoot of touchedRoots) {
14856
- const backupDir = join24(vaultRoot, `backup-key-${stamp}`);
14857
- await mkdir21(backupDir, { recursive: true });
14785
+ const backupDir = join23(vaultRoot, `backup-key-${stamp}`);
14786
+ await mkdir20(backupDir, { recursive: true });
14858
14787
  for (const name of await jsonFilesIn(vaultRoot)) {
14859
- await copyFile(join24(vaultRoot, name), join24(backupDir, name));
14788
+ await copyFile(join23(vaultRoot, name), join23(backupDir, name));
14860
14789
  }
14861
14790
  for (const name of [".encryption.key.enc", ".runeya-verify"]) {
14862
- if (await exists(join24(vaultRoot, name))) {
14863
- await copyFile(join24(vaultRoot, name), join24(backupDir, name));
14791
+ if (await exists(join23(vaultRoot, name))) {
14792
+ await copyFile(join23(vaultRoot, name), join23(backupDir, name));
14864
14793
  }
14865
14794
  }
14866
14795
  backups.push(backupDir);
14867
14796
  }
14868
14797
  for (const item of pending) {
14869
14798
  const tmp = item.path + ".tmp";
14870
- await writeFile17(tmp, item.content, "utf-8");
14799
+ await writeFile16(tmp, item.content, "utf-8");
14871
14800
  await rename13(tmp, item.path);
14872
14801
  }
14873
14802
  await installOrgKey(orgId, newKey, masterPassword);
@@ -14899,7 +14828,7 @@ async function assertOrgReadable(orgId) {
14899
14828
  await assertOrgVaultReadable(orgId);
14900
14829
  } catch (err) {
14901
14830
  if (err instanceof OrgVaultUnreadableError) {
14902
- throw new TRPCError21({ code: "FORBIDDEN", message: err.message });
14831
+ throw new TRPCError22({ code: "FORBIDDEN", message: err.message });
14903
14832
  }
14904
14833
  throw err;
14905
14834
  }
@@ -14909,10 +14838,10 @@ async function assertOrgKey(orgId) {
14909
14838
  await reconcileOrgCanary(orgId);
14910
14839
  } catch (err) {
14911
14840
  if (err instanceof OrgKeyMismatchError) {
14912
- throw new TRPCError21({ code: "FORBIDDEN", message: err.message });
14841
+ throw new TRPCError22({ code: "FORBIDDEN", message: err.message });
14913
14842
  }
14914
14843
  if (err instanceof CanaryUnavailableError) {
14915
- throw new TRPCError21({ code: "PRECONDITION_FAILED", message: err.message });
14844
+ throw new TRPCError22({ code: "PRECONDITION_FAILED", message: err.message });
14916
14845
  }
14917
14846
  throw err;
14918
14847
  }
@@ -14929,10 +14858,10 @@ var cloudSyncRouter = router({
14929
14858
  * "open this project" is the whole gesture.
14930
14859
  */
14931
14860
  trackProject: protectedProcedure.input(
14932
- z27.object({
14933
- orgId: z27.string().min(1).max(128),
14934
- cloudUrl: z27.string().url().max(2048),
14935
- projectId: z27.string().min(1).max(128)
14861
+ z26.object({
14862
+ orgId: z26.string().min(1).max(128),
14863
+ cloudUrl: z26.string().url().max(2048),
14864
+ projectId: z26.string().min(1).max(128)
14936
14865
  })
14937
14866
  ).mutation(async ({ input }) => {
14938
14867
  await assertOrgReadable(input.orgId);
@@ -14947,7 +14876,7 @@ var cloudSyncRouter = router({
14947
14876
  return { pulled, state: syncState(input.orgId) };
14948
14877
  } catch (err) {
14949
14878
  if (err instanceof ProjectHeldElsewhereError) {
14950
- throw new TRPCError21({ code: "CONFLICT", message: err.code, cause: err });
14879
+ throw new TRPCError22({ code: "CONFLICT", message: err.code, cause: err });
14951
14880
  }
14952
14881
  throw err;
14953
14882
  }
@@ -14966,18 +14895,18 @@ var cloudSyncRouter = router({
14966
14895
  * fusionné.
14967
14896
  */
14968
14897
  publishProject: protectedProcedure.input(
14969
- z27.object({
14970
- orgId: z27.string().min(1).max(128),
14971
- cloudUrl: z27.string().url().max(2048),
14972
- projectId: z27.string().min(1).max(128)
14898
+ z26.object({
14899
+ orgId: z26.string().min(1).max(128),
14900
+ cloudUrl: z26.string().url().max(2048),
14901
+ projectId: z26.string().min(1).max(128)
14973
14902
  })
14974
14903
  ).mutation(async ({ input }) => {
14975
14904
  const local = await projectStore.get({ id: input.projectId, orgId: null });
14976
14905
  if (!local) {
14977
- throw new TRPCError21({ code: "NOT_FOUND", message: "PROJECT_NOT_LOCAL" });
14906
+ throw new TRPCError22({ code: "NOT_FOUND", message: "PROJECT_NOT_LOCAL" });
14978
14907
  }
14979
14908
  if (await projectStore.get({ id: input.projectId, orgId: input.orgId })) {
14980
- throw new TRPCError21({ code: "CONFLICT", message: "PROJECT_ALREADY_IN_ORG" });
14909
+ throw new TRPCError22({ code: "CONFLICT", message: "PROJECT_ALREADY_IN_ORG" });
14981
14910
  }
14982
14911
  await assertOrgReadable(input.orgId);
14983
14912
  const connected = cloudSyncBridge.states().some((s) => s.orgId === input.orgId);
@@ -14996,7 +14925,7 @@ var cloudSyncRouter = router({
14996
14925
  await cloudSyncBridge.followProject(input.orgId, input.projectId);
14997
14926
  } catch (err) {
14998
14927
  if (err instanceof ProjectHeldElsewhereError) {
14999
- throw new TRPCError21({ code: "CONFLICT", message: err.code, cause: err });
14928
+ throw new TRPCError22({ code: "CONFLICT", message: err.code, cause: err });
15000
14929
  }
15001
14930
  throw err;
15002
14931
  }
@@ -15010,16 +14939,16 @@ var cloudSyncRouter = router({
15010
14939
  * publié. Le cloud, lui, ne peut pas répondre — il n'a que du chiffré sous
15011
14940
  * les yeux — donc le canari est rapatrié et jugé ici.
15012
14941
  */
15013
- checkOrgKey: protectedProcedure.input(z27.object({
15014
- orgId: z27.string().min(1).max(128),
15015
- keyHex: z27.string().length(64).regex(/^[0-9a-f]+$/i)
14942
+ checkOrgKey: protectedProcedure.input(z26.object({
14943
+ orgId: z26.string().min(1).max(128),
14944
+ keyHex: z26.string().length(64).regex(/^[0-9a-f]+$/i)
15016
14945
  })).query(async ({ input }) => {
15017
14946
  const res = await cloudFetch2(
15018
14947
  `/api/auth/organization/canary?organizationId=${encodeURIComponent(input.orgId)}`,
15019
14948
  { method: "GET" }
15020
14949
  );
15021
14950
  if (!res.ok) {
15022
- throw new TRPCError21({ code: "BAD_GATEWAY", message: await cloudMessage(res) || `CANARY_READ_FAILED (${res.status})` });
14951
+ throw new TRPCError22({ code: "BAD_GATEWAY", message: await cloudMessage(res) || `CANARY_READ_FAILED (${res.status})` });
15023
14952
  }
15024
14953
  const { canary } = await res.json();
15025
14954
  if (typeof canary !== "string") return { matches: false, published: false };
@@ -15035,10 +14964,10 @@ var cloudSyncRouter = router({
15035
14964
  * Bornée au coffre de l'organisation et à ceux de ses projets : les autres
15036
14965
  * organisations et la machine gardent leur clé.
15037
14966
  */
15038
- adoptOrgKey: protectedProcedure.input(z27.object({
15039
- orgId: z27.string().min(1).max(128),
15040
- keyHex: z27.string().length(64).regex(/^[0-9a-f]+$/i),
15041
- masterPassword: z27.string().min(1).max(1024)
14967
+ adoptOrgKey: protectedProcedure.input(z26.object({
14968
+ orgId: z26.string().min(1).max(128),
14969
+ keyHex: z26.string().length(64).regex(/^[0-9a-f]+$/i),
14970
+ masterPassword: z26.string().min(1).max(1024)
15042
14971
  })).mutation(async ({ input }) => {
15043
14972
  const report = await adoptOrgKey(
15044
14973
  input.orgId,
@@ -15062,10 +14991,10 @@ var cloudSyncRouter = router({
15062
14991
  * Elle ne re-chiffre rien : ce qui a déjà été synchronisé sous l'ancienne clé
15063
14992
  * reste illisible. L'interface le dit avant de la déclencher.
15064
14993
  */
15065
- resetOrgKey: protectedProcedure.input(z27.object({ orgId: z27.string().min(1).max(128) })).mutation(async ({ input }) => {
14994
+ resetOrgKey: protectedProcedure.input(z26.object({ orgId: z26.string().min(1).max(128) })).mutation(async ({ input }) => {
15066
14995
  const canary = await readVerifyFile(await keyRoot());
15067
14996
  if (!canary) {
15068
- throw new TRPCError21({
14997
+ throw new TRPCError22({
15069
14998
  code: "PRECONDITION_FAILED",
15070
14999
  message: "Cette machine n'a pas encore de cl\xE9 de chiffrement."
15071
15000
  });
@@ -15076,7 +15005,7 @@ var cloudSyncRouter = router({
15076
15005
  });
15077
15006
  if (!res.ok) {
15078
15007
  const detail = await cloudMessage(res);
15079
- throw new TRPCError21({
15008
+ throw new TRPCError22({
15080
15009
  code: res.status === 403 ? "FORBIDDEN" : "BAD_GATEWAY",
15081
15010
  message: detail || `ORG_KEY_RESET_FAILED (${res.status})`
15082
15011
  });
@@ -15092,9 +15021,9 @@ var cloudSyncRouter = router({
15092
15021
  * every other member and for this one on another machine.
15093
15022
  */
15094
15023
  untrackProject: protectedProcedure.input(
15095
- z27.object({
15096
- orgId: z27.string().min(1).max(128),
15097
- projectId: z27.string().min(1).max(128)
15024
+ z26.object({
15025
+ orgId: z26.string().min(1).max(128),
15026
+ projectId: z26.string().min(1).max(128)
15098
15027
  })
15099
15028
  ).mutation(async ({ input }) => {
15100
15029
  await cloudSyncBridge.unfollowProject(input.orgId, input.projectId);
@@ -15110,9 +15039,9 @@ var cloudSyncRouter = router({
15110
15039
  * membre, ce qui évite d'effacer les fichiers si le cloud a refusé l'ordre.
15111
15040
  */
15112
15041
  deleteProjectFromOrg: protectedProcedure.input(
15113
- z27.object({
15114
- orgId: z27.string().min(1).max(128),
15115
- projectId: z27.string().min(1).max(128)
15042
+ z26.object({
15043
+ orgId: z26.string().min(1).max(128),
15044
+ projectId: z26.string().min(1).max(128)
15116
15045
  })
15117
15046
  ).mutation(async ({ input }) => {
15118
15047
  let res;
@@ -15122,8 +15051,8 @@ var cloudSyncRouter = router({
15122
15051
  body: { organizationId: input.orgId, projectId: input.projectId }
15123
15052
  });
15124
15053
  } catch (err) {
15125
- if (err instanceof TRPCError21 && err.code === "PRECONDITION_FAILED") {
15126
- throw new TRPCError21({ code: "PRECONDITION_FAILED", message: "CLOUD_NOT_LINKED" });
15054
+ if (err instanceof TRPCError22 && err.code === "PRECONDITION_FAILED") {
15055
+ throw new TRPCError22({ code: "PRECONDITION_FAILED", message: "CLOUD_NOT_LINKED" });
15127
15056
  }
15128
15057
  throw err;
15129
15058
  }
@@ -15131,12 +15060,12 @@ var cloudSyncRouter = router({
15131
15060
  const detail = await cloudMessage(res);
15132
15061
  if (res.status === 403) {
15133
15062
  const code = /not a member/i.test(detail) ? "PROJECT_NOT_MEMBER" : "PROJECT_DELETE_FORBIDDEN";
15134
- throw new TRPCError21({ code: "FORBIDDEN", message: code, cause: new Error(detail) });
15063
+ throw new TRPCError22({ code: "FORBIDDEN", message: code, cause: new Error(detail) });
15135
15064
  }
15136
15065
  if (res.status === 404) {
15137
- throw new TRPCError21({ code: "NOT_FOUND", message: "PROJECT_NOT_IN_ORG", cause: new Error(detail) });
15066
+ throw new TRPCError22({ code: "NOT_FOUND", message: "PROJECT_NOT_IN_ORG", cause: new Error(detail) });
15138
15067
  }
15139
- throw new TRPCError21({
15068
+ throw new TRPCError22({
15140
15069
  code: "BAD_GATEWAY",
15141
15070
  message: detail || `PROJECT_DELETE_FAILED (${res.status})`
15142
15071
  });
@@ -15156,10 +15085,10 @@ var cloudSyncRouter = router({
15156
15085
  * afficher. Le nom est donc recopié dans le tampon du coffre au passage, là
15157
15086
  * où il est déjà lu au démarrage suivant.
15158
15087
  */
15159
- rememberOrgNames: protectedProcedure.input(z27.object({
15160
- orgs: z27.array(z27.object({
15161
- orgId: z27.string().min(1).max(128),
15162
- name: z27.string().min(1).max(100)
15088
+ rememberOrgNames: protectedProcedure.input(z26.object({
15089
+ orgs: z26.array(z26.object({
15090
+ orgId: z26.string().min(1).max(128),
15091
+ name: z26.string().min(1).max(100)
15163
15092
  })).max(200)
15164
15093
  })).mutation(async ({ input }) => {
15165
15094
  for (const { orgId, name } of input.orgs) await rememberOrgName(orgId, name);
@@ -15193,15 +15122,15 @@ var cloudSyncRouter = router({
15193
15122
  });
15194
15123
 
15195
15124
  // ../server/src/trpc/routers/filesystem.ts
15196
- import { readdir as readdir9, stat as stat8 } from "fs/promises";
15125
+ import { readdir as readdir8, stat as stat8 } from "fs/promises";
15197
15126
  import { homedir as homedir5 } from "os";
15198
- import { isAbsolute as isAbsolute4, join as join25, resolve as resolve5, dirname as dirname10, basename as basename2 } from "path";
15199
- import { z as z28 } from "zod";
15127
+ import { isAbsolute as isAbsolute4, join as join24, resolve as resolve5, dirname as dirname10, basename as basename2 } from "path";
15128
+ import { z as z27 } from "zod";
15200
15129
  var MAX_ENTRIES2 = 500;
15201
- var PATH_SCHEMA = z28.string().min(1).max(4096);
15130
+ var PATH_SCHEMA = z27.string().min(1).max(4096);
15202
15131
  function safeResolve(input) {
15203
15132
  if (input.includes("\0")) throw new Error("Chemin invalide");
15204
- const expanded = input.startsWith("~") ? join25(homedir5(), input.slice(1)) : input;
15133
+ const expanded = input.startsWith("~") ? join24(homedir5(), input.slice(1)) : input;
15205
15134
  if (!isAbsolute4(expanded)) throw new Error("Le chemin doit \xEAtre absolu");
15206
15135
  return resolve5(expanded);
15207
15136
  }
@@ -15222,7 +15151,7 @@ var filesystemRouter = router({
15222
15151
  * Hidden entries are skipped: they are noise for choosing a workspace, and
15223
15152
  * `.runeya` itself would invite placing a project inside another's data.
15224
15153
  */
15225
- listDirectories: protectedProcedure.input(z28.object({ path: PATH_SCHEMA })).query(async ({ input }) => {
15154
+ listDirectories: protectedProcedure.input(z27.object({ path: PATH_SCHEMA })).query(async ({ input }) => {
15226
15155
  const dir = safeResolve(input.path);
15227
15156
  const info = await stat8(dir).catch(() => null);
15228
15157
  if (!info?.isDirectory()) {
@@ -15230,14 +15159,14 @@ var filesystemRouter = router({
15230
15159
  }
15231
15160
  let names;
15232
15161
  try {
15233
- names = (await readdir9(dir, { withFileTypes: true })).filter((e) => e.isDirectory() && !e.name.startsWith(".")).map((e) => e.name).sort((a, b) => a.localeCompare(b));
15162
+ names = (await readdir8(dir, { withFileTypes: true })).filter((e) => e.isDirectory() && !e.name.startsWith(".")).map((e) => e.name).sort((a, b) => a.localeCompare(b));
15234
15163
  } catch {
15235
15164
  throw new Error(`R\xE9pertoire illisible : ${dir}`);
15236
15165
  }
15237
15166
  const truncated = names.length > MAX_ENTRIES2;
15238
15167
  const entries2 = [];
15239
15168
  for (const name of names.slice(0, MAX_ENTRIES2)) {
15240
- const path = join25(dir, name);
15169
+ const path = join24(dir, name);
15241
15170
  entries2.push({ name, path, hasRuneyaProject: await holdsRuneyaProject(path) });
15242
15171
  }
15243
15172
  return {
@@ -15256,10 +15185,10 @@ var filesystemRouter = router({
15256
15185
  * Two projects in one directory is what makes services run against the wrong
15257
15186
  * code, so a directory that already holds one is refused outright.
15258
15187
  */
15259
- checkProjectTarget: protectedProcedure.input(z28.object({
15188
+ checkProjectTarget: protectedProcedure.input(z27.object({
15260
15189
  path: PATH_SCHEMA,
15261
- projectId: z28.string().min(1).max(128),
15262
- orgId: z28.string().max(128).nullable().optional()
15190
+ projectId: z27.string().min(1).max(128),
15191
+ orgId: z27.string().max(128).nullable().optional()
15263
15192
  })).query(async ({ input }) => {
15264
15193
  const dir = safeResolve(input.path);
15265
15194
  const info = await stat8(dir).catch(() => null);
@@ -15369,8 +15298,8 @@ async function ensureFilePermissions() {
15369
15298
  }
15370
15299
 
15371
15300
  // ../server/src/services/vault-migration.ts
15372
- import { readdir as readdir10, readFile as readFile19, writeFile as writeFile18, mkdir as mkdir22, copyFile as copyFile2, unlink as unlink5, rename as rename14, stat as stat10 } from "fs/promises";
15373
- import { join as join26 } from "path";
15301
+ import { readdir as readdir9, readFile as readFile18, writeFile as writeFile17, mkdir as mkdir21, copyFile as copyFile2, unlink as unlink5, rename as rename14, stat as stat10 } from "fs/promises";
15302
+ import { join as join25 } from "path";
15374
15303
  var KEY_FILES = [".encryption.key.enc", ".runeya-verify"];
15375
15304
  var MACHINE_FILES = [
15376
15305
  "agents.json",
@@ -15382,7 +15311,7 @@ var MACHINE_FILES = [
15382
15311
  ];
15383
15312
  var rekeyValue = rekeyJsonValue;
15384
15313
  async function vaultJsonFiles(root) {
15385
- const entries2 = await readdir10(root, { withFileTypes: true });
15314
+ const entries2 = await readdir9(root, { withFileTypes: true });
15386
15315
  return entries2.filter((e) => e.isFile() && e.name.endsWith(".json")).map((e) => e.name);
15387
15316
  }
15388
15317
  async function exists2(path) {
@@ -15400,17 +15329,17 @@ async function openLegacyVault(legacyRoot, masterPassword) {
15400
15329
  }
15401
15330
  async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machineKey, now) {
15402
15331
  const stamp = now.toISOString().replace(/[:.]/g, "-").substring(0, 19);
15403
- const backupDir = join26(legacyRoot, `backup-${stamp}`);
15404
- await mkdir22(backupDir, { recursive: true });
15332
+ const backupDir = join25(legacyRoot, `backup-${stamp}`);
15333
+ await mkdir21(backupDir, { recursive: true });
15405
15334
  const jsonFiles = await vaultJsonFiles(legacyRoot);
15406
15335
  for (const name of [...jsonFiles, ...KEY_FILES]) {
15407
- if (await exists2(join26(legacyRoot, name))) {
15408
- await copyFile2(join26(legacyRoot, name), join26(backupDir, name));
15336
+ if (await exists2(join25(legacyRoot, name))) {
15337
+ await copyFile2(join25(legacyRoot, name), join25(backupDir, name));
15409
15338
  }
15410
15339
  }
15411
15340
  const rekeyed = [];
15412
15341
  for (const name of jsonFiles) {
15413
- const raw = await readFile19(join26(legacyRoot, name), "utf-8");
15342
+ const raw = await readFile18(join25(legacyRoot, name), "utf-8");
15414
15343
  let parsed;
15415
15344
  try {
15416
15345
  parsed = JSON.parse(raw);
@@ -15420,13 +15349,13 @@ async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machine
15420
15349
  const counter = { n: 0 };
15421
15350
  const converted = rekeyValue(parsed, legacyKey, machineKey, counter);
15422
15351
  if (counter.n === 0) continue;
15423
- const tmp = join26(legacyRoot, `${name}.tmp`);
15424
- await writeFile18(tmp, JSON.stringify(converted, null, 2), "utf-8");
15425
- await rename14(tmp, join26(legacyRoot, name));
15352
+ const tmp = join25(legacyRoot, `${name}.tmp`);
15353
+ await writeFile17(tmp, JSON.stringify(converted, null, 2), "utf-8");
15354
+ await rename14(tmp, join25(legacyRoot, name));
15426
15355
  rekeyed.push({ file: name, values: counter.n });
15427
15356
  }
15428
15357
  for (const { file, values } of rekeyed) {
15429
- const parsed = JSON.parse(await readFile19(join26(legacyRoot, file), "utf-8"));
15358
+ const parsed = JSON.parse(await readFile18(join25(legacyRoot, file), "utf-8"));
15430
15359
  const check = { n: 0 };
15431
15360
  rekeyValue(parsed, machineKey, machineKey, check);
15432
15361
  if (check.n !== values) {
@@ -15435,13 +15364,13 @@ async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machine
15435
15364
  );
15436
15365
  }
15437
15366
  }
15438
- await mkdir22(machineRootDir, { recursive: true });
15367
+ await mkdir21(machineRootDir, { recursive: true });
15439
15368
  const moved = [];
15440
15369
  const skipped = [];
15441
15370
  for (const name of MACHINE_FILES) {
15442
- const from = join26(legacyRoot, name);
15371
+ const from = join25(legacyRoot, name);
15443
15372
  if (!await exists2(from)) continue;
15444
- const to = join26(machineRootDir, name);
15373
+ const to = join25(machineRootDir, name);
15445
15374
  if (await exists2(to)) {
15446
15375
  skipped.push(name);
15447
15376
  continue;
@@ -15451,15 +15380,15 @@ async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machine
15451
15380
  moved.push(name);
15452
15381
  }
15453
15382
  for (const name of KEY_FILES) {
15454
- const path = join26(legacyRoot, name);
15383
+ const path = join25(legacyRoot, name);
15455
15384
  if (await exists2(path)) await unlink5(path);
15456
15385
  }
15457
15386
  return { backupDir, rekeyed, moved, skipped };
15458
15387
  }
15459
15388
 
15460
15389
  // ../server/src/services/settings-migration.ts
15461
- import { readFile as readFile20, writeFile as writeFile19, rename as rename15, unlink as unlink6, mkdir as mkdir23, chmod as chmod12, stat as stat11 } from "fs/promises";
15462
- import { join as join27 } from "path";
15390
+ import { readFile as readFile19, writeFile as writeFile18, rename as rename15, unlink as unlink6, mkdir as mkdir22, chmod as chmod12, stat as stat11 } from "fs/promises";
15391
+ import { join as join26 } from "path";
15463
15392
  var SETTINGS_FILE2 = "settings.json";
15464
15393
  var SETTINGS_PRIVATE_FILE2 = "settings.private.json";
15465
15394
  async function exists3(path) {
@@ -15472,11 +15401,11 @@ async function legacySource(filename) {
15472
15401
  return null;
15473
15402
  }
15474
15403
  async function moveInto(root, filename, from) {
15475
- await mkdir23(root, { recursive: true });
15476
- const to = join27(root, filename);
15477
- const contents = await readFile20(from, "utf-8");
15404
+ await mkdir22(root, { recursive: true });
15405
+ const to = join26(root, filename);
15406
+ const contents = await readFile19(from, "utf-8");
15478
15407
  const tmp = to + ".tmp";
15479
- await writeFile19(tmp, contents, "utf-8");
15408
+ await writeFile18(tmp, contents, "utf-8");
15480
15409
  await rename15(tmp, to);
15481
15410
  await chmod12(to, 384);
15482
15411
  await unlink6(from);
@@ -15498,7 +15427,7 @@ async function migrateSettingsIntoVaults() {
15498
15427
  const orgId = orgs[0];
15499
15428
  const root = orgVaultRoot(orgId);
15500
15429
  for (const { filename, from } of sources) {
15501
- if (await exists3(join27(root, filename))) continue;
15430
+ if (await exists3(join26(root, filename))) continue;
15502
15431
  await moveInto(root, filename, from);
15503
15432
  report.files.push(filename);
15504
15433
  }
@@ -15514,14 +15443,14 @@ import { createRequire as createRequire2 } from "module";
15514
15443
  import { randomBytes as randomBytes6, createCipheriv as createCipheriv3, createDecipheriv as createDecipheriv3 } from "crypto";
15515
15444
  import { randomUUID as randomUUID12 } from "crypto";
15516
15445
  import {
15517
- readFile as readFile21,
15518
- writeFile as writeFile20,
15446
+ readFile as readFile20,
15447
+ writeFile as writeFile19,
15519
15448
  rename as rename16,
15520
- mkdir as mkdir24,
15449
+ mkdir as mkdir23,
15521
15450
  access as access3,
15522
- readdir as readdir11
15451
+ readdir as readdir10
15523
15452
  } from "fs/promises";
15524
- import { join as join28, dirname as dirname11 } from "path";
15453
+ import { join as join27, dirname as dirname11 } from "path";
15525
15454
  var _require = createRequire2(import.meta.url);
15526
15455
  var PARSER_ID_MAP = {
15527
15456
  "stack-monitor-parser-jsons": "native:json",
@@ -15630,7 +15559,7 @@ async function getSodium() {
15630
15559
  return _sodium;
15631
15560
  }
15632
15561
  async function decryptLegacyFile(filePath, key, sodium) {
15633
- const raw = (await readFile21(filePath, "utf-8")).trim();
15562
+ const raw = (await readFile20(filePath, "utf-8")).trim();
15634
15563
  if (!raw || raw === "[]" || raw === "{}") {
15635
15564
  try {
15636
15565
  return JSON.parse(raw);
@@ -15650,12 +15579,12 @@ async function decryptLegacyFile(filePath, key, sodium) {
15650
15579
  }
15651
15580
  async function atomicWrite(path, data) {
15652
15581
  const tmp = path + ".tmp";
15653
- await writeFile20(tmp, JSON.stringify(data, null, 2), "utf-8");
15582
+ await writeFile19(tmp, JSON.stringify(data, null, 2), "utf-8");
15654
15583
  await rename16(tmp, path);
15655
15584
  }
15656
15585
  async function runLegacyMigration(dataDir) {
15657
15586
  const legacyRoot = env.DATA_DIR;
15658
- const legacyKeyPath = join28(legacyRoot, "dbs", "encryption-key.json");
15587
+ const legacyKeyPath = join27(legacyRoot, "dbs", "encryption-key.json");
15659
15588
  try {
15660
15589
  await access3(legacyKeyPath);
15661
15590
  } catch {
@@ -15663,20 +15592,20 @@ async function runLegacyMigration(dataDir) {
15663
15592
  }
15664
15593
  console.log("[legacy-migration] Legacy Runeya data detected, starting migration\u2026");
15665
15594
  const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").substring(0, 19);
15666
- const legacyTmp = join28(abCwd, ".runeya-tmp");
15595
+ const legacyTmp = join27(abCwd, ".runeya-tmp");
15667
15596
  await rename16(legacyRoot, legacyTmp);
15668
- await mkdir24(dataDir, { recursive: true });
15669
- const legacyOld = join28(dataDir, `backup-${timestamp}`);
15597
+ await mkdir23(dataDir, { recursive: true });
15598
+ const legacyOld = join27(dataDir, `backup-${timestamp}`);
15670
15599
  await rename16(legacyTmp, legacyOld);
15671
15600
  console.log(`[legacy-migration] Legacy data backed up to ${legacyOld}`);
15672
- const keyJson = JSON.parse(await readFile21(join28(legacyOld, "dbs", "encryption-key.json"), "utf-8"));
15601
+ const keyJson = JSON.parse(await readFile20(join27(legacyOld, "dbs", "encryption-key.json"), "utf-8"));
15673
15602
  const sodium = await getSodium();
15674
15603
  const sodiumKey = sodium.from_base64(keyJson.encryptionKey);
15675
15604
  const keyBuffer = Buffer.from(sodiumKey);
15676
15605
  const runyeaKeyHex = keyBuffer.toString("hex");
15677
15606
  await setEncryptionKey(runyeaKeyHex);
15678
15607
  console.log("[legacy-migration] Encryption key loaded in memory (temporary)");
15679
- const dbsDir = join28(legacyOld, "dbs");
15608
+ const dbsDir = join27(legacyOld, "dbs");
15680
15609
  async function readEncrypted(filePath) {
15681
15610
  try {
15682
15611
  return await decryptLegacyFile(filePath, sodiumKey, sodium);
@@ -15685,29 +15614,29 @@ async function runLegacyMigration(dataDir) {
15685
15614
  return null;
15686
15615
  }
15687
15616
  }
15688
- const envsDir = join28(dbsDir, "envs");
15689
- const envFiles = (await readdir11(envsDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
15617
+ const envsDir = join27(dbsDir, "envs");
15618
+ const envFiles = (await readdir10(envsDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
15690
15619
  const legacyEnvs = {};
15691
15620
  for (const file of envFiles) {
15692
15621
  const name = file.replace(".encrypted.json", "");
15693
- legacyEnvs[name] = await readEncrypted(join28(envsDir, file));
15622
+ legacyEnvs[name] = await readEncrypted(join27(envsDir, file));
15694
15623
  }
15695
- const servicesDir = join28(dbsDir, "services");
15696
- const serviceFiles = (await readdir11(servicesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
15624
+ const servicesDir = join27(dbsDir, "services");
15625
+ const serviceFiles = (await readdir10(servicesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
15697
15626
  const legacyServices = {};
15698
15627
  for (const file of serviceFiles) {
15699
15628
  const name = file.replace(".encrypted.json", "");
15700
15629
  if (!name) continue;
15701
- const data = await readEncrypted(join28(servicesDir, file));
15630
+ const data = await readEncrypted(join27(servicesDir, file));
15702
15631
  if (data?.label) legacyServices[name] = data;
15703
15632
  }
15704
- const overridesDir = join28(dbsDir, "overrides");
15705
- const overrideFiles = (await readdir11(overridesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
15633
+ const overridesDir = join27(dbsDir, "overrides");
15634
+ const overrideFiles = (await readdir10(overridesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
15706
15635
  const legacyServiceOverrides = {};
15707
15636
  const legacyEnvOverrides = {};
15708
15637
  for (const file of overrideFiles) {
15709
15638
  const baseName = file.replace(".encrypted.json", "");
15710
- const data = await readEncrypted(join28(overridesDir, file));
15639
+ const data = await readEncrypted(join27(overridesDir, file));
15711
15640
  if (!data) continue;
15712
15641
  if (baseName.endsWith("-envs")) {
15713
15642
  legacyServiceOverrides[baseName.slice(0, -5)] = data;
@@ -15715,11 +15644,11 @@ async function runLegacyMigration(dataDir) {
15715
15644
  legacyEnvOverrides[baseName.slice(0, -12)] = data;
15716
15645
  }
15717
15646
  }
15718
- const parsersDir = join28(dbsDir, "parsers");
15719
- const parserFiles = (await readdir11(parsersDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
15647
+ const parsersDir = join27(dbsDir, "parsers");
15648
+ const parserFiles = (await readdir10(parsersDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
15720
15649
  const legacyParsers = [];
15721
15650
  for (const file of parserFiles) {
15722
- const data = await readEncrypted(join28(parsersDir, file));
15651
+ const data = await readEncrypted(join27(parsersDir, file));
15723
15652
  if (data?.id) legacyParsers.push(data);
15724
15653
  }
15725
15654
  const projectMonoId = randomUUID12();
@@ -16060,7 +15989,7 @@ async function runLegacyMigration(dataDir) {
16060
15989
  }
16061
15990
  let existingSettings = {};
16062
15991
  try {
16063
- existingSettings = JSON.parse(await readFile21(join28(dataDir, "settings.json"), "utf-8"));
15992
+ existingSettings = JSON.parse(await readFile20(join27(dataDir, "settings.json"), "utf-8"));
16064
15993
  } catch {
16065
15994
  }
16066
15995
  const migratedParsers = legacyParsers.map((p) => ({
@@ -16081,11 +16010,11 @@ ${p.transform ?? ""}`,
16081
16010
  ...migratedParsers
16082
16011
  ]
16083
16012
  };
16084
- await atomicWrite(join28(dataDir, "projects.json"), runeProjects);
16085
- await atomicWrite(join28(dataDir, "services.json"), runeServices);
16086
- await atomicWrite(join28(dataDir, "environments.json"), runeEnvs);
16087
- await atomicWrite(join28(dataDir, "environment-overrides.json"), flatOverrides);
16088
- await atomicWrite(join28(dataDir, "settings.json"), newSettings);
16013
+ await atomicWrite(join27(dataDir, "projects.json"), runeProjects);
16014
+ await atomicWrite(join27(dataDir, "services.json"), runeServices);
16015
+ await atomicWrite(join27(dataDir, "environments.json"), runeEnvs);
16016
+ await atomicWrite(join27(dataDir, "environment-overrides.json"), flatOverrides);
16017
+ await atomicWrite(join27(dataDir, "settings.json"), newSettings);
16089
16018
  const svcEnvCount = runeEnvs.filter((e) => e.scope === "service").length;
16090
16019
  console.log(`[legacy-migration] Written: ${runeProjects.length} projects, ${runeServices.length} services, ${runeEnvs.length} environments (${svcEnvCount} service-scoped)`);
16091
16020
  console.log(`[legacy-migration] Overrides: ${Object.keys(flatOverrides).length}, custom parsers: ${migratedParsers.length} (all disabled \u2014 rewrite required)`);
@@ -16096,12 +16025,12 @@ ${p.transform ?? ""}`,
16096
16025
  }
16097
16026
  async function findLegacyKeyInBackup(dataDir) {
16098
16027
  try {
16099
- const entries2 = await readdir11(dataDir);
16028
+ const entries2 = await readdir10(dataDir);
16100
16029
  const backupDirs = entries2.filter((e) => e.startsWith("backup-")).sort((a, b) => a < b ? -1 : a > b ? 1 : 0).reverse();
16101
16030
  for (const dir of backupDirs) {
16102
- const keyJsonPath = join28(dataDir, dir, "dbs", "encryption-key.json");
16031
+ const keyJsonPath = join27(dataDir, dir, "dbs", "encryption-key.json");
16103
16032
  try {
16104
- const raw = await readFile21(keyJsonPath, "utf-8");
16033
+ const raw = await readFile20(keyJsonPath, "utf-8");
16105
16034
  const parsed = JSON.parse(raw);
16106
16035
  if (!parsed.encryptionKey) continue;
16107
16036
  const sodium = await getSodium();
@@ -16122,14 +16051,14 @@ async function runOverrideOnlyMigration(dataDir) {
16122
16051
  const { resolve: resolve7 } = await import("path");
16123
16052
  const abDataDir = resolve7(dataDir);
16124
16053
  const candidateDirs = [
16125
- join28(dirname11(env.DATA_DIR), ".runeya", "dbs", "overrides"),
16126
- join28(abDataDir, "dbs", "overrides")
16054
+ join27(dirname11(env.DATA_DIR), ".runeya", "dbs", "overrides"),
16055
+ join27(abDataDir, "dbs", "overrides")
16127
16056
  ];
16128
16057
  let overridesDir = null;
16129
16058
  let overrideFiles = [];
16130
16059
  for (const dir of candidateDirs) {
16131
16060
  try {
16132
- const files = (await readdir11(dir)).filter((f) => f.endsWith(".encrypted.json"));
16061
+ const files = (await readdir10(dir)).filter((f) => f.endsWith(".encrypted.json"));
16133
16062
  if (files.length > 0) {
16134
16063
  overridesDir = dir;
16135
16064
  overrideFiles = files;
@@ -16139,7 +16068,7 @@ async function runOverrideOnlyMigration(dataDir) {
16139
16068
  }
16140
16069
  }
16141
16070
  if (!overridesDir || overrideFiles.length === 0) return false;
16142
- const legacyKeyPath = join28(overridesDir, "..", "encryption-key.json");
16071
+ const legacyKeyPath = join27(overridesDir, "..", "encryption-key.json");
16143
16072
  try {
16144
16073
  await access3(legacyKeyPath);
16145
16074
  return false;
@@ -16157,7 +16086,7 @@ async function runOverrideOnlyMigration(dataDir) {
16157
16086
  const envNameToId = {};
16158
16087
  let envsRaw;
16159
16088
  try {
16160
- envsRaw = JSON.parse(await readFile21(join28(abDataDir, "environments.json"), "utf-8"));
16089
+ envsRaw = JSON.parse(await readFile20(join27(abDataDir, "environments.json"), "utf-8"));
16161
16090
  for (const _env of envsRaw) {
16162
16091
  const env2 = _env;
16163
16092
  if (env2["name"] && env2["id"]) {
@@ -16176,7 +16105,7 @@ async function runOverrideOnlyMigration(dataDir) {
16176
16105
  let servicesRaw = [];
16177
16106
  const serviceNameToId = {};
16178
16107
  try {
16179
- servicesRaw = JSON.parse(await readFile21(join28(abDataDir, "services.json"), "utf-8"));
16108
+ servicesRaw = JSON.parse(await readFile20(join27(abDataDir, "services.json"), "utf-8"));
16180
16109
  for (const _svc of servicesRaw) {
16181
16110
  const svc = _svc;
16182
16111
  if (svc["name"] && svc["id"]) serviceNameToId[svc["name"]] = svc["id"];
@@ -16193,7 +16122,7 @@ async function runOverrideOnlyMigration(dataDir) {
16193
16122
  const envName = baseName.slice(0, -"-environment".length);
16194
16123
  let data;
16195
16124
  try {
16196
- data = await decryptLegacyFile(join28(overridesDir, file), sodiumKey, sodium);
16125
+ data = await decryptLegacyFile(join27(overridesDir, file), sodiumKey, sodium);
16197
16126
  } catch (err) {
16198
16127
  console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
16199
16128
  continue;
@@ -16220,7 +16149,7 @@ async function runOverrideOnlyMigration(dataDir) {
16220
16149
  }
16221
16150
  }
16222
16151
  if (Object.keys(flatOverrides).length > 0) {
16223
- await atomicWrite(join28(abDataDir, "environment-overrides.json"), flatOverrides);
16152
+ await atomicWrite(join27(abDataDir, "environment-overrides.json"), flatOverrides);
16224
16153
  console.log(`[override-migration] Written ${Object.keys(flatOverrides).length} override(s) to environment-overrides.json`);
16225
16154
  }
16226
16155
  let envsModified = false;
@@ -16230,7 +16159,7 @@ async function runOverrideOnlyMigration(dataDir) {
16230
16159
  const serviceName = baseName.slice(0, -"-envs".length);
16231
16160
  let data;
16232
16161
  try {
16233
- data = await decryptLegacyFile(join28(overridesDir, file), sodiumKey, sodium);
16162
+ data = await decryptLegacyFile(join27(overridesDir, file), sodiumKey, sodium);
16234
16163
  } catch (err) {
16235
16164
  console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
16236
16165
  continue;
@@ -16289,7 +16218,7 @@ async function runOverrideOnlyMigration(dataDir) {
16289
16218
  }
16290
16219
  }
16291
16220
  if (envsModified) {
16292
- await atomicWrite(join28(abDataDir, "environments.json"), envsRaw);
16221
+ await atomicWrite(join27(abDataDir, "environments.json"), envsRaw);
16293
16222
  console.log("[override-migration] Merged service overrides into environments.json");
16294
16223
  }
16295
16224
  const migratedDir = overridesDir.replace(/overrides$/, "overrides-migrated");
@@ -16304,7 +16233,7 @@ async function runOverrideOnlyMigration(dataDir) {
16304
16233
  }
16305
16234
 
16306
16235
  // ../server/src/services/server-state.ts
16307
- import { join as join29 } from "path";
16236
+ import { join as join28 } from "path";
16308
16237
  import { stat as stat12 } from "fs/promises";
16309
16238
  var ENCRYPTED_KEY_FILENAME2 = ".encryption.key.enc";
16310
16239
  var VERIFY_FILENAME2 = ".runeya-verify";
@@ -16314,22 +16243,22 @@ async function getServerState() {
16314
16243
  let hasVerify = false;
16315
16244
  let hasData = false;
16316
16245
  try {
16317
- await stat12(join29(dataDir, ENCRYPTED_KEY_FILENAME2));
16246
+ await stat12(join28(dataDir, ENCRYPTED_KEY_FILENAME2));
16318
16247
  hasEncFile = true;
16319
16248
  } catch {
16320
16249
  }
16321
16250
  try {
16322
- await stat12(join29(dataDir, VERIFY_FILENAME2));
16251
+ await stat12(join28(dataDir, VERIFY_FILENAME2));
16323
16252
  hasVerify = true;
16324
16253
  } catch {
16325
16254
  }
16326
16255
  try {
16327
- await stat12(join29(dataDir, "projects.json"));
16256
+ await stat12(join28(dataDir, "projects.json"));
16328
16257
  hasData = true;
16329
16258
  } catch {
16330
16259
  }
16331
16260
  try {
16332
- await stat12(join29(dataDir, "project.json"));
16261
+ await stat12(join28(dataDir, "project.json"));
16333
16262
  hasData = true;
16334
16263
  } catch {
16335
16264
  }
@@ -17589,4 +17518,4 @@ export {
17589
17518
  pullEnv,
17590
17519
  registerInstance
17591
17520
  };
17592
- //# sourceMappingURL=src-6WVQ2FQV.js.map
17521
+ //# sourceMappingURL=src-Q3PSCMS7.js.map