@runeya/runeya 2.0.77 → 2.0.79

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 (332) hide show
  1. package/agent/index.js +56 -3
  2. package/agent/index.js.map +1 -1
  3. package/agent-manager-KM7SFKVR.js +7 -0
  4. package/{chunk-WDM637TW.js → chunk-T3TDCZUY.js} +57 -4
  5. package/chunk-T3TDCZUY.js.map +1 -0
  6. package/index.js +1 -1
  7. package/mcp-server/index.js +85 -2
  8. package/mcp-server/index.js.map +1 -1
  9. package/package.json +1 -1
  10. package/{src-WON4SLMI.js → src-6PAM4JRF.js} +249 -75
  11. package/src-6PAM4JRF.js.map +1 -0
  12. package/web/assets/{AgentScalarChatInterface.vue-BKtO8e-V.js → AgentScalarChatInterface.vue-Cjx4rHX2.js} +3 -3
  13. package/web/assets/AgentTerminalPage-EZkJENnM.js +1 -0
  14. package/web/assets/AiChatPage-bW3RWF13.js +1 -0
  15. package/web/assets/AppLayout-61eh74HD.js +1 -0
  16. package/web/assets/{AppLayout-Dvr7plrF.css → AppLayout-DNaAILBs.css} +1 -1
  17. package/web/assets/AuditPage-IEQ-7llQ.js +1 -0
  18. package/web/assets/CloudAccountPage-DxS1F0vT.js +1 -0
  19. package/web/assets/CloudAccountPage-UjgYp_cm.js +1 -0
  20. package/web/assets/CloudMessagingPage-DyPt88Nh.js +2 -0
  21. package/web/assets/DashboardPage-s40sRkjs.js +1 -0
  22. package/web/assets/DirectoryPickerDialog-Czkp1Q7J.js +1 -0
  23. package/web/assets/{EditorIcon-BY3-sVPA.js → EditorIcon-EQ5sr6h1.js} +2 -2
  24. package/web/assets/EnvironmentForm-BDvSKtV3.js +108 -0
  25. package/web/assets/EnvironmentFormPage-BIiHAeAe.js +1 -0
  26. package/web/assets/EnvironmentListPage-D7YCKAry.js +1 -0
  27. package/web/assets/KanbanBoardPage-BSVcjsFH.js +4 -0
  28. package/web/assets/KanbanBoardPage-DKdXK4Qx.css +1 -0
  29. package/web/assets/KanbanListPage-Ckorylra.js +1 -0
  30. package/web/assets/LaunchProjectPage-BuDrO-dr.js +1 -0
  31. package/web/assets/LaunchProjectPage-CCtlg5Kz.css +1 -0
  32. package/web/assets/LaunchServicesPage-NtGLfvlv.js +1 -0
  33. package/web/assets/LaunchServicesPage-PMkfsl54.css +1 -0
  34. package/web/assets/LogViewer-0gHkNfoF.js +3 -0
  35. package/web/assets/OrgKeyPrompt-ChdmIeDS.js +1 -0
  36. package/web/assets/{ProcessControls-CSZGFSpk.js → ProcessControls-DtYIwxFh.js} +1 -1
  37. package/web/assets/ProcessDetailPage-C4CBtxzN.js +1 -0
  38. package/web/assets/{ProcessMetrics-CbaSXK63.js → ProcessMetrics-CBxoD3mq.js} +2 -2
  39. package/web/assets/ProjectDetailPage-Ch3w5gaP.js +1 -0
  40. package/web/assets/ProjectListPage-DxVckdPq.js +1 -0
  41. package/web/assets/RandomJobTestPage-BOnJfdfV.js +2 -0
  42. package/web/assets/ScenarioEditorPage-SXqdd0-1.js +14 -0
  43. package/web/assets/SendToChatDialog-N2AU0GS0.js +1 -0
  44. package/web/assets/ServiceControlsBar-CkF9T-Cl.js +1 -0
  45. package/web/assets/ServiceDetailPage-CvqE9h6I.js +2 -0
  46. package/web/assets/ServiceFormPage-CshXzwrR.js +1 -0
  47. package/web/assets/SettingsPage-BI7yykWy.js +2063 -0
  48. package/web/assets/UnlockPage-CpysPhlT.css +1 -0
  49. package/web/assets/UnlockPage-rUr_VIJo.js +1 -0
  50. package/web/assets/VariablesTable-uemjJh3C.js +1 -0
  51. package/web/assets/VaultMigrationPage-CIngneiY.css +1 -0
  52. package/web/assets/VaultMigrationPage-DFZfLyT2.js +1 -0
  53. package/web/assets/VersionBadge-BiRPinCw.js +1 -0
  54. package/web/assets/WikiPage-Cu4-7u2f.js +1 -0
  55. package/web/assets/WikiView-BY7QtPKf.js +1 -0
  56. package/web/assets/add-scalar-classes-BvRx5gFW.js +387 -0
  57. package/web/assets/auth-errors-BIRt7ulx.js +1 -0
  58. package/web/assets/autocomplete-Dx4-R-Qa.js +308 -0
  59. package/web/assets/{basic-shape-diamond.svg-e2mztVJl.js → basic-shape-diamond.svg-D9HQNu6x.js} +1 -1
  60. package/web/assets/{basic-shape-hexagon.svg-BabvvzO8.js → basic-shape-hexagon.svg-BLkvD1jK.js} +1 -1
  61. package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-qX_EIwRC.js → basic-shape-primary-circle-ellipse-round.svg-Bsfgrw0z.js} +1 -1
  62. package/web/assets/{basic-shape-primary-square-rectangle.svg-BC_lPlNz.js → basic-shape-primary-square-rectangle.svg-Cl_SRAdr.js} +1 -1
  63. package/web/assets/{basic-shape-shield.svg-Cs-Q1jtG.js → basic-shape-shield.svg-Br_5PIve.js} +1 -1
  64. package/web/assets/{browser-TQOmEABX.js → browser-BuzduiU6.js} +1 -1
  65. package/web/assets/{browser-Dny5CSfR.js → browser-DuenoSNG.js} +1 -1
  66. package/web/assets/card-CxqAMieZ.js +32 -0
  67. package/web/assets/{checkbox-DPfaZ5M_.js → checkbox-DR0TgZHz.js} +3 -3
  68. package/web/assets/{chip-DsGV0_Iw.js → chip-Beh-yjqy.js} +2 -2
  69. package/web/assets/{client-DVldvprj.js → client-BpBAdgho.js} +1 -1
  70. package/web/assets/cloud-chat.store-DF1OJFcw.js +1 -0
  71. package/web/assets/cloud-session-2NC0j9sm.js +1 -0
  72. package/web/assets/column-NdoVyBai.js +907 -0
  73. package/web/assets/{computer-device-desktop-monitor.svg-CmAS9W1F.js → computer-device-desktop-monitor.svg-C7xIBZiz.js} +1 -1
  74. package/web/assets/{computer-device-desktop.svg-ByQvPTu0.js → computer-device-desktop.svg-m15jSfTu.js} +1 -1
  75. package/web/assets/{computer-device-laptop.svg-Be3DJfJS.js → computer-device-laptop.svg-DuGGRxCr.js} +1 -1
  76. package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-Bg4HriyB.js → computer-device-mobile-phone-android-samsung-back.svg-tNcHABvV.js} +1 -1
  77. package/web/assets/{computer-device-mobile-phone-android-samsung.svg-Cbs1ZC8K.js → computer-device-mobile-phone-android-samsung.svg-DqomXsCT.js} +1 -1
  78. package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-SrmNqd-k.js → computer-device-mobile-phone-iphone-x-back.svg-BQYLAqvU.js} +1 -1
  79. package/web/assets/{computer-device-mobile-phone-iphone-x.svg-CRbRsx9O.js → computer-device-mobile-phone-iphone-x.svg-BTqfvYmE.js} +1 -1
  80. package/web/assets/{computer-device-mobile-tablet-touch.svg-CYxQ_G-f.js → computer-device-mobile-tablet-touch.svg-BWwfMvTI.js} +1 -1
  81. package/web/assets/{computer-device-mobile-tablet.svg-8Y2qx2nG.js → computer-device-mobile-tablet.svg-9-cDdNh0.js} +1 -1
  82. package/web/assets/{computer-device-network-ethernet-cat6.svg-DuMVeY9S.js → computer-device-network-ethernet-cat6.svg-dec4c9f7.js} +1 -1
  83. package/web/assets/{computer-device-network-lan-www.svg-CMl88oMx.js → computer-device-network-lan-www.svg-CfxdVlX6.js} +1 -1
  84. package/web/assets/{computer-device-network-wifi-connection.svg-BLKrhbzD.js → computer-device-network-wifi-connection.svg-Aq3c3kpj.js} +1 -1
  85. package/web/assets/{computer-device-network-wifi-router.svg-DegDkOS9.js → computer-device-network-wifi-router.svg-D30KniBG.js} +1 -1
  86. package/web/assets/{cssMode-BXMOCv71.js → cssMode-Bx7OM1AF.js} +1 -1
  87. package/web/assets/{divider-C9G7_D2G.js → divider-e8srWIpS.js} +2 -2
  88. package/web/assets/{docx-preview-DavEWOCt.js → docx-preview-trPKCLuS.js} +1 -1
  89. package/web/assets/{ecology-science-erlenmeyer-flask.svg-DmbDAbFP.js → ecology-science-erlenmeyer-flask.svg-CRh6aGQD.js} +1 -1
  90. package/web/assets/{fieldset-oJKjCI7s.js → fieldset-0TLkhgk1.js} +2 -2
  91. package/web/assets/{freemarker2-B8tfMW3C.js → freemarker2-CjlsJILS.js} +1 -1
  92. package/web/assets/{handlebars-CePhsdSW.js → handlebars-hKjqU20X.js} +1 -1
  93. package/web/assets/{html-571VCOQ9.js → html-1lRHqbTC.js} +1 -1
  94. package/web/assets/{htmlMode-CVxsAwkf.js → htmlMode-KrX4AuJb.js} +1 -1
  95. package/web/assets/{image-flash-lightning.svg-AnW8MOVQ.js → image-flash-lightning.svg-awIm9H7j.js} +1 -1
  96. package/web/assets/{image-picture-flower.svg-FiFJUYlQ.js → image-picture-flower.svg-0ej02v71.js} +1 -1
  97. package/web/assets/{index-BGhTRiUv.js → index-CyTp_MK4.js} +673 -358
  98. package/web/assets/index-Cz0azMVO.css +1 -0
  99. package/web/assets/{interface-alert-exclamation-diamond.svg-oGZV7xVw.js → interface-alert-exclamation-diamond.svg-CghieGSb.js} +1 -1
  100. package/web/assets/{interface-alert-exclamation-triangle-warning.svg-DAVdspM_.js → interface-alert-exclamation-triangle-warning.svg-CwlouhWg.js} +1 -1
  101. package/web/assets/{interface-alert-information-circle.svg-D18QJNgs.js → interface-alert-information-circle.svg-CFjDz1cs.js} +1 -1
  102. package/web/assets/{interface-award-crown.svg-CA1wQid9.js → interface-award-crown.svg-CC_YNTlQ.js} +1 -1
  103. package/web/assets/{interface-bookmark.svg-C9irM7Rx.js → interface-bookmark-tag.svg-DzKVQx1D.js} +1 -1
  104. package/web/assets/{interface-bookmark-tag.svg-B7cb2okO.js → interface-bookmark.svg-BoMtyTYl.js} +1 -1
  105. package/web/assets/{interface-calendar-date-one.svg-DE5gBV6v.js → interface-calendar-date-one.svg-DwPLZLNp.js} +1 -1
  106. package/web/assets/{interface-content-book-open-pages.svg-BFz7YanP.js → interface-content-book-open-pages.svg-BRNhpR0b.js} +1 -1
  107. package/web/assets/{interface-content-book-page.svg-XsbyPJwv.js → interface-content-book-page.svg-D6f84ENa.js} +1 -1
  108. package/web/assets/{interface-content-file.svg-D6q2wWLi.js → interface-content-file.svg-BxSwWskY.js} +1 -1
  109. package/web/assets/{interface-content-folder.svg-CHkU4LKW.js → interface-content-folder.svg-D9vDlA-7.js} +1 -1
  110. package/web/assets/interface-content-folder.svg-DA-TRWg5.js +1 -0
  111. package/web/assets/{interface-copy-clipboard.svg-DBtOk_bA.js → interface-copy-clipboard.svg-CLWuiWQR.js} +1 -1
  112. package/web/assets/{interface-edit-attachment.svg-Dz3-OOve.js → interface-edit-attachment.svg-DkE6Zp16.js} +1 -1
  113. package/web/assets/{interface-edit-binocular.svg-ByBP8ehM.js → interface-edit-binocular.svg-CsnS4sfu.js} +1 -1
  114. package/web/assets/{interface-edit-magic-wand.svg-DfcOCpiG.js → interface-edit-magic-wand.svg-D7fNjVU0.js} +1 -1
  115. package/web/assets/{interface-edit-tool-paint-roller.svg-CRGZNjWp.js → interface-edit-tool-paint-roller.svg-BNGqMsSE.js} +1 -1
  116. package/web/assets/{interface-edit-tool-pencil.svg-zsOWLIqc.js → interface-edit-tool-pencil.svg-DGj85i4b.js} +1 -1
  117. package/web/assets/{interface-favorite-award.svg-DLVKZn5N.js → interface-favorite-award.svg-DYJQG2z5.js} +1 -1
  118. package/web/assets/{interface-favorite-flag.svg-C5YPye-o.js → interface-favorite-flag.svg-z_VpsLBz.js} +1 -1
  119. package/web/assets/{interface-favorite-heart.svg-XX875VH2.js → interface-favorite-heart.svg-C-RVoQp_.js} +1 -1
  120. package/web/assets/{interface-favorite-star.svg-CwodnhEd.js → interface-favorite-star.svg-D1XyCk_H.js} +1 -1
  121. package/web/assets/{interface-favorite-stars-sparkles.svg-CaHoULcK.js → interface-favorite-stars-sparkles.svg-CpbpNxr4.js} +1 -1
  122. package/web/assets/{interface-hierarchy-flowchart.svg-Dw0Hiig6.js → interface-hierarchy-flowchart.svg-DhRkNwJk.js} +1 -1
  123. package/web/assets/{interface-home-house.svg-Dr6ONbPr.js → interface-home-house.svg-CIKaitr0.js} +1 -1
  124. package/web/assets/{interface-hyperlink.svg-DPlIj_h5.js → interface-hyperlink.svg-CPv8WDpv.js} +1 -1
  125. package/web/assets/{interface-lighting-brightness.svg-lTDIWcG1.js → interface-lighting-brightness.svg-Ds9dNkBb.js} +1 -1
  126. package/web/assets/{interface-lock-closed.svg-DbLIOlp2.js → interface-lock-closed.svg-CH0keiMQ.js} +1 -1
  127. package/web/assets/{interface-lock-open-unlock.svg-AtzqURqy.js → interface-lock-open-unlock.svg-sM2ipMSY.js} +1 -1
  128. package/web/assets/{interface-login-key.svg-m-Fs6HY3.js → interface-login-key.svg-w20Bufjr.js} +1 -1
  129. package/web/assets/{interface-search.svg-DFUBMy6X.js → interface-search.svg-CG8DZ4bz.js} +1 -1
  130. package/web/assets/{interface-setting-cog.svg-DZ0_Nd7i.js → interface-setting-cog.svg-DvY1eW4l.js} +1 -1
  131. package/web/assets/{interface-share-megaphone-bullhorn.svg-YrYkQDPm.js → interface-share-megaphone-bullhorn.svg-BL0sxQKM.js} +1 -1
  132. package/web/assets/{interface-share-rocket.svg-DRDHefw2.js → interface-share-rocket.svg-BbDtgcMw.js} +1 -1
  133. package/web/assets/{interface-share-satellite.svg-CVNiRXqB.js → interface-share-satellite.svg-hj8wdj8n.js} +1 -1
  134. package/web/assets/{interface-share-space-ship.svg-CpgNADXr.js → interface-share-space-ship.svg-DwezJA6M.js} +1 -1
  135. package/web/assets/{interface-share.svg-Djd0yOl3.js → interface-share.svg-BDakrqyS.js} +1 -1
  136. package/web/assets/{interface-signal-square.svg-zPFYxRs3.js → interface-signal-square.svg-Bd85bHcQ.js} +1 -1
  137. package/web/assets/{interface-time-clock-circle.svg-D0MsoIC_.js → interface-time-clock-circle.svg-BFPYG2_y.js} +1 -1
  138. package/web/assets/{interface-time-hour-glass.svg-CfqSkT16.js → interface-time-hour-glass.svg-XEEhGJNc.js} +1 -1
  139. package/web/assets/{interface-users-multiple.svg-C_Tspx5q.js → interface-users-multiple.svg-DlDS4pFQ.js} +1 -1
  140. package/web/assets/{interface-weather-moon.svg-ChEcMLSN.js → interface-weather-moon.svg-qamRI73e.js} +1 -1
  141. package/web/assets/{javascript-pUCsYoU8.js → javascript-BMcm76Iy.js} +1 -1
  142. package/web/assets/{jsonMode-C0uzq8yR.js → jsonMode-CFeh3q-t.js} +2 -2
  143. package/web/assets/{liquid-C5Ev6uFa.js → liquid-BbZ7m_Gg.js} +1 -1
  144. package/web/assets/{lspLanguageFeatures-DYaT_fqo.js → lspLanguageFeatures-D6fqdMqo.js} +3 -3
  145. package/web/assets/{mail-chat-bubble-square.svg-CuZEWYk3.js → mail-chat-bubble-square.svg-lTDk1-cI.js} +1 -1
  146. package/web/assets/{mail-send-email-paper-airplane.svg-CENY8qyv.js → mail-send-email-paper-airplane.svg-DHTPOPNN.js} +1 -1
  147. package/web/assets/{mail-send-envelope.svg-B0p8Ko-e.js → mail-send-envelope.svg-DrKev7cA.js} +1 -1
  148. package/web/assets/{mdx-DKUSX-0M.js → mdx-BFTLCqIq.js} +1 -1
  149. package/web/assets/{minus-Cn4do0vQ.js → minus-BQIxFtXx.js} +2 -2
  150. package/web/assets/modal-CRtjbIPi.js +1 -0
  151. package/web/assets/modal-CU4p0zoB.js +5 -0
  152. package/web/assets/{money-cashier-receipt.svg-D6MTv6ic.js → money-cashier-receipt.svg-DrMInbv1.js} +1 -1
  153. package/web/assets/{money-currency-dollar-pay.svg-C0CT_Umg.js → money-currency-dollar-pay.svg-D3qWQTD7.js} +1 -1
  154. package/web/assets/{money-graph-arrow-increase.svg-B1pQ-RCg.js → money-graph-arrow-increase.svg-BNMlMSSu.js} +1 -1
  155. package/web/assets/{money-graph-bar-chart-increase.svg-Df0BEyR6.js → money-graph-bar-chart-increase.svg-C4ZbxWQ0.js} +1 -1
  156. package/web/assets/multiselect-b0l1ZyGV.js +251 -0
  157. package/web/assets/{nature-ecology-leaf.svg-B7IiKgr5.js → nature-ecology-leaf.svg-Bc4U3t3c.js} +1 -1
  158. package/web/assets/{password-UNoAlO0Z.js → password-zUKcXhNa.js} +4 -4
  159. package/web/assets/{phone-telephone.svg-CULSkJvU.js → phone-telephone.svg-Op0vC0uZ.js} +1 -1
  160. package/web/assets/{plus-CCNhU8WS.js → plus-NzhFUR3J.js} +6 -6
  161. package/web/assets/process.store-DaN2Fpm8.js +1 -0
  162. package/web/assets/{programming-bug.svg-BkAWg-zz.js → programming-bug.svg-BPBc7yJC.js} +1 -1
  163. package/web/assets/{programming-cloud.svg-CElVVYxR.js → programming-cloud.svg-Cj4iIxN0.js} +1 -1
  164. package/web/assets/{programming-computer-database-server.svg-DTOugM3g.js → programming-computer-database-server.svg-B6JDyOUE.js} +1 -1
  165. package/web/assets/{programming-computer-database.svg-BEtc2j2j.js → programming-computer-database.svg-MXlEDVjR.js} +1 -1
  166. package/web/assets/{programming-module-four-layout.svg-CfMkXMQV.js → programming-module-four-layout.svg-CTOezzR9.js} +1 -1
  167. package/web/assets/{programming-module-three.svg-BEGzxEbd.js → programming-module-three.svg-Ds0SxfuW.js} +1 -1
  168. package/web/assets/{programming-module.svg-WcMyqgA5.js → programming-module.svg-dtxYxE76.js} +1 -1
  169. package/web/assets/{programming-script-code.svg-BlKU_DbS.js → programming-script-code.svg-BfE32sHE.js} +1 -1
  170. package/web/assets/{python-CX7nl3fS.js → python-DdxzkbZ6.js} +1 -1
  171. package/web/assets/{razor-1qMzYaOc.js → razor-BaPQKfzN.js} +1 -1
  172. package/web/assets/router-BzZYIGu6.js +1 -0
  173. package/web/assets/settings-scope-BCvTkdxE.js +1 -0
  174. package/web/assets/settings.store-ChTd1UeA.js +1 -0
  175. package/web/assets/{shopping-cart.svg-DVuGrIwZ.js → shopping-cart.svg-B0oB45_X.js} +1 -1
  176. package/web/assets/{shopping-gift-present.svg-D6-559VB.js → shopping-gift-present.svg-Dg_UKNrW.js} +1 -1
  177. package/web/assets/{shopping-shipping-box-parcel-package.svg-BCqjCO2V.js → shopping-shipping-box-parcel-package.svg-DsoPC6GT.js} +1 -1
  178. package/web/assets/{src-DXup2ujI.js → src-BCGduELr.js} +26 -26
  179. package/web/assets/{src-Bhd-KJy_.css → src-BsM0Obsp.css} +1 -1
  180. package/web/assets/src-_iQSlqGE.js +1 -0
  181. package/web/assets/{tabpanel-c1kswNhr.js → tabpanel-BH5ZsTUr.js} +3 -3
  182. package/web/assets/{tag-new-circle.svg-DJekwjr2.js → tag-new-circle.svg-Bt8lUfCb.js} +1 -1
  183. package/web/assets/{toggleswitch-CyIjsk3N.js → toggleswitch-C5kmCEN7.js} +2 -2
  184. package/web/assets/{travel-map-earth-globe.svg-CgYzLmEQ.js → travel-map-earth-globe.svg-vJ1Kg6FY.js} +1 -1
  185. package/web/assets/trpc-EkL9tT-u.js +1 -0
  186. package/web/assets/{tsMode-Dwc3vyi8.js → tsMode-BsBJyGKK.js} +6 -6
  187. package/web/assets/{typescript-B4Szu53E.js → typescript-eGcJYUd4.js} +1 -1
  188. package/web/assets/useAiChatDrawer-DWlbD-_B.js +1 -0
  189. package/web/assets/useCloudOrg-BUsAdgoq.js +572 -0
  190. package/web/assets/useCloudOrg-Drl2_37-.css +1 -0
  191. package/web/assets/{useProjectCatalog-Chvnlk7w.js → useProjectCatalog-FfB9tOOm.js} +1 -1
  192. package/web/assets/{xml-Cmwfj5No.js → xml-DKM3cWQE.js} +1 -1
  193. package/web/assets/{yaml-BwAEhb0d.js → yaml-D0z-VNdc.js} +1 -1
  194. package/web/index.html +2 -2
  195. package/agent-manager-JUVAVUIQ.js +0 -7
  196. package/chunk-WDM637TW.js.map +0 -1
  197. package/src-WON4SLMI.js.map +0 -1
  198. package/web/assets/AgentTerminalPage-2fGeLuFz.js +0 -1
  199. package/web/assets/AiChatPage-su8lBLuu.js +0 -1
  200. package/web/assets/AppLayout-CVBdnnXe.js +0 -1
  201. package/web/assets/AuditPage-ggADH3yd.js +0 -1
  202. package/web/assets/CloudAccountPage-DeF7HGaQ.js +0 -1
  203. package/web/assets/CloudAccountPage-eLXfNifH.js +0 -1
  204. package/web/assets/CloudMessagingPage-B_5g7iun.js +0 -2
  205. package/web/assets/DashboardPage-Cl-oihCh.js +0 -1
  206. package/web/assets/DirectoryPickerDialog-BmC5PT-P.js +0 -1
  207. package/web/assets/EnvironmentForm-BvSPE7Fj.js +0 -108
  208. package/web/assets/EnvironmentFormPage-CjLt1Yvf.js +0 -1
  209. package/web/assets/EnvironmentListPage-BX-pV6r7.js +0 -1
  210. package/web/assets/KanbanBoardPage-2muX0OfU.js +0 -4
  211. package/web/assets/KanbanBoardPage-CCl8dmwn.css +0 -1
  212. package/web/assets/KanbanListPage-Bd55W-g7.js +0 -1
  213. package/web/assets/LaunchProjectPage-BrmWhutG.css +0 -1
  214. package/web/assets/LaunchProjectPage-T_i4rXCK.js +0 -1
  215. package/web/assets/LaunchServicesPage-BTOQlL77.js +0 -1
  216. package/web/assets/LaunchServicesPage-CMxUWoNQ.css +0 -1
  217. package/web/assets/LogViewer-CuFkYXkA.js +0 -3
  218. package/web/assets/OrgKeyPrompt-D-cJKqc2.js +0 -1
  219. package/web/assets/ProcessDetailPage-B2cRaSa8.js +0 -1
  220. package/web/assets/ProjectDetailPage-CU5MwlKB.js +0 -1
  221. package/web/assets/ProjectListPage-CxPnsbfh.js +0 -1
  222. package/web/assets/RandomJobTestPage-CYvyOioJ.js +0 -2
  223. package/web/assets/ScenarioEditorPage-BZtO-_y9.js +0 -14
  224. package/web/assets/SendToChatDialog-Da6SFoej.js +0 -1
  225. package/web/assets/ServiceControlsBar-DBUmRI7E.js +0 -1
  226. package/web/assets/ServiceDetailPage-C0OzNuXc.js +0 -2
  227. package/web/assets/ServiceFormPage-BMmeE5tj.js +0 -1
  228. package/web/assets/SettingsPage-Cns9aESc.js +0 -2063
  229. package/web/assets/UnlockPage-BPW506si.js +0 -1
  230. package/web/assets/UnlockPage-BkqsC0ML.css +0 -1
  231. package/web/assets/VariablesTable-CRWySand.js +0 -1
  232. package/web/assets/VaultMigrationPage-B20L2W_w.css +0 -1
  233. package/web/assets/VaultMigrationPage-B6ZfLdDp.js +0 -1
  234. package/web/assets/VersionBadge-BySMTsnj.js +0 -1
  235. package/web/assets/WikiPage-CASqiu3r.js +0 -1
  236. package/web/assets/WikiView-DmspOj63.js +0 -1
  237. package/web/assets/add-scalar-classes-BDawSOVN.js +0 -387
  238. package/web/assets/auth-errors-D_n5Naj5.js +0 -1
  239. package/web/assets/autocomplete-BxToX__C.js +0 -308
  240. package/web/assets/card-C3_Lhxh1.js +0 -32
  241. package/web/assets/cloud-chat.store-HRiNlTnA.js +0 -1
  242. package/web/assets/cloud-session-byVQfdAX.js +0 -1
  243. package/web/assets/column-0QpSlAL6.js +0 -907
  244. package/web/assets/index-B___lI4D.css +0 -1
  245. package/web/assets/interface-content-folder.svg-Dnf4fgjM.js +0 -1
  246. package/web/assets/message-BfLHvehS.js +0 -316
  247. package/web/assets/modal-CveVDU3j.js +0 -5
  248. package/web/assets/modal-DxPwpeSc.js +0 -1
  249. package/web/assets/multiselect-CJ4zRD9O.js +0 -251
  250. package/web/assets/process.store-xpYTF7jB.js +0 -1
  251. package/web/assets/router-BGicJbXI.js +0 -1
  252. package/web/assets/settings-scope-S5iFQlQN.js +0 -1
  253. package/web/assets/settings.store-D0HZbmo_.js +0 -1
  254. package/web/assets/src-wtcksrJO.js +0 -1
  255. package/web/assets/trpc-BFxMUfYl.js +0 -1
  256. package/web/assets/useAiChatDrawer-BJrQ-k2R.js +0 -1
  257. package/web/assets/useCloudOrg-Basge1Jc.js +0 -97
  258. package/web/assets/useCloudOrg-CJNAt-cW.css +0 -1
  259. /package/{agent-manager-JUVAVUIQ.js.map → agent-manager-KM7SFKVR.js.map} +0 -0
  260. /package/web/assets/{abap-BvxTqXT2.js → abap-Q7FyqTce.js} +0 -0
  261. /package/web/assets/{apex-CIPCCkBr.js → apex-DBNDq2a_.js} +0 -0
  262. /package/web/assets/{azcli-Rs0NIwkA.js → azcli-BHW8ozYN.js} +0 -0
  263. /package/web/assets/{bat-BxAhM6gR.js → bat-BL-_3Nfo.js} +0 -0
  264. /package/web/assets/{bicep-oV_ehPcG.js → bicep-DR2vgumW.js} +0 -0
  265. /package/web/assets/{browser-DNbnH79q.js → browser-BOSK4iqQ.js} +0 -0
  266. /package/web/assets/{cameligo-CJLaUyQs.js → cameligo-BCjoEAZU.js} +0 -0
  267. /package/web/assets/{clojure-CjvMureh.js → clojure-zw1Irdul.js} +0 -0
  268. /package/web/assets/{coffee-motWC5XQ.js → coffee-BdEjkiiW.js} +0 -0
  269. /package/web/assets/{cpp-DiWIfYNM.js → cpp-DKUlBIAG.js} +0 -0
  270. /package/web/assets/{csharp-GBlGBeai.js → csharp-BsNC4zVq.js} +0 -0
  271. /package/web/assets/{csp-tSyK5eO1.js → csp-X4Chv5_9.js} +0 -0
  272. /package/web/assets/{css-BkFK9HG_.js → css-Dh0Dlycs.js} +0 -0
  273. /package/web/assets/{cypher-Bcp8PXr2.js → cypher-BL_DRjGX.js} +0 -0
  274. /package/web/assets/{dart-uz9Rxe0M.js → dart-DaM4j487.js} +0 -0
  275. /package/web/assets/{dockerfile-iJizx3Zp.js → dockerfile-Df5WJXAt.js} +0 -0
  276. /package/web/assets/{ecl-BalaS36Z.js → ecl-BjUo3uTs.js} +0 -0
  277. /package/web/assets/{elixir-D6CLrLGy.js → elixir-DrLHYSxt.js} +0 -0
  278. /package/web/assets/{flow9-CFt3-vVY.js → flow9-DKiuX7rg.js} +0 -0
  279. /package/web/assets/{fsharp-DGa7raxa.js → fsharp-CAN78557.js} +0 -0
  280. /package/web/assets/{go-wlqInk4z.js → go-DGjr9vA5.js} +0 -0
  281. /package/web/assets/{graphql-CP1guigM.js → graphql-CcoU3Cj2.js} +0 -0
  282. /package/web/assets/{hcl-CK0UkKD0.js → hcl-udfyCcTm.js} +0 -0
  283. /package/web/assets/{ini-Ch56nrUj.js → ini-BVbXatjh.js} +0 -0
  284. /package/web/assets/{java-C9_WIayl.js → java-Drpmh61g.js} +0 -0
  285. /package/web/assets/{julia-Can2_mhR.js → julia-asFGk-ZV.js} +0 -0
  286. /package/web/assets/{kotlin-DUvGf_BX.js → kotlin-HmkKz1TT.js} +0 -0
  287. /package/web/assets/{less-DoTbG-rc.js → less-C5i2m2Dn.js} +0 -0
  288. /package/web/assets/{lexon-BFMO2_kL.js → lexon-B3Xh2kL6.js} +0 -0
  289. /package/web/assets/{lua-CC-QtBo7.js → lua-DnOtgOOu.js} +0 -0
  290. /package/web/assets/{m3-C51MyH5Q.js → m3-Brj4HNKq.js} +0 -0
  291. /package/web/assets/{markdown-CDwLHhgZ.js → markdown-C3-4Ntpz.js} +0 -0
  292. /package/web/assets/{mips-YuxZtPGU.js → mips-vFQKPHzn.js} +0 -0
  293. /package/web/assets/{msdax-CJjWhmte.js → msdax-D5MYLS2R.js} +0 -0
  294. /package/web/assets/{mysql-B1riwLaD.js → mysql-CRQHhUON.js} +0 -0
  295. /package/web/assets/{objective-c-drXT-gmc.js → objective-c-8cZEp0HR.js} +0 -0
  296. /package/web/assets/{pascal-KUYgrN-Z.js → pascal-BPn_2jro.js} +0 -0
  297. /package/web/assets/{pascaligo-DQmQJP-r.js → pascaligo-L7QnU_8B.js} +0 -0
  298. /package/web/assets/{perl-09XLBmCS.js → perl-B9zSPnp3.js} +0 -0
  299. /package/web/assets/{pgsql-BFj9IFFu.js → pgsql-DiRJukCJ.js} +0 -0
  300. /package/web/assets/{php-UnC5BqwY.js → php-Dv4g8Lhr.js} +0 -0
  301. /package/web/assets/{pla-BFuYrPHG.js → pla-CKAoz6vp.js} +0 -0
  302. /package/web/assets/{postiats-n4ft3jnO.js → postiats-B_PYgUTS.js} +0 -0
  303. /package/web/assets/{powerquery-D-s-oFSc.js → powerquery-CAagSyo-.js} +0 -0
  304. /package/web/assets/{powershell-CTboTf93.js → powershell-Cj9BzLhS.js} +0 -0
  305. /package/web/assets/{protobuf-Dt62GuJP.js → protobuf-DTRY4FFo.js} +0 -0
  306. /package/web/assets/{pug-CEFWkUzw.js → pug-qADGmCS8.js} +0 -0
  307. /package/web/assets/{qsharp-B0DUmgPZ.js → qsharp-xkZT0ZOm.js} +0 -0
  308. /package/web/assets/{r-BVnF0c4T.js → r-C7wfNC2Z.js} +0 -0
  309. /package/web/assets/{redis-DLl3KQXi.js → redis-BoccK80D.js} +0 -0
  310. /package/web/assets/{redshift-cif1I7h1.js → redshift-EL8PjTts.js} +0 -0
  311. /package/web/assets/{restructuredtext-PNfql36m.js → restructuredtext-CA6rgR7C.js} +0 -0
  312. /package/web/assets/{ruby-j3jxDjUN.js → ruby-BymrInur.js} +0 -0
  313. /package/web/assets/{rust-BaIO-mAt.js → rust-BTbPL-fg.js} +0 -0
  314. /package/web/assets/{sb-D8XNVNUQ.js → sb-BTkOICcb.js} +0 -0
  315. /package/web/assets/{scala-DiK9Ps90.js → scala-CzaUHeQF.js} +0 -0
  316. /package/web/assets/{scheme-DPKqXHmF.js → scheme-DZe2DRuY.js} +0 -0
  317. /package/web/assets/{scss-DpMwfP2H.js → scss-D5oFt9cg.js} +0 -0
  318. /package/web/assets/{shell-Dw9mKVg2.js → shell-DCkIF5jZ.js} +0 -0
  319. /package/web/assets/{solidity-DTxo-7fe.js → solidity-CfOO4gXi.js} +0 -0
  320. /package/web/assets/{sophia-BjA3Q87y.js → sophia-0-sROOHR.js} +0 -0
  321. /package/web/assets/{sparql-q1EpMUqb.js → sparql-Dzzr9hol.js} +0 -0
  322. /package/web/assets/{sql-CjcQ4wIr.js → sql-DbXHiHh_.js} +0 -0
  323. /package/web/assets/{st-AuOpxVl7.js → st-DEaYV8xH.js} +0 -0
  324. /package/web/assets/{swift-BUWnv6f7.js → swift-BQItveav.js} +0 -0
  325. /package/web/assets/{systemverilog-FhXn-3OZ.js → systemverilog-nE6YfGlx.js} +0 -0
  326. /package/web/assets/{tcl-B0lqcTtS.js → tcl-Do7Q0SM0.js} +0 -0
  327. /package/web/assets/{twig-B0OeGPVa.js → twig-B2CLZN2j.js} +0 -0
  328. /package/web/assets/{typespec-Bmh6VX11.js → typespec-r9R1AgVi.js} +0 -0
  329. /package/web/assets/{uuid-FpfcaBnR.js → uuid-Q0SWZmaT.js} +0 -0
  330. /package/web/assets/{vb-bmgX6veu.js → vb-DGnD02qr.js} +0 -0
  331. /package/web/assets/{w3c-keyname-2TLn3EjF.js → w3c-keyname-9KQ-4XZl.js} +0 -0
  332. /package/web/assets/{wgsl-FflLnFqI.js → wgsl-C2fD4koY.js} +0 -0
package/index.js CHANGED
@@ -279,7 +279,7 @@ async function main() {
279
279
  ensureNodeBinOnPath();
280
280
  await ensureUserBinsOnPath();
281
281
  if (!isPullEnv) stampConsole();
282
- const { createLocalServer, pullEnv, PullEnvError, registerInstance } = await import("./src-WON4SLMI.js");
282
+ const { createLocalServer, pullEnv, PullEnvError, registerInstance } = await import("./src-6PAM4JRF.js");
283
283
  if (isPullEnv) {
284
284
  if (!serviceArg) {
285
285
  console.error("Error: --service (-s) is required with --pull-env");
@@ -6,6 +6,24 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
6
6
  import { z } from "zod";
7
7
 
8
8
  // ../ai-capabilities/dist/index.js
9
+ function toList(raw) {
10
+ if (!raw) return [];
11
+ const text = raw.trim();
12
+ if (text.startsWith("[")) {
13
+ try {
14
+ const parsed = JSON.parse(text);
15
+ if (Array.isArray(parsed)) return parsed.map((v) => String(v).trim()).filter(Boolean);
16
+ } catch {
17
+ }
18
+ }
19
+ return text.split(",").map((v) => v.trim().replace(/^["'[]+|["'\]]+$/g, "")).filter(Boolean);
20
+ }
21
+ function clearable(raw, parse, key) {
22
+ if (raw === void 0) return {};
23
+ const text = String(raw).trim();
24
+ if (!text || text === "null") return { [key]: null };
25
+ return { [key]: parse(text) };
26
+ }
9
27
  var RUNEYA_CAPABILITIES = [
10
28
  {
11
29
  name: "list_services",
@@ -129,11 +147,11 @@ var RUNEYA_CAPABILITIES = [
129
147
  },
130
148
  {
131
149
  name: "kanban_search_cards",
132
- description: "Search kanban cards by free text, matched against their title and body (accent- and case-insensitive). Searches every board of the organization unless boardId narrows it down.",
150
+ 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.",
133
151
  route: "kanban.searchCards",
134
152
  method: "GET",
135
153
  params: [
136
- { name: "query", description: "Text to look for in card titles and bodies", required: true },
154
+ { name: "query", description: "Text to look for in card titles, bodies and comments", required: true },
137
155
  { name: "boardId", description: "Restrict the search to this board. Omit to search all boards.", required: false },
138
156
  { name: "limit", description: "Maximum number of cards to return (1-100). Default: 25.", required: false },
139
157
  { 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 }
@@ -219,6 +237,71 @@ var RUNEYA_CAPABILITIES = [
219
237
  { name: "content", description: "Card content in markdown", required: false }
220
238
  ],
221
239
  buildInput: (p) => ({ boardId: p.boardId, column: p.column, title: p.title, content: p.content })
240
+ },
241
+ {
242
+ name: "kanban_get_card",
243
+ 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.",
244
+ route: "kanban.getCard",
245
+ method: "GET",
246
+ params: [
247
+ { name: "boardId", description: "The kanban board ID", required: true },
248
+ { name: "cardId", description: "The card ID", required: true }
249
+ ],
250
+ buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId })
251
+ },
252
+ {
253
+ name: "kanban_update_card",
254
+ 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.",
255
+ route: "kanban.updateCard",
256
+ method: "POST",
257
+ params: [
258
+ { name: "boardId", description: "The kanban board ID", required: true },
259
+ { name: "cardId", description: "The card ID", required: true },
260
+ { name: "title", description: "New title", required: false },
261
+ { name: "content", description: "New card content, in markdown", required: false },
262
+ { name: "priority", description: "Priority from 1 to 10, or null to clear it", required: false },
263
+ { name: "color", description: "Card colour, or null to clear it", required: false },
264
+ { name: "groups", description: "Labels, as a list of strings. Replaces the current ones.", required: false },
265
+ { name: "deadline", description: "Due date as YYYY-MM-DD, or null to clear it", required: false },
266
+ { name: "assignees", description: "User ids to assign, as a list. Replaces the current ones; use kanban_list_members to find the ids.", required: false }
267
+ ],
268
+ buildInput: (p) => ({
269
+ boardId: p.boardId,
270
+ cardId: p.cardId,
271
+ ...p.title !== void 0 ? { title: p.title } : {},
272
+ ...p.content !== void 0 ? { content: p.content } : {},
273
+ // Tout arrive en chaîne : un modèle n'écrit pas des nombres, des listes
274
+ // ni des `null` typés. `clearable` distingue « efface » de « ne touche
275
+ // pas » — sans quoi vider une couleur serait impossible à exprimer, et
276
+ // changer un titre risquerait de vider le reste.
277
+ ...clearable(p.priority, (v) => Number(v), "priority"),
278
+ ...clearable(p.color, (v) => v, "color"),
279
+ ...clearable(p.deadline, (v) => v, "deadline"),
280
+ ...p.groups !== void 0 ? { groups: toList(p.groups) } : {},
281
+ ...p.assignees !== void 0 ? { assignees: toList(p.assignees) } : {}
282
+ })
283
+ },
284
+ {
285
+ name: "kanban_set_card_archived",
286
+ 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.",
287
+ route: "kanban.setCardArchived",
288
+ method: "POST",
289
+ params: [
290
+ { name: "boardId", description: "The kanban board ID", required: true },
291
+ { name: "cardId", description: "The card ID", required: true },
292
+ { name: "archived", description: "true to archive, false to bring the card back", required: true }
293
+ ],
294
+ buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, archived: p.archived === "true" })
295
+ },
296
+ {
297
+ name: "kanban_list_members",
298
+ 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.",
299
+ route: "kanban.listMembers",
300
+ method: "GET",
301
+ params: [
302
+ { name: "organizationId", description: "Which organization. Optional: needed only when the account belongs to several and the error message asks for it.", required: false }
303
+ ],
304
+ buildInput: (p) => p.organizationId ? { organizationId: p.organizationId } : {}
222
305
  }
223
306
  ];
224
307
  async function callTrpc(baseUrl, route, method, input, authToken) {
@@ -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"],"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';\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\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 = input as Record<string, string | undefined>;\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\nexport const RUNEYA_CAPABILITIES: RuneyaCapability[] = [\n {\n name: 'list_services',\n description: 'List all available services. Returns serviceId and agentId for each — use these exact fields in other calls.',\n route: 'service.list',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_service_status',\n description: 'Get the current status (running, stopped, etc.) of a 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 and body (accent- and case-insensitive). 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 and bodies', 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 ],\n buildInput: (p) => ({ attachmentId: p.attachmentId }),\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","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/**\n * Build a markdown documentation block injected into runner system prompts.\n * Runners (ClaudeCodeRunner, CodexRunner) use this to know how to call the Runeya API.\n *\n * The generated doc is the single source of truth for all runner-facing API docs —\n * no need to maintain a separate runeya-api-docs.ts.\n */\nexport function buildPromptDocs(baseUrl: string, token: string, capabilities: RuneyaCapability[]): string {\n if (!token) return '';\n\n const lines: string[] = [\n '## Runeya API',\n '',\n `Tu peux interagir avec Runeya via l'API HTTP tRPC ci-dessous.`,\n `Base URL : ${baseUrl}/api/trpc`,\n 'Auth header : Authorization: Bearer $RUNEYA_API_TOKEN',\n '',\n ];\n\n const gets = capabilities.filter(c => c.method === 'GET');\n const posts = capabilities.filter(c => c.method === 'POST');\n\n if (gets.length > 0) {\n lines.push('### GET routes (paramètres en query string ?input=<JSON encodé>)', '');\n for (const cap of gets) {\n const example = cap.params.length > 0\n ? `?input=${JSON.stringify(Object.fromEntries(cap.params.map(p => [p.name === 'serviceId' ? 'id' : p.name, '...'])))}`\n : '';\n lines.push(`- \\`${cap.route}${example}\\` — ${cap.description}`);\n }\n lines.push('');\n }\n\n if (posts.length > 0) {\n lines.push('### POST routes (body JSON)', '');\n for (const cap of posts) {\n const bodyExample = cap.params.length > 0\n ? JSON.stringify(Object.fromEntries(cap.params.map(p => [p.name === 'serviceId' ? 'processId' : p.name, '...'])))\n : '{}';\n lines.push(`- \\`${cap.route}\\` — \\`${bodyExample}\\``);\n }\n lines.push('');\n }\n\n const hints = capabilities.filter(c => c.usageHint);\n if (hints.length > 0) {\n lines.push('### Usage hints', '');\n for (const cap of hints) {\n lines.push(`- ${cap.usageHint}`);\n }\n lines.push('');\n }\n\n lines.push(\n '### Exemple curl',\n '',\n '```bash',\n `curl -H \"Authorization: Bearer $RUNEYA_API_TOKEN\" \\\\`,\n ` \"${baseUrl}/api/trpc/service.list\"`,\n '',\n `curl -X POST -H \"Authorization: Bearer $RUNEYA_API_TOKEN\" \\\\`,\n ' -H \"Content-Type: application/json\" \\\\',\n ` -d '{\"agentId\":\"local\",\"processId\":\"my-service\"}' \\\\`,\n ` \"${baseUrl}/api/trpc/process.start\"`,\n '```',\n '',\n 'La réponse est de la forme `{\"result\":{\"data\":<résultat>}}`.',\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"],"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"],"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';\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\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 = input as Record<string, string | undefined>;\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\nexport const RUNEYA_CAPABILITIES: RuneyaCapability[] = [\n {\n name: 'list_services',\n description: 'List all available services. Returns serviceId and agentId for each — use these exact fields in other calls.',\n route: 'service.list',\n method: 'GET',\n params: [],\n buildInput: () => undefined,\n },\n {\n name: 'get_service_status',\n description: 'Get the current status (running, stopped, etc.) of a 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 ],\n buildInput: (p) => ({ attachmentId: p.attachmentId }),\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","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/**\n * Build a markdown documentation block injected into runner system prompts.\n * Runners (ClaudeCodeRunner, CodexRunner) use this to know how to call the Runeya API.\n *\n * The generated doc is the single source of truth for all runner-facing API docs —\n * no need to maintain a separate runeya-api-docs.ts.\n */\nexport function buildPromptDocs(baseUrl: string, token: string, capabilities: RuneyaCapability[]): string {\n if (!token) return '';\n\n const lines: string[] = [\n '## Runeya API',\n '',\n `Tu peux interagir avec Runeya via l'API HTTP tRPC ci-dessous.`,\n `Base URL : ${baseUrl}/api/trpc`,\n 'Auth header : Authorization: Bearer $RUNEYA_API_TOKEN',\n '',\n ];\n\n const gets = capabilities.filter(c => c.method === 'GET');\n const posts = capabilities.filter(c => c.method === 'POST');\n\n if (gets.length > 0) {\n lines.push('### GET routes (paramètres en query string ?input=<JSON encodé>)', '');\n for (const cap of gets) {\n const example = cap.params.length > 0\n ? `?input=${JSON.stringify(Object.fromEntries(cap.params.map(p => [p.name === 'serviceId' ? 'id' : p.name, '...'])))}`\n : '';\n lines.push(`- \\`${cap.route}${example}\\` — ${cap.description}`);\n }\n lines.push('');\n }\n\n if (posts.length > 0) {\n lines.push('### POST routes (body JSON)', '');\n for (const cap of posts) {\n const bodyExample = cap.params.length > 0\n ? JSON.stringify(Object.fromEntries(cap.params.map(p => [p.name === 'serviceId' ? 'processId' : p.name, '...'])))\n : '{}';\n lines.push(`- \\`${cap.route}\\` — \\`${bodyExample}\\``);\n }\n lines.push('');\n }\n\n const hints = capabilities.filter(c => c.usageHint);\n if (hints.length > 0) {\n lines.push('### Usage hints', '');\n for (const cap of hints) {\n lines.push(`- ${cap.usageHint}`);\n }\n lines.push('');\n }\n\n lines.push(\n '### Exemple curl',\n '',\n '```bash',\n `curl -H \"Authorization: Bearer $RUNEYA_API_TOKEN\" \\\\`,\n ` \"${baseUrl}/api/trpc/service.list\"`,\n '',\n `curl -X POST -H \"Authorization: Bearer $RUNEYA_API_TOKEN\" \\\\`,\n ' -H \"Content-Type: application/json\" \\\\',\n ` -d '{\"agentId\":\"local\",\"processId\":\"my-service\"}' \\\\`,\n ` \"${baseUrl}/api/trpc/process.start\"`,\n '```',\n '',\n 'La réponse est de la forme `{\"result\":{\"data\":<résultat>}}`.',\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"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runeya/runeya",
3
- "version": "2.0.77",
3
+ "version": "2.0.79",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "runeya": "./index.js"