@runeya/runeya 2.0.76 → 2.0.78
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 +67 -5
- package/agent/index.js.map +1 -1
- package/agent-manager-KM7SFKVR.js +7 -0
- package/{chunk-E2SU5RSO.js → chunk-T3TDCZUY.js} +68 -6
- package/chunk-T3TDCZUY.js.map +1 -0
- package/index.js +1 -1
- package/mcp-server/index.js +85 -2
- package/mcp-server/index.js.map +1 -1
- package/package.json +1 -1
- package/{src-MEMRUBM6.js → src-6PAM4JRF.js} +552 -106
- package/src-6PAM4JRF.js.map +1 -0
- package/web/assets/AgentScalarChatInterface.vue-CNmHQ-rZ.js +13 -0
- package/web/assets/AgentTerminalPage-DoSm_qja.js +1 -0
- package/web/assets/AiChatPage-BH4bzdI7.js +1 -0
- package/web/assets/AppLayout-7Ioj7Ks0.js +1 -0
- package/web/assets/AuditPage-eER_6QCL.js +1 -0
- package/web/assets/CloudAccountPage-BrXEpmA0.js +1 -0
- package/web/assets/CloudAccountPage-BwaWet6j.js +1 -0
- package/web/assets/CloudMessagingPage-BuQqUImY.js +2 -0
- package/web/assets/DashboardPage-DE-D5iYb.js +1 -0
- package/web/assets/DirectoryPickerDialog-DoMtoAB6.js +1 -0
- package/web/assets/{EditorIcon-BGndPLGm.js → EditorIcon-Dze4HWD5.js} +2 -2
- package/web/assets/{EnvironmentForm-5X5MccdS.js → EnvironmentForm-DtcNJVjV.js} +2 -2
- package/web/assets/EnvironmentFormPage-B9qwDL-3.js +1 -0
- package/web/assets/EnvironmentListPage-CxkOZ5tX.js +1 -0
- package/web/assets/KanbanBoardPage-DKdXK4Qx.css +1 -0
- package/web/assets/KanbanBoardPage-M4vd6nJ4.js +4 -0
- package/web/assets/KanbanListPage-Bhdw2jOU.js +1 -0
- package/web/assets/LaunchProjectPage-CiBi7ViX.js +1 -0
- package/web/assets/LaunchServicesPage-DFySTFG9.js +1 -0
- package/web/assets/LogViewer-CKMcu56W.js +3 -0
- package/web/assets/OrgKeyPrompt-cQ2E4Hma.js +1 -0
- package/web/assets/ProcessControls-Dp8B86Vk.js +1 -0
- package/web/assets/ProcessDetailPage-BYvrD502.js +1 -0
- package/web/assets/{ProcessMetrics-B0mOAjpt.js → ProcessMetrics-CgxzXC17.js} +2 -2
- package/web/assets/ProjectDetailPage-DZkrNPAY.js +1 -0
- package/web/assets/ProjectListPage-DUJu2DLy.js +1 -0
- package/web/assets/RandomJobTestPage-s1JZo_Iz.js +2 -0
- package/web/assets/ScenarioEditorPage-DlIpuxfC.js +14 -0
- package/web/assets/SendToChatDialog-DZe1HI00.js +1 -0
- package/web/assets/ServiceControlsBar-BKFVLyeu.js +1 -0
- package/web/assets/ServiceDetailPage-CBK2mMw9.js +2 -0
- package/web/assets/{ServiceDetailPage-DVOQdgmZ.css → ServiceDetailPage-IU_BrMof.css} +1 -1
- package/web/assets/ServiceFormPage-CCRgRCCH.js +1 -0
- package/web/assets/SettingsPage-BTBGU8Od.js +2063 -0
- package/web/assets/{SettingsPage-CeFOjH68.css → SettingsPage-DkzFCmSX.css} +1 -1
- package/web/assets/UnlockPage-CvDJJ5Fs.js +1 -0
- package/web/assets/VariablesTable-6l9GrMcC.js +1 -0
- package/web/assets/VaultMigrationPage--EbAu-3y.js +1 -0
- package/web/assets/VersionBadge-CTUt4tVm.js +1 -0
- package/web/assets/WikiPage-BgyoMils.js +1 -0
- package/web/assets/WikiView-Bm25ya4s.js +1 -0
- package/web/assets/add-scalar-classes-BrcrAJKI.js +387 -0
- package/web/assets/auth-errors-D7z_zLrU.js +1 -0
- package/web/assets/{autocomplete-CGdex9-e.js → autocomplete-BZZ6eLOr.js} +3 -3
- package/web/assets/{basic-shape-diamond.svg-qeeRnNFT.js → basic-shape-diamond.svg-kNoZJr6Q.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-CIlKhfGT.js → basic-shape-hexagon.svg-m2knsywy.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-BqolxHsi.js → basic-shape-primary-circle-ellipse-round.svg-D5c4bHRs.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-CpdZYdXX.js → basic-shape-primary-square-rectangle.svg-5Jh3keY7.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-Dxhs7gEl.js → basic-shape-shield.svg-DXuFi_uS.js} +1 -1
- package/web/assets/{browser-DN1U-HwX.js → browser-BnFxWu1Z.js} +1 -1
- package/web/assets/{browser-I2oYlD2i.js → browser-C8mNrw8h.js} +1 -1
- package/web/assets/card-CyclORkQ.js +32 -0
- package/web/assets/{checkbox-GeePBqgX.js → checkbox-B6-p4_sk.js} +3 -3
- package/web/assets/{chip-BHIwNcot.js → chip-BhspXQJY.js} +2 -2
- package/web/assets/client-ouCQfzXo.js +24 -0
- package/web/assets/cloud-chat.store-C6podxIi.js +1 -0
- package/web/assets/cloud-session-CR7l0OPa.js +1 -0
- package/web/assets/column-Btrf7omy.js +907 -0
- package/web/assets/{computer-device-desktop-monitor.svg-cgtj7qaG.js → computer-device-desktop-monitor.svg-DM2JDGFk.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-CtASuIzj.js → computer-device-desktop.svg-_HJ4EQOc.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-Bgrj-X1s.js → computer-device-laptop.svg-CNAA6BlQ.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-BdGuG_w_.js → computer-device-mobile-phone-android-samsung-back.svg-CxLeIN1Q.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-BRGfdLz4.js → computer-device-mobile-phone-android-samsung.svg-DQz-ruKd.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-AqEKxnYo.js → computer-device-mobile-phone-iphone-x-back.svg-FxfpqJnY.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-DWFt-koa.js → computer-device-mobile-phone-iphone-x.svg-BUIqfPz2.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-DJ52OpYh.js → computer-device-mobile-tablet-touch.svg-DMCFrDQl.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-Ce_rWOZi.js → computer-device-mobile-tablet.svg-C531kbod.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-DB9SlCtA.js → computer-device-network-ethernet-cat6.svg-BC8dt5q3.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-lHja183-.js → computer-device-network-lan-www.svg-RGqNlI8D.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-B1zLcvJN.js → computer-device-network-wifi-connection.svg-D0gVZv1K.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-Drrwd9xP.js → computer-device-network-wifi-router.svg-CcsrAY7y.js} +1 -1
- package/web/assets/{cssMode-D9jO-uTl.js → cssMode-MVvkpnf5.js} +1 -1
- package/web/assets/{divider-B0vBDWbW.js → divider-DZT9zzOY.js} +2 -2
- package/web/assets/{docx-preview-BTpCoAAq.js → docx-preview-DgvvGq-u.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg--ysD_96O.js → ecology-science-erlenmeyer-flask.svg-q6TcEYhf.js} +1 -1
- package/web/assets/{fieldset-BFb-WHon.js → fieldset-UHviaYDo.js} +2 -2
- package/web/assets/{freemarker2-DnkPMk4B.js → freemarker2-BPSlW8HL.js} +1 -1
- package/web/assets/{handlebars-Dsj_qiK6.js → handlebars-Cx5Be6nL.js} +1 -1
- package/web/assets/{html-t_OlpWku.js → html-CskS1oGF.js} +1 -1
- package/web/assets/{htmlMode-DRcQv-pv.js → htmlMode-BWDnKwIH.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-6f9kbrTL.js → image-flash-lightning.svg-RpiSonqe.js} +1 -1
- package/web/assets/{image-picture-flower.svg-i7zms3Ho.js → image-picture-flower.svg-DKIZ6SGb.js} +1 -1
- package/web/assets/{index-GxI3bOA0.js → index-DX1jH50I.js} +290 -290
- package/web/assets/{interface-alert-exclamation-diamond.svg-DqUMmCtJ.js → interface-alert-exclamation-diamond.svg-DgMyEA2d.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-DzDl1xOr.js → interface-alert-exclamation-triangle-warning.svg-B70eBJ6w.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-DmCgkGPM.js → interface-alert-information-circle.svg-DpwiTVXc.js} +1 -1
- package/web/assets/{interface-award-crown.svg-C9Fbg_RB.js → interface-award-crown.svg-CwKQHYgB.js} +1 -1
- package/web/assets/{interface-bookmark.svg-MqIoLfKE.js → interface-bookmark-tag.svg-DEFAc2g5.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-3gViLsvg.js → interface-bookmark.svg-xHnQeM--.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-B9sbfbL9.js → interface-calendar-date-one.svg-DoFsHoOe.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-1vSNOl7u.js → interface-content-book-open-pages.svg-DuqFzI9p.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-DIEM6xdS.js → interface-content-book-page.svg-BRt9mm-8.js} +1 -1
- package/web/assets/{interface-content-file.svg-7VSdTCse.js → interface-content-file.svg-CdO69f4x.js} +1 -1
- package/web/assets/interface-content-folder.svg-CW9Pj4JQ.js +1 -0
- package/web/assets/{interface-content-folder.svg-9g1Oeyk0.js → interface-content-folder.svg-Copg1_JR.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-aMsLLdqD.js → interface-copy-clipboard.svg-D-WYyVHg.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-CVDpgAHo.js → interface-edit-attachment.svg-BJUsLCwo.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-DCXRjTEQ.js → interface-edit-binocular.svg-C8h8Hu5o.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-CDrPrWdl.js → interface-edit-magic-wand.svg-DWuA6W2Z.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-UvpUIvX7.js → interface-edit-tool-paint-roller.svg-BHx0xgbh.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-vPXMlfGL.js → interface-edit-tool-pencil.svg-DpG53MDR.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-CZOrIvmM.js → interface-favorite-award.svg-C6t0QMZ8.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-CP5RiVtW.js → interface-favorite-flag.svg-B0XbgMDW.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-B9yhOFXg.js → interface-favorite-heart.svg-BnZo2rnr.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-B5Iv-JuP.js → interface-favorite-star.svg-qpDT8XOd.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-Cipb48vc.js → interface-favorite-stars-sparkles.svg-DL2zl0KO.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-BCEm8EoC.js → interface-hierarchy-flowchart.svg-BtysN-ry.js} +1 -1
- package/web/assets/{interface-home-house.svg-Bh5-1B_X.js → interface-home-house.svg-CFqywwcS.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-DmOAt5ZG.js → interface-hyperlink.svg-BRUR4nsw.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-DhHJhRaa.js → interface-lighting-brightness.svg-DoyK3Kxo.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-CDyidwZF.js → interface-lock-closed.svg-BqJ7SVg6.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-Y-4_5Lj-.js → interface-lock-open-unlock.svg-BsV2IUxU.js} +1 -1
- package/web/assets/{interface-login-key.svg-C8M65861.js → interface-login-key.svg-CgUuV9La.js} +1 -1
- package/web/assets/{interface-search.svg-gkEckiep.js → interface-search.svg-BHiLMUkG.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-B42Ru0QR.js → interface-setting-cog.svg-hpwOab0L.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-BXgemPpH.js → interface-share-megaphone-bullhorn.svg-BM2RbPhT.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-BpCNXSJv.js → interface-share-rocket.svg-CRx8-Zzl.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-UqTKwPgB.js → interface-share-satellite.svg-D5VFEr1s.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-LjpxJCju.js → interface-share-space-ship.svg-CyOoRNOL.js} +1 -1
- package/web/assets/{interface-share.svg-aTfbQymz.js → interface-share.svg-eU7ZehX3.js} +1 -1
- package/web/assets/{interface-signal-square.svg-BV84IA7I.js → interface-signal-square.svg-CnuACoWB.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-B9p8ScHG.js → interface-time-clock-circle.svg-DqIBjN5L.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-4jjplFkz.js → interface-time-hour-glass.svg-C6rqAYQT.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-D4nN3V4C.js → interface-users-multiple.svg-wMzqZI1f.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-DyfDXGyQ.js → interface-weather-moon.svg-AwbuLpGL.js} +1 -1
- package/web/assets/{javascript-DxiQ5ZFe.js → javascript-D-r1O4Ca.js} +1 -1
- package/web/assets/{jsonMode-R5AgiRt8.js → jsonMode-BCt09OqP.js} +2 -2
- package/web/assets/{liquid-BPHysTNM.js → liquid-CMI_xdlK.js} +1 -1
- package/web/assets/{lspLanguageFeatures-DVsCw49O.js → lspLanguageFeatures-BkC_Rb-G.js} +3 -3
- package/web/assets/{mail-chat-bubble-square.svg-Bgj_m98i.js → mail-chat-bubble-square.svg-CHs5qc9C.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-Cmgs5A9c.js → mail-send-email-paper-airplane.svg-BII7dY15.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-DXtZA2de.js → mail-send-envelope.svg-4b4uqPPL.js} +1 -1
- package/web/assets/{mdx-BmXvPH9O.js → mdx-DdmbVSD2.js} +1 -1
- package/web/assets/{message-DUmeTDJC.js → message-D_nRgC6r.js} +2 -2
- package/web/assets/{minus-_526hTAz.js → minus-CTAaB8OA.js} +2 -2
- package/web/assets/modal-EqUnnO-G.js +1 -0
- package/web/assets/modal-ZE6BMfX7.js +5 -0
- package/web/assets/{money-cashier-receipt.svg-BKLBvJ6k.js → money-cashier-receipt.svg-BtWsmEgv.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-Dy__wPDu.js → money-currency-dollar-pay.svg-CnldGQpb.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-CY6efGa2.js → money-graph-arrow-increase.svg-UqbJd1iC.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-DeWwVE-h.js → money-graph-bar-chart-increase.svg-Dr-Hnacd.js} +1 -1
- package/web/assets/multiselect-D-y0p69n.js +251 -0
- package/web/assets/{nature-ecology-leaf.svg-CiA8xWzT.js → nature-ecology-leaf.svg-CWHl91dv.js} +1 -1
- package/web/assets/{password-BjWenHiO.js → password-D3Lj4hJq.js} +4 -4
- package/web/assets/{phone-telephone.svg-DFkp7qtJ.js → phone-telephone.svg-BcSZwkiO.js} +1 -1
- package/web/assets/{plus-CM2XaJYz.js → plus-DF0rYy2n.js} +6 -6
- package/web/assets/process.store-Cbc9hjTa.js +1 -0
- package/web/assets/{programming-bug.svg-iTd4z5Bn.js → programming-bug.svg-BKyii_g1.js} +1 -1
- package/web/assets/{programming-cloud.svg-BhZ7wR70.js → programming-cloud.svg-C13r66j3.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-CNFgEADa.js → programming-computer-database-server.svg-DxkFPCUU.js} +1 -1
- package/web/assets/{programming-computer-database.svg-BLUoB0S3.js → programming-computer-database.svg-CNV4OudR.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg---ShQt1c.js → programming-module-four-layout.svg-TzT7xA3i.js} +1 -1
- package/web/assets/{programming-module-three.svg-Q915QePI.js → programming-module-three.svg-uMHBGJh_.js} +1 -1
- package/web/assets/{programming-module.svg-DGlB0gXU.js → programming-module.svg-qnEyl-d7.js} +1 -1
- package/web/assets/{programming-script-code.svg-BXqoqM0a.js → programming-script-code.svg-BM6_G6ro.js} +1 -1
- package/web/assets/{python-Bkcdd-GB.js → python-CSgwcPdn.js} +1 -1
- package/web/assets/{razor-Dgss4zhv.js → razor-DC1VcHXf.js} +1 -1
- package/web/assets/router-BPnYbA5v.js +1 -0
- package/web/assets/settings-scope-C7xlTANR.js +1 -0
- package/web/assets/settings.store-VDOH02rk.js +1 -0
- package/web/assets/{shopping-cart.svg-DFzDn0s3.js → shopping-cart.svg-CFRl5nlm.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-CzoIs_fz.js → shopping-gift-present.svg-BDdt0EZp.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-K83gZueW.js → shopping-shipping-box-parcel-package.svg-DekC0cB7.js} +1 -1
- package/web/assets/{src-CrlKkUl0.js → src-B3JQXGmg.js} +25 -25
- package/web/assets/{src-Bhd-KJy_.css → src-BsM0Obsp.css} +1 -1
- package/web/assets/src-DKOgbSli.js +1 -0
- package/web/assets/{tabpanel-B8p6e6cv.js → tabpanel-Dj14CGND.js} +3 -3
- package/web/assets/{tag-new-circle.svg-BgOrOZ_K.js → tag-new-circle.svg-CHerl-X9.js} +1 -1
- package/web/assets/{toggleswitch-BKr-TR6_.js → toggleswitch-CCJjH6WC.js} +2 -2
- package/web/assets/{travel-map-earth-globe.svg-DZQQPdM1.js → travel-map-earth-globe.svg-D4kGqX4m.js} +1 -1
- package/web/assets/trpc-C0oE3hJ9.js +1 -0
- package/web/assets/{tsMode-BO9AVz77.js → tsMode-QNvVcAcI.js} +5 -5
- package/web/assets/{typescript-BVxNZ4YH.js → typescript-DhLuh0I9.js} +1 -1
- package/web/assets/useAiChatDrawer-znpcgJxf.js +1 -0
- package/web/assets/useCloudOrg-DLfMtBxV.js +572 -0
- package/web/assets/useCloudOrg-Drl2_37-.css +1 -0
- package/web/assets/{useProjectCatalog-Cw3YywvF.js → useProjectCatalog-BSoIDYMZ.js} +1 -1
- package/web/assets/{xml-Bv9vIo84.js → xml-DAlZ_1sH.js} +1 -1
- package/web/assets/{yaml-Brrhr_WI.js → yaml-GQlxRyRr.js} +1 -1
- package/web/index.html +1 -1
- package/agent-manager-DM6C7BTF.js +0 -7
- package/chunk-E2SU5RSO.js.map +0 -1
- package/src-MEMRUBM6.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-CbsV-wvF.js +0 -13
- package/web/assets/AgentTerminalPage-CFX_cNje.js +0 -1
- package/web/assets/AiChatPage-aNp-79bj.js +0 -1
- package/web/assets/AppLayout-C8SJH7E2.js +0 -1
- package/web/assets/AuditPage-mPkN9IPs.js +0 -1
- package/web/assets/CloudAccountPage--8gMHEov.js +0 -1
- package/web/assets/CloudAccountPage-DwfKS8Ui.js +0 -1
- package/web/assets/CloudMessagingPage-BZda9W4V.js +0 -2
- package/web/assets/DashboardPage-BYoHvCSW.js +0 -1
- package/web/assets/DirectoryPickerDialog-GjBksDRF.js +0 -1
- package/web/assets/EnvironmentFormPage-pWcZotB8.js +0 -1
- package/web/assets/EnvironmentListPage-D1u5GOUq.js +0 -1
- package/web/assets/KanbanBoardPage-B61sIHjE.js +0 -4
- package/web/assets/KanbanBoardPage-CCl8dmwn.css +0 -1
- package/web/assets/KanbanListPage-Dsg1wA9V.js +0 -1
- package/web/assets/LaunchProjectPage-BzLfT9xo.js +0 -1
- package/web/assets/LaunchServicesPage-DxRtzyc-.js +0 -1
- package/web/assets/LogViewer-DCTx3ncv.js +0 -3
- package/web/assets/OrgKeyPrompt-DGVXqIwV.js +0 -1
- package/web/assets/ProcessControls-CKHLGdip.js +0 -1
- package/web/assets/ProcessDetailPage-BTcbsw0H.js +0 -1
- package/web/assets/ProjectDetailPage-Do50Toy3.js +0 -1
- package/web/assets/ProjectListPage-FhR5Gkub.js +0 -1
- package/web/assets/RandomJobTestPage-CT1XUQ7l.js +0 -2
- package/web/assets/ScenarioEditorPage-CAZ18fLj.js +0 -14
- package/web/assets/SendToChatDialog-3VcAeiLB.js +0 -1
- package/web/assets/ServiceControlsBar-DMibK9Gk.js +0 -1
- package/web/assets/ServiceDetailPage-DzTdnnmK.js +0 -2
- package/web/assets/ServiceFormPage-C3Av0wu_.js +0 -1
- package/web/assets/SettingsPage-Cb4cXWBn.js +0 -2063
- package/web/assets/UnlockPage-Cj9f3u9P.js +0 -1
- package/web/assets/VariablesTable-_m1LCIc1.js +0 -1
- package/web/assets/VaultMigrationPage-4-aYgpPb.js +0 -1
- package/web/assets/VersionBadge-D-5Wk-zP.js +0 -1
- package/web/assets/WikiPage-Dr0BjWqx.js +0 -1
- package/web/assets/WikiView-Zx8Prvim.js +0 -1
- package/web/assets/add-scalar-classes-Bj8wq_Hs.js +0 -387
- package/web/assets/auth-errors-C98TqTeb.js +0 -1
- package/web/assets/card-DtzNVDSZ.js +0 -32
- package/web/assets/client-BDHmFNrH.js +0 -24
- package/web/assets/cloud-chat.store-B20ZLeeR.js +0 -1
- package/web/assets/cloud-session-BjfhcCqc.js +0 -1
- package/web/assets/column-DXHLG_CF.js +0 -907
- package/web/assets/interface-content-folder.svg-CAHYAOYi.js +0 -1
- package/web/assets/modal-DWnz3LAY.js +0 -5
- package/web/assets/modal-SaIxK3oE.js +0 -1
- package/web/assets/multiselect-sCEC4UBn.js +0 -251
- package/web/assets/process.store-BdrVU3j7.js +0 -1
- package/web/assets/router-CkyZcpB5.js +0 -1
- package/web/assets/settings-scope-UnTi3EI6.js +0 -1
- package/web/assets/settings.store-Bd6azayI.js +0 -1
- package/web/assets/src-Bn8iaJpP.js +0 -1
- package/web/assets/trpc-CPHyoQZL.js +0 -1
- package/web/assets/useAiChatDrawer-tj6s1XKR.js +0 -1
- package/web/assets/useCloudOrg-CXnReqbv.js +0 -97
- package/web/assets/useCloudOrg-CYZgY69j.css +0 -1
- /package/{agent-manager-DM6C7BTF.js.map → agent-manager-KM7SFKVR.js.map} +0 -0
|
@@ -110,7 +110,7 @@ import {
|
|
|
110
110
|
wasRead,
|
|
111
111
|
withDeprecatedAliases,
|
|
112
112
|
writeEntity
|
|
113
|
-
} from "./chunk-
|
|
113
|
+
} from "./chunk-T3TDCZUY.js";
|
|
114
114
|
|
|
115
115
|
// ../server/src/create-server.ts
|
|
116
116
|
import express from "express";
|
|
@@ -2432,6 +2432,9 @@ var projectRouter = router({
|
|
|
2432
2432
|
import { z as z4 } from "zod";
|
|
2433
2433
|
import { TRPCError as TRPCError4 } from "@trpc/server";
|
|
2434
2434
|
|
|
2435
|
+
// ../server/src/services/log-parser-store.ts
|
|
2436
|
+
import { randomUUID as randomUUID3 } from "crypto";
|
|
2437
|
+
|
|
2435
2438
|
// ../server/src/services/settings-manager.ts
|
|
2436
2439
|
import { readFile as readFile7, writeFile as writeFile7, rename as rename7, mkdir as mkdir7, chmod as chmod6 } from "fs/promises";
|
|
2437
2440
|
import { join as join8 } from "path";
|
|
@@ -2569,6 +2572,170 @@ var SettingsManager = class {
|
|
|
2569
2572
|
};
|
|
2570
2573
|
var settingsManager = new SettingsManager();
|
|
2571
2574
|
|
|
2575
|
+
// ../server/src/services/log-parser-store.ts
|
|
2576
|
+
function isShareable(parser) {
|
|
2577
|
+
return parser.builtin !== true && !parser.id.startsWith("native:");
|
|
2578
|
+
}
|
|
2579
|
+
var LogParserStore = class {
|
|
2580
|
+
localListeners = /* @__PURE__ */ new Set();
|
|
2581
|
+
changeListeners = /* @__PURE__ */ new Set();
|
|
2582
|
+
/**
|
|
2583
|
+
* S'abonner aux écritures *locales* — celles nées ici.
|
|
2584
|
+
*
|
|
2585
|
+
* C'est ce qu'écoute la synchronisation : réagir aussi à ce qui arrive du
|
|
2586
|
+
* document la ferait repartir aussitôt vers ce document, en boucle.
|
|
2587
|
+
*/
|
|
2588
|
+
onLocalChange(fn) {
|
|
2589
|
+
this.localListeners.add(fn);
|
|
2590
|
+
return () => this.localListeners.delete(fn);
|
|
2591
|
+
}
|
|
2592
|
+
/**
|
|
2593
|
+
* S'abonner à toute écriture, d'où qu'elle vienne.
|
|
2594
|
+
*
|
|
2595
|
+
* C'est ce qu'écoute l'interface : un parseur écrit par un collègue arrive
|
|
2596
|
+
* par le document, donc silencieusement pour la synchronisation — mais un
|
|
2597
|
+
* écran qui ne l'apprend qu'au prochain montage montre une liste fausse
|
|
2598
|
+
* pendant tout ce temps, alors même que les services, eux, se rafraîchissent.
|
|
2599
|
+
*/
|
|
2600
|
+
onChanged(fn) {
|
|
2601
|
+
this.changeListeners.add(fn);
|
|
2602
|
+
return () => this.changeListeners.delete(fn);
|
|
2603
|
+
}
|
|
2604
|
+
notify(vault, local) {
|
|
2605
|
+
if (local) {
|
|
2606
|
+
for (const fn of this.localListeners) {
|
|
2607
|
+
try {
|
|
2608
|
+
fn();
|
|
2609
|
+
} catch (err) {
|
|
2610
|
+
console.error("[log-parser-store] listener failed:", err.message);
|
|
2611
|
+
}
|
|
2612
|
+
}
|
|
2613
|
+
}
|
|
2614
|
+
for (const fn of this.changeListeners) {
|
|
2615
|
+
try {
|
|
2616
|
+
fn(vault);
|
|
2617
|
+
} catch (err) {
|
|
2618
|
+
console.error("[log-parser-store] listener failed:", err.message);
|
|
2619
|
+
}
|
|
2620
|
+
}
|
|
2621
|
+
}
|
|
2622
|
+
/** Les parseurs d'un coffre — ceux de l'organisation, ou ceux du poste. */
|
|
2623
|
+
async list(vault) {
|
|
2624
|
+
const settings = await settingsManager.getSettings(vault);
|
|
2625
|
+
return settings.logParsers ?? [];
|
|
2626
|
+
}
|
|
2627
|
+
async get(id, vault) {
|
|
2628
|
+
return (await this.list(vault)).find((p) => p.id === id) ?? null;
|
|
2629
|
+
}
|
|
2630
|
+
async write(parsers, vault, silent = false) {
|
|
2631
|
+
const settings = await settingsManager.getSettings(vault);
|
|
2632
|
+
await settingsManager.saveSettings({ ...settings, logParsers: parsers }, vault);
|
|
2633
|
+
this.notify(vault, !silent);
|
|
2634
|
+
}
|
|
2635
|
+
async create(input, vault) {
|
|
2636
|
+
const now = /* @__PURE__ */ new Date();
|
|
2637
|
+
if (input.builtin) {
|
|
2638
|
+
throw new Error("A parser created here is never a built-in one");
|
|
2639
|
+
}
|
|
2640
|
+
const parser = JSLogParserSchema.parse({
|
|
2641
|
+
...input,
|
|
2642
|
+
id: randomUUID3(),
|
|
2643
|
+
createdAt: now,
|
|
2644
|
+
updatedAt: now
|
|
2645
|
+
});
|
|
2646
|
+
await this.write([...await this.list(vault), parser], vault);
|
|
2647
|
+
return parser;
|
|
2648
|
+
}
|
|
2649
|
+
async update(id, patch, vault) {
|
|
2650
|
+
const parsers = await this.list(vault);
|
|
2651
|
+
const index = parsers.findIndex((p) => p.id === id);
|
|
2652
|
+
if (index === -1) return null;
|
|
2653
|
+
const updated = JSLogParserSchema.parse({
|
|
2654
|
+
...parsers[index],
|
|
2655
|
+
...patch,
|
|
2656
|
+
id,
|
|
2657
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
2658
|
+
});
|
|
2659
|
+
const next = [...parsers];
|
|
2660
|
+
next[index] = updated;
|
|
2661
|
+
await this.write(next, vault);
|
|
2662
|
+
return updated;
|
|
2663
|
+
}
|
|
2664
|
+
async delete(id, vault) {
|
|
2665
|
+
const parsers = await this.list(vault);
|
|
2666
|
+
const next = parsers.filter((p) => p.id !== id);
|
|
2667
|
+
if (next.length === parsers.length) return false;
|
|
2668
|
+
await this.write(next, vault);
|
|
2669
|
+
return true;
|
|
2670
|
+
}
|
|
2671
|
+
// ---- Synchronisation --------------------------------------------------
|
|
2672
|
+
/**
|
|
2673
|
+
* Écrire ce que le document de l'organisation porte.
|
|
2674
|
+
*
|
|
2675
|
+
* Silencieux et gardé par une comparaison : réveiller les écoutants ici
|
|
2676
|
+
* relancerait la réconciliation qui vient de produire cette écriture, et un
|
|
2677
|
+
* document identique au disque ne mérite pas un fichier réécrit.
|
|
2678
|
+
*/
|
|
2679
|
+
async applyRemoteUpsert(id, fields, orgId) {
|
|
2680
|
+
const parsed = JSLogParserSchema.safeParse({ ...fields, id });
|
|
2681
|
+
if (!parsed.success) {
|
|
2682
|
+
console.warn("[log-parser-store] rejected a remote parser %s: %s", id, parsed.error.message);
|
|
2683
|
+
return;
|
|
2684
|
+
}
|
|
2685
|
+
if (!isShareable(parsed.data)) return;
|
|
2686
|
+
const parsers = await this.list(orgId);
|
|
2687
|
+
const index = parsers.findIndex((p) => p.id === id);
|
|
2688
|
+
if (index !== -1 && sameParser(parsers[index], parsed.data)) return;
|
|
2689
|
+
const next = [...parsers];
|
|
2690
|
+
if (index === -1) next.push(parsed.data);
|
|
2691
|
+
else next[index] = parsed.data;
|
|
2692
|
+
await this.write(next, orgId, true);
|
|
2693
|
+
}
|
|
2694
|
+
async applyRemoteDelete(id, orgId) {
|
|
2695
|
+
const parsers = await this.list(orgId);
|
|
2696
|
+
const next = parsers.filter((p) => p.id !== id);
|
|
2697
|
+
if (next.length === parsers.length) return;
|
|
2698
|
+
await this.write(next, orgId, true);
|
|
2699
|
+
}
|
|
2700
|
+
/**
|
|
2701
|
+
* Remonter les parseurs du poste dans les organisations de cette machine.
|
|
2702
|
+
*
|
|
2703
|
+
* Un déplacement, pas une copie : le même parseur des deux côtés ferait deux
|
|
2704
|
+
* vérités qui divergent au premier changement, et la liste du poste
|
|
2705
|
+
* ressusciterait à chaque connexion celui qu'un membre vient de supprimer
|
|
2706
|
+
* pour toute l'équipe. Une fois la machine vidée, il n'y a plus rien à
|
|
2707
|
+
* remonter — l'opération peut donc être rejouée sans dégât.
|
|
2708
|
+
*
|
|
2709
|
+
* Vers *toutes* les organisations liées, chacune recevant sa copie : les
|
|
2710
|
+
* coffres ne communiquent pas, et rien ne dit laquelle des deux était visée.
|
|
2711
|
+
*/
|
|
2712
|
+
async migrateMachineParsersInto(orgIds) {
|
|
2713
|
+
if (orgIds.length === 0) return;
|
|
2714
|
+
const all = await this.list();
|
|
2715
|
+
if (all.length === 0) return;
|
|
2716
|
+
const machineParsers = all.filter(isShareable);
|
|
2717
|
+
for (const orgId of orgIds) {
|
|
2718
|
+
const existing = await this.list(orgId);
|
|
2719
|
+
const known = new Set(existing.map((p) => p.id));
|
|
2720
|
+
const added = machineParsers.filter((p) => !known.has(p.id));
|
|
2721
|
+
if (added.length === 0) continue;
|
|
2722
|
+
await this.write([...existing, ...added], orgId, true);
|
|
2723
|
+
}
|
|
2724
|
+
await this.write(all.filter((p) => !isShareable(p)), void 0, true);
|
|
2725
|
+
if (machineParsers.length > 0) {
|
|
2726
|
+
console.log(
|
|
2727
|
+
"[log-parser-store] moved %d machine parser(s) into organization(s): %s",
|
|
2728
|
+
machineParsers.length,
|
|
2729
|
+
orgIds.join(", ")
|
|
2730
|
+
);
|
|
2731
|
+
}
|
|
2732
|
+
}
|
|
2733
|
+
};
|
|
2734
|
+
function sameParser(a, b) {
|
|
2735
|
+
return a.name === b.name && a.code === b.code && a.enabled === b.enabled && (a.description ?? "") === (b.description ?? "") && a.updatedAt.getTime() === b.updatedAt.getTime();
|
|
2736
|
+
}
|
|
2737
|
+
var logParserStore = new LogParserStore();
|
|
2738
|
+
|
|
2572
2739
|
// ../server/src/services/service-builtins.ts
|
|
2573
2740
|
function buildServerBuiltins(input) {
|
|
2574
2741
|
const { service, siblings, projectName, environmentName, agentName, host } = input;
|
|
@@ -2609,7 +2776,7 @@ import { isAbsolute as isAbsolute3 } from "path";
|
|
|
2609
2776
|
import { isAbsolute as isAbsolute2, join as join10, dirname as dirname5 } from "path";
|
|
2610
2777
|
|
|
2611
2778
|
// ../server/src/services/conversation-store.ts
|
|
2612
|
-
import { randomUUID as
|
|
2779
|
+
import { randomUUID as randomUUID4 } from "crypto";
|
|
2613
2780
|
import { readFile as readFile8, writeFile as writeFile8, rename as rename8, mkdir as mkdir8, chmod as chmod7 } from "fs/promises";
|
|
2614
2781
|
import { dirname as dirname4, join as join9 } from "path";
|
|
2615
2782
|
import { EventEmitter as EventEmitter2 } from "events";
|
|
@@ -2942,7 +3109,7 @@ ${new Error("trace").stack}`
|
|
|
2942
3109
|
await this.load();
|
|
2943
3110
|
const now = Date.now();
|
|
2944
3111
|
const conv = {
|
|
2945
|
-
id:
|
|
3112
|
+
id: randomUUID4(),
|
|
2946
3113
|
projectId,
|
|
2947
3114
|
title: title ?? "New conversation",
|
|
2948
3115
|
messages: [],
|
|
@@ -3104,8 +3271,9 @@ async function resolveServiceVariables(service) {
|
|
|
3104
3271
|
}
|
|
3105
3272
|
try {
|
|
3106
3273
|
if (service.parserIds && service.parserIds.length > 0) {
|
|
3107
|
-
const
|
|
3108
|
-
const
|
|
3274
|
+
const vault = project?.orgId ?? void 0;
|
|
3275
|
+
const parsers = await logParserStore.list(vault);
|
|
3276
|
+
const allParsers = [...nativeParsers, ...parsers];
|
|
3109
3277
|
const resolvedParsers = service.parserIds.map((id) => allParsers.find((p) => p.id === id)).filter((p) => p !== void 0);
|
|
3110
3278
|
resolvedService = { ...resolvedService, resolvedLogParsers: resolvedParsers };
|
|
3111
3279
|
}
|
|
@@ -4556,6 +4724,12 @@ async function setLanMode(enabled) {
|
|
|
4556
4724
|
|
|
4557
4725
|
// ../server/src/trpc/routers/settings.ts
|
|
4558
4726
|
var NotificationPreferencesPatchSchema = NotificationPreferencesSchema.partial().strict();
|
|
4727
|
+
function listWithOrigin(parsers, vault) {
|
|
4728
|
+
return [
|
|
4729
|
+
...nativeParsers.map((p) => ({ ...p, origin: "native" })),
|
|
4730
|
+
...parsers.map((p) => ({ ...p, origin: vault ? "org" : "machine" }))
|
|
4731
|
+
];
|
|
4732
|
+
}
|
|
4559
4733
|
function maskApiKey2(plaintext) {
|
|
4560
4734
|
if (plaintext.length <= 8) return "****";
|
|
4561
4735
|
return plaintext.slice(0, 4) + "****" + plaintext.slice(-4);
|
|
@@ -4648,17 +4822,63 @@ var settingsRouter = router({
|
|
|
4648
4822
|
}),
|
|
4649
4823
|
/**
|
|
4650
4824
|
* List all parsers
|
|
4825
|
+
*
|
|
4826
|
+
* Les natifs, puis ceux du coffre visé. L'origine accompagne chacun : un
|
|
4827
|
+
* parseur d'organisation se modifie pour toute l'équipe, et l'interface doit
|
|
4828
|
+
* pouvoir le dire avant que quelqu'un le change sans le savoir.
|
|
4651
4829
|
*/
|
|
4652
|
-
listParsers: protectedProcedure.query(async () => {
|
|
4653
|
-
const
|
|
4654
|
-
return
|
|
4830
|
+
listParsers: protectedProcedure.input(z11.object(ScopeShape).optional()).query(async ({ input }) => {
|
|
4831
|
+
const vault = await scopeOf(input);
|
|
4832
|
+
return listWithOrigin(await logParserStore.list(vault), vault);
|
|
4833
|
+
}),
|
|
4834
|
+
/**
|
|
4835
|
+
* Les parseurs du coffre visé, à chaque fois qu'ils changent.
|
|
4836
|
+
*
|
|
4837
|
+
* Les services arrivent en temps réel, et un parseur écrit par un collègue
|
|
4838
|
+
* atteint le disque tout aussi vite ; sans ce flux, seul l'écran resterait en
|
|
4839
|
+
* retard — affichant une liste dans laquelle le parseur qu'un service vient
|
|
4840
|
+
* de référencer n'existe pas encore.
|
|
4841
|
+
*/
|
|
4842
|
+
onParsersChanged: protectedProcedure.input(z11.object(ScopeShape).optional()).subscription(async function* ({ input, signal }) {
|
|
4843
|
+
const vault = await scopeOf(input);
|
|
4844
|
+
let pending = true;
|
|
4845
|
+
let wake = null;
|
|
4846
|
+
const off = logParserStore.onChanged((touched) => {
|
|
4847
|
+
if (touched !== vault) return;
|
|
4848
|
+
pending = true;
|
|
4849
|
+
if (wake) {
|
|
4850
|
+
wake();
|
|
4851
|
+
wake = null;
|
|
4852
|
+
}
|
|
4853
|
+
});
|
|
4854
|
+
const onAbort = () => {
|
|
4855
|
+
if (wake) {
|
|
4856
|
+
wake();
|
|
4857
|
+
wake = null;
|
|
4858
|
+
}
|
|
4859
|
+
};
|
|
4860
|
+
signal?.addEventListener("abort", onAbort);
|
|
4861
|
+
try {
|
|
4862
|
+
while (!signal?.aborted) {
|
|
4863
|
+
if (pending) {
|
|
4864
|
+
pending = false;
|
|
4865
|
+
yield listWithOrigin(await logParserStore.list(vault), vault);
|
|
4866
|
+
} else {
|
|
4867
|
+
await new Promise((resolve7) => {
|
|
4868
|
+
wake = resolve7;
|
|
4869
|
+
});
|
|
4870
|
+
}
|
|
4871
|
+
}
|
|
4872
|
+
} finally {
|
|
4873
|
+
off();
|
|
4874
|
+
signal?.removeEventListener("abort", onAbort);
|
|
4875
|
+
}
|
|
4655
4876
|
}),
|
|
4656
4877
|
/**
|
|
4657
4878
|
* Get single parser by ID
|
|
4658
4879
|
*/
|
|
4659
|
-
getParser: protectedProcedure.input(z11.object({ id: z11.string().max(128) })).query(async ({ input }) => {
|
|
4660
|
-
const
|
|
4661
|
-
const parser = (settings.logParsers || []).find((p) => p.id === input.id);
|
|
4880
|
+
getParser: protectedProcedure.input(z11.object({ id: z11.string().max(128), ...ScopeShape })).query(async ({ input }) => {
|
|
4881
|
+
const parser = await logParserStore.get(input.id, await scopeOf(input));
|
|
4662
4882
|
if (!parser) {
|
|
4663
4883
|
throw new TRPCError8({ code: "NOT_FOUND", message: `Parser not found: ${input.id}` });
|
|
4664
4884
|
}
|
|
@@ -4672,25 +4892,13 @@ var settingsRouter = router({
|
|
|
4672
4892
|
id: true,
|
|
4673
4893
|
createdAt: true,
|
|
4674
4894
|
updatedAt: true
|
|
4675
|
-
})
|
|
4895
|
+
}).extend(ScopeShape)
|
|
4676
4896
|
).mutation(async ({ input }) => {
|
|
4677
|
-
|
|
4897
|
+
const { orgId, projectId, ...fields } = input;
|
|
4898
|
+
if (!fields.code.trim()) {
|
|
4678
4899
|
throw new TRPCError8({ code: "BAD_REQUEST", message: "Parser code cannot be empty" });
|
|
4679
4900
|
}
|
|
4680
|
-
|
|
4681
|
-
const now = /* @__PURE__ */ new Date();
|
|
4682
|
-
const parser = {
|
|
4683
|
-
id,
|
|
4684
|
-
...input,
|
|
4685
|
-
createdAt: now,
|
|
4686
|
-
updatedAt: now
|
|
4687
|
-
};
|
|
4688
|
-
const settings = await settingsManager.getSettings();
|
|
4689
|
-
await settingsManager.saveSettings({
|
|
4690
|
-
...settings,
|
|
4691
|
-
logParsers: [...settings.logParsers || [], parser]
|
|
4692
|
-
});
|
|
4693
|
-
return parser;
|
|
4901
|
+
return logParserStore.create(fields, await scopeOf({ orgId, projectId }));
|
|
4694
4902
|
}),
|
|
4695
4903
|
/**
|
|
4696
4904
|
* Update existing parser
|
|
@@ -4699,53 +4907,32 @@ var settingsRouter = router({
|
|
|
4699
4907
|
JSLogParserSchema.omit({
|
|
4700
4908
|
createdAt: true,
|
|
4701
4909
|
updatedAt: true
|
|
4702
|
-
}).partial().required({ id: true })
|
|
4910
|
+
}).partial().required({ id: true }).extend(ScopeShape)
|
|
4703
4911
|
).mutation(async ({ input }) => {
|
|
4704
|
-
const
|
|
4705
|
-
|
|
4706
|
-
(p) => p.id === input.id
|
|
4707
|
-
);
|
|
4708
|
-
if (parserIndex === -1) {
|
|
4709
|
-
throw new TRPCError8({ code: "NOT_FOUND", message: `Parser not found: ${input.id}` });
|
|
4710
|
-
}
|
|
4711
|
-
if (input.id.startsWith("native:")) {
|
|
4912
|
+
const { id, orgId, projectId, ...patch } = input;
|
|
4913
|
+
if (id.startsWith("native:")) {
|
|
4712
4914
|
throw new TRPCError8({ code: "FORBIDDEN", message: "Cannot modify built-in parsers" });
|
|
4713
4915
|
}
|
|
4714
|
-
|
|
4715
|
-
if (input.code && !input.code.trim()) {
|
|
4916
|
+
if (patch.code !== void 0 && !patch.code.trim()) {
|
|
4716
4917
|
throw new TRPCError8({ code: "BAD_REQUEST", message: "Parser code cannot be empty" });
|
|
4717
4918
|
}
|
|
4718
|
-
const updated = {
|
|
4719
|
-
|
|
4720
|
-
|
|
4721
|
-
|
|
4722
|
-
};
|
|
4723
|
-
const newParsers = [...settings.logParsers || []];
|
|
4724
|
-
newParsers[parserIndex] = updated;
|
|
4725
|
-
await settingsManager.saveSettings({
|
|
4726
|
-
...settings,
|
|
4727
|
-
logParsers: newParsers
|
|
4728
|
-
});
|
|
4919
|
+
const updated = await logParserStore.update(id, patch, await scopeOf({ orgId, projectId }));
|
|
4920
|
+
if (!updated) {
|
|
4921
|
+
throw new TRPCError8({ code: "NOT_FOUND", message: `Parser not found: ${id}` });
|
|
4922
|
+
}
|
|
4729
4923
|
return updated;
|
|
4730
4924
|
}),
|
|
4731
4925
|
/**
|
|
4732
4926
|
* Delete parser by ID
|
|
4733
4927
|
*/
|
|
4734
|
-
deleteParser: protectedProcedure.input(z11.object({ id: z11.string().max(128) })).mutation(async ({ input }) => {
|
|
4735
|
-
const settings = await settingsManager.getSettings();
|
|
4736
|
-
const newParsers = (settings.logParsers || []).filter(
|
|
4737
|
-
(p) => p.id !== input.id
|
|
4738
|
-
);
|
|
4928
|
+
deleteParser: protectedProcedure.input(z11.object({ id: z11.string().max(128), ...ScopeShape })).mutation(async ({ input }) => {
|
|
4739
4929
|
if (input.id.startsWith("native:")) {
|
|
4740
4930
|
throw new TRPCError8({ code: "FORBIDDEN", message: "Cannot delete built-in parsers" });
|
|
4741
4931
|
}
|
|
4742
|
-
|
|
4932
|
+
const deleted = await logParserStore.delete(input.id, await scopeOf(input));
|
|
4933
|
+
if (!deleted) {
|
|
4743
4934
|
throw new TRPCError8({ code: "NOT_FOUND", message: `Parser not found: ${input.id}` });
|
|
4744
4935
|
}
|
|
4745
|
-
await settingsManager.saveSettings({
|
|
4746
|
-
...settings,
|
|
4747
|
-
logParsers: newParsers
|
|
4748
|
-
});
|
|
4749
4936
|
return { deleted: true };
|
|
4750
4937
|
}),
|
|
4751
4938
|
// ---------------------------------------------------------------------------
|
|
@@ -5447,6 +5634,24 @@ import { promisify as promisify3 } from "util";
|
|
|
5447
5634
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
5448
5635
|
|
|
5449
5636
|
// ../../packages/ai-capabilities/src/capabilities.ts
|
|
5637
|
+
function toList(raw) {
|
|
5638
|
+
if (!raw) return [];
|
|
5639
|
+
const text = raw.trim();
|
|
5640
|
+
if (text.startsWith("[")) {
|
|
5641
|
+
try {
|
|
5642
|
+
const parsed = JSON.parse(text);
|
|
5643
|
+
if (Array.isArray(parsed)) return parsed.map((v) => String(v).trim()).filter(Boolean);
|
|
5644
|
+
} catch {
|
|
5645
|
+
}
|
|
5646
|
+
}
|
|
5647
|
+
return text.split(",").map((v) => v.trim().replace(/^["'[]+|["'\]]+$/g, "")).filter(Boolean);
|
|
5648
|
+
}
|
|
5649
|
+
function clearable(raw, parse2, key) {
|
|
5650
|
+
if (raw === void 0) return {};
|
|
5651
|
+
const text = String(raw).trim();
|
|
5652
|
+
if (!text || text === "null") return { [key]: null };
|
|
5653
|
+
return { [key]: parse2(text) };
|
|
5654
|
+
}
|
|
5450
5655
|
var RUNEYA_CAPABILITIES = [
|
|
5451
5656
|
{
|
|
5452
5657
|
name: "list_services",
|
|
@@ -5570,11 +5775,11 @@ var RUNEYA_CAPABILITIES = [
|
|
|
5570
5775
|
},
|
|
5571
5776
|
{
|
|
5572
5777
|
name: "kanban_search_cards",
|
|
5573
|
-
description: "Search kanban cards by free text, matched against their title and
|
|
5778
|
+
description: "Search kanban cards by free text, matched against their title, body and comments (accent- and case-insensitive). Archived cards are included. Searches every board of the organization unless boardId narrows it down.",
|
|
5574
5779
|
route: "kanban.searchCards",
|
|
5575
5780
|
method: "GET",
|
|
5576
5781
|
params: [
|
|
5577
|
-
{ name: "query", description: "Text to look for in card titles and
|
|
5782
|
+
{ name: "query", description: "Text to look for in card titles, bodies and comments", required: true },
|
|
5578
5783
|
{ name: "boardId", description: "Restrict the search to this board. Omit to search all boards.", required: false },
|
|
5579
5784
|
{ name: "limit", description: "Maximum number of cards to return (1-100). Default: 25.", required: false },
|
|
5580
5785
|
{ name: "organizationId", description: "Which organization to search. Optional: needed only when the account belongs to several and the error message asks for it.", required: false }
|
|
@@ -5660,6 +5865,71 @@ var RUNEYA_CAPABILITIES = [
|
|
|
5660
5865
|
{ name: "content", description: "Card content in markdown", required: false }
|
|
5661
5866
|
],
|
|
5662
5867
|
buildInput: (p) => ({ boardId: p.boardId, column: p.column, title: p.title, content: p.content })
|
|
5868
|
+
},
|
|
5869
|
+
{
|
|
5870
|
+
name: "kanban_get_card",
|
|
5871
|
+
description: "Read one kanban card by id, including archived ones. Cheaper than fetching the whole board, and the only way to read a card that has been archived.",
|
|
5872
|
+
route: "kanban.getCard",
|
|
5873
|
+
method: "GET",
|
|
5874
|
+
params: [
|
|
5875
|
+
{ name: "boardId", description: "The kanban board ID", required: true },
|
|
5876
|
+
{ name: "cardId", description: "The card ID", required: true }
|
|
5877
|
+
],
|
|
5878
|
+
buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId })
|
|
5879
|
+
},
|
|
5880
|
+
{
|
|
5881
|
+
name: "kanban_update_card",
|
|
5882
|
+
description: "Update an existing kanban card. Only the fields you pass are changed; passing null to priority, color or deadline clears it. Prefer this over creating a second card when something needs correcting.",
|
|
5883
|
+
route: "kanban.updateCard",
|
|
5884
|
+
method: "POST",
|
|
5885
|
+
params: [
|
|
5886
|
+
{ name: "boardId", description: "The kanban board ID", required: true },
|
|
5887
|
+
{ name: "cardId", description: "The card ID", required: true },
|
|
5888
|
+
{ name: "title", description: "New title", required: false },
|
|
5889
|
+
{ name: "content", description: "New card content, in markdown", required: false },
|
|
5890
|
+
{ name: "priority", description: "Priority from 1 to 10, or null to clear it", required: false },
|
|
5891
|
+
{ name: "color", description: "Card colour, or null to clear it", required: false },
|
|
5892
|
+
{ name: "groups", description: "Labels, as a list of strings. Replaces the current ones.", required: false },
|
|
5893
|
+
{ name: "deadline", description: "Due date as YYYY-MM-DD, or null to clear it", required: false },
|
|
5894
|
+
{ name: "assignees", description: "User ids to assign, as a list. Replaces the current ones; use kanban_list_members to find the ids.", required: false }
|
|
5895
|
+
],
|
|
5896
|
+
buildInput: (p) => ({
|
|
5897
|
+
boardId: p.boardId,
|
|
5898
|
+
cardId: p.cardId,
|
|
5899
|
+
...p.title !== void 0 ? { title: p.title } : {},
|
|
5900
|
+
...p.content !== void 0 ? { content: p.content } : {},
|
|
5901
|
+
// Tout arrive en chaîne : un modèle n'écrit pas des nombres, des listes
|
|
5902
|
+
// ni des `null` typés. `clearable` distingue « efface » de « ne touche
|
|
5903
|
+
// pas » — sans quoi vider une couleur serait impossible à exprimer, et
|
|
5904
|
+
// changer un titre risquerait de vider le reste.
|
|
5905
|
+
...clearable(p.priority, (v) => Number(v), "priority"),
|
|
5906
|
+
...clearable(p.color, (v) => v, "color"),
|
|
5907
|
+
...clearable(p.deadline, (v) => v, "deadline"),
|
|
5908
|
+
...p.groups !== void 0 ? { groups: toList(p.groups) } : {},
|
|
5909
|
+
...p.assignees !== void 0 ? { assignees: toList(p.assignees) } : {}
|
|
5910
|
+
})
|
|
5911
|
+
},
|
|
5912
|
+
{
|
|
5913
|
+
name: "kanban_set_card_archived",
|
|
5914
|
+
description: "Archive a kanban card (it leaves the board but is not deleted) or bring it back. An unarchived card returns to the column it left.",
|
|
5915
|
+
route: "kanban.setCardArchived",
|
|
5916
|
+
method: "POST",
|
|
5917
|
+
params: [
|
|
5918
|
+
{ name: "boardId", description: "The kanban board ID", required: true },
|
|
5919
|
+
{ name: "cardId", description: "The card ID", required: true },
|
|
5920
|
+
{ name: "archived", description: "true to archive, false to bring the card back", required: true }
|
|
5921
|
+
],
|
|
5922
|
+
buildInput: (p) => ({ boardId: p.boardId, cardId: p.cardId, archived: p.archived === "true" })
|
|
5923
|
+
},
|
|
5924
|
+
{
|
|
5925
|
+
name: "kanban_list_members",
|
|
5926
|
+
description: "List the people of the organization who can be assigned to a card, with their ids. Needed before assigning anyone with kanban_update_card.",
|
|
5927
|
+
route: "kanban.listMembers",
|
|
5928
|
+
method: "GET",
|
|
5929
|
+
params: [
|
|
5930
|
+
{ name: "organizationId", description: "Which organization. Optional: needed only when the account belongs to several and the error message asks for it.", required: false }
|
|
5931
|
+
],
|
|
5932
|
+
buildInput: (p) => p.organizationId ? { organizationId: p.organizationId } : {}
|
|
5663
5933
|
}
|
|
5664
5934
|
];
|
|
5665
5935
|
|
|
@@ -7223,7 +7493,7 @@ async function fetchProviderModels(provider, plaintextKey) {
|
|
|
7223
7493
|
}
|
|
7224
7494
|
|
|
7225
7495
|
// ../server/src/services/image-storage.service.ts
|
|
7226
|
-
import { randomUUID as
|
|
7496
|
+
import { randomUUID as randomUUID5 } from "crypto";
|
|
7227
7497
|
import { mkdir as mkdir15, writeFile as writeFile14, readFile as readFile15, unlink as unlink3, readdir as readdir4 } from "fs/promises";
|
|
7228
7498
|
import { existsSync as existsSync2 } from "fs";
|
|
7229
7499
|
import { join as join18, extname, resolve as resolve4, sep as sep2 } from "path";
|
|
@@ -7260,7 +7530,7 @@ var ImageStorageService = class {
|
|
|
7260
7530
|
throw new Error(`Unsupported extension: ${ext}`);
|
|
7261
7531
|
}
|
|
7262
7532
|
await this.ensureTmpDir();
|
|
7263
|
-
const imageId =
|
|
7533
|
+
const imageId = randomUUID5();
|
|
7264
7534
|
const safeExt = ext.replace(/[^a-z.]/g, "");
|
|
7265
7535
|
const fileName = `${imageId}${safeExt}`;
|
|
7266
7536
|
const filePath = join18(this.dir, fileName);
|
|
@@ -7407,9 +7677,6 @@ async function resolveImagesToBase64(images, contextId) {
|
|
|
7407
7677
|
return results.filter((r) => r !== null);
|
|
7408
7678
|
}
|
|
7409
7679
|
|
|
7410
|
-
// ../server/src/services/kanban-commands.ts
|
|
7411
|
-
import { randomUUID as randomUUID5 } from "crypto";
|
|
7412
|
-
|
|
7413
7680
|
// ../server/src/trpc/routers/cloud-auth.ts
|
|
7414
7681
|
import { z as z16 } from "zod";
|
|
7415
7682
|
import { hostname } from "os";
|
|
@@ -7671,6 +7938,76 @@ var KanbanStore = class {
|
|
|
7671
7938
|
});
|
|
7672
7939
|
return { card: res.data?.card ?? null, unsupported: res.status === 404 };
|
|
7673
7940
|
}
|
|
7941
|
+
/** Une carte, par son identifiant — archivée comprise. */
|
|
7942
|
+
async card(boardId, cardId) {
|
|
7943
|
+
const res = await callCloud(
|
|
7944
|
+
`/kanban/card/get?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}`
|
|
7945
|
+
);
|
|
7946
|
+
return res.data ?? null;
|
|
7947
|
+
}
|
|
7948
|
+
/**
|
|
7949
|
+
* Modifier une carte.
|
|
7950
|
+
*
|
|
7951
|
+
* L'absence d'un champ ne le touche pas ; `null` l'efface. C'est le contrat du
|
|
7952
|
+
* cloud, et le distinguer ici évite qu'un agent vide une couleur en voulant
|
|
7953
|
+
* simplement changer un titre.
|
|
7954
|
+
*/
|
|
7955
|
+
async updateCard(boardId, cardId, patch) {
|
|
7956
|
+
const res = await callCloud("/kanban/card/update", {
|
|
7957
|
+
method: "POST",
|
|
7958
|
+
body: { boardId, cardId, ...patch }
|
|
7959
|
+
});
|
|
7960
|
+
return res.data?.card ?? null;
|
|
7961
|
+
}
|
|
7962
|
+
/** Ranger une carte, ou la reprendre. */
|
|
7963
|
+
async setCardArchived(boardId, cardId, archived) {
|
|
7964
|
+
const res = await callCloud(`/kanban/card/${archived ? "archive" : "unarchive"}`, {
|
|
7965
|
+
method: "POST",
|
|
7966
|
+
body: { boardId, cardId }
|
|
7967
|
+
});
|
|
7968
|
+
return res.ok;
|
|
7969
|
+
}
|
|
7970
|
+
/**
|
|
7971
|
+
* Les membres de l'organisation — sans quoi assigner reviendrait à deviner
|
|
7972
|
+
* un identifiant.
|
|
7973
|
+
*/
|
|
7974
|
+
async members(organizationId) {
|
|
7975
|
+
const orgId = await resolveOrganizationId(organizationId);
|
|
7976
|
+
const res = must(
|
|
7977
|
+
await callCloud(
|
|
7978
|
+
`/organization/get-full-organization?organizationId=${encodeURIComponent(orgId)}`
|
|
7979
|
+
)
|
|
7980
|
+
);
|
|
7981
|
+
return (res.members ?? []).map((m) => ({
|
|
7982
|
+
id: m.userId,
|
|
7983
|
+
name: m.user?.name?.trim() || m.user?.email || m.userId,
|
|
7984
|
+
email: m.user?.email ?? ""
|
|
7985
|
+
}));
|
|
7986
|
+
}
|
|
7987
|
+
/**
|
|
7988
|
+
* Chercher des cartes — dans le cloud, pas ici.
|
|
7989
|
+
*
|
|
7990
|
+
* Cette recherche téléchargeait autrefois **tous les tableaux** de
|
|
7991
|
+
* l'organisation, entiers, pour filtrer ensuite en mémoire sur le titre et le
|
|
7992
|
+
* corps. Elle coûtait donc le poids du kanban complet à chaque appel, ne
|
|
7993
|
+
* voyait pas les commentaires — ils ne voyagent plus avec le tableau — et
|
|
7994
|
+
* ignorait les cartes rangées, absentes des colonnes.
|
|
7995
|
+
*
|
|
7996
|
+
* Le cloud fait la même recherche que ses propres écrans : titre, corps et
|
|
7997
|
+
* commentaires, sans casse ni accents.
|
|
7998
|
+
*/
|
|
7999
|
+
async searchCards(input) {
|
|
8000
|
+
const orgId = await resolveOrganizationId(input.organizationId);
|
|
8001
|
+
const query = new URLSearchParams({ organizationId: orgId, q: input.query });
|
|
8002
|
+
if (input.boardId) query.set("boardId", input.boardId);
|
|
8003
|
+
if (input.limit) query.set("limit", String(input.limit));
|
|
8004
|
+
const res = must(
|
|
8005
|
+
await callCloud(
|
|
8006
|
+
`/kanban/card/search?${query.toString()}`
|
|
8007
|
+
)
|
|
8008
|
+
);
|
|
8009
|
+
return { cards: res.cards ?? [], total: res.total ?? 0, truncated: Boolean(res.truncated) };
|
|
8010
|
+
}
|
|
7674
8011
|
/** Déplacer une carte, sans réécrire le tableau. */
|
|
7675
8012
|
async moveCard(boardId, cardId, toColumnId) {
|
|
7676
8013
|
const res = await callCloud("/kanban/card/move", {
|
|
@@ -7799,27 +8136,9 @@ async function addCardOrFallback(board, columnTitle, cardTitle, cardContent) {
|
|
|
7799
8136
|
markdown: cardContent
|
|
7800
8137
|
});
|
|
7801
8138
|
if (card) return;
|
|
7802
|
-
|
|
7803
|
-
|
|
7804
|
-
|
|
7805
|
-
}
|
|
7806
|
-
console.warn("[kanban-commands] cloud sans /kanban/card/add \u2014 repli sur la sauvegarde du tableau");
|
|
7807
|
-
const col = board.columns.find((c) => c.title.toLowerCase() === columnTitle.toLowerCase());
|
|
7808
|
-
if (!col) return;
|
|
7809
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
7810
|
-
col.cards.push({
|
|
7811
|
-
id: randomUUID5(),
|
|
7812
|
-
title: cardTitle,
|
|
7813
|
-
markdown: cardContent ?? "",
|
|
7814
|
-
images: [],
|
|
7815
|
-
attachments: [],
|
|
7816
|
-
assignees: [],
|
|
7817
|
-
order: col.cards.reduce((max, c) => Math.max(max, c.order + 1), 0),
|
|
7818
|
-
history: [{ type: "created", timestamp: now, detail: `AI \u2014 In column "${col.title}"` }],
|
|
7819
|
-
createdAt: now,
|
|
7820
|
-
updatedAt: now
|
|
7821
|
-
});
|
|
7822
|
-
await kanbanStore.update({ id: board.id, columns: board.columns });
|
|
8139
|
+
console.warn(
|
|
8140
|
+
unsupported ? `[kanban-commands] cloud sans /kanban/card/add \u2014 carte \xAB ${cardTitle} \xBB non cr\xE9\xE9e` : `[kanban-commands] add_card failed: column="${columnTitle}"`
|
|
8141
|
+
);
|
|
7823
8142
|
}
|
|
7824
8143
|
function formatSize(bytes) {
|
|
7825
8144
|
if (bytes < 1024) return `${bytes} o`;
|
|
@@ -8169,7 +8488,7 @@ function tailTranscript(opts) {
|
|
|
8169
8488
|
|
|
8170
8489
|
// ../server/src/services/ai-runners/claude-pty-runner.ts
|
|
8171
8490
|
async function getAgentManager() {
|
|
8172
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
8491
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-KM7SFKVR.js");
|
|
8173
8492
|
return agentManager2;
|
|
8174
8493
|
}
|
|
8175
8494
|
function buildPtyArgs(params, sessionId, opts) {
|
|
@@ -8910,7 +9229,7 @@ async function shutdownCodexAppServer() {
|
|
|
8910
9229
|
}
|
|
8911
9230
|
}
|
|
8912
9231
|
async function getAgentManager2() {
|
|
8913
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
9232
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-KM7SFKVR.js");
|
|
8914
9233
|
return agentManager2;
|
|
8915
9234
|
}
|
|
8916
9235
|
function parseRuneyaCurlCommand(command) {
|
|
@@ -13352,11 +13671,6 @@ function summarizeCard(card, boardId, columnTitle) {
|
|
|
13352
13671
|
updatedAt: card.updatedAt
|
|
13353
13672
|
};
|
|
13354
13673
|
}
|
|
13355
|
-
function boardCards(board) {
|
|
13356
|
-
return [...board.columns].sort((a, b) => a.order - b.order).flatMap(
|
|
13357
|
-
(col) => [...col.cards].sort((a, b) => a.order - b.order).map((card) => summarizeCard(card, board.id, col.title))
|
|
13358
|
-
);
|
|
13359
|
-
}
|
|
13360
13674
|
function boardCounts(board) {
|
|
13361
13675
|
const summary = board;
|
|
13362
13676
|
const columns = board.columns ?? [];
|
|
@@ -13366,9 +13680,6 @@ function boardCounts(board) {
|
|
|
13366
13680
|
columns: columns.map((c) => c.title)
|
|
13367
13681
|
};
|
|
13368
13682
|
}
|
|
13369
|
-
function normalize(value) {
|
|
13370
|
-
return value.normalize("NFD").replace(new RegExp("\\p{Diacritic}", "gu"), "").toLowerCase();
|
|
13371
|
-
}
|
|
13372
13683
|
var ATTACHMENT_ID_REGEX = /^[A-Za-z0-9_-]{1,128}$/;
|
|
13373
13684
|
function safeDecode(value) {
|
|
13374
13685
|
try {
|
|
@@ -13498,13 +13809,7 @@ var kanbanRouter = router({
|
|
|
13498
13809
|
limit: z23.number().int().min(1).max(100).optional(),
|
|
13499
13810
|
organizationId: z23.string().max(128).optional()
|
|
13500
13811
|
})).query(async ({ input }) => {
|
|
13501
|
-
|
|
13502
|
-
const ids = input.boardId ? [input.boardId] : (await kanbanStore.list(false, input.organizationId)).boards.map((b) => b.id);
|
|
13503
|
-
const boards = (await Promise.all(ids.map((id) => kanbanStore.get(id)))).filter((b) => b !== null);
|
|
13504
|
-
const matches = boards.flatMap((board) => boardCards(board).map((card) => ({ board: board.name, ...card }))).filter(
|
|
13505
|
-
(card) => normalize(String(card["title"] ?? "")).includes(needle) || normalize(String(card["markdown"] ?? "")).includes(needle)
|
|
13506
|
-
);
|
|
13507
|
-
return { total: matches.length, cards: matches.slice(0, input.limit ?? 25) };
|
|
13812
|
+
return kanbanStore.searchCards(input);
|
|
13508
13813
|
}),
|
|
13509
13814
|
/**
|
|
13510
13815
|
* Le fil de commentaires d'une carte, relu à la demande.
|
|
@@ -13583,7 +13888,7 @@ var kanbanRouter = router({
|
|
|
13583
13888
|
addComment: protectedProcedure.input(z23.object({
|
|
13584
13889
|
boardId: z23.string().max(128),
|
|
13585
13890
|
cardId: z23.string().max(128),
|
|
13586
|
-
comment: z23.string().max(
|
|
13891
|
+
comment: z23.string().max(1e5)
|
|
13587
13892
|
})).mutation(async ({ input }) => {
|
|
13588
13893
|
await executeKanbanCommands(input.boardId, input.cardId, [
|
|
13589
13894
|
{ type: "add_comment", comment: input.comment }
|
|
@@ -13601,6 +13906,62 @@ var kanbanRouter = router({
|
|
|
13601
13906
|
]);
|
|
13602
13907
|
return { ok: true };
|
|
13603
13908
|
}),
|
|
13909
|
+
/**
|
|
13910
|
+
* Lire une carte, seule.
|
|
13911
|
+
*
|
|
13912
|
+
* `getBoard` rapatrie le tableau entier pour n'en regarder qu'une ; et il ne
|
|
13913
|
+
* porte pas les cartes rangées. Une carte s'adresse par son identifiant.
|
|
13914
|
+
*/
|
|
13915
|
+
getCard: protectedProcedure.input(z23.object({ boardId: z23.string().max(128), cardId: z23.string().max(128) })).query(async ({ input }) => {
|
|
13916
|
+
const found = await kanbanStore.card(input.boardId, input.cardId);
|
|
13917
|
+
if (!found) throw new Error(`Carte ${input.cardId} introuvable sur le tableau ${input.boardId}.`);
|
|
13918
|
+
return { ...summarizeCard(found.card, input.boardId, ""), columnId: found.columnId };
|
|
13919
|
+
}),
|
|
13920
|
+
/**
|
|
13921
|
+
* Modifier une carte.
|
|
13922
|
+
*
|
|
13923
|
+
* Le manque le plus coûteux du kanban vu par un agent : sans lui, il ne
|
|
13924
|
+
* pouvait qu'ajouter. Face à une carte à corriger, il en créait une seconde.
|
|
13925
|
+
*
|
|
13926
|
+
* Un champ absent n'est pas touché ; `null` l'efface. La distinction compte —
|
|
13927
|
+
* changer un titre ne doit pas vider une couleur.
|
|
13928
|
+
*/
|
|
13929
|
+
updateCard: protectedProcedure.input(z23.object({
|
|
13930
|
+
boardId: z23.string().max(128),
|
|
13931
|
+
cardId: z23.string().max(128),
|
|
13932
|
+
title: z23.string().min(1).max(512).optional(),
|
|
13933
|
+
content: z23.string().max(1e5).optional(),
|
|
13934
|
+
priority: z23.number().int().min(1).max(10).nullable().optional(),
|
|
13935
|
+
color: z23.string().max(32).nullable().optional(),
|
|
13936
|
+
groups: z23.array(z23.string().min(1).max(60)).max(30).optional(),
|
|
13937
|
+
deadline: z23.string().regex(/^\d{4}-\d{2}-\d{2}$/).nullable().optional(),
|
|
13938
|
+
assignees: z23.array(z23.string().max(128)).max(50).optional()
|
|
13939
|
+
})).mutation(async ({ input }) => {
|
|
13940
|
+
const { boardId, cardId, content, ...rest } = input;
|
|
13941
|
+
const patch = { ...rest };
|
|
13942
|
+
if (content !== void 0) patch.markdown = content;
|
|
13943
|
+
if (!Object.keys(patch).length) throw new Error("Rien \xE0 modifier : pr\xE9cisez au moins un champ.");
|
|
13944
|
+
const card = await kanbanStore.updateCard(boardId, cardId, patch);
|
|
13945
|
+
if (!card) throw new Error(`La carte ${cardId} n'a pas pu \xEAtre modifi\xE9e.`);
|
|
13946
|
+
return summarizeCard(card, boardId, "");
|
|
13947
|
+
}),
|
|
13948
|
+
/** Ranger une carte, ou la reprendre. */
|
|
13949
|
+
setCardArchived: protectedProcedure.input(z23.object({
|
|
13950
|
+
boardId: z23.string().max(128),
|
|
13951
|
+
cardId: z23.string().max(128),
|
|
13952
|
+
archived: z23.boolean()
|
|
13953
|
+
})).mutation(async ({ input }) => {
|
|
13954
|
+
const ok = await kanbanStore.setCardArchived(input.boardId, input.cardId, input.archived);
|
|
13955
|
+
if (!ok) throw new Error(`La carte ${input.cardId} n'a pas pu \xEAtre ${input.archived ? "archiv\xE9e" : "reprise"}.`);
|
|
13956
|
+
return { ok: true };
|
|
13957
|
+
}),
|
|
13958
|
+
/**
|
|
13959
|
+
* Qui peut se voir assigner une carte.
|
|
13960
|
+
*
|
|
13961
|
+
* Sans cette liste, assigner revient à deviner un identifiant — et l'agent
|
|
13962
|
+
* n'a aucun moyen de le trouver.
|
|
13963
|
+
*/
|
|
13964
|
+
listMembers: protectedProcedure.input(z23.object({ organizationId: z23.string().max(128).optional() })).query(async ({ input }) => ({ members: await kanbanStore.members(input.organizationId) })),
|
|
13604
13965
|
/**
|
|
13605
13966
|
* Fetch one card attachment from the cloud and drop it on this machine, so an
|
|
13606
13967
|
* agent can open it with its own file tools. The bytes never go through the
|
|
@@ -14190,6 +14551,7 @@ var RECONNECT_DELAY_MS = 3e3;
|
|
|
14190
14551
|
var UNAUTHENTICATED_RETRY_MS = 5 * 6e4;
|
|
14191
14552
|
var OUTDATED_RETRY_MS = 30 * 6e4;
|
|
14192
14553
|
var COLLECTIONS = ["projects", "services", "environments"];
|
|
14554
|
+
var PARSERS = "logParsers";
|
|
14193
14555
|
var SyncAuthError = class extends Error {
|
|
14194
14556
|
constructor(status) {
|
|
14195
14557
|
super(`cloud rejected the session (HTTP ${status})`);
|
|
@@ -14221,6 +14583,7 @@ var OrgSyncConnection = class {
|
|
|
14221
14583
|
projects = getCollection(this.doc, "projects");
|
|
14222
14584
|
services = getCollection(this.doc, "services");
|
|
14223
14585
|
environments = getCollection(this.doc, "environments");
|
|
14586
|
+
logParsers = getCollection(this.doc, PARSERS);
|
|
14224
14587
|
conn = randomUUID11();
|
|
14225
14588
|
link;
|
|
14226
14589
|
stopped = false;
|
|
@@ -14289,9 +14652,14 @@ var OrgSyncConnection = class {
|
|
|
14289
14652
|
void this.applyDocEventsToStore(name, events, isInitial);
|
|
14290
14653
|
});
|
|
14291
14654
|
}
|
|
14655
|
+
this.logParsers.observeDeep((events, txn) => {
|
|
14656
|
+
if (txn.origin !== REMOTE_ORIGIN) return;
|
|
14657
|
+
void this.applyParserEventsToStore(events);
|
|
14658
|
+
});
|
|
14292
14659
|
projectStore.events.on("saved", this.onSaved);
|
|
14293
14660
|
this.unsubscribes.push(serviceStore.onChange(this.onSaved));
|
|
14294
14661
|
this.unsubscribes.push(environmentStore.onChange(this.onSaved));
|
|
14662
|
+
this.unsubscribes.push(logParserStore.onLocalChange(this.onSaved));
|
|
14295
14663
|
await this.reconcileLocalToDoc();
|
|
14296
14664
|
this.initializing = false;
|
|
14297
14665
|
this.needsPush = true;
|
|
@@ -14639,6 +15007,54 @@ var OrgSyncConnection = class {
|
|
|
14639
15007
|
await this.upsertLocally(name, id, fields);
|
|
14640
15008
|
}
|
|
14641
15009
|
}
|
|
15010
|
+
/**
|
|
15011
|
+
* Nombre d'applications distantes de parseurs en cours.
|
|
15012
|
+
*
|
|
15013
|
+
* La réconciliation lit le coffre et supprime du document ce qu'elle n'y
|
|
15014
|
+
* trouve pas ; déclenchée par un service enregistré au même instant, elle
|
|
15015
|
+
* lirait un coffre où le parseur qui arrive n'est pas encore écrit — et
|
|
15016
|
+
* l'effacerait pour toute l'organisation. Un compteur plutôt qu'un booléen :
|
|
15017
|
+
* plusieurs évènements peuvent se chevaucher, et le premier terminé ne doit
|
|
15018
|
+
* pas rouvrir la porte pour les autres.
|
|
15019
|
+
*/
|
|
15020
|
+
applyingParsers = 0;
|
|
15021
|
+
/**
|
|
15022
|
+
* Porter au disque les parseurs que le document vient de changer.
|
|
15023
|
+
*
|
|
15024
|
+
* Une suppression est appliquée telle quelle, sans l'équivalent du garde qui
|
|
15025
|
+
* protège les contenus d'un projet non téléchargé : chaque membre tient le
|
|
15026
|
+
* jeu complet de l'organisation, donc un parseur retiré du document l'a bien
|
|
15027
|
+
* été pour tout le monde.
|
|
15028
|
+
*/
|
|
15029
|
+
async applyParserEventsToStore(events) {
|
|
15030
|
+
const deleted = /* @__PURE__ */ new Set();
|
|
15031
|
+
const affected = /* @__PURE__ */ new Set();
|
|
15032
|
+
for (const event of events) {
|
|
15033
|
+
if (event.target === this.logParsers) {
|
|
15034
|
+
for (const [key, change] of event.changes.keys) {
|
|
15035
|
+
if (change.action === "delete") deleted.add(key);
|
|
15036
|
+
else affected.add(key);
|
|
15037
|
+
}
|
|
15038
|
+
} else {
|
|
15039
|
+
const topKey = event.path[0];
|
|
15040
|
+
if (typeof topKey === "string") affected.add(topKey);
|
|
15041
|
+
}
|
|
15042
|
+
}
|
|
15043
|
+
this.applyingParsers += 1;
|
|
15044
|
+
try {
|
|
15045
|
+
for (const id of deleted) {
|
|
15046
|
+
await logParserStore.applyRemoteDelete(id, this.link.orgId);
|
|
15047
|
+
}
|
|
15048
|
+
for (const id of affected) {
|
|
15049
|
+
if (deleted.has(id)) continue;
|
|
15050
|
+
const fields = readEntity(this.logParsers, id);
|
|
15051
|
+
if (!fields) continue;
|
|
15052
|
+
await logParserStore.applyRemoteUpsert(id, fields, this.link.orgId);
|
|
15053
|
+
}
|
|
15054
|
+
} finally {
|
|
15055
|
+
this.applyingParsers -= 1;
|
|
15056
|
+
}
|
|
15057
|
+
}
|
|
14642
15058
|
async upsertLocally(name, id, fields) {
|
|
14643
15059
|
if (name === "services") {
|
|
14644
15060
|
await serviceStore.applyRemoteUpsert(id, fields, this.link.orgId);
|
|
@@ -14725,6 +15141,8 @@ var OrgSyncConnection = class {
|
|
|
14725
15141
|
environmentStore.listEncryptedByProjectIds(projectIds)
|
|
14726
15142
|
]);
|
|
14727
15143
|
if (this.stopped) return;
|
|
15144
|
+
const parsers = (await logParserStore.list(this.link.orgId)).filter(isShareable);
|
|
15145
|
+
if (this.stopped) return;
|
|
14728
15146
|
const local = { projects, services, environments };
|
|
14729
15147
|
const ownedProjectIds = new Set(projectIds);
|
|
14730
15148
|
this.doc.transact(() => {
|
|
@@ -14739,6 +15157,13 @@ var OrgSyncConnection = class {
|
|
|
14739
15157
|
if (this.belongsToOwnedProject(name, id, ownedProjectIds)) collection.delete(id);
|
|
14740
15158
|
}
|
|
14741
15159
|
}
|
|
15160
|
+
const parserIds = new Set(parsers.map((p) => p.id));
|
|
15161
|
+
for (const parser of parsers) writeEntity(this.logParsers, parser.id, parser);
|
|
15162
|
+
if (this.applyingParsers === 0) {
|
|
15163
|
+
for (const id of Array.from(this.logParsers.keys())) {
|
|
15164
|
+
if (!parserIds.has(id)) this.logParsers.delete(id);
|
|
15165
|
+
}
|
|
15166
|
+
}
|
|
14742
15167
|
}, LOCAL_ORIGIN);
|
|
14743
15168
|
}
|
|
14744
15169
|
/**
|
|
@@ -14792,6 +15217,7 @@ var CloudSyncBridge = class {
|
|
|
14792
15217
|
console.error("[cloud-sync] could not read which organizations to sync:", err.message);
|
|
14793
15218
|
return;
|
|
14794
15219
|
}
|
|
15220
|
+
await this.migrateMachineParsers(links);
|
|
14795
15221
|
for (const link of links) await this.connect(link);
|
|
14796
15222
|
const connected = this.connections.size;
|
|
14797
15223
|
if (links.length > 0) {
|
|
@@ -14827,8 +15253,28 @@ var CloudSyncBridge = class {
|
|
|
14827
15253
|
console.error("[cloud-sync] could not read which organizations to sync:", err.message);
|
|
14828
15254
|
return;
|
|
14829
15255
|
}
|
|
15256
|
+
await this.migrateMachineParsers(links);
|
|
14830
15257
|
for (const link of links) await this.connect(link);
|
|
14831
15258
|
}
|
|
15259
|
+
/**
|
|
15260
|
+
* Déplacer les parseurs du poste dans les organisations de cette machine.
|
|
15261
|
+
*
|
|
15262
|
+
* Avant d'ouvrir les connexions, pour que la première réconciliation parte
|
|
15263
|
+
* d'un coffre déjà complet — sinon les parseurs partiraient au document au
|
|
15264
|
+
* coup d'après, ce qui marche mais laisse une fenêtre où l'équipe voit une
|
|
15265
|
+
* liste vide.
|
|
15266
|
+
*
|
|
15267
|
+
* Fait ici plutôt que dans chaque connexion : la liste du poste est vidée à
|
|
15268
|
+
* la fin, et deux connexions qui migreraient en parallèle se la
|
|
15269
|
+
* disputeraient — la seconde trouverait une machine déjà vide.
|
|
15270
|
+
*/
|
|
15271
|
+
async migrateMachineParsers(links) {
|
|
15272
|
+
try {
|
|
15273
|
+
await logParserStore.migrateMachineParsersInto(links.map((l) => l.orgId));
|
|
15274
|
+
} catch (err) {
|
|
15275
|
+
console.error("[cloud-sync] could not move machine parsers into organizations:", err.message);
|
|
15276
|
+
}
|
|
15277
|
+
}
|
|
14832
15278
|
/** Per-org sync state, for the UI. */
|
|
14833
15279
|
states() {
|
|
14834
15280
|
const live = Array.from(this.connections.entries()).map(([orgId, conn]) => ({
|
|
@@ -17761,4 +18207,4 @@ export {
|
|
|
17761
18207
|
pullEnv,
|
|
17762
18208
|
registerInstance
|
|
17763
18209
|
};
|
|
17764
|
-
//# sourceMappingURL=src-
|
|
18210
|
+
//# sourceMappingURL=src-6PAM4JRF.js.map
|