@runeya/runeya 2.0.118 → 2.0.120

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 (232) hide show
  1. package/agent/index.js +15 -3
  2. package/agent/index.js.map +1 -1
  3. package/agent-manager-ACPQWUZ5.js +9 -0
  4. package/{chat-XUIXGKSR.js → chat-PXMMZIAY.js} +6 -6
  5. package/{chunk-WE6EOX4C.js → chunk-22RJM654.js} +178 -15
  6. package/chunk-22RJM654.js.map +1 -0
  7. package/{chunk-P47X3LT3.js → chunk-2WXQIUVC.js} +2 -2
  8. package/{chunk-I2AZCZMR.js → chunk-GIHR3BGT.js} +2 -2
  9. package/{chunk-RN4X65D3.js → chunk-H6VIS4OY.js} +20 -4
  10. package/chunk-H6VIS4OY.js.map +1 -0
  11. package/{chunk-XIRMRWVU.js → chunk-NYKFDU76.js} +6 -6
  12. package/{companion-POUL5OGO.js → companion-4RQ3AMOL.js} +4 -4
  13. package/{desktop-launcher-QVYFCE56.js → desktop-launcher-ADGRYF4S.js} +2 -2
  14. package/index.js +4 -4
  15. package/mcp-server/index.js +16 -0
  16. package/mcp-server/index.js.map +1 -1
  17. package/package.json +1 -1
  18. package/settings-manager-2C7RY6ZC.js +9 -0
  19. package/{src-VCZQLW2Q.js → src-NRKK27F3.js} +11 -9
  20. package/{src-VCZQLW2Q.js.map → src-NRKK27F3.js.map} +1 -1
  21. package/web/assets/{AgentScalarChatInterface.vue-BrMvIukr.js → AgentScalarChatInterface.vue-Lgml1vhh.js} +1 -1
  22. package/web/assets/{AgentTerminalPage-CXWlEDYr.js → AgentTerminalPage-CwxbyQxm.js} +1 -1
  23. package/web/assets/AiChatPage-CknE-NOo.js +1 -0
  24. package/web/assets/{AppLayout-Kc2JJjh1.js → AppLayout-DT6bb__K.js} +1 -1
  25. package/web/assets/{AuditPage-Da3_Dw6e.js → AuditPage-DzK5Tp3Z.js} +1 -1
  26. package/web/assets/{CloudAccountPage-C6zqdsH7.js → CloudAccountPage-BDQpVEAX.js} +1 -1
  27. package/web/assets/CloudAccountPage-CWdxZvAC.js +1 -0
  28. package/web/assets/{CloudMessagingPage-DTuqXSPI.js → CloudMessagingPage-BX0QPzkR.js} +1 -1
  29. package/web/assets/{DashboardPage-BGRnC6VN.js → DashboardPage-BNBzT2zb.js} +1 -1
  30. package/web/assets/{DirectoryPickerDialog-DEoqmzoh.js → DirectoryPickerDialog-ZT-tL_4A.js} +1 -1
  31. package/web/assets/{EditorIcon-CtWlXuLo.js → EditorIcon-CdapdMgo.js} +1 -1
  32. package/web/assets/{EnvironmentForm-7rQeTN-8.js → EnvironmentForm-Dgrt5I5N.js} +1 -1
  33. package/web/assets/{EnvironmentFormPage-YcYUsjhT.js → EnvironmentFormPage-B7uerFJ0.js} +1 -1
  34. package/web/assets/{EnvironmentListPage-CLD1-AAY.js → EnvironmentListPage-tTe_1yh-.js} +1 -1
  35. package/web/assets/{KanbanBoardPage-B7VdWhZB.js → KanbanBoardPage-DTZVqxd6.js} +3 -3
  36. package/web/assets/{KanbanListPage-BEHtcwKs.js → KanbanListPage-D82HSRy7.js} +1 -1
  37. package/web/assets/{LaunchProjectPage-exfyMjFt.js → LaunchProjectPage-DgaslasQ.js} +1 -1
  38. package/web/assets/{LaunchServicesPage-YVkLRJqQ.js → LaunchServicesPage-I2HCqujc.js} +1 -1
  39. package/web/assets/{LogViewer-D1RcM2A4.js → LogViewer-CYuoSJAN.js} +1 -1
  40. package/web/assets/{OrgKeyPrompt-C7LMf-Zk.js → OrgKeyPrompt-Asz6FlrN.js} +1 -1
  41. package/web/assets/{ProcessControls-58Ablgi0.js → ProcessControls-DRyD5bQg.js} +1 -1
  42. package/web/assets/{ProcessDetailPage-BUjh1O5a.js → ProcessDetailPage-DHmTCgj8.js} +1 -1
  43. package/web/assets/{ProcessMetrics-BEzFNP7J.js → ProcessMetrics-D5SgFgFU.js} +1 -1
  44. package/web/assets/{RandomJobTestPage-DuPQQhVb.js → RandomJobTestPage-COLLiJzt.js} +1 -1
  45. package/web/assets/{ScenarioEditorPage-6-CuJOmJ.js → ScenarioEditorPage-rDIB08Ap.js} +1 -1
  46. package/web/assets/{SendToChatDialog-CxuunSwf.js → SendToChatDialog-BvUmZhUU.js} +1 -1
  47. package/web/assets/{ServiceControlsBar-Cu9vxEOQ.js → ServiceControlsBar-DGTsbA5Q.js} +1 -1
  48. package/web/assets/{ServiceDetailPage-B4plJ5bz.js → ServiceDetailPage-Ddko3DNN.js} +1 -1
  49. package/web/assets/{ServiceFormPage-7O2k1FOl.js → ServiceFormPage-oVVmtWjt.js} +1 -1
  50. package/web/assets/{SettingsPage-Hwj6MTiF.js → SettingsPage-BcQruhk1.js} +4 -4
  51. package/web/assets/{UnlockPage-Dcv0Z9re.js → UnlockPage-OH7UV01L.js} +1 -1
  52. package/web/assets/{VaultMigrationPage-B25lyJg7.js → VaultMigrationPage-B4a0WihW.js} +1 -1
  53. package/web/assets/{VersionBadge-HrSfhQYh.js → VersionBadge-URtOAd5L.js} +1 -1
  54. package/web/assets/WikiPage-BotpKBAY.js +1 -0
  55. package/web/assets/{WikiView-nfJY79hF.js → WikiView-DQCs79lu.js} +1 -1
  56. package/web/assets/{add-scalar-classes-H19oYTsX.js → add-scalar-classes-CnAomA8D.js} +3 -3
  57. package/web/assets/{autocomplete-DJxf2wqE.js → autocomplete-ByrzVX5h.js} +1 -1
  58. package/web/assets/{basic-shape-diamond.svg-COr16MGG.js → basic-shape-diamond.svg-h2koobo1.js} +1 -1
  59. package/web/assets/{basic-shape-hexagon.svg-BzYcuOkI.js → basic-shape-hexagon.svg--IMj5O6H.js} +1 -1
  60. package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-Bw1gV38D.js → basic-shape-primary-circle-ellipse-round.svg-B0JqtIPK.js} +1 -1
  61. package/web/assets/{basic-shape-primary-square-rectangle.svg-Cn_NwW2C.js → basic-shape-primary-square-rectangle.svg-nMUFcz3q.js} +1 -1
  62. package/web/assets/{basic-shape-shield.svg-DMZviUvu.js → basic-shape-shield.svg-B01_o2Y1.js} +1 -1
  63. package/web/assets/{browser-72MoXpHU.js → browser-DcLBGCAS.js} +1 -1
  64. package/web/assets/{browser-APehRX_-.js → browser-OPkfGEHD.js} +1 -1
  65. package/web/assets/{card-DWOaM9R5.js → card-C3Xots9M.js} +1 -1
  66. package/web/assets/{checkbox-3MTmcxWS.js → checkbox-DGCPu95-.js} +1 -1
  67. package/web/assets/{chip-DX0PHdQT.js → chip-Chk5tAnb.js} +1 -1
  68. package/web/assets/{client-CmMSqZpF.js → client-CbBJUuyt.js} +1 -1
  69. package/web/assets/{cloud-chat.store-BcZHJL7V.js → cloud-chat.store-COR3nnYR.js} +1 -1
  70. package/web/assets/cloud-client-DZFY1sze.js +1 -0
  71. package/web/assets/cloud-session-CCJUvzk1.js +1 -0
  72. package/web/assets/{cloud-session-CMcFsrn6.js → cloud-session-CnTOFA6T.js} +2 -2
  73. package/web/assets/{column-CDX5Db_i.js → column-ROcesBUs.js} +1 -1
  74. package/web/assets/{computer-device-desktop-monitor.svg-BLXia0GM.js → computer-device-desktop-monitor.svg-CfTbcAFd.js} +1 -1
  75. package/web/assets/{computer-device-desktop.svg-gunjcHFA.js → computer-device-desktop.svg-Cl-xv361.js} +1 -1
  76. package/web/assets/{computer-device-laptop.svg-Bw0yugEp.js → computer-device-laptop.svg-ukRjIyMq.js} +1 -1
  77. package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-C0WpuMdy.js → computer-device-mobile-phone-android-samsung-back.svg-CoDvI0SU.js} +1 -1
  78. package/web/assets/{computer-device-mobile-phone-android-samsung.svg-CNHYgja0.js → computer-device-mobile-phone-android-samsung.svg-BQWjk4Zt.js} +1 -1
  79. package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-DggESCcp.js → computer-device-mobile-phone-iphone-x-back.svg-DAoSG317.js} +1 -1
  80. package/web/assets/{computer-device-mobile-phone-iphone-x.svg-CDSSQDCC.js → computer-device-mobile-phone-iphone-x.svg-BPjvW-EA.js} +1 -1
  81. package/web/assets/{computer-device-mobile-tablet-touch.svg-DY9TWMUB.js → computer-device-mobile-tablet-touch.svg-BYEFFDGJ.js} +1 -1
  82. package/web/assets/{computer-device-mobile-tablet.svg-D_hfbqaw.js → computer-device-mobile-tablet.svg-DNLPmtgI.js} +1 -1
  83. package/web/assets/{computer-device-network-ethernet-cat6.svg-CCoszOYr.js → computer-device-network-ethernet-cat6.svg-BLWV1j_N.js} +1 -1
  84. package/web/assets/{computer-device-network-lan-www.svg-CClZA2cg.js → computer-device-network-lan-www.svg-BOoU0zpo.js} +1 -1
  85. package/web/assets/{computer-device-network-wifi-connection.svg-DHLQJkPy.js → computer-device-network-wifi-connection.svg-DGwn0IjA.js} +1 -1
  86. package/web/assets/{computer-device-network-wifi-router.svg-xActAcrc.js → computer-device-network-wifi-router.svg-C5g_K48A.js} +1 -1
  87. package/web/assets/{cssMode-UiVbv5-d.js → cssMode-Cx5qrxXy.js} +1 -1
  88. package/web/assets/{divider-CHpP62xs.js → divider-BrS14lDG.js} +1 -1
  89. package/web/assets/{docx-preview-CZnedVKH.js → docx-preview-DAPpQjxw.js} +1 -1
  90. package/web/assets/{ecology-science-erlenmeyer-flask.svg-BNQkfPKh.js → ecology-science-erlenmeyer-flask.svg-DomVqm74.js} +1 -1
  91. package/web/assets/{fieldset-BEeYMjpD.js → fieldset-C0CmkHzJ.js} +1 -1
  92. package/web/assets/{freemarker2-DEBZcua_.js → freemarker2-183f16_T.js} +1 -1
  93. package/web/assets/{handlebars-BNH-tM3s.js → handlebars-Ck2u5MRS.js} +1 -1
  94. package/web/assets/{html-BFhZuj1f.js → html-RFHCet7g.js} +1 -1
  95. package/web/assets/{htmlMode-DsWwMsD5.js → htmlMode-MLvTePcj.js} +1 -1
  96. package/web/assets/{image-flash-lightning.svg-CaDxrzvs.js → image-flash-lightning.svg-C_9EqK2Z.js} +1 -1
  97. package/web/assets/{image-picture-flower.svg-Cm83ljlo.js → image-picture-flower.svg-Cw0p4SDa.js} +1 -1
  98. package/web/assets/{index-D1xU-p3z.js → index-De7vzwYE.js} +251 -251
  99. package/web/assets/{index-Bk2hTx0g.css → index-qjiWPMcS.css} +1 -1
  100. package/web/assets/{interface-alert-exclamation-diamond.svg-CXdlYd1V.js → interface-alert-exclamation-diamond.svg-D_7jQp52.js} +1 -1
  101. package/web/assets/{interface-alert-exclamation-triangle-warning.svg-CeyAEw_C.js → interface-alert-exclamation-triangle-warning.svg-slrQHD7Z.js} +1 -1
  102. package/web/assets/{interface-alert-information-circle.svg-DUbwIFHR.js → interface-alert-information-circle.svg-D6HZsCxj.js} +1 -1
  103. package/web/assets/{interface-award-crown.svg-BI3VqkS7.js → interface-award-crown.svg-C8KlpCo8.js} +1 -1
  104. package/web/assets/{interface-bookmark.svg-C_zoDBZC.js → interface-bookmark-tag.svg-4m7iWpFd.js} +1 -1
  105. package/web/assets/{interface-bookmark-tag.svg-BNP52up1.js → interface-bookmark.svg-CcHEFyZI.js} +1 -1
  106. package/web/assets/{interface-calendar-date-one.svg-DC0tGASA.js → interface-calendar-date-one.svg-B-NpBZQW.js} +1 -1
  107. package/web/assets/{interface-content-book-open-pages.svg-l-5VHr-g.js → interface-content-book-open-pages.svg-D6JSr0DE.js} +1 -1
  108. package/web/assets/{interface-content-book-page.svg-CagVpKh4.js → interface-content-book-page.svg-4JwHKP99.js} +1 -1
  109. package/web/assets/{interface-content-file.svg-B0aGvqPx.js → interface-content-file.svg-dDsVtuW0.js} +1 -1
  110. package/web/assets/interface-content-folder.svg-CagI3wg0.js +1 -0
  111. package/web/assets/{interface-content-folder.svg-CVxNoyJ7.js → interface-content-folder.svg-VlaIOWsg.js} +1 -1
  112. package/web/assets/{interface-copy-clipboard.svg-D78-91bx.js → interface-copy-clipboard.svg-C8NaVJTP.js} +1 -1
  113. package/web/assets/{interface-edit-attachment.svg-D6pWV5bC.js → interface-edit-attachment.svg-DLv3r8Ta.js} +1 -1
  114. package/web/assets/{interface-edit-binocular.svg-C6wbX04C.js → interface-edit-binocular.svg-Dn_isC0z.js} +1 -1
  115. package/web/assets/{interface-edit-magic-wand.svg-CoZhFtfQ.js → interface-edit-magic-wand.svg-D7nDtfWR.js} +1 -1
  116. package/web/assets/{interface-edit-tool-paint-roller.svg-DTQGU9t3.js → interface-edit-tool-paint-roller.svg-pvqfHBhq.js} +1 -1
  117. package/web/assets/{interface-edit-tool-pencil.svg-ByQHy9tx.js → interface-edit-tool-pencil.svg-65sH97q4.js} +1 -1
  118. package/web/assets/{interface-favorite-award.svg-0CNheH17.js → interface-favorite-award.svg-ByKr9sn6.js} +1 -1
  119. package/web/assets/{interface-favorite-flag.svg-CCmC-2ES.js → interface-favorite-flag.svg-Dw-AP2Bq.js} +1 -1
  120. package/web/assets/{interface-favorite-heart.svg-BVpuv5ru.js → interface-favorite-heart.svg-B_rIv8ZF.js} +1 -1
  121. package/web/assets/{interface-favorite-star.svg-D7-x2gpZ.js → interface-favorite-star.svg-DdSC1aGg.js} +1 -1
  122. package/web/assets/{interface-favorite-stars-sparkles.svg-BReo0WNX.js → interface-favorite-stars-sparkles.svg-B2P_fEQm.js} +1 -1
  123. package/web/assets/{interface-hierarchy-flowchart.svg-D6044jiD.js → interface-hierarchy-flowchart.svg-Dn7xVcha.js} +1 -1
  124. package/web/assets/{interface-home-house.svg-BDbbqQ7y.js → interface-home-house.svg-CPV7dtoL.js} +1 -1
  125. package/web/assets/{interface-hyperlink.svg-jMR6mBTh.js → interface-hyperlink.svg-BxEpW0yS.js} +1 -1
  126. package/web/assets/{interface-lighting-brightness.svg-DxAyAplK.js → interface-lighting-brightness.svg-CHwx5muE.js} +1 -1
  127. package/web/assets/{interface-lock-closed.svg-KHv3R3lv.js → interface-lock-closed.svg-Ct9YyvGT.js} +1 -1
  128. package/web/assets/{interface-lock-open-unlock.svg-DTVS6Ld3.js → interface-lock-open-unlock.svg-DuuZ9seB.js} +1 -1
  129. package/web/assets/{interface-login-key.svg-CmrsGePn.js → interface-login-key.svg-DwQq_1hs.js} +1 -1
  130. package/web/assets/{interface-search.svg-D68gdm71.js → interface-search.svg-Cd9FPHXP.js} +1 -1
  131. package/web/assets/{interface-setting-cog.svg-BpmjacTl.js → interface-setting-cog.svg-C2oUvcZk.js} +1 -1
  132. package/web/assets/{interface-share-megaphone-bullhorn.svg-B1Qopu7g.js → interface-share-megaphone-bullhorn.svg-D_sqPbcr.js} +1 -1
  133. package/web/assets/{interface-share-rocket.svg-xe-sFt3v.js → interface-share-rocket.svg-DHw9o1DN.js} +1 -1
  134. package/web/assets/{interface-share-satellite.svg-DKB0wpfg.js → interface-share-satellite.svg-CYuWbhdH.js} +1 -1
  135. package/web/assets/{interface-share-space-ship.svg-BXUyLcC9.js → interface-share-space-ship.svg-CsQbvDGw.js} +1 -1
  136. package/web/assets/{interface-share.svg--X4Sy8OU.js → interface-share.svg-CxR58P36.js} +1 -1
  137. package/web/assets/{interface-signal-square.svg-SVcBtlCh.js → interface-signal-square.svg-BFCAMIlM.js} +1 -1
  138. package/web/assets/{interface-time-clock-circle.svg-MMicUy7s.js → interface-time-clock-circle.svg-BMtmcI_Z.js} +1 -1
  139. package/web/assets/{interface-time-hour-glass.svg-CqNSWB1s.js → interface-time-hour-glass.svg-F_74mbfe.js} +1 -1
  140. package/web/assets/{interface-users-multiple.svg-Cb-ACWeS.js → interface-users-multiple.svg-GqG3hBlb.js} +1 -1
  141. package/web/assets/{interface-weather-moon.svg-BTBYfL8w.js → interface-weather-moon.svg-By26aJ-s.js} +1 -1
  142. package/web/assets/{javascript-DW5dr95z.js → javascript-DWG-shUz.js} +1 -1
  143. package/web/assets/{jsonMode-D3gEKJlR.js → jsonMode-c7o5Rqeq.js} +1 -1
  144. package/web/assets/{liquid-DsB3REL_.js → liquid-DqJ-7gUQ.js} +1 -1
  145. package/web/assets/{lspLanguageFeatures-Bo6XRGjF.js → lspLanguageFeatures-C_r6rVue.js} +1 -1
  146. package/web/assets/{mail-chat-bubble-square.svg-DQPaE_l8.js → mail-chat-bubble-square.svg-1OECQtwZ.js} +1 -1
  147. package/web/assets/{mail-send-email-paper-airplane.svg-SeNV9WPa.js → mail-send-email-paper-airplane.svg-DGa9kXqg.js} +1 -1
  148. package/web/assets/{mail-send-envelope.svg-DZr1S3ec.js → mail-send-envelope.svg-DOnW83Qn.js} +1 -1
  149. package/web/assets/{mdx-bfiZxOWu.js → mdx-BmXiyjsf.js} +1 -1
  150. package/web/assets/{minus-DDv3xj8k.js → minus-Bva6o6mu.js} +1 -1
  151. package/web/assets/{modal-Cg41N0d3.js → modal-AUS2ksVq.js} +1 -1
  152. package/web/assets/modal-BR3MAJDn.js +1 -0
  153. package/web/assets/{money-cashier-receipt.svg-CMGSkzy4.js → money-cashier-receipt.svg-C9S8E9Gs.js} +1 -1
  154. package/web/assets/{money-currency-dollar-pay.svg-BqBhV1Bu.js → money-currency-dollar-pay.svg-CXNYqgJd.js} +1 -1
  155. package/web/assets/{money-graph-arrow-increase.svg-Jb3id3iX.js → money-graph-arrow-increase.svg-DVTCnF_9.js} +1 -1
  156. package/web/assets/{money-graph-bar-chart-increase.svg-C1_S5Hbg.js → money-graph-bar-chart-increase.svg-CIlyGCUY.js} +1 -1
  157. package/web/assets/{multiselect-D6SVauJ0.js → multiselect-aPow7kzy.js} +1 -1
  158. package/web/assets/{nature-ecology-leaf.svg-Cv_Ub0f3.js → nature-ecology-leaf.svg-xc6FzauK.js} +1 -1
  159. package/web/assets/{password-BnTuhvvF.js → password-B_HLITFe.js} +1 -1
  160. package/web/assets/{phone-telephone.svg-C8m8L7Af.js → phone-telephone.svg-D6y6im-g.js} +1 -1
  161. package/web/assets/{plus-CwKOeZC2.js → plus-DJr2QEgS.js} +1 -1
  162. package/web/assets/process.store-CVrBwiRB.js +1 -0
  163. package/web/assets/{programming-bug.svg-BMbf-v1F.js → programming-bug.svg-jKhqPvQ0.js} +1 -1
  164. package/web/assets/{programming-cloud.svg-DoETzNlz.js → programming-cloud.svg-C1_us4-8.js} +1 -1
  165. package/web/assets/{programming-computer-database-server.svg-DFsTW5pZ.js → programming-computer-database-server.svg-C_8mq7k2.js} +1 -1
  166. package/web/assets/{programming-computer-database.svg-Dap1d6pH.js → programming-computer-database.svg-Cc445gb5.js} +1 -1
  167. package/web/assets/{programming-module-four-layout.svg-Dlte_L9w.js → programming-module-four-layout.svg-B5fbcAO3.js} +1 -1
  168. package/web/assets/{programming-module-three.svg-CF2uP4yd.js → programming-module-three.svg-J7fncT0c.js} +1 -1
  169. package/web/assets/{programming-module.svg-DSm70VcV.js → programming-module.svg-BVjzZRgZ.js} +1 -1
  170. package/web/assets/{programming-script-code.svg-C7LrjNTC.js → programming-script-code.svg-By609kb5.js} +1 -1
  171. package/web/assets/project-launch.store-DCuERm8z.js +1 -0
  172. package/web/assets/project.store-D0oo8kyl.js +1 -0
  173. package/web/assets/{python-DGNKYf98.js → python-jVn8dPRY.js} +1 -1
  174. package/web/assets/{radiobutton-Drb-6bSf.js → radiobutton-erK19fCL.js} +1 -1
  175. package/web/assets/{razor-CLJyE3n7.js → razor-BJoJ2H1P.js} +1 -1
  176. package/web/assets/router-0UcfydXq.js +1 -0
  177. package/web/assets/settings-scope-DdLe151G.js +1 -0
  178. package/web/assets/{settings.store-BJ7H5w4n.js → settings.store-CcYfFedF.js} +1 -1
  179. package/web/assets/{shopping-cart.svg-DqX4V0Z9.js → shopping-cart.svg-a8Rjk8rK.js} +1 -1
  180. package/web/assets/{shopping-gift-present.svg-BO9ncUGX.js → shopping-gift-present.svg-BIN9jnEb.js} +1 -1
  181. package/web/assets/{shopping-shipping-box-parcel-package.svg-CEjca0LH.js → shopping-shipping-box-parcel-package.svg-05MVPg3v.js} +1 -1
  182. package/web/assets/{src-F0BzIGAP.js → src-BiwZaAz3.js} +1 -1
  183. package/web/assets/{src-D2BeOnZr.css → src-DCcw9sU3.css} +1 -1
  184. package/web/assets/src-OmBj_GBQ.js +572 -0
  185. package/web/assets/{tabpanel-BX_29Z1p.js → tabpanel-BIAV4aKH.js} +1 -1
  186. package/web/assets/{tag-new-circle.svg-DEFm057e.js → tag-new-circle.svg-ehKpryNe.js} +1 -1
  187. package/web/assets/theme-DiK_jXoN.js +1 -0
  188. package/web/assets/{toggleswitch-BCY7RhMa.js → toggleswitch-qhHjeH7s.js} +1 -1
  189. package/web/assets/{travel-map-earth-globe.svg-bobKX3Td.js → travel-map-earth-globe.svg-D0Dk72so.js} +1 -1
  190. package/web/assets/trpc-DOYpfRgV.js +1 -0
  191. package/web/assets/{tsMode-HrRwEBdZ.js → tsMode-B-s4JVyR.js} +1 -1
  192. package/web/assets/{typescript-CM93Igq2.js → typescript-CToySho3.js} +1 -1
  193. package/web/assets/useAiChatDrawer-BSlDU8P0.js +1 -0
  194. package/web/assets/{useCloudOrg-Dd4m5ej-.js → useCloudOrg-_EGQ6eUY.js} +1 -1
  195. package/web/assets/useEnvVarAutocomplete-B4h_6ylX.js +1 -0
  196. package/web/assets/useEnvVarAutocomplete-DsxEF6Ya.css +1 -0
  197. package/web/assets/{useProjectCatalog-Ct2H50rw.js → useProjectCatalog-B3GacZkf.js} +1 -1
  198. package/web/assets/{useProjectCloudOrg-By2M8LTk.js → useProjectCloudOrg-DOTcwa9I.js} +1 -1
  199. package/web/assets/{useServiceUrlHost-ZVKBplG8.js → useServiceUrlHost-B-38dOxY.js} +1 -1
  200. package/web/assets/{xml-CJGov3Ex.js → xml-BMt9wg3H.js} +1 -1
  201. package/web/assets/{yaml-xY3BFPUE.js → yaml-RmzWffCM.js} +1 -1
  202. package/web/index.html +2 -2
  203. package/agent-manager-HOL7ZG4V.js +0 -9
  204. package/chunk-RN4X65D3.js.map +0 -1
  205. package/chunk-WE6EOX4C.js.map +0 -1
  206. package/settings-manager-KKSPWSM6.js +0 -9
  207. package/web/assets/AiChatPage-CemkKI5f.js +0 -1
  208. package/web/assets/CloudAccountPage-DPs87dbs.js +0 -1
  209. package/web/assets/WikiPage-EBD94ewJ.js +0 -1
  210. package/web/assets/cloud-client-DSbRz1wz.js +0 -1
  211. package/web/assets/cloud-session-NnwumoiU.js +0 -1
  212. package/web/assets/interface-content-folder.svg-BQN0Hvq-.js +0 -1
  213. package/web/assets/modal-hmS0I-a3.js +0 -1
  214. package/web/assets/process.store-CgBhdhXY.js +0 -1
  215. package/web/assets/project-launch.store-HM4tWJyO.js +0 -1
  216. package/web/assets/project.store-BUbzqDJl.js +0 -1
  217. package/web/assets/router-DoDaan68.js +0 -1
  218. package/web/assets/settings-scope-CA1gM0Eg.js +0 -1
  219. package/web/assets/src-BKjJciGN.js +0 -572
  220. package/web/assets/theme-CXbG8xGR.js +0 -1
  221. package/web/assets/trpc-D953ojvb.js +0 -1
  222. package/web/assets/useAiChatDrawer-uMew_avv.js +0 -1
  223. package/web/assets/useEnvVarAutocomplete-ChKhQI_8.css +0 -1
  224. package/web/assets/useEnvVarAutocomplete-CwYnoQY2.js +0 -1
  225. /package/{agent-manager-HOL7ZG4V.js.map → agent-manager-ACPQWUZ5.js.map} +0 -0
  226. /package/{chat-XUIXGKSR.js.map → chat-PXMMZIAY.js.map} +0 -0
  227. /package/{chunk-P47X3LT3.js.map → chunk-2WXQIUVC.js.map} +0 -0
  228. /package/{chunk-I2AZCZMR.js.map → chunk-GIHR3BGT.js.map} +0 -0
  229. /package/{chunk-XIRMRWVU.js.map → chunk-NYKFDU76.js.map} +0 -0
  230. /package/{companion-POUL5OGO.js.map → companion-4RQ3AMOL.js.map} +0 -0
  231. /package/{desktop-launcher-QVYFCE56.js.map → desktop-launcher-ADGRYF4S.js.map} +0 -0
  232. /package/{settings-manager-KKSPWSM6.js.map → settings-manager-2C7RY6ZC.js.map} +0 -0
@@ -332,6 +332,12 @@ var RUNEYA_CAPABILITIES = [
332
332
  // rendent que des chemins et une adresse, d'où leur présence ci-dessous),
333
333
  // `cloudAuth.session`, `agent.getPassthroughEnv`. Un agent n'a pas besoin de
334
334
  // ces valeurs pour travailler, et ce qu'il lit finit dans une transcription.
335
+ //
336
+ // La seule exception est `service.getEnv` (`get_service_env` ci-dessous),
337
+ // et elle n'en est une que parce qu'elle filtre : les variables publiques, et
338
+ // les seuls secrets que leur auteur a partagés avec les IA (`isSharedWithAi`
339
+ // — « Lisible par l'IA », ou l'injection, qui vaut la lecture). Un secret non
340
+ // partagé n'y apparaît pas, pas même par son nom.
335
341
  {
336
342
  name: "list_processes",
337
343
  description: "List every process across all agents with its current state (running, stopped, exit code, uptime). Use this to see the whole machine at once, rather than calling get_service_status service by service. An agent only learns about a service when it is first started, so this lists what is deployed, not what is configured: an empty list means nothing has been started, not that you cannot see them \u2014 list_services shows what exists.",
@@ -350,6 +356,16 @@ var RUNEYA_CAPABILITIES = [
350
356
  ],
351
357
  buildInput: (p) => ({ id: p.serviceId })
352
358
  },
359
+ {
360
+ name: "get_service_env",
361
+ description: 'Read the environment variables a service runs with, and the project\'s variable inventory. `env` lists every key the service receives; a value reads "***" when it is a secret whose author did not share it with AI (sharing = ticking "AI read", or injecting it into the agents\' environment, which grants reading too). `envSecrets` says which keys are secret, `hiddenKeys` which ones are masked. A masked key is set on the service: never treat it as missing, never suggest adding it, and never pass "***" as a value \u2014 ask the user for it. `variables` describes every variable of the project \u2014 which environment defines it and its scope, its description, its flags, whether this machine overrides it, and `inService: false` for the ones this service does not receive. Use it to say where a variable must be changed instead of guessing. On an overridden variable, `sharedValue` is what the machine-local override replaces (the team\'s value, masked as "***" when unreadable); no other value appears there.',
362
+ route: "service.getEnv",
363
+ method: "GET",
364
+ params: [
365
+ { name: "serviceId", description: "The service ID", required: true }
366
+ ],
367
+ buildInput: (p) => ({ id: p.serviceId })
368
+ },
353
369
  {
354
370
  name: "get_service_metrics",
355
371
  description: "Read the CPU and memory currently used by a running service.",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../ai-capabilities/src/capabilities.ts","../../ai-capabilities/src/adapters/anthropic.ts","../../ai-capabilities/src/adapters/openai.ts","../../ai-capabilities/src/adapters/prompt.ts","../../ai-capabilities/src/trpc-caller.ts","../src/project-default.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { RUNEYA_CAPABILITIES, callTrpc } from '@runeya/packages-ai-capabilities';\nimport { applyProjectAnchor } from './project-default.js';\n\nconst BASE_URL = process.env['RUNEYA_BASE_URL'] ?? 'http://localhost:4000';\nconst CONVERSATION_ID = process.env['RUNEYA_CONVERSATION_ID'] ?? '';\nconst INTERNAL_TOKEN = process.env['RUNEYA_INTERNAL_TOKEN'] ?? '';\nconst ENV_TOKEN = process.env['RUNEYA_API_TOKEN'] ?? '';\n// Le projet dans lequel Runeya a lancé ce CLI. Absent hors conversation\n// (un CLI démarré à la main), et alors rien n'est ancré.\nconst PROJECT_ANCHOR = {\n projectId: process.env['RUNEYA_PROJECT_ID'] || undefined,\n orgId: process.env['RUNEYA_ORG_ID'] || undefined,\n};\n\nconst server = new McpServer({ name: 'runeya', version: '1.0.0' });\n\n// ─── Register each capability as an MCP tool ─────────────────────────────────\n\nfor (const cap of RUNEYA_CAPABILITIES) {\n const zodShape: Record<string, z.ZodTypeAny> = {};\n\n for (const param of cap.params) {\n const base = z.string().describe(param.description);\n zodShape[param.name] = param.required ? base : base.optional();\n }\n\n // authToken is MCP-specific: CLI runners pass the JWT here\n zodShape['authToken'] = z.string().describe('Bearer token for authentication').optional();\n\n server.tool(cap.name, cap.description, zodShape, async (input) => {\n try {\n const raw = (input as Record<string, string | undefined>).authToken;\n const authToken = (raw && !raw.startsWith('$')) ? raw : (ENV_TOKEN || INTERNAL_TOKEN || undefined);\n if (!authToken) throw new Error('No auth token available');\n\n const params = applyProjectAnchor(cap, input as Record<string, string | undefined>, PROJECT_ANCHOR);\n const result = await callTrpc(BASE_URL, cap.route, cap.method, cap.buildInput(params), authToken);\n return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] };\n } catch (err) {\n return {\n content: [{ type: 'text' as const, text: `Error: ${(err as Error).message}` }],\n isError: true,\n };\n }\n });\n}\n\n// ─── ask_user tool (scenario mode only) ─────────────────────────────────────\n\nif (CONVERSATION_ID && INTERNAL_TOKEN) {\n server.tool(\n 'ask_user',\n 'Ask the user a question and wait for their reply. Use this when you need clarification or input from the user to proceed.',\n { question: z.string().describe('The question to ask the user') },\n async ({ question }) => {\n try {\n const res = await fetch(`${BASE_URL}/api/trpc/scenario.requestInput`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${INTERNAL_TOKEN}`,\n },\n body: JSON.stringify({ conversationId: CONVERSATION_ID, question }),\n signal: AbortSignal.timeout(300_000), // 5 min\n });\n const json = await res.json() as Record<string, unknown>;\n const result = (json['result'] as Record<string, unknown> | undefined)?.['data'] ?? json;\n const text = typeof result === 'string' ? result : JSON.stringify(result);\n return { content: [{ type: 'text' as const, text }] };\n } catch (err) {\n return { content: [{ type: 'text' as const, text: `Error: ${(err as Error).message}` }], isError: true };\n }\n },\n );\n}\n\n// ─── Start the stdio transport ───────────────────────────────────────────────\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","// ─── Runeya AI Capabilities — Single Source of Truth ─────────────────────────\n//\n// Adding a new capability:\n// 1. Add an entry to RUNEYA_CAPABILITIES below.\n// 2. Done. Anthropic tools, OpenAI tools, runner prompt docs, and MCP routes\n// are all generated automatically from this list.\n\nexport interface CapabilityParam {\n name: string;\n description: string;\n required: boolean;\n}\n\nexport interface RuneyaCapability {\n /** Tool name (snake_case, used as function name by LLMs). */\n name: string;\n /** Human-readable description shown to the LLM. */\n description: string;\n /** tRPC route segment, e.g. \"service.list\" or \"process.start\". */\n route: string;\n /** HTTP method for the tRPC call. */\n method: 'GET' | 'POST';\n /** Input parameters exposed to the LLM. */\n params: CapabilityParam[];\n /** Build the tRPC input object from raw LLM params. */\n buildInput: (params: Record<string, string | undefined>) => Record<string, unknown> | undefined;\n /** If true, safety instructions will warn the LLM to require explicit user intent. */\n destructive?: boolean;\n /**\n * Optional usage hint injected into the system prompt so the LLM knows when to use this tool.\n * Example: '\"wait 5s\" or \"pause for 10 seconds\" → call wait'\n */\n usageHint?: string;\n}\n\n/**\n * Une liste, telle qu'un modèle l'écrit.\n *\n * Il envoie du JSON quand il y pense, une énumération séparée par des virgules\n * quand il n'y pense pas. Refuser la seconde ferait échouer l'appel sans que\n * rien n'explique pourquoi.\n */\nfunction toList(raw: string | undefined): string[] {\n if (!raw) return [];\n const text = raw.trim();\n if (text.startsWith('[')) {\n try {\n const parsed: unknown = JSON.parse(text);\n if (Array.isArray(parsed)) return parsed.map((v) => String(v).trim()).filter(Boolean);\n } catch {\n // Un JSON malformé se lit comme une énumération : mieux vaut retenir les\n // noms qu'il contient que de tout perdre sur une virgule en trop.\n }\n }\n return text.split(',').map((v) => v.trim().replace(/^[\"'[]+|[\"'\\]]+$/g, '')).filter(Boolean);\n}\n\n/**\n * Un champ qu'on peut soit changer, soit effacer, soit laisser tranquille.\n *\n * Absent : on n'y touche pas. `null` ou vide : on l'efface — c'est ce que le\n * cloud attend, et la seule façon pour un agent de retirer une échéance.\n */\nfunction clearable(\n raw: string | undefined,\n parse: (value: string) => unknown,\n key: string,\n): Record<string, unknown> {\n if (raw === undefined) return {};\n const text = String(raw).trim();\n if (!text || text === 'null') return { [key]: null };\n return { [key]: parse(text) };\n}\n\n/**\n * La cible d'une commande git : un service, ou à défaut un projet.\n *\n * Les quatre champs sont facultatifs côté route (`gitTargetShape`), qui résout\n * elle-même l'agent et le répertoire. On ne transmet que ce que le modèle a\n * réellement donné : un `serviceId` vide ferait échouer la résolution.\n */\nfunction gitTarget(p: Record<string, string | undefined>): Record<string, unknown> {\n return {\n ...(p.serviceId ? { serviceId: p.serviceId } : {}),\n ...(p.projectId ? { projectId: p.projectId } : {}),\n ...(p.agentId ? { agentId: p.agentId } : {}),\n ...(p.orgId ? { orgId: p.orgId } : {}),\n };\n}\n\nexport const RUNEYA_CAPABILITIES: RuneyaCapability[] = [\n {\n name: 'list_services',\n description: \"List services, with the serviceId and agentId to use in other calls. Pass the projectId your context names to stay on the project the user is looking at, or another one from list_projects to look elsewhere. Called with no project, this can answer for every project of every organization on the machine — far more than the interface shows.\",\n route: 'service.list',\n method: 'GET',\n params: [\n { name: 'projectId', description: 'Restrict to this project, from list_projects. Omit to list every service on the machine.', required: false },\n { name: 'orgId', description: 'Its organization. Needed only when the same project id exists in several.', required: false },\n ],\n buildInput: (p) => (p.projectId\n ? { projectId: p.projectId, ...(p.orgId ? { orgId: p.orgId } : {}) }\n : undefined),\n },\n {\n name: 'get_service_status',\n description: \"Get the current status (running, stopped, etc.) of a service. A service that has never been started on this agent has no process yet, and this answers 404 Process not found — that means STOPPED, not forbidden and not missing. Start it, or read its configuration with get_service.\",\n route: 'process.get',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'The service ID', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, id: p.serviceId }),\n },\n {\n name: 'get_logs',\n description: 'Get the recent buffered logs for a service.',\n route: 'process.logs',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'The service ID', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),\n },\n {\n name: 'start_service',\n description: 'Start a service on an agent.',\n route: 'process.start',\n method: 'POST',\n params: [\n { name: 'serviceId', description: 'The service ID to start', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),\n destructive: true,\n },\n {\n name: 'stop_service',\n description: 'Stop a running service on an agent.',\n route: 'process.stop',\n method: 'POST',\n params: [\n { name: 'serviceId', description: 'The service ID to stop', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),\n destructive: true,\n },\n {\n name: 'restart_service',\n description: 'Restart a service on an agent (stop → redeploy → start).',\n route: 'process.restart',\n method: 'POST',\n params: [\n { name: 'serviceId', description: 'The service ID to restart', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),\n destructive: true,\n },\n\n // ─── Utility ─────────────────────────────────────────────────────────────\n\n {\n name: 'wait',\n description: 'Wait for a given number of milliseconds before continuing.',\n route: 'utility.wait',\n method: 'POST',\n params: [\n { name: 'ms', description: 'Number of MILLISECONDS to wait. Convert from seconds: 1s=1000, 10s=10000, 1min=60000. Max 300000.', required: true },\n ],\n buildInput: (p) => ({ ms: Number(p.ms) }),\n usageHint: '\"wait 5s\" → wait(ms=5000), \"pause 10 seconds\" → wait(ms=10000), \"attends 3 secondes\" → wait(ms=3000). Always convert to milliseconds.',\n },\n\n // ─── Kanban ───────────────────────────────────────────────────────────────\n\n {\n name: 'kanban_list_boards',\n description: 'List the kanban boards of the organization. Returns the organizationId actually queried, the boardId to use in the other kanban tools, plus column and card counts. Cards themselves are not included — use kanban_get_board for those. An empty list means that organization really has no board: a failure to reach the cloud is reported as an error instead, never as an empty list.',\n route: 'kanban.listBoards',\n method: 'GET',\n params: [\n { name: 'includeArchived', description: 'Set to \"true\" to include archived boards. Default: false.', required: false },\n { name: 'organizationId', description: 'Which organization to read. Optional: needed only when the account belongs to several and the error message asks for it.', required: false },\n ],\n buildInput: (p) => ({\n includeArchived: p.includeArchived === 'true',\n ...(p.organizationId ? { organizationId: p.organizationId } : {}),\n }),\n },\n {\n name: 'kanban_get_board',\n description: 'Read one kanban board: its columns, and the cards in each (id, title, markdown body, assignees, comment count, and attachment metadata — use kanban_download_attachment to fetch the bytes of a file). Use the exact column names it returns when moving or adding a card.',\n route: 'kanban.getBoard',\n method: 'GET',\n params: [\n { name: 'boardId', description: 'The kanban board ID, from kanban_list_boards', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId }),\n },\n {\n name: 'kanban_get_card_comments',\n description: \"Read the comment thread of one kanban card, newest last: who wrote each comment (ai or user, with the person's name), when, its text, and its attachments. The comments in your task context are a snapshot taken when the task started — call this to see anything written since, whenever someone tells you a comment was added or kanban_get_board reports a higher commentCount than you have.\",\n route: 'kanban.getCardComments',\n method: 'GET',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID whose comments to read', required: true },\n { name: 'limit', description: 'How many of the most recent comments to return (1-200). Default: 50.', required: false },\n ],\n buildInput: (p) => ({\n boardId: p.boardId,\n cardId: p.cardId,\n ...(p.limit ? { limit: Number(p.limit) } : {}),\n }),\n usageHint: '\"le support a ajouté un commentaire\" / \"regarde les nouveaux commentaires\" → kanban_get_card_comments(boardId, cardId). Never answer from the snapshot in your context when fresh comments are mentioned.',\n },\n {\n name: 'kanban_search_cards',\n 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.',\n route: 'kanban.searchCards',\n method: 'GET',\n params: [\n { name: 'query', description: 'Text to look for in card titles, bodies and comments', required: true },\n { name: 'boardId', description: 'Restrict the search to this board. Omit to search all boards.', required: false },\n { name: 'limit', description: 'Maximum number of cards to return (1-100). Default: 25.', required: false },\n { 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 },\n ],\n buildInput: (p) => ({\n query: p.query,\n ...(p.boardId ? { boardId: p.boardId } : {}),\n ...(p.limit ? { limit: Number(p.limit) } : {}),\n ...(p.organizationId ? { organizationId: p.organizationId } : {}),\n }),\n },\n {\n name: 'kanban_download_attachment',\n description: 'Download a kanban card attachment (image, PDF, any file) onto this machine and return its local path, so it can be opened with file-reading tools. Attachment ids come from the card context, from kanban_get_board, or from kanban_get_card_comments — a file attached to a comment downloads exactly like one attached to the card.',\n route: 'kanban.downloadAttachment',\n method: 'POST',\n params: [\n { name: 'attachmentId', description: 'The attachment ID, as listed on the card', required: true },\n { name: 'organizationId', description: 'Which organization the attachment belongs to. Optional: needed only when the account belongs to several and the error message asks for it.', required: false },\n ],\n buildInput: (p) => ({\n attachmentId: p.attachmentId,\n ...(p.organizationId ? { orgId: p.organizationId } : {}),\n }),\n },\n {\n name: 'kanban_move_card',\n description: 'Move a kanban card to another column. Use the exact column name.',\n route: 'kanban.moveCard',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID to move', required: true },\n { name: 'targetColumn', description: 'Exact name of the target column', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, targetColumn: p.targetColumn }),\n },\n {\n name: 'kanban_add_comment',\n description: 'Add a comment to a kanban card.',\n route: 'kanban.addComment',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID', required: true },\n { name: 'comment', description: 'The comment text (markdown supported)', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, comment: p.comment }),\n },\n {\n name: 'kanban_get_card_links',\n description: 'Read the filiation of a board: which card depends on which. Returns one entry per link (child card ↔ parent card), plus the title, board, column, assignees and comment count of any linked card living on another board. Use it when a card context says it has a parent or sub-cards and you need their ids to read them.',\n route: 'kanban.getCardLinks',\n method: 'GET',\n params: [\n { name: 'boardId', description: 'The kanban board ID whose links to read', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId }),\n },\n {\n name: 'kanban_set_card_parent',\n description: 'Link a kanban card to a parent card, or detach it. The parent is the card the other one depends on — an epic and its tasks, a bug and its follow-ups. A card has at most one parent, and setting a new one replaces it. Omit parentCardId to detach. kanban_get_board reports the current filiation as parentCardId / childCardIds on each card.',\n route: 'kanban.setCardParent',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID of the card being linked', required: true },\n { name: 'cardId', description: 'The card that depends on the parent (the child)', required: true },\n { name: 'parentCardId', description: 'The parent card ID. Omit to detach the card from its parent.', required: false },\n { name: 'parentBoardId', description: \"The parent's board, when it lives on another board of the same organization. Defaults to boardId.\", required: false },\n ],\n buildInput: (p) => ({\n boardId: p.boardId,\n cardId: p.cardId,\n ...(p.parentCardId ? { parentCardId: p.parentCardId } : {}),\n ...(p.parentBoardId ? { parentBoardId: p.parentBoardId } : {}),\n }),\n },\n {\n name: 'kanban_add_card',\n description: 'Add a new card to a kanban column.',\n route: 'kanban.addCard',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'column', description: 'Exact name of the target column', required: true },\n { name: 'title', description: 'Card title', required: true },\n { name: 'content', description: 'Card content in markdown', required: false },\n ],\n buildInput: (p) => ({ boardId: p.boardId, column: p.column, title: p.title, content: p.content }),\n },\n {\n name: 'kanban_get_card',\n 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.',\n route: 'kanban.getCard',\n method: 'GET',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId }),\n },\n {\n name: 'kanban_update_card',\n 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.',\n route: 'kanban.updateCard',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID', required: true },\n { name: 'title', description: 'New title', required: false },\n { name: 'content', description: 'New card content, in markdown', required: false },\n { name: 'priority', description: 'Priority from 1 to 10, or null to clear it', required: false },\n { name: 'color', description: 'Card colour, or null to clear it', required: false },\n { name: 'groups', description: 'Labels, as a list of strings. Replaces the current ones.', required: false },\n { name: 'deadline', description: 'Due date as YYYY-MM-DD, or null to clear it', required: false },\n { name: 'assignees', description: 'User ids to assign, as a list. Replaces the current ones; use kanban_list_members to find the ids.', required: false },\n ],\n buildInput: (p) => ({\n boardId: p.boardId,\n cardId: p.cardId,\n ...(p.title !== undefined ? { title: p.title } : {}),\n ...(p.content !== undefined ? { content: p.content } : {}),\n // Tout arrive en chaîne : un modèle n'écrit pas des nombres, des listes\n // ni des `null` typés. `clearable` distingue « efface » de « ne touche\n // pas » — sans quoi vider une couleur serait impossible à exprimer, et\n // changer un titre risquerait de vider le reste.\n ...(clearable(p.priority, (v) => Number(v), 'priority')),\n ...(clearable(p.color, (v) => v, 'color')),\n ...(clearable(p.deadline, (v) => v, 'deadline')),\n ...(p.groups !== undefined ? { groups: toList(p.groups) } : {}),\n ...(p.assignees !== undefined ? { assignees: toList(p.assignees) } : {}),\n }),\n },\n {\n name: 'kanban_set_card_archived',\n 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.',\n route: 'kanban.setCardArchived',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID', required: true },\n { name: 'archived', description: 'true to archive, false to bring the card back', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, archived: p.archived === 'true' }),\n },\n {\n name: 'kanban_list_members',\n 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.',\n route: 'kanban.listMembers',\n method: 'GET',\n params: [\n { name: 'organizationId', description: 'Which organization. Optional: needed only when the account belongs to several and the error message asks for it.', required: false },\n ],\n buildInput: (p) => (p.organizationId ? { organizationId: p.organizationId } : {}),\n },\n\n // ─── Lecture seule ───────────────────────────────────────────────────────\n //\n // Tout ce qui se consulte sans rien changer. La création, la mise à jour et\n // la suppression restent hors MCP : elles s'ajouteront au cas par cas.\n //\n // Volontairement absentes, et à ne pas ajouter sans y regarder à deux fois,\n // parce qu'elles rendent un secret : `environment.list` / `get` / `resolve` /\n // `resolveFlat` (un `Environment` porte ses variables, valeurs comprises),\n // `apiKeys.list` / `reveal`, `setup.getEncryptionKeyHex` et `getOrgKeys`\n // (clés de chiffrement), `settings.get` et `settings.listAIProviders` (clés\n // de fournisseurs d'IA — `settings.getPaths` et `getNetwork`, eux, ne\n // rendent que des chemins et une adresse, d'où leur présence ci-dessous),\n // `cloudAuth.session`, `agent.getPassthroughEnv`. Un agent n'a pas besoin de\n // ces valeurs pour travailler, et ce qu'il lit finit dans une transcription.\n {\n name: 'list_processes',\n description: \"List every process across all agents with its current state (running, stopped, exit code, uptime). Use this to see the whole machine at once, rather than calling get_service_status service by service. An agent only learns about a service when it is first started, so this lists what is deployed, not what is configured: an empty list means nothing has been started, not that you cannot see them — list_services shows what exists.\",\n route: 'process.list',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_service',\n description: 'Read the full configuration of one service: its commands, ports, groups, runner, log sources and restart policy. list_services gives the ids.',\n route: 'service.get',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'The service ID', required: true },\n ],\n buildInput: (p) => ({ id: p.serviceId }),\n },\n {\n name: 'get_service_metrics',\n description: 'Read the CPU and memory currently used by a running service.',\n route: 'process.metrics',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'The service ID', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),\n },\n {\n name: 'list_agents',\n description: 'List the agents connected to this Runeya, with their status and whether they run on this machine. Passphrases are never returned.',\n route: 'agent.list',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'list_projects',\n description: 'List the projects known to this Runeya, with their ids and the services they hold.',\n route: 'project.list',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_project',\n description: 'Read one project: its services, its active environment, its organization.',\n route: 'project.get',\n method: 'GET',\n params: [\n { name: 'projectId', description: 'The project ID, from list_projects', required: true },\n { name: 'orgId', description: 'Its organization. Needed only when the same project id exists in several.', required: false },\n ],\n buildInput: (p) => ({ id: p.projectId, ...(p.orgId ? { orgId: p.orgId } : {}) }),\n },\n {\n name: 'list_project_paths',\n description: 'Where each project lives on this machine. Use it to find the directory to work in before reading or editing files.',\n route: 'project.localPaths',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'git_status',\n description: 'Read the git working tree of a service or a project: staged, modified and untracked files, current branch, ahead/behind counts.',\n route: 'git.status',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n ],\n buildInput: (p) => gitTarget(p),\n },\n {\n name: 'git_log',\n description: 'Read the recent commits of a service or project repository: hash, author, date, message.',\n route: 'git.log',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n { name: 'limit', description: 'How many commits to return (1-200). Default: 50.', required: false },\n ],\n buildInput: (p) => ({ ...gitTarget(p), ...(p.limit ? { limit: Number(p.limit) } : {}) }),\n },\n {\n name: 'git_branches',\n description: 'List the local and remote branches of a service or project repository.',\n route: 'git.branches',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n ],\n buildInput: (p) => gitTarget(p),\n },\n {\n name: 'git_diff',\n description: 'Read the diff of a service or project repository — everything, or one file. Use it to see what changed before describing or reviewing it.',\n route: 'git.diff',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n { name: 'path', description: 'Restrict the diff to this file path', required: false },\n { name: 'staged', description: 'Set to \"true\" to read the staged diff instead of the working tree', required: false },\n { name: 'untracked', description: 'Set to \"true\" to include untracked files', required: false },\n ],\n buildInput: (p) => ({\n ...gitTarget(p),\n ...(p.path ? { path: p.path } : {}),\n ...(p.staged !== undefined ? { staged: p.staged === 'true' } : {}),\n ...(p.untracked !== undefined ? { untracked: p.untracked === 'true' } : {}),\n }),\n },\n {\n name: 'list_docs',\n description: 'List the markdown documentation files of a scope, as a tree. Pair it with read_doc to answer from the project\\'s own docs rather than from guesswork.',\n route: 'wiki.list',\n method: 'GET',\n params: [\n { name: 'scope', description: '\"global\" for this Runeya, or \"service:<serviceId>\" for one service\\'s repository', required: true },\n ],\n buildInput: (p) => ({ scope: p.scope }),\n },\n {\n name: 'read_doc',\n description: 'Read one markdown documentation file. Paths come from list_docs; only .md and .markdown can be read.',\n route: 'wiki.read',\n method: 'GET',\n params: [\n { name: 'scope', description: '\"global\" for this Runeya, or \"service:<serviceId>\" for one service\\'s repository', required: true },\n { name: 'path', description: 'Relative path of the file, as returned by list_docs', required: true },\n ],\n buildInput: (p) => ({ scope: p.scope, path: p.path }),\n },\n {\n name: 'get_server_logs',\n description: \"Read Runeya's own recent log entries. Use it to explain why Runeya itself misbehaved — not to read a service's output, which is get_logs.\",\n route: 'diagnostics.recentLogs',\n method: 'GET',\n params: [\n { name: 'limit', description: 'How many entries to return (1-2000). Default: 500.', required: false },\n ],\n buildInput: (p) => (p.limit ? { limit: Number(p.limit) } : undefined),\n },\n {\n name: 'get_kanban_queue_state',\n description: 'Read the state of the kanban task queue: what is running, what is waiting. Use it before queuing work, or to explain why a card has not started.',\n route: 'kanbanQueue.getState',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'export_project',\n description: \"Read a project and every service it holds in one call, with secrets stripped out. Cheaper and safer than calling get_service for each service — prefer it whenever you need the whole picture of a project.\",\n route: 'project.export',\n method: 'GET',\n params: [\n { name: 'projectId', description: 'The project ID, from list_projects', required: true },\n { name: 'orgId', description: 'Its organization. Needed only when the same project id exists in several.', required: false },\n ],\n buildInput: (p) => ({ id: p.projectId, ...(p.orgId ? { orgId: p.orgId } : {}) }),\n },\n {\n name: 'git_remotes',\n description: 'List the git remotes of a service or project repository, with their URLs.',\n route: 'git.remotes',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n ],\n buildInput: (p) => gitTarget(p),\n },\n {\n name: 'git_stash_list',\n description: 'List the stashes of a service or project repository. Useful before assuming work was lost: it may simply be stashed.',\n route: 'git.stashList',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n ],\n buildInput: (p) => gitTarget(p),\n },\n {\n name: 'get_runeya_version',\n description: 'Read the version of Runeya running here, the latest published one, and whether this install is up to date. Use it before blaming a bug on the code: the machine may simply be behind.',\n route: 'health.versionInfo',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_runeya_paths',\n description: \"Read where Runeya keeps its things on this machine: its launch directory, its data directory, and the machine-wide directory holding cloud projects.\",\n route: 'settings.getPaths',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_network_info',\n description: 'Read where this Runeya listens (host and port) and whether it is reachable from the local network, with the URLs to use. Use it to give someone a working link instead of guessing one.',\n route: 'settings.getNetwork',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'list_runeya_instances',\n description: 'List every Runeya answering on this machine, this one included, with its port and directory. Use it when a port is taken or when two instances seem to disagree.',\n route: 'diagnostics.instances',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_cloud_status',\n description: 'Say whether this Runeya is linked to a cloud account, and to which cloud. A kanban tool failing for lack of a cloud link is explained here.',\n route: 'cloudAuth.status',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n];\n","import type { RuneyaCapability } from '../capabilities.js';\n\nexport interface AnthropicTool {\n name: string;\n description: string;\n input_schema: {\n type: 'object';\n properties: Record<string, { type: string; description: string }>;\n required: string[];\n [k: string]: unknown;\n };\n}\n\nexport function buildAnthropicTools(capabilities: RuneyaCapability[]): AnthropicTool[] {\n return capabilities.map(cap => ({\n name: cap.name,\n description: cap.description,\n input_schema: {\n type: 'object' as const,\n properties: Object.fromEntries(\n cap.params.map(p => [p.name, { type: 'string', description: p.description }]),\n ),\n required: cap.params.filter(p => p.required).map(p => p.name),\n },\n }));\n}\n","import type { RuneyaCapability } from '../capabilities.js';\n\nexport interface OpenAITool {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, { type: string; description: string }>;\n required: string[];\n };\n };\n}\n\nexport function buildOpenAITools(capabilities: RuneyaCapability[]): OpenAITool[] {\n return capabilities.map(cap => ({\n type: 'function' as const,\n function: {\n name: cap.name,\n description: cap.description,\n parameters: {\n type: 'object' as const,\n properties: Object.fromEntries(\n cap.params.map(p => [p.name, { type: 'string', description: p.description }]),\n ),\n required: cap.params.filter(p => p.required).map(p => p.name),\n },\n },\n }));\n}\n","import type { RuneyaCapability } from '../capabilities.js';\nexport type { RuneyaCapability };\n\n/**\n * Build the tool safety instruction block injected into cloud provider system prompts.\n * Generated from capabilities so it stays in sync automatically.\n */\nexport function buildToolSafetyInstruction(capabilities: RuneyaCapability[]): string {\n const destructive = capabilities.filter(c => c.destructive).map(c => c.name);\n const withHints = capabilities.filter(c => c.usageHint);\n\n const lines = ['## Tool use safety rules'];\n\n if (destructive.length > 0) {\n lines.push(`CRITICAL: Never call ${destructive.join(', ')} unless the user has EXPLICITLY and UNAMBIGUOUSLY requested it.`);\n lines.push(`- Only call destructive tools (${destructive.join(', ')}) when the user explicitly uses action words for a specific service.`);\n }\n\n if (withHints.length > 0) {\n lines.push('');\n lines.push('## Tool usage hints');\n for (const cap of withHints) {\n lines.push(`- ${cap.usageHint}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * Shared tRPC HTTP caller used by:\n * - Server-side cloud tool executor (proxies cloud LLM tool calls to local tRPC)\n * - MCP server (calls tRPC on behalf of CLI runners)\n */\nexport async function callTrpc(\n baseUrl: string,\n route: string,\n method: 'GET' | 'POST',\n input: Record<string, unknown> | undefined,\n authToken: string,\n): Promise<unknown> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${authToken}`,\n };\n\n const url = method === 'GET' && input\n ? `${baseUrl}/api/trpc/${route}?input=${encodeURIComponent(JSON.stringify(input))}`\n : `${baseUrl}/api/trpc/${route}`;\n\n const res = await fetch(url, {\n method,\n headers,\n ...(method === 'POST' ? { body: JSON.stringify(input ?? {}) } : {}),\n signal: AbortSignal.timeout(15_000),\n });\n\n const json = await res.json() as Record<string, unknown>;\n if (json['error']) throw new Error(JSON.stringify(json['error']));\n const result = json['result'] as Record<string, unknown> | undefined;\n return result?.['data'] ?? result ?? json;\n}\n","import type { RuneyaCapability } from '@runeya/packages-ai-capabilities';\n\n/** Le projet dans lequel cette instance du serveur MCP a été lancée. */\nexport interface ProjectAnchor {\n projectId?: string;\n orgId?: string;\n}\n\n/**\n * Ancrer un appel sur le projet de la conversation.\n *\n * `service.list` rend tout le poste : chaque coffre, donc chaque projet de\n * chaque organisation de la machine. L'interface n'en montre qu'un, et le\n * prompt de l'agent ne décrit que celui-là — mais la tool, elle, répondait 88\n * services quand l'écran en montrait trois. L'agent citait alors des services\n * que l'utilisateur n'a jamais vus, et concluait à un problème de permissions.\n *\n * Le projet est donc posé par Runeya au lancement du serveur MCP, et complété\n * ici plutôt que laissé à la bonne lecture d'une consigne.\n *\n * Ne complète QUE ce que la capability déclare et que l'appelant a laissé vide :\n * un `projectId` donné explicitement gagne toujours, ce qui laisse l'agent\n * interroger un autre projet — `list_projects` les nomme tous.\n */\nexport function applyProjectAnchor(\n cap: Pick<RuneyaCapability, 'params'>,\n params: Record<string, string | undefined>,\n anchor: ProjectAnchor,\n): Record<string, string | undefined> {\n if (!anchor.projectId) return params;\n\n const accepts = (name: string) => cap.params.some((p) => p.name === name);\n if (!accepts('projectId') || params['projectId']) return params;\n\n return {\n ...params,\n projectId: anchor.projectId,\n // L'organisation n'accompagne le projet que si la capability la comprend :\n // ailleurs, ce serait un champ de trop, refusé par le schéma de la route.\n ...(anchor.orgId && accepts('orgId') && !params['orgId'] ? { orgId: anchor.orgId } : {}),\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../../ai-capabilities/src/capabilities.ts","../../ai-capabilities/src/adapters/anthropic.ts","../../ai-capabilities/src/adapters/openai.ts","../../ai-capabilities/src/adapters/prompt.ts","../../ai-capabilities/src/trpc-caller.ts","../src/project-default.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { RUNEYA_CAPABILITIES, callTrpc } from '@runeya/packages-ai-capabilities';\nimport { applyProjectAnchor } from './project-default.js';\n\nconst BASE_URL = process.env['RUNEYA_BASE_URL'] ?? 'http://localhost:4000';\nconst CONVERSATION_ID = process.env['RUNEYA_CONVERSATION_ID'] ?? '';\nconst INTERNAL_TOKEN = process.env['RUNEYA_INTERNAL_TOKEN'] ?? '';\nconst ENV_TOKEN = process.env['RUNEYA_API_TOKEN'] ?? '';\n// Le projet dans lequel Runeya a lancé ce CLI. Absent hors conversation\n// (un CLI démarré à la main), et alors rien n'est ancré.\nconst PROJECT_ANCHOR = {\n projectId: process.env['RUNEYA_PROJECT_ID'] || undefined,\n orgId: process.env['RUNEYA_ORG_ID'] || undefined,\n};\n\nconst server = new McpServer({ name: 'runeya', version: '1.0.0' });\n\n// ─── Register each capability as an MCP tool ─────────────────────────────────\n\nfor (const cap of RUNEYA_CAPABILITIES) {\n const zodShape: Record<string, z.ZodTypeAny> = {};\n\n for (const param of cap.params) {\n const base = z.string().describe(param.description);\n zodShape[param.name] = param.required ? base : base.optional();\n }\n\n // authToken is MCP-specific: CLI runners pass the JWT here\n zodShape['authToken'] = z.string().describe('Bearer token for authentication').optional();\n\n server.tool(cap.name, cap.description, zodShape, async (input) => {\n try {\n const raw = (input as Record<string, string | undefined>).authToken;\n const authToken = (raw && !raw.startsWith('$')) ? raw : (ENV_TOKEN || INTERNAL_TOKEN || undefined);\n if (!authToken) throw new Error('No auth token available');\n\n const params = applyProjectAnchor(cap, input as Record<string, string | undefined>, PROJECT_ANCHOR);\n const result = await callTrpc(BASE_URL, cap.route, cap.method, cap.buildInput(params), authToken);\n return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] };\n } catch (err) {\n return {\n content: [{ type: 'text' as const, text: `Error: ${(err as Error).message}` }],\n isError: true,\n };\n }\n });\n}\n\n// ─── ask_user tool (scenario mode only) ─────────────────────────────────────\n\nif (CONVERSATION_ID && INTERNAL_TOKEN) {\n server.tool(\n 'ask_user',\n 'Ask the user a question and wait for their reply. Use this when you need clarification or input from the user to proceed.',\n { question: z.string().describe('The question to ask the user') },\n async ({ question }) => {\n try {\n const res = await fetch(`${BASE_URL}/api/trpc/scenario.requestInput`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${INTERNAL_TOKEN}`,\n },\n body: JSON.stringify({ conversationId: CONVERSATION_ID, question }),\n signal: AbortSignal.timeout(300_000), // 5 min\n });\n const json = await res.json() as Record<string, unknown>;\n const result = (json['result'] as Record<string, unknown> | undefined)?.['data'] ?? json;\n const text = typeof result === 'string' ? result : JSON.stringify(result);\n return { content: [{ type: 'text' as const, text }] };\n } catch (err) {\n return { content: [{ type: 'text' as const, text: `Error: ${(err as Error).message}` }], isError: true };\n }\n },\n );\n}\n\n// ─── Start the stdio transport ───────────────────────────────────────────────\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","// ─── Runeya AI Capabilities — Single Source of Truth ─────────────────────────\n//\n// Adding a new capability:\n// 1. Add an entry to RUNEYA_CAPABILITIES below.\n// 2. Done. Anthropic tools, OpenAI tools, runner prompt docs, and MCP routes\n// are all generated automatically from this list.\n\nexport interface CapabilityParam {\n name: string;\n description: string;\n required: boolean;\n}\n\nexport interface RuneyaCapability {\n /** Tool name (snake_case, used as function name by LLMs). */\n name: string;\n /** Human-readable description shown to the LLM. */\n description: string;\n /** tRPC route segment, e.g. \"service.list\" or \"process.start\". */\n route: string;\n /** HTTP method for the tRPC call. */\n method: 'GET' | 'POST';\n /** Input parameters exposed to the LLM. */\n params: CapabilityParam[];\n /** Build the tRPC input object from raw LLM params. */\n buildInput: (params: Record<string, string | undefined>) => Record<string, unknown> | undefined;\n /** If true, safety instructions will warn the LLM to require explicit user intent. */\n destructive?: boolean;\n /**\n * Optional usage hint injected into the system prompt so the LLM knows when to use this tool.\n * Example: '\"wait 5s\" or \"pause for 10 seconds\" → call wait'\n */\n usageHint?: string;\n}\n\n/**\n * Une liste, telle qu'un modèle l'écrit.\n *\n * Il envoie du JSON quand il y pense, une énumération séparée par des virgules\n * quand il n'y pense pas. Refuser la seconde ferait échouer l'appel sans que\n * rien n'explique pourquoi.\n */\nfunction toList(raw: string | undefined): string[] {\n if (!raw) return [];\n const text = raw.trim();\n if (text.startsWith('[')) {\n try {\n const parsed: unknown = JSON.parse(text);\n if (Array.isArray(parsed)) return parsed.map((v) => String(v).trim()).filter(Boolean);\n } catch {\n // Un JSON malformé se lit comme une énumération : mieux vaut retenir les\n // noms qu'il contient que de tout perdre sur une virgule en trop.\n }\n }\n return text.split(',').map((v) => v.trim().replace(/^[\"'[]+|[\"'\\]]+$/g, '')).filter(Boolean);\n}\n\n/**\n * Un champ qu'on peut soit changer, soit effacer, soit laisser tranquille.\n *\n * Absent : on n'y touche pas. `null` ou vide : on l'efface — c'est ce que le\n * cloud attend, et la seule façon pour un agent de retirer une échéance.\n */\nfunction clearable(\n raw: string | undefined,\n parse: (value: string) => unknown,\n key: string,\n): Record<string, unknown> {\n if (raw === undefined) return {};\n const text = String(raw).trim();\n if (!text || text === 'null') return { [key]: null };\n return { [key]: parse(text) };\n}\n\n/**\n * La cible d'une commande git : un service, ou à défaut un projet.\n *\n * Les quatre champs sont facultatifs côté route (`gitTargetShape`), qui résout\n * elle-même l'agent et le répertoire. On ne transmet que ce que le modèle a\n * réellement donné : un `serviceId` vide ferait échouer la résolution.\n */\nfunction gitTarget(p: Record<string, string | undefined>): Record<string, unknown> {\n return {\n ...(p.serviceId ? { serviceId: p.serviceId } : {}),\n ...(p.projectId ? { projectId: p.projectId } : {}),\n ...(p.agentId ? { agentId: p.agentId } : {}),\n ...(p.orgId ? { orgId: p.orgId } : {}),\n };\n}\n\nexport const RUNEYA_CAPABILITIES: RuneyaCapability[] = [\n {\n name: 'list_services',\n description: \"List services, with the serviceId and agentId to use in other calls. Pass the projectId your context names to stay on the project the user is looking at, or another one from list_projects to look elsewhere. Called with no project, this can answer for every project of every organization on the machine — far more than the interface shows.\",\n route: 'service.list',\n method: 'GET',\n params: [\n { name: 'projectId', description: 'Restrict to this project, from list_projects. Omit to list every service on the machine.', required: false },\n { name: 'orgId', description: 'Its organization. Needed only when the same project id exists in several.', required: false },\n ],\n buildInput: (p) => (p.projectId\n ? { projectId: p.projectId, ...(p.orgId ? { orgId: p.orgId } : {}) }\n : undefined),\n },\n {\n name: 'get_service_status',\n description: \"Get the current status (running, stopped, etc.) of a service. A service that has never been started on this agent has no process yet, and this answers 404 Process not found — that means STOPPED, not forbidden and not missing. Start it, or read its configuration with get_service.\",\n route: 'process.get',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'The service ID', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, id: p.serviceId }),\n },\n {\n name: 'get_logs',\n description: 'Get the recent buffered logs for a service.',\n route: 'process.logs',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'The service ID', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),\n },\n {\n name: 'start_service',\n description: 'Start a service on an agent.',\n route: 'process.start',\n method: 'POST',\n params: [\n { name: 'serviceId', description: 'The service ID to start', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),\n destructive: true,\n },\n {\n name: 'stop_service',\n description: 'Stop a running service on an agent.',\n route: 'process.stop',\n method: 'POST',\n params: [\n { name: 'serviceId', description: 'The service ID to stop', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),\n destructive: true,\n },\n {\n name: 'restart_service',\n description: 'Restart a service on an agent (stop → redeploy → start).',\n route: 'process.restart',\n method: 'POST',\n params: [\n { name: 'serviceId', description: 'The service ID to restart', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),\n destructive: true,\n },\n\n // ─── Utility ─────────────────────────────────────────────────────────────\n\n {\n name: 'wait',\n description: 'Wait for a given number of milliseconds before continuing.',\n route: 'utility.wait',\n method: 'POST',\n params: [\n { name: 'ms', description: 'Number of MILLISECONDS to wait. Convert from seconds: 1s=1000, 10s=10000, 1min=60000. Max 300000.', required: true },\n ],\n buildInput: (p) => ({ ms: Number(p.ms) }),\n usageHint: '\"wait 5s\" → wait(ms=5000), \"pause 10 seconds\" → wait(ms=10000), \"attends 3 secondes\" → wait(ms=3000). Always convert to milliseconds.',\n },\n\n // ─── Kanban ───────────────────────────────────────────────────────────────\n\n {\n name: 'kanban_list_boards',\n description: 'List the kanban boards of the organization. Returns the organizationId actually queried, the boardId to use in the other kanban tools, plus column and card counts. Cards themselves are not included — use kanban_get_board for those. An empty list means that organization really has no board: a failure to reach the cloud is reported as an error instead, never as an empty list.',\n route: 'kanban.listBoards',\n method: 'GET',\n params: [\n { name: 'includeArchived', description: 'Set to \"true\" to include archived boards. Default: false.', required: false },\n { name: 'organizationId', description: 'Which organization to read. Optional: needed only when the account belongs to several and the error message asks for it.', required: false },\n ],\n buildInput: (p) => ({\n includeArchived: p.includeArchived === 'true',\n ...(p.organizationId ? { organizationId: p.organizationId } : {}),\n }),\n },\n {\n name: 'kanban_get_board',\n description: 'Read one kanban board: its columns, and the cards in each (id, title, markdown body, assignees, comment count, and attachment metadata — use kanban_download_attachment to fetch the bytes of a file). Use the exact column names it returns when moving or adding a card.',\n route: 'kanban.getBoard',\n method: 'GET',\n params: [\n { name: 'boardId', description: 'The kanban board ID, from kanban_list_boards', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId }),\n },\n {\n name: 'kanban_get_card_comments',\n description: \"Read the comment thread of one kanban card, newest last: who wrote each comment (ai or user, with the person's name), when, its text, and its attachments. The comments in your task context are a snapshot taken when the task started — call this to see anything written since, whenever someone tells you a comment was added or kanban_get_board reports a higher commentCount than you have.\",\n route: 'kanban.getCardComments',\n method: 'GET',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID whose comments to read', required: true },\n { name: 'limit', description: 'How many of the most recent comments to return (1-200). Default: 50.', required: false },\n ],\n buildInput: (p) => ({\n boardId: p.boardId,\n cardId: p.cardId,\n ...(p.limit ? { limit: Number(p.limit) } : {}),\n }),\n usageHint: '\"le support a ajouté un commentaire\" / \"regarde les nouveaux commentaires\" → kanban_get_card_comments(boardId, cardId). Never answer from the snapshot in your context when fresh comments are mentioned.',\n },\n {\n name: 'kanban_search_cards',\n 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.',\n route: 'kanban.searchCards',\n method: 'GET',\n params: [\n { name: 'query', description: 'Text to look for in card titles, bodies and comments', required: true },\n { name: 'boardId', description: 'Restrict the search to this board. Omit to search all boards.', required: false },\n { name: 'limit', description: 'Maximum number of cards to return (1-100). Default: 25.', required: false },\n { 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 },\n ],\n buildInput: (p) => ({\n query: p.query,\n ...(p.boardId ? { boardId: p.boardId } : {}),\n ...(p.limit ? { limit: Number(p.limit) } : {}),\n ...(p.organizationId ? { organizationId: p.organizationId } : {}),\n }),\n },\n {\n name: 'kanban_download_attachment',\n description: 'Download a kanban card attachment (image, PDF, any file) onto this machine and return its local path, so it can be opened with file-reading tools. Attachment ids come from the card context, from kanban_get_board, or from kanban_get_card_comments — a file attached to a comment downloads exactly like one attached to the card.',\n route: 'kanban.downloadAttachment',\n method: 'POST',\n params: [\n { name: 'attachmentId', description: 'The attachment ID, as listed on the card', required: true },\n { name: 'organizationId', description: 'Which organization the attachment belongs to. Optional: needed only when the account belongs to several and the error message asks for it.', required: false },\n ],\n buildInput: (p) => ({\n attachmentId: p.attachmentId,\n ...(p.organizationId ? { orgId: p.organizationId } : {}),\n }),\n },\n {\n name: 'kanban_move_card',\n description: 'Move a kanban card to another column. Use the exact column name.',\n route: 'kanban.moveCard',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID to move', required: true },\n { name: 'targetColumn', description: 'Exact name of the target column', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, targetColumn: p.targetColumn }),\n },\n {\n name: 'kanban_add_comment',\n description: 'Add a comment to a kanban card.',\n route: 'kanban.addComment',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID', required: true },\n { name: 'comment', description: 'The comment text (markdown supported)', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, comment: p.comment }),\n },\n {\n name: 'kanban_get_card_links',\n description: 'Read the filiation of a board: which card depends on which. Returns one entry per link (child card ↔ parent card), plus the title, board, column, assignees and comment count of any linked card living on another board. Use it when a card context says it has a parent or sub-cards and you need their ids to read them.',\n route: 'kanban.getCardLinks',\n method: 'GET',\n params: [\n { name: 'boardId', description: 'The kanban board ID whose links to read', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId }),\n },\n {\n name: 'kanban_set_card_parent',\n description: 'Link a kanban card to a parent card, or detach it. The parent is the card the other one depends on — an epic and its tasks, a bug and its follow-ups. A card has at most one parent, and setting a new one replaces it. Omit parentCardId to detach. kanban_get_board reports the current filiation as parentCardId / childCardIds on each card.',\n route: 'kanban.setCardParent',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID of the card being linked', required: true },\n { name: 'cardId', description: 'The card that depends on the parent (the child)', required: true },\n { name: 'parentCardId', description: 'The parent card ID. Omit to detach the card from its parent.', required: false },\n { name: 'parentBoardId', description: \"The parent's board, when it lives on another board of the same organization. Defaults to boardId.\", required: false },\n ],\n buildInput: (p) => ({\n boardId: p.boardId,\n cardId: p.cardId,\n ...(p.parentCardId ? { parentCardId: p.parentCardId } : {}),\n ...(p.parentBoardId ? { parentBoardId: p.parentBoardId } : {}),\n }),\n },\n {\n name: 'kanban_add_card',\n description: 'Add a new card to a kanban column.',\n route: 'kanban.addCard',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'column', description: 'Exact name of the target column', required: true },\n { name: 'title', description: 'Card title', required: true },\n { name: 'content', description: 'Card content in markdown', required: false },\n ],\n buildInput: (p) => ({ boardId: p.boardId, column: p.column, title: p.title, content: p.content }),\n },\n {\n name: 'kanban_get_card',\n 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.',\n route: 'kanban.getCard',\n method: 'GET',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId }),\n },\n {\n name: 'kanban_update_card',\n 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.',\n route: 'kanban.updateCard',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID', required: true },\n { name: 'title', description: 'New title', required: false },\n { name: 'content', description: 'New card content, in markdown', required: false },\n { name: 'priority', description: 'Priority from 1 to 10, or null to clear it', required: false },\n { name: 'color', description: 'Card colour, or null to clear it', required: false },\n { name: 'groups', description: 'Labels, as a list of strings. Replaces the current ones.', required: false },\n { name: 'deadline', description: 'Due date as YYYY-MM-DD, or null to clear it', required: false },\n { name: 'assignees', description: 'User ids to assign, as a list. Replaces the current ones; use kanban_list_members to find the ids.', required: false },\n ],\n buildInput: (p) => ({\n boardId: p.boardId,\n cardId: p.cardId,\n ...(p.title !== undefined ? { title: p.title } : {}),\n ...(p.content !== undefined ? { content: p.content } : {}),\n // Tout arrive en chaîne : un modèle n'écrit pas des nombres, des listes\n // ni des `null` typés. `clearable` distingue « efface » de « ne touche\n // pas » — sans quoi vider une couleur serait impossible à exprimer, et\n // changer un titre risquerait de vider le reste.\n ...(clearable(p.priority, (v) => Number(v), 'priority')),\n ...(clearable(p.color, (v) => v, 'color')),\n ...(clearable(p.deadline, (v) => v, 'deadline')),\n ...(p.groups !== undefined ? { groups: toList(p.groups) } : {}),\n ...(p.assignees !== undefined ? { assignees: toList(p.assignees) } : {}),\n }),\n },\n {\n name: 'kanban_set_card_archived',\n 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.',\n route: 'kanban.setCardArchived',\n method: 'POST',\n params: [\n { name: 'boardId', description: 'The kanban board ID', required: true },\n { name: 'cardId', description: 'The card ID', required: true },\n { name: 'archived', description: 'true to archive, false to bring the card back', required: true },\n ],\n buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, archived: p.archived === 'true' }),\n },\n {\n name: 'kanban_list_members',\n 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.',\n route: 'kanban.listMembers',\n method: 'GET',\n params: [\n { name: 'organizationId', description: 'Which organization. Optional: needed only when the account belongs to several and the error message asks for it.', required: false },\n ],\n buildInput: (p) => (p.organizationId ? { organizationId: p.organizationId } : {}),\n },\n\n // ─── Lecture seule ───────────────────────────────────────────────────────\n //\n // Tout ce qui se consulte sans rien changer. La création, la mise à jour et\n // la suppression restent hors MCP : elles s'ajouteront au cas par cas.\n //\n // Volontairement absentes, et à ne pas ajouter sans y regarder à deux fois,\n // parce qu'elles rendent un secret : `environment.list` / `get` / `resolve` /\n // `resolveFlat` (un `Environment` porte ses variables, valeurs comprises),\n // `apiKeys.list` / `reveal`, `setup.getEncryptionKeyHex` et `getOrgKeys`\n // (clés de chiffrement), `settings.get` et `settings.listAIProviders` (clés\n // de fournisseurs d'IA — `settings.getPaths` et `getNetwork`, eux, ne\n // rendent que des chemins et une adresse, d'où leur présence ci-dessous),\n // `cloudAuth.session`, `agent.getPassthroughEnv`. Un agent n'a pas besoin de\n // ces valeurs pour travailler, et ce qu'il lit finit dans une transcription.\n //\n // La seule exception est `service.getEnv` (`get_service_env` ci-dessous),\n // et elle n'en est une que parce qu'elle filtre : les variables publiques, et\n // les seuls secrets que leur auteur a partagés avec les IA (`isSharedWithAi`\n // — « Lisible par l'IA », ou l'injection, qui vaut la lecture). Un secret non\n // partagé n'y apparaît pas, pas même par son nom.\n {\n name: 'list_processes',\n description: \"List every process across all agents with its current state (running, stopped, exit code, uptime). Use this to see the whole machine at once, rather than calling get_service_status service by service. An agent only learns about a service when it is first started, so this lists what is deployed, not what is configured: an empty list means nothing has been started, not that you cannot see them — list_services shows what exists.\",\n route: 'process.list',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_service',\n description: 'Read the full configuration of one service: its commands, ports, groups, runner, log sources and restart policy. list_services gives the ids.',\n route: 'service.get',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'The service ID', required: true },\n ],\n buildInput: (p) => ({ id: p.serviceId }),\n },\n {\n name: 'get_service_env',\n description: \"Read the environment variables a service runs with, and the project's variable inventory. `env` lists every key the service receives; a value reads \\\"***\\\" when it is a secret whose author did not share it with AI (sharing = ticking \\\"AI read\\\", or injecting it into the agents\\u0027 environment, which grants reading too). `envSecrets` says which keys are secret, `hiddenKeys` which ones are masked. A masked key is set on the service: never treat it as missing, never suggest adding it, and never pass \\\"***\\\" as a value — ask the user for it. `variables` describes every variable of the project — which environment defines it and its scope, its description, its flags, whether this machine overrides it, and `inService: false` for the ones this service does not receive. Use it to say where a variable must be changed instead of guessing. On an overridden variable, `sharedValue` is what the machine-local override replaces (the team's value, masked as \\\"***\\\" when unreadable); no other value appears there.\",\n route: 'service.getEnv',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'The service ID', required: true },\n ],\n buildInput: (p) => ({ id: p.serviceId }),\n },\n {\n name: 'get_service_metrics',\n description: 'Read the CPU and memory currently used by a running service.',\n route: 'process.metrics',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'The service ID', required: true },\n { name: 'agentId', description: 'The agent ID hosting this service', required: true },\n ],\n buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),\n },\n {\n name: 'list_agents',\n description: 'List the agents connected to this Runeya, with their status and whether they run on this machine. Passphrases are never returned.',\n route: 'agent.list',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'list_projects',\n description: 'List the projects known to this Runeya, with their ids and the services they hold.',\n route: 'project.list',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_project',\n description: 'Read one project: its services, its active environment, its organization.',\n route: 'project.get',\n method: 'GET',\n params: [\n { name: 'projectId', description: 'The project ID, from list_projects', required: true },\n { name: 'orgId', description: 'Its organization. Needed only when the same project id exists in several.', required: false },\n ],\n buildInput: (p) => ({ id: p.projectId, ...(p.orgId ? { orgId: p.orgId } : {}) }),\n },\n {\n name: 'list_project_paths',\n description: 'Where each project lives on this machine. Use it to find the directory to work in before reading or editing files.',\n route: 'project.localPaths',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'git_status',\n description: 'Read the git working tree of a service or a project: staged, modified and untracked files, current branch, ahead/behind counts.',\n route: 'git.status',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n ],\n buildInput: (p) => gitTarget(p),\n },\n {\n name: 'git_log',\n description: 'Read the recent commits of a service or project repository: hash, author, date, message.',\n route: 'git.log',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n { name: 'limit', description: 'How many commits to return (1-200). Default: 50.', required: false },\n ],\n buildInput: (p) => ({ ...gitTarget(p), ...(p.limit ? { limit: Number(p.limit) } : {}) }),\n },\n {\n name: 'git_branches',\n description: 'List the local and remote branches of a service or project repository.',\n route: 'git.branches',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n ],\n buildInput: (p) => gitTarget(p),\n },\n {\n name: 'git_diff',\n description: 'Read the diff of a service or project repository — everything, or one file. Use it to see what changed before describing or reviewing it.',\n route: 'git.diff',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n { name: 'path', description: 'Restrict the diff to this file path', required: false },\n { name: 'staged', description: 'Set to \"true\" to read the staged diff instead of the working tree', required: false },\n { name: 'untracked', description: 'Set to \"true\" to include untracked files', required: false },\n ],\n buildInput: (p) => ({\n ...gitTarget(p),\n ...(p.path ? { path: p.path } : {}),\n ...(p.staged !== undefined ? { staged: p.staged === 'true' } : {}),\n ...(p.untracked !== undefined ? { untracked: p.untracked === 'true' } : {}),\n }),\n },\n {\n name: 'list_docs',\n description: 'List the markdown documentation files of a scope, as a tree. Pair it with read_doc to answer from the project\\'s own docs rather than from guesswork.',\n route: 'wiki.list',\n method: 'GET',\n params: [\n { name: 'scope', description: '\"global\" for this Runeya, or \"service:<serviceId>\" for one service\\'s repository', required: true },\n ],\n buildInput: (p) => ({ scope: p.scope }),\n },\n {\n name: 'read_doc',\n description: 'Read one markdown documentation file. Paths come from list_docs; only .md and .markdown can be read.',\n route: 'wiki.read',\n method: 'GET',\n params: [\n { name: 'scope', description: '\"global\" for this Runeya, or \"service:<serviceId>\" for one service\\'s repository', required: true },\n { name: 'path', description: 'Relative path of the file, as returned by list_docs', required: true },\n ],\n buildInput: (p) => ({ scope: p.scope, path: p.path }),\n },\n {\n name: 'get_server_logs',\n description: \"Read Runeya's own recent log entries. Use it to explain why Runeya itself misbehaved — not to read a service's output, which is get_logs.\",\n route: 'diagnostics.recentLogs',\n method: 'GET',\n params: [\n { name: 'limit', description: 'How many entries to return (1-2000). Default: 500.', required: false },\n ],\n buildInput: (p) => (p.limit ? { limit: Number(p.limit) } : undefined),\n },\n {\n name: 'get_kanban_queue_state',\n description: 'Read the state of the kanban task queue: what is running, what is waiting. Use it before queuing work, or to explain why a card has not started.',\n route: 'kanbanQueue.getState',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'export_project',\n description: \"Read a project and every service it holds in one call, with secrets stripped out. Cheaper and safer than calling get_service for each service — prefer it whenever you need the whole picture of a project.\",\n route: 'project.export',\n method: 'GET',\n params: [\n { name: 'projectId', description: 'The project ID, from list_projects', required: true },\n { name: 'orgId', description: 'Its organization. Needed only when the same project id exists in several.', required: false },\n ],\n buildInput: (p) => ({ id: p.projectId, ...(p.orgId ? { orgId: p.orgId } : {}) }),\n },\n {\n name: 'git_remotes',\n description: 'List the git remotes of a service or project repository, with their URLs.',\n route: 'git.remotes',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n ],\n buildInput: (p) => gitTarget(p),\n },\n {\n name: 'git_stash_list',\n description: 'List the stashes of a service or project repository. Useful before assuming work was lost: it may simply be stashed.',\n route: 'git.stashList',\n method: 'GET',\n params: [\n { name: 'serviceId', description: 'Target the repository of this service', required: false },\n { name: 'projectId', description: 'Target the repository of this project, when no service is given', required: false },\n { name: 'agentId', description: 'The agent hosting the repository', required: false },\n { name: 'orgId', description: 'Its organization, when a project id alone is ambiguous', required: false },\n ],\n buildInput: (p) => gitTarget(p),\n },\n {\n name: 'get_runeya_version',\n description: 'Read the version of Runeya running here, the latest published one, and whether this install is up to date. Use it before blaming a bug on the code: the machine may simply be behind.',\n route: 'health.versionInfo',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_runeya_paths',\n description: \"Read where Runeya keeps its things on this machine: its launch directory, its data directory, and the machine-wide directory holding cloud projects.\",\n route: 'settings.getPaths',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_network_info',\n description: 'Read where this Runeya listens (host and port) and whether it is reachable from the local network, with the URLs to use. Use it to give someone a working link instead of guessing one.',\n route: 'settings.getNetwork',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'list_runeya_instances',\n description: 'List every Runeya answering on this machine, this one included, with its port and directory. Use it when a port is taken or when two instances seem to disagree.',\n route: 'diagnostics.instances',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_cloud_status',\n description: 'Say whether this Runeya is linked to a cloud account, and to which cloud. A kanban tool failing for lack of a cloud link is explained here.',\n route: 'cloudAuth.status',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n];\n","import type { RuneyaCapability } from '../capabilities.js';\n\nexport interface AnthropicTool {\n name: string;\n description: string;\n input_schema: {\n type: 'object';\n properties: Record<string, { type: string; description: string }>;\n required: string[];\n [k: string]: unknown;\n };\n}\n\nexport function buildAnthropicTools(capabilities: RuneyaCapability[]): AnthropicTool[] {\n return capabilities.map(cap => ({\n name: cap.name,\n description: cap.description,\n input_schema: {\n type: 'object' as const,\n properties: Object.fromEntries(\n cap.params.map(p => [p.name, { type: 'string', description: p.description }]),\n ),\n required: cap.params.filter(p => p.required).map(p => p.name),\n },\n }));\n}\n","import type { RuneyaCapability } from '../capabilities.js';\n\nexport interface OpenAITool {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<string, { type: string; description: string }>;\n required: string[];\n };\n };\n}\n\nexport function buildOpenAITools(capabilities: RuneyaCapability[]): OpenAITool[] {\n return capabilities.map(cap => ({\n type: 'function' as const,\n function: {\n name: cap.name,\n description: cap.description,\n parameters: {\n type: 'object' as const,\n properties: Object.fromEntries(\n cap.params.map(p => [p.name, { type: 'string', description: p.description }]),\n ),\n required: cap.params.filter(p => p.required).map(p => p.name),\n },\n },\n }));\n}\n","import type { RuneyaCapability } from '../capabilities.js';\nexport type { RuneyaCapability };\n\n/**\n * Build the tool safety instruction block injected into cloud provider system prompts.\n * Generated from capabilities so it stays in sync automatically.\n */\nexport function buildToolSafetyInstruction(capabilities: RuneyaCapability[]): string {\n const destructive = capabilities.filter(c => c.destructive).map(c => c.name);\n const withHints = capabilities.filter(c => c.usageHint);\n\n const lines = ['## Tool use safety rules'];\n\n if (destructive.length > 0) {\n lines.push(`CRITICAL: Never call ${destructive.join(', ')} unless the user has EXPLICITLY and UNAMBIGUOUSLY requested it.`);\n lines.push(`- Only call destructive tools (${destructive.join(', ')}) when the user explicitly uses action words for a specific service.`);\n }\n\n if (withHints.length > 0) {\n lines.push('');\n lines.push('## Tool usage hints');\n for (const cap of withHints) {\n lines.push(`- ${cap.usageHint}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * Shared tRPC HTTP caller used by:\n * - Server-side cloud tool executor (proxies cloud LLM tool calls to local tRPC)\n * - MCP server (calls tRPC on behalf of CLI runners)\n */\nexport async function callTrpc(\n baseUrl: string,\n route: string,\n method: 'GET' | 'POST',\n input: Record<string, unknown> | undefined,\n authToken: string,\n): Promise<unknown> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${authToken}`,\n };\n\n const url = method === 'GET' && input\n ? `${baseUrl}/api/trpc/${route}?input=${encodeURIComponent(JSON.stringify(input))}`\n : `${baseUrl}/api/trpc/${route}`;\n\n const res = await fetch(url, {\n method,\n headers,\n ...(method === 'POST' ? { body: JSON.stringify(input ?? {}) } : {}),\n signal: AbortSignal.timeout(15_000),\n });\n\n const json = await res.json() as Record<string, unknown>;\n if (json['error']) throw new Error(JSON.stringify(json['error']));\n const result = json['result'] as Record<string, unknown> | undefined;\n return result?.['data'] ?? result ?? json;\n}\n","import type { RuneyaCapability } from '@runeya/packages-ai-capabilities';\n\n/** Le projet dans lequel cette instance du serveur MCP a été lancée. */\nexport interface ProjectAnchor {\n projectId?: string;\n orgId?: string;\n}\n\n/**\n * Ancrer un appel sur le projet de la conversation.\n *\n * `service.list` rend tout le poste : chaque coffre, donc chaque projet de\n * chaque organisation de la machine. L'interface n'en montre qu'un, et le\n * prompt de l'agent ne décrit que celui-là — mais la tool, elle, répondait 88\n * services quand l'écran en montrait trois. L'agent citait alors des services\n * que l'utilisateur n'a jamais vus, et concluait à un problème de permissions.\n *\n * Le projet est donc posé par Runeya au lancement du serveur MCP, et complété\n * ici plutôt que laissé à la bonne lecture d'une consigne.\n *\n * Ne complète QUE ce que la capability déclare et que l'appelant a laissé vide :\n * un `projectId` donné explicitement gagne toujours, ce qui laisse l'agent\n * interroger un autre projet — `list_projects` les nomme tous.\n */\nexport function applyProjectAnchor(\n cap: Pick<RuneyaCapability, 'params'>,\n params: Record<string, string | undefined>,\n anchor: ProjectAnchor,\n): Record<string, string | undefined> {\n if (!anchor.projectId) return params;\n\n const accepts = (name: string) => cap.params.some((p) => p.name === name);\n if (!accepts('projectId') || params['projectId']) return params;\n\n return {\n ...params,\n projectId: anchor.projectId,\n // L'organisation n'accompagne le projet que si la capability la comprend :\n // ailleurs, ce serait un champ de trop, refusé par le schéma de la route.\n ...(anchor.orgId && accepts('orgId') && !params['orgId'] ? { orgId: anchor.orgId } : {}),\n };\n}\n"],"mappings":";;;AACA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,SAAS;;;ACuClB,SAAS,OAAO,KAAmC;AACjD,MAAI,CAAC,IAAK,QAAO,CAAC;AAClB,QAAM,OAAO,IAAI,KAAK;AACtB,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,QAAI;AACF,YAAM,SAAkB,KAAK,MAAM,IAAI;AACvC,UAAI,MAAM,QAAQ,MAAM,EAAG,QAAO,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;IACtF,QAAQ;IAGR;EACF;AACA,SAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,qBAAqB,EAAE,CAAC,EAAE,OAAO,OAAO;AAC7F;AAQA,SAAS,UACP,KACA,OACA,KACyB;AACzB,MAAI,QAAQ,OAAW,QAAO,CAAC;AAC/B,QAAM,OAAO,OAAO,GAAG,EAAE,KAAK;AAC9B,MAAI,CAAC,QAAQ,SAAS,OAAQ,QAAO,EAAE,CAAC,GAAG,GAAG,KAAK;AACnD,SAAO,EAAE,CAAC,GAAG,GAAG,MAAM,IAAI,EAAE;AAC9B;AASA,SAAS,UAAU,GAAgE;AACjF,SAAO;IACL,GAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC;IAChD,GAAI,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC;IAChD,GAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;IAC1C,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;EACtC;AACF;AAEO,IAAM,sBAA0C;EACrD;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,4FAA4F,UAAU,MAAM;MAC9I,EAAE,MAAM,SAAS,aAAa,6EAA6E,UAAU,MAAM;IAC7H;IACA,YAAY,CAAC,MAAO,EAAE,YAClB,EAAE,WAAW,EAAE,WAAW,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAG,IACjE;EACN;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,kBAAkB,UAAU,KAAK;MACnE,EAAE,MAAM,WAAW,aAAa,qCAAqC,UAAU,KAAK;IACtF;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,UAAU;EAC5D;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,kBAAkB,UAAU,KAAK;MACnE,EAAE,MAAM,WAAW,aAAa,qCAAqC,UAAU,KAAK;IACtF;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,EAAE,UAAU;EACnE;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,2BAA2B,UAAU,KAAK;MAC5E,EAAE,MAAM,WAAW,aAAa,qCAAqC,UAAU,KAAK;IACtF;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,EAAE,UAAU;IACjE,aAAa;EACf;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,0BAA0B,UAAU,KAAK;MAC3E,EAAE,MAAM,WAAW,aAAa,qCAAqC,UAAU,KAAK;IACtF;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,EAAE,UAAU;IACjE,aAAa;EACf;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,6BAA6B,UAAU,KAAK;MAC9E,EAAE,MAAM,WAAW,aAAa,qCAAqC,UAAU,KAAK;IACtF;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,EAAE,UAAU;IACjE,aAAa;EACf;;EAIA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,MAAM,aAAa,qGAAqG,UAAU,KAAK;IACjJ;IACA,YAAY,CAAC,OAAO,EAAE,IAAI,OAAO,EAAE,EAAE,EAAE;IACvC,WAAW;EACb;;EAIA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,mBAAmB,aAAa,6DAA6D,UAAU,MAAM;MACrH,EAAE,MAAM,kBAAkB,aAAa,4HAA4H,UAAU,MAAM;IACrL;IACA,YAAY,CAAC,OAAO;MAClB,iBAAiB,EAAE,oBAAoB;MACvC,GAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,IAAI,CAAC;IACjE;EACF;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,WAAW,aAAa,gDAAgD,UAAU,KAAK;IACjG;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ;EAC3C;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,WAAW,aAAa,uBAAuB,UAAU,KAAK;MACtE,EAAE,MAAM,UAAU,aAAa,sCAAsC,UAAU,KAAK;MACpF,EAAE,MAAM,SAAS,aAAa,wEAAwE,UAAU,MAAM;IACxH;IACA,YAAY,CAAC,OAAO;MAClB,SAAS,EAAE;MACX,QAAQ,EAAE;MACV,GAAI,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;IAC9C;IACA,WAAW;EACb;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,SAAS,aAAa,wDAAwD,UAAU,KAAK;MACrG,EAAE,MAAM,WAAW,aAAa,iEAAiE,UAAU,MAAM;MACjH,EAAE,MAAM,SAAS,aAAa,2DAA2D,UAAU,MAAM;MACzG,EAAE,MAAM,kBAAkB,aAAa,8HAA8H,UAAU,MAAM;IACvL;IACA,YAAY,CAAC,OAAO;MAClB,OAAO,EAAE;MACT,GAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;MAC1C,GAAI,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;MAC5C,GAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,IAAI,CAAC;IACjE;EACF;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,gBAAgB,aAAa,4CAA4C,UAAU,KAAK;MAChG,EAAE,MAAM,kBAAkB,aAAa,8IAA8I,UAAU,MAAM;IACvM;IACA,YAAY,CAAC,OAAO;MAClB,cAAc,EAAE;MAChB,GAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,IAAI,CAAC;IACxD;EACF;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,WAAW,aAAa,uBAAuB,UAAU,KAAK;MACtE,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,KAAK;MACrE,EAAE,MAAM,gBAAgB,aAAa,mCAAmC,UAAU,KAAK;IACzF;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,QAAQ,cAAc,EAAE,aAAa;EAC3F;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,WAAW,aAAa,uBAAuB,UAAU,KAAK;MACtE,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,KAAK;MAC7D,EAAE,MAAM,WAAW,aAAa,yCAAyC,UAAU,KAAK;IAC1F;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,QAAQ,SAAS,EAAE,QAAQ;EACjF;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,WAAW,aAAa,2CAA2C,UAAU,KAAK;IAC5F;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ;EAC3C;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,WAAW,aAAa,gDAAgD,UAAU,KAAK;MAC/F,EAAE,MAAM,UAAU,aAAa,mDAAmD,UAAU,KAAK;MACjG,EAAE,MAAM,gBAAgB,aAAa,gEAAgE,UAAU,MAAM;MACrH,EAAE,MAAM,iBAAiB,aAAa,qGAAqG,UAAU,MAAM;IAC7J;IACA,YAAY,CAAC,OAAO;MAClB,SAAS,EAAE;MACX,QAAQ,EAAE;MACV,GAAI,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,IAAI,CAAC;MACzD,GAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,IAAI,CAAC;IAC9D;EACF;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,WAAW,aAAa,uBAAuB,UAAU,KAAK;MACtE,EAAE,MAAM,UAAU,aAAa,mCAAmC,UAAU,KAAK;MACjF,EAAE,MAAM,SAAS,aAAa,cAAc,UAAU,KAAK;MAC3D,EAAE,MAAM,WAAW,aAAa,4BAA4B,UAAU,MAAM;IAC9E;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,SAAS,EAAE,QAAQ;EACjG;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,WAAW,aAAa,uBAAuB,UAAU,KAAK;MACtE,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,KAAK;IAC/D;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,OAAO;EAC7D;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,WAAW,aAAa,uBAAuB,UAAU,KAAK;MACtE,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,KAAK;MAC7D,EAAE,MAAM,SAAS,aAAa,aAAa,UAAU,MAAM;MAC3D,EAAE,MAAM,WAAW,aAAa,iCAAiC,UAAU,MAAM;MACjF,EAAE,MAAM,YAAY,aAAa,8CAA8C,UAAU,MAAM;MAC/F,EAAE,MAAM,SAAS,aAAa,oCAAoC,UAAU,MAAM;MAClF,EAAE,MAAM,UAAU,aAAa,4DAA4D,UAAU,MAAM;MAC3G,EAAE,MAAM,YAAY,aAAa,+CAA+C,UAAU,MAAM;MAChG,EAAE,MAAM,aAAa,aAAa,sGAAsG,UAAU,MAAM;IAC1J;IACA,YAAY,CAAC,OAAO;MAClB,SAAS,EAAE;MACX,QAAQ,EAAE;MACV,GAAI,EAAE,UAAU,SAAY,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;MAClD,GAAI,EAAE,YAAY,SAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;;;;;MAKxD,GAAI,UAAU,EAAE,UAAU,CAAC,MAAM,OAAO,CAAC,GAAG,UAAU;MACtD,GAAI,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO;MACxC,GAAI,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,UAAU;MAC9C,GAAI,EAAE,WAAW,SAAY,EAAE,QAAQ,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC;MAC7D,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC;IACxE;EACF;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,WAAW,aAAa,uBAAuB,UAAU,KAAK;MACtE,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,KAAK;MAC7D,EAAE,MAAM,YAAY,aAAa,iDAAiD,UAAU,KAAK;IACnG;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,QAAQ,EAAE,QAAQ,UAAU,EAAE,aAAa,OAAO;EAC9F;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,kBAAkB,aAAa,oHAAoH,UAAU,MAAM;IAC7K;IACA,YAAY,CAAC,MAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,IAAI,CAAC;EACjF;;;;;;;;;;;;;;;;;;;;;EAsBA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY,MAAM;EACpB;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,kBAAkB,UAAU,KAAK;IACrE;IACA,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU;EACxC;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,kBAAkB,UAAU,KAAK;IACrE;IACA,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU;EACxC;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,kBAAkB,UAAU,KAAK;MACnE,EAAE,MAAM,WAAW,aAAa,qCAAqC,UAAU,KAAK;IACtF;IACA,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,EAAE,UAAU;EACnE;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY,MAAM;EACpB;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY,MAAM;EACpB;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,sCAAsC,UAAU,KAAK;MACvF,EAAE,MAAM,SAAS,aAAa,6EAA6E,UAAU,MAAM;IAC7H;IACA,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAG;EAChF;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY,MAAM;EACpB;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,yCAAyC,UAAU,MAAM;MAC3F,EAAE,MAAM,aAAa,aAAa,mEAAmE,UAAU,MAAM;MACrH,EAAE,MAAM,WAAW,aAAa,oCAAoC,UAAU,MAAM;MACpF,EAAE,MAAM,SAAS,aAAa,0DAA0D,UAAU,MAAM;IAC1G;IACA,YAAY,CAAC,MAAM,UAAU,CAAC;EAChC;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,yCAAyC,UAAU,MAAM;MAC3F,EAAE,MAAM,aAAa,aAAa,mEAAmE,UAAU,MAAM;MACrH,EAAE,MAAM,WAAW,aAAa,oCAAoC,UAAU,MAAM;MACpF,EAAE,MAAM,SAAS,aAAa,0DAA0D,UAAU,MAAM;MACxG,EAAE,MAAM,SAAS,aAAa,oDAAoD,UAAU,MAAM;IACpG;IACA,YAAY,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,GAAI,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAG;EACxF;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,yCAAyC,UAAU,MAAM;MAC3F,EAAE,MAAM,aAAa,aAAa,mEAAmE,UAAU,MAAM;MACrH,EAAE,MAAM,WAAW,aAAa,oCAAoC,UAAU,MAAM;MACpF,EAAE,MAAM,SAAS,aAAa,0DAA0D,UAAU,MAAM;IAC1G;IACA,YAAY,CAAC,MAAM,UAAU,CAAC;EAChC;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,yCAAyC,UAAU,MAAM;MAC3F,EAAE,MAAM,aAAa,aAAa,mEAAmE,UAAU,MAAM;MACrH,EAAE,MAAM,WAAW,aAAa,oCAAoC,UAAU,MAAM;MACpF,EAAE,MAAM,SAAS,aAAa,0DAA0D,UAAU,MAAM;MACxG,EAAE,MAAM,QAAQ,aAAa,uCAAuC,UAAU,MAAM;MACpF,EAAE,MAAM,UAAU,aAAa,qEAAqE,UAAU,MAAM;MACpH,EAAE,MAAM,aAAa,aAAa,4CAA4C,UAAU,MAAM;IAChG;IACA,YAAY,CAAC,OAAO;MAClB,GAAG,UAAU,CAAC;MACd,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;MACjC,GAAI,EAAE,WAAW,SAAY,EAAE,QAAQ,EAAE,WAAW,OAAO,IAAI,CAAC;MAChE,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,EAAE,cAAc,OAAO,IAAI,CAAC;IAC3E;EACF;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,SAAS,aAAa,mFAAoF,UAAU,KAAK;IACnI;IACA,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM;EACvC;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,SAAS,aAAa,mFAAoF,UAAU,KAAK;MACjI,EAAE,MAAM,QAAQ,aAAa,uDAAuD,UAAU,KAAK;IACrG;IACA,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,MAAM,EAAE,KAAK;EACrD;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,SAAS,aAAa,sDAAsD,UAAU,MAAM;IACtG;IACA,YAAY,CAAC,MAAO,EAAE,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,EAAE,IAAI;EAC7D;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY,MAAM;EACpB;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,sCAAsC,UAAU,KAAK;MACvF,EAAE,MAAM,SAAS,aAAa,6EAA6E,UAAU,MAAM;IAC7H;IACA,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAG;EAChF;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,yCAAyC,UAAU,MAAM;MAC3F,EAAE,MAAM,aAAa,aAAa,mEAAmE,UAAU,MAAM;MACrH,EAAE,MAAM,WAAW,aAAa,oCAAoC,UAAU,MAAM;MACpF,EAAE,MAAM,SAAS,aAAa,0DAA0D,UAAU,MAAM;IAC1G;IACA,YAAY,CAAC,MAAM,UAAU,CAAC;EAChC;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ;MACN,EAAE,MAAM,aAAa,aAAa,yCAAyC,UAAU,MAAM;MAC3F,EAAE,MAAM,aAAa,aAAa,mEAAmE,UAAU,MAAM;MACrH,EAAE,MAAM,WAAW,aAAa,oCAAoC,UAAU,MAAM;MACpF,EAAE,MAAM,SAAS,aAAa,0DAA0D,UAAU,MAAM;IAC1G;IACA,YAAY,CAAC,MAAM,UAAU,CAAC;EAChC;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY,MAAM;EACpB;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY,MAAM;EACpB;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY,MAAM;EACpB;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY,MAAM;EACpB;EACA;IACE,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,QAAQ,CAAC;IACT,YAAY,MAAM;EACpB;AACF;AIzoBA,eAAsB,SACpB,SACA,OACA,QACA,OACA,WACkB;AAClB,QAAM,UAAkC;IACtC,gBAAgB;IAChB,iBAAiB,UAAU,SAAS;EACtC;AAEA,QAAM,MAAM,WAAW,SAAS,QAC5B,GAAG,OAAO,aAAa,KAAK,UAAU,mBAAmB,KAAK,UAAU,KAAK,CAAC,CAAC,KAC/E,GAAG,OAAO,aAAa,KAAK;AAEhC,QAAM,MAAM,MAAM,MAAM,KAAK;IAC3B;IACA;IACA,GAAI,WAAW,SAAS,EAAE,MAAM,KAAK,UAAU,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;IACjE,QAAQ,YAAY,QAAQ,IAAM;EACpC,CAAC;AAED,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,KAAK,OAAO,EAAG,OAAM,IAAI,MAAM,KAAK,UAAU,KAAK,OAAO,CAAC,CAAC;AAChE,QAAM,SAAS,KAAK,QAAQ;AAC5B,SAAO,SAAS,MAAM,KAAK,UAAU;AACvC;;;ACRO,SAAS,mBACd,KACA,QACA,QACoC;AACpC,MAAI,CAAC,OAAO,UAAW,QAAO;AAE9B,QAAM,UAAU,CAAC,SAAiB,IAAI,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACxE,MAAI,CAAC,QAAQ,WAAW,KAAK,OAAO,WAAW,EAAG,QAAO;AAEzD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW,OAAO;AAAA;AAAA;AAAA,IAGlB,GAAI,OAAO,SAAS,QAAQ,OAAO,KAAK,CAAC,OAAO,OAAO,IAAI,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,EACxF;AACF;;;ANlCA,IAAM,WAAW,QAAQ,IAAI,iBAAiB,KAAK;AACnD,IAAM,kBAAkB,QAAQ,IAAI,wBAAwB,KAAK;AACjE,IAAM,iBAAiB,QAAQ,IAAI,uBAAuB,KAAK;AAC/D,IAAM,YAAY,QAAQ,IAAI,kBAAkB,KAAK;AAGrD,IAAM,iBAAiB;AAAA,EACrB,WAAW,QAAQ,IAAI,mBAAmB,KAAK;AAAA,EAC/C,OAAO,QAAQ,IAAI,eAAe,KAAK;AACzC;AAEA,IAAM,SAAS,IAAI,UAAU,EAAE,MAAM,UAAU,SAAS,QAAQ,CAAC;AAIjE,WAAW,OAAO,qBAAqB;AACrC,QAAM,WAAyC,CAAC;AAEhD,aAAW,SAAS,IAAI,QAAQ;AAC9B,UAAM,OAAO,EAAE,OAAO,EAAE,SAAS,MAAM,WAAW;AAClD,aAAS,MAAM,IAAI,IAAI,MAAM,WAAW,OAAO,KAAK,SAAS;AAAA,EAC/D;AAGA,WAAS,WAAW,IAAI,EAAE,OAAO,EAAE,SAAS,iCAAiC,EAAE,SAAS;AAExF,SAAO,KAAK,IAAI,MAAM,IAAI,aAAa,UAAU,OAAO,UAAU;AAChE,QAAI;AACF,YAAM,MAAO,MAA6C;AAC1D,YAAM,YAAa,OAAO,CAAC,IAAI,WAAW,GAAG,IAAK,MAAO,aAAa,kBAAkB;AACxF,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,yBAAyB;AAEzD,YAAM,SAAS,mBAAmB,KAAK,OAA6C,cAAc;AAClG,YAAM,SAAS,MAAM,SAAS,UAAU,IAAI,OAAO,IAAI,QAAQ,IAAI,WAAW,MAAM,GAAG,SAAS;AAChG,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,IACvF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,UAAW,IAAc,OAAO,GAAG,CAAC;AAAA,QAC7E,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAIA,IAAI,mBAAmB,gBAAgB;AACrC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,8BAA8B,EAAE;AAAA,IAChE,OAAO,EAAE,SAAS,MAAM;AACtB,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,GAAG,QAAQ,mCAAmC;AAAA,UACpE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,iBAAiB,UAAU,cAAc;AAAA,UAC3C;AAAA,UACA,MAAM,KAAK,UAAU,EAAE,gBAAgB,iBAAiB,SAAS,CAAC;AAAA,UAClE,QAAQ,YAAY,QAAQ,GAAO;AAAA;AAAA,QACrC,CAAC;AACD,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAM,SAAU,KAAK,QAAQ,IAA4C,MAAM,KAAK;AACpF,cAAM,OAAO,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM;AACxE,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,KAAK,CAAC,EAAE;AAAA,MACtD,SAAS,KAAK;AACZ,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,UAAW,IAAc,OAAO,GAAG,CAAC,GAAG,SAAS,KAAK;AAAA,MACzG;AAAA,IACF;AAAA,EACF;AACF;AAIA,IAAM,YAAY,IAAI,qBAAqB;AAC3C,MAAM,OAAO,QAAQ,SAAS;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runeya/runeya",
3
- "version": "2.0.118",
3
+ "version": "2.0.120",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "runeya": "./index.js"
@@ -0,0 +1,9 @@
1
+ import {
2
+ settingsManager
3
+ } from "./chunk-GIHR3BGT.js";
4
+ import "./chunk-H6VIS4OY.js";
5
+ import "./chunk-ZFELQG4B.js";
6
+ export {
7
+ settingsManager
8
+ };
9
+ //# sourceMappingURL=settings-manager-2C7RY6ZC.js.map
@@ -64,7 +64,7 @@ import {
64
64
  soleAccountScope,
65
65
  startCliSession,
66
66
  vaultOfProject
67
- } from "./chunk-WE6EOX4C.js";
67
+ } from "./chunk-22RJM654.js";
68
68
  import {
69
69
  resolveCliInvocation,
70
70
  whichCommand
@@ -87,7 +87,7 @@ import {
87
87
  stopClaudeTranscriptWatcher,
88
88
  stopCodexTranscriptWatcher,
89
89
  verifyJwt
90
- } from "./chunk-XIRMRWVU.js";
90
+ } from "./chunk-NYKFDU76.js";
91
91
  import "./chunk-MD3VW4HQ.js";
92
92
  import {
93
93
  agentManager,
@@ -126,10 +126,10 @@ import {
126
126
  stableEncryptValue,
127
127
  traefikManager,
128
128
  unregisterInstance
129
- } from "./chunk-P47X3LT3.js";
129
+ } from "./chunk-2WXQIUVC.js";
130
130
  import {
131
131
  settingsManager
132
- } from "./chunk-I2AZCZMR.js";
132
+ } from "./chunk-GIHR3BGT.js";
133
133
  import {
134
134
  AGENT_LONG_FETCH_TIMEOUT,
135
135
  AGENT_STOP_FETCH_TIMEOUT,
@@ -163,7 +163,7 @@ import {
163
163
  readEntity,
164
164
  serviceSlug,
165
165
  writeEntity
166
- } from "./chunk-RN4X65D3.js";
166
+ } from "./chunk-H6VIS4OY.js";
167
167
  import {
168
168
  env,
169
169
  forgetOrgLogo,
@@ -8561,6 +8561,7 @@ function makeVariable(key, value, pre = "", post = "") {
8561
8561
  pre: rewriteInterpolation(pre + composite.pre),
8562
8562
  post: rewriteInterpolation(composite.post + post),
8563
8563
  isSecret: false,
8564
+ shareWithAi: false,
8564
8565
  injectIntoAi: false,
8565
8566
  required: false,
8566
8567
  overrideOnly: false,
@@ -8576,6 +8577,7 @@ function makeVariable(key, value, pre = "", post = "") {
8576
8577
  pre: rewriteInterpolation(pre),
8577
8578
  post: rewriteInterpolation(post),
8578
8579
  isSecret: secret,
8580
+ shareWithAi: false,
8579
8581
  injectIntoAi: false,
8580
8582
  required: false,
8581
8583
  overrideOnly: false,
@@ -8957,7 +8959,7 @@ async function runLegacyMigration(dataDir) {
8957
8959
  varId = randomUUID6();
8958
8960
  svcScopedEnv.variables[varId] = {
8959
8961
  key: cleaned,
8960
- value: { value: "", pre: "", post: "", isSecret: false, injectIntoAi: false, required: false, overrideOnly: false, description: "" }
8962
+ value: { value: "", pre: "", post: "", isSecret: false, shareWithAi: false, injectIntoAi: false, required: false, overrideOnly: false, description: "" }
8961
8963
  };
8962
8964
  }
8963
8965
  const basePre = baseEntry?.[1]?.value?.pre ?? "";
@@ -9236,7 +9238,7 @@ async function runOverrideOnlyMigration(dataDir) {
9236
9238
  varId = randomUUID6();
9237
9239
  svcScopedEnv["variables"][varId] = {
9238
9240
  key: cleaned,
9239
- value: { value: "", pre: "", post: "", isSecret: false, injectIntoAi: false, required: false, overrideOnly: false, description: "" }
9241
+ value: { value: "", pre: "", post: "", isSecret: false, shareWithAi: false, injectIntoAi: false, required: false, overrideOnly: false, description: "" }
9240
9242
  };
9241
9243
  envsModified = true;
9242
9244
  }
@@ -10440,7 +10442,7 @@ async function createLocalServer() {
10440
10442
  ]);
10441
10443
  console.log("[server] Shutdown complete");
10442
10444
  };
10443
- const { initCompanion } = await import("./companion-POUL5OGO.js");
10445
+ const { initCompanion } = await import("./companion-4RQ3AMOL.js");
10444
10446
  initCompanion();
10445
10447
  return { app, server, wss, shutdown };
10446
10448
  }
@@ -10887,4 +10889,4 @@ export {
10887
10889
  startProcess,
10888
10890
  stopProcess
10889
10891
  };
10890
- //# sourceMappingURL=src-VCZQLW2Q.js.map
10892
+ //# sourceMappingURL=src-NRKK27F3.js.map