@runeya/runeya 2.0.76 → 2.0.78

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 (251) hide show
  1. package/agent/index.js +67 -5
  2. package/agent/index.js.map +1 -1
  3. package/agent-manager-KM7SFKVR.js +7 -0
  4. package/{chunk-E2SU5RSO.js → chunk-T3TDCZUY.js} +68 -6
  5. package/chunk-T3TDCZUY.js.map +1 -0
  6. package/index.js +1 -1
  7. package/mcp-server/index.js +85 -2
  8. package/mcp-server/index.js.map +1 -1
  9. package/package.json +1 -1
  10. package/{src-MEMRUBM6.js → src-6PAM4JRF.js} +552 -106
  11. package/src-6PAM4JRF.js.map +1 -0
  12. package/web/assets/AgentScalarChatInterface.vue-CNmHQ-rZ.js +13 -0
  13. package/web/assets/AgentTerminalPage-DoSm_qja.js +1 -0
  14. package/web/assets/AiChatPage-BH4bzdI7.js +1 -0
  15. package/web/assets/AppLayout-7Ioj7Ks0.js +1 -0
  16. package/web/assets/AuditPage-eER_6QCL.js +1 -0
  17. package/web/assets/CloudAccountPage-BrXEpmA0.js +1 -0
  18. package/web/assets/CloudAccountPage-BwaWet6j.js +1 -0
  19. package/web/assets/CloudMessagingPage-BuQqUImY.js +2 -0
  20. package/web/assets/DashboardPage-DE-D5iYb.js +1 -0
  21. package/web/assets/DirectoryPickerDialog-DoMtoAB6.js +1 -0
  22. package/web/assets/{EditorIcon-BGndPLGm.js → EditorIcon-Dze4HWD5.js} +2 -2
  23. package/web/assets/{EnvironmentForm-5X5MccdS.js → EnvironmentForm-DtcNJVjV.js} +2 -2
  24. package/web/assets/EnvironmentFormPage-B9qwDL-3.js +1 -0
  25. package/web/assets/EnvironmentListPage-CxkOZ5tX.js +1 -0
  26. package/web/assets/KanbanBoardPage-DKdXK4Qx.css +1 -0
  27. package/web/assets/KanbanBoardPage-M4vd6nJ4.js +4 -0
  28. package/web/assets/KanbanListPage-Bhdw2jOU.js +1 -0
  29. package/web/assets/LaunchProjectPage-CiBi7ViX.js +1 -0
  30. package/web/assets/LaunchServicesPage-DFySTFG9.js +1 -0
  31. package/web/assets/LogViewer-CKMcu56W.js +3 -0
  32. package/web/assets/OrgKeyPrompt-cQ2E4Hma.js +1 -0
  33. package/web/assets/ProcessControls-Dp8B86Vk.js +1 -0
  34. package/web/assets/ProcessDetailPage-BYvrD502.js +1 -0
  35. package/web/assets/{ProcessMetrics-B0mOAjpt.js → ProcessMetrics-CgxzXC17.js} +2 -2
  36. package/web/assets/ProjectDetailPage-DZkrNPAY.js +1 -0
  37. package/web/assets/ProjectListPage-DUJu2DLy.js +1 -0
  38. package/web/assets/RandomJobTestPage-s1JZo_Iz.js +2 -0
  39. package/web/assets/ScenarioEditorPage-DlIpuxfC.js +14 -0
  40. package/web/assets/SendToChatDialog-DZe1HI00.js +1 -0
  41. package/web/assets/ServiceControlsBar-BKFVLyeu.js +1 -0
  42. package/web/assets/ServiceDetailPage-CBK2mMw9.js +2 -0
  43. package/web/assets/{ServiceDetailPage-DVOQdgmZ.css → ServiceDetailPage-IU_BrMof.css} +1 -1
  44. package/web/assets/ServiceFormPage-CCRgRCCH.js +1 -0
  45. package/web/assets/SettingsPage-BTBGU8Od.js +2063 -0
  46. package/web/assets/{SettingsPage-CeFOjH68.css → SettingsPage-DkzFCmSX.css} +1 -1
  47. package/web/assets/UnlockPage-CvDJJ5Fs.js +1 -0
  48. package/web/assets/VariablesTable-6l9GrMcC.js +1 -0
  49. package/web/assets/VaultMigrationPage--EbAu-3y.js +1 -0
  50. package/web/assets/VersionBadge-CTUt4tVm.js +1 -0
  51. package/web/assets/WikiPage-BgyoMils.js +1 -0
  52. package/web/assets/WikiView-Bm25ya4s.js +1 -0
  53. package/web/assets/add-scalar-classes-BrcrAJKI.js +387 -0
  54. package/web/assets/auth-errors-D7z_zLrU.js +1 -0
  55. package/web/assets/{autocomplete-CGdex9-e.js → autocomplete-BZZ6eLOr.js} +3 -3
  56. package/web/assets/{basic-shape-diamond.svg-qeeRnNFT.js → basic-shape-diamond.svg-kNoZJr6Q.js} +1 -1
  57. package/web/assets/{basic-shape-hexagon.svg-CIlKhfGT.js → basic-shape-hexagon.svg-m2knsywy.js} +1 -1
  58. package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-BqolxHsi.js → basic-shape-primary-circle-ellipse-round.svg-D5c4bHRs.js} +1 -1
  59. package/web/assets/{basic-shape-primary-square-rectangle.svg-CpdZYdXX.js → basic-shape-primary-square-rectangle.svg-5Jh3keY7.js} +1 -1
  60. package/web/assets/{basic-shape-shield.svg-Dxhs7gEl.js → basic-shape-shield.svg-DXuFi_uS.js} +1 -1
  61. package/web/assets/{browser-DN1U-HwX.js → browser-BnFxWu1Z.js} +1 -1
  62. package/web/assets/{browser-I2oYlD2i.js → browser-C8mNrw8h.js} +1 -1
  63. package/web/assets/card-CyclORkQ.js +32 -0
  64. package/web/assets/{checkbox-GeePBqgX.js → checkbox-B6-p4_sk.js} +3 -3
  65. package/web/assets/{chip-BHIwNcot.js → chip-BhspXQJY.js} +2 -2
  66. package/web/assets/client-ouCQfzXo.js +24 -0
  67. package/web/assets/cloud-chat.store-C6podxIi.js +1 -0
  68. package/web/assets/cloud-session-CR7l0OPa.js +1 -0
  69. package/web/assets/column-Btrf7omy.js +907 -0
  70. package/web/assets/{computer-device-desktop-monitor.svg-cgtj7qaG.js → computer-device-desktop-monitor.svg-DM2JDGFk.js} +1 -1
  71. package/web/assets/{computer-device-desktop.svg-CtASuIzj.js → computer-device-desktop.svg-_HJ4EQOc.js} +1 -1
  72. package/web/assets/{computer-device-laptop.svg-Bgrj-X1s.js → computer-device-laptop.svg-CNAA6BlQ.js} +1 -1
  73. package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-BdGuG_w_.js → computer-device-mobile-phone-android-samsung-back.svg-CxLeIN1Q.js} +1 -1
  74. package/web/assets/{computer-device-mobile-phone-android-samsung.svg-BRGfdLz4.js → computer-device-mobile-phone-android-samsung.svg-DQz-ruKd.js} +1 -1
  75. package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-AqEKxnYo.js → computer-device-mobile-phone-iphone-x-back.svg-FxfpqJnY.js} +1 -1
  76. package/web/assets/{computer-device-mobile-phone-iphone-x.svg-DWFt-koa.js → computer-device-mobile-phone-iphone-x.svg-BUIqfPz2.js} +1 -1
  77. package/web/assets/{computer-device-mobile-tablet-touch.svg-DJ52OpYh.js → computer-device-mobile-tablet-touch.svg-DMCFrDQl.js} +1 -1
  78. package/web/assets/{computer-device-mobile-tablet.svg-Ce_rWOZi.js → computer-device-mobile-tablet.svg-C531kbod.js} +1 -1
  79. package/web/assets/{computer-device-network-ethernet-cat6.svg-DB9SlCtA.js → computer-device-network-ethernet-cat6.svg-BC8dt5q3.js} +1 -1
  80. package/web/assets/{computer-device-network-lan-www.svg-lHja183-.js → computer-device-network-lan-www.svg-RGqNlI8D.js} +1 -1
  81. package/web/assets/{computer-device-network-wifi-connection.svg-B1zLcvJN.js → computer-device-network-wifi-connection.svg-D0gVZv1K.js} +1 -1
  82. package/web/assets/{computer-device-network-wifi-router.svg-Drrwd9xP.js → computer-device-network-wifi-router.svg-CcsrAY7y.js} +1 -1
  83. package/web/assets/{cssMode-D9jO-uTl.js → cssMode-MVvkpnf5.js} +1 -1
  84. package/web/assets/{divider-B0vBDWbW.js → divider-DZT9zzOY.js} +2 -2
  85. package/web/assets/{docx-preview-BTpCoAAq.js → docx-preview-DgvvGq-u.js} +1 -1
  86. package/web/assets/{ecology-science-erlenmeyer-flask.svg--ysD_96O.js → ecology-science-erlenmeyer-flask.svg-q6TcEYhf.js} +1 -1
  87. package/web/assets/{fieldset-BFb-WHon.js → fieldset-UHviaYDo.js} +2 -2
  88. package/web/assets/{freemarker2-DnkPMk4B.js → freemarker2-BPSlW8HL.js} +1 -1
  89. package/web/assets/{handlebars-Dsj_qiK6.js → handlebars-Cx5Be6nL.js} +1 -1
  90. package/web/assets/{html-t_OlpWku.js → html-CskS1oGF.js} +1 -1
  91. package/web/assets/{htmlMode-DRcQv-pv.js → htmlMode-BWDnKwIH.js} +1 -1
  92. package/web/assets/{image-flash-lightning.svg-6f9kbrTL.js → image-flash-lightning.svg-RpiSonqe.js} +1 -1
  93. package/web/assets/{image-picture-flower.svg-i7zms3Ho.js → image-picture-flower.svg-DKIZ6SGb.js} +1 -1
  94. package/web/assets/{index-GxI3bOA0.js → index-DX1jH50I.js} +290 -290
  95. package/web/assets/{interface-alert-exclamation-diamond.svg-DqUMmCtJ.js → interface-alert-exclamation-diamond.svg-DgMyEA2d.js} +1 -1
  96. package/web/assets/{interface-alert-exclamation-triangle-warning.svg-DzDl1xOr.js → interface-alert-exclamation-triangle-warning.svg-B70eBJ6w.js} +1 -1
  97. package/web/assets/{interface-alert-information-circle.svg-DmCgkGPM.js → interface-alert-information-circle.svg-DpwiTVXc.js} +1 -1
  98. package/web/assets/{interface-award-crown.svg-C9Fbg_RB.js → interface-award-crown.svg-CwKQHYgB.js} +1 -1
  99. package/web/assets/{interface-bookmark.svg-MqIoLfKE.js → interface-bookmark-tag.svg-DEFAc2g5.js} +1 -1
  100. package/web/assets/{interface-bookmark-tag.svg-3gViLsvg.js → interface-bookmark.svg-xHnQeM--.js} +1 -1
  101. package/web/assets/{interface-calendar-date-one.svg-B9sbfbL9.js → interface-calendar-date-one.svg-DoFsHoOe.js} +1 -1
  102. package/web/assets/{interface-content-book-open-pages.svg-1vSNOl7u.js → interface-content-book-open-pages.svg-DuqFzI9p.js} +1 -1
  103. package/web/assets/{interface-content-book-page.svg-DIEM6xdS.js → interface-content-book-page.svg-BRt9mm-8.js} +1 -1
  104. package/web/assets/{interface-content-file.svg-7VSdTCse.js → interface-content-file.svg-CdO69f4x.js} +1 -1
  105. package/web/assets/interface-content-folder.svg-CW9Pj4JQ.js +1 -0
  106. package/web/assets/{interface-content-folder.svg-9g1Oeyk0.js → interface-content-folder.svg-Copg1_JR.js} +1 -1
  107. package/web/assets/{interface-copy-clipboard.svg-aMsLLdqD.js → interface-copy-clipboard.svg-D-WYyVHg.js} +1 -1
  108. package/web/assets/{interface-edit-attachment.svg-CVDpgAHo.js → interface-edit-attachment.svg-BJUsLCwo.js} +1 -1
  109. package/web/assets/{interface-edit-binocular.svg-DCXRjTEQ.js → interface-edit-binocular.svg-C8h8Hu5o.js} +1 -1
  110. package/web/assets/{interface-edit-magic-wand.svg-CDrPrWdl.js → interface-edit-magic-wand.svg-DWuA6W2Z.js} +1 -1
  111. package/web/assets/{interface-edit-tool-paint-roller.svg-UvpUIvX7.js → interface-edit-tool-paint-roller.svg-BHx0xgbh.js} +1 -1
  112. package/web/assets/{interface-edit-tool-pencil.svg-vPXMlfGL.js → interface-edit-tool-pencil.svg-DpG53MDR.js} +1 -1
  113. package/web/assets/{interface-favorite-award.svg-CZOrIvmM.js → interface-favorite-award.svg-C6t0QMZ8.js} +1 -1
  114. package/web/assets/{interface-favorite-flag.svg-CP5RiVtW.js → interface-favorite-flag.svg-B0XbgMDW.js} +1 -1
  115. package/web/assets/{interface-favorite-heart.svg-B9yhOFXg.js → interface-favorite-heart.svg-BnZo2rnr.js} +1 -1
  116. package/web/assets/{interface-favorite-star.svg-B5Iv-JuP.js → interface-favorite-star.svg-qpDT8XOd.js} +1 -1
  117. package/web/assets/{interface-favorite-stars-sparkles.svg-Cipb48vc.js → interface-favorite-stars-sparkles.svg-DL2zl0KO.js} +1 -1
  118. package/web/assets/{interface-hierarchy-flowchart.svg-BCEm8EoC.js → interface-hierarchy-flowchart.svg-BtysN-ry.js} +1 -1
  119. package/web/assets/{interface-home-house.svg-Bh5-1B_X.js → interface-home-house.svg-CFqywwcS.js} +1 -1
  120. package/web/assets/{interface-hyperlink.svg-DmOAt5ZG.js → interface-hyperlink.svg-BRUR4nsw.js} +1 -1
  121. package/web/assets/{interface-lighting-brightness.svg-DhHJhRaa.js → interface-lighting-brightness.svg-DoyK3Kxo.js} +1 -1
  122. package/web/assets/{interface-lock-closed.svg-CDyidwZF.js → interface-lock-closed.svg-BqJ7SVg6.js} +1 -1
  123. package/web/assets/{interface-lock-open-unlock.svg-Y-4_5Lj-.js → interface-lock-open-unlock.svg-BsV2IUxU.js} +1 -1
  124. package/web/assets/{interface-login-key.svg-C8M65861.js → interface-login-key.svg-CgUuV9La.js} +1 -1
  125. package/web/assets/{interface-search.svg-gkEckiep.js → interface-search.svg-BHiLMUkG.js} +1 -1
  126. package/web/assets/{interface-setting-cog.svg-B42Ru0QR.js → interface-setting-cog.svg-hpwOab0L.js} +1 -1
  127. package/web/assets/{interface-share-megaphone-bullhorn.svg-BXgemPpH.js → interface-share-megaphone-bullhorn.svg-BM2RbPhT.js} +1 -1
  128. package/web/assets/{interface-share-rocket.svg-BpCNXSJv.js → interface-share-rocket.svg-CRx8-Zzl.js} +1 -1
  129. package/web/assets/{interface-share-satellite.svg-UqTKwPgB.js → interface-share-satellite.svg-D5VFEr1s.js} +1 -1
  130. package/web/assets/{interface-share-space-ship.svg-LjpxJCju.js → interface-share-space-ship.svg-CyOoRNOL.js} +1 -1
  131. package/web/assets/{interface-share.svg-aTfbQymz.js → interface-share.svg-eU7ZehX3.js} +1 -1
  132. package/web/assets/{interface-signal-square.svg-BV84IA7I.js → interface-signal-square.svg-CnuACoWB.js} +1 -1
  133. package/web/assets/{interface-time-clock-circle.svg-B9p8ScHG.js → interface-time-clock-circle.svg-DqIBjN5L.js} +1 -1
  134. package/web/assets/{interface-time-hour-glass.svg-4jjplFkz.js → interface-time-hour-glass.svg-C6rqAYQT.js} +1 -1
  135. package/web/assets/{interface-users-multiple.svg-D4nN3V4C.js → interface-users-multiple.svg-wMzqZI1f.js} +1 -1
  136. package/web/assets/{interface-weather-moon.svg-DyfDXGyQ.js → interface-weather-moon.svg-AwbuLpGL.js} +1 -1
  137. package/web/assets/{javascript-DxiQ5ZFe.js → javascript-D-r1O4Ca.js} +1 -1
  138. package/web/assets/{jsonMode-R5AgiRt8.js → jsonMode-BCt09OqP.js} +2 -2
  139. package/web/assets/{liquid-BPHysTNM.js → liquid-CMI_xdlK.js} +1 -1
  140. package/web/assets/{lspLanguageFeatures-DVsCw49O.js → lspLanguageFeatures-BkC_Rb-G.js} +3 -3
  141. package/web/assets/{mail-chat-bubble-square.svg-Bgj_m98i.js → mail-chat-bubble-square.svg-CHs5qc9C.js} +1 -1
  142. package/web/assets/{mail-send-email-paper-airplane.svg-Cmgs5A9c.js → mail-send-email-paper-airplane.svg-BII7dY15.js} +1 -1
  143. package/web/assets/{mail-send-envelope.svg-DXtZA2de.js → mail-send-envelope.svg-4b4uqPPL.js} +1 -1
  144. package/web/assets/{mdx-BmXvPH9O.js → mdx-DdmbVSD2.js} +1 -1
  145. package/web/assets/{message-DUmeTDJC.js → message-D_nRgC6r.js} +2 -2
  146. package/web/assets/{minus-_526hTAz.js → minus-CTAaB8OA.js} +2 -2
  147. package/web/assets/modal-EqUnnO-G.js +1 -0
  148. package/web/assets/modal-ZE6BMfX7.js +5 -0
  149. package/web/assets/{money-cashier-receipt.svg-BKLBvJ6k.js → money-cashier-receipt.svg-BtWsmEgv.js} +1 -1
  150. package/web/assets/{money-currency-dollar-pay.svg-Dy__wPDu.js → money-currency-dollar-pay.svg-CnldGQpb.js} +1 -1
  151. package/web/assets/{money-graph-arrow-increase.svg-CY6efGa2.js → money-graph-arrow-increase.svg-UqbJd1iC.js} +1 -1
  152. package/web/assets/{money-graph-bar-chart-increase.svg-DeWwVE-h.js → money-graph-bar-chart-increase.svg-Dr-Hnacd.js} +1 -1
  153. package/web/assets/multiselect-D-y0p69n.js +251 -0
  154. package/web/assets/{nature-ecology-leaf.svg-CiA8xWzT.js → nature-ecology-leaf.svg-CWHl91dv.js} +1 -1
  155. package/web/assets/{password-BjWenHiO.js → password-D3Lj4hJq.js} +4 -4
  156. package/web/assets/{phone-telephone.svg-DFkp7qtJ.js → phone-telephone.svg-BcSZwkiO.js} +1 -1
  157. package/web/assets/{plus-CM2XaJYz.js → plus-DF0rYy2n.js} +6 -6
  158. package/web/assets/process.store-Cbc9hjTa.js +1 -0
  159. package/web/assets/{programming-bug.svg-iTd4z5Bn.js → programming-bug.svg-BKyii_g1.js} +1 -1
  160. package/web/assets/{programming-cloud.svg-BhZ7wR70.js → programming-cloud.svg-C13r66j3.js} +1 -1
  161. package/web/assets/{programming-computer-database-server.svg-CNFgEADa.js → programming-computer-database-server.svg-DxkFPCUU.js} +1 -1
  162. package/web/assets/{programming-computer-database.svg-BLUoB0S3.js → programming-computer-database.svg-CNV4OudR.js} +1 -1
  163. package/web/assets/{programming-module-four-layout.svg---ShQt1c.js → programming-module-four-layout.svg-TzT7xA3i.js} +1 -1
  164. package/web/assets/{programming-module-three.svg-Q915QePI.js → programming-module-three.svg-uMHBGJh_.js} +1 -1
  165. package/web/assets/{programming-module.svg-DGlB0gXU.js → programming-module.svg-qnEyl-d7.js} +1 -1
  166. package/web/assets/{programming-script-code.svg-BXqoqM0a.js → programming-script-code.svg-BM6_G6ro.js} +1 -1
  167. package/web/assets/{python-Bkcdd-GB.js → python-CSgwcPdn.js} +1 -1
  168. package/web/assets/{razor-Dgss4zhv.js → razor-DC1VcHXf.js} +1 -1
  169. package/web/assets/router-BPnYbA5v.js +1 -0
  170. package/web/assets/settings-scope-C7xlTANR.js +1 -0
  171. package/web/assets/settings.store-VDOH02rk.js +1 -0
  172. package/web/assets/{shopping-cart.svg-DFzDn0s3.js → shopping-cart.svg-CFRl5nlm.js} +1 -1
  173. package/web/assets/{shopping-gift-present.svg-CzoIs_fz.js → shopping-gift-present.svg-BDdt0EZp.js} +1 -1
  174. package/web/assets/{shopping-shipping-box-parcel-package.svg-K83gZueW.js → shopping-shipping-box-parcel-package.svg-DekC0cB7.js} +1 -1
  175. package/web/assets/{src-CrlKkUl0.js → src-B3JQXGmg.js} +25 -25
  176. package/web/assets/{src-Bhd-KJy_.css → src-BsM0Obsp.css} +1 -1
  177. package/web/assets/src-DKOgbSli.js +1 -0
  178. package/web/assets/{tabpanel-B8p6e6cv.js → tabpanel-Dj14CGND.js} +3 -3
  179. package/web/assets/{tag-new-circle.svg-BgOrOZ_K.js → tag-new-circle.svg-CHerl-X9.js} +1 -1
  180. package/web/assets/{toggleswitch-BKr-TR6_.js → toggleswitch-CCJjH6WC.js} +2 -2
  181. package/web/assets/{travel-map-earth-globe.svg-DZQQPdM1.js → travel-map-earth-globe.svg-D4kGqX4m.js} +1 -1
  182. package/web/assets/trpc-C0oE3hJ9.js +1 -0
  183. package/web/assets/{tsMode-BO9AVz77.js → tsMode-QNvVcAcI.js} +5 -5
  184. package/web/assets/{typescript-BVxNZ4YH.js → typescript-DhLuh0I9.js} +1 -1
  185. package/web/assets/useAiChatDrawer-znpcgJxf.js +1 -0
  186. package/web/assets/useCloudOrg-DLfMtBxV.js +572 -0
  187. package/web/assets/useCloudOrg-Drl2_37-.css +1 -0
  188. package/web/assets/{useProjectCatalog-Cw3YywvF.js → useProjectCatalog-BSoIDYMZ.js} +1 -1
  189. package/web/assets/{xml-Bv9vIo84.js → xml-DAlZ_1sH.js} +1 -1
  190. package/web/assets/{yaml-Brrhr_WI.js → yaml-GQlxRyRr.js} +1 -1
  191. package/web/index.html +1 -1
  192. package/agent-manager-DM6C7BTF.js +0 -7
  193. package/chunk-E2SU5RSO.js.map +0 -1
  194. package/src-MEMRUBM6.js.map +0 -1
  195. package/web/assets/AgentScalarChatInterface.vue-CbsV-wvF.js +0 -13
  196. package/web/assets/AgentTerminalPage-CFX_cNje.js +0 -1
  197. package/web/assets/AiChatPage-aNp-79bj.js +0 -1
  198. package/web/assets/AppLayout-C8SJH7E2.js +0 -1
  199. package/web/assets/AuditPage-mPkN9IPs.js +0 -1
  200. package/web/assets/CloudAccountPage--8gMHEov.js +0 -1
  201. package/web/assets/CloudAccountPage-DwfKS8Ui.js +0 -1
  202. package/web/assets/CloudMessagingPage-BZda9W4V.js +0 -2
  203. package/web/assets/DashboardPage-BYoHvCSW.js +0 -1
  204. package/web/assets/DirectoryPickerDialog-GjBksDRF.js +0 -1
  205. package/web/assets/EnvironmentFormPage-pWcZotB8.js +0 -1
  206. package/web/assets/EnvironmentListPage-D1u5GOUq.js +0 -1
  207. package/web/assets/KanbanBoardPage-B61sIHjE.js +0 -4
  208. package/web/assets/KanbanBoardPage-CCl8dmwn.css +0 -1
  209. package/web/assets/KanbanListPage-Dsg1wA9V.js +0 -1
  210. package/web/assets/LaunchProjectPage-BzLfT9xo.js +0 -1
  211. package/web/assets/LaunchServicesPage-DxRtzyc-.js +0 -1
  212. package/web/assets/LogViewer-DCTx3ncv.js +0 -3
  213. package/web/assets/OrgKeyPrompt-DGVXqIwV.js +0 -1
  214. package/web/assets/ProcessControls-CKHLGdip.js +0 -1
  215. package/web/assets/ProcessDetailPage-BTcbsw0H.js +0 -1
  216. package/web/assets/ProjectDetailPage-Do50Toy3.js +0 -1
  217. package/web/assets/ProjectListPage-FhR5Gkub.js +0 -1
  218. package/web/assets/RandomJobTestPage-CT1XUQ7l.js +0 -2
  219. package/web/assets/ScenarioEditorPage-CAZ18fLj.js +0 -14
  220. package/web/assets/SendToChatDialog-3VcAeiLB.js +0 -1
  221. package/web/assets/ServiceControlsBar-DMibK9Gk.js +0 -1
  222. package/web/assets/ServiceDetailPage-DzTdnnmK.js +0 -2
  223. package/web/assets/ServiceFormPage-C3Av0wu_.js +0 -1
  224. package/web/assets/SettingsPage-Cb4cXWBn.js +0 -2063
  225. package/web/assets/UnlockPage-Cj9f3u9P.js +0 -1
  226. package/web/assets/VariablesTable-_m1LCIc1.js +0 -1
  227. package/web/assets/VaultMigrationPage-4-aYgpPb.js +0 -1
  228. package/web/assets/VersionBadge-D-5Wk-zP.js +0 -1
  229. package/web/assets/WikiPage-Dr0BjWqx.js +0 -1
  230. package/web/assets/WikiView-Zx8Prvim.js +0 -1
  231. package/web/assets/add-scalar-classes-Bj8wq_Hs.js +0 -387
  232. package/web/assets/auth-errors-C98TqTeb.js +0 -1
  233. package/web/assets/card-DtzNVDSZ.js +0 -32
  234. package/web/assets/client-BDHmFNrH.js +0 -24
  235. package/web/assets/cloud-chat.store-B20ZLeeR.js +0 -1
  236. package/web/assets/cloud-session-BjfhcCqc.js +0 -1
  237. package/web/assets/column-DXHLG_CF.js +0 -907
  238. package/web/assets/interface-content-folder.svg-CAHYAOYi.js +0 -1
  239. package/web/assets/modal-DWnz3LAY.js +0 -5
  240. package/web/assets/modal-SaIxK3oE.js +0 -1
  241. package/web/assets/multiselect-sCEC4UBn.js +0 -251
  242. package/web/assets/process.store-BdrVU3j7.js +0 -1
  243. package/web/assets/router-CkyZcpB5.js +0 -1
  244. package/web/assets/settings-scope-UnTi3EI6.js +0 -1
  245. package/web/assets/settings.store-Bd6azayI.js +0 -1
  246. package/web/assets/src-Bn8iaJpP.js +0 -1
  247. package/web/assets/trpc-CPHyoQZL.js +0 -1
  248. package/web/assets/useAiChatDrawer-tj6s1XKR.js +0 -1
  249. package/web/assets/useCloudOrg-CXnReqbv.js +0 -97
  250. package/web/assets/useCloudOrg-CYZgY69j.css +0 -1
  251. /package/{agent-manager-DM6C7BTF.js.map → agent-manager-KM7SFKVR.js.map} +0 -0
@@ -110,7 +110,7 @@ import {
110
110
  wasRead,
111
111
  withDeprecatedAliases,
112
112
  writeEntity
113
- } from "./chunk-E2SU5RSO.js";
113
+ } from "./chunk-T3TDCZUY.js";
114
114
 
115
115
  // ../server/src/create-server.ts
116
116
  import express from "express";
@@ -2432,6 +2432,9 @@ var projectRouter = router({
2432
2432
  import { z as z4 } from "zod";
2433
2433
  import { TRPCError as TRPCError4 } from "@trpc/server";
2434
2434
 
2435
+ // ../server/src/services/log-parser-store.ts
2436
+ import { randomUUID as randomUUID3 } from "crypto";
2437
+
2435
2438
  // ../server/src/services/settings-manager.ts
2436
2439
  import { readFile as readFile7, writeFile as writeFile7, rename as rename7, mkdir as mkdir7, chmod as chmod6 } from "fs/promises";
2437
2440
  import { join as join8 } from "path";
@@ -2569,6 +2572,170 @@ var SettingsManager = class {
2569
2572
  };
2570
2573
  var settingsManager = new SettingsManager();
2571
2574
 
2575
+ // ../server/src/services/log-parser-store.ts
2576
+ function isShareable(parser) {
2577
+ return parser.builtin !== true && !parser.id.startsWith("native:");
2578
+ }
2579
+ var LogParserStore = class {
2580
+ localListeners = /* @__PURE__ */ new Set();
2581
+ changeListeners = /* @__PURE__ */ new Set();
2582
+ /**
2583
+ * S'abonner aux écritures *locales* — celles nées ici.
2584
+ *
2585
+ * C'est ce qu'écoute la synchronisation : réagir aussi à ce qui arrive du
2586
+ * document la ferait repartir aussitôt vers ce document, en boucle.
2587
+ */
2588
+ onLocalChange(fn) {
2589
+ this.localListeners.add(fn);
2590
+ return () => this.localListeners.delete(fn);
2591
+ }
2592
+ /**
2593
+ * S'abonner à toute écriture, d'où qu'elle vienne.
2594
+ *
2595
+ * C'est ce qu'écoute l'interface : un parseur écrit par un collègue arrive
2596
+ * par le document, donc silencieusement pour la synchronisation — mais un
2597
+ * écran qui ne l'apprend qu'au prochain montage montre une liste fausse
2598
+ * pendant tout ce temps, alors même que les services, eux, se rafraîchissent.
2599
+ */
2600
+ onChanged(fn) {
2601
+ this.changeListeners.add(fn);
2602
+ return () => this.changeListeners.delete(fn);
2603
+ }
2604
+ notify(vault, local) {
2605
+ if (local) {
2606
+ for (const fn of this.localListeners) {
2607
+ try {
2608
+ fn();
2609
+ } catch (err) {
2610
+ console.error("[log-parser-store] listener failed:", err.message);
2611
+ }
2612
+ }
2613
+ }
2614
+ for (const fn of this.changeListeners) {
2615
+ try {
2616
+ fn(vault);
2617
+ } catch (err) {
2618
+ console.error("[log-parser-store] listener failed:", err.message);
2619
+ }
2620
+ }
2621
+ }
2622
+ /** Les parseurs d'un coffre — ceux de l'organisation, ou ceux du poste. */
2623
+ async list(vault) {
2624
+ const settings = await settingsManager.getSettings(vault);
2625
+ return settings.logParsers ?? [];
2626
+ }
2627
+ async get(id, vault) {
2628
+ return (await this.list(vault)).find((p) => p.id === id) ?? null;
2629
+ }
2630
+ async write(parsers, vault, silent = false) {
2631
+ const settings = await settingsManager.getSettings(vault);
2632
+ await settingsManager.saveSettings({ ...settings, logParsers: parsers }, vault);
2633
+ this.notify(vault, !silent);
2634
+ }
2635
+ async create(input, vault) {
2636
+ const now = /* @__PURE__ */ new Date();
2637
+ if (input.builtin) {
2638
+ throw new Error("A parser created here is never a built-in one");
2639
+ }
2640
+ const parser = JSLogParserSchema.parse({
2641
+ ...input,
2642
+ id: randomUUID3(),
2643
+ createdAt: now,
2644
+ updatedAt: now
2645
+ });
2646
+ await this.write([...await this.list(vault), parser], vault);
2647
+ return parser;
2648
+ }
2649
+ async update(id, patch, vault) {
2650
+ const parsers = await this.list(vault);
2651
+ const index = parsers.findIndex((p) => p.id === id);
2652
+ if (index === -1) return null;
2653
+ const updated = JSLogParserSchema.parse({
2654
+ ...parsers[index],
2655
+ ...patch,
2656
+ id,
2657
+ updatedAt: /* @__PURE__ */ new Date()
2658
+ });
2659
+ const next = [...parsers];
2660
+ next[index] = updated;
2661
+ await this.write(next, vault);
2662
+ return updated;
2663
+ }
2664
+ async delete(id, vault) {
2665
+ const parsers = await this.list(vault);
2666
+ const next = parsers.filter((p) => p.id !== id);
2667
+ if (next.length === parsers.length) return false;
2668
+ await this.write(next, vault);
2669
+ return true;
2670
+ }
2671
+ // ---- Synchronisation --------------------------------------------------
2672
+ /**
2673
+ * Écrire ce que le document de l'organisation porte.
2674
+ *
2675
+ * Silencieux et gardé par une comparaison : réveiller les écoutants ici
2676
+ * relancerait la réconciliation qui vient de produire cette écriture, et un
2677
+ * document identique au disque ne mérite pas un fichier réécrit.
2678
+ */
2679
+ async applyRemoteUpsert(id, fields, orgId) {
2680
+ const parsed = JSLogParserSchema.safeParse({ ...fields, id });
2681
+ if (!parsed.success) {
2682
+ console.warn("[log-parser-store] rejected a remote parser %s: %s", id, parsed.error.message);
2683
+ return;
2684
+ }
2685
+ if (!isShareable(parsed.data)) return;
2686
+ const parsers = await this.list(orgId);
2687
+ const index = parsers.findIndex((p) => p.id === id);
2688
+ if (index !== -1 && sameParser(parsers[index], parsed.data)) return;
2689
+ const next = [...parsers];
2690
+ if (index === -1) next.push(parsed.data);
2691
+ else next[index] = parsed.data;
2692
+ await this.write(next, orgId, true);
2693
+ }
2694
+ async applyRemoteDelete(id, orgId) {
2695
+ const parsers = await this.list(orgId);
2696
+ const next = parsers.filter((p) => p.id !== id);
2697
+ if (next.length === parsers.length) return;
2698
+ await this.write(next, orgId, true);
2699
+ }
2700
+ /**
2701
+ * Remonter les parseurs du poste dans les organisations de cette machine.
2702
+ *
2703
+ * Un déplacement, pas une copie : le même parseur des deux côtés ferait deux
2704
+ * vérités qui divergent au premier changement, et la liste du poste
2705
+ * ressusciterait à chaque connexion celui qu'un membre vient de supprimer
2706
+ * pour toute l'équipe. Une fois la machine vidée, il n'y a plus rien à
2707
+ * remonter — l'opération peut donc être rejouée sans dégât.
2708
+ *
2709
+ * Vers *toutes* les organisations liées, chacune recevant sa copie : les
2710
+ * coffres ne communiquent pas, et rien ne dit laquelle des deux était visée.
2711
+ */
2712
+ async migrateMachineParsersInto(orgIds) {
2713
+ if (orgIds.length === 0) return;
2714
+ const all = await this.list();
2715
+ if (all.length === 0) return;
2716
+ const machineParsers = all.filter(isShareable);
2717
+ for (const orgId of orgIds) {
2718
+ const existing = await this.list(orgId);
2719
+ const known = new Set(existing.map((p) => p.id));
2720
+ const added = machineParsers.filter((p) => !known.has(p.id));
2721
+ if (added.length === 0) continue;
2722
+ await this.write([...existing, ...added], orgId, true);
2723
+ }
2724
+ await this.write(all.filter((p) => !isShareable(p)), void 0, true);
2725
+ if (machineParsers.length > 0) {
2726
+ console.log(
2727
+ "[log-parser-store] moved %d machine parser(s) into organization(s): %s",
2728
+ machineParsers.length,
2729
+ orgIds.join(", ")
2730
+ );
2731
+ }
2732
+ }
2733
+ };
2734
+ function sameParser(a, b) {
2735
+ return a.name === b.name && a.code === b.code && a.enabled === b.enabled && (a.description ?? "") === (b.description ?? "") && a.updatedAt.getTime() === b.updatedAt.getTime();
2736
+ }
2737
+ var logParserStore = new LogParserStore();
2738
+
2572
2739
  // ../server/src/services/service-builtins.ts
2573
2740
  function buildServerBuiltins(input) {
2574
2741
  const { service, siblings, projectName, environmentName, agentName, host } = input;
@@ -2609,7 +2776,7 @@ import { isAbsolute as isAbsolute3 } from "path";
2609
2776
  import { isAbsolute as isAbsolute2, join as join10, dirname as dirname5 } from "path";
2610
2777
 
2611
2778
  // ../server/src/services/conversation-store.ts
2612
- import { randomUUID as randomUUID3 } from "crypto";
2779
+ import { randomUUID as randomUUID4 } from "crypto";
2613
2780
  import { readFile as readFile8, writeFile as writeFile8, rename as rename8, mkdir as mkdir8, chmod as chmod7 } from "fs/promises";
2614
2781
  import { dirname as dirname4, join as join9 } from "path";
2615
2782
  import { EventEmitter as EventEmitter2 } from "events";
@@ -2942,7 +3109,7 @@ ${new Error("trace").stack}`
2942
3109
  await this.load();
2943
3110
  const now = Date.now();
2944
3111
  const conv = {
2945
- id: randomUUID3(),
3112
+ id: randomUUID4(),
2946
3113
  projectId,
2947
3114
  title: title ?? "New conversation",
2948
3115
  messages: [],
@@ -3104,8 +3271,9 @@ async function resolveServiceVariables(service) {
3104
3271
  }
3105
3272
  try {
3106
3273
  if (service.parserIds && service.parserIds.length > 0) {
3107
- const settings = await settingsManager.getSettings();
3108
- const allParsers = [...nativeParsers, ...settings.logParsers || []];
3274
+ const vault = project?.orgId ?? void 0;
3275
+ const parsers = await logParserStore.list(vault);
3276
+ const allParsers = [...nativeParsers, ...parsers];
3109
3277
  const resolvedParsers = service.parserIds.map((id) => allParsers.find((p) => p.id === id)).filter((p) => p !== void 0);
3110
3278
  resolvedService = { ...resolvedService, resolvedLogParsers: resolvedParsers };
3111
3279
  }
@@ -4556,6 +4724,12 @@ async function setLanMode(enabled) {
4556
4724
 
4557
4725
  // ../server/src/trpc/routers/settings.ts
4558
4726
  var NotificationPreferencesPatchSchema = NotificationPreferencesSchema.partial().strict();
4727
+ function listWithOrigin(parsers, vault) {
4728
+ return [
4729
+ ...nativeParsers.map((p) => ({ ...p, origin: "native" })),
4730
+ ...parsers.map((p) => ({ ...p, origin: vault ? "org" : "machine" }))
4731
+ ];
4732
+ }
4559
4733
  function maskApiKey2(plaintext) {
4560
4734
  if (plaintext.length <= 8) return "****";
4561
4735
  return plaintext.slice(0, 4) + "****" + plaintext.slice(-4);
@@ -4648,17 +4822,63 @@ var settingsRouter = router({
4648
4822
  }),
4649
4823
  /**
4650
4824
  * List all parsers
4825
+ *
4826
+ * Les natifs, puis ceux du coffre visé. L'origine accompagne chacun : un
4827
+ * parseur d'organisation se modifie pour toute l'équipe, et l'interface doit
4828
+ * pouvoir le dire avant que quelqu'un le change sans le savoir.
4651
4829
  */
4652
- listParsers: protectedProcedure.query(async () => {
4653
- const settings = await settingsManager.getSettings();
4654
- return [...nativeParsers, ...settings.logParsers || []];
4830
+ listParsers: protectedProcedure.input(z11.object(ScopeShape).optional()).query(async ({ input }) => {
4831
+ const vault = await scopeOf(input);
4832
+ return listWithOrigin(await logParserStore.list(vault), vault);
4833
+ }),
4834
+ /**
4835
+ * Les parseurs du coffre visé, à chaque fois qu'ils changent.
4836
+ *
4837
+ * Les services arrivent en temps réel, et un parseur écrit par un collègue
4838
+ * atteint le disque tout aussi vite ; sans ce flux, seul l'écran resterait en
4839
+ * retard — affichant une liste dans laquelle le parseur qu'un service vient
4840
+ * de référencer n'existe pas encore.
4841
+ */
4842
+ onParsersChanged: protectedProcedure.input(z11.object(ScopeShape).optional()).subscription(async function* ({ input, signal }) {
4843
+ const vault = await scopeOf(input);
4844
+ let pending = true;
4845
+ let wake = null;
4846
+ const off = logParserStore.onChanged((touched) => {
4847
+ if (touched !== vault) return;
4848
+ pending = true;
4849
+ if (wake) {
4850
+ wake();
4851
+ wake = null;
4852
+ }
4853
+ });
4854
+ const onAbort = () => {
4855
+ if (wake) {
4856
+ wake();
4857
+ wake = null;
4858
+ }
4859
+ };
4860
+ signal?.addEventListener("abort", onAbort);
4861
+ try {
4862
+ while (!signal?.aborted) {
4863
+ if (pending) {
4864
+ pending = false;
4865
+ yield listWithOrigin(await logParserStore.list(vault), vault);
4866
+ } else {
4867
+ await new Promise((resolve7) => {
4868
+ wake = resolve7;
4869
+ });
4870
+ }
4871
+ }
4872
+ } finally {
4873
+ off();
4874
+ signal?.removeEventListener("abort", onAbort);
4875
+ }
4655
4876
  }),
4656
4877
  /**
4657
4878
  * Get single parser by ID
4658
4879
  */
4659
- getParser: protectedProcedure.input(z11.object({ id: z11.string().max(128) })).query(async ({ input }) => {
4660
- const settings = await settingsManager.getSettings();
4661
- const parser = (settings.logParsers || []).find((p) => p.id === input.id);
4880
+ getParser: protectedProcedure.input(z11.object({ id: z11.string().max(128), ...ScopeShape })).query(async ({ input }) => {
4881
+ const parser = await logParserStore.get(input.id, await scopeOf(input));
4662
4882
  if (!parser) {
4663
4883
  throw new TRPCError8({ code: "NOT_FOUND", message: `Parser not found: ${input.id}` });
4664
4884
  }
@@ -4672,25 +4892,13 @@ var settingsRouter = router({
4672
4892
  id: true,
4673
4893
  createdAt: true,
4674
4894
  updatedAt: true
4675
- })
4895
+ }).extend(ScopeShape)
4676
4896
  ).mutation(async ({ input }) => {
4677
- if (!input.code.trim()) {
4897
+ const { orgId, projectId, ...fields } = input;
4898
+ if (!fields.code.trim()) {
4678
4899
  throw new TRPCError8({ code: "BAD_REQUEST", message: "Parser code cannot be empty" });
4679
4900
  }
4680
- const id = `parser-${Date.now()}-${Math.random().toString(36).substring(7)}`;
4681
- const now = /* @__PURE__ */ new Date();
4682
- const parser = {
4683
- id,
4684
- ...input,
4685
- createdAt: now,
4686
- updatedAt: now
4687
- };
4688
- const settings = await settingsManager.getSettings();
4689
- await settingsManager.saveSettings({
4690
- ...settings,
4691
- logParsers: [...settings.logParsers || [], parser]
4692
- });
4693
- return parser;
4901
+ return logParserStore.create(fields, await scopeOf({ orgId, projectId }));
4694
4902
  }),
4695
4903
  /**
4696
4904
  * Update existing parser
@@ -4699,53 +4907,32 @@ var settingsRouter = router({
4699
4907
  JSLogParserSchema.omit({
4700
4908
  createdAt: true,
4701
4909
  updatedAt: true
4702
- }).partial().required({ id: true })
4910
+ }).partial().required({ id: true }).extend(ScopeShape)
4703
4911
  ).mutation(async ({ input }) => {
4704
- const settings = await settingsManager.getSettings();
4705
- const parserIndex = (settings.logParsers || []).findIndex(
4706
- (p) => p.id === input.id
4707
- );
4708
- if (parserIndex === -1) {
4709
- throw new TRPCError8({ code: "NOT_FOUND", message: `Parser not found: ${input.id}` });
4710
- }
4711
- if (input.id.startsWith("native:")) {
4912
+ const { id, orgId, projectId, ...patch } = input;
4913
+ if (id.startsWith("native:")) {
4712
4914
  throw new TRPCError8({ code: "FORBIDDEN", message: "Cannot modify built-in parsers" });
4713
4915
  }
4714
- const existing = (settings.logParsers || [])[parserIndex];
4715
- if (input.code && !input.code.trim()) {
4916
+ if (patch.code !== void 0 && !patch.code.trim()) {
4716
4917
  throw new TRPCError8({ code: "BAD_REQUEST", message: "Parser code cannot be empty" });
4717
4918
  }
4718
- const updated = {
4719
- ...existing,
4720
- ...input,
4721
- updatedAt: /* @__PURE__ */ new Date()
4722
- };
4723
- const newParsers = [...settings.logParsers || []];
4724
- newParsers[parserIndex] = updated;
4725
- await settingsManager.saveSettings({
4726
- ...settings,
4727
- logParsers: newParsers
4728
- });
4919
+ const updated = await logParserStore.update(id, patch, await scopeOf({ orgId, projectId }));
4920
+ if (!updated) {
4921
+ throw new TRPCError8({ code: "NOT_FOUND", message: `Parser not found: ${id}` });
4922
+ }
4729
4923
  return updated;
4730
4924
  }),
4731
4925
  /**
4732
4926
  * Delete parser by ID
4733
4927
  */
4734
- deleteParser: protectedProcedure.input(z11.object({ id: z11.string().max(128) })).mutation(async ({ input }) => {
4735
- const settings = await settingsManager.getSettings();
4736
- const newParsers = (settings.logParsers || []).filter(
4737
- (p) => p.id !== input.id
4738
- );
4928
+ deleteParser: protectedProcedure.input(z11.object({ id: z11.string().max(128), ...ScopeShape })).mutation(async ({ input }) => {
4739
4929
  if (input.id.startsWith("native:")) {
4740
4930
  throw new TRPCError8({ code: "FORBIDDEN", message: "Cannot delete built-in parsers" });
4741
4931
  }
4742
- if (newParsers.length === (settings.logParsers || []).length) {
4932
+ const deleted = await logParserStore.delete(input.id, await scopeOf(input));
4933
+ if (!deleted) {
4743
4934
  throw new TRPCError8({ code: "NOT_FOUND", message: `Parser not found: ${input.id}` });
4744
4935
  }
4745
- await settingsManager.saveSettings({
4746
- ...settings,
4747
- logParsers: newParsers
4748
- });
4749
4936
  return { deleted: true };
4750
4937
  }),
4751
4938
  // ---------------------------------------------------------------------------
@@ -5447,6 +5634,24 @@ import { promisify as promisify3 } from "util";
5447
5634
  import { fileURLToPath as fileURLToPath2 } from "url";
5448
5635
 
5449
5636
  // ../../packages/ai-capabilities/src/capabilities.ts
5637
+ function toList(raw) {
5638
+ if (!raw) return [];
5639
+ const text = raw.trim();
5640
+ if (text.startsWith("[")) {
5641
+ try {
5642
+ const parsed = JSON.parse(text);
5643
+ if (Array.isArray(parsed)) return parsed.map((v) => String(v).trim()).filter(Boolean);
5644
+ } catch {
5645
+ }
5646
+ }
5647
+ return text.split(",").map((v) => v.trim().replace(/^["'[]+|["'\]]+$/g, "")).filter(Boolean);
5648
+ }
5649
+ function clearable(raw, parse2, key) {
5650
+ if (raw === void 0) return {};
5651
+ const text = String(raw).trim();
5652
+ if (!text || text === "null") return { [key]: null };
5653
+ return { [key]: parse2(text) };
5654
+ }
5450
5655
  var RUNEYA_CAPABILITIES = [
5451
5656
  {
5452
5657
  name: "list_services",
@@ -5570,11 +5775,11 @@ var RUNEYA_CAPABILITIES = [
5570
5775
  },
5571
5776
  {
5572
5777
  name: "kanban_search_cards",
5573
- description: "Search kanban cards by free text, matched against their title and body (accent- and case-insensitive). Searches every board of the organization unless boardId narrows it down.",
5778
+ description: "Search kanban cards by free text, matched against their title, body and comments (accent- and case-insensitive). Archived cards are included. Searches every board of the organization unless boardId narrows it down.",
5574
5779
  route: "kanban.searchCards",
5575
5780
  method: "GET",
5576
5781
  params: [
5577
- { name: "query", description: "Text to look for in card titles and bodies", required: true },
5782
+ { name: "query", description: "Text to look for in card titles, bodies and comments", required: true },
5578
5783
  { name: "boardId", description: "Restrict the search to this board. Omit to search all boards.", required: false },
5579
5784
  { name: "limit", description: "Maximum number of cards to return (1-100). Default: 25.", required: false },
5580
5785
  { name: "organizationId", description: "Which organization to search. Optional: needed only when the account belongs to several and the error message asks for it.", required: false }
@@ -5660,6 +5865,71 @@ var RUNEYA_CAPABILITIES = [
5660
5865
  { name: "content", description: "Card content in markdown", required: false }
5661
5866
  ],
5662
5867
  buildInput: (p) => ({ boardId: p.boardId, column: p.column, title: p.title, content: p.content })
5868
+ },
5869
+ {
5870
+ name: "kanban_get_card",
5871
+ description: "Read one kanban card by id, including archived ones. Cheaper than fetching the whole board, and the only way to read a card that has been archived.",
5872
+ route: "kanban.getCard",
5873
+ method: "GET",
5874
+ params: [
5875
+ { name: "boardId", description: "The kanban board ID", required: true },
5876
+ { name: "cardId", description: "The card ID", required: true }
5877
+ ],
5878
+ buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId })
5879
+ },
5880
+ {
5881
+ name: "kanban_update_card",
5882
+ description: "Update an existing kanban card. Only the fields you pass are changed; passing null to priority, color or deadline clears it. Prefer this over creating a second card when something needs correcting.",
5883
+ route: "kanban.updateCard",
5884
+ method: "POST",
5885
+ params: [
5886
+ { name: "boardId", description: "The kanban board ID", required: true },
5887
+ { name: "cardId", description: "The card ID", required: true },
5888
+ { name: "title", description: "New title", required: false },
5889
+ { name: "content", description: "New card content, in markdown", required: false },
5890
+ { name: "priority", description: "Priority from 1 to 10, or null to clear it", required: false },
5891
+ { name: "color", description: "Card colour, or null to clear it", required: false },
5892
+ { name: "groups", description: "Labels, as a list of strings. Replaces the current ones.", required: false },
5893
+ { name: "deadline", description: "Due date as YYYY-MM-DD, or null to clear it", required: false },
5894
+ { name: "assignees", description: "User ids to assign, as a list. Replaces the current ones; use kanban_list_members to find the ids.", required: false }
5895
+ ],
5896
+ buildInput: (p) => ({
5897
+ boardId: p.boardId,
5898
+ cardId: p.cardId,
5899
+ ...p.title !== void 0 ? { title: p.title } : {},
5900
+ ...p.content !== void 0 ? { content: p.content } : {},
5901
+ // Tout arrive en chaîne : un modèle n'écrit pas des nombres, des listes
5902
+ // ni des `null` typés. `clearable` distingue « efface » de « ne touche
5903
+ // pas » — sans quoi vider une couleur serait impossible à exprimer, et
5904
+ // changer un titre risquerait de vider le reste.
5905
+ ...clearable(p.priority, (v) => Number(v), "priority"),
5906
+ ...clearable(p.color, (v) => v, "color"),
5907
+ ...clearable(p.deadline, (v) => v, "deadline"),
5908
+ ...p.groups !== void 0 ? { groups: toList(p.groups) } : {},
5909
+ ...p.assignees !== void 0 ? { assignees: toList(p.assignees) } : {}
5910
+ })
5911
+ },
5912
+ {
5913
+ name: "kanban_set_card_archived",
5914
+ description: "Archive a kanban card (it leaves the board but is not deleted) or bring it back. An unarchived card returns to the column it left.",
5915
+ route: "kanban.setCardArchived",
5916
+ method: "POST",
5917
+ params: [
5918
+ { name: "boardId", description: "The kanban board ID", required: true },
5919
+ { name: "cardId", description: "The card ID", required: true },
5920
+ { name: "archived", description: "true to archive, false to bring the card back", required: true }
5921
+ ],
5922
+ buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, archived: p.archived === "true" })
5923
+ },
5924
+ {
5925
+ name: "kanban_list_members",
5926
+ description: "List the people of the organization who can be assigned to a card, with their ids. Needed before assigning anyone with kanban_update_card.",
5927
+ route: "kanban.listMembers",
5928
+ method: "GET",
5929
+ params: [
5930
+ { name: "organizationId", description: "Which organization. Optional: needed only when the account belongs to several and the error message asks for it.", required: false }
5931
+ ],
5932
+ buildInput: (p) => p.organizationId ? { organizationId: p.organizationId } : {}
5663
5933
  }
5664
5934
  ];
5665
5935
 
@@ -7223,7 +7493,7 @@ async function fetchProviderModels(provider, plaintextKey) {
7223
7493
  }
7224
7494
 
7225
7495
  // ../server/src/services/image-storage.service.ts
7226
- import { randomUUID as randomUUID4 } from "crypto";
7496
+ import { randomUUID as randomUUID5 } from "crypto";
7227
7497
  import { mkdir as mkdir15, writeFile as writeFile14, readFile as readFile15, unlink as unlink3, readdir as readdir4 } from "fs/promises";
7228
7498
  import { existsSync as existsSync2 } from "fs";
7229
7499
  import { join as join18, extname, resolve as resolve4, sep as sep2 } from "path";
@@ -7260,7 +7530,7 @@ var ImageStorageService = class {
7260
7530
  throw new Error(`Unsupported extension: ${ext}`);
7261
7531
  }
7262
7532
  await this.ensureTmpDir();
7263
- const imageId = randomUUID4();
7533
+ const imageId = randomUUID5();
7264
7534
  const safeExt = ext.replace(/[^a-z.]/g, "");
7265
7535
  const fileName = `${imageId}${safeExt}`;
7266
7536
  const filePath = join18(this.dir, fileName);
@@ -7407,9 +7677,6 @@ async function resolveImagesToBase64(images, contextId) {
7407
7677
  return results.filter((r) => r !== null);
7408
7678
  }
7409
7679
 
7410
- // ../server/src/services/kanban-commands.ts
7411
- import { randomUUID as randomUUID5 } from "crypto";
7412
-
7413
7680
  // ../server/src/trpc/routers/cloud-auth.ts
7414
7681
  import { z as z16 } from "zod";
7415
7682
  import { hostname } from "os";
@@ -7671,6 +7938,76 @@ var KanbanStore = class {
7671
7938
  });
7672
7939
  return { card: res.data?.card ?? null, unsupported: res.status === 404 };
7673
7940
  }
7941
+ /** Une carte, par son identifiant — archivée comprise. */
7942
+ async card(boardId, cardId) {
7943
+ const res = await callCloud(
7944
+ `/kanban/card/get?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}`
7945
+ );
7946
+ return res.data ?? null;
7947
+ }
7948
+ /**
7949
+ * Modifier une carte.
7950
+ *
7951
+ * L'absence d'un champ ne le touche pas ; `null` l'efface. C'est le contrat du
7952
+ * cloud, et le distinguer ici évite qu'un agent vide une couleur en voulant
7953
+ * simplement changer un titre.
7954
+ */
7955
+ async updateCard(boardId, cardId, patch) {
7956
+ const res = await callCloud("/kanban/card/update", {
7957
+ method: "POST",
7958
+ body: { boardId, cardId, ...patch }
7959
+ });
7960
+ return res.data?.card ?? null;
7961
+ }
7962
+ /** Ranger une carte, ou la reprendre. */
7963
+ async setCardArchived(boardId, cardId, archived) {
7964
+ const res = await callCloud(`/kanban/card/${archived ? "archive" : "unarchive"}`, {
7965
+ method: "POST",
7966
+ body: { boardId, cardId }
7967
+ });
7968
+ return res.ok;
7969
+ }
7970
+ /**
7971
+ * Les membres de l'organisation — sans quoi assigner reviendrait à deviner
7972
+ * un identifiant.
7973
+ */
7974
+ async members(organizationId) {
7975
+ const orgId = await resolveOrganizationId(organizationId);
7976
+ const res = must(
7977
+ await callCloud(
7978
+ `/organization/get-full-organization?organizationId=${encodeURIComponent(orgId)}`
7979
+ )
7980
+ );
7981
+ return (res.members ?? []).map((m) => ({
7982
+ id: m.userId,
7983
+ name: m.user?.name?.trim() || m.user?.email || m.userId,
7984
+ email: m.user?.email ?? ""
7985
+ }));
7986
+ }
7987
+ /**
7988
+ * Chercher des cartes — dans le cloud, pas ici.
7989
+ *
7990
+ * Cette recherche téléchargeait autrefois **tous les tableaux** de
7991
+ * l'organisation, entiers, pour filtrer ensuite en mémoire sur le titre et le
7992
+ * corps. Elle coûtait donc le poids du kanban complet à chaque appel, ne
7993
+ * voyait pas les commentaires — ils ne voyagent plus avec le tableau — et
7994
+ * ignorait les cartes rangées, absentes des colonnes.
7995
+ *
7996
+ * Le cloud fait la même recherche que ses propres écrans : titre, corps et
7997
+ * commentaires, sans casse ni accents.
7998
+ */
7999
+ async searchCards(input) {
8000
+ const orgId = await resolveOrganizationId(input.organizationId);
8001
+ const query = new URLSearchParams({ organizationId: orgId, q: input.query });
8002
+ if (input.boardId) query.set("boardId", input.boardId);
8003
+ if (input.limit) query.set("limit", String(input.limit));
8004
+ const res = must(
8005
+ await callCloud(
8006
+ `/kanban/card/search?${query.toString()}`
8007
+ )
8008
+ );
8009
+ return { cards: res.cards ?? [], total: res.total ?? 0, truncated: Boolean(res.truncated) };
8010
+ }
7674
8011
  /** Déplacer une carte, sans réécrire le tableau. */
7675
8012
  async moveCard(boardId, cardId, toColumnId) {
7676
8013
  const res = await callCloud("/kanban/card/move", {
@@ -7799,27 +8136,9 @@ async function addCardOrFallback(board, columnTitle, cardTitle, cardContent) {
7799
8136
  markdown: cardContent
7800
8137
  });
7801
8138
  if (card) return;
7802
- if (!unsupported) {
7803
- console.warn(`[kanban-commands] add_card failed: column="${columnTitle}"`);
7804
- return;
7805
- }
7806
- console.warn("[kanban-commands] cloud sans /kanban/card/add \u2014 repli sur la sauvegarde du tableau");
7807
- const col = board.columns.find((c) => c.title.toLowerCase() === columnTitle.toLowerCase());
7808
- if (!col) return;
7809
- const now = (/* @__PURE__ */ new Date()).toISOString();
7810
- col.cards.push({
7811
- id: randomUUID5(),
7812
- title: cardTitle,
7813
- markdown: cardContent ?? "",
7814
- images: [],
7815
- attachments: [],
7816
- assignees: [],
7817
- order: col.cards.reduce((max, c) => Math.max(max, c.order + 1), 0),
7818
- history: [{ type: "created", timestamp: now, detail: `AI \u2014 In column "${col.title}"` }],
7819
- createdAt: now,
7820
- updatedAt: now
7821
- });
7822
- await kanbanStore.update({ id: board.id, columns: board.columns });
8139
+ console.warn(
8140
+ unsupported ? `[kanban-commands] cloud sans /kanban/card/add \u2014 carte \xAB ${cardTitle} \xBB non cr\xE9\xE9e` : `[kanban-commands] add_card failed: column="${columnTitle}"`
8141
+ );
7823
8142
  }
7824
8143
  function formatSize(bytes) {
7825
8144
  if (bytes < 1024) return `${bytes} o`;
@@ -8169,7 +8488,7 @@ function tailTranscript(opts) {
8169
8488
 
8170
8489
  // ../server/src/services/ai-runners/claude-pty-runner.ts
8171
8490
  async function getAgentManager() {
8172
- const { agentManager: agentManager2 } = await import("./agent-manager-DM6C7BTF.js");
8491
+ const { agentManager: agentManager2 } = await import("./agent-manager-KM7SFKVR.js");
8173
8492
  return agentManager2;
8174
8493
  }
8175
8494
  function buildPtyArgs(params, sessionId, opts) {
@@ -8910,7 +9229,7 @@ async function shutdownCodexAppServer() {
8910
9229
  }
8911
9230
  }
8912
9231
  async function getAgentManager2() {
8913
- const { agentManager: agentManager2 } = await import("./agent-manager-DM6C7BTF.js");
9232
+ const { agentManager: agentManager2 } = await import("./agent-manager-KM7SFKVR.js");
8914
9233
  return agentManager2;
8915
9234
  }
8916
9235
  function parseRuneyaCurlCommand(command) {
@@ -13352,11 +13671,6 @@ function summarizeCard(card, boardId, columnTitle) {
13352
13671
  updatedAt: card.updatedAt
13353
13672
  };
13354
13673
  }
13355
- function boardCards(board) {
13356
- return [...board.columns].sort((a, b) => a.order - b.order).flatMap(
13357
- (col) => [...col.cards].sort((a, b) => a.order - b.order).map((card) => summarizeCard(card, board.id, col.title))
13358
- );
13359
- }
13360
13674
  function boardCounts(board) {
13361
13675
  const summary = board;
13362
13676
  const columns = board.columns ?? [];
@@ -13366,9 +13680,6 @@ function boardCounts(board) {
13366
13680
  columns: columns.map((c) => c.title)
13367
13681
  };
13368
13682
  }
13369
- function normalize(value) {
13370
- return value.normalize("NFD").replace(new RegExp("\\p{Diacritic}", "gu"), "").toLowerCase();
13371
- }
13372
13683
  var ATTACHMENT_ID_REGEX = /^[A-Za-z0-9_-]{1,128}$/;
13373
13684
  function safeDecode(value) {
13374
13685
  try {
@@ -13498,13 +13809,7 @@ var kanbanRouter = router({
13498
13809
  limit: z23.number().int().min(1).max(100).optional(),
13499
13810
  organizationId: z23.string().max(128).optional()
13500
13811
  })).query(async ({ input }) => {
13501
- const needle = normalize(input.query);
13502
- const ids = input.boardId ? [input.boardId] : (await kanbanStore.list(false, input.organizationId)).boards.map((b) => b.id);
13503
- const boards = (await Promise.all(ids.map((id) => kanbanStore.get(id)))).filter((b) => b !== null);
13504
- const matches = boards.flatMap((board) => boardCards(board).map((card) => ({ board: board.name, ...card }))).filter(
13505
- (card) => normalize(String(card["title"] ?? "")).includes(needle) || normalize(String(card["markdown"] ?? "")).includes(needle)
13506
- );
13507
- return { total: matches.length, cards: matches.slice(0, input.limit ?? 25) };
13812
+ return kanbanStore.searchCards(input);
13508
13813
  }),
13509
13814
  /**
13510
13815
  * Le fil de commentaires d'une carte, relu à la demande.
@@ -13583,7 +13888,7 @@ var kanbanRouter = router({
13583
13888
  addComment: protectedProcedure.input(z23.object({
13584
13889
  boardId: z23.string().max(128),
13585
13890
  cardId: z23.string().max(128),
13586
- comment: z23.string().max(2e4)
13891
+ comment: z23.string().max(1e5)
13587
13892
  })).mutation(async ({ input }) => {
13588
13893
  await executeKanbanCommands(input.boardId, input.cardId, [
13589
13894
  { type: "add_comment", comment: input.comment }
@@ -13601,6 +13906,62 @@ var kanbanRouter = router({
13601
13906
  ]);
13602
13907
  return { ok: true };
13603
13908
  }),
13909
+ /**
13910
+ * Lire une carte, seule.
13911
+ *
13912
+ * `getBoard` rapatrie le tableau entier pour n'en regarder qu'une ; et il ne
13913
+ * porte pas les cartes rangées. Une carte s'adresse par son identifiant.
13914
+ */
13915
+ getCard: protectedProcedure.input(z23.object({ boardId: z23.string().max(128), cardId: z23.string().max(128) })).query(async ({ input }) => {
13916
+ const found = await kanbanStore.card(input.boardId, input.cardId);
13917
+ if (!found) throw new Error(`Carte ${input.cardId} introuvable sur le tableau ${input.boardId}.`);
13918
+ return { ...summarizeCard(found.card, input.boardId, ""), columnId: found.columnId };
13919
+ }),
13920
+ /**
13921
+ * Modifier une carte.
13922
+ *
13923
+ * Le manque le plus coûteux du kanban vu par un agent : sans lui, il ne
13924
+ * pouvait qu'ajouter. Face à une carte à corriger, il en créait une seconde.
13925
+ *
13926
+ * Un champ absent n'est pas touché ; `null` l'efface. La distinction compte —
13927
+ * changer un titre ne doit pas vider une couleur.
13928
+ */
13929
+ updateCard: protectedProcedure.input(z23.object({
13930
+ boardId: z23.string().max(128),
13931
+ cardId: z23.string().max(128),
13932
+ title: z23.string().min(1).max(512).optional(),
13933
+ content: z23.string().max(1e5).optional(),
13934
+ priority: z23.number().int().min(1).max(10).nullable().optional(),
13935
+ color: z23.string().max(32).nullable().optional(),
13936
+ groups: z23.array(z23.string().min(1).max(60)).max(30).optional(),
13937
+ deadline: z23.string().regex(/^\d{4}-\d{2}-\d{2}$/).nullable().optional(),
13938
+ assignees: z23.array(z23.string().max(128)).max(50).optional()
13939
+ })).mutation(async ({ input }) => {
13940
+ const { boardId, cardId, content, ...rest } = input;
13941
+ const patch = { ...rest };
13942
+ if (content !== void 0) patch.markdown = content;
13943
+ if (!Object.keys(patch).length) throw new Error("Rien \xE0 modifier : pr\xE9cisez au moins un champ.");
13944
+ const card = await kanbanStore.updateCard(boardId, cardId, patch);
13945
+ if (!card) throw new Error(`La carte ${cardId} n'a pas pu \xEAtre modifi\xE9e.`);
13946
+ return summarizeCard(card, boardId, "");
13947
+ }),
13948
+ /** Ranger une carte, ou la reprendre. */
13949
+ setCardArchived: protectedProcedure.input(z23.object({
13950
+ boardId: z23.string().max(128),
13951
+ cardId: z23.string().max(128),
13952
+ archived: z23.boolean()
13953
+ })).mutation(async ({ input }) => {
13954
+ const ok = await kanbanStore.setCardArchived(input.boardId, input.cardId, input.archived);
13955
+ if (!ok) throw new Error(`La carte ${input.cardId} n'a pas pu \xEAtre ${input.archived ? "archiv\xE9e" : "reprise"}.`);
13956
+ return { ok: true };
13957
+ }),
13958
+ /**
13959
+ * Qui peut se voir assigner une carte.
13960
+ *
13961
+ * Sans cette liste, assigner revient à deviner un identifiant — et l'agent
13962
+ * n'a aucun moyen de le trouver.
13963
+ */
13964
+ listMembers: protectedProcedure.input(z23.object({ organizationId: z23.string().max(128).optional() })).query(async ({ input }) => ({ members: await kanbanStore.members(input.organizationId) })),
13604
13965
  /**
13605
13966
  * Fetch one card attachment from the cloud and drop it on this machine, so an
13606
13967
  * agent can open it with its own file tools. The bytes never go through the
@@ -14190,6 +14551,7 @@ var RECONNECT_DELAY_MS = 3e3;
14190
14551
  var UNAUTHENTICATED_RETRY_MS = 5 * 6e4;
14191
14552
  var OUTDATED_RETRY_MS = 30 * 6e4;
14192
14553
  var COLLECTIONS = ["projects", "services", "environments"];
14554
+ var PARSERS = "logParsers";
14193
14555
  var SyncAuthError = class extends Error {
14194
14556
  constructor(status) {
14195
14557
  super(`cloud rejected the session (HTTP ${status})`);
@@ -14221,6 +14583,7 @@ var OrgSyncConnection = class {
14221
14583
  projects = getCollection(this.doc, "projects");
14222
14584
  services = getCollection(this.doc, "services");
14223
14585
  environments = getCollection(this.doc, "environments");
14586
+ logParsers = getCollection(this.doc, PARSERS);
14224
14587
  conn = randomUUID11();
14225
14588
  link;
14226
14589
  stopped = false;
@@ -14289,9 +14652,14 @@ var OrgSyncConnection = class {
14289
14652
  void this.applyDocEventsToStore(name, events, isInitial);
14290
14653
  });
14291
14654
  }
14655
+ this.logParsers.observeDeep((events, txn) => {
14656
+ if (txn.origin !== REMOTE_ORIGIN) return;
14657
+ void this.applyParserEventsToStore(events);
14658
+ });
14292
14659
  projectStore.events.on("saved", this.onSaved);
14293
14660
  this.unsubscribes.push(serviceStore.onChange(this.onSaved));
14294
14661
  this.unsubscribes.push(environmentStore.onChange(this.onSaved));
14662
+ this.unsubscribes.push(logParserStore.onLocalChange(this.onSaved));
14295
14663
  await this.reconcileLocalToDoc();
14296
14664
  this.initializing = false;
14297
14665
  this.needsPush = true;
@@ -14639,6 +15007,54 @@ var OrgSyncConnection = class {
14639
15007
  await this.upsertLocally(name, id, fields);
14640
15008
  }
14641
15009
  }
15010
+ /**
15011
+ * Nombre d'applications distantes de parseurs en cours.
15012
+ *
15013
+ * La réconciliation lit le coffre et supprime du document ce qu'elle n'y
15014
+ * trouve pas ; déclenchée par un service enregistré au même instant, elle
15015
+ * lirait un coffre où le parseur qui arrive n'est pas encore écrit — et
15016
+ * l'effacerait pour toute l'organisation. Un compteur plutôt qu'un booléen :
15017
+ * plusieurs évènements peuvent se chevaucher, et le premier terminé ne doit
15018
+ * pas rouvrir la porte pour les autres.
15019
+ */
15020
+ applyingParsers = 0;
15021
+ /**
15022
+ * Porter au disque les parseurs que le document vient de changer.
15023
+ *
15024
+ * Une suppression est appliquée telle quelle, sans l'équivalent du garde qui
15025
+ * protège les contenus d'un projet non téléchargé : chaque membre tient le
15026
+ * jeu complet de l'organisation, donc un parseur retiré du document l'a bien
15027
+ * été pour tout le monde.
15028
+ */
15029
+ async applyParserEventsToStore(events) {
15030
+ const deleted = /* @__PURE__ */ new Set();
15031
+ const affected = /* @__PURE__ */ new Set();
15032
+ for (const event of events) {
15033
+ if (event.target === this.logParsers) {
15034
+ for (const [key, change] of event.changes.keys) {
15035
+ if (change.action === "delete") deleted.add(key);
15036
+ else affected.add(key);
15037
+ }
15038
+ } else {
15039
+ const topKey = event.path[0];
15040
+ if (typeof topKey === "string") affected.add(topKey);
15041
+ }
15042
+ }
15043
+ this.applyingParsers += 1;
15044
+ try {
15045
+ for (const id of deleted) {
15046
+ await logParserStore.applyRemoteDelete(id, this.link.orgId);
15047
+ }
15048
+ for (const id of affected) {
15049
+ if (deleted.has(id)) continue;
15050
+ const fields = readEntity(this.logParsers, id);
15051
+ if (!fields) continue;
15052
+ await logParserStore.applyRemoteUpsert(id, fields, this.link.orgId);
15053
+ }
15054
+ } finally {
15055
+ this.applyingParsers -= 1;
15056
+ }
15057
+ }
14642
15058
  async upsertLocally(name, id, fields) {
14643
15059
  if (name === "services") {
14644
15060
  await serviceStore.applyRemoteUpsert(id, fields, this.link.orgId);
@@ -14725,6 +15141,8 @@ var OrgSyncConnection = class {
14725
15141
  environmentStore.listEncryptedByProjectIds(projectIds)
14726
15142
  ]);
14727
15143
  if (this.stopped) return;
15144
+ const parsers = (await logParserStore.list(this.link.orgId)).filter(isShareable);
15145
+ if (this.stopped) return;
14728
15146
  const local = { projects, services, environments };
14729
15147
  const ownedProjectIds = new Set(projectIds);
14730
15148
  this.doc.transact(() => {
@@ -14739,6 +15157,13 @@ var OrgSyncConnection = class {
14739
15157
  if (this.belongsToOwnedProject(name, id, ownedProjectIds)) collection.delete(id);
14740
15158
  }
14741
15159
  }
15160
+ const parserIds = new Set(parsers.map((p) => p.id));
15161
+ for (const parser of parsers) writeEntity(this.logParsers, parser.id, parser);
15162
+ if (this.applyingParsers === 0) {
15163
+ for (const id of Array.from(this.logParsers.keys())) {
15164
+ if (!parserIds.has(id)) this.logParsers.delete(id);
15165
+ }
15166
+ }
14742
15167
  }, LOCAL_ORIGIN);
14743
15168
  }
14744
15169
  /**
@@ -14792,6 +15217,7 @@ var CloudSyncBridge = class {
14792
15217
  console.error("[cloud-sync] could not read which organizations to sync:", err.message);
14793
15218
  return;
14794
15219
  }
15220
+ await this.migrateMachineParsers(links);
14795
15221
  for (const link of links) await this.connect(link);
14796
15222
  const connected = this.connections.size;
14797
15223
  if (links.length > 0) {
@@ -14827,8 +15253,28 @@ var CloudSyncBridge = class {
14827
15253
  console.error("[cloud-sync] could not read which organizations to sync:", err.message);
14828
15254
  return;
14829
15255
  }
15256
+ await this.migrateMachineParsers(links);
14830
15257
  for (const link of links) await this.connect(link);
14831
15258
  }
15259
+ /**
15260
+ * Déplacer les parseurs du poste dans les organisations de cette machine.
15261
+ *
15262
+ * Avant d'ouvrir les connexions, pour que la première réconciliation parte
15263
+ * d'un coffre déjà complet — sinon les parseurs partiraient au document au
15264
+ * coup d'après, ce qui marche mais laisse une fenêtre où l'équipe voit une
15265
+ * liste vide.
15266
+ *
15267
+ * Fait ici plutôt que dans chaque connexion : la liste du poste est vidée à
15268
+ * la fin, et deux connexions qui migreraient en parallèle se la
15269
+ * disputeraient — la seconde trouverait une machine déjà vide.
15270
+ */
15271
+ async migrateMachineParsers(links) {
15272
+ try {
15273
+ await logParserStore.migrateMachineParsersInto(links.map((l) => l.orgId));
15274
+ } catch (err) {
15275
+ console.error("[cloud-sync] could not move machine parsers into organizations:", err.message);
15276
+ }
15277
+ }
14832
15278
  /** Per-org sync state, for the UI. */
14833
15279
  states() {
14834
15280
  const live = Array.from(this.connections.entries()).map(([orgId, conn]) => ({
@@ -17761,4 +18207,4 @@ export {
17761
18207
  pullEnv,
17762
18208
  registerInstance
17763
18209
  };
17764
- //# sourceMappingURL=src-MEMRUBM6.js.map
18210
+ //# sourceMappingURL=src-6PAM4JRF.js.map