@runeya/runeya 2.0.13 → 2.0.16
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 +236 -15
- package/agent/index.js.map +1 -1
- package/agent-manager-7IDZTNVZ-HVRWIXYW.js +8 -0
- package/{chunk-AJW7LDO5.js → chunk-AHOJAT74.js} +9 -3
- package/chunk-AHOJAT74.js.map +1 -0
- package/{dist-HGCFHXO4.js → dist-P3HYK2SI.js} +334 -92
- package/dist-P3HYK2SI.js.map +1 -0
- package/index.js +1 -1
- package/package.json +1 -1
- package/web/assets/{AddressBar.vue-B6BOLYmO.js → AddressBar.vue-BZnGu8vW.js} +1 -1
- package/web/assets/{AgentScalarChatInterface.vue-DKSmjtvV.js → AgentScalarChatInterface.vue-QkKS0oIt.js} +1 -1
- package/web/assets/{AgentTerminalPage-BZ6jaRAs.js → AgentTerminalPage-CfI3DoEO.js} +1 -1
- package/web/assets/AiChatPage-C_j-aspS.js +1 -0
- package/web/assets/{AppLayout-B7-y0tBI.css → AppLayout-Cf8sRK63.css} +1 -1
- package/web/assets/{AppLayout-DnMCPCO8.js → AppLayout-CgU4s6lb.js} +1 -1
- package/web/assets/{AuditPage-CTdEvLE-.js → AuditPage-C42BeKr5.js} +1 -1
- package/web/assets/{CodeInput.vue-Sp2dM8hl.js → CodeInput.vue-BGBOdacc.js} +1 -1
- package/web/assets/{Collection.vue-CdPjaC9d.js → Collection.vue-Vub9L9if.js} +1 -1
- package/web/assets/{CollectionAuthentication.vue-DMPykUah.js → CollectionAuthentication.vue-DMa9nYTH.js} +1 -1
- package/web/assets/CollectionCookies.vue-Dr_bErXS.js +1 -0
- package/web/assets/{CollectionEnvironment.vue-DKab6xJJ.js → CollectionEnvironment.vue-CcS_RH1F.js} +1 -1
- package/web/assets/{CollectionOverview.vue-DlODh8Vk.js → CollectionOverview.vue-Cm3m-3IA.js} +1 -1
- package/web/assets/CollectionScripts.vue-DwfCDW_N.js +1 -0
- package/web/assets/{CollectionServers.vue-Br-QackN.js → CollectionServers.vue-CDU7RCJI.js} +1 -1
- package/web/assets/{CollectionSettings.vue-Cm6NQbDm.js → CollectionSettings.vue-QApKyKpx.js} +1 -1
- package/web/assets/CollectionSync.vue-2mc6W9Vb.js +1 -0
- package/web/assets/{CommandActionInput.vue-CZ3-rqSL.js → CommandActionInput.vue-CSydiKjM.js} +1 -1
- package/web/assets/{Cookies.vue-Duz-a-ga.js → Cookies.vue-2UMujX_l.js} +1 -1
- package/web/assets/DashboardPage-CSkUCQHY.css +1 -0
- package/web/assets/DashboardPage-Dt5zSm2a.js +1 -0
- package/web/assets/{DataTable.vue-Dorr-r7J.js → DataTable.vue-BKb6QQRz.js} +1 -1
- package/web/assets/{DataTableCheckbox.vue-CATn-YYp.js → DataTableCheckbox.vue-DC2n-xeZ.js} +1 -1
- package/web/assets/{DataTableHeader.vue-C3SUSaR8.js → DataTableHeader.vue-Cbolg5AE.js} +1 -1
- package/web/assets/{DataTableInput.vue-_06pwPUA.js → DataTableInput.vue-DoVPLXed.js} +1 -1
- package/web/assets/{DeleteSidebarListElement.vue-DoqRnMXx.js → DeleteSidebarListElement.vue-Br-Lvh7k.js} +1 -1
- package/web/assets/{EditSidebarListElement.vue-BqTw6Tho.js → EditSidebarListElement.vue-BVJ4wsTf.js} +1 -1
- package/web/assets/{EditorIcon-CbpIT0A1.js → EditorIcon-D3F3QHD_.js} +1 -1
- package/web/assets/{EmptyState.vue-Bur5L0a4.js → EmptyState.vue-DMCTVrXN.js} +1 -1
- package/web/assets/{Environment.vue-C50lH9cP.js → Environment.vue-CEBYjegx.js} +1 -1
- package/web/assets/{EnvironmentForm-BDfzXuHx.js → EnvironmentForm-D9pUNi_S.js} +1 -1
- package/web/assets/{EnvironmentFormPage-CLylRN6B.js → EnvironmentFormPage-BQwHvpiH.js} +1 -1
- package/web/assets/{EnvironmentListPage-DlUT6LnX.js → EnvironmentListPage-BEX6YTjm.js} +1 -1
- package/web/assets/{EnvironmentModal.vue-Dz5CArRX.js → EnvironmentModal.vue-Bipjnu_F.js} +1 -1
- package/web/assets/{EnvironmentSelector-DHoYUCTH.js → EnvironmentSelector-BsLO-o9W.js} +1 -1
- package/web/assets/{Form.vue-BzZCMgN1.js → Form.vue-CwujTuIH.js} +1 -1
- package/web/assets/{IconSelector.vue-BCmeqlrs.js → IconSelector.vue-xGa1snoB.js} +1 -1
- package/web/assets/KanbanBoardPage-CS0DFaYQ.js +2 -0
- package/web/assets/KanbanBoardPage-GHv836NO.css +1 -0
- package/web/assets/{KanbanListPage-BLdNz80q.js → KanbanListPage-BlycDa8i.js} +1 -1
- package/web/assets/{LaunchProjectPage-DjRA2D3h.js → LaunchProjectPage-CQPXVRR8.js} +1 -1
- package/web/assets/{LaunchServicesPage-CKaGcu3z.js → LaunchServicesPage-DIc47d5w.js} +1 -1
- package/web/assets/{LogViewer-CtX_6uFM.js → LogViewer-D-j9SP-8.js} +1 -1
- package/web/assets/{ProcessControls-BY-_9zo7.js → ProcessControls-D3MHr6vJ.js} +1 -1
- package/web/assets/{ProcessDetailPage-Bqis1qMA.js → ProcessDetailPage-DArVdn5O.js} +1 -1
- package/web/assets/{ProcessMetrics-DQybvwcA.js → ProcessMetrics-tRbudcTQ.js} +1 -1
- package/web/assets/{ProjectDetailPage-FBPonwd5.js → ProjectDetailPage-DQWbqmra.js} +1 -1
- package/web/assets/{ProjectListPage-xwlVXN8A.js → ProjectListPage-BArhG94f.js} +1 -1
- package/web/assets/{RandomJobTestPage-0pqne-FD.js → RandomJobTestPage-cx0kQXnf.js} +1 -1
- package/web/assets/{Request.vue-Db4XEPKt.js → Request.vue-B9DoYtI8.js} +1 -1
- package/web/assets/{RequestAuth.vue-CK1A6ySt.js → RequestAuth.vue-CqHxzl6g.js} +1 -1
- package/web/assets/{RequestRoot.vue-BLF0GGT5.js → RequestRoot.vue-C28ISMld.js} +1 -1
- package/web/assets/{ScalarAsciiArt.vue-BPdUsXWj.js → ScalarAsciiArt.vue-BYd0f-av.js} +1 -1
- package/web/assets/{ScalarIconEyeSlash.vue-BBDBShRO.js → ScalarIconEyeSlash.vue-Ct2ktTXq.js} +1 -1
- package/web/assets/{ScalarIconTrash.vue-Tpr15aNY.js → ScalarIconTrash.vue-DQO_gQ8s.js} +1 -1
- package/web/assets/{ScenarioEditorPage-DNuo-2Gi.js → ScenarioEditorPage-DP06DP64.js} +1 -1
- package/web/assets/{ServerVariablesForm.vue-XLQ145gw.js → ServerVariablesForm.vue-D11m7aiX.js} +1 -1
- package/web/assets/{ServiceControlsBar-CCTGcA1t.js → ServiceControlsBar-DMq83CtH.js} +1 -1
- package/web/assets/{ServiceDetailPage-BELECRic.css → ServiceDetailPage-BngfQIAo.css} +1 -1
- package/web/assets/ServiceDetailPage-Cn1MTG_u.js +2 -0
- package/web/assets/{ServiceFormPage-F3boRKs-.js → ServiceFormPage-CyIValC5.js} +1 -1
- package/web/assets/{Settings.vue-D_1yQu6i.js → Settings.vue-CCeUjK5z.js} +1 -1
- package/web/assets/{SettingsPage-CgJN_IL7.css → SettingsPage-BhGoaUHP.css} +1 -1
- package/web/assets/SettingsPage-LVnvVA93.js +225 -0
- package/web/assets/{SetupKeyPage-BcaSoLjU.js → SetupKeyPage-DOxR0hTs.js} +1 -1
- package/web/assets/{SetupPage-mCVAKLtm.js → SetupPage-DTQqk8IW.js} +1 -1
- package/web/assets/{Sidebar.vue-De4YlW0c.js → Sidebar.vue-BLpHEfAt.js} +1 -1
- package/web/assets/{SidebarButton.vue-CctYiTRp.js → SidebarButton.vue-CNMSjNtm.js} +1 -1
- package/web/assets/{SidebarListElement.vue-Cv7jUZIM.js → SidebarListElement.vue-DSsy6NQT.js} +1 -1
- package/web/assets/TiptapEditor-DzMKh7Iq.css +1 -0
- package/web/assets/TiptapEditor-TuQki585.js +181 -0
- package/web/assets/{UnlockPage-BSpzyZnd.js → UnlockPage-D4x8qq_i.js} +1 -1
- package/web/assets/{VariablesTable-Dn3IvplD.js → VariablesTable-BP8KuwPI.js} +1 -1
- package/web/assets/{ViewLayout.vue-fiagi8zc.js → ViewLayout.vue-Dui_p5J4.js} +1 -1
- package/web/assets/{ViewLayoutContent.vue-BehGrsED.js → ViewLayoutContent.vue-CZRQTJFb.js} +1 -1
- package/web/assets/{ViewLayoutSection.vue-D4icCgQI.js → ViewLayoutSection.vue-C87DZ2QU.js} +1 -1
- package/web/assets/WikiPage-BrgnqOvx.js +1 -0
- package/web/assets/WikiView-CMF4PzXp.css +1 -0
- package/web/assets/WikiView-Decl55xY.js +1 -0
- package/web/assets/{active-entities-CkBGjwu9.js → active-entities-DEkfqGrE.js} +1 -1
- package/web/assets/{api-reference-D1EfYtPj.js → api-reference-DP5iGzGP.js} +1 -1
- package/web/assets/{autocomplete-CjBHTJWh.js → autocomplete-DcAAfn0y.js} +1 -1
- package/web/assets/{card-CsmU2iiY.js → card-DyK4dvjg.js} +1 -1
- package/web/assets/{checkbox-B5XZqi1U.js → checkbox-Csn61_gJ.js} +1 -1
- package/web/assets/{chip-C4pSomPm.js → chip-DkjFl7f-.js} +1 -1
- package/web/assets/{column-CR3Hix4J.js → column-DyznW54C.js} +1 -1
- package/web/assets/{core-CtGUajLi.js → core-BXP8Yp-2.js} +1 -1
- package/web/assets/{cssMode-nuznbveH.js → cssMode-C9nCeku9.js} +1 -1
- package/web/assets/{dist--ZlcDulO.js → dist-DKLcX5kd.js} +1 -1
- package/web/assets/{dist-DH_zJr7W.js → dist-DM4_kDGf.js} +1 -1
- package/web/assets/{dist-WjGUyWSO.js → dist-DOfPSpzL.js} +1 -1
- package/web/assets/{dist-CXkMrHNP.js → dist-zqENM1-W.js} +1 -1
- package/web/assets/{divider-CnJlD7qO.js → divider-BJQexqne.js} +1 -1
- package/web/assets/{fieldset-D9zY6R6s.js → fieldset-BPm9DkKy.js} +1 -1
- package/web/assets/{freemarker2-Bw43sOne.js → freemarker2-BaJGEPal.js} +1 -1
- package/web/assets/{handlebars-C8qgW7u6.js → handlebars-BQFn9RdQ.js} +1 -1
- package/web/assets/{html-Dy9PKnkr.js → html-Cr5a-EYz.js} +1 -1
- package/web/assets/{htmlMode-o8EU0tqo.js → htmlMode-CC9GYLNa.js} +1 -1
- package/web/assets/{index-CIcE6DNv.js → index-CV_lCcKm.js} +5 -5
- package/web/assets/{javascript-CuRngcUR.js → javascript-mDqsZBlu.js} +1 -1
- package/web/assets/{jsonMode-CsUIxwQq.js → jsonMode-B54JAo3i.js} +1 -1
- package/web/assets/{keyboard-DhkINir5.js → keyboard-BALpgxzI.js} +1 -1
- package/web/assets/{lib-E9M4L9vE.js → lib-CbGVmNqI.js} +1 -1
- package/web/assets/{library-BXoSag-V.js → library-DL2YIihE.js} +1 -1
- package/web/assets/{liquid-CraMnqaK.js → liquid-DiGHjG_L.js} +1 -1
- package/web/assets/{mdx-DPSW5q1A.js → mdx-D6dV5_Hg.js} +1 -1
- package/web/assets/{mediaTypes-DDACekzr.js → mediaTypes-97PR9Ryv.js} +1 -1
- package/web/assets/{message-DKOCajc6.js → message-CkvY1zpy.js} +1 -1
- package/web/assets/{minus-CtlH9Syh.js → minus-Cz1A1nRX.js} +1 -1
- package/web/assets/{multiselect-sshNnjnF.js → multiselect-Cg_IvTVL.js} +1 -1
- package/web/assets/{password-Dv9g39jb.js → password-DnBPksM5.js} +1 -1
- package/web/assets/{plus-CG5Ui-l-.js → plus-DLza1kmt.js} +1 -1
- package/web/assets/{pretty-ms-D2BVTeMx.js → pretty-ms-CFs2lDEt.js} +1 -1
- package/web/assets/process.store-DOZqELYx.js +1 -0
- package/web/assets/{project.store-CVbXSH5d.js → project.store-1ZxiIOdG.js} +1 -1
- package/web/assets/{python-BLq8fVkV.js → python-CBOkbLwS.js} +1 -1
- package/web/assets/{radiobutton-Bz_ltBfM.js → radiobutton-Bzj_cgKU.js} +1 -1
- package/web/assets/{razor-CVrBU-Fk.js → razor-DbhB_XzZ.js} +1 -1
- package/web/assets/router-BXlVOZht.js +1 -0
- package/web/assets/{settings.store-vM-8jbAF.js → settings.store-Qq6Gc2CT.js} +1 -1
- package/web/assets/{store-CTKZgNiD.js → store-Cuguy-ft.js} +1 -1
- package/web/assets/{tabpanel-DaZzgdrv.js → tabpanel-BkIDALQ8.js} +1 -1
- package/web/assets/trpc-BFwMZelk.js +1 -0
- package/web/assets/{tsMode-DO5zEzzD.js → tsMode-B48YcNcc.js} +1 -1
- package/web/assets/{typescript-Do-K_3Jj.js → typescript-DNe7mq9Z.js} +1 -1
- package/web/assets/{urls-BlVUwVFM.js → urls-Bhy-NKbg.js} +1 -1
- package/web/assets/{use-tree-walker-xoEX554A.js → use-tree-walker-DGf54lqT.js} +1 -1
- package/web/assets/useAiChatDrawer-C-QgDgQO.js +1 -0
- package/web/assets/{useClipboard-B3J6cGK-.js → useClipboard-Ba0ZMSjV.js} +1 -1
- package/web/assets/{useLayout-DHrumlpr.js → useLayout-CmsWxVhO.js} +1 -1
- package/web/assets/{usePluginManager-BEbBxZnF.js → usePluginManager-DBLyufEz.js} +1 -1
- package/web/assets/{useSidebar-BCBwVF2x.js → useSidebar-BWKBo0y4.js} +1 -1
- package/web/assets/{vue-router-CuFIegGa.js → vue-router-By6H_4a-.js} +1 -1
- package/web/assets/{xml-BolCsFLY.js → xml-zVv61nBe.js} +1 -1
- package/web/assets/{yaml-5iZTkCV3.js → yaml-DJ0ncxUH.js} +1 -1
- package/web/index.html +1 -1
- package/agent-manager-3DHUF2DC-KN6O7WSA.js +0 -8
- package/chunk-AJW7LDO5.js.map +0 -1
- package/dist-HGCFHXO4.js.map +0 -1
- package/web/assets/AiChatPage-C1r42kX7.js +0 -1
- package/web/assets/CollectionCookies.vue-DqNgVtd-.js +0 -1
- package/web/assets/CollectionScripts.vue-B2gkfo4d.js +0 -1
- package/web/assets/CollectionSync.vue-bB7sdahP.js +0 -1
- package/web/assets/DashboardPage-gZJ4_s8T.css +0 -1
- package/web/assets/DashboardPage-hIc9wP_Q.js +0 -1
- package/web/assets/KanbanBoardPage-DoXgFMvo.js +0 -141
- package/web/assets/KanbanBoardPage-hqNojI5j.css +0 -1
- package/web/assets/ServiceDetailPage-UVg73scN.js +0 -2
- package/web/assets/SettingsPage-Cg78lQZF.js +0 -225
- package/web/assets/process.store-CutdTiYB.js +0 -1
- package/web/assets/router-CuxdGfLF.js +0 -1
- package/web/assets/trpc-BIjF6nTt.js +0 -1
- package/web/assets/useAiChatDrawer-BJugMTj0.js +0 -1
- /package/{agent-manager-3DHUF2DC-KN6O7WSA.js.map → agent-manager-7IDZTNVZ-HVRWIXYW.js.map} +0 -0
- /package/web/assets/{_plugin-vue_export-helper-C08BWUE4.js → _plugin-vue_export-helper-BVSTY9ge.js} +0 -0
- /package/web/assets/{abap-BMPR0rjj.js → abap-DktqfXDx.js} +0 -0
- /package/web/assets/{apex-DYC4uYYf.js → apex-C84w8VGC.js} +0 -0
- /package/web/assets/{azcli-GZlxEjpa.js → azcli-Cs5iRzPw.js} +0 -0
- /package/web/assets/{base64-VLYHbiMn.js → base64-CG47Jc3Y.js} +0 -0
- /package/web/assets/{bat-Cv8OxItG.js → bat-Bxztgnvx.js} +0 -0
- /package/web/assets/{bicep-CuCbE6Ue.js → bicep-EmTmx6Fy.js} +0 -0
- /package/web/assets/{cameligo-BEPX3585.js → cameligo-DZYk6cOD.js} +0 -0
- /package/web/assets/{clojure--6rbXIPY.js → clojure-QYeZgX63.js} +0 -0
- /package/web/assets/{coffee-ByvVcDGX.js → coffee-DP64XG_I.js} +0 -0
- /package/web/assets/{cpp-CECtPnZp.js → cpp-Dz6-l8vs.js} +0 -0
- /package/web/assets/{csharp-DyYyZ8UX.js → csharp-CcVGRY-t.js} +0 -0
- /package/web/assets/{csp-B9apvcI9.js → csp-Cqpt0M-R.js} +0 -0
- /package/web/assets/{css-CfdBNbB0.js → css-BEjT2o3U.js} +0 -0
- /package/web/assets/{cypher-BPqQq4XX.js → cypher-CFsKHT39.js} +0 -0
- /package/web/assets/{dart-BLToxiYU.js → dart-Dd8xW03D.js} +0 -0
- /package/web/assets/{dist-COg0nRYK.js → dist-BPIMeATj.js} +0 -0
- /package/web/assets/{dockerfile-CKo5jN7V.js → dockerfile-MHoTmcM0.js} +0 -0
- /package/web/assets/{ecl-qo8pi1Ty.js → ecl-DDOk3_u-.js} +0 -0
- /package/web/assets/{elixir-Dv1YAMPJ.js → elixir-BrvvYQkl.js} +0 -0
- /package/web/assets/{flow9-BKTKs1nN.js → flow9-Desf9xEz.js} +0 -0
- /package/web/assets/{fsharp-BPoxgmtD.js → fsharp-B8Icgpa6.js} +0 -0
- /package/web/assets/{go-DgJ-2ryf.js → go-Do5MIzaM.js} +0 -0
- /package/web/assets/{graphql-YTK8zpFe.js → graphql-CiG6oX7b.js} +0 -0
- /package/web/assets/{hcl-tYOvwaJ3.js → hcl-C-xKM4WW.js} +0 -0
- /package/web/assets/{ini-BTZ3lNbM.js → ini-DXIR0OjP.js} +0 -0
- /package/web/assets/{java-boRe0CIQ.js → java-Dy8EfEt9.js} +0 -0
- /package/web/assets/{julia-K6BtoWYX.js → julia-DkrFX1s_.js} +0 -0
- /package/web/assets/{kotlin-CglG00z4.js → kotlin-Dar7GDKm.js} +0 -0
- /package/web/assets/{less-DlnIYk4g.js → less-DzP6DgzU.js} +0 -0
- /package/web/assets/{lexon-D4aKXJ0J.js → lexon-DptP6qTd.js} +0 -0
- /package/web/assets/{lua-DeQCQ0IN.js → lua-CCVwtOWf.js} +0 -0
- /package/web/assets/{m3-yCjRJP_i.js → m3-DrEvvio5.js} +0 -0
- /package/web/assets/{markdown-C2IT79AR.js → markdown-ruxuCKkk.js} +0 -0
- /package/web/assets/{mips-BAnhwv_D.js → mips-BQqMOsEB.js} +0 -0
- /package/web/assets/{msdax-D1jHDTih.js → msdax-phO8WA3n.js} +0 -0
- /package/web/assets/{mysql-CTJU-jL7.js → mysql-CTdeo58Q.js} +0 -0
- /package/web/assets/{objective-c-CwxzUA28.js → objective-c-jhQ0iM6X.js} +0 -0
- /package/web/assets/{pascal-DpSQp86i.js → pascal-C8SkzMHp.js} +0 -0
- /package/web/assets/{pascaligo-C4F0Gc12.js → pascaligo-ArPaQLGJ.js} +0 -0
- /package/web/assets/{perl-87HvGh3u.js → perl-DdJtSHIR.js} +0 -0
- /package/web/assets/{pgsql-DUB3YVHd.js → pgsql-DzJ8nWb2.js} +0 -0
- /package/web/assets/{php-gpgbnwXh.js → php-CCjtAB9z.js} +0 -0
- /package/web/assets/{pla-9VH1h0qA.js → pla-BcEbmw3g.js} +0 -0
- /package/web/assets/{postiats-DYNil0RB.js → postiats-Fpcus-uJ.js} +0 -0
- /package/web/assets/{powerquery-Cyj_QMWN.js → powerquery-Cu-9g7NG.js} +0 -0
- /package/web/assets/{powershell-BxsWzjwy.js → powershell-DO2fUGfn.js} +0 -0
- /package/web/assets/{protobuf-CpB35fc2.js → protobuf-DQup7qRj.js} +0 -0
- /package/web/assets/{pug-CQ3BHXrf.js → pug-Duim2NdD.js} +0 -0
- /package/web/assets/{qsharp-hvdiA16n.js → qsharp-CytI7IVT.js} +0 -0
- /package/web/assets/{r-BcpSD-1e.js → r-DZINbLk_.js} +0 -0
- /package/web/assets/{redis-B2JGUU7L.js → redis-Bf0SVuM0.js} +0 -0
- /package/web/assets/{redshift-DtV7K8A1.js → redshift-oHIhn4rc.js} +0 -0
- /package/web/assets/{restructuredtext-avYcqBCA.js → restructuredtext-B3n-oeH1.js} +0 -0
- /package/web/assets/{ruby-B75_Tp8C.js → ruby-DXTCv0Dq.js} +0 -0
- /package/web/assets/{rust-CHon-ZXH.js → rust-BM9bjpGj.js} +0 -0
- /package/web/assets/{sb-iehvyQKY.js → sb-BU8bPS70.js} +0 -0
- /package/web/assets/{scala-LBw1ennX.js → scala-BP9uGS4X.js} +0 -0
- /package/web/assets/{scheme-BRK_sKgt.js → scheme-rmkEHrlu.js} +0 -0
- /package/web/assets/{scss-CzbUsG5V.js → scss-BtCDKYlG.js} +0 -0
- /package/web/assets/{shell-DdtWj1FH.js → shell-CG1BTV1P.js} +0 -0
- /package/web/assets/{solidity-CBYPsj6K.js → solidity-DAYsr878.js} +0 -0
- /package/web/assets/{sophia-BAmZLhFu.js → sophia-DLSOk_-J.js} +0 -0
- /package/web/assets/{sparql-DzxQz_25.js → sparql-C_sea8Qf.js} +0 -0
- /package/web/assets/{sql-CtZa8xg5.js → sql-zI2PRpPJ.js} +0 -0
- /package/web/assets/{st-3yAXYt2f.js → st-VM0k3m2K.js} +0 -0
- /package/web/assets/{swift-nwo4k0Qx.js → swift-DAxKPUqq.js} +0 -0
- /package/web/assets/{systemverilog-38mUSYaO.js → systemverilog-D3gk_LvQ.js} +0 -0
- /package/web/assets/{tcl-DfkL3MZ2.js → tcl-YQSEIPQI.js} +0 -0
- /package/web/assets/{twig-C2_DTvv-.js → twig-Bt5uw3P4.js} +0 -0
- /package/web/assets/{typespec-Dn7A_7aO.js → typespec-CF_qDuWb.js} +0 -0
- /package/web/assets/{vb-ByZEqbuQ.js → vb-DERgblZJ.js} +0 -0
- /package/web/assets/{w3c-keyname-CXRaQfIQ.js → w3c-keyname-B0Po4pAC.js} +0 -0
- /package/web/assets/{wgsl-BqCLRRs9.js → wgsl-BrfJ-tM_.js} +0 -0
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
nativeParsers,
|
|
35
35
|
serviceStore,
|
|
36
36
|
traefikManager
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-AHOJAT74.js";
|
|
38
38
|
import {
|
|
39
39
|
generateKanbanPopulatePrompt,
|
|
40
40
|
generateKanbanSystemPrompt,
|
|
@@ -177,34 +177,38 @@ import { EventEmitter as EventEmitter3 } from "events";
|
|
|
177
177
|
import { z as z20 } from "zod";
|
|
178
178
|
import { TRPCError as TRPCError17 } from "@trpc/server";
|
|
179
179
|
import { z as z21 } from "zod";
|
|
180
|
-
import {
|
|
181
|
-
import {
|
|
182
|
-
import { writeFile as writeFile10 } from "fs/promises";
|
|
180
|
+
import { z as z22 } from "zod";
|
|
181
|
+
import { TRPCError as TRPCError18 } from "@trpc/server";
|
|
182
|
+
import { readFile as readFile12, readdir as readdir4, stat as stat3, realpath, writeFile as writeFile10, mkdir as mkdir13, rename as rename9, rm as rm2 } from "fs/promises";
|
|
183
|
+
import { resolve as resolvePath, join as join14, relative, sep as sep3, dirname as dirname3 } from "path";
|
|
184
|
+
import { chmod as chmod8, stat as stat4 } from "fs/promises";
|
|
183
185
|
import { join as join15 } from "path";
|
|
186
|
+
import { writeFile as writeFile11 } from "fs/promises";
|
|
187
|
+
import { join as join16 } from "path";
|
|
184
188
|
import { createRequire } from "module";
|
|
185
189
|
import { randomBytes as randomBytes3, createCipheriv, createDecipheriv } from "crypto";
|
|
186
190
|
import { randomUUID as randomUUID10 } from "crypto";
|
|
187
191
|
import {
|
|
188
|
-
readFile as
|
|
189
|
-
writeFile as
|
|
190
|
-
rename as
|
|
191
|
-
mkdir as
|
|
192
|
+
readFile as readFile13,
|
|
193
|
+
writeFile as writeFile12,
|
|
194
|
+
rename as rename10,
|
|
195
|
+
mkdir as mkdir14,
|
|
192
196
|
access as access2,
|
|
193
|
-
readdir as
|
|
197
|
+
readdir as readdir5
|
|
194
198
|
} from "fs/promises";
|
|
195
|
-
import { join as join16 } from "path";
|
|
196
|
-
import { randomBytes as randomBytes4, createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2 } from "crypto";
|
|
197
|
-
import { readFile as readFile13, writeFile as writeFile12, chmod as chmod9, stat as stat4, rename as rename10 } from "fs/promises";
|
|
198
199
|
import { join as join17 } from "path";
|
|
200
|
+
import { randomBytes as randomBytes4, createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2 } from "crypto";
|
|
201
|
+
import { readFile as readFile14, writeFile as writeFile13, chmod as chmod9, stat as stat5, rename as rename11 } from "fs/promises";
|
|
202
|
+
import { join as join18 } from "path";
|
|
199
203
|
import { Entry } from "@napi-rs/keyring";
|
|
200
204
|
import { hashRaw as argon2HashRaw } from "@node-rs/argon2";
|
|
201
|
-
import { join as
|
|
202
|
-
import { stat as
|
|
205
|
+
import { join as join19 } from "path";
|
|
206
|
+
import { stat as stat6 } from "fs/promises";
|
|
203
207
|
import rateLimit from "express-rate-limit";
|
|
204
208
|
import { existsSync as existsSync2, createReadStream } from "fs";
|
|
205
|
-
import { mkdir as
|
|
209
|
+
import { mkdir as mkdir15 } from "fs/promises";
|
|
206
210
|
import multer from "multer";
|
|
207
|
-
import { resolve as
|
|
211
|
+
import { resolve as resolvePath2 } from "path";
|
|
208
212
|
import dotenv from "dotenv";
|
|
209
213
|
var jwtSecret = null;
|
|
210
214
|
var jwtSecretGeneratedAt = 0;
|
|
@@ -408,7 +412,7 @@ function requireEnvAction(ctx, environmentId, action, serviceId) {
|
|
|
408
412
|
});
|
|
409
413
|
}
|
|
410
414
|
var startedAt = Date.now();
|
|
411
|
-
var appVersion = process.env["RUNEYA_VERSION"] ?? (true ? "2.0.
|
|
415
|
+
var appVersion = process.env["RUNEYA_VERSION"] ?? (true ? "2.0.15" : "dev");
|
|
412
416
|
var healthRouter = router({
|
|
413
417
|
check: publicProcedure.meta({ openapi: { method: "GET", path: "/health", tags: ["health"], summary: "Health check" } }).output(z.object({ status: z.literal("ok"), uptime: z.number(), version: z.string() })).query(() => {
|
|
414
418
|
return {
|
|
@@ -1332,6 +1336,7 @@ var serviceRouter = router({
|
|
|
1332
1336
|
ports: z3.array(z3.number().int().min(1).max(65535)).max(20).optional(),
|
|
1333
1337
|
groups: z3.array(z3.string().max(200)).max(20).optional(),
|
|
1334
1338
|
description: z3.string().max(2e3).optional(),
|
|
1339
|
+
docsPath: z3.string().max(4096).optional(),
|
|
1335
1340
|
url: z3.string().max(2048).optional(),
|
|
1336
1341
|
localUrls: z3.array(z3.object({
|
|
1337
1342
|
url: z3.string().max(253),
|
|
@@ -1382,6 +1387,7 @@ var serviceRouter = router({
|
|
|
1382
1387
|
ports: z3.array(z3.number().int().min(1).max(65535)).max(20).optional(),
|
|
1383
1388
|
groups: z3.array(z3.string().max(200)).max(20).optional(),
|
|
1384
1389
|
description: z3.string().max(2e3).optional(),
|
|
1390
|
+
docsPath: z3.string().max(4096).optional(),
|
|
1385
1391
|
url: z3.string().max(2048).optional(),
|
|
1386
1392
|
localUrls: z3.array(z3.object({
|
|
1387
1393
|
url: z3.string().max(253),
|
|
@@ -2230,7 +2236,7 @@ var settingsRouter = router({
|
|
|
2230
2236
|
/**
|
|
2231
2237
|
* Update settings (mode, cloudUrl)
|
|
2232
2238
|
*/
|
|
2233
|
-
update: protectedProcedure.input(SettingsSchema.pick({ mode: true, cloudUrl: true }).partial()).mutation(async ({ input }) => {
|
|
2239
|
+
update: protectedProcedure.input(SettingsSchema.pick({ mode: true, cloudUrl: true, globalDocsPath: true }).partial()).mutation(async ({ input }) => {
|
|
2234
2240
|
const current = await settingsManager.getSettings();
|
|
2235
2241
|
const updated = {
|
|
2236
2242
|
...current,
|
|
@@ -5070,7 +5076,7 @@ function tailTranscript(opts) {
|
|
|
5070
5076
|
};
|
|
5071
5077
|
}
|
|
5072
5078
|
async function getAgentManager() {
|
|
5073
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
5079
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-7IDZTNVZ-HVRWIXYW.js");
|
|
5074
5080
|
return agentManager2;
|
|
5075
5081
|
}
|
|
5076
5082
|
function buildPtyArgs(params, sessionId, opts) {
|
|
@@ -5243,7 +5249,7 @@ async function runClaudeViaPty(params) {
|
|
|
5243
5249
|
});
|
|
5244
5250
|
}
|
|
5245
5251
|
async function getAgentManager2() {
|
|
5246
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
5252
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-7IDZTNVZ-HVRWIXYW.js");
|
|
5247
5253
|
return agentManager2;
|
|
5248
5254
|
}
|
|
5249
5255
|
function createClaudeStreamState() {
|
|
@@ -5816,7 +5822,7 @@ async function shutdownCodexAppServer() {
|
|
|
5816
5822
|
}
|
|
5817
5823
|
}
|
|
5818
5824
|
async function getAgentManager3() {
|
|
5819
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
5825
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-7IDZTNVZ-HVRWIXYW.js");
|
|
5820
5826
|
return agentManager2;
|
|
5821
5827
|
}
|
|
5822
5828
|
function parseRuneyaCurlCommand(command) {
|
|
@@ -6733,6 +6739,19 @@ var chatRouter = router({
|
|
|
6733
6739
|
delete: protectedProcedure.input(z14.object({ id: Id128Schema })).mutation(async ({ input }) => {
|
|
6734
6740
|
const existing = await conversationStore.get(input.id);
|
|
6735
6741
|
if (!existing) throw new TRPCError10({ code: "NOT_FOUND", message: "Conversation not found" });
|
|
6742
|
+
for (const agent of agentManager.listAgents()) {
|
|
6743
|
+
const agentId = agent.config.id;
|
|
6744
|
+
agentManager.agentQuery(
|
|
6745
|
+
agentId,
|
|
6746
|
+
"ai.findPtyBySession",
|
|
6747
|
+
{ sessionId: input.id }
|
|
6748
|
+
).then((pty3) => {
|
|
6749
|
+
if (pty3?.status === "running") {
|
|
6750
|
+
return agentManager.agentMutation(agentId, "ai.kill", { spawnId: pty3.spawnId });
|
|
6751
|
+
}
|
|
6752
|
+
}).catch(() => {
|
|
6753
|
+
});
|
|
6754
|
+
}
|
|
6736
6755
|
await conversationStore.delete(input.id);
|
|
6737
6756
|
await scenarioRunStore.deleteRunDir(input.id);
|
|
6738
6757
|
imageStorageService.deleteByContextId(input.id).catch(
|
|
@@ -10007,6 +10026,228 @@ var utilityRouter = router({
|
|
|
10007
10026
|
return { waited: input.ms };
|
|
10008
10027
|
})
|
|
10009
10028
|
});
|
|
10029
|
+
var SCOPE_SCHEMA = z22.union([
|
|
10030
|
+
z22.literal("global"),
|
|
10031
|
+
z22.string().regex(/^service:[A-Za-z0-9_-]{1,128}$/, "Invalid service scope")
|
|
10032
|
+
]);
|
|
10033
|
+
var REL_PATH_SCHEMA = z22.string().min(1).max(512).regex(/^[A-Za-z0-9_./-]+$/).refine((p) => !p.includes("..") && !p.startsWith("/"), {
|
|
10034
|
+
message: "Path must be a relative path without traversal"
|
|
10035
|
+
});
|
|
10036
|
+
var MAX_FILES = 500;
|
|
10037
|
+
var MAX_DEPTH = 8;
|
|
10038
|
+
var MAX_FILE_BYTES = 2e6;
|
|
10039
|
+
var IGNORED_DIRS = /* @__PURE__ */ new Set([
|
|
10040
|
+
"node_modules",
|
|
10041
|
+
".git",
|
|
10042
|
+
"dist",
|
|
10043
|
+
"build",
|
|
10044
|
+
".next",
|
|
10045
|
+
".turbo",
|
|
10046
|
+
".cache",
|
|
10047
|
+
"coverage",
|
|
10048
|
+
".yarn",
|
|
10049
|
+
".pnpm-store",
|
|
10050
|
+
"target",
|
|
10051
|
+
"out"
|
|
10052
|
+
]);
|
|
10053
|
+
var DocsEntrySchema = z22.lazy(() => z22.union([
|
|
10054
|
+
z22.object({ type: z22.literal("file"), name: z22.string(), path: z22.string() }),
|
|
10055
|
+
z22.object({ type: z22.literal("dir"), name: z22.string(), path: z22.string(), children: z22.array(DocsEntrySchema) })
|
|
10056
|
+
]));
|
|
10057
|
+
async function resolveScope(scope) {
|
|
10058
|
+
if (scope === "global") {
|
|
10059
|
+
const settings = await settingsManager.getSettings();
|
|
10060
|
+
const sub = (settings.globalDocsPath?.trim() || "wiki").replace(/^[\\/]+|[\\/]+$/g, "");
|
|
10061
|
+
if (sub.includes("..") || sub.includes("\0")) {
|
|
10062
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "Sous-chemin invalide" });
|
|
10063
|
+
}
|
|
10064
|
+
const dataDirAbs = resolvePath(env.DATA_DIR);
|
|
10065
|
+
await mkdir13(dataDirAbs, { recursive: true });
|
|
10066
|
+
const base = dirname3(await realpath(dataDirAbs));
|
|
10067
|
+
const target = resolvePath(base, sub);
|
|
10068
|
+
if (target !== base && !(target + sep3).startsWith(base + sep3)) {
|
|
10069
|
+
throw new TRPCError18({ code: "FORBIDDEN", message: "Hors du dossier de donn\xE9es du serveur" });
|
|
10070
|
+
}
|
|
10071
|
+
await mkdir13(target, { recursive: true });
|
|
10072
|
+
const root = await realpath(target);
|
|
10073
|
+
if (root !== base && !(root + sep3).startsWith(base + sep3)) {
|
|
10074
|
+
throw new TRPCError18({ code: "FORBIDDEN", message: "Le dossier wiki r\xE9sout hors du dossier de donn\xE9es" });
|
|
10075
|
+
}
|
|
10076
|
+
return { mode: "local", root };
|
|
10077
|
+
}
|
|
10078
|
+
const serviceId = scope.slice("service:".length);
|
|
10079
|
+
const service = await serviceStore.get(serviceId);
|
|
10080
|
+
if (!service) throw new TRPCError18({ code: "NOT_FOUND", message: "Service introuvable" });
|
|
10081
|
+
const agentId = await resolveEffectiveAgentId(service);
|
|
10082
|
+
if (!agentId) throw new TRPCError18({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9 pour ce service" });
|
|
10083
|
+
const cwd = (service.docsPath?.trim() || service.cwd || ".").toString();
|
|
10084
|
+
return { mode: "agent", agentId, cwd };
|
|
10085
|
+
}
|
|
10086
|
+
async function walkLocal(root, dir, depth, counter) {
|
|
10087
|
+
if (depth > MAX_DEPTH || counter.n >= MAX_FILES) return [];
|
|
10088
|
+
let entries;
|
|
10089
|
+
try {
|
|
10090
|
+
entries = await readdir4(dir, { withFileTypes: true });
|
|
10091
|
+
} catch {
|
|
10092
|
+
return [];
|
|
10093
|
+
}
|
|
10094
|
+
const out = [];
|
|
10095
|
+
for (const e of entries) {
|
|
10096
|
+
if (counter.n >= MAX_FILES) break;
|
|
10097
|
+
if (e.name.startsWith(".") && e.name !== ".") continue;
|
|
10098
|
+
const abs = join14(dir, e.name);
|
|
10099
|
+
const rel = relative(root, abs).split(sep3).join("/");
|
|
10100
|
+
if (e.isDirectory()) {
|
|
10101
|
+
if (IGNORED_DIRS.has(e.name)) continue;
|
|
10102
|
+
const children = await walkLocal(root, abs, depth + 1, counter);
|
|
10103
|
+
out.push({ type: "dir", name: e.name, path: rel, children });
|
|
10104
|
+
} else if (e.isFile() && /\.(md|markdown)$/i.test(e.name)) {
|
|
10105
|
+
counter.n += 1;
|
|
10106
|
+
out.push({ type: "file", name: e.name, path: rel });
|
|
10107
|
+
}
|
|
10108
|
+
}
|
|
10109
|
+
out.sort((a, b) => {
|
|
10110
|
+
if (a.type !== b.type) return a.type === "dir" ? -1 : 1;
|
|
10111
|
+
return a.name.localeCompare(b.name);
|
|
10112
|
+
});
|
|
10113
|
+
return out;
|
|
10114
|
+
}
|
|
10115
|
+
async function resolveSafeLocal(root, relPath, requireExist) {
|
|
10116
|
+
if (relPath.includes("..") || relPath.startsWith("/")) {
|
|
10117
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "Chemin invalide" });
|
|
10118
|
+
}
|
|
10119
|
+
const target = resolvePath(root, relPath);
|
|
10120
|
+
if (requireExist) {
|
|
10121
|
+
let real;
|
|
10122
|
+
try {
|
|
10123
|
+
real = await realpath(target);
|
|
10124
|
+
} catch {
|
|
10125
|
+
throw new TRPCError18({ code: "NOT_FOUND", message: "Chemin introuvable" });
|
|
10126
|
+
}
|
|
10127
|
+
if (real !== root && !(real + sep3).startsWith(root + sep3)) {
|
|
10128
|
+
throw new TRPCError18({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
|
|
10129
|
+
}
|
|
10130
|
+
return real;
|
|
10131
|
+
}
|
|
10132
|
+
const parent = dirname3(target);
|
|
10133
|
+
let realParent;
|
|
10134
|
+
try {
|
|
10135
|
+
realParent = await realpath(parent);
|
|
10136
|
+
} catch {
|
|
10137
|
+
realParent = parent;
|
|
10138
|
+
}
|
|
10139
|
+
if (realParent !== root && !(realParent + sep3).startsWith(root + sep3)) {
|
|
10140
|
+
throw new TRPCError18({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
|
|
10141
|
+
}
|
|
10142
|
+
return resolvePath(realParent, target.slice(parent.length).replace(/^[\\/]+/, ""));
|
|
10143
|
+
}
|
|
10144
|
+
var wikiRouter = router({
|
|
10145
|
+
list: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA })).output(z22.object({ root: z22.string(), entries: z22.array(DocsEntrySchema), truncated: z22.boolean() })).query(async ({ input }) => {
|
|
10146
|
+
const target = await resolveScope(input.scope);
|
|
10147
|
+
if (target.mode === "agent") {
|
|
10148
|
+
return agentManager.agentQuery(target.agentId, "wiki.listRepoMarkdown", { cwd: target.cwd });
|
|
10149
|
+
}
|
|
10150
|
+
const counter = { n: 0 };
|
|
10151
|
+
const entries = await walkLocal(target.root, target.root, 0, counter);
|
|
10152
|
+
return { root: target.root, entries, truncated: counter.n >= MAX_FILES };
|
|
10153
|
+
}),
|
|
10154
|
+
read: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).output(z22.object({ path: z22.string(), content: z22.string() })).query(async ({ input }) => {
|
|
10155
|
+
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
10156
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
10157
|
+
}
|
|
10158
|
+
const target = await resolveScope(input.scope);
|
|
10159
|
+
if (target.mode === "agent") {
|
|
10160
|
+
return agentManager.agentQuery(target.agentId, "wiki.readRepoMarkdown", { cwd: target.cwd, path: input.path });
|
|
10161
|
+
}
|
|
10162
|
+
const file = await resolveSafeLocal(target.root, input.path, true);
|
|
10163
|
+
const s = await stat3(file);
|
|
10164
|
+
if (!s.isFile()) throw new TRPCError18({ code: "BAD_REQUEST", message: "Pas un fichier" });
|
|
10165
|
+
if (s.size > MAX_FILE_BYTES) throw new TRPCError18({ code: "PAYLOAD_TOO_LARGE", message: "Fichier trop volumineux" });
|
|
10166
|
+
const content = await readFile12(file, "utf-8");
|
|
10167
|
+
return { path: input.path, content };
|
|
10168
|
+
}),
|
|
10169
|
+
write: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA, content: z22.string().max(5e6) })).mutation(async ({ input }) => {
|
|
10170
|
+
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
10171
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
10172
|
+
}
|
|
10173
|
+
const target = await resolveScope(input.scope);
|
|
10174
|
+
if (target.mode === "agent") {
|
|
10175
|
+
return agentManager.agentMutation(target.agentId, "wiki.writeMarkdown", { cwd: target.cwd, path: input.path, content: input.content });
|
|
10176
|
+
}
|
|
10177
|
+
const file = await resolveSafeLocal(target.root, input.path, false);
|
|
10178
|
+
await mkdir13(dirname3(file), { recursive: true });
|
|
10179
|
+
await writeFile10(file, input.content, "utf-8");
|
|
10180
|
+
return { path: input.path, ok: true };
|
|
10181
|
+
}),
|
|
10182
|
+
createFile: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
10183
|
+
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
10184
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
10185
|
+
}
|
|
10186
|
+
const target = await resolveScope(input.scope);
|
|
10187
|
+
if (target.mode === "agent") {
|
|
10188
|
+
return agentManager.agentMutation(target.agentId, "wiki.createFile", { cwd: target.cwd, path: input.path });
|
|
10189
|
+
}
|
|
10190
|
+
const file = await resolveSafeLocal(target.root, input.path, false);
|
|
10191
|
+
try {
|
|
10192
|
+
await stat3(file);
|
|
10193
|
+
throw new TRPCError18({ code: "CONFLICT", message: "Fichier d\xE9j\xE0 existant" });
|
|
10194
|
+
} catch (err) {
|
|
10195
|
+
if (err instanceof TRPCError18) throw err;
|
|
10196
|
+
}
|
|
10197
|
+
await mkdir13(dirname3(file), { recursive: true });
|
|
10198
|
+
await writeFile10(file, "", "utf-8");
|
|
10199
|
+
return { path: input.path, ok: true };
|
|
10200
|
+
}),
|
|
10201
|
+
createDir: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
10202
|
+
const target = await resolveScope(input.scope);
|
|
10203
|
+
if (target.mode === "agent") {
|
|
10204
|
+
return agentManager.agentMutation(target.agentId, "wiki.createDir", { cwd: target.cwd, path: input.path });
|
|
10205
|
+
}
|
|
10206
|
+
const dir = await resolveSafeLocal(target.root, input.path, false);
|
|
10207
|
+
await mkdir13(dir, { recursive: true });
|
|
10208
|
+
return { path: input.path, ok: true };
|
|
10209
|
+
}),
|
|
10210
|
+
rename: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, fromPath: REL_PATH_SCHEMA, toPath: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
10211
|
+
const target = await resolveScope(input.scope);
|
|
10212
|
+
if (target.mode === "agent") {
|
|
10213
|
+
return agentManager.agentMutation(target.agentId, "wiki.renamePath", { cwd: target.cwd, fromPath: input.fromPath, toPath: input.toPath });
|
|
10214
|
+
}
|
|
10215
|
+
const from = await resolveSafeLocal(target.root, input.fromPath, true);
|
|
10216
|
+
const to = await resolveSafeLocal(target.root, input.toPath, false);
|
|
10217
|
+
try {
|
|
10218
|
+
await stat3(to);
|
|
10219
|
+
throw new TRPCError18({ code: "CONFLICT", message: "La cible existe d\xE9j\xE0" });
|
|
10220
|
+
} catch (err) {
|
|
10221
|
+
if (err instanceof TRPCError18) throw err;
|
|
10222
|
+
}
|
|
10223
|
+
await mkdir13(dirname3(to), { recursive: true });
|
|
10224
|
+
await rename9(from, to);
|
|
10225
|
+
return { fromPath: input.fromPath, toPath: input.toPath, ok: true };
|
|
10226
|
+
}),
|
|
10227
|
+
ensureRoot: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA })).mutation(async ({ input }) => {
|
|
10228
|
+
if (input.scope === "global") {
|
|
10229
|
+
await resolveScope("global");
|
|
10230
|
+
return { ok: true };
|
|
10231
|
+
}
|
|
10232
|
+
const serviceId = input.scope.slice("service:".length);
|
|
10233
|
+
const service = await serviceStore.get(serviceId);
|
|
10234
|
+
if (!service) throw new TRPCError18({ code: "NOT_FOUND", message: "Service introuvable" });
|
|
10235
|
+
const agentId = await resolveEffectiveAgentId(service);
|
|
10236
|
+
if (!agentId) throw new TRPCError18({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9" });
|
|
10237
|
+
const cwd = (service.docsPath?.trim() || service.cwd || ".").toString();
|
|
10238
|
+
return agentManager.agentMutation(agentId, "wiki.ensureRoot", { cwd });
|
|
10239
|
+
}),
|
|
10240
|
+
delete: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
10241
|
+
const target = await resolveScope(input.scope);
|
|
10242
|
+
if (target.mode === "agent") {
|
|
10243
|
+
return agentManager.agentMutation(target.agentId, "wiki.deletePath", { cwd: target.cwd, path: input.path });
|
|
10244
|
+
}
|
|
10245
|
+
const fp = await resolveSafeLocal(target.root, input.path, true);
|
|
10246
|
+
if (fp === target.root) throw new TRPCError18({ code: "FORBIDDEN", message: "Impossible de supprimer la racine" });
|
|
10247
|
+
await rm2(fp, { recursive: true, force: true });
|
|
10248
|
+
return { path: input.path, ok: true };
|
|
10249
|
+
})
|
|
10250
|
+
});
|
|
10010
10251
|
var appRouter = router({
|
|
10011
10252
|
health: healthRouter,
|
|
10012
10253
|
project: projectRouter,
|
|
@@ -10026,7 +10267,8 @@ var appRouter = router({
|
|
|
10026
10267
|
kanban: kanbanRouter,
|
|
10027
10268
|
kanbanQueue: kanbanQueueRouter,
|
|
10028
10269
|
terminal: terminalRouter,
|
|
10029
|
-
utility: utilityRouter
|
|
10270
|
+
utility: utilityRouter,
|
|
10271
|
+
wiki: wikiRouter
|
|
10030
10272
|
});
|
|
10031
10273
|
function errorHandler(err, _req, res, _next) {
|
|
10032
10274
|
console.error("[server] Unhandled error:", err);
|
|
@@ -10066,9 +10308,9 @@ var SENSITIVE_FILES = [
|
|
|
10066
10308
|
var SECURE_MODE = 384;
|
|
10067
10309
|
async function ensureFilePermissions() {
|
|
10068
10310
|
for (const filename of SENSITIVE_FILES) {
|
|
10069
|
-
const filepath =
|
|
10311
|
+
const filepath = join15(env.DATA_DIR, filename);
|
|
10070
10312
|
try {
|
|
10071
|
-
const stats = await
|
|
10313
|
+
const stats = await stat4(filepath);
|
|
10072
10314
|
const mode = stats.mode & 511;
|
|
10073
10315
|
if (mode !== SECURE_MODE) {
|
|
10074
10316
|
console.warn("[security] File", filename, "has mode", mode.toString(8) + ", fixing to 600");
|
|
@@ -10114,8 +10356,8 @@ conversations.private.json
|
|
|
10114
10356
|
*.log.*
|
|
10115
10357
|
`;
|
|
10116
10358
|
async function ensureDataGitignore(dataDir) {
|
|
10117
|
-
const gitignorePath =
|
|
10118
|
-
await
|
|
10359
|
+
const gitignorePath = join16(dataDir, ".gitignore");
|
|
10360
|
+
await writeFile11(gitignorePath, GITIGNORE_CONTENT, "utf-8");
|
|
10119
10361
|
}
|
|
10120
10362
|
var _require = createRequire(import.meta.url);
|
|
10121
10363
|
var PARSER_ID_MAP = {
|
|
@@ -10223,7 +10465,7 @@ async function getSodium() {
|
|
|
10223
10465
|
return _sodium;
|
|
10224
10466
|
}
|
|
10225
10467
|
async function decryptLegacyFile(filePath, key, sodium) {
|
|
10226
|
-
const raw = (await
|
|
10468
|
+
const raw = (await readFile13(filePath, "utf-8")).trim();
|
|
10227
10469
|
if (!raw || raw === "[]" || raw === "{}") {
|
|
10228
10470
|
try {
|
|
10229
10471
|
return JSON.parse(raw);
|
|
@@ -10243,14 +10485,14 @@ async function decryptLegacyFile(filePath, key, sodium) {
|
|
|
10243
10485
|
}
|
|
10244
10486
|
async function atomicWrite(path, data) {
|
|
10245
10487
|
const tmp = path + ".tmp";
|
|
10246
|
-
await
|
|
10247
|
-
await
|
|
10488
|
+
await writeFile12(tmp, JSON.stringify(data, null, 2), "utf-8");
|
|
10489
|
+
await rename10(tmp, path);
|
|
10248
10490
|
}
|
|
10249
10491
|
async function runLegacyMigration(dataDir) {
|
|
10250
10492
|
const { resolve: resolve5 } = await import("path");
|
|
10251
10493
|
const abCwd = resolve5(process.cwd());
|
|
10252
|
-
const legacyRoot =
|
|
10253
|
-
const legacyKeyPath =
|
|
10494
|
+
const legacyRoot = join17(abCwd, env.DATA_DIR);
|
|
10495
|
+
const legacyKeyPath = join17(legacyRoot, "dbs", "encryption-key.json");
|
|
10254
10496
|
try {
|
|
10255
10497
|
await access2(legacyKeyPath);
|
|
10256
10498
|
} catch {
|
|
@@ -10258,20 +10500,20 @@ async function runLegacyMigration(dataDir) {
|
|
|
10258
10500
|
}
|
|
10259
10501
|
console.log("[legacy-migration] Legacy Runeya data detected, starting migration\u2026");
|
|
10260
10502
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
10261
|
-
const legacyTmp =
|
|
10262
|
-
await
|
|
10263
|
-
await
|
|
10264
|
-
const legacyOld =
|
|
10265
|
-
await
|
|
10503
|
+
const legacyTmp = join17(abCwd, ".runeya-tmp");
|
|
10504
|
+
await rename10(legacyRoot, legacyTmp);
|
|
10505
|
+
await mkdir14(dataDir, { recursive: true });
|
|
10506
|
+
const legacyOld = join17(dataDir, `backup-${timestamp}`);
|
|
10507
|
+
await rename10(legacyTmp, legacyOld);
|
|
10266
10508
|
console.log(`[legacy-migration] Legacy data backed up to ${legacyOld}`);
|
|
10267
|
-
const keyJson = JSON.parse(await
|
|
10509
|
+
const keyJson = JSON.parse(await readFile13(join17(legacyOld, "dbs", "encryption-key.json"), "utf-8"));
|
|
10268
10510
|
const sodium = await getSodium();
|
|
10269
10511
|
const sodiumKey = sodium.from_base64(keyJson.encryptionKey);
|
|
10270
10512
|
const keyBuffer = Buffer.from(sodiumKey);
|
|
10271
10513
|
const runyeaKeyHex = keyBuffer.toString("hex");
|
|
10272
10514
|
await setEncryptionKey(runyeaKeyHex);
|
|
10273
10515
|
console.log("[legacy-migration] Encryption key loaded in memory (temporary)");
|
|
10274
|
-
const dbsDir =
|
|
10516
|
+
const dbsDir = join17(legacyOld, "dbs");
|
|
10275
10517
|
async function readEncrypted(filePath) {
|
|
10276
10518
|
try {
|
|
10277
10519
|
return await decryptLegacyFile(filePath, sodiumKey, sodium);
|
|
@@ -10280,29 +10522,29 @@ async function runLegacyMigration(dataDir) {
|
|
|
10280
10522
|
return null;
|
|
10281
10523
|
}
|
|
10282
10524
|
}
|
|
10283
|
-
const envsDir =
|
|
10284
|
-
const envFiles = (await
|
|
10525
|
+
const envsDir = join17(dbsDir, "envs");
|
|
10526
|
+
const envFiles = (await readdir5(envsDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
10285
10527
|
const legacyEnvs = {};
|
|
10286
10528
|
for (const file of envFiles) {
|
|
10287
10529
|
const name = file.replace(".encrypted.json", "");
|
|
10288
|
-
legacyEnvs[name] = await readEncrypted(
|
|
10530
|
+
legacyEnvs[name] = await readEncrypted(join17(envsDir, file));
|
|
10289
10531
|
}
|
|
10290
|
-
const servicesDir =
|
|
10291
|
-
const serviceFiles = (await
|
|
10532
|
+
const servicesDir = join17(dbsDir, "services");
|
|
10533
|
+
const serviceFiles = (await readdir5(servicesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
10292
10534
|
const legacyServices = {};
|
|
10293
10535
|
for (const file of serviceFiles) {
|
|
10294
10536
|
const name = file.replace(".encrypted.json", "");
|
|
10295
10537
|
if (!name) continue;
|
|
10296
|
-
const data = await readEncrypted(
|
|
10538
|
+
const data = await readEncrypted(join17(servicesDir, file));
|
|
10297
10539
|
if (data?.label) legacyServices[name] = data;
|
|
10298
10540
|
}
|
|
10299
|
-
const overridesDir =
|
|
10300
|
-
const overrideFiles = (await
|
|
10541
|
+
const overridesDir = join17(dbsDir, "overrides");
|
|
10542
|
+
const overrideFiles = (await readdir5(overridesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
10301
10543
|
const legacyServiceOverrides = {};
|
|
10302
10544
|
const legacyEnvOverrides = {};
|
|
10303
10545
|
for (const file of overrideFiles) {
|
|
10304
10546
|
const baseName = file.replace(".encrypted.json", "");
|
|
10305
|
-
const data = await readEncrypted(
|
|
10547
|
+
const data = await readEncrypted(join17(overridesDir, file));
|
|
10306
10548
|
if (!data) continue;
|
|
10307
10549
|
if (baseName.endsWith("-envs")) {
|
|
10308
10550
|
legacyServiceOverrides[baseName.slice(0, -5)] = data;
|
|
@@ -10310,11 +10552,11 @@ async function runLegacyMigration(dataDir) {
|
|
|
10310
10552
|
legacyEnvOverrides[baseName.slice(0, -12)] = data;
|
|
10311
10553
|
}
|
|
10312
10554
|
}
|
|
10313
|
-
const parsersDir =
|
|
10314
|
-
const parserFiles = (await
|
|
10555
|
+
const parsersDir = join17(dbsDir, "parsers");
|
|
10556
|
+
const parserFiles = (await readdir5(parsersDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
10315
10557
|
const legacyParsers = [];
|
|
10316
10558
|
for (const file of parserFiles) {
|
|
10317
|
-
const data = await readEncrypted(
|
|
10559
|
+
const data = await readEncrypted(join17(parsersDir, file));
|
|
10318
10560
|
if (data?.id) legacyParsers.push(data);
|
|
10319
10561
|
}
|
|
10320
10562
|
const projectMonoId = randomUUID10();
|
|
@@ -10655,7 +10897,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
10655
10897
|
}
|
|
10656
10898
|
let existingSettings = {};
|
|
10657
10899
|
try {
|
|
10658
|
-
existingSettings = JSON.parse(await
|
|
10900
|
+
existingSettings = JSON.parse(await readFile13(join17(dataDir, "settings.json"), "utf-8"));
|
|
10659
10901
|
} catch {
|
|
10660
10902
|
}
|
|
10661
10903
|
const migratedParsers = legacyParsers.map((p) => ({
|
|
@@ -10676,11 +10918,11 @@ ${p.transform ?? ""}`,
|
|
|
10676
10918
|
...migratedParsers
|
|
10677
10919
|
]
|
|
10678
10920
|
};
|
|
10679
|
-
await atomicWrite(
|
|
10680
|
-
await atomicWrite(
|
|
10681
|
-
await atomicWrite(
|
|
10682
|
-
await atomicWrite(
|
|
10683
|
-
await atomicWrite(
|
|
10921
|
+
await atomicWrite(join17(dataDir, "projects.json"), runeProjects);
|
|
10922
|
+
await atomicWrite(join17(dataDir, "services.json"), runeServices);
|
|
10923
|
+
await atomicWrite(join17(dataDir, "environments.json"), runeEnvs);
|
|
10924
|
+
await atomicWrite(join17(dataDir, "environment-overrides.json"), flatOverrides);
|
|
10925
|
+
await atomicWrite(join17(dataDir, "settings.json"), newSettings);
|
|
10684
10926
|
const svcEnvCount = runeEnvs.filter((e) => e.scope === "service").length;
|
|
10685
10927
|
console.log(`[legacy-migration] Written: ${runeProjects.length} projects, ${runeServices.length} services, ${runeEnvs.length} environments (${svcEnvCount} service-scoped)`);
|
|
10686
10928
|
console.log(`[legacy-migration] Overrides: ${Object.keys(flatOverrides).length}, custom parsers: ${migratedParsers.length} (all disabled \u2014 rewrite required)`);
|
|
@@ -10691,12 +10933,12 @@ ${p.transform ?? ""}`,
|
|
|
10691
10933
|
}
|
|
10692
10934
|
async function findLegacyKeyInBackup(dataDir) {
|
|
10693
10935
|
try {
|
|
10694
|
-
const entries = await
|
|
10936
|
+
const entries = await readdir5(dataDir);
|
|
10695
10937
|
const backupDirs = entries.filter((e) => e.startsWith("backup-")).sort().reverse();
|
|
10696
10938
|
for (const dir of backupDirs) {
|
|
10697
|
-
const keyJsonPath =
|
|
10939
|
+
const keyJsonPath = join17(dataDir, dir, "dbs", "encryption-key.json");
|
|
10698
10940
|
try {
|
|
10699
|
-
const raw = await
|
|
10941
|
+
const raw = await readFile13(keyJsonPath, "utf-8");
|
|
10700
10942
|
const parsed = JSON.parse(raw);
|
|
10701
10943
|
if (!parsed.encryptionKey) continue;
|
|
10702
10944
|
const sodium = await getSodium();
|
|
@@ -10718,14 +10960,14 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10718
10960
|
const abDataDir = resolve5(dataDir);
|
|
10719
10961
|
const abCwd = resolve5(process.cwd());
|
|
10720
10962
|
const candidateDirs = [
|
|
10721
|
-
|
|
10722
|
-
|
|
10963
|
+
join17(abCwd, ".runeya", "dbs", "overrides"),
|
|
10964
|
+
join17(abDataDir, "dbs", "overrides")
|
|
10723
10965
|
];
|
|
10724
10966
|
let overridesDir = null;
|
|
10725
10967
|
let overrideFiles = [];
|
|
10726
10968
|
for (const dir of candidateDirs) {
|
|
10727
10969
|
try {
|
|
10728
|
-
const files = (await
|
|
10970
|
+
const files = (await readdir5(dir)).filter((f) => f.endsWith(".encrypted.json"));
|
|
10729
10971
|
if (files.length > 0) {
|
|
10730
10972
|
overridesDir = dir;
|
|
10731
10973
|
overrideFiles = files;
|
|
@@ -10735,7 +10977,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10735
10977
|
}
|
|
10736
10978
|
}
|
|
10737
10979
|
if (!overridesDir || overrideFiles.length === 0) return false;
|
|
10738
|
-
const legacyKeyPath =
|
|
10980
|
+
const legacyKeyPath = join17(overridesDir, "..", "encryption-key.json");
|
|
10739
10981
|
try {
|
|
10740
10982
|
await access2(legacyKeyPath);
|
|
10741
10983
|
return false;
|
|
@@ -10753,7 +10995,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10753
10995
|
const envNameToId = {};
|
|
10754
10996
|
let envsRaw;
|
|
10755
10997
|
try {
|
|
10756
|
-
envsRaw = JSON.parse(await
|
|
10998
|
+
envsRaw = JSON.parse(await readFile13(join17(abDataDir, "environments.json"), "utf-8"));
|
|
10757
10999
|
for (const _env of envsRaw) {
|
|
10758
11000
|
const env2 = _env;
|
|
10759
11001
|
if (env2["name"] && env2["id"]) {
|
|
@@ -10772,7 +11014,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10772
11014
|
let servicesRaw = [];
|
|
10773
11015
|
const serviceNameToId = {};
|
|
10774
11016
|
try {
|
|
10775
|
-
servicesRaw = JSON.parse(await
|
|
11017
|
+
servicesRaw = JSON.parse(await readFile13(join17(abDataDir, "services.json"), "utf-8"));
|
|
10776
11018
|
for (const _svc of servicesRaw) {
|
|
10777
11019
|
const svc = _svc;
|
|
10778
11020
|
if (svc["name"] && svc["id"]) serviceNameToId[svc["name"]] = svc["id"];
|
|
@@ -10789,7 +11031,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10789
11031
|
const envName = baseName.slice(0, -"-environment".length);
|
|
10790
11032
|
let data;
|
|
10791
11033
|
try {
|
|
10792
|
-
data = await decryptLegacyFile(
|
|
11034
|
+
data = await decryptLegacyFile(join17(overridesDir, file), sodiumKey, sodium);
|
|
10793
11035
|
} catch (err) {
|
|
10794
11036
|
console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
|
|
10795
11037
|
continue;
|
|
@@ -10816,7 +11058,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10816
11058
|
}
|
|
10817
11059
|
}
|
|
10818
11060
|
if (Object.keys(flatOverrides).length > 0) {
|
|
10819
|
-
await atomicWrite(
|
|
11061
|
+
await atomicWrite(join17(abDataDir, "environment-overrides.json"), flatOverrides);
|
|
10820
11062
|
console.log(`[override-migration] Written ${Object.keys(flatOverrides).length} override(s) to environment-overrides.json`);
|
|
10821
11063
|
}
|
|
10822
11064
|
let envsModified = false;
|
|
@@ -10826,7 +11068,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10826
11068
|
const serviceName = baseName.slice(0, -"-envs".length);
|
|
10827
11069
|
let data;
|
|
10828
11070
|
try {
|
|
10829
|
-
data = await decryptLegacyFile(
|
|
11071
|
+
data = await decryptLegacyFile(join17(overridesDir, file), sodiumKey, sodium);
|
|
10830
11072
|
} catch (err) {
|
|
10831
11073
|
console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
|
|
10832
11074
|
continue;
|
|
@@ -10885,12 +11127,12 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10885
11127
|
}
|
|
10886
11128
|
}
|
|
10887
11129
|
if (envsModified) {
|
|
10888
|
-
await atomicWrite(
|
|
11130
|
+
await atomicWrite(join17(abDataDir, "environments.json"), envsRaw);
|
|
10889
11131
|
console.log("[override-migration] Merged service overrides into environments.json");
|
|
10890
11132
|
}
|
|
10891
11133
|
const migratedDir = overridesDir.replace(/overrides$/, "overrides-migrated");
|
|
10892
11134
|
try {
|
|
10893
|
-
await
|
|
11135
|
+
await rename10(overridesDir, migratedDir);
|
|
10894
11136
|
console.log(`[override-migration] Moved overrides/ \u2192 overrides-migrated/`);
|
|
10895
11137
|
} catch (err) {
|
|
10896
11138
|
console.warn(`[override-migration] Could not rename overrides dir: ${err.message}`);
|
|
@@ -10907,9 +11149,9 @@ var CANARY_PLAINTEXT = "runeya:v1:key-verification";
|
|
|
10907
11149
|
var MAX_KEY_FILE_SIZE = 1024;
|
|
10908
11150
|
var ARGON2_OPTIONS = { memoryCost: 65536, timeCost: 3, parallelism: 4, outputLen: 32 };
|
|
10909
11151
|
async function readKeyFile(filePath) {
|
|
10910
|
-
const s = await
|
|
11152
|
+
const s = await stat5(filePath);
|
|
10911
11153
|
if (s.size > MAX_KEY_FILE_SIZE) throw new Error(`Fichier suspect : ${filePath} (${s.size} octets)`);
|
|
10912
|
-
return
|
|
11154
|
+
return readFile14(filePath);
|
|
10913
11155
|
}
|
|
10914
11156
|
function aesEncrypt(key, plaintext) {
|
|
10915
11157
|
const iv = randomBytes4(12);
|
|
@@ -10928,7 +11170,7 @@ function aesDecrypt(key, data) {
|
|
|
10928
11170
|
}
|
|
10929
11171
|
async function getPepperFromFile(dataDir) {
|
|
10930
11172
|
try {
|
|
10931
|
-
const raw = await readKeyFile(
|
|
11173
|
+
const raw = await readKeyFile(join18(dataDir, PEPPER_FILENAME));
|
|
10932
11174
|
const hex = raw.toString("utf-8").trim();
|
|
10933
11175
|
if (/^[0-9a-f]{64}$/i.test(hex)) return Buffer.from(hex, "hex");
|
|
10934
11176
|
} catch {
|
|
@@ -10936,11 +11178,11 @@ async function getPepperFromFile(dataDir) {
|
|
|
10936
11178
|
return null;
|
|
10937
11179
|
}
|
|
10938
11180
|
async function writePepperToFile(dataDir, pepper) {
|
|
10939
|
-
const filePath =
|
|
11181
|
+
const filePath = join18(dataDir, PEPPER_FILENAME);
|
|
10940
11182
|
const tmpPath = filePath + ".tmp";
|
|
10941
|
-
await
|
|
11183
|
+
await writeFile13(tmpPath, pepper.toString("hex"), "utf-8");
|
|
10942
11184
|
await chmod9(tmpPath, 384);
|
|
10943
|
-
await
|
|
11185
|
+
await rename11(tmpPath, filePath);
|
|
10944
11186
|
}
|
|
10945
11187
|
function tryKeyringGet() {
|
|
10946
11188
|
try {
|
|
@@ -10987,14 +11229,14 @@ async function writeEncryptedKey(dataDir, masterPassword, encryptionKey) {
|
|
|
10987
11229
|
const payload = aesEncrypt(derivedKey, encryptionKey);
|
|
10988
11230
|
const fileContent = Buffer.concat([salt, payload]);
|
|
10989
11231
|
const encoded = fileContent.toString("base64");
|
|
10990
|
-
const filePath =
|
|
11232
|
+
const filePath = join18(dataDir, ENCRYPTED_KEY_FILENAME);
|
|
10991
11233
|
const tmpPath = filePath + ".tmp";
|
|
10992
|
-
await
|
|
11234
|
+
await writeFile13(tmpPath, encoded, "utf-8");
|
|
10993
11235
|
await chmod9(tmpPath, 384);
|
|
10994
|
-
await
|
|
11236
|
+
await rename11(tmpPath, filePath);
|
|
10995
11237
|
}
|
|
10996
11238
|
async function readEncryptedKey(dataDir, masterPassword) {
|
|
10997
|
-
const filePath =
|
|
11239
|
+
const filePath = join18(dataDir, ENCRYPTED_KEY_FILENAME);
|
|
10998
11240
|
const raw = await readKeyFile(filePath);
|
|
10999
11241
|
const fileContent = Buffer.from(raw.toString("utf-8").trim(), "base64");
|
|
11000
11242
|
const salt = fileContent.subarray(0, 16);
|
|
@@ -11014,13 +11256,13 @@ async function getPepperFromKeychain(dataDir) {
|
|
|
11014
11256
|
}
|
|
11015
11257
|
async function writeVerifyFile(dataDir, encryptionKey) {
|
|
11016
11258
|
const payload = aesEncrypt(encryptionKey, Buffer.from(CANARY_PLAINTEXT, "utf-8"));
|
|
11017
|
-
const filePath =
|
|
11259
|
+
const filePath = join18(dataDir, VERIFY_FILENAME);
|
|
11018
11260
|
const tmpPath = filePath + ".tmp";
|
|
11019
|
-
await
|
|
11020
|
-
await
|
|
11261
|
+
await writeFile13(tmpPath, payload.toString("base64"), "utf-8");
|
|
11262
|
+
await rename11(tmpPath, filePath);
|
|
11021
11263
|
}
|
|
11022
11264
|
async function verifyEncryptionKey(dataDir, encryptionKey) {
|
|
11023
|
-
const filePath =
|
|
11265
|
+
const filePath = join18(dataDir, VERIFY_FILENAME);
|
|
11024
11266
|
const raw = await readKeyFile(filePath);
|
|
11025
11267
|
const payload = Buffer.from(raw.toString("utf-8").trim(), "base64");
|
|
11026
11268
|
const plaintext = aesDecrypt(encryptionKey, payload);
|
|
@@ -11030,7 +11272,7 @@ async function verifyEncryptionKey(dataDir, encryptionKey) {
|
|
|
11030
11272
|
}
|
|
11031
11273
|
async function hasVerifyFile(dataDir) {
|
|
11032
11274
|
try {
|
|
11033
|
-
await
|
|
11275
|
+
await stat5(join18(dataDir, VERIFY_FILENAME));
|
|
11034
11276
|
return true;
|
|
11035
11277
|
} catch {
|
|
11036
11278
|
return false;
|
|
@@ -11038,7 +11280,7 @@ async function hasVerifyFile(dataDir) {
|
|
|
11038
11280
|
}
|
|
11039
11281
|
async function hasEncryptedKeyFile(dataDir) {
|
|
11040
11282
|
try {
|
|
11041
|
-
await
|
|
11283
|
+
await stat5(join18(dataDir, ENCRYPTED_KEY_FILENAME));
|
|
11042
11284
|
return true;
|
|
11043
11285
|
} catch {
|
|
11044
11286
|
return false;
|
|
@@ -11052,17 +11294,17 @@ async function getServerState() {
|
|
|
11052
11294
|
let hasVerify = false;
|
|
11053
11295
|
let hasData = false;
|
|
11054
11296
|
try {
|
|
11055
|
-
await
|
|
11297
|
+
await stat6(join19(dataDir, ENCRYPTED_KEY_FILENAME2));
|
|
11056
11298
|
hasEncFile = true;
|
|
11057
11299
|
} catch {
|
|
11058
11300
|
}
|
|
11059
11301
|
try {
|
|
11060
|
-
await
|
|
11302
|
+
await stat6(join19(dataDir, VERIFY_FILENAME2));
|
|
11061
11303
|
hasVerify = true;
|
|
11062
11304
|
} catch {
|
|
11063
11305
|
}
|
|
11064
11306
|
try {
|
|
11065
|
-
await
|
|
11307
|
+
await stat6(join19(dataDir, "projects.json"));
|
|
11066
11308
|
hasData = true;
|
|
11067
11309
|
} catch {
|
|
11068
11310
|
}
|
|
@@ -11448,7 +11690,7 @@ async function createLocalServer() {
|
|
|
11448
11690
|
console.log("[server] Premier lancement \u2014 setup requis");
|
|
11449
11691
|
}
|
|
11450
11692
|
}
|
|
11451
|
-
if (!existsSync2(env.DATA_DIR)) await
|
|
11693
|
+
if (!existsSync2(env.DATA_DIR)) await mkdir15(env.DATA_DIR);
|
|
11452
11694
|
const absoluteDataDir = resolve4(env.DATA_DIR);
|
|
11453
11695
|
console.log(`[server] Data directory: ${absoluteDataDir}`);
|
|
11454
11696
|
await ensureDataGitignore(env.DATA_DIR);
|
|
@@ -11916,7 +12158,7 @@ async function pullEnv(opts) {
|
|
|
11916
12158
|
}
|
|
11917
12159
|
dotenv.config({ quiet: true });
|
|
11918
12160
|
if (process.env["DATA_DIR"]) {
|
|
11919
|
-
const resolved =
|
|
12161
|
+
const resolved = resolvePath2(process.env["DATA_DIR"], "..");
|
|
11920
12162
|
process.chdir(resolved);
|
|
11921
12163
|
console.log(`[server] Working directory: ${resolved} (from DATA_DIR)`);
|
|
11922
12164
|
}
|
|
@@ -11989,4 +12231,4 @@ export {
|
|
|
11989
12231
|
createLocalServer,
|
|
11990
12232
|
pullEnv
|
|
11991
12233
|
};
|
|
11992
|
-
//# sourceMappingURL=dist-
|
|
12234
|
+
//# sourceMappingURL=dist-P3HYK2SI.js.map
|