@runeya/runeya 2.0.138 → 2.0.139

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 (397) hide show
  1. package/agent/index.js +12 -0
  2. package/agent/index.js.map +1 -1
  3. package/agent-manager-NAGIMH2T.js +11 -0
  4. package/chat-Q2UMYXQL.js +21 -0
  5. package/{chunk-ZFELQG4B.js → chunk-EV3TBM7E.js} +78 -5
  6. package/chunk-EV3TBM7E.js.map +1 -0
  7. package/{chunk-C6LIGJFX.js → chunk-GLIU3J47.js} +354 -128
  8. package/chunk-GLIU3J47.js.map +1 -0
  9. package/{chunk-BDQOBEZ3.js → chunk-GOMF7NWS.js} +2 -2
  10. package/{desktop-launcher-3COY6F6H.js → chunk-GWQV5KKU.js} +193 -13
  11. package/chunk-GWQV5KKU.js.map +1 -0
  12. package/{chunk-5EMEJNVU.js → chunk-LE6XQ3OV.js} +13 -1
  13. package/chunk-LE6XQ3OV.js.map +1 -0
  14. package/{chunk-ALWA4K5L.js → chunk-MSICJEZD.js} +4 -4
  15. package/{chunk-GUIONCNA.js → chunk-WNCXZ6E7.js} +164 -124
  16. package/chunk-WNCXZ6E7.js.map +1 -0
  17. package/{chunk-I7JHF5FE.js → chunk-XHGJHYDC.js} +4 -4
  18. package/chunk-YSYLL57J.js +87 -0
  19. package/chunk-YSYLL57J.js.map +1 -0
  20. package/{companion-JYLQKSFO.js → companion-MGX62L4T.js} +8 -6
  21. package/desktop-installer-page-OJTOKP7V.js +598 -0
  22. package/desktop-installer-page-OJTOKP7V.js.map +1 -0
  23. package/desktop-launcher-HKXP4LRI.js +43 -0
  24. package/desktop-wizard-XIDDAG7L.js +15 -0
  25. package/index.js +29 -20
  26. package/index.js.map +1 -1
  27. package/mcp-server/index.js +49 -1
  28. package/mcp-server/index.js.map +1 -1
  29. package/package.json +1 -1
  30. package/settings-manager-BBNCDDQJ.js +10 -0
  31. package/settings-manager-BBNCDDQJ.js.map +1 -0
  32. package/{src-42DMJB3D.js → src-KWLVQD36.js} +191 -90
  33. package/src-KWLVQD36.js.map +1 -0
  34. package/{vault-resolver-57Q2DVOR.js → vault-resolver-B5P2OUI5.js} +20 -2
  35. package/vault-resolver-B5P2OUI5.js.map +1 -0
  36. package/web/assets/AgentScalarChatInterface.vue-CqGVVIo8.js +13 -0
  37. package/web/assets/AgentTerminalPage-mVD1jsWC.js +1 -0
  38. package/web/assets/AiChatPage-J-JAXhoT.js +1 -0
  39. package/web/assets/AppLayout-6eKmu_TP.css +1 -0
  40. package/web/assets/AppLayout-CsUnvWA0.js +1 -0
  41. package/web/assets/AuditPage-gzMJbY4c.js +1 -0
  42. package/web/assets/CloudAccountPage-CIUmdyoI.js +1 -0
  43. package/web/assets/CloudAccountPage-Cm1ibhZY.js +1 -0
  44. package/web/assets/CloudAccountPage-eoNciq1Q.css +1 -0
  45. package/web/assets/CloudMessagingPage-EV4MwYrk.js +2 -0
  46. package/web/assets/DashboardPage-CrMccWRA.js +1 -0
  47. package/web/assets/DirectoryPickerDialog-Cnr4SkLc.js +1 -0
  48. package/web/assets/DirectoryPickerDialog-D1lQ83i5.css +1 -0
  49. package/web/assets/{EditorIcon-DXYoMZnL.js → EditorIcon-Dlr9ami0.js} +2 -2
  50. package/web/assets/{EnvironmentForm-D3pZuxVn.js → EnvironmentForm-NiG4dzT9.js} +2 -2
  51. package/web/assets/EnvironmentFormPage-TJzOWwS7.js +1 -0
  52. package/web/assets/EnvironmentListPage-oR335kl1.js +1 -0
  53. package/web/assets/KanbanBoardPage-Cta-iCIL.css +1 -0
  54. package/web/assets/KanbanBoardPage-Dol6K6rI.js +4 -0
  55. package/web/assets/KanbanListPage-C2yhMB2L.js +1 -0
  56. package/web/assets/{KanbanListPage-DxJFx6A6.css → KanbanListPage-CEJ9Vluh.css} +1 -1
  57. package/web/assets/LaunchProjectPage-BGIRMKdM.js +1 -0
  58. package/web/assets/LaunchProjectPage-CU2iF25_.css +1 -0
  59. package/web/assets/LaunchServicesPage-9aAno4Gc.css +1 -0
  60. package/web/assets/LaunchServicesPage-DqIG8ZDk.js +1 -0
  61. package/web/assets/LaunchShell-C7RrqA4k.js +1 -0
  62. package/web/assets/LaunchShell-CGtjrl6_.css +1 -0
  63. package/web/assets/LogViewer-BWtCyqa4.js +3 -0
  64. package/web/assets/OrgKeyPrompt-B343sYVi.css +1 -0
  65. package/web/assets/OrgKeyPrompt-IjlZPHOI.js +1 -0
  66. package/web/assets/OrgLogo-B0TayK5W.js +1 -0
  67. package/web/assets/ProcessControls-Bw28Duzs.js +1 -0
  68. package/web/assets/ProcessDetailPage-CVYQJ4aI.js +1 -0
  69. package/web/assets/{ProcessMetrics-CdQc_8Z0.js → ProcessMetrics-D0HzDnGO.js} +3 -3
  70. package/web/assets/ProjectCreateDialog-CLFPf8ds.js +1 -0
  71. package/web/assets/ProjectCreateDialog-UEIYMerY.css +1 -0
  72. package/web/assets/ProjectLocationGate-D68jdBcV.js +1 -0
  73. package/web/assets/ProjectPublishDialog-CDpS6xcQ.css +1 -0
  74. package/web/assets/ProjectPublishDialog-Cvvjeuyq.js +1 -0
  75. package/web/assets/RandomJobTestPage-CuUJfwwb.js +2 -0
  76. package/web/assets/ScenarioEditorPage-Ckq6XNl2.js +14 -0
  77. package/web/assets/SendToChatDialog-4a4_2amD.js +1 -0
  78. package/web/assets/ServiceControlsBar-OC7cDCM7.js +1 -0
  79. package/web/assets/ServiceDetailPage-BMlS1q4i.js +2 -0
  80. package/web/assets/ServiceFormPage-CozmJNy1.js +1 -0
  81. package/web/assets/{SettingsPage-DA7lVKfg.css → SettingsPage-CF548HPl.css} +1 -1
  82. package/web/assets/SettingsPage-CkJQwWCW.js +2063 -0
  83. package/web/assets/UnlockPage-94m6Ap-H.js +1 -0
  84. package/web/assets/VaultMigrationPage-Bj6KgIUi.js +1 -0
  85. package/web/assets/VersionBadge-DjTAz-tn.js +1 -0
  86. package/web/assets/WikiPage-n_vxXevo.js +1 -0
  87. package/web/assets/WikiView-lxEITfCa.js +1 -0
  88. package/web/assets/add-scalar-classes-lFkCrmFv.js +387 -0
  89. package/web/assets/{autocomplete-DobAPPYJ.js → autocomplete-bClqtFV-.js} +3 -3
  90. package/web/assets/{basic-shape-diamond.svg-FbeAPLc-.js → basic-shape-diamond.svg-DFdUK3gN.js} +1 -1
  91. package/web/assets/{basic-shape-hexagon.svg-CtwcdpTe.js → basic-shape-hexagon.svg-BKiT9xxU.js} +1 -1
  92. package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-DsSs3S2_.js → basic-shape-primary-circle-ellipse-round.svg-tmXcRxRQ.js} +1 -1
  93. package/web/assets/{basic-shape-primary-square-rectangle.svg-CNe1RNx8.js → basic-shape-primary-square-rectangle.svg-C9duFSNc.js} +1 -1
  94. package/web/assets/{basic-shape-shield.svg-DwZMLfah.js → basic-shape-shield.svg-CLzO94DF.js} +1 -1
  95. package/web/assets/{browser-Dz1gvldT.js → browser-BEDlGGfe.js} +1 -1
  96. package/web/assets/{browser-DsZ9HxVm.js → browser-CivlztYP.js} +1 -1
  97. package/web/assets/card-wcTFC8yG.js +32 -0
  98. package/web/assets/{checkbox-DPknldTJ.js → checkbox-TtO_mmrY.js} +2 -2
  99. package/web/assets/{chevronup-D2Lr2GiV.js → chevronup-Cd93cHVj.js} +4 -4
  100. package/web/assets/{chip-Caiakd-N.js → chip-omKmLLWH.js} +2 -2
  101. package/web/assets/client-BKIls6aD.js +24 -0
  102. package/web/assets/cloud-chat.store-Bskr_EXO.js +1 -0
  103. package/web/assets/cloud-client-rcfqjfUK.js +1 -0
  104. package/web/assets/cloud-session-CycNU7YV.js +1 -0
  105. package/web/assets/cloud-session-DiaAeCJI.js +2 -0
  106. package/web/assets/column-DgtEciO-.js +763 -0
  107. package/web/assets/composables-Ce8WccBy.js +1 -0
  108. package/web/assets/{computer-device-desktop-monitor.svg-CwiGN14T.js → computer-device-desktop-monitor.svg-D3YaocxY.js} +1 -1
  109. package/web/assets/{computer-device-desktop.svg-BC2VdXDZ.js → computer-device-desktop.svg-lnn_cyCx.js} +1 -1
  110. package/web/assets/{computer-device-laptop.svg-BOp8AKN6.js → computer-device-laptop.svg-9f5_Ipnq.js} +1 -1
  111. package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-CmbpPX1u.js → computer-device-mobile-phone-android-samsung-back.svg-DxHwZI5u.js} +1 -1
  112. package/web/assets/{computer-device-mobile-phone-android-samsung.svg-_WGKWVtZ.js → computer-device-mobile-phone-android-samsung.svg-CnYqoXt4.js} +1 -1
  113. package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-DmLh97KG.js → computer-device-mobile-phone-iphone-x-back.svg-D8JfsF_0.js} +1 -1
  114. package/web/assets/{computer-device-mobile-phone-iphone-x.svg-C7-5mdyV.js → computer-device-mobile-phone-iphone-x.svg-CUbRWc7v.js} +1 -1
  115. package/web/assets/{computer-device-mobile-tablet-touch.svg-DiUaSnhU.js → computer-device-mobile-tablet-touch.svg-CBX2kbI1.js} +1 -1
  116. package/web/assets/{computer-device-mobile-tablet.svg-B6nfbYm_.js → computer-device-mobile-tablet.svg-CIn05KEg.js} +1 -1
  117. package/web/assets/{computer-device-network-ethernet-cat6.svg-DwtVKy79.js → computer-device-network-ethernet-cat6.svg-Dj0GRqXd.js} +1 -1
  118. package/web/assets/{computer-device-network-lan-www.svg-vQKfG3Xz.js → computer-device-network-lan-www.svg-D-G7js6t.js} +1 -1
  119. package/web/assets/{computer-device-network-wifi-connection.svg-DhHaOUge.js → computer-device-network-wifi-connection.svg-JnvMwBMA.js} +1 -1
  120. package/web/assets/{computer-device-network-wifi-router.svg-1dQS4k4J.js → computer-device-network-wifi-router.svg--XxSrk_J.js} +1 -1
  121. package/web/assets/{cssMode-CdQL22W5.js → cssMode-C3gHbz_w.js} +1 -1
  122. package/web/assets/{divider-DhYR4BAO.js → divider-eMI33mv1.js} +2 -2
  123. package/web/assets/{docx-preview-D-jP_CCs.js → docx-preview-CTkzTOcl.js} +1 -1
  124. package/web/assets/{ecology-science-erlenmeyer-flask.svg-D76wQVA2.js → ecology-science-erlenmeyer-flask.svg-DrHKX7bH.js} +1 -1
  125. package/web/assets/{fieldset-BtOjs_Hh.js → fieldset-CiIJH8Xe.js} +2 -2
  126. package/web/assets/{freemarker2-BADW9vhy.js → freemarker2-DWxB7Wcd.js} +1 -1
  127. package/web/assets/{handlebars-CwWQD_C8.js → handlebars-CWUdFsNH.js} +1 -1
  128. package/web/assets/{html-y87CEbe3.js → html-DhvF7iHg.js} +1 -1
  129. package/web/assets/{htmlMode-CVagtvVh.js → htmlMode-CIuDa6YW.js} +1 -1
  130. package/web/assets/{image-flash-lightning.svg-OvpKi3a3.js → image-flash-lightning.svg-qFK_1eYx.js} +1 -1
  131. package/web/assets/{image-picture-flower.svg-DLOePozT.js → image-picture-flower.svg-qAmkHnOu.js} +1 -1
  132. package/web/assets/{index-CcIrffU_.js → index-CzSAFmCu.js} +363 -363
  133. package/web/assets/index-D0IPNhsg.css +1 -0
  134. package/web/assets/{interface-alert-exclamation-diamond.svg-4Vk7SoQ1.js → interface-alert-exclamation-diamond.svg-Dugh0ymo.js} +1 -1
  135. package/web/assets/{interface-alert-exclamation-triangle-warning.svg-BLAvc4am.js → interface-alert-exclamation-triangle-warning.svg-8neoRFVP.js} +1 -1
  136. package/web/assets/{interface-alert-information-circle.svg-CaAXpDAI.js → interface-alert-information-circle.svg-DM9S7DBv.js} +1 -1
  137. package/web/assets/{interface-award-crown.svg-CW7XG0wx.js → interface-award-crown.svg--68HCcUG.js} +1 -1
  138. package/web/assets/{interface-bookmark.svg-BpLEuOv2.js → interface-bookmark-tag.svg-BESGrlZw.js} +1 -1
  139. package/web/assets/{interface-bookmark-tag.svg-DPWVVeZU.js → interface-bookmark.svg-CVadIwuA.js} +1 -1
  140. package/web/assets/{interface-calendar-date-one.svg-DbBgvI4W.js → interface-calendar-date-one.svg-D9XP9Dv_.js} +1 -1
  141. package/web/assets/{interface-content-book-open-pages.svg-BbsuvPZM.js → interface-content-book-open-pages.svg-DMI3yFmk.js} +1 -1
  142. package/web/assets/{interface-content-book-page.svg-DbRPz1j8.js → interface-content-book-page.svg-BPxSHq3g.js} +1 -1
  143. package/web/assets/{interface-content-file.svg-OJPKABxS.js → interface-content-file.svg-D0Mbjb8x.js} +1 -1
  144. package/web/assets/interface-content-folder.svg-D3wbwhAD.js +1 -0
  145. package/web/assets/{interface-content-folder.svg-3D_5OE_-.js → interface-content-folder.svg-EUO1l7Mn.js} +1 -1
  146. package/web/assets/{interface-copy-clipboard.svg-DqthVh9J.js → interface-copy-clipboard.svg-DI-wp72J.js} +1 -1
  147. package/web/assets/{interface-edit-attachment.svg-BAPCnZ0B.js → interface-edit-attachment.svg-CrWbaWn_.js} +1 -1
  148. package/web/assets/{interface-edit-binocular.svg-BoV39ouF.js → interface-edit-binocular.svg-BzUDq1Il.js} +1 -1
  149. package/web/assets/{interface-edit-magic-wand.svg-Cz36nKVn.js → interface-edit-magic-wand.svg-DaAdEL5x.js} +1 -1
  150. package/web/assets/{interface-edit-tool-paint-roller.svg-DZUQotD5.js → interface-edit-tool-paint-roller.svg-C972BXSM.js} +1 -1
  151. package/web/assets/{interface-edit-tool-pencil.svg-DBf1Y9Tj.js → interface-edit-tool-pencil.svg-47QCYH9f.js} +1 -1
  152. package/web/assets/{interface-favorite-award.svg-B93sRjxf.js → interface-favorite-award.svg-DROP-rzN.js} +1 -1
  153. package/web/assets/{interface-favorite-flag.svg-DKHuT11J.js → interface-favorite-flag.svg-B1gpMdkg.js} +1 -1
  154. package/web/assets/{interface-favorite-heart.svg-Bw5FZQ7d.js → interface-favorite-heart.svg-Dc0MMGJl.js} +1 -1
  155. package/web/assets/{interface-favorite-star.svg-CgLbct_b.js → interface-favorite-star.svg-D6A5KWft.js} +1 -1
  156. package/web/assets/{interface-favorite-stars-sparkles.svg-B7cYS4ef.js → interface-favorite-stars-sparkles.svg-CpEr4y41.js} +1 -1
  157. package/web/assets/{interface-hierarchy-flowchart.svg-zwuaRdWq.js → interface-hierarchy-flowchart.svg-DjvgRFcZ.js} +1 -1
  158. package/web/assets/{interface-home-house.svg-B85yMFCe.js → interface-home-house.svg-BMmVKlSc.js} +1 -1
  159. package/web/assets/{interface-hyperlink.svg-US6b-Svn.js → interface-hyperlink.svg-BewFXeyZ.js} +1 -1
  160. package/web/assets/{interface-lighting-brightness.svg-mZWkhb7f.js → interface-lighting-brightness.svg-B74_Fwt9.js} +1 -1
  161. package/web/assets/{interface-lock-closed.svg-9oHuNwuY.js → interface-lock-closed.svg-B_kTyHSd.js} +1 -1
  162. package/web/assets/{interface-lock-open-unlock.svg-DBetdJny.js → interface-lock-open-unlock.svg-BpmOnQWL.js} +1 -1
  163. package/web/assets/{interface-login-key.svg-BZnZTYd1.js → interface-login-key.svg-CjYpI4bh.js} +1 -1
  164. package/web/assets/{interface-search.svg-CMXAOoam.js → interface-search.svg-FJmFWdB4.js} +1 -1
  165. package/web/assets/{interface-setting-cog.svg-CKckatt7.js → interface-setting-cog.svg-CfzSne-G.js} +1 -1
  166. package/web/assets/{interface-share-megaphone-bullhorn.svg-DH7kVqN-.js → interface-share-megaphone-bullhorn.svg-CIIzDsMB.js} +1 -1
  167. package/web/assets/{interface-share-rocket.svg-BNXcMugi.js → interface-share-rocket.svg-DqTBI7lO.js} +1 -1
  168. package/web/assets/{interface-share-satellite.svg-Bb8t607w.js → interface-share-satellite.svg-nJfwIxpE.js} +1 -1
  169. package/web/assets/{interface-share-space-ship.svg-Dk4rbLtF.js → interface-share-space-ship.svg-hSmFC9Bt.js} +1 -1
  170. package/web/assets/{interface-share.svg-CtX8dq5i.js → interface-share.svg-DW5W5LS6.js} +1 -1
  171. package/web/assets/{interface-signal-square.svg-DmUIlYTd.js → interface-signal-square.svg-CxjWE1n9.js} +1 -1
  172. package/web/assets/{interface-time-clock-circle.svg-D2ZNaXT3.js → interface-time-clock-circle.svg-OliTsm3U.js} +1 -1
  173. package/web/assets/{interface-time-hour-glass.svg-Ddo-8hHe.js → interface-time-hour-glass.svg-Cq5G77ft.js} +1 -1
  174. package/web/assets/{interface-users-multiple.svg-Jh7S0sT4.js → interface-users-multiple.svg-BZxMlLou.js} +1 -1
  175. package/web/assets/{interface-weather-moon.svg-DbdQFgL2.js → interface-weather-moon.svg-lFXrwEyz.js} +1 -1
  176. package/web/assets/{javascript-BVGFyXBk.js → javascript-BVZ1omk1.js} +1 -1
  177. package/web/assets/{jsonMode-vnFlxYl9.js → jsonMode-CiBARvaV.js} +2 -2
  178. package/web/assets/{liquid-DieKMEvN.js → liquid-CUYREU3G.js} +1 -1
  179. package/web/assets/{lspLanguageFeatures-DoeI-8Y7.js → lspLanguageFeatures-BCfkeNgB.js} +3 -3
  180. package/web/assets/{mail-chat-bubble-square.svg-CApdU2ea.js → mail-chat-bubble-square.svg-DbOh-u2f.js} +1 -1
  181. package/web/assets/{mail-send-email-paper-airplane.svg-jjZ0KB32.js → mail-send-email-paper-airplane.svg-Ci3654Ap.js} +1 -1
  182. package/web/assets/{mail-send-envelope.svg-B6Tsoh-8.js → mail-send-envelope.svg-BUCSUoVb.js} +1 -1
  183. package/web/assets/{mdx-BCkszXid.js → mdx-GNBOgT3C.js} +1 -1
  184. package/web/assets/{minus-DfLQX3s2.js → minus-qBqqwoxz.js} +2 -2
  185. package/web/assets/modal-CsKPvO45.js +5 -0
  186. package/web/assets/modal-E9FRG--u.js +1 -0
  187. package/web/assets/{money-cashier-receipt.svg-DM-I8Snr.js → money-cashier-receipt.svg-qOZhZZs2.js} +1 -1
  188. package/web/assets/{money-currency-dollar-pay.svg-CkDRewrV.js → money-currency-dollar-pay.svg-WYlopKIm.js} +1 -1
  189. package/web/assets/{money-graph-arrow-increase.svg-BT4KLHWz.js → money-graph-arrow-increase.svg-DAcyYWIw.js} +1 -1
  190. package/web/assets/{money-graph-bar-chart-increase.svg-EvyIJ3Uu.js → money-graph-bar-chart-increase.svg-Bcjxz1Kd.js} +1 -1
  191. package/web/assets/multiselect-DiGSzibm.js +251 -0
  192. package/web/assets/{nature-ecology-leaf.svg-uZBwXdg9.js → nature-ecology-leaf.svg-d0AKmyxH.js} +1 -1
  193. package/web/assets/{password-D1R5w1qL.js → password-BwMjgK0Q.js} +4 -4
  194. package/web/assets/{phone-telephone.svg-BSvOskIB.js → phone-telephone.svg-BzKK2wbN.js} +1 -1
  195. package/web/assets/{plus-CNGSRnxy.js → plus-D6Rlmwbp.js} +6 -6
  196. package/web/assets/process.store-I5VZVT0x.js +1 -0
  197. package/web/assets/{programming-bug.svg-CLnGs4K-.js → programming-bug.svg-BtSROvd5.js} +1 -1
  198. package/web/assets/{programming-cloud.svg-CxBovXBR.js → programming-cloud.svg-YDPFJdYt.js} +1 -1
  199. package/web/assets/{programming-computer-database-server.svg-C1JmOyio.js → programming-computer-database-server.svg-C_7cgE9Q.js} +1 -1
  200. package/web/assets/{programming-computer-database.svg-BRjyOzP4.js → programming-computer-database.svg-CLw76mik.js} +1 -1
  201. package/web/assets/{programming-module-four-layout.svg-Blwzw6Qz.js → programming-module-four-layout.svg-BsoC5ySI.js} +1 -1
  202. package/web/assets/{programming-module-three.svg-6bkrmWsU.js → programming-module-three.svg-CThoMoAk.js} +1 -1
  203. package/web/assets/{programming-module.svg-CBS9xKxX.js → programming-module.svg-BQ1YjjAj.js} +1 -1
  204. package/web/assets/{programming-script-code.svg-BVhyoAD3.js → programming-script-code.svg-BKT_wilO.js} +1 -1
  205. package/web/assets/project-launch.store-CBnJKGQe.js +1 -0
  206. package/web/assets/project.store-JIcOcKSg.js +1 -0
  207. package/web/assets/{python-CiPYtj_d.js → python-BXwGt-Ip.js} +1 -1
  208. package/web/assets/{radiobutton--KWBHcDP.js → radiobutton-D20sH1UN.js} +3 -3
  209. package/web/assets/{razor-CSoWGP30.js → razor-RXambmP2.js} +1 -1
  210. package/web/assets/router-BXj_oCbf.js +1 -0
  211. package/web/assets/{selectbutton-C0NL5n4w.js → selectbutton-rLcf19Xf.js} +4 -4
  212. package/web/assets/settings-scope-Cy_9OGE1.js +1 -0
  213. package/web/assets/settings.store-DrKeFdgW.js +1 -0
  214. package/web/assets/{shopping-cart.svg-C-8NG_Po.js → shopping-cart.svg-EjTn3XQF.js} +1 -1
  215. package/web/assets/{shopping-gift-present.svg-Bp6q5VzJ.js → shopping-gift-present.svg-AQNlzazh.js} +1 -1
  216. package/web/assets/{shopping-shipping-box-parcel-package.svg-DeWaEIwm.js → shopping-shipping-box-parcel-package.svg-VB9n6UNi.js} +1 -1
  217. package/web/assets/src-ByEHJyfr.js +1 -0
  218. package/web/assets/{src-BHR3l7pa.js → src-CUwD1xPP.js} +35 -35
  219. package/web/assets/src-C_auNJtg.css +1 -0
  220. package/web/assets/{tag-new-circle.svg-CTljXsqE.js → tag-new-circle.svg-BllOd5JW.js} +1 -1
  221. package/web/assets/theme-DuAHBQRP.js +1 -0
  222. package/web/assets/{toggleswitch-d41l5g27.js → toggleswitch-C-88_GnB.js} +2 -2
  223. package/web/assets/{travel-map-earth-globe.svg-BUkcntCp.js → travel-map-earth-globe.svg-ChLDmmU9.js} +1 -1
  224. package/web/assets/trpc-BoKwANhj.js +1 -0
  225. package/web/assets/{tsMode-B2c-rCAa.js → tsMode-CIN3QIw8.js} +6 -6
  226. package/web/assets/{typescript-CmW4u_GQ.js → typescript-wXu_7Eym.js} +1 -1
  227. package/web/assets/useAiChatDrawer-Bs1Gxhn2.js +1 -0
  228. package/web/assets/{useCloudOrg-E4l-99WA.js → useCloudOrg-0AZ58M3V.js} +1 -1
  229. package/web/assets/useEnvVarAutocomplete-BXC_JUF7.js +102 -0
  230. package/web/assets/{useEnvVarAutocomplete-DsxEF6Ya.css → useEnvVarAutocomplete-dxAmKsn7.css} +1 -1
  231. package/web/assets/useProjectCloudOrg-UIfVePy9.js +1 -0
  232. package/web/assets/useServiceUrlHost-BXbIxPaT.js +1 -0
  233. package/web/assets/{xml-BxMqu3hT.js → xml-FTYGqn2R.js} +1 -1
  234. package/web/assets/{yaml-Djx7E3R1.js → yaml-DQEEK2dU.js} +1 -1
  235. package/web/index.html +2 -2
  236. package/agent-manager-2AZVCQRI.js +0 -11
  237. package/chat-SWYI4ENT.js +0 -21
  238. package/chunk-5EMEJNVU.js.map +0 -1
  239. package/chunk-C6LIGJFX.js.map +0 -1
  240. package/chunk-GUIONCNA.js.map +0 -1
  241. package/chunk-ZFELQG4B.js.map +0 -1
  242. package/desktop-launcher-3COY6F6H.js.map +0 -1
  243. package/desktop-wizard-4CYANX2O.js +0 -209
  244. package/desktop-wizard-4CYANX2O.js.map +0 -1
  245. package/settings-manager-J4QBIU3T.js +0 -10
  246. package/src-42DMJB3D.js.map +0 -1
  247. package/web/assets/AgentScalarChatInterface.vue-BGGkpyp3.js +0 -13
  248. package/web/assets/AgentTerminalPage-B8gLray2.js +0 -1
  249. package/web/assets/AiChatPage-BKITsyMx.js +0 -1
  250. package/web/assets/AppLayout-B72S4nTi.css +0 -1
  251. package/web/assets/AppLayout-BYw7v2sp.js +0 -1
  252. package/web/assets/AuditPage-nHTwzyia.js +0 -1
  253. package/web/assets/CloudAccountPage-DYOvfMjD.css +0 -1
  254. package/web/assets/CloudAccountPage-DuaZz2j4.js +0 -1
  255. package/web/assets/CloudAccountPage-XHxI-ixD.js +0 -1
  256. package/web/assets/CloudMessagingPage-B2N5K-Xs.js +0 -2
  257. package/web/assets/DashboardPage-VoWJeWh_.js +0 -1
  258. package/web/assets/DirectoryPickerDialog-B5SuJOhv.js +0 -1
  259. package/web/assets/DirectoryPickerDialog-Ctp1lYoS.css +0 -1
  260. package/web/assets/EnvironmentFormPage-BIXbPTN5.js +0 -1
  261. package/web/assets/EnvironmentListPage-CHa-Ni3w.js +0 -1
  262. package/web/assets/KanbanBoardPage-B46zbE2H.css +0 -1
  263. package/web/assets/KanbanBoardPage-BFTNpm8P.js +0 -4
  264. package/web/assets/KanbanListPage-CYuIrKXH.js +0 -1
  265. package/web/assets/LaunchProjectPage-9hhGBdOh.css +0 -1
  266. package/web/assets/LaunchProjectPage-jy-R3Fiw.js +0 -1
  267. package/web/assets/LaunchServicesPage-BMtm_8yP.css +0 -1
  268. package/web/assets/LaunchServicesPage-DX7nyo36.js +0 -1
  269. package/web/assets/LaunchShell-BHfseuPM.js +0 -1
  270. package/web/assets/LaunchShell-HenrOlHV.css +0 -1
  271. package/web/assets/LogViewer-C-pHXudR.js +0 -3
  272. package/web/assets/OrgKeyPrompt-CrHXZdKL.css +0 -1
  273. package/web/assets/OrgKeyPrompt-OPnK5oPm.js +0 -1
  274. package/web/assets/OrgLogo-Cxa49Tl3.js +0 -1
  275. package/web/assets/ProcessControls-DXDyR6XX.js +0 -1
  276. package/web/assets/ProcessDetailPage-DNKTwgPW.js +0 -1
  277. package/web/assets/RandomJobTestPage-BE8HkgSb.js +0 -2
  278. package/web/assets/ScenarioEditorPage-Coo6ExzZ.js +0 -14
  279. package/web/assets/SendToChatDialog-ClXerpCU.js +0 -1
  280. package/web/assets/ServiceControlsBar-C7HrPjQI.js +0 -1
  281. package/web/assets/ServiceDetailPage-Cxuy0Yix.js +0 -2
  282. package/web/assets/ServiceFormPage-CCOu1h8v.js +0 -1
  283. package/web/assets/SettingsPage-Dt1ViDQe.js +0 -2063
  284. package/web/assets/UnlockPage-C5iEOAKH.js +0 -1
  285. package/web/assets/VaultMigrationPage-CwRWvFY7.js +0 -1
  286. package/web/assets/VersionBadge-Bqb72GXf.js +0 -1
  287. package/web/assets/WikiPage-Bl1jDKKp.js +0 -1
  288. package/web/assets/WikiView-58u6vU3q.js +0 -1
  289. package/web/assets/add-scalar-classes-CT5KQbzH.js +0 -387
  290. package/web/assets/card-46tM5yU0.js +0 -32
  291. package/web/assets/client-KL5c1Dog.js +0 -24
  292. package/web/assets/cloud-chat.store-Belo5SKd.js +0 -1
  293. package/web/assets/cloud-client-Cqa2Udt8.js +0 -1
  294. package/web/assets/cloud-session-56bUtkSL.js +0 -2
  295. package/web/assets/cloud-session-Dqm0C6H5.js +0 -1
  296. package/web/assets/column-DQ53_qc6.js +0 -763
  297. package/web/assets/composables-CHyZa9ag.js +0 -1
  298. package/web/assets/index-CKOtBNaZ.css +0 -1
  299. package/web/assets/interface-content-folder.svg-8mYqkDao.js +0 -1
  300. package/web/assets/modal-CCco27Sn.js +0 -5
  301. package/web/assets/modal-D4J85_wC.js +0 -1
  302. package/web/assets/multiselect-BmjidXlj.js +0 -251
  303. package/web/assets/process.store-p1LqnpY2.js +0 -1
  304. package/web/assets/project-launch.store-BBYtCcv8.js +0 -1
  305. package/web/assets/project.store-D_2v7amt.js +0 -1
  306. package/web/assets/router-CRKT3825.js +0 -1
  307. package/web/assets/settings-scope-DblmUa3N.js +0 -1
  308. package/web/assets/settings.store-DKTQyerJ.js +0 -1
  309. package/web/assets/src-BN5gTC76.css +0 -1
  310. package/web/assets/src-BRLkogf3.js +0 -1
  311. package/web/assets/theme-BZzt_Sgl.js +0 -1
  312. package/web/assets/trpc-Db0Atu8A.js +0 -1
  313. package/web/assets/useAiChatDrawer-0QJJVXul.js +0 -1
  314. package/web/assets/useEnvVarAutocomplete-BDqUWoGr.js +0 -102
  315. package/web/assets/useProjectCatalog-Cxt-hL1H.js +0 -1
  316. package/web/assets/useProjectCloudOrg-CwLTQLIO.js +0 -1
  317. package/web/assets/useServiceUrlHost-VIA3uP5-.js +0 -1
  318. /package/{agent-manager-2AZVCQRI.js.map → agent-manager-NAGIMH2T.js.map} +0 -0
  319. /package/{chat-SWYI4ENT.js.map → chat-Q2UMYXQL.js.map} +0 -0
  320. /package/{chunk-BDQOBEZ3.js.map → chunk-GOMF7NWS.js.map} +0 -0
  321. /package/{chunk-ALWA4K5L.js.map → chunk-MSICJEZD.js.map} +0 -0
  322. /package/{chunk-I7JHF5FE.js.map → chunk-XHGJHYDC.js.map} +0 -0
  323. /package/{companion-JYLQKSFO.js.map → companion-MGX62L4T.js.map} +0 -0
  324. /package/{settings-manager-J4QBIU3T.js.map → desktop-launcher-HKXP4LRI.js.map} +0 -0
  325. /package/{vault-resolver-57Q2DVOR.js.map → desktop-wizard-XIDDAG7L.js.map} +0 -0
  326. /package/web/assets/{abap-BwLGULgU.js → abap-CRsXUZTC.js} +0 -0
  327. /package/web/assets/{apex-BmwhxS2n.js → apex-CN6ZSzwM.js} +0 -0
  328. /package/web/assets/{azcli-7RvE_Zal.js → azcli-ULFzG1xV.js} +0 -0
  329. /package/web/assets/{bat-DRPmS6Na.js → bat-BVH8lwB4.js} +0 -0
  330. /package/web/assets/{bicep-BwfkS7ZV.js → bicep-B8jMqZ8i.js} +0 -0
  331. /package/web/assets/{browser-D3d3061H.js → browser-xa0YgePN.js} +0 -0
  332. /package/web/assets/{cameligo-BJ_mdC8E.js → cameligo-DuuRwBiE.js} +0 -0
  333. /package/web/assets/{clojure-CQKq7DWt.js → clojure-DUpiEmPZ.js} +0 -0
  334. /package/web/assets/{coffee-DJRj2iwd.js → coffee-BO4ou798.js} +0 -0
  335. /package/web/assets/{cpp-BC1yJTUW.js → cpp-CHOtY2DW.js} +0 -0
  336. /package/web/assets/{csharp-D6U2fAAT.js → csharp-D3t5O1XD.js} +0 -0
  337. /package/web/assets/{csp-B2Ue_UmV.js → csp-CJpJWgPE.js} +0 -0
  338. /package/web/assets/{css-CEzlcbMY.js → css-CAeYpQS5.js} +0 -0
  339. /package/web/assets/{cypher-D5Sg38Yj.js → cypher-D9-TC6ep.js} +0 -0
  340. /package/web/assets/{dart-BhjKRv6v.js → dart-CYoMdUUD.js} +0 -0
  341. /package/web/assets/{dockerfile-BnivEbtE.js → dockerfile-B2ffS5e2.js} +0 -0
  342. /package/web/assets/{ecl-TS1StLK1.js → ecl-BL_MLv5o.js} +0 -0
  343. /package/web/assets/{elixir-BX9ta6DO.js → elixir-DTTK5HpM.js} +0 -0
  344. /package/web/assets/{flow9-CoOB42ee.js → flow9-CnqIliGA.js} +0 -0
  345. /package/web/assets/{fsharp-DmQslDFn.js → fsharp-BtsygJkw.js} +0 -0
  346. /package/web/assets/{go-BbEGGooY.js → go-DksUoC0w.js} +0 -0
  347. /package/web/assets/{graphql-E24y5sn9.js → graphql-DCtJGb0Q.js} +0 -0
  348. /package/web/assets/{hcl-pBZphP8G.js → hcl-Vm6MaTNZ.js} +0 -0
  349. /package/web/assets/{ini-BSbRgr25.js → ini-DdyyiZLB.js} +0 -0
  350. /package/web/assets/{java-D8KvzsMp.js → java-D9tw0Sq3.js} +0 -0
  351. /package/web/assets/{julia-BDRytf15.js → julia-DsaDhMSi.js} +0 -0
  352. /package/web/assets/{kotlin-CNcQo-uP.js → kotlin-eMyqSg05.js} +0 -0
  353. /package/web/assets/{less-0HRV-2Rz.js → less-BTExquT2.js} +0 -0
  354. /package/web/assets/{lexon-DdJG3_pW.js → lexon-Btiu1CPR.js} +0 -0
  355. /package/web/assets/{lua-Blq8Mukj.js → lua-uIHSqSt_.js} +0 -0
  356. /package/web/assets/{m3-CXbmzr9W.js → m3-DtY-QwwW.js} +0 -0
  357. /package/web/assets/{markdown-DFIISzT8.js → markdown-DalwAnMR.js} +0 -0
  358. /package/web/assets/{mips-C2XSYglv.js → mips-BocGRfi2.js} +0 -0
  359. /package/web/assets/{msdax-D3Jl6oAY.js → msdax-CQFbyz50.js} +0 -0
  360. /package/web/assets/{mysql-mCqxt_Co.js → mysql-BM8uo0J8.js} +0 -0
  361. /package/web/assets/{objective-c-CUKLr4E9.js → objective-c-H3c5-SZb.js} +0 -0
  362. /package/web/assets/{pascal-BpqDI6Ur.js → pascal-BgiV8eY7.js} +0 -0
  363. /package/web/assets/{pascaligo-BVchPyL4.js → pascaligo-DT9ZcxD2.js} +0 -0
  364. /package/web/assets/{perl-Dgc9v23P.js → perl-B0U4-W-w.js} +0 -0
  365. /package/web/assets/{pgsql-Dk9IX1G_.js → pgsql-B6kZRXs9.js} +0 -0
  366. /package/web/assets/{php-XeFLn3yL.js → php-DG9vCwQM.js} +0 -0
  367. /package/web/assets/{pla-DQMfrdXZ.js → pla-B4Y4wk5I.js} +0 -0
  368. /package/web/assets/{postiats-DiKrdL3K.js → postiats-C_eWfeAP.js} +0 -0
  369. /package/web/assets/{powerquery-Cj9Q91Zv.js → powerquery-DfX2HFDF.js} +0 -0
  370. /package/web/assets/{powershell-DxLElnzU.js → powershell-Bxsmga8Z.js} +0 -0
  371. /package/web/assets/{protobuf-7vT2HdZD.js → protobuf-BjgmCR9H.js} +0 -0
  372. /package/web/assets/{pug-oi96TUbQ.js → pug-ryXuxA3i.js} +0 -0
  373. /package/web/assets/{qsharp-DNr9IwS2.js → qsharp-91Kv1jwy.js} +0 -0
  374. /package/web/assets/{r-C-REi_Zk.js → r-j6OkO-Lp.js} +0 -0
  375. /package/web/assets/{redis-BvOCrLoN.js → redis-B2Usw_gW.js} +0 -0
  376. /package/web/assets/{redshift-jNEw-REz.js → redshift-Bl5n-UlH.js} +0 -0
  377. /package/web/assets/{restructuredtext-B9ET-x7N.js → restructuredtext-IIWeXmeu.js} +0 -0
  378. /package/web/assets/{ruby-BIEBiJDZ.js → ruby-DQH1R4pC.js} +0 -0
  379. /package/web/assets/{rust-BnoIVewm.js → rust-BJi0001n.js} +0 -0
  380. /package/web/assets/{sb-Bwvy9clh.js → sb-C34JQX0H.js} +0 -0
  381. /package/web/assets/{scala-DPv5zS47.js → scala-BqHjuqsC.js} +0 -0
  382. /package/web/assets/{scheme-BQqNVxf_.js → scheme-DIfjDH23.js} +0 -0
  383. /package/web/assets/{scss-Ck1AFDEz.js → scss-MxgEDdb7.js} +0 -0
  384. /package/web/assets/{shell-C4IYs9Z7.js → shell-D_SMEq6l.js} +0 -0
  385. /package/web/assets/{solidity-D3bS77xq.js → solidity-CyBHDO6p.js} +0 -0
  386. /package/web/assets/{sophia-BSTVfueD.js → sophia-8_L-7Xrk.js} +0 -0
  387. /package/web/assets/{sparql-BGcXD7s2.js → sparql-CXxyP-1c.js} +0 -0
  388. /package/web/assets/{sql-CIsSgyam.js → sql-DNd4NFJw.js} +0 -0
  389. /package/web/assets/{st-dV1d_AXx.js → st-DPFJcK-4.js} +0 -0
  390. /package/web/assets/{swift-CK8gXWQn.js → swift-DE_LJ5Ub.js} +0 -0
  391. /package/web/assets/{systemverilog-B9tHBIJU.js → systemverilog-IgPgwLQ7.js} +0 -0
  392. /package/web/assets/{tcl-BgRT60RV.js → tcl-Cr-fmmH0.js} +0 -0
  393. /package/web/assets/{twig-CGkLO4Nl.js → twig-Dd_ODPfV.js} +0 -0
  394. /package/web/assets/{typespec-DMP9WuzC.js → typespec-CeK8X8vB.js} +0 -0
  395. /package/web/assets/{uuid-H0yY5A03.js → uuid-6HQMUkhT.js} +0 -0
  396. /package/web/assets/{vb-DfSbhl3d.js → vb-CyLVxxH6.js} +0 -0
  397. /package/web/assets/{wgsl-CaJmoLY5.js → wgsl-CmRFGM3r.js} +0 -0
@@ -1,9 +1,3 @@
1
- import {
2
- findThreadDb,
3
- lastTurn,
4
- threadMessages,
5
- threadsStartedAfter
6
- } from "./chunk-MD3VW4HQ.js";
7
1
  import {
8
2
  AmbiguousProjectError,
9
3
  StoreDiskCoordinator,
@@ -23,48 +17,61 @@ import {
23
17
  serviceStore,
24
18
  setProjectServices,
25
19
  setProjectVault
26
- } from "./chunk-ALWA4K5L.js";
20
+ } from "./chunk-MSICJEZD.js";
27
21
  import {
28
22
  atomicWriteSecure,
29
23
  fingerprintFiles,
30
24
  hasChangedSinceRead,
31
25
  rememberFile,
32
26
  wasRead
33
- } from "./chunk-BDQOBEZ3.js";
27
+ } from "./chunk-GOMF7NWS.js";
28
+ import {
29
+ findThreadDb,
30
+ lastTurn,
31
+ threadMessages,
32
+ threadsStartedAfter
33
+ } from "./chunk-MD3VW4HQ.js";
34
34
  import {
35
35
  COMPANION_RELAY_CLOSE,
36
36
  COMPANION_RELAY_OPEN,
37
37
  ProjectSchema,
38
38
  extractCompanionRelay
39
- } from "./chunk-5EMEJNVU.js";
39
+ } from "./chunk-LE6XQ3OV.js";
40
40
  import {
41
41
  allVaultRoots,
42
- ensureLocalVault,
42
+ collidesWithMachineRoot,
43
+ forgetLocalProjectRoot,
43
44
  keyedFilePath,
44
45
  legacyMachineFilePath,
45
46
  listCloudVaults,
47
+ localProjectVaultRoot,
48
+ localVaultCollidesWithMachineRoot,
46
49
  localVaultRoot,
47
50
  machineFilePath,
48
51
  machineRoot,
49
52
  orgIdOfRoot,
53
+ readLocalProjectDirs,
54
+ registerLocalProjectDir,
55
+ setLocalProjectRoot,
56
+ unregisterLocalProjectDir,
50
57
  vaultFor,
51
58
  vaultIdOfRoot
52
- } from "./chunk-ZFELQG4B.js";
59
+ } from "./chunk-EV3TBM7E.js";
53
60
 
54
61
  // ../server/src/services/companion.ts
55
62
  import { EventEmitter as EventEmitter4 } from "events";
56
63
 
57
64
  // ../server/src/services/conversation-store.ts
58
65
  import { randomUUID as randomUUID2 } from "crypto";
59
- import { readFile as readFile3, mkdir as mkdir2 } from "fs/promises";
60
- import { dirname, join as join4 } from "path";
66
+ import { readFile as readFile3, mkdir as mkdir3 } from "fs/promises";
67
+ import { dirname as dirname2, join as join4 } from "path";
61
68
  import { EventEmitter as EventEmitter2 } from "events";
62
69
 
63
70
  // ../server/src/services/project-store.ts
64
71
  import { randomUUID } from "crypto";
65
72
  import { EventEmitter } from "events";
66
- import { readFile as readFile2, rename as rename2, rm } from "fs/promises";
67
- import { join as join3 } from "path";
73
+ import { mkdir as mkdir2, readFile as readFile2, rename as rename2, rm } from "fs/promises";
74
+ import { dirname, join as join3, resolve as resolve2 } from "path";
68
75
 
69
76
  // ../server/src/utils/ensure-data-gitignore.ts
70
77
  import { writeFile } from "fs/promises";
@@ -198,14 +205,7 @@ function isPathMap(value) {
198
205
  return !!value && typeof value === "object" && !Array.isArray(value) && Object.values(value).every((v) => typeof v === "string");
199
206
  }
200
207
  async function holdsRuneyaProject(path) {
201
- for (const candidate of ["project.json", "projects.json"]) {
202
- try {
203
- await stat(join2(path, ".runeya", candidate));
204
- return true;
205
- } catch {
206
- }
207
- }
208
- return false;
208
+ return stat(join2(path, ".runeya", "project.json")).then(() => true, () => false);
209
209
  }
210
210
  var projectPathStore = new ProjectPathStore();
211
211
 
@@ -242,6 +242,17 @@ async function readLocalProject() {
242
242
  }
243
243
  return { local: locals[0] ?? null, strayCloud };
244
244
  }
245
+ function isRegistrable(root) {
246
+ return localProjectVaultRoot(dirname(root)) === resolve2(root);
247
+ }
248
+ async function readLocalProjectAt(root) {
249
+ try {
250
+ const parsed = ProjectSchema.safeParse(JSON.parse(await readFile2(join3(root, FILENAME2), "utf-8")));
251
+ return parsed.success && !parsed.data.orgId ? parsed.data : null;
252
+ } catch {
253
+ return null;
254
+ }
255
+ }
245
256
  async function readCloudProjects() {
246
257
  const found = [];
247
258
  for (const { orgId, projectId, root } of await listCloudVaults()) {
@@ -254,7 +265,9 @@ async function readCloudProjects() {
254
265
  }
255
266
  return found;
256
267
  }
257
- var LocalProjectExistsError = class extends Error {
268
+ var LocalProjectRefusedError = class extends Error {
269
+ };
270
+ var LocalProjectExistsError = class extends LocalProjectRefusedError {
258
271
  constructor(projectName) {
259
272
  super(
260
273
  `This directory already holds the local project "${projectName}". A directory holds one local project: use another directory, or create the project in an organization.`
@@ -264,6 +277,29 @@ var LocalProjectExistsError = class extends Error {
264
277
  }
265
278
  code = "LOCAL_PROJECT_EXISTS";
266
279
  };
280
+ var LocalProjectInMachineRootError = class extends LocalProjectRefusedError {
281
+ code = "LOCAL_PROJECT_IN_MACHINE_ROOT";
282
+ constructor() {
283
+ super(
284
+ "This directory holds Runeya's own data. A local project here would mix its files with the machine's vaults: launch Runeya from another directory, or create the project in an organization."
285
+ );
286
+ this.name = "LocalProjectInMachineRootError";
287
+ }
288
+ };
289
+ var LocalProjectCloudLinkedError = class extends LocalProjectRefusedError {
290
+ code = "LOCAL_PROJECT_CLOUD_LINKED";
291
+ constructor() {
292
+ super("This directory is already linked to an organization project. Choose another directory.");
293
+ this.name = "LocalProjectCloudLinkedError";
294
+ }
295
+ };
296
+ var LocalProjectNotFoundError = class extends LocalProjectRefusedError {
297
+ code = "LOCAL_PROJECT_NOT_FOUND";
298
+ constructor() {
299
+ super("This directory holds no local Runeya project to import.");
300
+ this.name = "LocalProjectNotFoundError";
301
+ }
302
+ };
267
303
  var ProjectStore = class {
268
304
  /**
269
305
  * Keyed by the (organization, project) couple, never by the project id alone:
@@ -272,6 +308,12 @@ var ProjectStore = class {
272
308
  * wrote that survivor back into both vaults.
273
309
  */
274
310
  projects = /* @__PURE__ */ new Map();
311
+ /**
312
+ * Les coffres où un projet local a été lu ou écrit. À l'écriture, un coffre
313
+ * de cette liste qui n'a plus de projet perd sa fiche : c'est ainsi qu'une
314
+ * suppression ou une publication vide le dossier qu'elle quitte.
315
+ */
316
+ localRoots = /* @__PURE__ */ new Set();
275
317
  loaded = false;
276
318
  /**
277
319
  * L'état du disque tel qu'il était au dernier chargement.
@@ -300,6 +342,10 @@ var ProjectStore = class {
300
342
  // Prefer the env marked default, fall back to first env
301
343
  activeEnvironmentId: defaultEnv?.id ?? p.environmentIds?.[0]
302
344
  });
345
+ if (!p.orgId) {
346
+ setLocalProjectRoot(p.id, root);
347
+ this.localRoots.add(root);
348
+ }
303
349
  setProjectVault(p, root);
304
350
  setProjectServices(p, p.serviceIds ?? []);
305
351
  }
@@ -315,6 +361,7 @@ var ProjectStore = class {
315
361
  async diskFingerprint() {
316
362
  return fingerprintFiles([
317
363
  this.getFilePath(),
364
+ ...(await readLocalProjectDirs()).map((dir) => this.getFilePath(localProjectVaultRoot(dir))),
318
365
  ...(await listCloudVaults()).map((v) => this.getFilePath(v.root))
319
366
  ]);
320
367
  }
@@ -358,8 +405,22 @@ var ProjectStore = class {
358
405
  /** Le parcours proprement dit, dans une table neuve que `load` substitue. */
359
406
  async readVaults() {
360
407
  const projects = /* @__PURE__ */ new Map();
408
+ this.localRoots = /* @__PURE__ */ new Set();
361
409
  const { local, strayCloud } = await readLocalProject();
362
- if (local) await this.absorb(projects, local, localVaultRoot());
410
+ if (local) {
411
+ await this.absorb(projects, local, localVaultRoot());
412
+ if (!localVaultCollidesWithMachineRoot() && isRegistrable(localVaultRoot())) {
413
+ await registerLocalProjectDir(dirname(localVaultRoot())).catch(() => {
414
+ });
415
+ }
416
+ }
417
+ for (const dir of await readLocalProjectDirs()) {
418
+ const root = localProjectVaultRoot(dir);
419
+ if (root === localVaultRoot()) continue;
420
+ const found = await readLocalProjectAt(root);
421
+ if (!found || projects.has(projectKey(found))) continue;
422
+ await this.absorb(projects, found, root);
423
+ }
363
424
  let migrated = false;
364
425
  for (const project of strayCloud) {
365
426
  try {
@@ -390,20 +451,30 @@ var ProjectStore = class {
390
451
  if (!project.orgId) locals.push(project);
391
452
  else cloud.push({ project, root: vaultFor(project).root });
392
453
  }
393
- if (locals.length > 1) {
394
- const names = locals.map((p) => `"${p.name}" (${p.id})`).join(", ");
395
- throw new Error(
396
- `Refusing to save ${locals.length} local projects in one directory: ${names}. A directory holds a single local project.`
397
- );
454
+ const written = /* @__PURE__ */ new Map();
455
+ for (const local of locals) {
456
+ const root = vaultFor(local).root;
457
+ const other = written.get(root);
458
+ if (other) {
459
+ throw new Error(
460
+ `Refusing to save two local projects in ${root}: "${other.name}" and "${local.name}". A directory holds a single local project.`
461
+ );
462
+ }
463
+ written.set(root, local);
398
464
  }
399
- const [local] = locals;
400
- if (local) {
401
- await ensureLocalVault();
402
- await ensureDataGitignore(localVaultRoot());
403
- await atomicWriteSecure(this.getFilePath(), JSON.stringify(toDiskForm(local), null, 2));
404
- } else {
405
- await rm(this.getFilePath(), { force: true }).catch(() => {
465
+ for (const [root, local] of written) {
466
+ await mkdir2(root, { recursive: true });
467
+ await ensureDataGitignore(root);
468
+ await atomicWriteSecure(this.getFilePath(root), JSON.stringify(toDiskForm(local), null, 2));
469
+ this.localRoots.add(root);
470
+ }
471
+ for (const root of this.localRoots) {
472
+ if (written.has(root)) continue;
473
+ await rm(this.getFilePath(root), { force: true }).catch(() => {
474
+ });
475
+ if (isRegistrable(root)) await unregisterLocalProjectDir(dirname(root)).catch(() => {
406
476
  });
477
+ this.localRoots.delete(root);
407
478
  }
408
479
  await rename2(join3(localVaultRoot(), LEGACY_FILENAME), join3(localVaultRoot(), LEGACY_FILENAME + ".bak")).catch(() => {
409
480
  });
@@ -445,14 +516,29 @@ var ProjectStore = class {
445
516
  await this.load();
446
517
  return this.find(target)?.project ?? null;
447
518
  }
448
- async create(input) {
519
+ /**
520
+ * Vérifier qu'un dossier peut accueillir un projet local, et rendre son coffre.
521
+ *
522
+ * Refusé si son `.runeya` serait la racine machine, si le dossier est déjà
523
+ * l'emplacement d'un projet d'organisation, ou s'il porte déjà un projet.
524
+ */
525
+ async localRootFor(root) {
526
+ if (collidesWithMachineRoot(root)) throw new LocalProjectInMachineRootError();
527
+ if (await projectPathStore.projectAt(dirname(root))) throw new LocalProjectCloudLinkedError();
528
+ const known = Array.from(this.projects.values()).find((p) => !p.orgId && vaultFor(p).root === root);
529
+ if (known) throw new LocalProjectExistsError(known.name);
530
+ const onDisk = await readLocalProjectAt(root);
531
+ if (onDisk) throw new LocalProjectExistsError(onDisk.name);
532
+ if (root !== localVaultRoot() && await holdsRuneyaProject(dirname(root))) throw new LocalProjectExistsError("");
533
+ return root;
534
+ }
535
+ /**
536
+ * `localDir` : le dossier d'un projet local. Omis, c'est le dossier de
537
+ * lancement, comme avant que les projets locaux aient chacun le leur.
538
+ */
539
+ async create(input, localDir) {
449
540
  await this.load();
450
- if (!input.orgId) {
451
- const existing = Array.from(this.projects.values()).find((p) => !p.orgId);
452
- if (existing) {
453
- throw new LocalProjectExistsError(existing.name);
454
- }
455
- }
541
+ const localRoot = input.orgId ? null : await this.localRootFor(localDir ? localProjectVaultRoot(localDir) : localVaultRoot());
456
542
  const project = {
457
543
  id: randomUUID(),
458
544
  orgId: input.orgId ?? null,
@@ -464,11 +550,52 @@ var ProjectStore = class {
464
550
  groupOrder: input.groupOrder ?? []
465
551
  };
466
552
  this.projects.set(projectKey(project), project);
553
+ if (localRoot) {
554
+ setLocalProjectRoot(project.id, localRoot);
555
+ if (isRegistrable(localRoot)) await registerLocalProjectDir(dirname(localRoot));
556
+ }
467
557
  setProjectVault(project, vaultFor(project).root);
468
558
  setProjectServices(project, project.serviceIds);
469
559
  await this.save();
470
560
  return project;
471
561
  }
562
+ /**
563
+ * Ce qu'un dossier permet pour un projet local : en créer un (`available`),
564
+ * importer celui qu'il porte (`importable`), rien parce qu'il est déjà dans
565
+ * la liste (`listed`), ou rien parce qu'il est refusé.
566
+ */
567
+ async inspectLocalDir(dir) {
568
+ await this.load();
569
+ const root = localProjectVaultRoot(dir);
570
+ if (collidesWithMachineRoot(root)) return { status: "machine-root", projectName: null };
571
+ if (await projectPathStore.projectAt(resolve2(dir))) return { status: "cloud-linked", projectName: null };
572
+ const known = Array.from(this.projects.values()).find((p) => !p.orgId && vaultFor(p).root === root);
573
+ if (known) return { status: "listed", projectName: known.name };
574
+ const onDisk = await readLocalProjectAt(root);
575
+ if (onDisk) return { status: "importable", projectName: onDisk.name };
576
+ if (await holdsRuneyaProject(dirname(root))) return { status: "unreadable", projectName: null };
577
+ return { status: "available", projectName: null };
578
+ }
579
+ /**
580
+ * Ajouter à la liste le projet local déjà présent dans ce dossier.
581
+ *
582
+ * Son `.runeya` n'est pas touché : le dossier est seulement enregistré, et le
583
+ * projet relu comme les autres.
584
+ */
585
+ async importLocal(dir) {
586
+ await this.load();
587
+ const root = localProjectVaultRoot(dir);
588
+ if (collidesWithMachineRoot(root)) throw new LocalProjectInMachineRootError();
589
+ if (await projectPathStore.projectAt(resolve2(dir))) throw new LocalProjectCloudLinkedError();
590
+ const found = await readLocalProjectAt(root);
591
+ if (!found) throw new LocalProjectNotFoundError();
592
+ const known = this.projects.get(projectKey(found));
593
+ if (known) return known;
594
+ await registerLocalProjectDir(dirname(root));
595
+ this.loaded = false;
596
+ await this.load();
597
+ return this.projects.get(projectKey(found)) ?? found;
598
+ }
472
599
  /**
473
600
  * `input.orgId` names which project is being updated, it does not move it:
474
601
  * a project is born local or in an organization and stays there, so treating
@@ -519,13 +646,19 @@ var ProjectStore = class {
519
646
  if (this.projects.get(projectKey({ id: projectId, orgId }))) {
520
647
  throw new Error("PROJECT_ALREADY_IN_ORG");
521
648
  }
649
+ const localRoot = vaultFor(local).root;
650
+ const localDir = localRoot === localVaultRoot() ? null : dirname(localRoot);
522
651
  const moved = { ...local, orgId };
523
652
  this.projects.delete(projectKey(local));
524
653
  forgetProject(local);
654
+ forgetLocalProjectRoot(local.id);
525
655
  this.projects.set(projectKey(moved), moved);
526
656
  setProjectVault(moved, vaultFor(moved).root);
527
657
  setProjectServices(moved, moved.serviceIds ?? []);
528
658
  await this.save();
659
+ if (localDir && !await projectPathStore.get(moved)) {
660
+ await projectPathStore.set(moved, localDir);
661
+ }
529
662
  await serviceStore.reassignOrg(moved.serviceIds ?? [], orgId);
530
663
  await environmentStore.relocateAll();
531
664
  return moved;
@@ -551,6 +684,7 @@ var ProjectStore = class {
551
684
  */
552
685
  async discardVault(project) {
553
686
  forgetProject(project);
687
+ if (!project.orgId) forgetLocalProjectRoot(project.id);
554
688
  if (!project.orgId) return;
555
689
  await rm(vaultFor(project).root, { recursive: true, force: true }).catch(() => {
556
690
  });
@@ -775,7 +909,7 @@ var ConversationStore = class {
775
909
  }
776
910
  }
777
911
  async ensureDir() {
778
- await mkdir2(dirname(await this.getFilePath()), { recursive: true });
912
+ await mkdir3(dirname2(await this.getFilePath()), { recursive: true });
779
913
  }
780
914
  encryptMessages(messages, vault) {
781
915
  return encryptValue(JSON.stringify(messages), vault);
@@ -823,9 +957,11 @@ ${new Error("trace").stack}`
823
957
  workflowType: conv.workflowType,
824
958
  kanbanBoardId: conv.kanbanBoardId,
825
959
  kanbanCardId: conv.kanbanCardId,
960
+ agentId: conv.agentId,
826
961
  companionEnabled: conv.companionEnabled,
827
962
  companionRunner: conv.companionRunner,
828
963
  companionConversationId: conv.companionConversationId,
964
+ companionBaseSha: conv.companionBaseSha,
829
965
  isCompanion: conv.isCompanion,
830
966
  archived: conv.archived,
831
967
  pinOrder: conv.pinOrder,
@@ -849,9 +985,11 @@ ${new Error("trace").stack}`
849
985
  workflowType,
850
986
  kanbanBoardId: disk.kanbanBoardId,
851
987
  kanbanCardId: disk.kanbanCardId,
988
+ agentId: disk.agentId,
852
989
  companionEnabled: disk.companionEnabled,
853
990
  companionRunner: disk.companionRunner,
854
991
  companionConversationId: disk.companionConversationId,
992
+ companionBaseSha: disk.companionBaseSha,
855
993
  isCompanion: disk.isCompanion,
856
994
  archived: disk.archived,
857
995
  pinOrder: disk.pinOrder,
@@ -910,7 +1048,7 @@ ${new Error("trace").stack}`
910
1048
  continue;
911
1049
  }
912
1050
  const inherited = legacy ? await localProjectId() : null;
913
- const root = dirname(path);
1051
+ const root = dirname2(path);
914
1052
  await rememberFile(path);
915
1053
  for (const item of data) {
916
1054
  try {
@@ -1006,7 +1144,7 @@ ${new Error("trace").stack}`
1006
1144
  async rootFor(conv) {
1007
1145
  const known = this.roots.get(conv.id) ?? null;
1008
1146
  if (conv.projectId) return rootOfProjectAmong(conv.projectId, known);
1009
- return known ?? dirname(await keyedFilePath(FILENAME3));
1147
+ return known ?? dirname2(await keyedFilePath(FILENAME3));
1010
1148
  }
1011
1149
  /**
1012
1150
  * Le projet d'une conversation, organisation comprise.
@@ -1059,16 +1197,16 @@ ${new Error("trace").stack}`
1059
1197
  */
1060
1198
  async matcherForProject(ref) {
1061
1199
  await this.load();
1062
- let projectRoot = null;
1200
+ let projectRoot2 = null;
1063
1201
  try {
1064
- projectRoot = ref.orgId === void 0 ? rootOfProjectAmong(ref.id, null) : rootOfProjectRef({ id: ref.id, orgId: ref.orgId ?? null });
1202
+ projectRoot2 = ref.orgId === void 0 ? rootOfProjectAmong(ref.id, null) : rootOfProjectRef({ id: ref.id, orgId: ref.orgId ?? null });
1065
1203
  } catch {
1066
- projectRoot = null;
1204
+ projectRoot2 = null;
1067
1205
  }
1068
1206
  return (conv) => {
1069
1207
  if (conv.projectId) return conv.projectId === ref.id;
1070
- if (!projectRoot) return true;
1071
- return this.roots.get(conv.id) === projectRoot;
1208
+ if (!projectRoot2) return true;
1209
+ return this.roots.get(conv.id) === projectRoot2;
1072
1210
  };
1073
1211
  }
1074
1212
  async get(id) {
@@ -1090,6 +1228,7 @@ ${new Error("trace").stack}`
1090
1228
  workflowType,
1091
1229
  kanbanBoardId,
1092
1230
  kanbanCardId,
1231
+ agentId: extra?.agentId,
1093
1232
  isCompanion: extra?.isCompanion,
1094
1233
  companionEnabled: extra?.companionEnabled,
1095
1234
  companionRunner: extra?.companionRunner,
@@ -1117,6 +1256,7 @@ ${new Error("trace").stack}`
1117
1256
  if (patch.companionEnabled !== void 0) conv.companionEnabled = patch.companionEnabled;
1118
1257
  if (patch.companionRunner !== void 0) conv.companionRunner = patch.companionRunner;
1119
1258
  if (patch.companionConversationId !== void 0) conv.companionConversationId = patch.companionConversationId;
1259
+ if (patch.companionBaseSha !== void 0) conv.companionBaseSha = patch.companionBaseSha;
1120
1260
  if (options?.touch !== false) conv.updatedAt = Date.now();
1121
1261
  await this.save();
1122
1262
  if (!options?.silent) {
@@ -1209,6 +1349,69 @@ ${new Error("trace").stack}`
1209
1349
  };
1210
1350
  var conversationStore = new ConversationStore();
1211
1351
 
1352
+ // ../server/src/services/workspace-cwd.ts
1353
+ import { isAbsolute as isAbsolute2, join as join5, dirname as dirname3 } from "path";
1354
+ async function projectRoot(ref) {
1355
+ const project = await projectStore.get(ref);
1356
+ if (!project) return null;
1357
+ if (!project.orgId) {
1358
+ const root = vaultFor(project).root;
1359
+ return root === localVaultRoot() ? null : dirname3(root);
1360
+ }
1361
+ return projectPathStore.get(project);
1362
+ }
1363
+ async function resolveWorkspaceCwd(target) {
1364
+ const launchDir = localVaultRootParent();
1365
+ if (target.serviceId) {
1366
+ const service = await serviceStore.get(target.serviceId);
1367
+ if (service) {
1368
+ const raw = (target.override ?? service.cwd ?? "").trim();
1369
+ const projects = await projectStore.list();
1370
+ const owner = projects.find((p) => p.serviceIds.includes(service.id));
1371
+ const root = owner ? await projectRoot(owner) : null;
1372
+ return root ? anchor(root, raw) : raw || ".";
1373
+ }
1374
+ }
1375
+ if (target.projectId) {
1376
+ const root = await projectRoot({ id: target.projectId, orgId: target.orgId });
1377
+ const raw = (target.override ?? "").trim();
1378
+ return root ? anchor(root, raw) : raw || launchDir;
1379
+ }
1380
+ return anchor(launchDir, (target.override ?? "").trim());
1381
+ }
1382
+ function anchor(base, raw) {
1383
+ if (!raw || raw === ".") return base;
1384
+ if (raw.startsWith("~") || raw.startsWith("$") || isAbsolute2(raw)) return raw;
1385
+ return join5(base, raw);
1386
+ }
1387
+ function localVaultRootParent() {
1388
+ return dirname3(localVaultRoot());
1389
+ }
1390
+ async function resolveAgentCwd(target) {
1391
+ if (target.serviceId) {
1392
+ const service = await serviceStore.get(target.serviceId);
1393
+ if (service) {
1394
+ const projects = await projectStore.list();
1395
+ const owner = projects.find((p) => p.serviceIds.includes(service.id));
1396
+ const root = owner ? await projectRoot(owner) : null;
1397
+ if (!root) return void 0;
1398
+ return anchor(root, (target.override ?? service.cwd ?? "").trim());
1399
+ }
1400
+ }
1401
+ if (target.projectId) {
1402
+ const root = await projectRoot({ id: target.projectId, orgId: target.orgId });
1403
+ if (!root) return void 0;
1404
+ return anchor(root, (target.override ?? "").trim());
1405
+ }
1406
+ return void 0;
1407
+ }
1408
+ async function resolveConversationCwd(conversationId) {
1409
+ const conv = await conversationStore.get(conversationId);
1410
+ const ref = conv ? await conversationStore.projectRefOf(conv) : null;
1411
+ if (!ref) return resolveAgentCwd({});
1412
+ return resolveAgentCwd({ projectId: ref.id, orgId: ref.orgId });
1413
+ }
1414
+
1212
1415
  // ../server/src/services/turn-events.ts
1213
1416
  import { EventEmitter as EventEmitter3 } from "events";
1214
1417
  var bus = new EventEmitter3();
@@ -1227,8 +1430,8 @@ function onTurnFinished(listener) {
1227
1430
  import { readdir, access, readFile as readFile4 } from "fs/promises";
1228
1431
  import { watch } from "fs";
1229
1432
  import { homedir } from "os";
1230
- import { join as join5 } from "path";
1231
- var PROJECTS_DIR = join5(homedir(), ".claude", "projects");
1433
+ import { join as join6 } from "path";
1434
+ var PROJECTS_DIR = join6(homedir(), ".claude", "projects");
1232
1435
  var DEFAULT_TITLES = /* @__PURE__ */ new Set(["", "New conversation", "Nouvelle conversation"]);
1233
1436
  async function findClaudeSessionFile(sessionId) {
1234
1437
  let entries;
@@ -1239,7 +1442,7 @@ async function findClaudeSessionFile(sessionId) {
1239
1442
  }
1240
1443
  const filename = `${sessionId}.jsonl`;
1241
1444
  for (const dir of entries) {
1242
- const candidate = join5(PROJECTS_DIR, dir, filename);
1445
+ const candidate = join6(PROJECTS_DIR, dir, filename);
1243
1446
  try {
1244
1447
  await access(candidate);
1245
1448
  return candidate;
@@ -1429,7 +1632,7 @@ async function startClaudeTranscriptWatcher() {
1429
1632
  }
1430
1633
  for (const dir of topLevel) {
1431
1634
  try {
1432
- const w = watch(join5(PROJECTS_DIR, dir), (_event, filename) => {
1635
+ const w = watch(join6(PROJECTS_DIR, dir), (_event, filename) => {
1433
1636
  handleFsEvent(filename ? filename.toString() : null);
1434
1637
  });
1435
1638
  w.on("error", () => {
@@ -1454,7 +1657,7 @@ function stopClaudeTranscriptWatcher() {
1454
1657
 
1455
1658
  // ../server/src/services/codex-transcript-sync.ts
1456
1659
  import { watch as watch2 } from "fs";
1457
- import { dirname as dirname2 } from "path";
1660
+ import { dirname as dirname4 } from "path";
1458
1661
  var announced = /* @__PURE__ */ new Map();
1459
1662
  function forgetCodexTurns(conversationId) {
1460
1663
  announced.delete(conversationId);
@@ -1508,7 +1711,7 @@ function startCodexTranscriptWatcher() {
1508
1711
  const db = findThreadDb();
1509
1712
  if (!db) return;
1510
1713
  try {
1511
- watcher = watch2(dirname2(db), (_event, filename) => {
1714
+ watcher = watch2(dirname4(db), (_event, filename) => {
1512
1715
  if (!filename || !/^thread_history_\d+\.sqlite/.test(filename.toString())) return;
1513
1716
  if (debounce) clearTimeout(debounce);
1514
1717
  debounce = setTimeout(() => {
@@ -1873,70 +2076,35 @@ function formatExchange(messages, from) {
1873
2076
  }
1874
2077
  function fullInstructions() {
1875
2078
  return [
1876
- "Tu relis le travail d'un autre agent, dans la m\xEAme conversation que lui.",
1877
- "Tu ne modifies rien. Ton seul produit est le message que tu renvoies. La carte",
1878
- "kanban, si la conversation en a une, dit ce que \xAB termin\xE9 \xBB veut dire ici : tu peux la",
1879
- "lire, mais tu ne la d\xE9places pas, tu ne la commentes pas, tu ne la modifies pas.",
1880
- "",
1881
- "Les images ne te sont PAS jointes : l'\xE9change n'en porte que le chemin, sous la",
1882
- "forme [Image: source: /chemin/fichier.png]. Pour en lire une, ouvre ce chemin avec ton outil de lecture de fichiers \u2014 tu en as un.",
1883
- "N'invente JAMAIS le contenu d'une image que tu n'as pas ouverte : dis que la",
1884
- "lecture a \xE9chou\xE9. On te croirait.",
1885
- "",
1886
- "R\xC8GLE 1 \u2014 ON PEUT T'ADRESSER LA PAROLE, ET ALORS TU R\xC9PONDS.",
1887
- "Si l'\xE9change te parle, te nomme, te demande quelque chose : tu r\xE9ponds, TOUJOURS,",
1888
- "m\xEAme si c'est trivial ou sans rapport avec la relecture. Ne r\xE9ponds JAMAIS " + VERDICT_NOTHING,
1889
- "dans ce cas.",
1890
- "Quand l'agent r\xE9pond \xE0 ta remarque \u2014 il l'a corrig\xE9e, contest\xE9e, ou en prend acte \u2014",
1891
- "il ne t'adresse PAS la parole : il te r\xE9pond. Tu ne r\xE9ponds que s'il te pose une",
1892
- "question, ou si sa r\xE9ponse est fausse ou incompl\xE8te. Sinon : " + VERDICT_NOTHING + ".",
2079
+ "Tu relis le travail d'un autre agent, dans la m\xEAme conversation. Tu ne modifies",
2080
+ "rien : ni le code, ni la carte kanban, que tu peux lire mais pas d\xE9placer ni",
2081
+ "commenter. Tu ne d\xE9l\xE8gues pas \xE0 un sous-agent.",
1893
2082
  "",
1894
- "ET DANS TOUS LES CAS \u2014 RIEN DE NEUF, RIEN DU TOUT. Jamais d'accus\xE9 de r\xE9ception (\xAB bien re\xE7u \xBB),",
1895
- "de remerciement, de \xAB rien \xE0 signaler \xBB, de \xAB c'est bon \xBB ni de \xAB aucun constat \xBB :",
1896
- "chacun de ces messages relance l'agent, qui te r\xE9pond, et la boucle tourne. Si ton",
1897
- "message ne contient ni d\xE9faut, ni question, ni r\xE9ponse \xE0 une question : " + VERDICT_NOTHING + ".",
2083
+ "Images : l'\xE9change ne porte que leur chemin, [Image: source: /chemin.png].",
2084
+ "Ouvre-le avec ton outil de lecture. Si la lecture \xE9choue, dis-le. N'invente",
2085
+ "jamais le contenu d'une image.",
1898
2086
  "",
1899
- "R\xC8GLE 2 \u2014 sinon, tu relis, et tu ne parles que si tu as trouv\xE9 quelque chose :",
1900
- " \xB7 une r\xE9gression \u2014 un comportement qui change sans que ce soit voulu ;",
1901
- " \xB7 un effet de bord \u2014 ce que la modification touche sans le dire ;",
1902
- " \xB7 de la duplication \u2014 du code qui existe d\xE9j\xE0 ailleurs dans le d\xE9p\xF4t ;",
1903
- " \xB7 une affirmation non v\xE9rifi\xE9e pr\xE9sent\xE9e comme acquise.",
1904
- "Sois sobre l\xE0, et seulement l\xE0 : une remarque que personne",
1905
- "n'a demand\xE9e interrompt quelqu'un au travail. Pointe un fichier et une ligne.",
2087
+ "QUAND PARLER",
2088
+ "- Si l'\xE9change te parle ou te pose une question, r\xE9ponds toujours.",
2089
+ "- Sinon, parle seulement si tu as trouv\xE9 un d\xE9faut : r\xE9gression, effet de bord,",
2090
+ " duplication de code existant, faille de s\xE9curit\xE9, affirmation non v\xE9rifi\xE9e.",
2091
+ "- Pas d'accus\xE9 de r\xE9ception, de remerciement ni de \xAB rien \xE0 signaler \xBB : chacun",
2092
+ " relance l'agent. Quand il r\xE9pond \xE0 ta remarque, tais-toi, sauf s'il pose une",
2093
+ " question ou si sa r\xE9ponse est fausse.",
1906
2094
  "",
1907
- "Ne te fie ni aux commentaires, ni aux messages de commit, ni \xE0 ce que l'agent principal",
1908
- "affirme : ils disent l'intention, pas le code. Va lire le code r\xE9el. Un d\xE9compte",
1909
- "ne prouve rien \u2014 \xAB appel\xE9 quatre fois \xBB, un `grep -c` s'\xE9crivent sans rien ouvrir ;",
1910
- "cite l'extrait de chaque site d'appel, sinon c'est \xAB non v\xE9rifi\xE9 \xBB.",
1911
- "",
1912
- "S\xC9CURIT\xC9 \u2014 regarde ce qui a \xE9t\xE9 RETIR\xC9 (validation supprim\xE9e, contr\xF4le d'acc\xE8s",
1913
- "d\xE9plac\xE9, entr\xE9e qui n'est plus \xE9chapp\xE9e : rien n'en reste dans le code final) et",
1914
- "ce qui n'a JAMAIS \xE9t\xE9 mis \u2014 un contr\xF4le absent d'une entr\xE9e ne figure dans aucun",
1915
- "diff, alors \xE9num\xE8re toutes les entr\xE9es qui livrent la ressource. Ne signale une",
1916
- "vuln\xE9rabilit\xE9 que si tu peux d\xE9crire le chemin complet d'une entr\xE9e r\xE9ellement",
1917
- "contr\xF4lable jusqu'au point vuln\xE9rable ; sinon tais-toi. Quatre exceptions, parce",
1918
- "que le d\xE9g\xE2t est d\xE9j\xE0 fait : secret expos\xE9, crypto maison, protection supprim\xE9e,",
1919
- "d\xE9pendance ajout\xE9e sans v\xE9rification.",
1920
- "",
1921
- "Classe : bloquant, risqu\xE9, mineur. Jamais de pr\xE9f\xE9rence de style.",
1922
- "Dis s\xE9par\xE9ment ce que tu n'as PAS pu v\xE9rifier \u2014 fichier non lu, d\xE9pendance",
1923
- "externe, comportement \xE0 l'ex\xE9cution \u2014 plut\xF4t que de supposer.",
1924
- "",
1925
- "D'un tour \xE0 l'autre tu gardes le fil : on ne te donne que ce que tu n'as pas",
1926
- "encore relu. Ne resignale pas ce que tu as d\xE9j\xE0 signal\xE9 \u2014 v\xE9rifie si \xE7'a \xE9t\xE9",
1927
- "trait\xE9, et reviens dessus seulement sinon.",
1928
- "",
1929
- "Le tour a-t-il modifi\xE9 du code ? S'il n'a rien chang\xE9 \u2014 question, explication,",
1930
- "refus \u2014 n'inspecte PAS le d\xE9p\xF4t. Sinon va le lire toi-m\xEAme : `git diff`, `git",
1931
- "status`, les fichiers touch\xE9s. Ne demande rien, cherche.",
1932
- "Le p\xE9rim\xE8tre n'est pas les lignes du diff, c'est ce dont ce tour est RESPONSABLE :",
1933
- "ce qu'il engage \u2014 appelants, autres entr\xE9es d'une m\xEAme ressource \u2014 et ce que le",
1934
- "code neuf aurait d\xFB pr\xE9voir. Un d\xE9faut dans du code non modifi\xE9 te regarde s'il",
1935
- "na\xEEt de ce tour ou si ce tour l'a rendu atteignable ; ce qui vivait sans lui, non.",
1936
- "",
1937
- "Tu v\xE9rifies dans ton propre tour : ne d\xE9l\xE8gue jamais \xE0 un sous-agent \u2014 ta r\xE9ponse",
1938
- "est lue au moment o\xF9 tu la renvoies, ce qu'un sous-agent dirait apr\xE8s",
1939
- "n'atteindrait plus personne. Lis, cherche, conclus \u2014 ou ne dis rien.",
2095
+ "COMMENT RELIRE",
2096
+ "- Lis le code r\xE9el : `git diff`, `git status`, les fichiers touch\xE9s, leurs",
2097
+ " appelants. Ne te fie ni aux commentaires, ni aux messages de commit, ni \xE0 ce",
2098
+ " qu'affirme l'agent : ils donnent l'intention, pas le code.",
2099
+ "- Ce tour r\xE9pond de ce qu'il modifie et de ce qu'il rend atteignable, pas de ce",
2100
+ " qui existait sans lui.",
2101
+ "- S\xE9curit\xE9 : regarde aussi ce qui a \xE9t\xE9 retir\xE9, et les contr\xF4les absents sur",
2102
+ " chaque entr\xE9e qui m\xE8ne \xE0 la ressource.",
2103
+ "- Cite fichier et ligne. Classe : bloquant, risqu\xE9, mineur. Dis ce que tu n'as",
2104
+ " pas pu v\xE9rifier.",
2105
+ "- Pas de tests complets, build, typecheck global ni serveur : s'il en faut, dis",
2106
+ " \xE0 l'agent quoi lancer.",
2107
+ "- Ne resignale pas ce qui a d\xE9j\xE0 \xE9t\xE9 signal\xE9, sauf si ce n'est pas trait\xE9.",
1940
2108
  "",
1941
2109
  "Ces consignes valent pour toute la session : elles ne te seront pas r\xE9p\xE9t\xE9es."
1942
2110
  ].join("\n");
@@ -1970,7 +2138,10 @@ function reminder() {
1970
2138
  function companionDefaultPrompt() {
1971
2139
  return fullInstructions();
1972
2140
  }
1973
- function buildCompanionPrompt(exchange, isFirstTurn = true, custom) {
2141
+ function baseLine(baseSha) {
2142
+ return `Point de d\xE9part : le travail de la conversation, commits compris, est dans \`git diff ${baseSha}\`.`;
2143
+ }
2144
+ function buildCompanionPrompt(exchange, isFirstTurn = true, custom, baseSha) {
1974
2145
  const customInstructions = custom?.trim();
1975
2146
  const instructions = isFirstTurn ? [
1976
2147
  fullInstructions(),
@@ -1986,6 +2157,7 @@ function buildCompanionPrompt(exchange, isFirstTurn = true, custom) {
1986
2157
  ].join("\n") : reminder();
1987
2158
  return [
1988
2159
  instructions,
2160
+ ...baseSha ? ["", baseLine(baseSha)] : [],
1989
2161
  "",
1990
2162
  "--- Ce que tu n'as pas encore relu de la conversation ---",
1991
2163
  exchange || "(vide)"
@@ -2037,12 +2209,13 @@ async function runCompanionForTurn(conversationId) {
2037
2209
  if (!hasNew) {
2038
2210
  return skip(conversationId, "nothingNew", `rien de neuf \xE0 relire (${messageCount} messages)`);
2039
2211
  }
2040
- const { startCliSession } = await import("./chat-SWYI4ENT.js");
2212
+ const { startCliSession } = await import("./chat-Q2UMYXQL.js");
2041
2213
  const companionConv = await ensureCompanionConversation(conv);
2042
2214
  const isFirstTurn = (companionConv.messages?.length ?? 0) === 0;
2043
2215
  const exchange = formatExchange(conv.messages, from);
2044
2216
  const { prompt: customPrompt } = await companionSettings();
2045
- const prompt = buildCompanionPrompt(exchange, isFirstTurn, customPrompt);
2217
+ const baseSha = await ensureCompanionBase(conv);
2218
+ const prompt = buildCompanionPrompt(exchange, isFirstTurn, customPrompt, baseSha);
2046
2219
  const jwt = await signJwt();
2047
2220
  const environmentId = await activeEnvironmentOf(conv);
2048
2221
  const agentId = companionAgentId(
@@ -2152,7 +2325,7 @@ async function deliverToMainConversation(conv, message) {
2152
2325
  async function attemptDelivery(conv, message) {
2153
2326
  if (await writeToLivePty(conv.id, message)) return "pty";
2154
2327
  try {
2155
- const { startCliSession } = await import("./chat-SWYI4ENT.js");
2328
+ const { startCliSession } = await import("./chat-Q2UMYXQL.js");
2156
2329
  await startCliSession(conv.runner, conv.id, message, { jwt: await signJwt() });
2157
2330
  return "headless";
2158
2331
  } catch (err) {
@@ -2175,7 +2348,7 @@ async function writeToLivePty(conversationId, message) {
2175
2348
  }
2176
2349
  async function companionSettings() {
2177
2350
  try {
2178
- const { settingsManager } = await import("./settings-manager-J4QBIU3T.js");
2351
+ const { settingsManager } = await import("./settings-manager-BBNCDDQJ.js");
2179
2352
  const settings = await settingsManager.getSettings();
2180
2353
  return settings.companion ?? { enabledByDefault: false };
2181
2354
  } catch {
@@ -2242,7 +2415,12 @@ async function ensureCompanionConversation(conv) {
2242
2415
  void 0,
2243
2416
  conv.projectId,
2244
2417
  void 0,
2245
- { isCompanion: true }
2418
+ // Le même agent que la conversation relue — c'est lui qui décide du dépôt,
2419
+ // et le compagnon relit ce dépôt-là. Le LANCEMENT visait déjà le bon agent
2420
+ // (`companionAgentId`) ; ce qui manquait, c'est que sa conversation le dise :
2421
+ // sans ce champ, tout ce qui la lit — bouton Git, terminal, activité du PTY —
2422
+ // retombait sur l'agent par défaut du serveur, donc sur un autre dépôt.
2423
+ { isCompanion: true, agentId: conv.agentId }
2246
2424
  );
2247
2425
  await conversationStore.update(conv.id, { companionConversationId: companion.id });
2248
2426
  return companion;
@@ -2252,14 +2430,58 @@ async function runCompanionNow(conversationId) {
2252
2430
  resetRelaunches(conversationId);
2253
2431
  await runCompanionForTurn(conversationId);
2254
2432
  }
2433
+ var SHA_RE = /^[0-9a-f]{40}$|^[0-9a-f]{64}$/;
2434
+ async function headCommit(queryLog) {
2435
+ try {
2436
+ const log = await queryLog();
2437
+ const first = Array.isArray(log) ? log[0] : void 0;
2438
+ const hash = first && typeof first === "object" && "hash" in first ? first.hash : void 0;
2439
+ return typeof hash === "string" && SHA_RE.test(hash) ? hash : void 0;
2440
+ } catch {
2441
+ return void 0;
2442
+ }
2443
+ }
2444
+ var capturingBase = /* @__PURE__ */ new Set();
2445
+ var baseTriedOnChange = /* @__PURE__ */ new Set();
2446
+ async function ensureCompanionBase(conv) {
2447
+ if (conv.companionBaseSha) return conv.companionBaseSha;
2448
+ if (conv.isCompanion || !conv.companionEnabled || capturingBase.has(conv.id)) return void 0;
2449
+ capturingBase.add(conv.id);
2450
+ try {
2451
+ const agentId = conv.agentId ?? agentManager.getDefaultAgentId();
2452
+ if (!agentId) return void 0;
2453
+ const cwd = await resolveConversationCwd(conv.id) ?? ".";
2454
+ const sha = await headCommit(() => agentManager.agentQuery(agentId, "git.log", { cwd, limit: 1 }));
2455
+ if (!sha) return void 0;
2456
+ await conversationStore.update(conv.id, { companionBaseSha: sha }, { silent: true, touch: false });
2457
+ return sha;
2458
+ } finally {
2459
+ capturingBase.delete(conv.id);
2460
+ }
2461
+ }
2255
2462
  var unsubscribe = null;
2256
2463
  function initCompanion() {
2257
2464
  if (unsubscribe) return;
2258
- unsubscribe = onTurnFinished((conversationId) => {
2465
+ const offTurn = onTurnFinished((conversationId) => {
2259
2466
  runCompanionForTurn(conversationId).catch((err) => {
2260
2467
  console.error("[companion]", err.message);
2261
2468
  });
2262
2469
  });
2470
+ const onChange = (event) => {
2471
+ if (event.type !== "created" && event.type !== "updated") return;
2472
+ const conv = event.conversation;
2473
+ if (!conv.companionEnabled || conv.isCompanion || conv.companionBaseSha) return;
2474
+ if (baseTriedOnChange.has(conv.id)) return;
2475
+ baseTriedOnChange.add(conv.id);
2476
+ ensureCompanionBase(conv).catch((err) => {
2477
+ console.error("[companion] point de d\xE9part :", err.message);
2478
+ });
2479
+ };
2480
+ conversationStore.onChanged(onChange);
2481
+ unsubscribe = () => {
2482
+ offTurn();
2483
+ conversationStore.offChanged(onChange);
2484
+ };
2263
2485
  }
2264
2486
 
2265
2487
  export {
@@ -2270,9 +2492,12 @@ export {
2270
2492
  ensureDataGitignore,
2271
2493
  holdsRuneyaProject,
2272
2494
  projectPathStore,
2273
- LocalProjectExistsError,
2495
+ LocalProjectRefusedError,
2274
2496
  projectStore,
2275
2497
  conversationStore,
2498
+ resolveWorkspaceCwd,
2499
+ resolveAgentCwd,
2500
+ resolveConversationCwd,
2276
2501
  findClaudeSessionFile,
2277
2502
  claudeSessionExists,
2278
2503
  readClaudeTranscript,
@@ -2315,6 +2540,7 @@ export {
2315
2540
  companionSettings,
2316
2541
  answerOfTurn,
2317
2542
  runCompanionNow,
2543
+ headCommit,
2318
2544
  initCompanion
2319
2545
  };
2320
- //# sourceMappingURL=chunk-C6LIGJFX.js.map
2546
+ //# sourceMappingURL=chunk-GLIU3J47.js.map