@runeya/runeya 2.0.10 → 2.0.13
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.
- package/agent/index.js +434 -28
- package/agent/index.js.map +1 -1
- package/agent-manager-3DHUF2DC-KN6O7WSA.js +8 -0
- package/{chunk-DODGBBTE.js → chunk-AJW7LDO5.js} +28 -8
- package/chunk-AJW7LDO5.js.map +1 -0
- package/{dist-HZBWBT6S.js → dist-HGCFHXO4.js} +1308 -408
- package/dist-HGCFHXO4.js.map +1 -0
- package/index.js +5 -1
- package/index.js.map +1 -1
- package/mcp-server/index.js +139 -1
- package/mcp-server/index.js.map +1 -1
- package/package.json +1 -1
- package/web/assets/{AddressBar.vue-D_8vQPIF.js → AddressBar.vue-B6BOLYmO.js} +1 -1
- package/web/assets/AgentScalarChatInterface.vue-DKSmjtvV.js +13 -0
- package/web/assets/AgentTerminalPage-BZ6jaRAs.js +1 -0
- package/web/assets/AgentTerminalPage-anYDkj7H.css +1 -0
- package/web/assets/AiChatPage-C1r42kX7.js +1 -0
- package/web/assets/AppLayout-B7-y0tBI.css +1 -0
- package/web/assets/AppLayout-DnMCPCO8.js +1 -0
- package/web/assets/AuditPage-CTdEvLE-.js +1 -0
- package/web/assets/{CodeInput.vue-nIhSM0FX.js → CodeInput.vue-Sp2dM8hl.js} +1 -1
- package/web/assets/{Collection.vue-CkwnxBu4.js → Collection.vue-CdPjaC9d.js} +1 -1
- package/web/assets/{CollectionAuthentication.vue-CiZinGpr.js → CollectionAuthentication.vue-DMPykUah.js} +1 -1
- package/web/assets/CollectionCookies.vue-DqNgVtd-.js +1 -0
- package/web/assets/{CollectionEnvironment.vue-3bWtuG1B.js → CollectionEnvironment.vue-DKab6xJJ.js} +1 -1
- package/web/assets/{CollectionOverview.vue-BheZFfD3.js → CollectionOverview.vue-DlODh8Vk.js} +1 -1
- package/web/assets/CollectionScripts.vue-B2gkfo4d.js +1 -0
- package/web/assets/{CollectionServers.vue-Ja8mYDaK.js → CollectionServers.vue-Br-QackN.js} +1 -1
- package/web/assets/{CollectionSettings.vue-DOB9JUg8.js → CollectionSettings.vue-Cm6NQbDm.js} +1 -1
- package/web/assets/CollectionSync.vue-bB7sdahP.js +1 -0
- package/web/assets/{CommandActionInput.vue-BBijVqe7.js → CommandActionInput.vue-CZ3-rqSL.js} +1 -1
- package/web/assets/{Cookies.vue-DgVzSolJ.js → Cookies.vue-Duz-a-ga.js} +1 -1
- package/web/assets/DashboardPage-hIc9wP_Q.js +1 -0
- package/web/assets/{DataTable.vue-DXTWz2Vi.js → DataTable.vue-Dorr-r7J.js} +1 -1
- package/web/assets/{DataTableCheckbox.vue-BA5yHmxd.js → DataTableCheckbox.vue-CATn-YYp.js} +1 -1
- package/web/assets/{DataTableHeader.vue-U2le7KBO.js → DataTableHeader.vue-C3SUSaR8.js} +1 -1
- package/web/assets/{DataTableInput.vue-DpeNUUXc.js → DataTableInput.vue-_06pwPUA.js} +1 -1
- package/web/assets/{DeleteSidebarListElement.vue-C2SV2geU.js → DeleteSidebarListElement.vue-DoqRnMXx.js} +1 -1
- package/web/assets/{EditSidebarListElement.vue-DvvYjTMO.js → EditSidebarListElement.vue-BqTw6Tho.js} +1 -1
- package/web/assets/{EditorIcon-BPEaZrXC.js → EditorIcon-CbpIT0A1.js} +1 -1
- package/web/assets/{EmptyState.vue-Be8_w2rR.js → EmptyState.vue-Bur5L0a4.js} +1 -1
- package/web/assets/{Environment.vue-D0PdeVIp.js → Environment.vue-C50lH9cP.js} +1 -1
- package/web/assets/{EnvironmentForm-Dm3dFrSU.js → EnvironmentForm-BDfzXuHx.js} +2 -2
- package/web/assets/EnvironmentFormPage-CLylRN6B.js +1 -0
- package/web/assets/EnvironmentListPage-DlUT6LnX.js +1 -0
- package/web/assets/{EnvironmentModal.vue-Bssf0U5X.js → EnvironmentModal.vue-Dz5CArRX.js} +1 -1
- package/web/assets/EnvironmentSelector-DHoYUCTH.js +1 -0
- package/web/assets/{Form.vue-Dv4a31zh.js → Form.vue-BzZCMgN1.js} +1 -1
- package/web/assets/{IconSelector.vue-BsYvff6K.js → IconSelector.vue-BCmeqlrs.js} +1 -1
- package/web/assets/KanbanBoardPage-DoXgFMvo.js +141 -0
- package/web/assets/{KanbanBoardPage-7nOYpwHn.css → KanbanBoardPage-hqNojI5j.css} +1 -1
- package/web/assets/KanbanListPage-BLdNz80q.js +1 -0
- package/web/assets/LaunchProjectPage-DjRA2D3h.js +1 -0
- package/web/assets/LaunchServicesPage-CKaGcu3z.js +1 -0
- package/web/assets/LogViewer-CtX_6uFM.js +3 -0
- package/web/assets/{ProcessControls-DfFxf6jZ.js → ProcessControls-BY-_9zo7.js} +1 -1
- package/web/assets/ProcessDetailPage-Bqis1qMA.js +1 -0
- package/web/assets/{ProcessMetrics-CLa8mdh2.js → ProcessMetrics-DQybvwcA.js} +2 -2
- package/web/assets/ProjectDetailPage-FBPonwd5.js +1 -0
- package/web/assets/ProjectListPage-xwlVXN8A.js +1 -0
- package/web/assets/{RandomJobTestPage-D2OB5pqD.js → RandomJobTestPage-0pqne-FD.js} +1 -1
- package/web/assets/{Request.vue-DHQd9eyp.js → Request.vue-Db4XEPKt.js} +1 -1
- package/web/assets/{RequestAuth.vue-CEVOgzEk.js → RequestAuth.vue-CK1A6ySt.js} +1 -1
- package/web/assets/RequestRoot.vue-BLF0GGT5.js +19 -0
- package/web/assets/{ScalarAsciiArt.vue-CyYmv9BB.js → ScalarAsciiArt.vue-BPdUsXWj.js} +1 -1
- package/web/assets/{ScalarIconEyeSlash.vue-qR90sHHe.js → ScalarIconEyeSlash.vue-BBDBShRO.js} +1 -1
- package/web/assets/{ScalarIconTrash.vue-Ll6Zw6_W.js → ScalarIconTrash.vue-Tpr15aNY.js} +1 -1
- package/web/assets/ScenarioEditorPage-DNuo-2Gi.js +14 -0
- package/web/assets/{ServerVariablesForm.vue-D9sjD4AT.js → ServerVariablesForm.vue-XLQ145gw.js} +1 -1
- package/web/assets/ServiceControlsBar-CCTGcA1t.js +1 -0
- package/web/assets/{ServiceDetailPage-znbWajpt.css → ServiceDetailPage-BELECRic.css} +1 -1
- package/web/assets/ServiceDetailPage-UVg73scN.js +2 -0
- package/web/assets/ServiceFormPage-F3boRKs-.js +1 -0
- package/web/assets/{Settings.vue-DWPIjz57.js → Settings.vue-D_1yQu6i.js} +1 -1
- package/web/assets/SettingsPage-Cg78lQZF.js +225 -0
- package/web/assets/SetupKeyPage-BcaSoLjU.js +1 -0
- package/web/assets/SetupPage-mCVAKLtm.js +1 -0
- package/web/assets/{Sidebar.vue-DVHNacfA.js → Sidebar.vue-De4YlW0c.js} +1 -1
- package/web/assets/{SidebarButton.vue-C4QDgSym.js → SidebarButton.vue-CctYiTRp.js} +1 -1
- package/web/assets/{SidebarListElement.vue-Ch1aI_Bz.js → SidebarListElement.vue-Cv7jUZIM.js} +1 -1
- package/web/assets/UnlockPage-BSpzyZnd.js +1 -0
- package/web/assets/VariablesTable-Dn3IvplD.js +1 -0
- package/web/assets/{VariablesTable-BtdK5olT.css → VariablesTable-W4rxlL35.css} +1 -1
- package/web/assets/{ViewLayout.vue-svdAMKVP.js → ViewLayout.vue-fiagi8zc.js} +1 -1
- package/web/assets/{ViewLayoutContent.vue-CAixUN8B.js → ViewLayoutContent.vue-BehGrsED.js} +1 -1
- package/web/assets/{ViewLayoutSection.vue-C9VAyihF.js → ViewLayoutSection.vue-D4icCgQI.js} +1 -1
- package/web/assets/{active-entities-Dpd4ny38.js → active-entities-CkBGjwu9.js} +1 -1
- package/web/assets/api-reference-D1EfYtPj.js +1 -0
- package/web/assets/{autocomplete-Do-EC8XW.js → autocomplete-CjBHTJWh.js} +4 -4
- package/web/assets/{card-CeTOcGyS.js → card-CsmU2iiY.js} +1 -1
- package/web/assets/{checkbox-C2hHZbMO.js → checkbox-B5XZqi1U.js} +3 -3
- package/web/assets/{chip-CD3EONN7.js → chip-C4pSomPm.js} +1 -1
- package/web/assets/column-CR3Hix4J.js +763 -0
- package/web/assets/{core-Dq8cnTTd.js → core-CtGUajLi.js} +1 -1
- package/web/assets/cssMode-nuznbveH.js +4 -0
- package/web/assets/{dist-CQoPOD_o.js → dist--ZlcDulO.js} +11 -11
- package/web/assets/{dist-BmCpMB7W.js → dist-CXkMrHNP.js} +1 -1
- package/web/assets/{dist-US_vG96F.js → dist-DH_zJr7W.js} +1 -1
- package/web/assets/{dist-CiBpb7F_.js → dist-WjGUyWSO.js} +1 -1
- package/web/assets/{divider-C7F2jaMI.js → divider-CnJlD7qO.js} +1 -1
- package/web/assets/{fieldset-kJDAoVaz.js → fieldset-D9zY6R6s.js} +1 -1
- package/web/assets/{freemarker2-qyf3DfQl.js → freemarker2-Bw43sOne.js} +1 -1
- package/web/assets/handlebars-C8qgW7u6.js +1 -0
- package/web/assets/html-Dy9PKnkr.js +1 -0
- package/web/assets/htmlMode-o8EU0tqo.js +4 -0
- package/web/assets/index-9i25DNQ4.css +1 -0
- package/web/assets/index-CIcE6DNv.js +4308 -0
- package/web/assets/{javascript-Nwj2LVeE.js → javascript-CuRngcUR.js} +1 -1
- package/web/assets/{jsonMode-xQ2R28Fq.js → jsonMode-CsUIxwQq.js} +1 -1
- package/web/assets/{keyboard-CidI6qyD.js → keyboard-DhkINir5.js} +1 -1
- package/web/assets/{lib-Bpt_o5V9.js → lib-E9M4L9vE.js} +1 -1
- package/web/assets/{library-CcEqwrWR.js → library-BXoSag-V.js} +1 -1
- package/web/assets/liquid-CraMnqaK.js +1 -0
- package/web/assets/mdx-DPSW5q1A.js +1 -0
- package/web/assets/{mediaTypes-pLZCmXiT.js → mediaTypes-DDACekzr.js} +1 -1
- package/web/assets/{message-B6M86BRU.js → message-DKOCajc6.js} +1 -1
- package/web/assets/{minus-wesZvWq4.js → minus-CtlH9Syh.js} +1 -1
- package/web/assets/{multiselect-CHEmtEFg.js → multiselect-sshNnjnF.js} +3 -3
- package/web/assets/{password-ISam7EYg.js → password-Dv9g39jb.js} +4 -4
- package/web/assets/{plus-BBMmFC_c.js → plus-CG5Ui-l-.js} +6 -6
- package/web/assets/{pretty-ms-Bj2IaA2r.js → pretty-ms-D2BVTeMx.js} +1 -1
- package/web/assets/process.store-CutdTiYB.js +1 -0
- package/web/assets/project.store-CVbXSH5d.js +1 -0
- package/web/assets/python-BLq8fVkV.js +1 -0
- package/web/assets/{radiobutton-DwoOAEAF.js → radiobutton-Bz_ltBfM.js} +2 -2
- package/web/assets/razor-CVrBU-Fk.js +1 -0
- package/web/assets/router-CuxdGfLF.js +1 -0
- package/web/assets/{settings.store-BGScNTnu.js → settings.store-vM-8jbAF.js} +1 -1
- package/web/assets/store-CTKZgNiD.js +1840 -0
- package/web/assets/{tabpanel-DBInUEl5.js → tabpanel-DaZzgdrv.js} +3 -3
- package/web/assets/trpc-BIjF6nTt.js +1 -0
- package/web/assets/{tsMode-C7uad5vV.js → tsMode-DO5zEzzD.js} +1 -1
- package/web/assets/typescript-Do-K_3Jj.js +1 -0
- package/web/assets/{urls-BuNgEu0U.js → urls-BlVUwVFM.js} +1 -1
- package/web/assets/{use-tree-walker-CJHEPXgB.js → use-tree-walker-xoEX554A.js} +1 -1
- package/web/assets/useAiChatDrawer-BJugMTj0.js +1 -0
- package/web/assets/{useClipboard-DtO-z5Ls.js → useClipboard-B3J6cGK-.js} +1 -1
- package/web/assets/{useLayout-D-FCdkqa.js → useLayout-DHrumlpr.js} +1 -1
- package/web/assets/{usePluginManager-CPTBi3rk.js → usePluginManager-BEbBxZnF.js} +1 -1
- package/web/assets/{useSidebar-BoK12gD1.js → useSidebar-BCBwVF2x.js} +1 -1
- package/web/assets/{vue-router-DSROI5EH.js → vue-router-CuFIegGa.js} +1 -1
- package/web/assets/xml-BolCsFLY.js +1 -0
- package/web/assets/yaml-5iZTkCV3.js +1 -0
- package/web/index.html +2 -2
- package/agent-manager-A4E5CXFT-6PJDFN7J.js +0 -8
- package/chunk-DODGBBTE.js.map +0 -1
- package/dist-HZBWBT6S.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-Be-LbA03.js +0 -13
- package/web/assets/AgentTerminalPage-BZmmd1H1.js +0 -36
- package/web/assets/AgentTerminalPage-EX_n6P3x.css +0 -1
- package/web/assets/AiChatPage-kTk6yC6d.js +0 -1
- package/web/assets/AppLayout-CDtyYNWp.css +0 -1
- package/web/assets/AppLayout-jbNML_m4.js +0 -1
- package/web/assets/AuditPage-S4kDjrZ5.js +0 -1
- package/web/assets/CollectionCookies.vue-BLEJqAhX.js +0 -1
- package/web/assets/CollectionScripts.vue-CsY6tWxk.js +0 -1
- package/web/assets/CollectionSync.vue-B-uKwdTU.js +0 -1
- package/web/assets/DashboardPage-BwZPpURp.js +0 -1
- package/web/assets/EnvironmentFormPage-ByVELlly.js +0 -1
- package/web/assets/EnvironmentListPage-DvaTK4NF.js +0 -1
- package/web/assets/EnvironmentSelector-4kpQpg5e.js +0 -1
- package/web/assets/KanbanBoardPage-7rLK-ucb.js +0 -141
- package/web/assets/KanbanListPage-Dn35VrDc.js +0 -1
- package/web/assets/LaunchProjectPage-Byemtd9C.js +0 -1
- package/web/assets/LaunchServicesPage-CHiV6T5Y.js +0 -1
- package/web/assets/LogViewer-KtrKiUZw.js +0 -3
- package/web/assets/ProcessDetailPage-BOI85Xo7.js +0 -1
- package/web/assets/ProjectDetailPage-CTEt0DSq.js +0 -1
- package/web/assets/ProjectListPage-BrTIxp9K.js +0 -1
- package/web/assets/RequestRoot.vue-BEtC7IEP.js +0 -19
- package/web/assets/ScenarioEditorPage-xCx9aW1X.js +0 -14
- package/web/assets/ServiceControlsBar-DKYIgScL.js +0 -1
- package/web/assets/ServiceDetailPage-B5qBCc9A.js +0 -2
- package/web/assets/ServiceFormPage-BNpWmyj_.js +0 -1
- package/web/assets/SettingsPage-C5lWJT0Z.js +0 -225
- package/web/assets/SetupKeyPage-BiqO4PQr.js +0 -1
- package/web/assets/SetupPage-FEUuQSQ2.js +0 -1
- package/web/assets/UnlockPage-Dhg0hoP-.js +0 -1
- package/web/assets/VariablesTable-DFJHJ9DF.js +0 -1
- package/web/assets/api-reference-C9jD1TQ9.js +0 -1
- package/web/assets/column-xfOef4Rh.js +0 -763
- package/web/assets/cssMode-BzsFOrHs.js +0 -4
- package/web/assets/editor.store-Dzhoqquh.js +0 -1
- package/web/assets/handlebars-Dt_j38Ok.js +0 -1
- package/web/assets/html-BM6JBSDe.js +0 -1
- package/web/assets/htmlMode-BWrj-eTf.js +0 -4
- package/web/assets/index-DXutsd9M.css +0 -1
- package/web/assets/index-Dviyssba.js +0 -4220
- package/web/assets/liquid-CNc1r-Ln.js +0 -1
- package/web/assets/mdx-D5yTipSh.js +0 -1
- package/web/assets/process.store-cvjJzD3H.js +0 -1
- package/web/assets/project.store-C94-7i6c.js +0 -1
- package/web/assets/python-BOLsEvIQ.js +0 -1
- package/web/assets/razor-JsBDv4HY.js +0 -1
- package/web/assets/router-BgHCboHx.js +0 -1
- package/web/assets/store-a88gBDkh.js +0 -1840
- package/web/assets/tag-CQlI4fJK.js +0 -54
- package/web/assets/trpc-CgAubgRH.js +0 -1
- package/web/assets/typescript-C2IozRX9.js +0 -1
- package/web/assets/useAiChatDrawer-D6TRHaNu.js +0 -1
- package/web/assets/xml-DtJwg-5S.js +0 -1
- package/web/assets/yaml-sPGHMYDm.js +0 -1
- /package/{agent-manager-A4E5CXFT-6PJDFN7J.js.map → agent-manager-3DHUF2DC-KN6O7WSA.js.map} +0 -0
- /package/web/assets/{_plugin-vue_export-helper-BVSTY9ge.js → _plugin-vue_export-helper-C08BWUE4.js} +0 -0
- /package/web/assets/{abap-BF8nUS5p.js → abap-BMPR0rjj.js} +0 -0
- /package/web/assets/{apex-Bbj_Fak2.js → apex-DYC4uYYf.js} +0 -0
- /package/web/assets/{azcli-B8w3JS7J.js → azcli-GZlxEjpa.js} +0 -0
- /package/web/assets/{base64-CG47Jc3Y.js → base64-VLYHbiMn.js} +0 -0
- /package/web/assets/{bat-CaNuqacB.js → bat-Cv8OxItG.js} +0 -0
- /package/web/assets/{bicep-DAvnLugW.js → bicep-CuCbE6Ue.js} +0 -0
- /package/web/assets/{cameligo-BlI8LCmP.js → cameligo-BEPX3585.js} +0 -0
- /package/web/assets/{clojure-CxxhrBQl.js → clojure--6rbXIPY.js} +0 -0
- /package/web/assets/{coffee-SkbnTBhO.js → coffee-ByvVcDGX.js} +0 -0
- /package/web/assets/{cpp-Dm2HJxj0.js → cpp-CECtPnZp.js} +0 -0
- /package/web/assets/{csharp-BOGHPGcq.js → csharp-DyYyZ8UX.js} +0 -0
- /package/web/assets/{csp-CMA_7tOs.js → csp-B9apvcI9.js} +0 -0
- /package/web/assets/{css-DU8LSGcn.js → css-CfdBNbB0.js} +0 -0
- /package/web/assets/{cypher-BZPsEDmT.js → cypher-BPqQq4XX.js} +0 -0
- /package/web/assets/{dart-C1tIJhFk.js → dart-BLToxiYU.js} +0 -0
- /package/web/assets/{dist-BPIMeATj.js → dist-COg0nRYK.js} +0 -0
- /package/web/assets/{dockerfile-z4dmGi5q.js → dockerfile-CKo5jN7V.js} +0 -0
- /package/web/assets/{ecl-Rv9JwhOI.js → ecl-qo8pi1Ty.js} +0 -0
- /package/web/assets/{elixir-DL6xFSed.js → elixir-Dv1YAMPJ.js} +0 -0
- /package/web/assets/{flow9-DFZ52-2d.js → flow9-BKTKs1nN.js} +0 -0
- /package/web/assets/{fsharp-RvVOB9Dm.js → fsharp-BPoxgmtD.js} +0 -0
- /package/web/assets/{go-B2USMDMv.js → go-DgJ-2ryf.js} +0 -0
- /package/web/assets/{graphql-CsHpCYeJ.js → graphql-YTK8zpFe.js} +0 -0
- /package/web/assets/{hcl-CK021J-J.js → hcl-tYOvwaJ3.js} +0 -0
- /package/web/assets/{ini-v1EoSUxR.js → ini-BTZ3lNbM.js} +0 -0
- /package/web/assets/{java-CUXpSPxY.js → java-boRe0CIQ.js} +0 -0
- /package/web/assets/{julia-DwKveiZg.js → julia-K6BtoWYX.js} +0 -0
- /package/web/assets/{kotlin-SsG_4ZBt.js → kotlin-CglG00z4.js} +0 -0
- /package/web/assets/{less-BviquM8A.js → less-DlnIYk4g.js} +0 -0
- /package/web/assets/{lexon-C8G_qWst.js → lexon-D4aKXJ0J.js} +0 -0
- /package/web/assets/{lua-xqYje_o5.js → lua-DeQCQ0IN.js} +0 -0
- /package/web/assets/{m3-B5PetinG.js → m3-yCjRJP_i.js} +0 -0
- /package/web/assets/{markdown-BksexNux.js → markdown-C2IT79AR.js} +0 -0
- /package/web/assets/{mips-DKSTezUQ.js → mips-BAnhwv_D.js} +0 -0
- /package/web/assets/{msdax-SeFNE86e.js → msdax-D1jHDTih.js} +0 -0
- /package/web/assets/{mysql-5TQWJDdB.js → mysql-CTJU-jL7.js} +0 -0
- /package/web/assets/{objective-c-DeaYl08g.js → objective-c-CwxzUA28.js} +0 -0
- /package/web/assets/{pascal-CGBtIfZg.js → pascal-DpSQp86i.js} +0 -0
- /package/web/assets/{pascaligo-B85wuk0w.js → pascaligo-C4F0Gc12.js} +0 -0
- /package/web/assets/{perl-Bl61zsEQ.js → perl-87HvGh3u.js} +0 -0
- /package/web/assets/{pgsql-KgXv5Cq7.js → pgsql-DUB3YVHd.js} +0 -0
- /package/web/assets/{php-KRRf0kxu.js → php-gpgbnwXh.js} +0 -0
- /package/web/assets/{pla-CFpO6lSz.js → pla-9VH1h0qA.js} +0 -0
- /package/web/assets/{postiats-B0jQ-DXO.js → postiats-DYNil0RB.js} +0 -0
- /package/web/assets/{powerquery-T9Ge5xUx.js → powerquery-Cyj_QMWN.js} +0 -0
- /package/web/assets/{powershell-rmYjKoE4.js → powershell-BxsWzjwy.js} +0 -0
- /package/web/assets/{protobuf-B--9ME3E.js → protobuf-CpB35fc2.js} +0 -0
- /package/web/assets/{pug-y0-ppnAV.js → pug-CQ3BHXrf.js} +0 -0
- /package/web/assets/{qsharp-DobgOAC8.js → qsharp-hvdiA16n.js} +0 -0
- /package/web/assets/{r-BHQZIThn.js → r-BcpSD-1e.js} +0 -0
- /package/web/assets/{redis-DMHMVIni.js → redis-B2JGUU7L.js} +0 -0
- /package/web/assets/{redshift-ilRjY5HF.js → redshift-DtV7K8A1.js} +0 -0
- /package/web/assets/{restructuredtext-jr4YYJbv.js → restructuredtext-avYcqBCA.js} +0 -0
- /package/web/assets/{ruby-D-h_0NIs.js → ruby-B75_Tp8C.js} +0 -0
- /package/web/assets/{rust-VxeTSQU2.js → rust-CHon-ZXH.js} +0 -0
- /package/web/assets/{sb-BlhKufrP.js → sb-iehvyQKY.js} +0 -0
- /package/web/assets/{scala-IAk6nSCU.js → scala-LBw1ennX.js} +0 -0
- /package/web/assets/{scheme-Dggdm5LS.js → scheme-BRK_sKgt.js} +0 -0
- /package/web/assets/{scss-Bzj9Cp1q.js → scss-CzbUsG5V.js} +0 -0
- /package/web/assets/{shell-CSwYJdGJ.js → shell-DdtWj1FH.js} +0 -0
- /package/web/assets/{solidity-DnWqIXnk.js → solidity-CBYPsj6K.js} +0 -0
- /package/web/assets/{sophia-ClaYC_5N.js → sophia-BAmZLhFu.js} +0 -0
- /package/web/assets/{sparql-CfjIZAcz.js → sparql-DzxQz_25.js} +0 -0
- /package/web/assets/{sql-DxdJ7snd.js → sql-CtZa8xg5.js} +0 -0
- /package/web/assets/{st-DJgQE1uj.js → st-3yAXYt2f.js} +0 -0
- /package/web/assets/{swift-5cz3wIvv.js → swift-nwo4k0Qx.js} +0 -0
- /package/web/assets/{systemverilog-C8-7QuIt.js → systemverilog-38mUSYaO.js} +0 -0
- /package/web/assets/{tcl-C99u42o5.js → tcl-DfkL3MZ2.js} +0 -0
- /package/web/assets/{twig-Cv9kOcBK.js → twig-C2_DTvv-.js} +0 -0
- /package/web/assets/{typespec-DF1s-ehc.js → typespec-Dn7A_7aO.js} +0 -0
- /package/web/assets/{uuid-6HQMUkhT.js → uuid-H0yY5A03.js} +0 -0
- /package/web/assets/{vb-4mpz9ITX.js → vb-ByZEqbuQ.js} +0 -0
- /package/web/assets/{w3c-keyname-emj7Fjc1.js → w3c-keyname-CXRaQfIQ.js} +0 -0
- /package/web/assets/{wgsl-xExw6Z08.js → wgsl-BqCLRRs9.js} +0 -0
package/index.js
CHANGED
|
@@ -51,6 +51,10 @@ if (targetDir) {
|
|
|
51
51
|
const resolved = resolve(targetDir);
|
|
52
52
|
process.chdir(resolved);
|
|
53
53
|
console.log(`[cli] Working directory: ${resolved}`);
|
|
54
|
+
} else if (process.env["DATA_DIR"]) {
|
|
55
|
+
const resolved = resolve(process.env["DATA_DIR"], "..");
|
|
56
|
+
process.chdir(resolved);
|
|
57
|
+
console.log(`[cli] Working directory: ${resolved} (from DATA_DIR)`);
|
|
54
58
|
}
|
|
55
59
|
dotenv.config({ quiet: true });
|
|
56
60
|
if (args.includes("--help") || args.includes("-h")) {
|
|
@@ -148,7 +152,7 @@ function listenWithRetry(server, port, host, wss, maxRetries = 20, delay = 500)
|
|
|
148
152
|
});
|
|
149
153
|
}
|
|
150
154
|
async function main() {
|
|
151
|
-
const { createLocalServer, pullEnv, PullEnvError } = await import("./dist-
|
|
155
|
+
const { createLocalServer, pullEnv, PullEnvError } = await import("./dist-HGCFHXO4.js");
|
|
152
156
|
if (isPullEnv) {
|
|
153
157
|
if (!serviceArg) {
|
|
154
158
|
console.error("Error: --service (-s) is required with --pull-env");
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/port-resolution.ts"],"sourcesContent":["#!/usr/bin/env node\nimport type { Server } from 'node:http';\nimport type { WebSocketServer } from 'ws';\nimport type { Request, Response } from 'express';\nimport { fileURLToPath, URL as NodeURL } from 'node:url';\nimport { dirname, join, resolve } from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport express from 'express';\nimport dotenv from 'dotenv'\nimport open from 'open';\nimport { resolvePort } from './port-resolution.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst { version } = JSON.parse(\n readFileSync(new NodeURL('./package.json', import.meta.url), 'utf8'),\n) as { version: string };\n\nfunction printStartupTable(port: number, appUrl: string): void {\n const rows: [string, string][] = [\n ['Version', version],\n ['Port', String(port)],\n ['Url', appUrl],\n ];\n\n const col0 = Math.max(...rows.map(([k]) => k.length));\n const col1 = Math.max(...rows.map(([, v]) => v.length));\n\n const pad = (s: string, n: number) => s.padEnd(n);\n const hr = (l: string, m: string, r: string, f: string) =>\n l + f.repeat(col0 + 2) + m + f.repeat(col1 + 2) + r;\n\n console.log('');\n console.log(hr('┌', '┬', '┐', '─'));\n for (const [key, value] of rows) {\n console.log(`│ ${pad(key, col0)} │ ${pad(value, col1)} │`);\n }\n console.log(hr('└', '┴', '┘', '─'));\n console.log('');\n}\n\n// Parse CLI flags\nconst args = process.argv.slice(2);\n\n// Resolve target directory (first positional arg, skipping flag values)\nconst flagsWithValues = new Set(['--host', '--port', '-e', '--environment', '-s', '--service']);\nconst targetDir = args.find((a, i) => !a.startsWith('-') && !flagsWithValues.has(args[i - 1] ?? ''));\nif (targetDir) {\n const resolved = resolve(targetDir);\n process.chdir(resolved);\n console.log(`[cli] Working directory: ${resolved}`);\n}\n\ndotenv.config({ quiet: true });\n\nif (args.includes('--help') || args.includes('-h')) {\n console.log(`Usage: runeya [path-to-your-stack] [options]\n\nOptions:\n --version Show version number\n --pe, --pull-env Print env vars for a service to stdout (requires -e and -s)\n -e, --environment <n> Environment name or id\n -s, --service <name> Service name or id\n --lan Expose server on the local network (shortcut for --host 0.0.0.0)\n --host <address> Host to bind to (default: 127.0.0.1)\n --no-open Do not open browser on startup\n --agent Run as agent only (no server, no UI) — for remote machines\n -h, --help Show this help message\n`);\n process.exit(0);\n}\n\nif (args.includes('--version')) {\n console.log(version);\n process.exit(0);\n}\n\nconst noOpen =\n args.includes('--no-open') ||\n !!process.env['VITEST'] ||\n !!process.env['CI'] ||\n process.env['NODE_ENV'] === 'test';\n\n// --pull-env flag — detect early so we can silence stdout before any log\nconst isPullEnv = args.includes('--pull-env') || args.includes('--pe');\n\n// In pull-env mode, redirect console.log/info to stderr so only KEY=VALUE goes to stdout\nif (isPullEnv) {\n const toStderr = (...a: unknown[]) => process.stderr.write(a.join(' ') + '\\n');\n console.log = toStderr;\n console.info = toStderr;\n}\n\nfunction getFlagValue(flags: string[]): string | undefined {\n for (const flag of flags) {\n const idx = args.indexOf(flag);\n if (idx !== -1 && idx + 1 < args.length) return args[idx + 1];\n }\n return undefined;\n}\n\nconst serviceArg = getFlagValue(['-s', '--service']);\nconst environmentArg = getFlagValue(['-e', '--environment']);\n\n// Configure environment BEFORE importing server (env is parsed at module load)\n// RUNEYA_HTTP_PORT takes priority over PORT\nif (process.env.RUNEYA_HTTP_PORT && !process.env.PORT) {\n process.env.PORT = process.env.RUNEYA_HTTP_PORT;\n}\n// AGENT_PORT is an alias for RUNEYA_AGENT_PORT (used by e2e test-server and legacy tooling)\nif (process.env.AGENT_PORT && !process.env.RUNEYA_AGENT_PORT) {\n process.env.RUNEYA_AGENT_PORT = process.env.AGENT_PORT;\n}\n// --lan shortcut sets host to 0.0.0.0; --host flag takes priority over HOST env var\nconst isLan = args.includes('--lan');\nconst hostFlag = getFlagValue(['--host']);\nconst isLanProxy = isLan || process.env.RUNEYA_LAN_PROXY === 'true' || process.env.RUNEYA_LAN_PROXY === '1';\nif (hostFlag) {\n process.env.HOST = hostFlag;\n} else if (isLanProxy) {\n process.env.HOST = '0.0.0.0';\n}\nif (isLanProxy) {\n process.env.RUNEYA_LAN_PROXY = 'true';\n}\n// Agent binary path (embedded in CLI dist during build)\nprocess.env.AGENT_BINARY_PATH = join(__dirname, 'agent/index.js');\n// Expose CLI version to server\nprocess.env.RUNEYA_VERSION = version;\n\n// --agent mode: run as standalone agent only (no server, no UI)\nconst isAgentOnly = args.includes('--agent');\nif (isAgentOnly) {\n const agentPort = getFlagValue(['--port']);\n const agentHost = getFlagValue(['--host']);\n if (agentPort) process.env.RUNEYA_AGENT_PORT = agentPort;\n // --host in agent mode binds the agent (default 127.0.0.1 — use --host 0.0.0.0 for remote access)\n // --lan also applies: sets agent host to 0.0.0.0 unless --host overrides it\n if (agentHost) {\n process.env.RUNEYA_AGENT_HOST = agentHost;\n } else if (isLanProxy) {\n process.env.RUNEYA_AGENT_HOST = '0.0.0.0';\n }\n}\n// Data directory defaults to CWD/.runeya (server env.ts default)\n// so Runeya data lives alongside the target project.\n\n/**\n * Listen with retry for EADDRINUSE — handles the race condition when the CLI\n * restarts the server before the old process has fully released the port.\n *\n * The `wss` parameter is needed because the `ws` library re-emits HTTP server\n * errors on the WebSocketServer — without a handler the error becomes unhandled.\n */\nfunction listenWithRetry(\n server: Server,\n port: number,\n host: string,\n wss?: WebSocketServer,\n maxRetries = 20,\n delay = 500,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n let attempts = 0;\n\n // Absorb EADDRINUSE errors re-emitted by the ws library on the WSS\n // during the retry window. Without this, Node.js crashes on unhandled error.\n const wssErrorHandler = () => { /* absorbed — handled via server 'error' */ };\n wss?.on('error', wssErrorHandler);\n\n const tryListen = () => {\n const onError = (err: NodeJS.ErrnoException) => {\n // Clean up the 'listening' callback that server.listen() registered\n server.removeAllListeners('listening');\n\n if (err.code === 'EADDRINUSE' && attempts < maxRetries) {\n attempts++;\n console.log(`[cli] Port ${port} in use, retrying in ${delay}ms (${attempts}/${maxRetries})...`);\n setTimeout(tryListen, delay);\n } else {\n wss?.removeListener('error', wssErrorHandler);\n reject(err);\n }\n };\n\n server.once('error', onError);\n server.listen(port, host, () => {\n server.removeListener('error', onError);\n wss?.removeListener('error', wssErrorHandler);\n resolve();\n });\n };\n\n tryListen();\n });\n}\n\nasync function main() {\n // Dynamic import ensures env is parsed AFTER we configure it\n const { createLocalServer, pullEnv, PullEnvError } = await import('@runeya/apps-server');\n\n // Handle --pull-env mode: resolve env vars and print, then exit\n if (isPullEnv) {\n if (!serviceArg) {\n console.error('Error: --service (-s) is required with --pull-env');\n process.exit(1);\n }\n if (!environmentArg) {\n console.error('Error: --environment (-e) is required with --pull-env');\n process.exit(1);\n }\n try {\n const output = await pullEnv({ service: serviceArg, environment: environmentArg });\n if (output) process.stdout.write(output + '\\n');\n process.exit(0);\n } catch (err: unknown) {\n if (err instanceof PullEnvError) {\n console.error(`Error: ${err.message}`);\n process.exit(err.exitCode);\n }\n throw err;\n }\n }\n\n // --agent mode: standalone agent, no server, no UI\n if (isAgentOnly) {\n const { spawn } = await import('node:child_process');\n const agentBin = join(__dirname, 'agent/index.js');\n const child = spawn(process.execPath, [agentBin], { stdio: 'inherit' });\n child.on('exit', (code) => process.exit(code ?? 0));\n // SIGINT is already delivered to the child by the terminal (same process group).\n // Intercept it here only to suppress Node's default exit so we stay alive\n // until the child finishes its graceful shutdown.\n process.on('SIGINT', () => { /* wait for child to exit */ });\n process.on('SIGTERM', () => child.kill('SIGTERM'));\n return;\n }\n\n console.log('[cli] Starting Runeya...');\n\n // Create server (automatically spawns local agent)\n const { app, server, wss, shutdown } = await createLocalServer();\n\n // Serve static files from web frontend (embedded in CLI dist during build)\n const webDistPath = join(__dirname, 'web');\n app.use(express.static(webDistPath));\n\n // Fallback to index.html for client-side routing (Vue Router)\n // Express 5 requires explicit path patterns (not '*')\n app.use((_req: Request, res: Response) => {\n res.sendFile(join(webDistPath, 'index.html'));\n });\n\n // Start server — RUNEYA_HTTP_PORT takes priority over PORT\n const port = resolvePort();\n const host = process.env.HOST ?? '127.0.0.1';\n\n await listenWithRetry(server, port, host, wss);\n\n const appUrl = `http://${host}:${port}`;\n\n if (!noOpen) {\n await open(appUrl);\n }\n\n console.log('\\n🚀 Runeya is running!');\n if (isLanProxy) {\n console.log('🌐 LAN mode: server and service ports exposed on local network');\n }\n printStartupTable(port, appUrl);\n console.log('[cli] Press Ctrl+C to stop');\n\n let shuttingDown = false;\n const gracefulShutdown = async (signal: string) => {\n if (shuttingDown) {\n console.log(`[cli] Forced exit (second ${signal})`);\n process.exit(1);\n }\n shuttingDown = true;\n console.log(`\\n[cli] Received ${signal}, shutting down gracefully...`);\n\n // In dev, exit immediately — ports are freed on process death,\n // and the 'exit' handler in agent-spawner SIGKILLs the agent.\n if (process.env.NODE_ENV === 'development') {\n process.exit(0);\n }\n\n await shutdown();\n console.log('[cli] Shutdown complete');\n process.exit(0);\n };\n\n process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));\n process.on('SIGINT', () => gracefulShutdown('SIGINT'));\n}\n\nmain().catch((err) => {\n console.error('[cli] Fatal error:', err);\n process.exit(1);\n});\n","/**\n * Resolve the HTTP port Runeya should listen on.\n *\n * Priority: RUNEYA_HTTP_PORT > PORT > 4000 (default)\n *\n * Throws if the resolved value is not an integer in [1, 65535].\n */\nexport function resolvePort(): number {\n const raw = process.env.RUNEYA_HTTP_PORT ?? process.env.PORT;\n if (raw === undefined) return 4000;\n\n const port = Number(raw);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(\n `Invalid port: ${JSON.stringify(raw)}. Must be an integer between 1 and 65535.`,\n );\n }\n return port;\n}\n"],"mappings":"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","names":["resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/port-resolution.ts"],"sourcesContent":["#!/usr/bin/env node\nimport type { Server } from 'node:http';\nimport type { WebSocketServer } from 'ws';\nimport type { Request, Response } from 'express';\nimport { fileURLToPath, URL as NodeURL } from 'node:url';\nimport { dirname, join, resolve } from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport express from 'express';\nimport dotenv from 'dotenv'\nimport open from 'open';\nimport { resolvePort } from './port-resolution.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst { version } = JSON.parse(\n readFileSync(new NodeURL('./package.json', import.meta.url), 'utf8'),\n) as { version: string };\n\nfunction printStartupTable(port: number, appUrl: string): void {\n const rows: [string, string][] = [\n ['Version', version],\n ['Port', String(port)],\n ['Url', appUrl],\n ];\n\n const col0 = Math.max(...rows.map(([k]) => k.length));\n const col1 = Math.max(...rows.map(([, v]) => v.length));\n\n const pad = (s: string, n: number) => s.padEnd(n);\n const hr = (l: string, m: string, r: string, f: string) =>\n l + f.repeat(col0 + 2) + m + f.repeat(col1 + 2) + r;\n\n console.log('');\n console.log(hr('┌', '┬', '┐', '─'));\n for (const [key, value] of rows) {\n console.log(`│ ${pad(key, col0)} │ ${pad(value, col1)} │`);\n }\n console.log(hr('└', '┴', '┘', '─'));\n console.log('');\n}\n\n// Parse CLI flags\nconst args = process.argv.slice(2);\n\n// Resolve target directory (first positional arg, skipping flag values)\nconst flagsWithValues = new Set(['--host', '--port', '-e', '--environment', '-s', '--service']);\nconst targetDir = args.find((a, i) => !a.startsWith('-') && !flagsWithValues.has(args[i - 1] ?? ''));\nif (targetDir) {\n const resolved = resolve(targetDir);\n process.chdir(resolved);\n console.log(`[cli] Working directory: ${resolved}`);\n} else if (process.env['DATA_DIR']) {\n const resolved = resolve(process.env['DATA_DIR'], '..');\n process.chdir(resolved);\n console.log(`[cli] Working directory: ${resolved} (from DATA_DIR)`);\n}\n\ndotenv.config({ quiet: true });\n\nif (args.includes('--help') || args.includes('-h')) {\n console.log(`Usage: runeya [path-to-your-stack] [options]\n\nOptions:\n --version Show version number\n --pe, --pull-env Print env vars for a service to stdout (requires -e and -s)\n -e, --environment <n> Environment name or id\n -s, --service <name> Service name or id\n --lan Expose server on the local network (shortcut for --host 0.0.0.0)\n --host <address> Host to bind to (default: 127.0.0.1)\n --no-open Do not open browser on startup\n --agent Run as agent only (no server, no UI) — for remote machines\n -h, --help Show this help message\n`);\n process.exit(0);\n}\n\nif (args.includes('--version')) {\n console.log(version);\n process.exit(0);\n}\n\nconst noOpen =\n args.includes('--no-open') ||\n !!process.env['VITEST'] ||\n !!process.env['CI'] ||\n process.env['NODE_ENV'] === 'test';\n\n// --pull-env flag — detect early so we can silence stdout before any log\nconst isPullEnv = args.includes('--pull-env') || args.includes('--pe');\n\n// In pull-env mode, redirect console.log/info to stderr so only KEY=VALUE goes to stdout\nif (isPullEnv) {\n const toStderr = (...a: unknown[]) => process.stderr.write(a.join(' ') + '\\n');\n console.log = toStderr;\n console.info = toStderr;\n}\n\nfunction getFlagValue(flags: string[]): string | undefined {\n for (const flag of flags) {\n const idx = args.indexOf(flag);\n if (idx !== -1 && idx + 1 < args.length) return args[idx + 1];\n }\n return undefined;\n}\n\nconst serviceArg = getFlagValue(['-s', '--service']);\nconst environmentArg = getFlagValue(['-e', '--environment']);\n\n// Configure environment BEFORE importing server (env is parsed at module load)\n// RUNEYA_HTTP_PORT takes priority over PORT\nif (process.env.RUNEYA_HTTP_PORT && !process.env.PORT) {\n process.env.PORT = process.env.RUNEYA_HTTP_PORT;\n}\n// AGENT_PORT is an alias for RUNEYA_AGENT_PORT (used by e2e test-server and legacy tooling)\nif (process.env.AGENT_PORT && !process.env.RUNEYA_AGENT_PORT) {\n process.env.RUNEYA_AGENT_PORT = process.env.AGENT_PORT;\n}\n// --lan shortcut sets host to 0.0.0.0; --host flag takes priority over HOST env var\nconst isLan = args.includes('--lan');\nconst hostFlag = getFlagValue(['--host']);\nconst isLanProxy = isLan || process.env.RUNEYA_LAN_PROXY === 'true' || process.env.RUNEYA_LAN_PROXY === '1';\nif (hostFlag) {\n process.env.HOST = hostFlag;\n} else if (isLanProxy) {\n process.env.HOST = '0.0.0.0';\n}\nif (isLanProxy) {\n process.env.RUNEYA_LAN_PROXY = 'true';\n}\n// Agent binary path (embedded in CLI dist during build)\nprocess.env.AGENT_BINARY_PATH = join(__dirname, 'agent/index.js');\n// Expose CLI version to server\nprocess.env.RUNEYA_VERSION = version;\n\n// --agent mode: run as standalone agent only (no server, no UI)\nconst isAgentOnly = args.includes('--agent');\nif (isAgentOnly) {\n const agentPort = getFlagValue(['--port']);\n const agentHost = getFlagValue(['--host']);\n if (agentPort) process.env.RUNEYA_AGENT_PORT = agentPort;\n // --host in agent mode binds the agent (default 127.0.0.1 — use --host 0.0.0.0 for remote access)\n // --lan also applies: sets agent host to 0.0.0.0 unless --host overrides it\n if (agentHost) {\n process.env.RUNEYA_AGENT_HOST = agentHost;\n } else if (isLanProxy) {\n process.env.RUNEYA_AGENT_HOST = '0.0.0.0';\n }\n}\n// Data directory defaults to CWD/.runeya (server env.ts default)\n// so Runeya data lives alongside the target project.\n\n/**\n * Listen with retry for EADDRINUSE — handles the race condition when the CLI\n * restarts the server before the old process has fully released the port.\n *\n * The `wss` parameter is needed because the `ws` library re-emits HTTP server\n * errors on the WebSocketServer — without a handler the error becomes unhandled.\n */\nfunction listenWithRetry(\n server: Server,\n port: number,\n host: string,\n wss?: WebSocketServer,\n maxRetries = 20,\n delay = 500,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n let attempts = 0;\n\n // Absorb EADDRINUSE errors re-emitted by the ws library on the WSS\n // during the retry window. Without this, Node.js crashes on unhandled error.\n const wssErrorHandler = () => { /* absorbed — handled via server 'error' */ };\n wss?.on('error', wssErrorHandler);\n\n const tryListen = () => {\n const onError = (err: NodeJS.ErrnoException) => {\n // Clean up the 'listening' callback that server.listen() registered\n server.removeAllListeners('listening');\n\n if (err.code === 'EADDRINUSE' && attempts < maxRetries) {\n attempts++;\n console.log(`[cli] Port ${port} in use, retrying in ${delay}ms (${attempts}/${maxRetries})...`);\n setTimeout(tryListen, delay);\n } else {\n wss?.removeListener('error', wssErrorHandler);\n reject(err);\n }\n };\n\n server.once('error', onError);\n server.listen(port, host, () => {\n server.removeListener('error', onError);\n wss?.removeListener('error', wssErrorHandler);\n resolve();\n });\n };\n\n tryListen();\n });\n}\n\nasync function main() {\n // Dynamic import ensures env is parsed AFTER we configure it\n const { createLocalServer, pullEnv, PullEnvError } = await import('@runeya/apps-server');\n\n // Handle --pull-env mode: resolve env vars and print, then exit\n if (isPullEnv) {\n if (!serviceArg) {\n console.error('Error: --service (-s) is required with --pull-env');\n process.exit(1);\n }\n if (!environmentArg) {\n console.error('Error: --environment (-e) is required with --pull-env');\n process.exit(1);\n }\n try {\n const output = await pullEnv({ service: serviceArg, environment: environmentArg });\n if (output) process.stdout.write(output + '\\n');\n process.exit(0);\n } catch (err: unknown) {\n if (err instanceof PullEnvError) {\n console.error(`Error: ${err.message}`);\n process.exit(err.exitCode);\n }\n throw err;\n }\n }\n\n // --agent mode: standalone agent, no server, no UI\n if (isAgentOnly) {\n const { spawn } = await import('node:child_process');\n const agentBin = join(__dirname, 'agent/index.js');\n const child = spawn(process.execPath, [agentBin], { stdio: 'inherit' });\n child.on('exit', (code) => process.exit(code ?? 0));\n // SIGINT is already delivered to the child by the terminal (same process group).\n // Intercept it here only to suppress Node's default exit so we stay alive\n // until the child finishes its graceful shutdown.\n process.on('SIGINT', () => { /* wait for child to exit */ });\n process.on('SIGTERM', () => child.kill('SIGTERM'));\n return;\n }\n\n console.log('[cli] Starting Runeya...');\n\n // Create server (automatically spawns local agent)\n const { app, server, wss, shutdown } = await createLocalServer();\n\n // Serve static files from web frontend (embedded in CLI dist during build)\n const webDistPath = join(__dirname, 'web');\n app.use(express.static(webDistPath));\n\n // Fallback to index.html for client-side routing (Vue Router)\n // Express 5 requires explicit path patterns (not '*')\n app.use((_req: Request, res: Response) => {\n res.sendFile(join(webDistPath, 'index.html'));\n });\n\n // Start server — RUNEYA_HTTP_PORT takes priority over PORT\n const port = resolvePort();\n const host = process.env.HOST ?? '127.0.0.1';\n\n await listenWithRetry(server, port, host, wss);\n\n const appUrl = `http://${host}:${port}`;\n\n if (!noOpen) {\n await open(appUrl);\n }\n\n console.log('\\n🚀 Runeya is running!');\n if (isLanProxy) {\n console.log('🌐 LAN mode: server and service ports exposed on local network');\n }\n printStartupTable(port, appUrl);\n console.log('[cli] Press Ctrl+C to stop');\n\n let shuttingDown = false;\n const gracefulShutdown = async (signal: string) => {\n if (shuttingDown) {\n console.log(`[cli] Forced exit (second ${signal})`);\n process.exit(1);\n }\n shuttingDown = true;\n console.log(`\\n[cli] Received ${signal}, shutting down gracefully...`);\n\n // In dev, exit immediately — ports are freed on process death,\n // and the 'exit' handler in agent-spawner SIGKILLs the agent.\n if (process.env.NODE_ENV === 'development') {\n process.exit(0);\n }\n\n await shutdown();\n console.log('[cli] Shutdown complete');\n process.exit(0);\n };\n\n process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));\n process.on('SIGINT', () => gracefulShutdown('SIGINT'));\n}\n\nmain().catch((err) => {\n console.error('[cli] Fatal error:', err);\n process.exit(1);\n});\n","/**\n * Resolve the HTTP port Runeya should listen on.\n *\n * Priority: RUNEYA_HTTP_PORT > PORT > 4000 (default)\n *\n * Throws if the resolved value is not an integer in [1, 65535].\n */\nexport function resolvePort(): number {\n const raw = process.env.RUNEYA_HTTP_PORT ?? process.env.PORT;\n if (raw === undefined) return 4000;\n\n const port = Number(raw);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(\n `Invalid port: ${JSON.stringify(raw)}. Must be an integer between 1 and 65535.`,\n );\n }\n return port;\n}\n"],"mappings":"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","names":["resolve"]}
|
package/mcp-server/index.js
CHANGED
|
@@ -4,7 +4,145 @@
|
|
|
4
4
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
5
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
6
|
import { z } from "zod";
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
// ../ai-capabilities/dist/index.js
|
|
9
|
+
var RUNEYA_CAPABILITIES = [
|
|
10
|
+
{
|
|
11
|
+
name: "list_services",
|
|
12
|
+
description: "List all available services. Returns serviceId and agentId for each \u2014 use these exact fields in other calls.",
|
|
13
|
+
route: "service.list",
|
|
14
|
+
method: "GET",
|
|
15
|
+
params: [],
|
|
16
|
+
buildInput: () => void 0
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: "get_service_status",
|
|
20
|
+
description: "Get the current status (running, stopped, etc.) of a service.",
|
|
21
|
+
route: "process.get",
|
|
22
|
+
method: "GET",
|
|
23
|
+
params: [
|
|
24
|
+
{ name: "serviceId", description: "The service ID", required: true },
|
|
25
|
+
{ name: "agentId", description: "The agent ID hosting this service", required: true }
|
|
26
|
+
],
|
|
27
|
+
buildInput: (p) => ({ agentId: p.agentId, id: p.serviceId })
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "get_logs",
|
|
31
|
+
description: "Get the recent buffered logs for a service.",
|
|
32
|
+
route: "process.logs",
|
|
33
|
+
method: "GET",
|
|
34
|
+
params: [
|
|
35
|
+
{ name: "serviceId", description: "The service ID", required: true },
|
|
36
|
+
{ name: "agentId", description: "The agent ID hosting this service", required: true }
|
|
37
|
+
],
|
|
38
|
+
buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId })
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "start_service",
|
|
42
|
+
description: "Start a service on an agent.",
|
|
43
|
+
route: "process.start",
|
|
44
|
+
method: "POST",
|
|
45
|
+
params: [
|
|
46
|
+
{ name: "serviceId", description: "The service ID to start", required: true },
|
|
47
|
+
{ name: "agentId", description: "The agent ID hosting this service", required: true }
|
|
48
|
+
],
|
|
49
|
+
buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),
|
|
50
|
+
destructive: true
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "stop_service",
|
|
54
|
+
description: "Stop a running service on an agent.",
|
|
55
|
+
route: "process.stop",
|
|
56
|
+
method: "POST",
|
|
57
|
+
params: [
|
|
58
|
+
{ name: "serviceId", description: "The service ID to stop", required: true },
|
|
59
|
+
{ name: "agentId", description: "The agent ID hosting this service", required: true }
|
|
60
|
+
],
|
|
61
|
+
buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),
|
|
62
|
+
destructive: true
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "restart_service",
|
|
66
|
+
description: "Restart a service on an agent (stop \u2192 redeploy \u2192 start).",
|
|
67
|
+
route: "process.restart",
|
|
68
|
+
method: "POST",
|
|
69
|
+
params: [
|
|
70
|
+
{ name: "serviceId", description: "The service ID to restart", required: true },
|
|
71
|
+
{ name: "agentId", description: "The agent ID hosting this service", required: true }
|
|
72
|
+
],
|
|
73
|
+
buildInput: (p) => ({ agentId: p.agentId, processId: p.serviceId }),
|
|
74
|
+
destructive: true
|
|
75
|
+
},
|
|
76
|
+
// ─── Utility ─────────────────────────────────────────────────────────────
|
|
77
|
+
{
|
|
78
|
+
name: "wait",
|
|
79
|
+
description: "Wait for a given number of milliseconds before continuing.",
|
|
80
|
+
route: "utility.wait",
|
|
81
|
+
method: "POST",
|
|
82
|
+
params: [
|
|
83
|
+
{ name: "ms", description: "Number of MILLISECONDS to wait. Convert from seconds: 1s=1000, 10s=10000, 1min=60000. Max 300000.", required: true }
|
|
84
|
+
],
|
|
85
|
+
buildInput: (p) => ({ ms: Number(p.ms) }),
|
|
86
|
+
usageHint: '"wait 5s" \u2192 wait(ms=5000), "pause 10 seconds" \u2192 wait(ms=10000), "attends 3 secondes" \u2192 wait(ms=3000). Always convert to milliseconds.'
|
|
87
|
+
},
|
|
88
|
+
// ─── Kanban ───────────────────────────────────────────────────────────────
|
|
89
|
+
{
|
|
90
|
+
name: "kanban_move_card",
|
|
91
|
+
description: "Move a kanban card to another column. Use the exact column name.",
|
|
92
|
+
route: "kanban.moveCard",
|
|
93
|
+
method: "POST",
|
|
94
|
+
params: [
|
|
95
|
+
{ name: "boardId", description: "The kanban board ID", required: true },
|
|
96
|
+
{ name: "cardId", description: "The card ID to move", required: true },
|
|
97
|
+
{ name: "targetColumn", description: "Exact name of the target column", required: true }
|
|
98
|
+
],
|
|
99
|
+
buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, targetColumn: p.targetColumn })
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "kanban_add_comment",
|
|
103
|
+
description: "Add a comment to a kanban card.",
|
|
104
|
+
route: "kanban.addComment",
|
|
105
|
+
method: "POST",
|
|
106
|
+
params: [
|
|
107
|
+
{ name: "boardId", description: "The kanban board ID", required: true },
|
|
108
|
+
{ name: "cardId", description: "The card ID", required: true },
|
|
109
|
+
{ name: "comment", description: "The comment text (markdown supported)", required: true }
|
|
110
|
+
],
|
|
111
|
+
buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, comment: p.comment })
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: "kanban_add_card",
|
|
115
|
+
description: "Add a new card to a kanban column.",
|
|
116
|
+
route: "kanban.addCard",
|
|
117
|
+
method: "POST",
|
|
118
|
+
params: [
|
|
119
|
+
{ name: "boardId", description: "The kanban board ID", required: true },
|
|
120
|
+
{ name: "column", description: "Exact name of the target column", required: true },
|
|
121
|
+
{ name: "title", description: "Card title", required: true },
|
|
122
|
+
{ name: "content", description: "Card content in markdown", required: false }
|
|
123
|
+
],
|
|
124
|
+
buildInput: (p) => ({ boardId: p.boardId, column: p.column, title: p.title, content: p.content })
|
|
125
|
+
}
|
|
126
|
+
];
|
|
127
|
+
async function callTrpc(baseUrl, route, method, input, authToken) {
|
|
128
|
+
const headers = {
|
|
129
|
+
"Content-Type": "application/json",
|
|
130
|
+
"Authorization": `Bearer ${authToken}`
|
|
131
|
+
};
|
|
132
|
+
const url = method === "GET" && input ? `${baseUrl}/api/trpc/${route}?input=${encodeURIComponent(JSON.stringify(input))}` : `${baseUrl}/api/trpc/${route}`;
|
|
133
|
+
const res = await fetch(url, {
|
|
134
|
+
method,
|
|
135
|
+
headers,
|
|
136
|
+
...method === "POST" ? { body: JSON.stringify(input ?? {}) } : {},
|
|
137
|
+
signal: AbortSignal.timeout(15e3)
|
|
138
|
+
});
|
|
139
|
+
const json = await res.json();
|
|
140
|
+
if (json["error"]) throw new Error(JSON.stringify(json["error"]));
|
|
141
|
+
const result = json["result"];
|
|
142
|
+
return result?.["data"] ?? result ?? json;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// src/index.ts
|
|
8
146
|
var BASE_URL = process.env["RUNEYA_BASE_URL"] ?? "http://localhost:4000";
|
|
9
147
|
var CONVERSATION_ID = process.env["RUNEYA_CONVERSATION_ID"] ?? "";
|
|
10
148
|
var INTERNAL_TOKEN = process.env["RUNEYA_INTERNAL_TOKEN"] ?? "";
|
package/mcp-server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.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 return { content: [{ type: 'text' as const, text: String(result) }] };\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"],"mappings":";;;AACA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,SAAS;AAClB,SAAS,qBAAqB,gBAAgB;AAE9C,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;AAErD,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;AACf,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,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,OAAO,MAAM,EAAE,CAAC,EAAE;AAAA,MACtE,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":[]}
|
|
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 return { content: [{ type: 'text' as const, text: String(result) }] };\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_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_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":[]}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$i as e,Bi as t,Ca as n,Ea as r,Hi as i,Oa as a,Oi as o,Ui as s,Yi as c,_i as l,ai as u,ci as d,di as f,fi as p,ha as m,ka as h,li as g,mi as _,ra as v,ui as y,yi as b}from"./index-
|
|
1
|
+
import{$i as e,Bi as t,Ca as n,Ea as r,Hi as i,Oa as a,Oi as o,Ui as s,Yi as c,_i as l,ai as u,ci as d,di as f,fi as p,ha as m,ka as h,li as g,mi as _,ra as v,ui as y,yi as b}from"./index-CIcE6DNv.js";import{Ht as x,Q as S,Ut as C,V as w,Z as T,hn as E,un as D}from"./dist--ZlcDulO.js";import{_ as O,g as k,h as A,m as j,p as M,v as N}from"./pretty-ms-D2BVTeMx.js";import{t as P}from"./store-CTKZgNiD.js";import{t as F}from"./_plugin-vue_export-helper-C08BWUE4.js";import{t as I}from"./useLayout-DHrumlpr.js";import{t as L}from"./CodeInput.vue-Sp2dM8hl.js";import{s as R}from"./mediaTypes-DDACekzr.js";var z={key:0},B={key:1},V={key:2},H={key:3},U={key:4},W={key:5},G=b({name:`ScalarIconPlay`,props:{label:{},weight:{}},setup(e){let{bind:r,weight:i}=D(e);return(e,a)=>(t(),p(`svg`,o({xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 256 256`,fill:`currentColor`},n(r)),[s(e.$slots,`default`),n(i)===`bold`?(t(),p(`g`,z,[...a[0]||=[g(`path`,{d:`M234.49,111.07,90.41,22.94A20,20,0,0,0,60,39.87V216.13a20,20,0,0,0,30.41,16.93l144.08-88.13a19.82,19.82,0,0,0,0-33.86ZM84,208.85V47.15L216.16,128Z`},null,-1)]])):n(i)===`duotone`?(t(),p(`g`,B,[...a[1]||=[g(`path`,{d:`M228.23,134.69,84.15,222.81A8,8,0,0,1,72,216.12V39.88a8,8,0,0,1,12.15-6.69l144.08,88.12A7.82,7.82,0,0,1,228.23,134.69Z`,opacity:`0.2`},null,-1),g(`path`,{d:`M232.4,114.49,88.32,26.35a16,16,0,0,0-16.2-.3A15.86,15.86,0,0,0,64,39.87V216.13A15.94,15.94,0,0,0,80,232a16.07,16.07,0,0,0,8.36-2.35L232.4,141.51a15.81,15.81,0,0,0,0-27ZM80,215.94V40l143.83,88Z`},null,-1)]])):n(i)===`fill`?(t(),p(`g`,V,[...a[2]||=[g(`path`,{d:`M240,128a15.74,15.74,0,0,1-7.6,13.51L88.32,229.65a16,16,0,0,1-16.2.3A15.86,15.86,0,0,1,64,216.13V39.87a15.86,15.86,0,0,1,8.12-13.82,16,16,0,0,1,16.2.3L232.4,114.49A15.74,15.74,0,0,1,240,128Z`},null,-1)]])):n(i)===`light`?(t(),p(`g`,H,[...a[3]||=[g(`path`,{d:`M231.36,116.19,87.28,28.06a14,14,0,0,0-14.18-.27A13.69,13.69,0,0,0,66,39.87V216.13a13.69,13.69,0,0,0,7.1,12.08,14,14,0,0,0,14.18-.27l144.08-88.13a13.82,13.82,0,0,0,0-23.62Zm-6.26,13.38L81,217.7a2,2,0,0,1-2.06,0,1.78,1.78,0,0,1-1-1.61V39.87a1.78,1.78,0,0,1,1-1.61A2.06,2.06,0,0,1,80,38a2,2,0,0,1,1,.31L225.1,126.43a1.82,1.82,0,0,1,0,3.14Z`},null,-1)]])):n(i)===`regular`?(t(),p(`g`,U,[...a[4]||=[g(`path`,{d:`M232.4,114.49,88.32,26.35a16,16,0,0,0-16.2-.3A15.86,15.86,0,0,0,64,39.87V216.13A15.94,15.94,0,0,0,80,232a16.07,16.07,0,0,0,8.36-2.35L232.4,141.51a15.81,15.81,0,0,0,0-27ZM80,215.94V40l143.83,88Z`},null,-1)]])):n(i)===`thin`?(t(),p(`g`,W,[...a[5]||=[g(`path`,{d:`M230.32,117.9,86.24,29.79a11.91,11.91,0,0,0-12.17-.23A11.71,11.71,0,0,0,68,39.89V216.11a11.71,11.71,0,0,0,6.07,10.33,11.91,11.91,0,0,0,12.17-.23L230.32,138.1a11.82,11.82,0,0,0,0-20.2Zm-4.18,13.37L82.06,219.39a4,4,0,0,1-4.07.07,3.77,3.77,0,0,1-2-3.35V39.89a3.77,3.77,0,0,1,2-3.35,4,4,0,0,1,4.07.07l144.08,88.12a3.8,3.8,0,0,1,0,6.54Z`},null,-1)]])):f(``,!0)],16))}}),K={100:{color:`text-yellow`},200:{color:`text-green`},202:{color:`text-green`},300:{color:`text-blue`},304:{color:`text-blue`},400:{color:`text-red`},401:{color:`text-orange`},422:{color:`text-yellow`},423:{color:`text-purple`},505:{color:`text-orange`}},q=e=>K[e]||{color:`text-grey`},J={class:`min-w-0`},Y={class:`text-c-1 min-w-0 truncate`},X=F(b({__name:`AddressBarHistory`,props:{operation:{},target:{}},setup(e){let{requestHistory:o}=P(),s=d(()=>o.filter(t=>t.request.requestUid===e.operation.uid).slice().reverse());function c(e){console.warn(`Restoring from the request history doesn't work yet. Request History Item:`,e)}return(o,d)=>(t(),y(n(N),{as:`div`},{default:v(({open:o})=>[l(n(S),{offset:0,resize:``,target:e.target},_({default:v(()=>[s.value?.length?(t(),y(n(k),{key:0,class:`address-bar-history-button z-context-plus text-c-3 focus:text-c-1 relative mr-1 rounded-lg p-1.5`},{default:v(()=>[l(n(w),{icon:`History`,size:`sm`,thickness:`2.25`}),d[0]||=g(`span`,{class:`sr-only`},`Request History`,-1)]),_:1})):f(``,!0)]),_:2},[o?{name:`floating`,fn:v(({width:e})=>[l(n(A),{class:`custom-scroll grid max-h-[inherit] grid-cols-[44px_1fr_repeat(3,auto)] items-center border-t p-0.75`,static:``,style:a({width:e})},{default:v(()=>[(t(!0),p(u,null,i(s.value,(e,i)=>(t(),y(n(O),{key:e.timestamp,as:`button`,class:`font-code ui-active:*:bg-b-2 text-c-2 contents text-sm font-medium *:flex *:h-8 *:cursor-pointer *:items-center *:rounded-none *:px-1.5 *:first:rounded-l *:last:rounded-r`,value:i,onClick:t=>c(e)},{default:v(()=>[e.response.method?(t(),y(R,{key:0,class:`text-[11px]`,method:e.response.method},null,8,[`method`])):f(``,!0),g(`div`,J,[g(`div`,Y,h(e.response.path),1)]),g(`div`,null,h(n(j)(e.response.duration)),1),g(`div`,{class:r([n(q)(e.response.status).color])},h(e.response.status),3),g(`div`,null,h(n(x)[e.response.status]?.name),1)]),_:2},1032,[`value`,`onClick`]))),128))]),_:1},8,[`style`]),l(n(T),{class:`-top-(--scalar-address-bar-height) rounded-lg`})]),key:`0`}:void 0]),1032,[`target`])]),_:1}))}}),[[`__scopeId`,`data-v-a93fa60f`]]),Z=[`id`],Q={class:`address-bar-bg-states text-xxs group relative order-last flex w-full max-w-[calc(100dvw-24px)] flex-1 flex-row items-stretch rounded-lg p-0.75 lg:order-none lg:max-w-[580px] lg:min-w-[580px] xl:max-w-[720px] xl:min-w-[720px]`},$={class:`pointer-events-none absolute top-0 left-0 block h-full w-full overflow-hidden rounded-lg border`},ee={class:`z-context-plus flex gap-1`},te={class:`scroll-timeline-x scroll-timeline-x-hidden z-context-plus relative flex w-full bg-blend-normal`},ne={"aria-hidden":`true`,class:`inline-flex items-center gap-1`},re={class:`sr-only`},ie=F(b({__name:`AddressBar`,props:{collection:{},operation:{},server:{},environment:{},envVariables:{},workspace:{}},emits:[`importCurl`],setup(r){let i=c(),{requestMutators:o,events:s}=P(),{layout:u}=I(),d=m(null),_=m(null),b=e=>{r.operation.path!==e&&o.edit(r.operation.uid,`path`,e)};e(()=>r.operation.path,e=>{e&&b(e)});let x=m(100),S=m(0),w=m(!1),T=m();function D(){w.value?x.value-=(x.value-15)/60:x.value-=S.value/20,x.value<=0&&(clearInterval(T.value),T.value=void 0,x.value=100,w.value=!1)}function O(){T.value||=(w.value=!0,setInterval(D,20))}function k(){S.value=x.value,w.value=!1}function A(){clearInterval(T.value),T.value=void 0,x.value=100,w.value=!1}s.requestStatus.on(e=>{if(e===`start`)return O();if(e===`stop`)return k();if(e===`abort`)return A()}),s.focusAddressBar.on(()=>{u===`modal`?_.value?.$el?.focus():d.value?.focus()});function j(e){o.edit(r.operation.uid,`method`,e)}function N(){let{method:e}=r.operation;return C[e].colorVar}function F(){w.value||(w.value=!0,s.executeRequest.emit({requestUid:r.operation.uid}))}s.hotKeys.on(e=>{e?.focusAddressBar&&d.value?.focus(),e?.executeRequest&&F()});function z(e){o.edit(r.operation.uid,`path`,e)}return(e,o)=>(t(),p(`div`,{id:n(i),class:`scalar-address-bar order-last flex h-(--scalar-address-bar-height) w-full [--scalar-address-bar-height:32px] lg:order-none lg:w-auto`},[g(`div`,Q,[g(`div`,$,[g(`div`,{class:`absolute top-0 left-0 z-[1002] h-full w-full`,style:a({backgroundColor:`color-mix(in srgb, transparent 90%, ${N()})`,transform:`translate3d(-${x.value}%,0,0)`})},null,4)]),g(`div`,ee,[l(R,{isEditable:n(u)!==`modal`,isSquare:``,method:r.operation.method,teleport:``,onChange:j},null,8,[`isEditable`,`method`])]),g(`div`,te,[r.collection.servers.length?(t(),y(n(M),{key:0,collection:r.collection,layout:`client`,operation:r.operation,server:r.server,target:n(i)},null,8,[`collection`,`operation`,`server`,`target`])):f(``,!0),o[1]||=g(`div`,{class:`fade-left`},null,-1),l(L,{ref_key:`addressBarRef`,ref:d,"aria-label":`Path`,class:`min-w-fit outline-none`,disableCloseBrackets:``,disabled:n(u)===`modal`,disableEnter:``,disableTabIndent:``,emitOnBlur:!1,envVariables:r.envVariables,environment:r.environment,importCurl:``,modelValue:r.operation.path,placeholder:r.server?.uid&&r.collection.servers.includes(r.server.uid)?``:`Enter a URL or cURL command`,server:``,workspace:r.workspace,onCurl:o[0]||=t=>e.$emit(`importCurl`,t),onSubmit:F,"onUpdate:modelValue":z},null,8,[`disabled`,`envVariables`,`environment`,`modelValue`,`placeholder`,`workspace`]),o[2]||=g(`div`,{class:`fade-right`},null,-1)]),l(X,{operation:r.operation,target:n(i)},null,8,[`operation`,`target`]),l(n(E),{ref_key:`sendButtonRef`,ref:_,class:`z-context-plus relative h-auto shrink-0 overflow-hidden py-1 pr-2.5 pl-2 font-bold`,disabled:w.value,onClick:F},{default:v(()=>[g(`span`,ne,[l(n(G),{class:`relative shrink-0`,size:`xs`,weight:`fill`}),o[3]||=g(`span`,{class:`text-xxs hidden lg:flex`},`Send`,-1)]),g(`span`,re,` Send `+h(r.operation.method)+` request to `+h(r.server?.url??``)+h(r.operation.path),1)]),_:1},8,[`disabled`])])],8,Z))}}),[[`__scopeId`,`data-v-cb2a35da`]]);export{G as n,ie as t};
|