@runeya/runeya 2.0.28 → 2.0.31
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 +23 -1
- package/agent/index.js.map +1 -1
- package/agent-manager-KGITN4AE.js +7 -0
- package/{chunk-Y2R42AXQ.js → chunk-PZHVJHTC.js} +24 -2
- package/chunk-PZHVJHTC.js.map +1 -0
- package/index.js +1 -1
- package/package.json +1 -1
- package/{src-ZYEDS2TT.js → src-I5LYBYA2.js} +173 -116
- package/src-I5LYBYA2.js.map +1 -0
- package/web/assets/{AgentScalarChatInterface.vue-CvVAU4_Z.js → AgentScalarChatInterface.vue-BgOWd9Dz.js} +1 -1
- package/web/assets/{AgentTerminalPage-DJbjkS_P.js → AgentTerminalPage-CrZyv0Pr.js} +1 -1
- package/web/assets/AiChatPage-CSbpGsTd.js +1 -0
- package/web/assets/{AppLayout-CmgZhtWb.js → AppLayout-CGySXh9R.js} +1 -1
- package/web/assets/{AuditPage-CIQXRIah.js → AuditPage-wemCN8aw.js} +1 -1
- package/web/assets/CloudAccountPage-B9xwzE44.js +1 -0
- package/web/assets/{CloudAccountPage-B-ediB1R.js → CloudAccountPage-mqLjh_Na.js} +1 -1
- package/web/assets/{CloudMessagingPage-DvZuiSk3.js → CloudMessagingPage-Bxcx2rox.js} +1 -1
- package/web/assets/{DashboardPage-Dx7xHCCP.js → DashboardPage-CwQjYeAl.js} +1 -1
- package/web/assets/{EditorIcon-4f28vJdz.js → EditorIcon-MkuxOiPI.js} +1 -1
- package/web/assets/{EnvironmentForm-CR0xHO9G.js → EnvironmentForm-jFiMyYtU.js} +1 -1
- package/web/assets/{EnvironmentFormPage-qc4WT8Xk.js → EnvironmentFormPage-Bk6TnUiq.js} +1 -1
- package/web/assets/{EnvironmentListPage-DIjYKLDE.js → EnvironmentListPage-arNn4Jju.js} +1 -1
- package/web/assets/{EnvironmentSelector-C3yA1kHZ.js → EnvironmentSelector-P4KzBSWz.js} +1 -1
- package/web/assets/KanbanBoardPage-DT5e6cnL.js +4 -0
- package/web/assets/KanbanBoardPage-kpZiPs_o.css +1 -0
- package/web/assets/{KanbanListPage-Drt3lxBT.js → KanbanListPage-DWHKlyoo.js} +1 -1
- package/web/assets/{LaunchProjectPage-DQDogPxL.js → LaunchProjectPage-D_H-E5bk.js} +1 -1
- package/web/assets/{LaunchServicesPage-Jg18jEbK.js → LaunchServicesPage-HDnKRjRX.js} +1 -1
- package/web/assets/{LogViewer-DF9GVFWC.js → LogViewer-BfU_QWYJ.js} +1 -1
- package/web/assets/{ProcessControls-Umt6f5xy.js → ProcessControls-9Zkp_dJp.js} +1 -1
- package/web/assets/{ProcessDetailPage-CTljkKd4.js → ProcessDetailPage-DOHXl85O.js} +1 -1
- package/web/assets/{ProcessMetrics-XANBf0Qk.js → ProcessMetrics-D_TONOeJ.js} +1 -1
- package/web/assets/{ProjectDetailPage-tYK7WVg5.js → ProjectDetailPage-B4HoWgAS.js} +1 -1
- package/web/assets/{ProjectListPage-Bl2xRUn8.js → ProjectListPage-CobjamXS.js} +1 -1
- package/web/assets/{RandomJobTestPage-D-1h_Jn0.js → RandomJobTestPage-JQewXMbE.js} +1 -1
- package/web/assets/{ScenarioEditorPage-AYudLHpb.js → ScenarioEditorPage-DxUxY8WO.js} +1 -1
- package/web/assets/{SendToChatDialog-Cy3nX2xD.js → SendToChatDialog-D5sFHq4Y.js} +1 -1
- package/web/assets/{ServiceControlsBar-CXk2ltIc.js → ServiceControlsBar-3r_6f0oq.js} +1 -1
- package/web/assets/{ServiceDetailPage-guE9lv3J.js → ServiceDetailPage-BrWeHwKi.js} +1 -1
- package/web/assets/{ServiceFormPage-BfhD3cHh.js → ServiceFormPage-BM5t0xn7.js} +1 -1
- package/web/assets/{SettingsPage-B1egv0Qi.js → SettingsPage-CCgRmqMf.js} +4 -4
- package/web/assets/{SetupPage-DDqjtbHe.js → SetupPage-BjnUBrAp.js} +1 -1
- package/web/assets/{UnlockPage-B9V18Hw8.js → UnlockPage-BOl5kGsl.js} +1 -1
- package/web/assets/{VariablesTable-B4z_Cvs6.js → VariablesTable-BNdkuRjU.js} +1 -1
- package/web/assets/{VersionBadge-D5Im-g6k.js → VersionBadge-B6DUKoTa.js} +1 -1
- package/web/assets/WikiPage-zU6F-v2H.js +1 -0
- package/web/assets/{WikiView-BkAYyIky.js → WikiView-3CVNHY0G.js} +1 -1
- package/web/assets/{add-scalar-classes-wf0v84bl.js → add-scalar-classes-BE6k9QmJ.js} +3 -3
- package/web/assets/auth-errors-A7G-LRy2.js +1 -0
- package/web/assets/{autocomplete-Cl85AjsC.js → autocomplete-DwZLvawH.js} +1 -1
- package/web/assets/{basic-shape-diamond.svg-EjFsbEU6.js → basic-shape-diamond.svg-DDLxB2o1.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-BSGF96h_.js → basic-shape-hexagon.svg-Dg-tpVX6.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-DzhBsSTr.js → basic-shape-primary-circle-ellipse-round.svg-2baIETte.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-D8s7AAg0.js → basic-shape-primary-square-rectangle.svg-BgbWRm9F.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-CZVfGGSa.js → basic-shape-shield.svg-DaSvphIy.js} +1 -1
- package/web/assets/{browser-DeK7cxfP.js → browser-B5itU97y.js} +1 -1
- package/web/assets/{browser-BJbPa5wA.js → browser-DAsjXZP1.js} +1 -1
- package/web/assets/{card-C8VZemYn.js → card-CkqT9qpZ.js} +1 -1
- package/web/assets/{checkbox-CHlXPfVG.js → checkbox-D7i6Ei-y.js} +1 -1
- package/web/assets/{chip-BIf8nQZp.js → chip-BGa_1_3K.js} +1 -1
- package/web/assets/{client-Ck5Tf_q2.js → client-C1q1gncK.js} +1 -1
- package/web/assets/{cloud-chat.store-qtVT5SrP.js → cloud-chat.store-Dvj8Xc01.js} +1 -1
- package/web/assets/cloud-client-4s1-iFqU.js +1 -0
- package/web/assets/{column-DzFOwR4r.js → column-C8lQHkr_.js} +1 -1
- package/web/assets/{computer-device-desktop-monitor.svg-DZQuEpZF.js → computer-device-desktop-monitor.svg-CWi-bjwn.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-CEjLM8aJ.js → computer-device-desktop.svg-b08c1hOG.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-DXtolGzW.js → computer-device-laptop.svg-DwgpFJFq.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-BSwre-M8.js → computer-device-mobile-phone-android-samsung-back.svg-CLVl7GWQ.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-BGERJFfo.js → computer-device-mobile-phone-android-samsung.svg-CiCp93YS.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-B4hZe_83.js → computer-device-mobile-phone-iphone-x-back.svg-BJrwLEJX.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-CWALzaq5.js → computer-device-mobile-phone-iphone-x.svg-BqWahM6S.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-CKFDix2A.js → computer-device-mobile-tablet-touch.svg-CoKmLmRi.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-PW6AfYK8.js → computer-device-mobile-tablet.svg-CBHVcYAz.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-Mv5w5TOF.js → computer-device-network-ethernet-cat6.svg-BDB8pwmR.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-8StLkiX8.js → computer-device-network-lan-www.svg-Ck6IL9ve.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-BeLrrgP7.js → computer-device-network-wifi-connection.svg-CphNPxC3.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-CJiZPTY7.js → computer-device-network-wifi-router.svg-DV5WB562.js} +1 -1
- package/web/assets/{cssMode-BhLSG915.js → cssMode-CAeg-vFl.js} +1 -1
- package/web/assets/{divider-Bqt4F4Qp.js → divider-ov_F8YDR.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-BbZXykYT.js → ecology-science-erlenmeyer-flask.svg-Mf7ejPBw.js} +1 -1
- package/web/assets/{fieldset-Ckk9RxbZ.js → fieldset-C30-k9Hk.js} +1 -1
- package/web/assets/{freemarker2-BMY7vTsn.js → freemarker2-DqDyD2Yg.js} +1 -1
- package/web/assets/{handlebars-dL1R3--H.js → handlebars-D8wvWeL8.js} +1 -1
- package/web/assets/{html-344qni_p.js → html-Drv0UFF5.js} +1 -1
- package/web/assets/{htmlMode-DofkmDyO.js → htmlMode-DHHALRMq.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-CUKVp-AP.js → image-flash-lightning.svg-DyesLNE_.js} +1 -1
- package/web/assets/{image-picture-flower.svg-D8v_AWKn.js → image-picture-flower.svg-ChnE04Bm.js} +1 -1
- package/web/assets/{index-0h6-JSBE.js → index-BM_DvIeJ.js} +7 -7
- package/web/assets/{index-DtsVLZzz.css → index-Ds9bk1Bt.css} +1 -1
- package/web/assets/{interface-alert-exclamation-diamond.svg-Svf3SQNi.js → interface-alert-exclamation-diamond.svg-VnoLfisD.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-BONYDBCR.js → interface-alert-exclamation-triangle-warning.svg-BFXqgqWM.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-DjtyOApC.js → interface-alert-information-circle.svg-B2cFeVpP.js} +1 -1
- package/web/assets/{interface-award-crown.svg-CYsHquI5.js → interface-award-crown.svg-CgVL6SMQ.js} +1 -1
- package/web/assets/{interface-bookmark.svg-Dq6ycrvL.js → interface-bookmark-tag.svg-BqetMK2B.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-BuQVffZJ.js → interface-bookmark.svg-Djskm9So.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-DByu3wOg.js → interface-calendar-date-one.svg-CuGQxIbW.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-B26NylpB.js → interface-content-book-open-pages.svg-CoaYPYBX.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-BB2ivXh0.js → interface-content-book-page.svg-D9RjJ-Tt.js} +1 -1
- package/web/assets/{interface-content-file.svg-gFnNuymA.js → interface-content-file.svg-BvW7iOQq.js} +1 -1
- package/web/assets/interface-content-folder.svg-0I16aCuL.js +1 -0
- package/web/assets/{interface-content-folder.svg-DvbImJww.js → interface-content-folder.svg-3lDCdrfN.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-Bp4l9Qod.js → interface-copy-clipboard.svg-Cru6vbV7.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-cayiblt2.js → interface-edit-attachment.svg-9QOp0EHv.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-BvIiESbT.js → interface-edit-binocular.svg-BN5BwlNK.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-Bvfkkoft.js → interface-edit-magic-wand.svg-ZrSk3B7_.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-Dnoz9W9m.js → interface-edit-tool-paint-roller.svg-CbU2EKfx.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-aKau4_Jj.js → interface-edit-tool-pencil.svg-k5b7ee-3.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-DBvY_ky_.js → interface-favorite-award.svg-jYCncpKK.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-CBdbLlXI.js → interface-favorite-flag.svg-rsmscUUR.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-CB_C7DqH.js → interface-favorite-heart.svg-CIYUeR6R.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-CtD9k4PE.js → interface-favorite-star.svg-CgA6sev6.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-tL8H5LKH.js → interface-favorite-stars-sparkles.svg-DeEAoS1p.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-DDZfke0l.js → interface-hierarchy-flowchart.svg-D03K0k8o.js} +1 -1
- package/web/assets/{interface-home-house.svg-928LKnoh.js → interface-home-house.svg-CPdv9Mu_.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-BVJBa9KF.js → interface-hyperlink.svg-BEdVwqkd.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-C6DvgPRs.js → interface-lighting-brightness.svg-C-op9azl.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-NFylzPTC.js → interface-lock-closed.svg-B01c7Ens.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-EmxIAQyQ.js → interface-lock-open-unlock.svg-Bu0DPtLE.js} +1 -1
- package/web/assets/{interface-login-key.svg-C0nFw-iu.js → interface-login-key.svg-DxBNIWym.js} +1 -1
- package/web/assets/{interface-search.svg-1Gq_uSPL.js → interface-search.svg-ChJa0Zxy.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-3dq-AXqL.js → interface-setting-cog.svg-B1VRK1pG.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-Bb4qoyBo.js → interface-share-megaphone-bullhorn.svg-DITfcqEG.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-1hUkfTAV.js → interface-share-rocket.svg-BR3rbwES.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-C1fkGxMj.js → interface-share-satellite.svg-DxODd9ev.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-DCtyIZvd.js → interface-share-space-ship.svg-BHhLQX6U.js} +1 -1
- package/web/assets/{interface-share.svg-D27oW8Dd.js → interface-share.svg-yu0Vec1L.js} +1 -1
- package/web/assets/{interface-signal-square.svg-DHNLXoLB.js → interface-signal-square.svg-BT19mvLU.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-DVFfhzi_.js → interface-time-clock-circle.svg-BZ3ZkQCo.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-J2kAIY5_.js → interface-time-hour-glass.svg-AT9zGmRg.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-CT_rq2cA.js → interface-users-multiple.svg-DSMQav3N.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-DmUulEez.js → interface-weather-moon.svg-DEMnxt9b.js} +1 -1
- package/web/assets/{javascript-DJEY0PGT.js → javascript-CPD0FEKw.js} +1 -1
- package/web/assets/{jsonMode-Bf1QPhve.js → jsonMode-Wko85YcP.js} +1 -1
- package/web/assets/{liquid-BvlkiSX0.js → liquid-D7j9pKnr.js} +1 -1
- package/web/assets/{lspLanguageFeatures-Blscl7vz.js → lspLanguageFeatures-CfRla1-8.js} +1 -1
- package/web/assets/{mail-chat-bubble-square.svg-oLN5_z0h.js → mail-chat-bubble-square.svg-DvHQC4xf.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-B__7_Vor.js → mail-send-email-paper-airplane.svg-DpykUXLZ.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-DUobbjXC.js → mail-send-envelope.svg-CXCJUXmf.js} +1 -1
- package/web/assets/{mdx-fAQ2xk7o.js → mdx-BktOYKUs.js} +1 -1
- package/web/assets/{message-V1S0zxyl.js → message-Dx3bqZhh.js} +1 -1
- package/web/assets/{minus-DQocLKZ2.js → minus-Bf1ODLs4.js} +1 -1
- package/web/assets/{modal-Jd8c3A1o.js → modal-CIqWCBYs.js} +1 -1
- package/web/assets/modal-CQKtX_qC.js +1 -0
- package/web/assets/{money-cashier-receipt.svg-Cj5pLd3R.js → money-cashier-receipt.svg-DkSQt4Kp.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-D85nPq3p.js → money-currency-dollar-pay.svg-B40YykZK.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-B-jecr0K.js → money-graph-arrow-increase.svg-BbDtfGcD.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-mL9YQSKx.js → money-graph-bar-chart-increase.svg-Bl9gruJt.js} +1 -1
- package/web/assets/{multiselect-BDZrrJVC.js → multiselect-BUEnFAaO.js} +1 -1
- package/web/assets/{nature-ecology-leaf.svg-C5PATFHo.js → nature-ecology-leaf.svg-BrNJa_6p.js} +1 -1
- package/web/assets/{password-CBpcX5yn.js → password-miE8400T.js} +1 -1
- package/web/assets/{phone-telephone.svg-6VIpvy-y.js → phone-telephone.svg-Ck1caUgX.js} +1 -1
- package/web/assets/{plus-B2jxpOLU.js → plus-B2oM4Kbe.js} +1 -1
- package/web/assets/process.store-UagFgrdF.js +1 -0
- package/web/assets/{programming-bug.svg-BcxVR8s8.js → programming-bug.svg-Be1N6DWA.js} +1 -1
- package/web/assets/{programming-cloud.svg-k8vesSUP.js → programming-cloud.svg-C_tNlsNS.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-C3BxhLIn.js → programming-computer-database-server.svg-CaLId3EN.js} +1 -1
- package/web/assets/{programming-computer-database.svg-D5JgkHxk.js → programming-computer-database.svg-B0g8mMEB.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-QPzWv5-h.js → programming-module-four-layout.svg-D3lo48Ct.js} +1 -1
- package/web/assets/{programming-module-three.svg-C8sC64dR.js → programming-module-three.svg-BCEC_jV2.js} +1 -1
- package/web/assets/{programming-module.svg-3IM9Ieau.js → programming-module.svg-BjX7OQih.js} +1 -1
- package/web/assets/{programming-script-code.svg-CcSjILXf.js → programming-script-code.svg-BHGQMcGB.js} +1 -1
- package/web/assets/{python-izcQtunc.js → python-Dy1ouxIJ.js} +1 -1
- package/web/assets/{radiobutton-DkaY7vPf.js → radiobutton-B-wtVA5M.js} +1 -1
- package/web/assets/{razor-B8B2Hdv1.js → razor-Ci2FTbb3.js} +1 -1
- package/web/assets/router-1YCC7rLb.js +1 -0
- package/web/assets/{settings.store-BnyuJ8Z0.js → settings.store-DGeQqU47.js} +1 -1
- package/web/assets/{shopping-cart.svg-Cd1oC6MU.js → shopping-cart.svg-CXXXaMLz.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-DADsc6IL.js → shopping-gift-present.svg-YcM_-bok.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-RgU1qCOk.js → shopping-shipping-box-parcel-package.svg-C9uLlLTm.js} +1 -1
- package/web/assets/{src-DaE_IxON.js → src-DI2ohkF7.js} +1 -1
- package/web/assets/{src-DWLyvNxu.js → src-_sZfvoIH.js} +1 -1
- package/web/assets/{tabpanel-ps1UcMpu.js → tabpanel-D7aHaTgY.js} +1 -1
- package/web/assets/{tag-new-circle.svg-Ct1vN4KR.js → tag-new-circle.svg-bp2cmK4K.js} +1 -1
- package/web/assets/{travel-map-earth-globe.svg-DES-h7fX.js → travel-map-earth-globe.svg-sJQIToLR.js} +1 -1
- package/web/assets/trpc-C9EMyib7.js +1 -0
- package/web/assets/{tsMode-n-LTfcYC.js → tsMode-DkLB60ub.js} +1 -1
- package/web/assets/{typescript-2xBvBpwO.js → typescript-Crt7iVga.js} +1 -1
- package/web/assets/useAiChatDrawer-Cd0EBriK.js +1 -0
- package/web/assets/{useCloudOrg-BEGIZ5Sw.css → useCloudOrg-CXs0Qa_9.css} +1 -1
- package/web/assets/useCloudOrg-CyQGeKWO.js +1 -0
- package/web/assets/{xml-DNDCpyoa.js → xml-T4pdlSpO.js} +1 -1
- package/web/assets/{yaml-BWEYJIfa.js → yaml-NPyqNIGO.js} +1 -1
- package/web/index.html +2 -2
- package/agent-manager-2P4THUVA.js +0 -7
- package/chunk-Y2R42AXQ.js.map +0 -1
- package/src-ZYEDS2TT.js.map +0 -1
- package/web/assets/AiChatPage-yheFOLqq.js +0 -1
- package/web/assets/CloudAccountPage-CPzIsKlw.js +0 -1
- package/web/assets/KanbanBoardPage-BDzDCbzp.css +0 -1
- package/web/assets/KanbanBoardPage-DWbeil-K.js +0 -4
- package/web/assets/WikiPage-CwULGndV.js +0 -1
- package/web/assets/auth-errors-_nnUuMls.js +0 -1
- package/web/assets/cloud-client-DZDFCmz5.js +0 -1
- package/web/assets/interface-content-folder.svg-oUFH-WWC.js +0 -1
- package/web/assets/modal-Cun3B13H.js +0 -1
- package/web/assets/process.store-IRJbG3V3.js +0 -1
- package/web/assets/router-DVcld2uT.js +0 -1
- package/web/assets/trpc-DL-TIO_-.js +0 -1
- package/web/assets/useAiChatDrawer-9vufna_G.js +0 -1
- package/web/assets/useCloudOrg-9Z9ojaI7.js +0 -1
- /package/{agent-manager-2P4THUVA.js.map → agent-manager-KGITN4AE.js.map} +0 -0
package/index.js
CHANGED
|
@@ -201,7 +201,7 @@ function listenWithRetry(server, port, host, wss, maxRetries = 20, delay = 500)
|
|
|
201
201
|
});
|
|
202
202
|
}
|
|
203
203
|
async function main() {
|
|
204
|
-
const { createLocalServer, pullEnv, PullEnvError } = await import("./src-
|
|
204
|
+
const { createLocalServer, pullEnv, PullEnvError } = await import("./src-I5LYBYA2.js");
|
|
205
205
|
if (isPullEnv) {
|
|
206
206
|
if (!serviceArg) {
|
|
207
207
|
console.error("Error: --service (-s) is required with --pull-env");
|
package/package.json
CHANGED
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
stableEncryptValue,
|
|
59
59
|
traefikManager,
|
|
60
60
|
writeEntity
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-PZHVJHTC.js";
|
|
62
62
|
|
|
63
63
|
// ../server/src/create-server.ts
|
|
64
64
|
import express from "express";
|
|
@@ -5687,10 +5687,54 @@ var KanbanStore = class {
|
|
|
5687
5687
|
const res = await callCloud(`/kanban/board/list${query}`);
|
|
5688
5688
|
return res.data?.boards ?? [];
|
|
5689
5689
|
}
|
|
5690
|
-
|
|
5691
|
-
|
|
5690
|
+
/**
|
|
5691
|
+
* Un tableau. Sans les journaux de ses cartes par défaut : c'est la moitié
|
|
5692
|
+
* lourde du document, et presque aucun appelant n'en a besoin — un agent qui
|
|
5693
|
+
* liste des cartes ne lit pas les commentaires. `withHistory` les redemande
|
|
5694
|
+
* pour les rares cas qui les veulent tous d'un coup.
|
|
5695
|
+
*/
|
|
5696
|
+
async get(id, opts = {}) {
|
|
5697
|
+
const query = `?id=${encodeURIComponent(id)}${opts.withHistory ? "&withHistory=true" : ""}`;
|
|
5698
|
+
const res = await callCloud(`/kanban/board/get${query}`);
|
|
5692
5699
|
return res.data?.board ?? null;
|
|
5693
5700
|
}
|
|
5701
|
+
/** Le journal d'une seule carte — ce que le contexte d'un agent demande. */
|
|
5702
|
+
async cardHistory(boardId, cardId) {
|
|
5703
|
+
const res = await callCloud(
|
|
5704
|
+
`/kanban/card/history?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}`
|
|
5705
|
+
);
|
|
5706
|
+
return res.data?.history ?? [];
|
|
5707
|
+
}
|
|
5708
|
+
/**
|
|
5709
|
+
* Commenter une carte, sans réécrire le tableau.
|
|
5710
|
+
*
|
|
5711
|
+
* C'est le geste que l'IA répète le plus, et souvent avec de longs textes :
|
|
5712
|
+
* le faire passer par une sauvegarde de tableau faisait transiter tout le
|
|
5713
|
+
* graphe de cartes à chaque phrase.
|
|
5714
|
+
*/
|
|
5715
|
+
async addComment(boardId, cardId, detail, conversationId) {
|
|
5716
|
+
const res = await callCloud("/kanban/card/comment/add", {
|
|
5717
|
+
method: "POST",
|
|
5718
|
+
body: { boardId, cardId, detail, author: "ai", ...conversationId ? { conversationId } : {} }
|
|
5719
|
+
});
|
|
5720
|
+
return res.ok;
|
|
5721
|
+
}
|
|
5722
|
+
/** Poser une entrée de journal non-commentaire (une conversation qui s'ouvre). */
|
|
5723
|
+
async addCardEvent(boardId, cardId, type, detail) {
|
|
5724
|
+
const res = await callCloud("/kanban/card/event/add", {
|
|
5725
|
+
method: "POST",
|
|
5726
|
+
body: { boardId, cardId, type, detail }
|
|
5727
|
+
});
|
|
5728
|
+
return res.ok;
|
|
5729
|
+
}
|
|
5730
|
+
/** Déplacer une carte, sans réécrire le tableau. */
|
|
5731
|
+
async moveCard(boardId, cardId, toColumnId) {
|
|
5732
|
+
const res = await callCloud("/kanban/card/move", {
|
|
5733
|
+
method: "POST",
|
|
5734
|
+
body: { boardId, cardId, toColumnId }
|
|
5735
|
+
});
|
|
5736
|
+
return res.ok;
|
|
5737
|
+
}
|
|
5694
5738
|
async create(input) {
|
|
5695
5739
|
const organizationId = await resolveOrganizationId();
|
|
5696
5740
|
if (!organizationId) return null;
|
|
@@ -5739,17 +5783,27 @@ async function executeKanbanCommands(boardId, cardId, commands, conversationId)
|
|
|
5739
5783
|
return;
|
|
5740
5784
|
}
|
|
5741
5785
|
}
|
|
5786
|
+
let pendingBoardWrite = false;
|
|
5742
5787
|
for (const cmd of commands) {
|
|
5743
5788
|
if (cmd.type === "move_card" && cmd.columnTitle) {
|
|
5744
|
-
const
|
|
5745
|
-
|
|
5789
|
+
const target = board.columns.find(
|
|
5790
|
+
(c) => c.title.toLowerCase() === cmd.columnTitle.toLowerCase()
|
|
5791
|
+
);
|
|
5792
|
+
if (!target) {
|
|
5793
|
+
console.warn(`[kanban-commands] Target column "${cmd.columnTitle}" not found. Available: ${board.columns.map((c) => c.title).join(", ")}`);
|
|
5794
|
+
continue;
|
|
5795
|
+
}
|
|
5796
|
+
const ok = await kanbanStore.moveCard(board.id, cardId, target.id);
|
|
5797
|
+
if (!ok) console.warn(`[kanban-commands] move_card failed: card=${cardId} target="${cmd.columnTitle}"`);
|
|
5746
5798
|
} else if (cmd.type === "add_comment" && cmd.comment) {
|
|
5747
|
-
addComment(board, cardId, cmd.comment, conversationId);
|
|
5799
|
+
const ok = await kanbanStore.addComment(board.id, cardId, cmd.comment, conversationId);
|
|
5800
|
+
if (!ok) console.warn(`[kanban-commands] add_comment failed: card=${cardId}`);
|
|
5748
5801
|
} else if (cmd.type === "add_card" && cmd.columnTitle && cmd.cardTitle) {
|
|
5749
5802
|
addCardToColumn(board, cmd.columnTitle, cmd.cardTitle, cmd.cardContent);
|
|
5803
|
+
pendingBoardWrite = true;
|
|
5750
5804
|
}
|
|
5751
5805
|
}
|
|
5752
|
-
await kanbanStore.update({ id: board.id, columns: board.columns });
|
|
5806
|
+
if (pendingBoardWrite) await kanbanStore.update({ id: board.id, columns: board.columns });
|
|
5753
5807
|
}
|
|
5754
5808
|
async function executeKanbanBoardCommands(boardId, commands) {
|
|
5755
5809
|
if (commands.length === 0) return;
|
|
@@ -5762,43 +5816,6 @@ async function executeKanbanBoardCommands(boardId, commands) {
|
|
|
5762
5816
|
}
|
|
5763
5817
|
await kanbanStore.update({ id: board.id, columns: board.columns });
|
|
5764
5818
|
}
|
|
5765
|
-
function moveCard(board, cardId, targetColTitle) {
|
|
5766
|
-
let sourceCol = "";
|
|
5767
|
-
let card = null;
|
|
5768
|
-
let sourceColIdx = -1;
|
|
5769
|
-
let cardIdx = -1;
|
|
5770
|
-
for (let ci = 0; ci < board.columns.length; ci++) {
|
|
5771
|
-
const col = board.columns[ci];
|
|
5772
|
-
const idx = col.cards.findIndex((c) => c.id === cardId);
|
|
5773
|
-
if (idx !== -1) {
|
|
5774
|
-
sourceCol = col.title;
|
|
5775
|
-
card = col.cards[idx];
|
|
5776
|
-
sourceColIdx = ci;
|
|
5777
|
-
cardIdx = idx;
|
|
5778
|
-
break;
|
|
5779
|
-
}
|
|
5780
|
-
}
|
|
5781
|
-
if (!card || sourceColIdx === -1) return false;
|
|
5782
|
-
const targetCol = board.columns.find(
|
|
5783
|
-
(c) => c.title.toLowerCase() === targetColTitle.toLowerCase()
|
|
5784
|
-
);
|
|
5785
|
-
if (!targetCol) {
|
|
5786
|
-
console.warn(`[kanban-commands] Target column "${targetColTitle}" not found. Available: ${board.columns.map((c) => c.title).join(", ")}`);
|
|
5787
|
-
return false;
|
|
5788
|
-
}
|
|
5789
|
-
if (targetCol.id === board.columns[sourceColIdx].id) return true;
|
|
5790
|
-
board.columns[sourceColIdx].cards.splice(cardIdx, 1);
|
|
5791
|
-
card.order = targetCol.cards.length;
|
|
5792
|
-
card.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
5793
|
-
card.history = [...card.history ?? [], {
|
|
5794
|
-
type: "moved",
|
|
5795
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
5796
|
-
detail: `"${sourceCol}" \u2192 "${targetCol.title}"`,
|
|
5797
|
-
author: "ai"
|
|
5798
|
-
}];
|
|
5799
|
-
targetCol.cards.push(card);
|
|
5800
|
-
return true;
|
|
5801
|
-
}
|
|
5802
5819
|
function addCardToColumn(board, columnTitle, cardTitle, cardContent) {
|
|
5803
5820
|
const col = board.columns.find((c) => c.title.toLowerCase() === columnTitle.toLowerCase());
|
|
5804
5821
|
if (!col) return;
|
|
@@ -5815,28 +5832,12 @@ function addCardToColumn(board, columnTitle, cardTitle, cardContent) {
|
|
|
5815
5832
|
};
|
|
5816
5833
|
col.cards.push(card);
|
|
5817
5834
|
}
|
|
5818
|
-
function addComment(board, cardId, comment, conversationId) {
|
|
5819
|
-
for (const col of board.columns) {
|
|
5820
|
-
const card = col.cards.find((c) => c.id === cardId);
|
|
5821
|
-
if (card) {
|
|
5822
|
-
card.history = [...card.history ?? [], {
|
|
5823
|
-
type: "comment",
|
|
5824
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
5825
|
-
detail: comment,
|
|
5826
|
-
author: "ai",
|
|
5827
|
-
...conversationId ? { conversationId } : {}
|
|
5828
|
-
}];
|
|
5829
|
-
card.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
5830
|
-
return;
|
|
5831
|
-
}
|
|
5832
|
-
}
|
|
5833
|
-
}
|
|
5834
5835
|
function formatSize(bytes) {
|
|
5835
5836
|
if (bytes < 1024) return `${bytes} o`;
|
|
5836
5837
|
if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} Ko`;
|
|
5837
5838
|
return `${(bytes / (1024 * 1024)).toFixed(1).replace(".", ",")} Mo`;
|
|
5838
5839
|
}
|
|
5839
|
-
function generateKanbanSystemPrompt(board, cardId) {
|
|
5840
|
+
function generateKanbanSystemPrompt(board, cardId, history) {
|
|
5840
5841
|
let currentColTitle = "";
|
|
5841
5842
|
let card = null;
|
|
5842
5843
|
for (const col of board.columns) {
|
|
@@ -5866,7 +5867,8 @@ function generateKanbanSystemPrompt(board, cardId) {
|
|
|
5866
5867
|
}
|
|
5867
5868
|
lines.push("");
|
|
5868
5869
|
if (card) {
|
|
5869
|
-
const
|
|
5870
|
+
const events = history ?? card.history ?? [];
|
|
5871
|
+
const comments = events.filter((e) => e.type === "comment");
|
|
5870
5872
|
if (comments.length > 0) {
|
|
5871
5873
|
lines.push("### Commentaires existants sur cette carte :");
|
|
5872
5874
|
lines.push("");
|
|
@@ -5881,7 +5883,7 @@ function generateKanbanSystemPrompt(board, cardId) {
|
|
|
5881
5883
|
}
|
|
5882
5884
|
if (card) {
|
|
5883
5885
|
const files = card.attachments ?? [];
|
|
5884
|
-
const commentFiles = (card.history ?? []).flatMap((e) => e.attachments ?? []);
|
|
5886
|
+
const commentFiles = (history ?? card.history ?? []).flatMap((e) => e.attachments ?? []);
|
|
5885
5887
|
const all = [...files, ...commentFiles];
|
|
5886
5888
|
if (all.length > 0) {
|
|
5887
5889
|
lines.push(`### Pi\xE8ces jointes disponibles (${all.length})`);
|
|
@@ -6129,7 +6131,7 @@ function tailTranscript(opts) {
|
|
|
6129
6131
|
|
|
6130
6132
|
// ../server/src/services/ai-runners/claude-pty-runner.ts
|
|
6131
6133
|
async function getAgentManager() {
|
|
6132
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
6134
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-KGITN4AE.js");
|
|
6133
6135
|
return agentManager2;
|
|
6134
6136
|
}
|
|
6135
6137
|
function buildPtyArgs(params, sessionId, opts) {
|
|
@@ -6782,7 +6784,7 @@ async function shutdownCodexAppServer() {
|
|
|
6782
6784
|
}
|
|
6783
6785
|
}
|
|
6784
6786
|
async function getAgentManager2() {
|
|
6785
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
6787
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-KGITN4AE.js");
|
|
6786
6788
|
return agentManager2;
|
|
6787
6789
|
}
|
|
6788
6790
|
function parseRuneyaCurlCommand(command) {
|
|
@@ -7466,7 +7468,13 @@ async function buildCliSystemContext(conv, jwt) {
|
|
|
7466
7468
|
if (conv?.kanbanBoardId) {
|
|
7467
7469
|
const kanbanBoard = await kanbanStore.get(conv.kanbanBoardId);
|
|
7468
7470
|
if (kanbanBoard) {
|
|
7469
|
-
systemContext += "\n\n" + (conv.kanbanCardId ? generateKanbanSystemPrompt(
|
|
7471
|
+
systemContext += "\n\n" + (conv.kanbanCardId ? generateKanbanSystemPrompt(
|
|
7472
|
+
kanbanBoard,
|
|
7473
|
+
conv.kanbanCardId,
|
|
7474
|
+
// Le journal ne vient plus avec le tableau : le contexte de l'agent
|
|
7475
|
+
// le demande pour la seule carte qui le concerne.
|
|
7476
|
+
await kanbanStore.cardHistory(kanbanBoard.id, conv.kanbanCardId)
|
|
7477
|
+
) : generateKanbanPopulatePrompt(kanbanBoard));
|
|
7470
7478
|
}
|
|
7471
7479
|
}
|
|
7472
7480
|
return systemContext;
|
|
@@ -7867,7 +7875,13 @@ ${input.prompt}` : input.prompt;
|
|
|
7867
7875
|
if (conv.kanbanBoardId) {
|
|
7868
7876
|
const kanbanBoard = await kanbanStore.get(conv.kanbanBoardId);
|
|
7869
7877
|
if (kanbanBoard) {
|
|
7870
|
-
systemContext += "\n\n" + (conv.kanbanCardId ? generateKanbanSystemPrompt(
|
|
7878
|
+
systemContext += "\n\n" + (conv.kanbanCardId ? generateKanbanSystemPrompt(
|
|
7879
|
+
kanbanBoard,
|
|
7880
|
+
conv.kanbanCardId,
|
|
7881
|
+
// Le journal ne vient plus avec le tableau : le contexte de l'agent
|
|
7882
|
+
// le demande pour la seule carte qui le concerne.
|
|
7883
|
+
await kanbanStore.cardHistory(kanbanBoard.id, conv.kanbanCardId)
|
|
7884
|
+
) : generateKanbanPopulatePrompt(kanbanBoard));
|
|
7871
7885
|
}
|
|
7872
7886
|
}
|
|
7873
7887
|
const mcpServerPath = fileURLToPath(new URL("../mcp-server/index.js", import.meta.url));
|
|
@@ -7982,7 +7996,13 @@ ${input.prompt}` : input.prompt;
|
|
|
7982
7996
|
if (conv.kanbanBoardId) {
|
|
7983
7997
|
const kanbanBoard = await kanbanStore.get(conv.kanbanBoardId);
|
|
7984
7998
|
if (kanbanBoard) {
|
|
7985
|
-
systemContext += "\n\n" + (conv.kanbanCardId ? generateKanbanSystemPrompt(
|
|
7999
|
+
systemContext += "\n\n" + (conv.kanbanCardId ? generateKanbanSystemPrompt(
|
|
8000
|
+
kanbanBoard,
|
|
8001
|
+
conv.kanbanCardId,
|
|
8002
|
+
// Le journal ne vient plus avec le tableau : le contexte de l'agent
|
|
8003
|
+
// le demande pour la seule carte qui le concerne.
|
|
8004
|
+
await kanbanStore.cardHistory(kanbanBoard.id, conv.kanbanCardId)
|
|
8005
|
+
) : generateKanbanPopulatePrompt(kanbanBoard));
|
|
7986
8006
|
}
|
|
7987
8007
|
}
|
|
7988
8008
|
const resolvedImages = input.imageIds && input.imageIds.length > 0 ? await resolveImagesToBase64(input.imageIds.map((id) => ({ imageId: id, mimeType: "" })), input.conversationId) : [];
|
|
@@ -8075,7 +8095,13 @@ ${input.prompt}` : input.prompt;
|
|
|
8075
8095
|
if (conv && conv.kanbanBoardId) {
|
|
8076
8096
|
const kanbanBoard = await kanbanStore.get(conv.kanbanBoardId);
|
|
8077
8097
|
if (kanbanBoard) {
|
|
8078
|
-
system += "\n\n" + (conv.kanbanCardId ? generateKanbanSystemPrompt(
|
|
8098
|
+
system += "\n\n" + (conv.kanbanCardId ? generateKanbanSystemPrompt(
|
|
8099
|
+
kanbanBoard,
|
|
8100
|
+
conv.kanbanCardId,
|
|
8101
|
+
// Le journal ne vient plus avec le tableau : le contexte de l'agent
|
|
8102
|
+
// le demande pour la seule carte qui le concerne.
|
|
8103
|
+
await kanbanStore.cardHistory(kanbanBoard.id, conv.kanbanCardId)
|
|
8104
|
+
) : generateKanbanPopulatePrompt(kanbanBoard));
|
|
8079
8105
|
}
|
|
8080
8106
|
}
|
|
8081
8107
|
const resolvedImages = input.imageIds && input.imageIds.length > 0 ? await resolveImagesToBase64(input.imageIds.map((id) => ({ imageId: id, mimeType: "" })), input.conversationId) : [];
|
|
@@ -10769,19 +10795,8 @@ var KanbanQueueService = class extends EventEmitter4 {
|
|
|
10769
10795
|
this.running.push(runItem);
|
|
10770
10796
|
this.emit("changed");
|
|
10771
10797
|
const eventType = item.scenarioId ? "scenario_started" : "conversation_started";
|
|
10772
|
-
|
|
10773
|
-
|
|
10774
|
-
if (target) {
|
|
10775
|
-
target.history = [...target.history ?? [], {
|
|
10776
|
-
type: eventType,
|
|
10777
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
10778
|
-
detail: conv.id
|
|
10779
|
-
}];
|
|
10780
|
-
kanbanStore.update({ id: board.id, columns: board.columns }).catch(() => {
|
|
10781
|
-
});
|
|
10782
|
-
break;
|
|
10783
|
-
}
|
|
10784
|
-
}
|
|
10798
|
+
kanbanStore.addCardEvent(board.id, item.cardId, eventType, conv.id).catch(() => {
|
|
10799
|
+
});
|
|
10785
10800
|
if (item.scenarioId) {
|
|
10786
10801
|
void runScenario(conv.id, item.scenarioId, cardContent, {
|
|
10787
10802
|
runnerOverride: item.runner,
|
|
@@ -10802,7 +10817,8 @@ var KanbanQueueService = class extends EventEmitter4 {
|
|
|
10802
10817
|
try {
|
|
10803
10818
|
const model = item.model || (item.runner === "codex" ? "" : "claude-opus-4-6");
|
|
10804
10819
|
const starter = item.runner === "codex" ? startCodexSession : startClaudeCodeSession;
|
|
10805
|
-
const
|
|
10820
|
+
const jwt = await signJwt();
|
|
10821
|
+
const { done } = await starter(runItem.conversationId, cardContent, { model, jwt });
|
|
10806
10822
|
await done;
|
|
10807
10823
|
} finally {
|
|
10808
10824
|
this.finishItem(runItem.id);
|
|
@@ -10888,7 +10904,9 @@ var kanbanQueueRouter = router({
|
|
|
10888
10904
|
});
|
|
10889
10905
|
|
|
10890
10906
|
// ../server/src/trpc/routers/kanban.ts
|
|
10891
|
-
import { mkdir as mkdir14, writeFile as writeFile11 } from "fs/promises";
|
|
10907
|
+
import { mkdir as mkdir14, readdir as readdir5, rm as rm2, stat as stat3, writeFile as writeFile11 } from "fs/promises";
|
|
10908
|
+
import { createHash } from "crypto";
|
|
10909
|
+
import { tmpdir } from "os";
|
|
10892
10910
|
import { join as join16 } from "path";
|
|
10893
10911
|
import { z as z20 } from "zod";
|
|
10894
10912
|
import { TRPCError as TRPCError17 } from "@trpc/server";
|
|
@@ -10900,7 +10918,7 @@ function summarizeCard(card, boardId, columnTitle) {
|
|
|
10900
10918
|
title: card.title,
|
|
10901
10919
|
markdown: card.markdown ?? "",
|
|
10902
10920
|
assignees: (card.assignees ?? []).map((a) => a.name),
|
|
10903
|
-
commentCount: (card.history ?? []).filter((e) => e.type === "comment").length,
|
|
10921
|
+
commentCount: card.commentCount ?? (card.history ?? []).filter((e) => e.type === "comment").length,
|
|
10904
10922
|
attachmentCount: (card.attachments ?? []).length,
|
|
10905
10923
|
// Metadata only — the bytes are fetched on demand by `downloadAttachment`.
|
|
10906
10924
|
attachments: (card.attachments ?? []).map((f) => ({
|
|
@@ -10931,13 +10949,54 @@ function normalize(value) {
|
|
|
10931
10949
|
return value.normalize("NFD").replace(new RegExp("\\p{Diacritic}", "gu"), "").toLowerCase();
|
|
10932
10950
|
}
|
|
10933
10951
|
var ATTACHMENT_ID_REGEX = /^[A-Za-z0-9_-]{1,128}$/;
|
|
10952
|
+
function safeDecode(value) {
|
|
10953
|
+
try {
|
|
10954
|
+
return decodeURIComponent(value);
|
|
10955
|
+
} catch {
|
|
10956
|
+
return "";
|
|
10957
|
+
}
|
|
10958
|
+
}
|
|
10934
10959
|
var MAX_ATTACHMENT_BYTES = 55 * 1024 * 1024;
|
|
10935
10960
|
function attachmentCacheDir() {
|
|
10936
|
-
return join16(
|
|
10961
|
+
return join16(tmpdir(), "runeya-kanban-attachments");
|
|
10962
|
+
}
|
|
10963
|
+
var ATTACHMENT_CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
10964
|
+
async function purgeStaleAttachments(dir, ttlMs = ATTACHMENT_CACHE_TTL_MS) {
|
|
10965
|
+
try {
|
|
10966
|
+
const cutoff = Date.now() - ttlMs;
|
|
10967
|
+
for (const name of await readdir5(dir)) {
|
|
10968
|
+
const path = join16(dir, name);
|
|
10969
|
+
const info = await stat3(path).catch(() => null);
|
|
10970
|
+
if (info && info.mtimeMs < cutoff) await rm2(path, { force: true });
|
|
10971
|
+
}
|
|
10972
|
+
} catch {
|
|
10973
|
+
}
|
|
10974
|
+
}
|
|
10975
|
+
function attachmentCacheDirs() {
|
|
10976
|
+
return [attachmentCacheDir(), join16(env.DATA_DIR, "kanban-attachments")];
|
|
10977
|
+
}
|
|
10978
|
+
async function storeAttachment(id, name, body, dirs = attachmentCacheDirs()) {
|
|
10979
|
+
const refusals = [];
|
|
10980
|
+
for (const dir of dirs) {
|
|
10981
|
+
try {
|
|
10982
|
+
await mkdir14(dir, { recursive: true });
|
|
10983
|
+
const path = join16(dir, safeLocalName(id, name));
|
|
10984
|
+
await writeFile11(path, body);
|
|
10985
|
+
void purgeStaleAttachments(dir);
|
|
10986
|
+
return path;
|
|
10987
|
+
} catch (err) {
|
|
10988
|
+
refusals.push(`${dir} (${err instanceof Error ? err.message : String(err)})`);
|
|
10989
|
+
}
|
|
10990
|
+
}
|
|
10991
|
+
throw new TRPCError17({
|
|
10992
|
+
code: "INTERNAL_SERVER_ERROR",
|
|
10993
|
+
message: `Impossible d'\xE9crire la pi\xE8ce jointe sur cette machine. Emplacements essay\xE9s : ${refusals.join(" ; ")}. V\xE9rifiez les droits d'\xE9criture, ou l'espace disque.`
|
|
10994
|
+
});
|
|
10937
10995
|
}
|
|
10938
10996
|
function safeLocalName(id, name) {
|
|
10997
|
+
const base = createHash("sha256").update(id).digest("hex").slice(0, 32);
|
|
10939
10998
|
const ext = /\.([A-Za-z0-9]{1,12})$/.exec(name)?.[1];
|
|
10940
|
-
return ext ? `${
|
|
10999
|
+
return ext ? `${base}.${ext.toLowerCase()}` : base;
|
|
10941
11000
|
}
|
|
10942
11001
|
var kanbanRouter = router({
|
|
10943
11002
|
/**
|
|
@@ -11059,11 +11118,9 @@ var kanbanRouter = router({
|
|
|
11059
11118
|
}
|
|
11060
11119
|
const contentType = res.headers.get("content-type") ?? "application/octet-stream";
|
|
11061
11120
|
const disposition = res.headers.get("content-disposition") ?? "";
|
|
11062
|
-
const
|
|
11063
|
-
const
|
|
11064
|
-
await
|
|
11065
|
-
const path = join16(dir, safeLocalName(id, name));
|
|
11066
|
-
await writeFile11(path, body);
|
|
11121
|
+
const encoded = /filename\*=UTF-8''([^;]+)/i.exec(disposition)?.[1];
|
|
11122
|
+
const name = (encoded ? safeDecode(encoded) : "") || /filename="([^"]*)"/.exec(disposition)?.[1] || id;
|
|
11123
|
+
const path = await storeAttachment(id, name, body);
|
|
11067
11124
|
return { path, name, contentType, size: body.length };
|
|
11068
11125
|
})
|
|
11069
11126
|
});
|
|
@@ -11191,7 +11248,7 @@ var utilityRouter = router({
|
|
|
11191
11248
|
// ../server/src/trpc/routers/wiki.ts
|
|
11192
11249
|
import { z as z23 } from "zod";
|
|
11193
11250
|
import { TRPCError as TRPCError19 } from "@trpc/server";
|
|
11194
|
-
import { readFile as readFile13, readdir as
|
|
11251
|
+
import { readFile as readFile13, readdir as readdir6, stat as stat4, realpath, writeFile as writeFile12, mkdir as mkdir15, rename as rename10, rm as rm3 } from "fs/promises";
|
|
11195
11252
|
import { resolve as resolvePath, join as join17, relative, sep as sep3, dirname as dirname3 } from "path";
|
|
11196
11253
|
var SCOPE_SCHEMA = z23.union([
|
|
11197
11254
|
z23.literal("global"),
|
|
@@ -11254,7 +11311,7 @@ async function walkLocal(root, dir, depth, counter) {
|
|
|
11254
11311
|
if (depth > MAX_DEPTH || counter.n >= MAX_FILES) return [];
|
|
11255
11312
|
let entries;
|
|
11256
11313
|
try {
|
|
11257
|
-
entries = await
|
|
11314
|
+
entries = await readdir6(dir, { withFileTypes: true });
|
|
11258
11315
|
} catch {
|
|
11259
11316
|
return [];
|
|
11260
11317
|
}
|
|
@@ -11327,7 +11384,7 @@ var wikiRouter = router({
|
|
|
11327
11384
|
return agentManager.agentQuery(target.agentId, "wiki.readRepoMarkdown", { cwd: target.cwd, path: input.path });
|
|
11328
11385
|
}
|
|
11329
11386
|
const file = await resolveSafeLocal(target.root, input.path, true);
|
|
11330
|
-
const s = await
|
|
11387
|
+
const s = await stat4(file);
|
|
11331
11388
|
if (!s.isFile()) throw new TRPCError19({ code: "BAD_REQUEST", message: "Pas un fichier" });
|
|
11332
11389
|
if (s.size > MAX_FILE_BYTES) throw new TRPCError19({ code: "PAYLOAD_TOO_LARGE", message: "Fichier trop volumineux" });
|
|
11333
11390
|
const content = await readFile13(file, "utf-8");
|
|
@@ -11356,7 +11413,7 @@ var wikiRouter = router({
|
|
|
11356
11413
|
}
|
|
11357
11414
|
const file = await resolveSafeLocal(target.root, input.path, false);
|
|
11358
11415
|
try {
|
|
11359
|
-
await
|
|
11416
|
+
await stat4(file);
|
|
11360
11417
|
throw new TRPCError19({ code: "CONFLICT", message: "Fichier d\xE9j\xE0 existant" });
|
|
11361
11418
|
} catch (err) {
|
|
11362
11419
|
if (err instanceof TRPCError19) throw err;
|
|
@@ -11382,7 +11439,7 @@ var wikiRouter = router({
|
|
|
11382
11439
|
const from = await resolveSafeLocal(target.root, input.fromPath, true);
|
|
11383
11440
|
const to = await resolveSafeLocal(target.root, input.toPath, false);
|
|
11384
11441
|
try {
|
|
11385
|
-
await
|
|
11442
|
+
await stat4(to);
|
|
11386
11443
|
throw new TRPCError19({ code: "CONFLICT", message: "La cible existe d\xE9j\xE0" });
|
|
11387
11444
|
} catch (err) {
|
|
11388
11445
|
if (err instanceof TRPCError19) throw err;
|
|
@@ -11411,7 +11468,7 @@ var wikiRouter = router({
|
|
|
11411
11468
|
}
|
|
11412
11469
|
const fp = await resolveSafeLocal(target.root, input.path, true);
|
|
11413
11470
|
if (fp === target.root) throw new TRPCError19({ code: "FORBIDDEN", message: "Impossible de supprimer la racine" });
|
|
11414
|
-
await
|
|
11471
|
+
await rm3(fp, { recursive: true, force: true });
|
|
11415
11472
|
return { path: input.path, ok: true };
|
|
11416
11473
|
})
|
|
11417
11474
|
});
|
|
@@ -11849,7 +11906,7 @@ var cloudSyncBridge = new CloudSyncBridge();
|
|
|
11849
11906
|
|
|
11850
11907
|
// ../server/src/services/master-password.ts
|
|
11851
11908
|
import { randomBytes as randomBytes4, createCipheriv, createDecipheriv } from "crypto";
|
|
11852
|
-
import { readFile as readFile15, writeFile as writeFile14, chmod as chmod10, stat as
|
|
11909
|
+
import { readFile as readFile15, writeFile as writeFile14, chmod as chmod10, stat as stat5, rename as rename12 } from "fs/promises";
|
|
11853
11910
|
import { join as join19 } from "path";
|
|
11854
11911
|
import { Entry } from "@napi-rs/keyring";
|
|
11855
11912
|
import { hashRaw as argon2HashRaw } from "@node-rs/argon2";
|
|
@@ -11862,7 +11919,7 @@ var CANARY_PLAINTEXT = "runeya:v1:key-verification";
|
|
|
11862
11919
|
var MAX_KEY_FILE_SIZE = 1024;
|
|
11863
11920
|
var ARGON2_OPTIONS = { memoryCost: 65536, timeCost: 3, parallelism: 4, outputLen: 32 };
|
|
11864
11921
|
async function readKeyFile(filePath) {
|
|
11865
|
-
const s = await
|
|
11922
|
+
const s = await stat5(filePath);
|
|
11866
11923
|
if (s.size > MAX_KEY_FILE_SIZE) throw new Error(`Fichier suspect : ${filePath} (${s.size} octets)`);
|
|
11867
11924
|
return readFile15(filePath);
|
|
11868
11925
|
}
|
|
@@ -11998,7 +12055,7 @@ async function readVerifyFile(dataDir) {
|
|
|
11998
12055
|
}
|
|
11999
12056
|
async function hasVerifyFile(dataDir) {
|
|
12000
12057
|
try {
|
|
12001
|
-
await
|
|
12058
|
+
await stat5(join19(dataDir, VERIFY_FILENAME));
|
|
12002
12059
|
return true;
|
|
12003
12060
|
} catch {
|
|
12004
12061
|
return false;
|
|
@@ -12006,7 +12063,7 @@ async function hasVerifyFile(dataDir) {
|
|
|
12006
12063
|
}
|
|
12007
12064
|
async function hasEncryptedKeyFile(dataDir) {
|
|
12008
12065
|
try {
|
|
12009
|
-
await
|
|
12066
|
+
await stat5(join19(dataDir, ENCRYPTED_KEY_FILENAME));
|
|
12010
12067
|
return true;
|
|
12011
12068
|
} catch {
|
|
12012
12069
|
return false;
|
|
@@ -12139,7 +12196,7 @@ var MigrationEngine = class {
|
|
|
12139
12196
|
var migrationEngine = new MigrationEngine();
|
|
12140
12197
|
|
|
12141
12198
|
// ../server/src/services/file-security.ts
|
|
12142
|
-
import { chmod as chmod11, stat as
|
|
12199
|
+
import { chmod as chmod11, stat as stat6 } from "fs/promises";
|
|
12143
12200
|
import { join as join20 } from "path";
|
|
12144
12201
|
var SENSITIVE_FILES = [
|
|
12145
12202
|
"agents.json",
|
|
@@ -12154,7 +12211,7 @@ async function ensureFilePermissions() {
|
|
|
12154
12211
|
for (const filename of SENSITIVE_FILES) {
|
|
12155
12212
|
const filepath = join20(env.DATA_DIR, filename);
|
|
12156
12213
|
try {
|
|
12157
|
-
const stats = await
|
|
12214
|
+
const stats = await stat6(filepath);
|
|
12158
12215
|
const mode = stats.mode & 511;
|
|
12159
12216
|
if (mode !== SECURE_MODE) {
|
|
12160
12217
|
console.warn("[security] File", filename, "has mode", mode.toString(8) + ", fixing to 600");
|
|
@@ -12221,7 +12278,7 @@ import {
|
|
|
12221
12278
|
rename as rename13,
|
|
12222
12279
|
mkdir as mkdir17,
|
|
12223
12280
|
access as access2,
|
|
12224
|
-
readdir as
|
|
12281
|
+
readdir as readdir7
|
|
12225
12282
|
} from "fs/promises";
|
|
12226
12283
|
import { join as join22 } from "path";
|
|
12227
12284
|
var _require = createRequire(import.meta.url);
|
|
@@ -12390,14 +12447,14 @@ async function runLegacyMigration(dataDir) {
|
|
|
12390
12447
|
}
|
|
12391
12448
|
}
|
|
12392
12449
|
const envsDir = join22(dbsDir, "envs");
|
|
12393
|
-
const envFiles = (await
|
|
12450
|
+
const envFiles = (await readdir7(envsDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
12394
12451
|
const legacyEnvs = {};
|
|
12395
12452
|
for (const file of envFiles) {
|
|
12396
12453
|
const name = file.replace(".encrypted.json", "");
|
|
12397
12454
|
legacyEnvs[name] = await readEncrypted(join22(envsDir, file));
|
|
12398
12455
|
}
|
|
12399
12456
|
const servicesDir = join22(dbsDir, "services");
|
|
12400
|
-
const serviceFiles = (await
|
|
12457
|
+
const serviceFiles = (await readdir7(servicesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
12401
12458
|
const legacyServices = {};
|
|
12402
12459
|
for (const file of serviceFiles) {
|
|
12403
12460
|
const name = file.replace(".encrypted.json", "");
|
|
@@ -12406,7 +12463,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
12406
12463
|
if (data?.label) legacyServices[name] = data;
|
|
12407
12464
|
}
|
|
12408
12465
|
const overridesDir = join22(dbsDir, "overrides");
|
|
12409
|
-
const overrideFiles = (await
|
|
12466
|
+
const overrideFiles = (await readdir7(overridesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
12410
12467
|
const legacyServiceOverrides = {};
|
|
12411
12468
|
const legacyEnvOverrides = {};
|
|
12412
12469
|
for (const file of overrideFiles) {
|
|
@@ -12420,7 +12477,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
12420
12477
|
}
|
|
12421
12478
|
}
|
|
12422
12479
|
const parsersDir = join22(dbsDir, "parsers");
|
|
12423
|
-
const parserFiles = (await
|
|
12480
|
+
const parserFiles = (await readdir7(parsersDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
12424
12481
|
const legacyParsers = [];
|
|
12425
12482
|
for (const file of parserFiles) {
|
|
12426
12483
|
const data = await readEncrypted(join22(parsersDir, file));
|
|
@@ -12800,7 +12857,7 @@ ${p.transform ?? ""}`,
|
|
|
12800
12857
|
}
|
|
12801
12858
|
async function findLegacyKeyInBackup(dataDir) {
|
|
12802
12859
|
try {
|
|
12803
|
-
const entries = await
|
|
12860
|
+
const entries = await readdir7(dataDir);
|
|
12804
12861
|
const backupDirs = entries.filter((e) => e.startsWith("backup-")).sort((a, b) => a < b ? -1 : a > b ? 1 : 0).reverse();
|
|
12805
12862
|
for (const dir of backupDirs) {
|
|
12806
12863
|
const keyJsonPath = join22(dataDir, dir, "dbs", "encryption-key.json");
|
|
@@ -12834,7 +12891,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
12834
12891
|
let overrideFiles = [];
|
|
12835
12892
|
for (const dir of candidateDirs) {
|
|
12836
12893
|
try {
|
|
12837
|
-
const files = (await
|
|
12894
|
+
const files = (await readdir7(dir)).filter((f) => f.endsWith(".encrypted.json"));
|
|
12838
12895
|
if (files.length > 0) {
|
|
12839
12896
|
overridesDir = dir;
|
|
12840
12897
|
overrideFiles = files;
|
|
@@ -13010,7 +13067,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
13010
13067
|
|
|
13011
13068
|
// ../server/src/services/server-state.ts
|
|
13012
13069
|
import { join as join23 } from "path";
|
|
13013
|
-
import { stat as
|
|
13070
|
+
import { stat as stat7 } from "fs/promises";
|
|
13014
13071
|
var ENCRYPTED_KEY_FILENAME2 = ".encryption.key.enc";
|
|
13015
13072
|
var VERIFY_FILENAME2 = ".runeya-verify";
|
|
13016
13073
|
async function getServerState() {
|
|
@@ -13019,17 +13076,17 @@ async function getServerState() {
|
|
|
13019
13076
|
let hasVerify = false;
|
|
13020
13077
|
let hasData = false;
|
|
13021
13078
|
try {
|
|
13022
|
-
await
|
|
13079
|
+
await stat7(join23(dataDir, ENCRYPTED_KEY_FILENAME2));
|
|
13023
13080
|
hasEncFile = true;
|
|
13024
13081
|
} catch {
|
|
13025
13082
|
}
|
|
13026
13083
|
try {
|
|
13027
|
-
await
|
|
13084
|
+
await stat7(join23(dataDir, VERIFY_FILENAME2));
|
|
13028
13085
|
hasVerify = true;
|
|
13029
13086
|
} catch {
|
|
13030
13087
|
}
|
|
13031
13088
|
try {
|
|
13032
|
-
await
|
|
13089
|
+
await stat7(join23(dataDir, "projects.json"));
|
|
13033
13090
|
hasData = true;
|
|
13034
13091
|
} catch {
|
|
13035
13092
|
}
|
|
@@ -14179,4 +14236,4 @@ export {
|
|
|
14179
14236
|
createLocalServer,
|
|
14180
14237
|
pullEnv
|
|
14181
14238
|
};
|
|
14182
|
-
//# sourceMappingURL=src-
|
|
14239
|
+
//# sourceMappingURL=src-I5LYBYA2.js.map
|