@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/agent/index.js
CHANGED
|
@@ -766,7 +766,10 @@ var ProjectSchema = z3.object({
|
|
|
766
766
|
// NOTE: activeEnvironmentId is runtime-only (not persisted to JSON)
|
|
767
767
|
// It's initialized to 'local' by default at load time
|
|
768
768
|
activeEnvironmentId: z3.string().max(128).optional(),
|
|
769
|
-
environmentIds: z3.array(z3.string().max(128)).max(100).default([])
|
|
769
|
+
environmentIds: z3.array(z3.string().max(128)).max(100).default([]),
|
|
770
|
+
// Ordre d'affichage des groupes de services dans la sidebar (noms de groupes).
|
|
771
|
+
// Les groupes absents de cette liste sont affichés après, par ordre alphabétique.
|
|
772
|
+
groupOrder: z3.array(z3.string().max(200)).max(100).default([])
|
|
770
773
|
});
|
|
771
774
|
var CreateProjectSchema = ProjectSchema.omit({ id: true }).partial().required({ name: true });
|
|
772
775
|
var UpdateProjectSchema = ProjectSchema.partial().required({ id: true });
|
|
@@ -3153,7 +3156,7 @@ var HealthChecker = class extends EventEmitter6 {
|
|
|
3153
3156
|
this.stopChecking(id);
|
|
3154
3157
|
}
|
|
3155
3158
|
}
|
|
3156
|
-
async checkHttp(processId,
|
|
3159
|
+
async checkHttp(processId, path3, timeout, maxRetries, method = "GET", expectedStatus = 200) {
|
|
3157
3160
|
const proc = processStore.get(processId);
|
|
3158
3161
|
if (!proc || proc.state !== "running") {
|
|
3159
3162
|
this.updateResult(processId, "unknown", 0);
|
|
@@ -3164,7 +3167,7 @@ var HealthChecker = class extends EventEmitter6 {
|
|
|
3164
3167
|
this.updateResult(processId, "unknown", 0);
|
|
3165
3168
|
return;
|
|
3166
3169
|
}
|
|
3167
|
-
const url = `http://localhost:${port}${
|
|
3170
|
+
const url = `http://localhost:${port}${path3}`;
|
|
3168
3171
|
let failures = this.failureCounts.get(processId) ?? 0;
|
|
3169
3172
|
try {
|
|
3170
3173
|
const response = await fetch(url, {
|
|
@@ -4509,7 +4512,20 @@ async function getGitStatus(cwd) {
|
|
|
4509
4512
|
upstream = (await git(["rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], cwd, true)).trim();
|
|
4510
4513
|
} catch {
|
|
4511
4514
|
}
|
|
4512
|
-
|
|
4515
|
+
let additions = 0;
|
|
4516
|
+
let deletions = 0;
|
|
4517
|
+
try {
|
|
4518
|
+
const numstat = await git(["diff", "--numstat", "HEAD"], cwd, true);
|
|
4519
|
+
for (const line of numstat.split("\n").filter(Boolean)) {
|
|
4520
|
+
const [add, del] = line.split(" ");
|
|
4521
|
+
const a = parseInt(add ?? "", 10);
|
|
4522
|
+
const d = parseInt(del ?? "", 10);
|
|
4523
|
+
if (!Number.isNaN(a)) additions += a;
|
|
4524
|
+
if (!Number.isNaN(d)) deletions += d;
|
|
4525
|
+
}
|
|
4526
|
+
} catch {
|
|
4527
|
+
}
|
|
4528
|
+
return { branch, staged, unstaged, untracked, ahead, behind, upstream, additions, deletions };
|
|
4513
4529
|
}
|
|
4514
4530
|
var gitRouter = router({
|
|
4515
4531
|
/** Check if a working directory exists and optionally verify its git remote */
|
|
@@ -4667,6 +4683,13 @@ var gitRouter = router({
|
|
|
4667
4683
|
await git(["restore", "--staged", "--", ...input.paths], cwd);
|
|
4668
4684
|
return { ok: true };
|
|
4669
4685
|
}),
|
|
4686
|
+
/** Unstage all files */
|
|
4687
|
+
unstageAll: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA })).mutation(async ({ input }) => {
|
|
4688
|
+
const cwd = assertCwdExists(input.cwd);
|
|
4689
|
+
await assertGitRepo(cwd);
|
|
4690
|
+
await git(["reset", "--"], cwd);
|
|
4691
|
+
return { ok: true };
|
|
4692
|
+
}),
|
|
4670
4693
|
/** Commit staged changes */
|
|
4671
4694
|
commit: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA, message: z24.string().min(1).max(4096) })).mutation(async ({ input }) => {
|
|
4672
4695
|
const cwd = assertCwdExists(input.cwd);
|
|
@@ -4795,6 +4818,54 @@ var gitRouter = router({
|
|
|
4795
4818
|
}
|
|
4796
4819
|
}
|
|
4797
4820
|
return remotes;
|
|
4821
|
+
}),
|
|
4822
|
+
/** List stash entries */
|
|
4823
|
+
stashList: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA })).query(async ({ input }) => {
|
|
4824
|
+
const cwd = assertCwdExists(input.cwd);
|
|
4825
|
+
await assertGitRepo(cwd);
|
|
4826
|
+
const output = await git(["stash", "list", "--format=%gd%s"], cwd, true);
|
|
4827
|
+
const entries = [];
|
|
4828
|
+
for (const line of output.split("\n").filter(Boolean)) {
|
|
4829
|
+
const [ref, message = ""] = line.split("");
|
|
4830
|
+
const m = /stash@\{(\d+)\}/.exec(ref ?? "");
|
|
4831
|
+
if (m) entries.push({ index: parseInt(m[1], 10), ref, message });
|
|
4832
|
+
}
|
|
4833
|
+
return entries;
|
|
4834
|
+
}),
|
|
4835
|
+
/** Stash current changes */
|
|
4836
|
+
stashPush: protectedProcedure.input(z24.object({
|
|
4837
|
+
cwd: CWD_SCHEMA,
|
|
4838
|
+
message: z24.string().max(4096).optional(),
|
|
4839
|
+
includeUntracked: z24.boolean().default(true)
|
|
4840
|
+
})).mutation(async ({ input }) => {
|
|
4841
|
+
const cwd = assertCwdExists(input.cwd);
|
|
4842
|
+
await assertGitRepo(cwd);
|
|
4843
|
+
const args = ["stash", "push"];
|
|
4844
|
+
if (input.includeUntracked) args.push("--include-untracked");
|
|
4845
|
+
if (input.message) args.push("-m", input.message);
|
|
4846
|
+
const output = await git(args, cwd);
|
|
4847
|
+
return { ok: true, output: output.trim() };
|
|
4848
|
+
}),
|
|
4849
|
+
/** Apply a stash entry and remove it from the list */
|
|
4850
|
+
stashPop: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA, index: z24.number().int().min(0).max(1e3).default(0) })).mutation(async ({ input }) => {
|
|
4851
|
+
const cwd = assertCwdExists(input.cwd);
|
|
4852
|
+
await assertGitRepo(cwd);
|
|
4853
|
+
const output = await git(["stash", "pop", `stash@{${input.index}}`], cwd);
|
|
4854
|
+
return { ok: true, output: output.trim() };
|
|
4855
|
+
}),
|
|
4856
|
+
/** Apply a stash entry without removing it from the list */
|
|
4857
|
+
stashApply: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA, index: z24.number().int().min(0).max(1e3).default(0) })).mutation(async ({ input }) => {
|
|
4858
|
+
const cwd = assertCwdExists(input.cwd);
|
|
4859
|
+
await assertGitRepo(cwd);
|
|
4860
|
+
const output = await git(["stash", "apply", `stash@{${input.index}}`], cwd);
|
|
4861
|
+
return { ok: true, output: output.trim() };
|
|
4862
|
+
}),
|
|
4863
|
+
/** Drop a stash entry */
|
|
4864
|
+
stashDrop: protectedProcedure.input(z24.object({ cwd: CWD_SCHEMA, index: z24.number().int().min(0).max(1e3).default(0) })).mutation(async ({ input }) => {
|
|
4865
|
+
const cwd = assertCwdExists(input.cwd);
|
|
4866
|
+
await assertGitRepo(cwd);
|
|
4867
|
+
const output = await git(["stash", "drop", `stash@{${input.index}}`], cwd);
|
|
4868
|
+
return { ok: true, output: output.trim() };
|
|
4798
4869
|
})
|
|
4799
4870
|
});
|
|
4800
4871
|
function runGitRaw(args, timeoutMs, extraEnv) {
|
|
@@ -4831,11 +4902,60 @@ import { spawn as spawn4 } from "child_process";
|
|
|
4831
4902
|
import { EventEmitter as EventEmitter9 } from "events";
|
|
4832
4903
|
import { randomUUID as randomUUID5 } from "crypto";
|
|
4833
4904
|
import { fileURLToPath } from "url";
|
|
4905
|
+
import { createRequire } from "module";
|
|
4906
|
+
import { existsSync as existsSync2 } from "fs";
|
|
4907
|
+
import * as pty2 from "node-pty";
|
|
4908
|
+
function resolveMcpServerPath() {
|
|
4909
|
+
try {
|
|
4910
|
+
const req = createRequire(import.meta.url);
|
|
4911
|
+
return req.resolve("@runeya/packages-mcp-server");
|
|
4912
|
+
} catch {
|
|
4913
|
+
}
|
|
4914
|
+
const candidates = [
|
|
4915
|
+
new URL("../../../packages/mcp-server/dist/index.js", import.meta.url),
|
|
4916
|
+
new URL("../../../../packages/mcp-server/dist/index.js", import.meta.url),
|
|
4917
|
+
new URL("../mcp-server/index.js", import.meta.url)
|
|
4918
|
+
];
|
|
4919
|
+
for (const c of candidates) {
|
|
4920
|
+
const p = fileURLToPath(c);
|
|
4921
|
+
if (existsSync2(p)) return p;
|
|
4922
|
+
}
|
|
4923
|
+
throw new Error("Could not locate @runeya/packages-mcp-server (built dist not found)");
|
|
4924
|
+
}
|
|
4834
4925
|
var MAX_BUFFER_LINES = 1e5;
|
|
4835
4926
|
var MAX_CONCURRENT_SPAWNS = 10;
|
|
4836
4927
|
var CLEANUP_INTERVAL_MS = 6e4;
|
|
4837
4928
|
var TTL_ACKED_MS = 5 * 6e4;
|
|
4838
4929
|
var TTL_UNACKED_MS = 24 * 36e5;
|
|
4930
|
+
function resolveSpawnEnvAndArgs(opts) {
|
|
4931
|
+
const runeyaEnv = {
|
|
4932
|
+
...opts.mcpApiBaseUrl ? { RUNEYA_BASE_URL: opts.mcpApiBaseUrl } : {},
|
|
4933
|
+
...opts.mcpApiToken ? { RUNEYA_API_TOKEN: opts.mcpApiToken } : {}
|
|
4934
|
+
};
|
|
4935
|
+
const env2 = { ...process.env, ...opts.env, ...runeyaEnv };
|
|
4936
|
+
const args = [...opts.args];
|
|
4937
|
+
if (opts.enableMcp && opts.cli === "claude") {
|
|
4938
|
+
try {
|
|
4939
|
+
const mcpServerPath = resolveMcpServerPath();
|
|
4940
|
+
const mcpConfig = JSON.stringify({
|
|
4941
|
+
mcpServers: {
|
|
4942
|
+
runeya: {
|
|
4943
|
+
command: "node",
|
|
4944
|
+
args: [mcpServerPath],
|
|
4945
|
+
env: {
|
|
4946
|
+
...env2.RUNEYA_BASE_URL ? { RUNEYA_BASE_URL: env2.RUNEYA_BASE_URL } : {},
|
|
4947
|
+
...env2.RUNEYA_API_TOKEN ? { RUNEYA_API_TOKEN: env2.RUNEYA_API_TOKEN } : {}
|
|
4948
|
+
}
|
|
4949
|
+
}
|
|
4950
|
+
}
|
|
4951
|
+
});
|
|
4952
|
+
args.push("--mcp-config", mcpConfig);
|
|
4953
|
+
} catch (err) {
|
|
4954
|
+
console.warn("[ai-spawn-manager] Failed to resolve MCP server path:", err.message);
|
|
4955
|
+
}
|
|
4956
|
+
}
|
|
4957
|
+
return { env: env2, args };
|
|
4958
|
+
}
|
|
4839
4959
|
var AiSpawnManager = class {
|
|
4840
4960
|
spawns = /* @__PURE__ */ new Map();
|
|
4841
4961
|
cleanupInterval = null;
|
|
@@ -4849,28 +4969,11 @@ var AiSpawnManager = class {
|
|
|
4849
4969
|
}
|
|
4850
4970
|
const spawnId = randomUUID5();
|
|
4851
4971
|
const emitter = new EventEmitter9();
|
|
4852
|
-
const args =
|
|
4853
|
-
if (opts.enableMcp && opts.cli === "claude") {
|
|
4854
|
-
try {
|
|
4855
|
-
const mcpServerPath = fileURLToPath(new URL("../mcp-server/index.js", import.meta.url));
|
|
4856
|
-
const mcpConfig = JSON.stringify({
|
|
4857
|
-
mcpServers: {
|
|
4858
|
-
runeya: {
|
|
4859
|
-
command: "node",
|
|
4860
|
-
args: [mcpServerPath],
|
|
4861
|
-
env: opts.mcpApiBaseUrl ? { RUNEYA_BASE_URL: opts.mcpApiBaseUrl } : {}
|
|
4862
|
-
}
|
|
4863
|
-
}
|
|
4864
|
-
});
|
|
4865
|
-
args.push("--mcp-config", mcpConfig);
|
|
4866
|
-
} catch (err) {
|
|
4867
|
-
console.warn("[ai-spawn-manager] Failed to resolve MCP server path:", err.message);
|
|
4868
|
-
}
|
|
4869
|
-
}
|
|
4972
|
+
const { env: env2, args } = resolveSpawnEnvAndArgs(opts);
|
|
4870
4973
|
const proc = spawn4(opts.cli, args, {
|
|
4871
4974
|
stdio: ["pipe", "pipe", "pipe"],
|
|
4872
4975
|
shell: false,
|
|
4873
|
-
env:
|
|
4976
|
+
env: env2,
|
|
4874
4977
|
cwd: opts.cwd || void 0
|
|
4875
4978
|
});
|
|
4876
4979
|
const entry = {
|
|
@@ -4880,10 +4983,12 @@ var AiSpawnManager = class {
|
|
|
4880
4983
|
exitCode: null,
|
|
4881
4984
|
buffer: [],
|
|
4882
4985
|
proc,
|
|
4986
|
+
ptyProc: null,
|
|
4883
4987
|
emitter,
|
|
4884
4988
|
createdAt: Date.now(),
|
|
4885
4989
|
doneAt: null,
|
|
4886
|
-
acked: false
|
|
4990
|
+
acked: false,
|
|
4991
|
+
lastChunkAt: null
|
|
4887
4992
|
};
|
|
4888
4993
|
this.spawns.set(spawnId, entry);
|
|
4889
4994
|
if (opts.stdinData) {
|
|
@@ -4968,8 +5073,98 @@ var AiSpawnManager = class {
|
|
|
4968
5073
|
}
|
|
4969
5074
|
return true;
|
|
4970
5075
|
}
|
|
5076
|
+
if (entry.ptyProc) {
|
|
5077
|
+
try {
|
|
5078
|
+
entry.ptyProc.kill();
|
|
5079
|
+
} catch {
|
|
5080
|
+
}
|
|
5081
|
+
return true;
|
|
5082
|
+
}
|
|
4971
5083
|
return false;
|
|
4972
5084
|
}
|
|
5085
|
+
// ── PTY mode ────────────────────────────────────────────────────────────
|
|
5086
|
+
spawnPty(opts) {
|
|
5087
|
+
const running = [...this.spawns.values()].filter((s) => s.status === "running").length;
|
|
5088
|
+
if (running >= MAX_CONCURRENT_SPAWNS) {
|
|
5089
|
+
throw new Error(`Max concurrent AI spawns reached (${MAX_CONCURRENT_SPAWNS})`);
|
|
5090
|
+
}
|
|
5091
|
+
const spawnId = randomUUID5();
|
|
5092
|
+
const emitter = new EventEmitter9();
|
|
5093
|
+
const { env: env2, args } = resolveSpawnEnvAndArgs(opts);
|
|
5094
|
+
const ptyProc = pty2.spawn(opts.cli, args, {
|
|
5095
|
+
name: "xterm-256color",
|
|
5096
|
+
cols: opts.cols ?? 120,
|
|
5097
|
+
rows: opts.rows ?? 30,
|
|
5098
|
+
cwd: opts.cwd || process.cwd(),
|
|
5099
|
+
env: env2
|
|
5100
|
+
});
|
|
5101
|
+
const entry = {
|
|
5102
|
+
spawnId,
|
|
5103
|
+
sessionId: opts.sessionId,
|
|
5104
|
+
cli: opts.cli,
|
|
5105
|
+
status: "running",
|
|
5106
|
+
exitCode: null,
|
|
5107
|
+
buffer: [],
|
|
5108
|
+
proc: null,
|
|
5109
|
+
ptyProc,
|
|
5110
|
+
emitter,
|
|
5111
|
+
createdAt: Date.now(),
|
|
5112
|
+
doneAt: null,
|
|
5113
|
+
acked: false,
|
|
5114
|
+
lastChunkAt: null
|
|
5115
|
+
};
|
|
5116
|
+
this.spawns.set(spawnId, entry);
|
|
5117
|
+
ptyProc.onData((data) => {
|
|
5118
|
+
this.pushChunk(entry, { type: "pty-data", data });
|
|
5119
|
+
});
|
|
5120
|
+
ptyProc.onExit(({ exitCode }) => {
|
|
5121
|
+
entry.status = exitCode === 0 ? "done" : "error";
|
|
5122
|
+
entry.exitCode = exitCode;
|
|
5123
|
+
entry.doneAt = Date.now();
|
|
5124
|
+
entry.ptyProc = null;
|
|
5125
|
+
this.pushChunk(entry, { type: "exit", data: "", code: exitCode });
|
|
5126
|
+
});
|
|
5127
|
+
console.log(`[ai-spawn-manager] Spawned PTY ${opts.cli} (${spawnId}), args: ${opts.args.length}, cwd: ${opts.cwd ?? "(default)"}, ${opts.cols ?? 120}x${opts.rows ?? 30}`);
|
|
5128
|
+
return spawnId;
|
|
5129
|
+
}
|
|
5130
|
+
writePty(spawnId, data) {
|
|
5131
|
+
const entry = this.spawns.get(spawnId);
|
|
5132
|
+
if (!entry || !entry.ptyProc) return false;
|
|
5133
|
+
try {
|
|
5134
|
+
entry.ptyProc.write(data);
|
|
5135
|
+
return true;
|
|
5136
|
+
} catch {
|
|
5137
|
+
return false;
|
|
5138
|
+
}
|
|
5139
|
+
}
|
|
5140
|
+
/** Return a running PTY spawn matching the given logical sessionId, if any. */
|
|
5141
|
+
findPtyBySessionId(sessionId) {
|
|
5142
|
+
for (const entry of this.spawns.values()) {
|
|
5143
|
+
if (entry.sessionId === sessionId && entry.status === "running" && entry.ptyProc !== null) {
|
|
5144
|
+
return {
|
|
5145
|
+
spawnId: entry.spawnId,
|
|
5146
|
+
cli: entry.cli,
|
|
5147
|
+
status: entry.status,
|
|
5148
|
+
exitCode: entry.exitCode,
|
|
5149
|
+
bufferLength: entry.buffer.length,
|
|
5150
|
+
createdAt: entry.createdAt,
|
|
5151
|
+
doneAt: entry.doneAt,
|
|
5152
|
+
lastChunkAt: entry.lastChunkAt
|
|
5153
|
+
};
|
|
5154
|
+
}
|
|
5155
|
+
}
|
|
5156
|
+
return null;
|
|
5157
|
+
}
|
|
5158
|
+
resizePty(spawnId, cols, rows) {
|
|
5159
|
+
const entry = this.spawns.get(spawnId);
|
|
5160
|
+
if (!entry || !entry.ptyProc) return false;
|
|
5161
|
+
try {
|
|
5162
|
+
entry.ptyProc.resize(cols, rows);
|
|
5163
|
+
return true;
|
|
5164
|
+
} catch {
|
|
5165
|
+
return false;
|
|
5166
|
+
}
|
|
5167
|
+
}
|
|
4973
5168
|
list() {
|
|
4974
5169
|
return [...this.spawns.values()].map((e) => ({
|
|
4975
5170
|
spawnId: e.spawnId,
|
|
@@ -4978,7 +5173,8 @@ var AiSpawnManager = class {
|
|
|
4978
5173
|
exitCode: e.exitCode,
|
|
4979
5174
|
bufferLength: e.buffer.length,
|
|
4980
5175
|
createdAt: e.createdAt,
|
|
4981
|
-
doneAt: e.doneAt
|
|
5176
|
+
doneAt: e.doneAt,
|
|
5177
|
+
lastChunkAt: e.lastChunkAt
|
|
4982
5178
|
}));
|
|
4983
5179
|
}
|
|
4984
5180
|
ack(spawnId) {
|
|
@@ -4993,6 +5189,9 @@ var AiSpawnManager = class {
|
|
|
4993
5189
|
entry.buffer.shift();
|
|
4994
5190
|
}
|
|
4995
5191
|
entry.buffer.push(chunk);
|
|
5192
|
+
if (chunk.type === "stdout" || chunk.type === "stderr" || chunk.type === "pty-data") {
|
|
5193
|
+
entry.lastChunkAt = Date.now();
|
|
5194
|
+
}
|
|
4996
5195
|
entry.emitter.emit("chunk");
|
|
4997
5196
|
if (chunk.type === "exit") {
|
|
4998
5197
|
entry.emitter.emit("done");
|
|
@@ -5025,13 +5224,19 @@ var AiSpawnManager = class {
|
|
|
5025
5224
|
} catch {
|
|
5026
5225
|
}
|
|
5027
5226
|
}
|
|
5227
|
+
if (entry.ptyProc) {
|
|
5228
|
+
try {
|
|
5229
|
+
entry.ptyProc.kill();
|
|
5230
|
+
} catch {
|
|
5231
|
+
}
|
|
5232
|
+
}
|
|
5028
5233
|
}
|
|
5029
5234
|
}
|
|
5030
5235
|
};
|
|
5031
5236
|
var aiSpawnManager = new AiSpawnManager();
|
|
5032
5237
|
|
|
5033
5238
|
// src/services/codex-app-server-manager.ts
|
|
5034
|
-
import { spawn as
|
|
5239
|
+
import { spawn as spawn6 } from "child_process";
|
|
5035
5240
|
import { createInterface as createInterface2 } from "readline";
|
|
5036
5241
|
import { EventEmitter as EventEmitter10 } from "events";
|
|
5037
5242
|
var REQUEST_TIMEOUT_MS = 3e5;
|
|
@@ -5059,7 +5264,7 @@ var CodexAppServerManager = class extends EventEmitter10 {
|
|
|
5059
5264
|
}
|
|
5060
5265
|
}
|
|
5061
5266
|
async doConnect() {
|
|
5062
|
-
this.proc =
|
|
5267
|
+
this.proc = spawn6("codex", ["app-server"], {
|
|
5063
5268
|
stdio: ["pipe", "pipe", "pipe"],
|
|
5064
5269
|
env: { ...process.env, ...this.extraEnv }
|
|
5065
5270
|
});
|
|
@@ -5170,7 +5375,142 @@ var CodexAppServerManager = class extends EventEmitter10 {
|
|
|
5170
5375
|
};
|
|
5171
5376
|
var codexAppServerManager = new CodexAppServerManager();
|
|
5172
5377
|
|
|
5378
|
+
// src/services/ai-context-files.ts
|
|
5379
|
+
import { mkdir as mkdir4, writeFile as writeFile4 } from "fs/promises";
|
|
5380
|
+
import path from "path";
|
|
5381
|
+
import os2 from "os";
|
|
5382
|
+
var ROOT_DIR_NAME = "runeya-ai-context";
|
|
5383
|
+
function sanitizeName(name) {
|
|
5384
|
+
let safe = name.replace(/[^A-Za-z0-9._-]/g, "_");
|
|
5385
|
+
if (!safe || safe === "." || safe === "..") safe = "context";
|
|
5386
|
+
if (!/\.[A-Za-z0-9]+$/.test(safe)) safe += ".md";
|
|
5387
|
+
return safe;
|
|
5388
|
+
}
|
|
5389
|
+
function sanitizeSessionId(sessionId) {
|
|
5390
|
+
const safe = sessionId.replace(/[^A-Za-z0-9._-]/g, "_");
|
|
5391
|
+
return safe || "session";
|
|
5392
|
+
}
|
|
5393
|
+
async function writeContextFiles(sessionId, files) {
|
|
5394
|
+
const baseDir = path.join(os2.tmpdir(), ROOT_DIR_NAME, sanitizeSessionId(sessionId));
|
|
5395
|
+
await mkdir4(baseDir, { recursive: true });
|
|
5396
|
+
const paths = [];
|
|
5397
|
+
const usedNames = /* @__PURE__ */ new Set();
|
|
5398
|
+
for (let i = 0; i < files.length; i++) {
|
|
5399
|
+
const file = files[i];
|
|
5400
|
+
let name = sanitizeName(file.name);
|
|
5401
|
+
if (usedNames.has(name)) {
|
|
5402
|
+
const ext = path.extname(name);
|
|
5403
|
+
const base = name.slice(0, name.length - ext.length);
|
|
5404
|
+
name = `${base}-${i}${ext}`;
|
|
5405
|
+
}
|
|
5406
|
+
usedNames.add(name);
|
|
5407
|
+
const fullPath = path.join(baseDir, name);
|
|
5408
|
+
await writeFile4(fullPath, file.content, "utf8");
|
|
5409
|
+
paths.push(fullPath);
|
|
5410
|
+
}
|
|
5411
|
+
return paths;
|
|
5412
|
+
}
|
|
5413
|
+
|
|
5414
|
+
// src/services/ai-paste-image.ts
|
|
5415
|
+
import { mkdir as mkdir5, writeFile as writeFile5, unlink as unlink2 } from "fs/promises";
|
|
5416
|
+
import path2 from "path";
|
|
5417
|
+
import os3 from "os";
|
|
5418
|
+
import { randomUUID as randomUUID6 } from "crypto";
|
|
5419
|
+
import { spawn as spawn7 } from "child_process";
|
|
5420
|
+
var TMP_DIR_NAME = "runeya-ai-paste";
|
|
5421
|
+
var MIME_TO_EXT = {
|
|
5422
|
+
"image/png": "png",
|
|
5423
|
+
"image/jpeg": "jpg",
|
|
5424
|
+
"image/jpg": "jpg",
|
|
5425
|
+
"image/gif": "gif",
|
|
5426
|
+
"image/webp": "webp",
|
|
5427
|
+
"image/bmp": "bmp"
|
|
5428
|
+
};
|
|
5429
|
+
function extForMime(mime) {
|
|
5430
|
+
return MIME_TO_EXT[mime.toLowerCase()] ?? "png";
|
|
5431
|
+
}
|
|
5432
|
+
function runCmd(cmd, args, stdin, timeoutMs = 5e3) {
|
|
5433
|
+
return new Promise((resolve) => {
|
|
5434
|
+
let settled = false;
|
|
5435
|
+
const settle = (code, stderr) => {
|
|
5436
|
+
if (settled) return;
|
|
5437
|
+
settled = true;
|
|
5438
|
+
resolve({ code, stderr });
|
|
5439
|
+
};
|
|
5440
|
+
try {
|
|
5441
|
+
const child = spawn7(cmd, args, { stdio: ["pipe", "ignore", "pipe"] });
|
|
5442
|
+
let stderr = "";
|
|
5443
|
+
child.stderr.on("data", (c) => {
|
|
5444
|
+
stderr += c.toString();
|
|
5445
|
+
});
|
|
5446
|
+
child.on("error", (err) => settle(127, err.message));
|
|
5447
|
+
child.on("exit", (code) => settle(code ?? 1, stderr));
|
|
5448
|
+
const t2 = setTimeout(() => {
|
|
5449
|
+
try {
|
|
5450
|
+
child.kill("SIGKILL");
|
|
5451
|
+
} catch {
|
|
5452
|
+
}
|
|
5453
|
+
settle(124, "timeout");
|
|
5454
|
+
}, timeoutMs);
|
|
5455
|
+
child.on("exit", () => clearTimeout(t2));
|
|
5456
|
+
if (stdin) {
|
|
5457
|
+
child.stdin.on("error", () => {
|
|
5458
|
+
});
|
|
5459
|
+
child.stdin.end(stdin);
|
|
5460
|
+
} else {
|
|
5461
|
+
child.stdin.end();
|
|
5462
|
+
}
|
|
5463
|
+
} catch (err) {
|
|
5464
|
+
settle(127, err.message);
|
|
5465
|
+
}
|
|
5466
|
+
});
|
|
5467
|
+
}
|
|
5468
|
+
async function savePastedImage(base64, mimeType, sessionId) {
|
|
5469
|
+
const buf = Buffer.from(base64, "base64");
|
|
5470
|
+
if (buf.length === 0) throw new Error("Empty image payload");
|
|
5471
|
+
const ext = extForMime(mimeType);
|
|
5472
|
+
const baseDir = path2.join(
|
|
5473
|
+
os3.tmpdir(),
|
|
5474
|
+
TMP_DIR_NAME,
|
|
5475
|
+
sessionId ? sessionId.replace(/[^A-Za-z0-9._-]/g, "_") : "default"
|
|
5476
|
+
);
|
|
5477
|
+
await mkdir5(baseDir, { recursive: true });
|
|
5478
|
+
const tmpPath = path2.join(baseDir, `paste-${Date.now()}-${randomUUID6().slice(0, 8)}.${ext}`);
|
|
5479
|
+
await writeFile5(tmpPath, buf);
|
|
5480
|
+
const { method, error } = await tryWriteClipboard(buf, mimeType, tmpPath);
|
|
5481
|
+
return { tmpPath, clipboardMethod: method, clipboardError: error };
|
|
5482
|
+
}
|
|
5483
|
+
async function tryWriteClipboard(buf, mimeType, tmpPath) {
|
|
5484
|
+
const normalizedMime = mimeType.toLowerCase();
|
|
5485
|
+
const errors = [];
|
|
5486
|
+
if (process.platform === "darwin") {
|
|
5487
|
+
const klass = normalizedMime === "image/jpeg" || normalizedMime === "image/jpg" ? "JPEG picture" : "PNGf";
|
|
5488
|
+
const script = `set the clipboard to (read (POSIX file "${tmpPath.replace(/"/g, '\\"')}") as \xABclass ${klass}\xBB)`;
|
|
5489
|
+
const r = await runCmd("osascript", ["-e", script]);
|
|
5490
|
+
if (r.code === 0) return { method: "pbcopy" };
|
|
5491
|
+
errors.push(`osascript: ${r.stderr.trim()}`);
|
|
5492
|
+
}
|
|
5493
|
+
if (process.platform === "linux") {
|
|
5494
|
+
const r = await runCmd("xclip", ["-selection", "clipboard", "-t", normalizedMime, "-i"], buf);
|
|
5495
|
+
if (r.code === 0) return { method: "xclip" };
|
|
5496
|
+
errors.push(`xclip: ${r.stderr.trim() || `exit ${r.code}`}`);
|
|
5497
|
+
const r2 = await runCmd("wl-copy", ["--type", normalizedMime], buf);
|
|
5498
|
+
if (r2.code === 0) return { method: "wl-copy" };
|
|
5499
|
+
errors.push(`wl-copy: ${r2.stderr.trim() || `exit ${r2.code}`}`);
|
|
5500
|
+
}
|
|
5501
|
+
if (process.platform === "win32") {
|
|
5502
|
+
const ps = `Add-Type -AssemblyName System.Windows.Forms; Add-Type -AssemblyName System.Drawing; $img = [System.Drawing.Image]::FromFile("${tmpPath.replace(/\\/g, "\\\\")}"); [System.Windows.Forms.Clipboard]::SetImage($img); $img.Dispose()`;
|
|
5503
|
+
const r = await runCmd("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", ps]);
|
|
5504
|
+
if (r.code === 0) return { method: "powershell" };
|
|
5505
|
+
errors.push(`powershell: ${r.stderr.trim() || `exit ${r.code}`}`);
|
|
5506
|
+
}
|
|
5507
|
+
return { method: null, error: errors.join(" | ") || "no clipboard tool available" };
|
|
5508
|
+
}
|
|
5509
|
+
|
|
5173
5510
|
// src/trpc/routers/ai.ts
|
|
5511
|
+
var MAX_CONTEXT_FILES = 20;
|
|
5512
|
+
var MAX_CONTEXT_FILE_BYTES = 1e6;
|
|
5513
|
+
var MAX_CONTEXT_TOTAL_BYTES = 5e6;
|
|
5174
5514
|
var aiRouter = router({
|
|
5175
5515
|
/** Spawn an AI CLI process. Returns a spawnId for streaming. */
|
|
5176
5516
|
spawn: protectedProcedure.input(z25.object({
|
|
@@ -5180,7 +5520,8 @@ var aiRouter = router({
|
|
|
5180
5520
|
cwd: z25.string().max(4096).optional(),
|
|
5181
5521
|
stdinData: z25.string().max(1e7).optional(),
|
|
5182
5522
|
enableMcp: z25.boolean().optional(),
|
|
5183
|
-
mcpApiBaseUrl: z25.string().max(512).optional()
|
|
5523
|
+
mcpApiBaseUrl: z25.string().max(512).optional(),
|
|
5524
|
+
mcpApiToken: z25.string().max(8192).optional()
|
|
5184
5525
|
})).mutation(({ input }) => {
|
|
5185
5526
|
const spawnId = aiSpawnManager.spawn(input);
|
|
5186
5527
|
return { spawnId };
|
|
@@ -5201,6 +5542,71 @@ var aiRouter = router({
|
|
|
5201
5542
|
});
|
|
5202
5543
|
}
|
|
5203
5544
|
}),
|
|
5545
|
+
/** Spawn an AI CLI process in a PTY (interactive mode). Returns spawnId. */
|
|
5546
|
+
spawnPty: protectedProcedure.input(z25.object({
|
|
5547
|
+
cli: z25.string().max(64),
|
|
5548
|
+
args: z25.array(z25.string().max(5e5)),
|
|
5549
|
+
env: z25.record(z25.string().max(256), z25.string().max(5e5)).optional(),
|
|
5550
|
+
cwd: z25.string().max(4096).optional(),
|
|
5551
|
+
cols: z25.number().int().min(1).max(1e3).optional(),
|
|
5552
|
+
rows: z25.number().int().min(1).max(1e3).optional(),
|
|
5553
|
+
sessionId: z25.string().max(128).optional(),
|
|
5554
|
+
enableMcp: z25.boolean().optional(),
|
|
5555
|
+
mcpApiBaseUrl: z25.string().max(512).optional(),
|
|
5556
|
+
mcpApiToken: z25.string().max(8192).optional()
|
|
5557
|
+
})).mutation(({ input }) => {
|
|
5558
|
+
const spawnId = aiSpawnManager.spawnPty(input);
|
|
5559
|
+
return { spawnId };
|
|
5560
|
+
}),
|
|
5561
|
+
/** Find a running PTY spawn by its logical sessionId (for re-attach). */
|
|
5562
|
+
findPtyBySession: protectedProcedure.input(z25.object({ sessionId: z25.string().max(128) })).query(({ input }) => {
|
|
5563
|
+
return aiSpawnManager.findPtyBySessionId(input.sessionId);
|
|
5564
|
+
}),
|
|
5565
|
+
/** Write input to a PTY spawn (user keystrokes). */
|
|
5566
|
+
writePty: protectedProcedure.input(z25.object({
|
|
5567
|
+
spawnId: z25.string().max(128),
|
|
5568
|
+
data: z25.string().max(1e6)
|
|
5569
|
+
})).mutation(({ input }) => {
|
|
5570
|
+
const ok = aiSpawnManager.writePty(input.spawnId, input.data);
|
|
5571
|
+
return { ok };
|
|
5572
|
+
}),
|
|
5573
|
+
/** Write attached-context files for an AI session to a temp dir. Returns absolute paths. */
|
|
5574
|
+
writeContextFiles: protectedProcedure.input(z25.object({
|
|
5575
|
+
sessionId: z25.string().min(1).max(128),
|
|
5576
|
+
files: z25.array(z25.object({
|
|
5577
|
+
name: z25.string().min(1).max(256),
|
|
5578
|
+
content: z25.string().max(MAX_CONTEXT_FILE_BYTES)
|
|
5579
|
+
})).min(1).max(MAX_CONTEXT_FILES)
|
|
5580
|
+
}).refine(
|
|
5581
|
+
(val) => val.files.reduce((sum, f) => sum + f.content.length, 0) <= MAX_CONTEXT_TOTAL_BYTES,
|
|
5582
|
+
{ message: `Total context size exceeds ${MAX_CONTEXT_TOTAL_BYTES} bytes` }
|
|
5583
|
+
)).mutation(async ({ input }) => {
|
|
5584
|
+
const paths = await writeContextFiles(input.sessionId, input.files);
|
|
5585
|
+
return { paths };
|
|
5586
|
+
}),
|
|
5587
|
+
/**
|
|
5588
|
+
* Save a pasted image to disk and try to populate the agent's system clipboard
|
|
5589
|
+
* so Claude's native paste detection picks it up. Returns the tmp path and
|
|
5590
|
+
* which clipboard method (if any) succeeded — caller decides whether to send
|
|
5591
|
+
* Ctrl+V (\x16) or inject `@<path>` into the PTY.
|
|
5592
|
+
*/
|
|
5593
|
+
pasteImage: protectedProcedure.input(z25.object({
|
|
5594
|
+
sessionId: z25.string().max(128).optional(),
|
|
5595
|
+
mimeType: z25.string().max(64),
|
|
5596
|
+
base64: z25.string().max(15e6)
|
|
5597
|
+
})).mutation(async ({ input }) => {
|
|
5598
|
+
const res = await savePastedImage(input.base64, input.mimeType, input.sessionId);
|
|
5599
|
+
return res;
|
|
5600
|
+
}),
|
|
5601
|
+
/** Resize a PTY spawn. */
|
|
5602
|
+
resizePty: protectedProcedure.input(z25.object({
|
|
5603
|
+
spawnId: z25.string().max(128),
|
|
5604
|
+
cols: z25.number().int().min(1).max(1e3),
|
|
5605
|
+
rows: z25.number().int().min(1).max(1e3)
|
|
5606
|
+
})).mutation(({ input }) => {
|
|
5607
|
+
const ok = aiSpawnManager.resizePty(input.spawnId, input.cols, input.rows);
|
|
5608
|
+
return { ok };
|
|
5609
|
+
}),
|
|
5204
5610
|
/** Kill a running AI spawn. */
|
|
5205
5611
|
kill: protectedProcedure.input(z25.object({ spawnId: z25.string().max(128) })).mutation(({ input }) => {
|
|
5206
5612
|
const killed = aiSpawnManager.kill(input.spawnId);
|