@runeya/runeya 2.0.14 → 2.0.18
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 +259 -20
- 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-TI3HFRUW.js → dist-CJTJWMCR.js} +321 -92
- package/dist-CJTJWMCR.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-TI3HFRUW.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.16" : "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) {
|
|
@@ -10020,6 +10026,228 @@ var utilityRouter = router({
|
|
|
10020
10026
|
return { waited: input.ms };
|
|
10021
10027
|
})
|
|
10022
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
|
+
});
|
|
10023
10251
|
var appRouter = router({
|
|
10024
10252
|
health: healthRouter,
|
|
10025
10253
|
project: projectRouter,
|
|
@@ -10039,7 +10267,8 @@ var appRouter = router({
|
|
|
10039
10267
|
kanban: kanbanRouter,
|
|
10040
10268
|
kanbanQueue: kanbanQueueRouter,
|
|
10041
10269
|
terminal: terminalRouter,
|
|
10042
|
-
utility: utilityRouter
|
|
10270
|
+
utility: utilityRouter,
|
|
10271
|
+
wiki: wikiRouter
|
|
10043
10272
|
});
|
|
10044
10273
|
function errorHandler(err, _req, res, _next) {
|
|
10045
10274
|
console.error("[server] Unhandled error:", err);
|
|
@@ -10079,9 +10308,9 @@ var SENSITIVE_FILES = [
|
|
|
10079
10308
|
var SECURE_MODE = 384;
|
|
10080
10309
|
async function ensureFilePermissions() {
|
|
10081
10310
|
for (const filename of SENSITIVE_FILES) {
|
|
10082
|
-
const filepath =
|
|
10311
|
+
const filepath = join15(env.DATA_DIR, filename);
|
|
10083
10312
|
try {
|
|
10084
|
-
const stats = await
|
|
10313
|
+
const stats = await stat4(filepath);
|
|
10085
10314
|
const mode = stats.mode & 511;
|
|
10086
10315
|
if (mode !== SECURE_MODE) {
|
|
10087
10316
|
console.warn("[security] File", filename, "has mode", mode.toString(8) + ", fixing to 600");
|
|
@@ -10127,8 +10356,8 @@ conversations.private.json
|
|
|
10127
10356
|
*.log.*
|
|
10128
10357
|
`;
|
|
10129
10358
|
async function ensureDataGitignore(dataDir) {
|
|
10130
|
-
const gitignorePath =
|
|
10131
|
-
await
|
|
10359
|
+
const gitignorePath = join16(dataDir, ".gitignore");
|
|
10360
|
+
await writeFile11(gitignorePath, GITIGNORE_CONTENT, "utf-8");
|
|
10132
10361
|
}
|
|
10133
10362
|
var _require = createRequire(import.meta.url);
|
|
10134
10363
|
var PARSER_ID_MAP = {
|
|
@@ -10236,7 +10465,7 @@ async function getSodium() {
|
|
|
10236
10465
|
return _sodium;
|
|
10237
10466
|
}
|
|
10238
10467
|
async function decryptLegacyFile(filePath, key, sodium) {
|
|
10239
|
-
const raw = (await
|
|
10468
|
+
const raw = (await readFile13(filePath, "utf-8")).trim();
|
|
10240
10469
|
if (!raw || raw === "[]" || raw === "{}") {
|
|
10241
10470
|
try {
|
|
10242
10471
|
return JSON.parse(raw);
|
|
@@ -10256,14 +10485,14 @@ async function decryptLegacyFile(filePath, key, sodium) {
|
|
|
10256
10485
|
}
|
|
10257
10486
|
async function atomicWrite(path, data) {
|
|
10258
10487
|
const tmp = path + ".tmp";
|
|
10259
|
-
await
|
|
10260
|
-
await
|
|
10488
|
+
await writeFile12(tmp, JSON.stringify(data, null, 2), "utf-8");
|
|
10489
|
+
await rename10(tmp, path);
|
|
10261
10490
|
}
|
|
10262
10491
|
async function runLegacyMigration(dataDir) {
|
|
10263
10492
|
const { resolve: resolve5 } = await import("path");
|
|
10264
10493
|
const abCwd = resolve5(process.cwd());
|
|
10265
|
-
const legacyRoot =
|
|
10266
|
-
const legacyKeyPath =
|
|
10494
|
+
const legacyRoot = join17(abCwd, env.DATA_DIR);
|
|
10495
|
+
const legacyKeyPath = join17(legacyRoot, "dbs", "encryption-key.json");
|
|
10267
10496
|
try {
|
|
10268
10497
|
await access2(legacyKeyPath);
|
|
10269
10498
|
} catch {
|
|
@@ -10271,20 +10500,20 @@ async function runLegacyMigration(dataDir) {
|
|
|
10271
10500
|
}
|
|
10272
10501
|
console.log("[legacy-migration] Legacy Runeya data detected, starting migration\u2026");
|
|
10273
10502
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
10274
|
-
const legacyTmp =
|
|
10275
|
-
await
|
|
10276
|
-
await
|
|
10277
|
-
const legacyOld =
|
|
10278
|
-
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);
|
|
10279
10508
|
console.log(`[legacy-migration] Legacy data backed up to ${legacyOld}`);
|
|
10280
|
-
const keyJson = JSON.parse(await
|
|
10509
|
+
const keyJson = JSON.parse(await readFile13(join17(legacyOld, "dbs", "encryption-key.json"), "utf-8"));
|
|
10281
10510
|
const sodium = await getSodium();
|
|
10282
10511
|
const sodiumKey = sodium.from_base64(keyJson.encryptionKey);
|
|
10283
10512
|
const keyBuffer = Buffer.from(sodiumKey);
|
|
10284
10513
|
const runyeaKeyHex = keyBuffer.toString("hex");
|
|
10285
10514
|
await setEncryptionKey(runyeaKeyHex);
|
|
10286
10515
|
console.log("[legacy-migration] Encryption key loaded in memory (temporary)");
|
|
10287
|
-
const dbsDir =
|
|
10516
|
+
const dbsDir = join17(legacyOld, "dbs");
|
|
10288
10517
|
async function readEncrypted(filePath) {
|
|
10289
10518
|
try {
|
|
10290
10519
|
return await decryptLegacyFile(filePath, sodiumKey, sodium);
|
|
@@ -10293,29 +10522,29 @@ async function runLegacyMigration(dataDir) {
|
|
|
10293
10522
|
return null;
|
|
10294
10523
|
}
|
|
10295
10524
|
}
|
|
10296
|
-
const envsDir =
|
|
10297
|
-
const envFiles = (await
|
|
10525
|
+
const envsDir = join17(dbsDir, "envs");
|
|
10526
|
+
const envFiles = (await readdir5(envsDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
10298
10527
|
const legacyEnvs = {};
|
|
10299
10528
|
for (const file of envFiles) {
|
|
10300
10529
|
const name = file.replace(".encrypted.json", "");
|
|
10301
|
-
legacyEnvs[name] = await readEncrypted(
|
|
10530
|
+
legacyEnvs[name] = await readEncrypted(join17(envsDir, file));
|
|
10302
10531
|
}
|
|
10303
|
-
const servicesDir =
|
|
10304
|
-
const serviceFiles = (await
|
|
10532
|
+
const servicesDir = join17(dbsDir, "services");
|
|
10533
|
+
const serviceFiles = (await readdir5(servicesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
10305
10534
|
const legacyServices = {};
|
|
10306
10535
|
for (const file of serviceFiles) {
|
|
10307
10536
|
const name = file.replace(".encrypted.json", "");
|
|
10308
10537
|
if (!name) continue;
|
|
10309
|
-
const data = await readEncrypted(
|
|
10538
|
+
const data = await readEncrypted(join17(servicesDir, file));
|
|
10310
10539
|
if (data?.label) legacyServices[name] = data;
|
|
10311
10540
|
}
|
|
10312
|
-
const overridesDir =
|
|
10313
|
-
const overrideFiles = (await
|
|
10541
|
+
const overridesDir = join17(dbsDir, "overrides");
|
|
10542
|
+
const overrideFiles = (await readdir5(overridesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
10314
10543
|
const legacyServiceOverrides = {};
|
|
10315
10544
|
const legacyEnvOverrides = {};
|
|
10316
10545
|
for (const file of overrideFiles) {
|
|
10317
10546
|
const baseName = file.replace(".encrypted.json", "");
|
|
10318
|
-
const data = await readEncrypted(
|
|
10547
|
+
const data = await readEncrypted(join17(overridesDir, file));
|
|
10319
10548
|
if (!data) continue;
|
|
10320
10549
|
if (baseName.endsWith("-envs")) {
|
|
10321
10550
|
legacyServiceOverrides[baseName.slice(0, -5)] = data;
|
|
@@ -10323,11 +10552,11 @@ async function runLegacyMigration(dataDir) {
|
|
|
10323
10552
|
legacyEnvOverrides[baseName.slice(0, -12)] = data;
|
|
10324
10553
|
}
|
|
10325
10554
|
}
|
|
10326
|
-
const parsersDir =
|
|
10327
|
-
const parserFiles = (await
|
|
10555
|
+
const parsersDir = join17(dbsDir, "parsers");
|
|
10556
|
+
const parserFiles = (await readdir5(parsersDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
10328
10557
|
const legacyParsers = [];
|
|
10329
10558
|
for (const file of parserFiles) {
|
|
10330
|
-
const data = await readEncrypted(
|
|
10559
|
+
const data = await readEncrypted(join17(parsersDir, file));
|
|
10331
10560
|
if (data?.id) legacyParsers.push(data);
|
|
10332
10561
|
}
|
|
10333
10562
|
const projectMonoId = randomUUID10();
|
|
@@ -10668,7 +10897,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
10668
10897
|
}
|
|
10669
10898
|
let existingSettings = {};
|
|
10670
10899
|
try {
|
|
10671
|
-
existingSettings = JSON.parse(await
|
|
10900
|
+
existingSettings = JSON.parse(await readFile13(join17(dataDir, "settings.json"), "utf-8"));
|
|
10672
10901
|
} catch {
|
|
10673
10902
|
}
|
|
10674
10903
|
const migratedParsers = legacyParsers.map((p) => ({
|
|
@@ -10689,11 +10918,11 @@ ${p.transform ?? ""}`,
|
|
|
10689
10918
|
...migratedParsers
|
|
10690
10919
|
]
|
|
10691
10920
|
};
|
|
10692
|
-
await atomicWrite(
|
|
10693
|
-
await atomicWrite(
|
|
10694
|
-
await atomicWrite(
|
|
10695
|
-
await atomicWrite(
|
|
10696
|
-
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);
|
|
10697
10926
|
const svcEnvCount = runeEnvs.filter((e) => e.scope === "service").length;
|
|
10698
10927
|
console.log(`[legacy-migration] Written: ${runeProjects.length} projects, ${runeServices.length} services, ${runeEnvs.length} environments (${svcEnvCount} service-scoped)`);
|
|
10699
10928
|
console.log(`[legacy-migration] Overrides: ${Object.keys(flatOverrides).length}, custom parsers: ${migratedParsers.length} (all disabled \u2014 rewrite required)`);
|
|
@@ -10704,12 +10933,12 @@ ${p.transform ?? ""}`,
|
|
|
10704
10933
|
}
|
|
10705
10934
|
async function findLegacyKeyInBackup(dataDir) {
|
|
10706
10935
|
try {
|
|
10707
|
-
const entries = await
|
|
10936
|
+
const entries = await readdir5(dataDir);
|
|
10708
10937
|
const backupDirs = entries.filter((e) => e.startsWith("backup-")).sort().reverse();
|
|
10709
10938
|
for (const dir of backupDirs) {
|
|
10710
|
-
const keyJsonPath =
|
|
10939
|
+
const keyJsonPath = join17(dataDir, dir, "dbs", "encryption-key.json");
|
|
10711
10940
|
try {
|
|
10712
|
-
const raw = await
|
|
10941
|
+
const raw = await readFile13(keyJsonPath, "utf-8");
|
|
10713
10942
|
const parsed = JSON.parse(raw);
|
|
10714
10943
|
if (!parsed.encryptionKey) continue;
|
|
10715
10944
|
const sodium = await getSodium();
|
|
@@ -10731,14 +10960,14 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10731
10960
|
const abDataDir = resolve5(dataDir);
|
|
10732
10961
|
const abCwd = resolve5(process.cwd());
|
|
10733
10962
|
const candidateDirs = [
|
|
10734
|
-
|
|
10735
|
-
|
|
10963
|
+
join17(abCwd, ".runeya", "dbs", "overrides"),
|
|
10964
|
+
join17(abDataDir, "dbs", "overrides")
|
|
10736
10965
|
];
|
|
10737
10966
|
let overridesDir = null;
|
|
10738
10967
|
let overrideFiles = [];
|
|
10739
10968
|
for (const dir of candidateDirs) {
|
|
10740
10969
|
try {
|
|
10741
|
-
const files = (await
|
|
10970
|
+
const files = (await readdir5(dir)).filter((f) => f.endsWith(".encrypted.json"));
|
|
10742
10971
|
if (files.length > 0) {
|
|
10743
10972
|
overridesDir = dir;
|
|
10744
10973
|
overrideFiles = files;
|
|
@@ -10748,7 +10977,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10748
10977
|
}
|
|
10749
10978
|
}
|
|
10750
10979
|
if (!overridesDir || overrideFiles.length === 0) return false;
|
|
10751
|
-
const legacyKeyPath =
|
|
10980
|
+
const legacyKeyPath = join17(overridesDir, "..", "encryption-key.json");
|
|
10752
10981
|
try {
|
|
10753
10982
|
await access2(legacyKeyPath);
|
|
10754
10983
|
return false;
|
|
@@ -10766,7 +10995,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10766
10995
|
const envNameToId = {};
|
|
10767
10996
|
let envsRaw;
|
|
10768
10997
|
try {
|
|
10769
|
-
envsRaw = JSON.parse(await
|
|
10998
|
+
envsRaw = JSON.parse(await readFile13(join17(abDataDir, "environments.json"), "utf-8"));
|
|
10770
10999
|
for (const _env of envsRaw) {
|
|
10771
11000
|
const env2 = _env;
|
|
10772
11001
|
if (env2["name"] && env2["id"]) {
|
|
@@ -10785,7 +11014,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10785
11014
|
let servicesRaw = [];
|
|
10786
11015
|
const serviceNameToId = {};
|
|
10787
11016
|
try {
|
|
10788
|
-
servicesRaw = JSON.parse(await
|
|
11017
|
+
servicesRaw = JSON.parse(await readFile13(join17(abDataDir, "services.json"), "utf-8"));
|
|
10789
11018
|
for (const _svc of servicesRaw) {
|
|
10790
11019
|
const svc = _svc;
|
|
10791
11020
|
if (svc["name"] && svc["id"]) serviceNameToId[svc["name"]] = svc["id"];
|
|
@@ -10802,7 +11031,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10802
11031
|
const envName = baseName.slice(0, -"-environment".length);
|
|
10803
11032
|
let data;
|
|
10804
11033
|
try {
|
|
10805
|
-
data = await decryptLegacyFile(
|
|
11034
|
+
data = await decryptLegacyFile(join17(overridesDir, file), sodiumKey, sodium);
|
|
10806
11035
|
} catch (err) {
|
|
10807
11036
|
console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
|
|
10808
11037
|
continue;
|
|
@@ -10829,7 +11058,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10829
11058
|
}
|
|
10830
11059
|
}
|
|
10831
11060
|
if (Object.keys(flatOverrides).length > 0) {
|
|
10832
|
-
await atomicWrite(
|
|
11061
|
+
await atomicWrite(join17(abDataDir, "environment-overrides.json"), flatOverrides);
|
|
10833
11062
|
console.log(`[override-migration] Written ${Object.keys(flatOverrides).length} override(s) to environment-overrides.json`);
|
|
10834
11063
|
}
|
|
10835
11064
|
let envsModified = false;
|
|
@@ -10839,7 +11068,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10839
11068
|
const serviceName = baseName.slice(0, -"-envs".length);
|
|
10840
11069
|
let data;
|
|
10841
11070
|
try {
|
|
10842
|
-
data = await decryptLegacyFile(
|
|
11071
|
+
data = await decryptLegacyFile(join17(overridesDir, file), sodiumKey, sodium);
|
|
10843
11072
|
} catch (err) {
|
|
10844
11073
|
console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
|
|
10845
11074
|
continue;
|
|
@@ -10898,12 +11127,12 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
10898
11127
|
}
|
|
10899
11128
|
}
|
|
10900
11129
|
if (envsModified) {
|
|
10901
|
-
await atomicWrite(
|
|
11130
|
+
await atomicWrite(join17(abDataDir, "environments.json"), envsRaw);
|
|
10902
11131
|
console.log("[override-migration] Merged service overrides into environments.json");
|
|
10903
11132
|
}
|
|
10904
11133
|
const migratedDir = overridesDir.replace(/overrides$/, "overrides-migrated");
|
|
10905
11134
|
try {
|
|
10906
|
-
await
|
|
11135
|
+
await rename10(overridesDir, migratedDir);
|
|
10907
11136
|
console.log(`[override-migration] Moved overrides/ \u2192 overrides-migrated/`);
|
|
10908
11137
|
} catch (err) {
|
|
10909
11138
|
console.warn(`[override-migration] Could not rename overrides dir: ${err.message}`);
|
|
@@ -10920,9 +11149,9 @@ var CANARY_PLAINTEXT = "runeya:v1:key-verification";
|
|
|
10920
11149
|
var MAX_KEY_FILE_SIZE = 1024;
|
|
10921
11150
|
var ARGON2_OPTIONS = { memoryCost: 65536, timeCost: 3, parallelism: 4, outputLen: 32 };
|
|
10922
11151
|
async function readKeyFile(filePath) {
|
|
10923
|
-
const s = await
|
|
11152
|
+
const s = await stat5(filePath);
|
|
10924
11153
|
if (s.size > MAX_KEY_FILE_SIZE) throw new Error(`Fichier suspect : ${filePath} (${s.size} octets)`);
|
|
10925
|
-
return
|
|
11154
|
+
return readFile14(filePath);
|
|
10926
11155
|
}
|
|
10927
11156
|
function aesEncrypt(key, plaintext) {
|
|
10928
11157
|
const iv = randomBytes4(12);
|
|
@@ -10941,7 +11170,7 @@ function aesDecrypt(key, data) {
|
|
|
10941
11170
|
}
|
|
10942
11171
|
async function getPepperFromFile(dataDir) {
|
|
10943
11172
|
try {
|
|
10944
|
-
const raw = await readKeyFile(
|
|
11173
|
+
const raw = await readKeyFile(join18(dataDir, PEPPER_FILENAME));
|
|
10945
11174
|
const hex = raw.toString("utf-8").trim();
|
|
10946
11175
|
if (/^[0-9a-f]{64}$/i.test(hex)) return Buffer.from(hex, "hex");
|
|
10947
11176
|
} catch {
|
|
@@ -10949,11 +11178,11 @@ async function getPepperFromFile(dataDir) {
|
|
|
10949
11178
|
return null;
|
|
10950
11179
|
}
|
|
10951
11180
|
async function writePepperToFile(dataDir, pepper) {
|
|
10952
|
-
const filePath =
|
|
11181
|
+
const filePath = join18(dataDir, PEPPER_FILENAME);
|
|
10953
11182
|
const tmpPath = filePath + ".tmp";
|
|
10954
|
-
await
|
|
11183
|
+
await writeFile13(tmpPath, pepper.toString("hex"), "utf-8");
|
|
10955
11184
|
await chmod9(tmpPath, 384);
|
|
10956
|
-
await
|
|
11185
|
+
await rename11(tmpPath, filePath);
|
|
10957
11186
|
}
|
|
10958
11187
|
function tryKeyringGet() {
|
|
10959
11188
|
try {
|
|
@@ -11000,14 +11229,14 @@ async function writeEncryptedKey(dataDir, masterPassword, encryptionKey) {
|
|
|
11000
11229
|
const payload = aesEncrypt(derivedKey, encryptionKey);
|
|
11001
11230
|
const fileContent = Buffer.concat([salt, payload]);
|
|
11002
11231
|
const encoded = fileContent.toString("base64");
|
|
11003
|
-
const filePath =
|
|
11232
|
+
const filePath = join18(dataDir, ENCRYPTED_KEY_FILENAME);
|
|
11004
11233
|
const tmpPath = filePath + ".tmp";
|
|
11005
|
-
await
|
|
11234
|
+
await writeFile13(tmpPath, encoded, "utf-8");
|
|
11006
11235
|
await chmod9(tmpPath, 384);
|
|
11007
|
-
await
|
|
11236
|
+
await rename11(tmpPath, filePath);
|
|
11008
11237
|
}
|
|
11009
11238
|
async function readEncryptedKey(dataDir, masterPassword) {
|
|
11010
|
-
const filePath =
|
|
11239
|
+
const filePath = join18(dataDir, ENCRYPTED_KEY_FILENAME);
|
|
11011
11240
|
const raw = await readKeyFile(filePath);
|
|
11012
11241
|
const fileContent = Buffer.from(raw.toString("utf-8").trim(), "base64");
|
|
11013
11242
|
const salt = fileContent.subarray(0, 16);
|
|
@@ -11027,13 +11256,13 @@ async function getPepperFromKeychain(dataDir) {
|
|
|
11027
11256
|
}
|
|
11028
11257
|
async function writeVerifyFile(dataDir, encryptionKey) {
|
|
11029
11258
|
const payload = aesEncrypt(encryptionKey, Buffer.from(CANARY_PLAINTEXT, "utf-8"));
|
|
11030
|
-
const filePath =
|
|
11259
|
+
const filePath = join18(dataDir, VERIFY_FILENAME);
|
|
11031
11260
|
const tmpPath = filePath + ".tmp";
|
|
11032
|
-
await
|
|
11033
|
-
await
|
|
11261
|
+
await writeFile13(tmpPath, payload.toString("base64"), "utf-8");
|
|
11262
|
+
await rename11(tmpPath, filePath);
|
|
11034
11263
|
}
|
|
11035
11264
|
async function verifyEncryptionKey(dataDir, encryptionKey) {
|
|
11036
|
-
const filePath =
|
|
11265
|
+
const filePath = join18(dataDir, VERIFY_FILENAME);
|
|
11037
11266
|
const raw = await readKeyFile(filePath);
|
|
11038
11267
|
const payload = Buffer.from(raw.toString("utf-8").trim(), "base64");
|
|
11039
11268
|
const plaintext = aesDecrypt(encryptionKey, payload);
|
|
@@ -11043,7 +11272,7 @@ async function verifyEncryptionKey(dataDir, encryptionKey) {
|
|
|
11043
11272
|
}
|
|
11044
11273
|
async function hasVerifyFile(dataDir) {
|
|
11045
11274
|
try {
|
|
11046
|
-
await
|
|
11275
|
+
await stat5(join18(dataDir, VERIFY_FILENAME));
|
|
11047
11276
|
return true;
|
|
11048
11277
|
} catch {
|
|
11049
11278
|
return false;
|
|
@@ -11051,7 +11280,7 @@ async function hasVerifyFile(dataDir) {
|
|
|
11051
11280
|
}
|
|
11052
11281
|
async function hasEncryptedKeyFile(dataDir) {
|
|
11053
11282
|
try {
|
|
11054
|
-
await
|
|
11283
|
+
await stat5(join18(dataDir, ENCRYPTED_KEY_FILENAME));
|
|
11055
11284
|
return true;
|
|
11056
11285
|
} catch {
|
|
11057
11286
|
return false;
|
|
@@ -11065,17 +11294,17 @@ async function getServerState() {
|
|
|
11065
11294
|
let hasVerify = false;
|
|
11066
11295
|
let hasData = false;
|
|
11067
11296
|
try {
|
|
11068
|
-
await
|
|
11297
|
+
await stat6(join19(dataDir, ENCRYPTED_KEY_FILENAME2));
|
|
11069
11298
|
hasEncFile = true;
|
|
11070
11299
|
} catch {
|
|
11071
11300
|
}
|
|
11072
11301
|
try {
|
|
11073
|
-
await
|
|
11302
|
+
await stat6(join19(dataDir, VERIFY_FILENAME2));
|
|
11074
11303
|
hasVerify = true;
|
|
11075
11304
|
} catch {
|
|
11076
11305
|
}
|
|
11077
11306
|
try {
|
|
11078
|
-
await
|
|
11307
|
+
await stat6(join19(dataDir, "projects.json"));
|
|
11079
11308
|
hasData = true;
|
|
11080
11309
|
} catch {
|
|
11081
11310
|
}
|
|
@@ -11461,7 +11690,7 @@ async function createLocalServer() {
|
|
|
11461
11690
|
console.log("[server] Premier lancement \u2014 setup requis");
|
|
11462
11691
|
}
|
|
11463
11692
|
}
|
|
11464
|
-
if (!existsSync2(env.DATA_DIR)) await
|
|
11693
|
+
if (!existsSync2(env.DATA_DIR)) await mkdir15(env.DATA_DIR);
|
|
11465
11694
|
const absoluteDataDir = resolve4(env.DATA_DIR);
|
|
11466
11695
|
console.log(`[server] Data directory: ${absoluteDataDir}`);
|
|
11467
11696
|
await ensureDataGitignore(env.DATA_DIR);
|
|
@@ -11929,7 +12158,7 @@ async function pullEnv(opts) {
|
|
|
11929
12158
|
}
|
|
11930
12159
|
dotenv.config({ quiet: true });
|
|
11931
12160
|
if (process.env["DATA_DIR"]) {
|
|
11932
|
-
const resolved =
|
|
12161
|
+
const resolved = resolvePath2(process.env["DATA_DIR"], "..");
|
|
11933
12162
|
process.chdir(resolved);
|
|
11934
12163
|
console.log(`[server] Working directory: ${resolved} (from DATA_DIR)`);
|
|
11935
12164
|
}
|
|
@@ -12002,4 +12231,4 @@ export {
|
|
|
12002
12231
|
createLocalServer,
|
|
12003
12232
|
pullEnv
|
|
12004
12233
|
};
|
|
12005
|
-
//# sourceMappingURL=dist-
|
|
12234
|
+
//# sourceMappingURL=dist-CJTJWMCR.js.map
|