@runeya/runeya 2.0.21 → 2.0.24
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 +103 -9
- package/agent/index.js.map +1 -1
- package/agent-manager-2P4THUVA.js +7 -0
- package/{chunk-PUNE7P6S.js → chunk-Y2R42AXQ.js} +848 -561
- package/chunk-Y2R42AXQ.js.map +1 -0
- package/index.js +92 -43
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/{src-K32WI425.js → src-EGBDYHL5.js} +1540 -1119
- package/src-EGBDYHL5.js.map +1 -0
- package/web/assets/AgentScalarChatInterface.vue-Bk_cXx74.js +13 -0
- package/web/assets/AgentTerminalPage-DqXrABlh.js +1 -0
- package/web/assets/AiChatPage-B3P7qefE.js +1 -0
- package/web/assets/AppLayout-B2e7K0cZ.js +1 -0
- package/web/assets/{AuditPage-CUdrFc3C.js → AuditPage-B55qp9MV.js} +1 -1
- package/web/assets/{CloudAccountPage-am6AxJRB.js → CloudAccountPage-CGyW79m_.js} +1 -1
- package/web/assets/CloudAccountPage-DTity1N0.js +1 -0
- package/web/assets/CloudMessagingPage-7RQRbAOB.js +2 -0
- package/web/assets/CloudMessagingPage-BUnfNsBz.css +1 -0
- package/web/assets/{DashboardPage-pA2caWR9.js → DashboardPage-CwmCbP3t.js} +1 -1
- package/web/assets/{EditorIcon-C9E8hRyM.js → EditorIcon-BaldhaS8.js} +1 -1
- package/web/assets/{EnvironmentForm-XKpxQ-45.js → EnvironmentForm-Da52SUx4.js} +2 -2
- package/web/assets/EnvironmentFormPage-Bab5iOWS.js +1 -0
- package/web/assets/EnvironmentListPage-O1fIWq-g.js +1 -0
- package/web/assets/EnvironmentSelector-BWzLYssP.js +1 -0
- package/web/assets/KanbanBoardPage-BOMHKLHX.css +1 -0
- package/web/assets/KanbanBoardPage-BvtIaHqG.js +4 -0
- package/web/assets/KanbanListPage-BoNcgR3h.css +1 -0
- package/web/assets/KanbanListPage-Cv_QJF00.js +1 -0
- package/web/assets/LaunchProjectPage-uB7iIMG1.js +1 -0
- package/web/assets/{LaunchServicesPage-CViec72c.js → LaunchServicesPage-1ZN1JYqH.js} +1 -1
- package/web/assets/LogViewer-BJxpIK11.js +3 -0
- package/web/assets/{ProcessControls-D97-A3dI.js → ProcessControls-C2EYsD-P.js} +1 -1
- package/web/assets/ProcessDetailPage-DdOfegjU.js +1 -0
- package/web/assets/{ProcessMetrics-CNJ30_ef.js → ProcessMetrics-DpDxpUpO.js} +2 -2
- package/web/assets/ProjectDetailPage-DtwRjTew.js +1 -0
- package/web/assets/ProjectListPage-D9SUNEFu.js +1 -0
- package/web/assets/{RandomJobTestPage-CnY2f-qz.js → RandomJobTestPage-OoAk9WAJ.js} +1 -1
- package/web/assets/{ScenarioEditorPage-CBZp7Q34.css → ScenarioEditorPage-GmFIXPDj.css} +1 -1
- package/web/assets/ScenarioEditorPage-LhEs4hjS.js +14 -0
- package/web/assets/SendToChatDialog-CZWy1K4A.js +1 -0
- package/web/assets/ServiceControlsBar-CU6b2KBJ.js +1 -0
- package/web/assets/{ServiceDetailPage-DhE1LYrn.css → ServiceDetailPage-BvoD3SB6.css} +1 -1
- package/web/assets/ServiceDetailPage-CSaPyV_v.js +2 -0
- package/web/assets/ServiceFormPage-D9NFCmmW.js +1 -0
- package/web/assets/SettingsPage-BMclTDLy.css +1 -0
- package/web/assets/SettingsPage-DXlBFfBq.js +2062 -0
- package/web/assets/{SetupPage-CzabsTON.js → SetupPage-dqqf_M_p.js} +1 -1
- package/web/assets/UnlockPage-ClEawxOC.css +1 -0
- package/web/assets/UnlockPage-DjjpY02d.js +1 -0
- package/web/assets/VariablesTable-B4h9eNC_.css +1 -0
- package/web/assets/VariablesTable-BFgRnjza.js +1 -0
- package/web/assets/{VersionBadge-DUE17MrD.js → VersionBadge-ToW3NGSQ.js} +1 -1
- package/web/assets/WikiPage-Djisdsae.js +1 -0
- package/web/assets/{WikiView-CUBKfTT-.css → WikiView-CaUVD3f1.css} +1 -1
- package/web/assets/WikiView-CiATkY8l.js +1 -0
- package/web/assets/{add-scalar-classes-Cfh7_IWy.js → add-scalar-classes-DGwycuRW.js} +3 -3
- package/web/assets/auth-errors-DEObS1lG.js +1 -0
- package/web/assets/{autocomplete-CrWQ5zMj.js → autocomplete-DP0sGong.js} +1 -1
- package/web/assets/{basic-shape-diamond.svg-pjhwN4JT.js → basic-shape-diamond.svg-B0FzUXGN.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-D0yEDOCC.js → basic-shape-hexagon.svg-BuI9rv44.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-DvZ7CdgE.js → basic-shape-primary-circle-ellipse-round.svg-C0WlStV7.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-ChB1hiGR.js → basic-shape-primary-square-rectangle.svg-ByMGtNMn.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-Bxrmr3jg.js → basic-shape-shield.svg-h6znjRmZ.js} +1 -1
- package/web/assets/{browser-C2YmKQw8.js → browser-DJeF2lho.js} +1 -1
- package/web/assets/{browser-CvQ_J2u9.js → browser-oekISqUb.js} +1 -1
- package/web/assets/{card-CpyeL2dI.js → card-B7-be48x.js} +1 -1
- package/web/assets/{checkbox-DWNV_RaS.js → checkbox-DDSZK_Pi.js} +1 -1
- package/web/assets/{chip-8cRcc2L3.js → chip-BVSQ-56q.js} +1 -1
- package/web/assets/{client-DNj6VDDb.js → client-DWfGqqLr.js} +1 -1
- package/web/assets/cloud-chat.store-BLFChRpl.js +1 -0
- package/web/assets/cloud-client-GmxBhiFl.js +1 -0
- package/web/assets/{column-DtLr_xcq.js → column-BHRqZfnh.js} +7 -7
- package/web/assets/{computer-device-desktop-monitor.svg-CLGySxTI.js → computer-device-desktop-monitor.svg-CL9XulYR.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-DJ9n7_Sq.js → computer-device-desktop.svg-CKWeVTzO.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-k6zcRWN4.js → computer-device-laptop.svg-wAkdRlEi.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-pwKHMzIK.js → computer-device-mobile-phone-android-samsung-back.svg-DOahzxu1.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-CR796QT_.js → computer-device-mobile-phone-android-samsung.svg-FBZO3WLS.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-CY2r7WXK.js → computer-device-mobile-phone-iphone-x-back.svg-CCLknBWv.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-BHISnTWX.js → computer-device-mobile-phone-iphone-x.svg-CWdT8wN4.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-DQqDUvnk.js → computer-device-mobile-tablet-touch.svg-Bx1A6qUQ.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-4Ab5vdIo.js → computer-device-mobile-tablet.svg-JpmP6yqf.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-DJf04S68.js → computer-device-network-ethernet-cat6.svg-D6WFbLbI.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-CaETgcOJ.js → computer-device-network-lan-www.svg-U8NMAi5b.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-PndfmFuy.js → computer-device-network-wifi-connection.svg-FuRBLyH4.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-CBLwEbOV.js → computer-device-network-wifi-router.svg-BMzCP2Aw.js} +1 -1
- package/web/assets/{cssMode-RVPpAuHz.js → cssMode--4DE_809.js} +1 -1
- package/web/assets/{divider-CYFRNVal.js → divider-hPOrl1Iy.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-BYXK2uKa.js → ecology-science-erlenmeyer-flask.svg-Bnte5Nm-.js} +1 -1
- package/web/assets/{fieldset-BCXBPIiB.js → fieldset-BSwilV-Y.js} +1 -1
- package/web/assets/{freemarker2-B6guP0jO.js → freemarker2-DUNAk_0P.js} +1 -1
- package/web/assets/{handlebars-BxlL79LN.js → handlebars-CoM2DS_1.js} +1 -1
- package/web/assets/{html-Dr0M60O0.js → html-CgEDNZ_R.js} +1 -1
- package/web/assets/{htmlMode-B63yAhXq.js → htmlMode-QDDBWVzd.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-DVtJFd09.js → image-flash-lightning.svg-ZIxta1IB.js} +1 -1
- package/web/assets/{image-picture-flower.svg-BaBdyWt-.js → image-picture-flower.svg-BXxhgW1Q.js} +1 -1
- package/web/assets/{index-BTYNCNK0.js → index-Dl-HyfHx.js} +244 -244
- package/web/assets/{index-DS4VL_1S.css → index-gKo3WNkm.css} +1 -1
- package/web/assets/{interface-alert-exclamation-diamond.svg-BQYncN9j.js → interface-alert-exclamation-diamond.svg-bVfL6jBy.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-BvQxARpD.js → interface-alert-exclamation-triangle-warning.svg-BrapXyrc.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-BbiwUtTt.js → interface-alert-information-circle.svg--W3bUw5n.js} +1 -1
- package/web/assets/{interface-award-crown.svg-BJs2BJ9S.js → interface-award-crown.svg-CBbbHFIN.js} +1 -1
- package/web/assets/{interface-bookmark.svg-WUL572zM.js → interface-bookmark-tag.svg-C4_v-zTY.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-huwK9o4X.js → interface-bookmark.svg-CIY69-iu.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-CEkOALKM.js → interface-calendar-date-one.svg-CD7WxblA.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-CDxvdidz.js → interface-content-book-open-pages.svg-BamW-eNv.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-ROxK9a-V.js → interface-content-book-page.svg-CpHhLWQE.js} +1 -1
- package/web/assets/{interface-content-file.svg-69XGQGxu.js → interface-content-file.svg-BmqLN3iR.js} +1 -1
- package/web/assets/interface-content-folder.svg-B2phMZXd.js +1 -0
- package/web/assets/{interface-content-folder.svg-BjXgivIz.js → interface-content-folder.svg-ffbcORbT.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-BAAZ1QLS.js → interface-copy-clipboard.svg-MdbbmqXS.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-BCmyBBsd.js → interface-edit-attachment.svg-DtAVj6tp.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-BI3JPE3j.js → interface-edit-binocular.svg-DfT11Y7N.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-DhECH5yw.js → interface-edit-magic-wand.svg-D4mLRHJs.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-0-Os9Flg.js → interface-edit-tool-paint-roller.svg-Cxa7Ct4C.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-CM5UI5Rv.js → interface-edit-tool-pencil.svg-IRM3BHKY.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-BZNkuFiE.js → interface-favorite-award.svg-CLGZ65SX.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-CeHd37SC.js → interface-favorite-flag.svg-ju-VMCAF.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-D5dJ4sOz.js → interface-favorite-heart.svg-DsWpztN8.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-B7YeWzmv.js → interface-favorite-star.svg-CCPUYvBO.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-BwqCtLSB.js → interface-favorite-stars-sparkles.svg-nf2ra-Mg.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-q70-KJ80.js → interface-hierarchy-flowchart.svg-CPrjsUHp.js} +1 -1
- package/web/assets/{interface-home-house.svg-CUco1zSk.js → interface-home-house.svg-DyWL4dgs.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-D6Z-QbxJ.js → interface-hyperlink.svg-DgjI4lGJ.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-DDJ8wIbt.js → interface-lighting-brightness.svg-BhomgGV0.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-1GuN2t9d.js → interface-lock-closed.svg-CDDGuaUG.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-CmSL9GCo.js → interface-lock-open-unlock.svg-DxOzefwC.js} +1 -1
- package/web/assets/{interface-login-key.svg-Cnur4uLY.js → interface-login-key.svg-CLs728UT.js} +1 -1
- package/web/assets/{interface-search.svg-3TqtroIY.js → interface-search.svg-CSE2bUM-.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-B7nRfZ1y.js → interface-setting-cog.svg-SfBQ-E_y.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-DraAk4oI.js → interface-share-megaphone-bullhorn.svg-Cg9QEbsW.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-CGRtk6J4.js → interface-share-rocket.svg-V9fWt6R5.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-COo3kZqu.js → interface-share-satellite.svg-BoAJlAy3.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-iYhfpKY2.js → interface-share-space-ship.svg-CWoqBiZI.js} +1 -1
- package/web/assets/{interface-share.svg-BqVe3lWw.js → interface-share.svg-DW6AG6rC.js} +1 -1
- package/web/assets/{interface-signal-square.svg-DmGT2kio.js → interface-signal-square.svg-DktTeL2e.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-Djt_VZVX.js → interface-time-clock-circle.svg-BBnimglQ.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-DxZVLqJ6.js → interface-time-hour-glass.svg-WNSRow4o.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-n8dIXu9r.js → interface-users-multiple.svg-DoeSSDNX.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-CExHl6HQ.js → interface-weather-moon.svg-BzUq31T3.js} +1 -1
- package/web/assets/{javascript-6lVkE6gP.js → javascript-CDsgZK6E.js} +1 -1
- package/web/assets/{jsonMode-CySg6s8T.js → jsonMode-BOQojnkz.js} +1 -1
- package/web/assets/{liquid-DSLZY9bf.js → liquid-CT8_Ig_a.js} +1 -1
- package/web/assets/{lspLanguageFeatures-C6Gb5-pg.js → lspLanguageFeatures-BW3wbtds.js} +1 -1
- package/web/assets/{mail-chat-bubble-square.svg-BqpIkvR_.js → mail-chat-bubble-square.svg-BB3D-jS5.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-DUkiRZ1x.js → mail-send-email-paper-airplane.svg-BGUFNdDy.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-DjjLaPUo.js → mail-send-envelope.svg-CiEf_X3v.js} +1 -1
- package/web/assets/{mdx-DuCKQZ3-.js → mdx-BzJqzXG7.js} +1 -1
- package/web/assets/{message-CJ-X_z47.js → message-DQfiz3F1.js} +1 -1
- package/web/assets/{minus-RXlNS6-g.js → minus-Bh-ngAnz.js} +1 -1
- package/web/assets/modal-B6tgGww3.js +1 -0
- package/web/assets/{modal-DfNn2ioJ.js → modal-BH8tCrqE.js} +1 -1
- package/web/assets/{money-cashier-receipt.svg-CUzOL6J5.js → money-cashier-receipt.svg-nbLywLCi.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-CQY_KC9b.js → money-currency-dollar-pay.svg-HtpV_93j.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-BDu5i5aF.js → money-graph-arrow-increase.svg-BG4s2n8-.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-xBlBZYiv.js → money-graph-bar-chart-increase.svg-7ivMfz5M.js} +1 -1
- package/web/assets/{multiselect-BbY8SFyO.js → multiselect-CE72JxFr.js} +1 -1
- package/web/assets/{nature-ecology-leaf.svg-C_T6wTIZ.js → nature-ecology-leaf.svg-D60IfAE-.js} +1 -1
- package/web/assets/{password-B_pKmF_I.js → password-CZ-A_ePM.js} +1 -1
- package/web/assets/{phone-telephone.svg-DzUP7zCx.js → phone-telephone.svg-B0OCaSQr.js} +1 -1
- package/web/assets/{plus-DfsTcd_H.js → plus-DZy8IO4Z.js} +1 -1
- package/web/assets/process.store-XR7BoPqt.js +1 -0
- package/web/assets/{programming-bug.svg-C1NvPH7_.js → programming-bug.svg-DDZ7-1a6.js} +1 -1
- package/web/assets/{programming-cloud.svg-hVwd5xzu.js → programming-cloud.svg-BZHqbFE1.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-DXvcm62E.js → programming-computer-database-server.svg-CPK0axOF.js} +1 -1
- package/web/assets/{programming-computer-database.svg-w2w_GH3u.js → programming-computer-database.svg-Dat_iKWZ.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-DLcwogv0.js → programming-module-four-layout.svg-DYTRTKmF.js} +1 -1
- package/web/assets/{programming-module-three.svg-Cfjjs8tf.js → programming-module-three.svg-CU563xPB.js} +1 -1
- package/web/assets/{programming-module.svg-ChyMdD4E.js → programming-module.svg-DdRe2d3E.js} +1 -1
- package/web/assets/{programming-script-code.svg-D8N99_E3.js → programming-script-code.svg-D5dDzg1B.js} +1 -1
- package/web/assets/{python-BT-UPVMQ.js → python-C0tzbgs4.js} +1 -1
- package/web/assets/{radiobutton-C9iiy1zq.js → radiobutton-BYEniO96.js} +1 -1
- package/web/assets/{razor-DKUraACi.js → razor-BNCtUdbo.js} +1 -1
- package/web/assets/router-BpJBXGio.js +1 -0
- package/web/assets/{settings.store-PSHvWAzl.js → settings.store-hW2r6ht2.js} +1 -1
- package/web/assets/{shopping-cart.svg-C_kTBKvf.js → shopping-cart.svg-yNDOoxiE.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-DIfbUecw.js → shopping-gift-present.svg-ZAFtf911.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-DgeqoYij.js → shopping-shipping-box-parcel-package.svg-C_128hOx.js} +1 -1
- package/web/assets/{TiptapEditor-CI1pNNDH.js → src-BTZHXzoT.js} +78 -78
- package/web/assets/src-CmzYYWZd.css +1 -0
- package/web/assets/src-DtlOQm4K.js +1 -0
- package/web/assets/src-ZfecJkW9.css +1 -0
- package/web/assets/{tabpanel-tgozju6m.js → tabpanel-BiifLLS6.js} +2 -2
- package/web/assets/{tag-new-circle.svg-yzrCIErB.js → tag-new-circle.svg-0OOws8vC.js} +1 -1
- package/web/assets/{travel-map-earth-globe.svg-C9CMICQQ.js → travel-map-earth-globe.svg-CvwB8JlN.js} +1 -1
- package/web/assets/trpc-D0HTyuMG.js +1 -0
- package/web/assets/{tsMode-gblCXC3w.js → tsMode-CadFFP73.js} +1 -1
- package/web/assets/{typescript-DeVzlCKf.js → typescript-TsqAe_2a.js} +1 -1
- package/web/assets/useAiChatDrawer-2ELNp1KU.js +1 -0
- package/web/assets/useCloudOrg-BAtUa48Z.css +1 -0
- package/web/assets/useCloudOrg-DuypVndp.js +1 -0
- package/web/assets/{xml-UwUjH4rq.js → xml-bgdRCuvM.js} +1 -1
- package/web/assets/{yaml-DSs0npSB.js → yaml-BRUv0H85.js} +1 -1
- package/web/index.html +2 -2
- package/agent-manager-QPZUYLJA.js +0 -8
- package/chunk-LZWBXYUE.js +0 -354
- package/chunk-LZWBXYUE.js.map +0 -1
- package/chunk-PUNE7P6S.js.map +0 -1
- package/chunk-Q4N37KNN.js +0 -202
- package/chunk-Q4N37KNN.js.map +0 -1
- package/kanban-commands-53WWMCHQ.js +0 -14
- package/kanban-commands-53WWMCHQ.js.map +0 -1
- package/src-K32WI425.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-S7bbKRqw.js +0 -13
- package/web/assets/AgentTerminalPage-c0fCTCzP.js +0 -1
- package/web/assets/AiChatPage-B-kfiUI-.js +0 -1
- package/web/assets/AppLayout-COTo6zQf.js +0 -1
- package/web/assets/CloudAccountPage-H1QGj9tJ.js +0 -1
- package/web/assets/CloudMessagingPage-BEtd8B8B.js +0 -2
- package/web/assets/CloudMessagingPage-sgMxCh6j.css +0 -1
- package/web/assets/EnvironmentFormPage-DMpiq3Zx.js +0 -1
- package/web/assets/EnvironmentListPage-C21qJ3iw.js +0 -1
- package/web/assets/EnvironmentSelector-Be9yMkjY.js +0 -1
- package/web/assets/KanbanBoardPage-CyUTDl_W.css +0 -1
- package/web/assets/KanbanBoardPage-SNCSxTz7.js +0 -4
- package/web/assets/KanbanListPage-B3JpbFlv.css +0 -1
- package/web/assets/KanbanListPage-D-kgPmxI.js +0 -1
- package/web/assets/LaunchProjectPage-BbNDYePE.js +0 -1
- package/web/assets/LogViewer-CHyPfODD.js +0 -3
- package/web/assets/ProcessDetailPage-BlQJDM-W.js +0 -1
- package/web/assets/ProjectDetailPage-DdRYMfcl.js +0 -1
- package/web/assets/ProjectListPage-BDLXGuEj.js +0 -1
- package/web/assets/ScenarioEditorPage-CFNTrVlY.js +0 -14
- package/web/assets/SendToChatDialog-BJjY1MAh.css +0 -1
- package/web/assets/SendToChatDialog-CtGhyaOw.js +0 -1
- package/web/assets/ServiceControlsBar-m_AQmRiR.js +0 -1
- package/web/assets/ServiceDetailPage-RCl6IsBs.js +0 -2
- package/web/assets/ServiceFormPage-CIJ-tFub.js +0 -1
- package/web/assets/SettingsPage-CPF7w35a.css +0 -1
- package/web/assets/SettingsPage-tK-RiJrj.js +0 -2062
- package/web/assets/SetupKeyPage-CzB_AMfr.js +0 -1
- package/web/assets/SetupKeyPage-DoY1Ua1s.css +0 -1
- package/web/assets/TiptapEditor-bdEPMd-W.css +0 -1
- package/web/assets/UnlockPage-DWM5symg.js +0 -1
- package/web/assets/UnlockPage-EZOi-H7d.css +0 -1
- package/web/assets/VariablesTable-Bkv0MOKi.css +0 -1
- package/web/assets/VariablesTable-DoNJ4OIn.js +0 -1
- package/web/assets/WikiPage-COdO-49s.js +0 -1
- package/web/assets/WikiView-BS9HHroX.js +0 -1
- package/web/assets/auth-errors-D-uOLmKt.js +0 -1
- package/web/assets/cloud-chat.store-DHiYOkkN.js +0 -1
- package/web/assets/cloud-client-COpvz58o.js +0 -1
- package/web/assets/interface-content-folder.svg-Bijbx45w.js +0 -1
- package/web/assets/modal-BvVbc_6u.js +0 -1
- package/web/assets/process.store-BLMSPw2l.js +0 -1
- package/web/assets/router-DBNATEGs.js +0 -1
- package/web/assets/trpc-3qbDCsqO.js +0 -1
- package/web/assets/useAiChatDrawer-BtC-0qN-.js +0 -1
- /package/{agent-manager-QPZUYLJA.js.map → agent-manager-2P4THUVA.js.map} +0 -0
- /package/web/assets/{abap-lJFTLuI6.js → abap-DMmvWZUy.js} +0 -0
- /package/web/assets/{apex-Bp0KWav8.js → apex-D89PiTzU.js} +0 -0
- /package/web/assets/{azcli-DBOe7Uvy.js → azcli-ChnjTTA5.js} +0 -0
- /package/web/assets/{bat-Dk_NT_by.js → bat-uLzQ_FhK.js} +0 -0
- /package/web/assets/{bicep-B07Mrlc7.js → bicep-CMOK7Q1v.js} +0 -0
- /package/web/assets/{cameligo-DL5eNXGn.js → cameligo-D1AyojFH.js} +0 -0
- /package/web/assets/{clojure-BzV2Yqu_.js → clojure-D9JoUgXn.js} +0 -0
- /package/web/assets/{coffee-Bjlj5hmf.js → coffee-D-5sSToL.js} +0 -0
- /package/web/assets/{cpp-C9oth5qz.js → cpp-BqT_t_y9.js} +0 -0
- /package/web/assets/{csharp-HyGd049S.js → csharp-CuToYI91.js} +0 -0
- /package/web/assets/{csp-DjCDOBuX.js → csp-CffcxvlO.js} +0 -0
- /package/web/assets/{css-DIL8RTJ3.js → css-CUD0biQW.js} +0 -0
- /package/web/assets/{cypher-DX1zPXL5.js → cypher-ByyWL_9U.js} +0 -0
- /package/web/assets/{dart-BBQZd_ZZ.js → dart-B__ipcUn.js} +0 -0
- /package/web/assets/{dockerfile-Cj0CaWYx.js → dockerfile-DS-_8bWw.js} +0 -0
- /package/web/assets/{ecl-BjmWCTJg.js → ecl-DWsNCBUj.js} +0 -0
- /package/web/assets/{elixir-3uWoEjXX.js → elixir-OfjEy-3g.js} +0 -0
- /package/web/assets/{flow9-D4r739e9.js → flow9-BPX22hxS.js} +0 -0
- /package/web/assets/{fsharp-B3ycAx5T.js → fsharp-CVJcfIUn.js} +0 -0
- /package/web/assets/{go-DFHBjfCl.js → go-CfRHZ3yg.js} +0 -0
- /package/web/assets/{graphql-DBjIbM_e.js → graphql-BZaO3ttK.js} +0 -0
- /package/web/assets/{hcl-Buu_1Hsp.js → hcl-BF9-qUku.js} +0 -0
- /package/web/assets/{ini-CgzZhgz_.js → ini-BUvw6xhr.js} +0 -0
- /package/web/assets/{java-BczDO0q5.js → java-BZ5BNd2x.js} +0 -0
- /package/web/assets/{julia-B142kn-7.js → julia-DN38cgYT.js} +0 -0
- /package/web/assets/{kotlin-42XMP7p1.js → kotlin-CjEJKT8q.js} +0 -0
- /package/web/assets/{less-BCIsKRqU.js → less-DMEH_Nwq.js} +0 -0
- /package/web/assets/{lexon-DTDOH1dQ.js → lexon-CKQUX8Ov.js} +0 -0
- /package/web/assets/{lua-BrH-CeNs.js → lua-CuWjKLJ0.js} +0 -0
- /package/web/assets/{m3-D-eUeHOI.js → m3-CEp1bVrM.js} +0 -0
- /package/web/assets/{markdown-DwpSjZTn.js → markdown-DxtQ_puq.js} +0 -0
- /package/web/assets/{mips-DoGTrjVk.js → mips-Dx7qydpO.js} +0 -0
- /package/web/assets/{msdax-CQ8McnjQ.js → msdax-DpNCaSiO.js} +0 -0
- /package/web/assets/{mysql-Cj3do0ZO.js → mysql-C3xsBDPP.js} +0 -0
- /package/web/assets/{objective-c-BZbR8TG8.js → objective-c-BbaVHCX1.js} +0 -0
- /package/web/assets/{pascal-23PRDHRq.js → pascal-sDju2faq.js} +0 -0
- /package/web/assets/{pascaligo-CxasKTLJ.js → pascaligo-ChCdOH6b.js} +0 -0
- /package/web/assets/{perl-Dhxz2Lhx.js → perl-BCgLFj01.js} +0 -0
- /package/web/assets/{pgsql-BIbUy7yD.js → pgsql-DtKby69f.js} +0 -0
- /package/web/assets/{php-B5qS9qgM.js → php-NYvR17Qb.js} +0 -0
- /package/web/assets/{pla-Bolz9fha.js → pla-gSg-RBG0.js} +0 -0
- /package/web/assets/{postiats-Ba6dE5lj.js → postiats-BQxHyDfy.js} +0 -0
- /package/web/assets/{powerquery-2jW3ONgo.js → powerquery-DzDmbVZN.js} +0 -0
- /package/web/assets/{powershell-CMfBIiJp.js → powershell-yy4Q5BEQ.js} +0 -0
- /package/web/assets/{protobuf-BpaquOUj.js → protobuf-B_hIk9q0.js} +0 -0
- /package/web/assets/{pug-cBG82Ydz.js → pug-CdeEb1ft.js} +0 -0
- /package/web/assets/{qsharp-DtqL8Lmt.js → qsharp-CiSquEgT.js} +0 -0
- /package/web/assets/{r-CKLew4sj.js → r-D1Ocz1x4.js} +0 -0
- /package/web/assets/{redis-BdDxRU-N.js → redis-D42Y12yz.js} +0 -0
- /package/web/assets/{redshift-X4a4MlqW.js → redshift-CS62MYfG.js} +0 -0
- /package/web/assets/{restructuredtext-LA4Fv05h.js → restructuredtext-CKFSMEXw.js} +0 -0
- /package/web/assets/{ruby-CibE_WVM.js → ruby-C4gTaeU3.js} +0 -0
- /package/web/assets/{rust-BK6RsiL0.js → rust-C_f2AiHQ.js} +0 -0
- /package/web/assets/{sb-BnCCt0Qj.js → sb-CdNdpP1r.js} +0 -0
- /package/web/assets/{scala-oaBDrVqj.js → scala-N4EWaFTL.js} +0 -0
- /package/web/assets/{scheme-C-wkLC01.js → scheme-CttIARxx.js} +0 -0
- /package/web/assets/{scss-BceVGOJY.js → scss-v0wtbxaE.js} +0 -0
- /package/web/assets/{shell-CxhBAFA5.js → shell-BJdEWXbc.js} +0 -0
- /package/web/assets/{solidity-D9sXgTfx.js → solidity-DKDa59zZ.js} +0 -0
- /package/web/assets/{sophia-C4VBhIEM.js → sophia--Kw-vDpr.js} +0 -0
- /package/web/assets/{sparql-DbsK2s9y.js → sparql-BI8jS9Pc.js} +0 -0
- /package/web/assets/{sql-CuGfE0wH.js → sql-Dz6z--6O.js} +0 -0
- /package/web/assets/{st-rB6Bqb2h.js → st-CT8D05gv.js} +0 -0
- /package/web/assets/{swift-BtHGe_4T.js → swift-Ayb3KzWx.js} +0 -0
- /package/web/assets/{systemverilog-CgKnzwU4.js → systemverilog-BtWJM9O5.js} +0 -0
- /package/web/assets/{tcl-DyqQWf87.js → tcl-BJvUWpbV.js} +0 -0
- /package/web/assets/{twig-C980XO5P.js → twig-c3YaBCU6.js} +0 -0
- /package/web/assets/{typespec-CVmA80px.js → typespec-gFCWLBoZ.js} +0 -0
- /package/web/assets/{uuid-2Kb5PDpq.js → uuid-B3B8HIK9.js} +0 -0
- /package/web/assets/{vb-rdNQv5VQ.js → vb-CVtfWXV2.js} +0 -0
- /package/web/assets/{w3c-keyname-B2B-WOb1.js → w3c-keyname-nn0G3QC2.js} +0 -0
- /package/web/assets/{wgsl-64oVbimL.js → wgsl-C_huaGQy.js} +0 -0
|
@@ -1,24 +1,109 @@
|
|
|
1
|
-
import {
|
|
2
|
-
decryptValue,
|
|
3
|
-
decryptVariableSlots,
|
|
4
|
-
deriveStableSecret,
|
|
5
|
-
encryptVariableSlots,
|
|
6
|
-
env,
|
|
7
|
-
extractEncryptedVariableSlots,
|
|
8
|
-
getEncryptionKey,
|
|
9
|
-
isEncryptedValue,
|
|
10
|
-
stableEncryptValue
|
|
11
|
-
} from "./chunk-Q4N37KNN.js";
|
|
12
|
-
|
|
13
1
|
// ../server/src/services/agent-manager.ts
|
|
14
2
|
import { EventEmitter as EventEmitter2 } from "events";
|
|
15
3
|
import WebSocket2 from "ws";
|
|
16
|
-
import { z as
|
|
4
|
+
import { z as z21 } from "zod";
|
|
17
5
|
|
|
18
6
|
// ../server/src/services/agent-store.ts
|
|
19
7
|
import { randomUUID, randomBytes, createCipheriv, createDecipheriv } from "crypto";
|
|
20
8
|
import { readFile, writeFile, rename, mkdir, chmod } from "fs/promises";
|
|
21
9
|
import { join } from "path";
|
|
10
|
+
|
|
11
|
+
// ../server/src/config/env.ts
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
var serverPort = z.coerce.number().int().min(1).max(65535).default(4e3).parse(process.env.RUNEYA_HTTP_PORT);
|
|
14
|
+
var defaultAgentPort = process.env.RUNEYA_AGENT_PORT ? z.coerce.number().int().min(1).max(65535).parse(process.env.RUNEYA_AGENT_PORT) : serverPort + 1;
|
|
15
|
+
var EnvSchema = z.object({
|
|
16
|
+
RUNEYA_HTTP_PORT: z.coerce.number().int().min(1).max(65535).default(4e3),
|
|
17
|
+
RUNEYA_HOST: z.string().default("127.0.0.1"),
|
|
18
|
+
RUNEYA_AGENT_PORT: z.coerce.number().int().min(1).max(65535).default(defaultAgentPort),
|
|
19
|
+
RUNEYA_AGENT_HOST: z.string().default("127.0.0.1"),
|
|
20
|
+
RUNEYA_AGENT_BINARY_PATH: z.string().nullable().default(null),
|
|
21
|
+
RUNEYA_DATA_DIR: z.preprocess((v) => typeof v === "string" && v.length > 0 ? v : void 0, z.string().default(".runeya")),
|
|
22
|
+
RUNEYA_CLOUD_URL: z.string().url().nullable().default(null),
|
|
23
|
+
// Cloud front-end (landing) URL — used by the web app for the registration /
|
|
24
|
+
// onboarding flow. Configured on the server at launch; the web fetches it.
|
|
25
|
+
RUNEYA_CLOUD_APP_URL: z.string().url().nullable().default(null),
|
|
26
|
+
RUNEYA_MODE: z.enum(["local-simple", "cloud"]).default("local-simple"),
|
|
27
|
+
RUNEYA_CORS_ORIGIN: z.string().nullable().default(null),
|
|
28
|
+
RUNEYA_LAN_PROXY: z.preprocess((v) => v === "true" || v === "1", z.boolean()).default(false)
|
|
29
|
+
}).transform((data) => ({
|
|
30
|
+
...data,
|
|
31
|
+
// Short aliases used throughout the server code
|
|
32
|
+
PORT: data.RUNEYA_HTTP_PORT,
|
|
33
|
+
HOST: data.RUNEYA_HOST,
|
|
34
|
+
MODE: data.RUNEYA_MODE,
|
|
35
|
+
DATA_DIR: data.RUNEYA_DATA_DIR,
|
|
36
|
+
CLOUD_URL: data.RUNEYA_CLOUD_URL,
|
|
37
|
+
CLOUD_APP_URL: data.RUNEYA_CLOUD_APP_URL,
|
|
38
|
+
CORS_ORIGIN: data.RUNEYA_CORS_ORIGIN,
|
|
39
|
+
AGENT_BINARY_PATH: data.RUNEYA_AGENT_BINARY_PATH
|
|
40
|
+
}));
|
|
41
|
+
var env = EnvSchema.parse(process.env);
|
|
42
|
+
|
|
43
|
+
// ../server/src/utils/encryption-key.ts
|
|
44
|
+
import { createHash } from "crypto";
|
|
45
|
+
var KEY_SIZE_BYTES = 32;
|
|
46
|
+
var cachedKey = null;
|
|
47
|
+
var _ciMode = false;
|
|
48
|
+
var _pendingLegacyKey = null;
|
|
49
|
+
function isCiMode() {
|
|
50
|
+
return _ciMode;
|
|
51
|
+
}
|
|
52
|
+
async function loadFromEnv() {
|
|
53
|
+
const keyHex = process.env["RUNEYA_ENCRYPTION_KEY"];
|
|
54
|
+
if (!keyHex) return false;
|
|
55
|
+
if (!/^[0-9a-f]{64}$/i.test(keyHex)) {
|
|
56
|
+
throw new Error("RUNEYA_ENCRYPTION_KEY invalide : attendu 64 caract\xE8res hex");
|
|
57
|
+
}
|
|
58
|
+
console.log("");
|
|
59
|
+
console.log("\u26A0 ATTENTION : RUNEYA_ENCRYPTION_KEY est d\xE9fini \u2014 l'authentification par master password est d\xE9sactiv\xE9e.");
|
|
60
|
+
console.log(" Cette variable d'environnement est r\xE9serv\xE9e aux environnements CI/CD.");
|
|
61
|
+
console.log(" Ne la d\xE9finissez jamais sur une machine de d\xE9veloppement.");
|
|
62
|
+
console.log("");
|
|
63
|
+
cachedKey = Buffer.from(keyHex, "hex");
|
|
64
|
+
_ciMode = true;
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
function setPendingLegacyKey(key) {
|
|
68
|
+
if (key.length !== KEY_SIZE_BYTES) throw new Error("Taille de cl\xE9 invalide");
|
|
69
|
+
_pendingLegacyKey = key;
|
|
70
|
+
}
|
|
71
|
+
function getPendingLegacyKey() {
|
|
72
|
+
return _pendingLegacyKey;
|
|
73
|
+
}
|
|
74
|
+
function clearPendingLegacyKey() {
|
|
75
|
+
_pendingLegacyKey = null;
|
|
76
|
+
}
|
|
77
|
+
function hasPendingLegacyKey() {
|
|
78
|
+
return _pendingLegacyKey !== null;
|
|
79
|
+
}
|
|
80
|
+
function setEncryptionKeyInMemory(key) {
|
|
81
|
+
if (key.length !== KEY_SIZE_BYTES) throw new Error("Taille de cl\xE9 invalide");
|
|
82
|
+
cachedKey = key;
|
|
83
|
+
}
|
|
84
|
+
function clearEncryptionKey() {
|
|
85
|
+
cachedKey = null;
|
|
86
|
+
}
|
|
87
|
+
function hasEncryptionKey() {
|
|
88
|
+
return cachedKey !== null;
|
|
89
|
+
}
|
|
90
|
+
function getEncryptionKey() {
|
|
91
|
+
return cachedKey;
|
|
92
|
+
}
|
|
93
|
+
function deriveStableSecret(purpose) {
|
|
94
|
+
const key = getEncryptionKey();
|
|
95
|
+
if (!key) return null;
|
|
96
|
+
return createHash("sha256").update(key).update(purpose).digest("hex");
|
|
97
|
+
}
|
|
98
|
+
async function ensureEncryptionKey() {
|
|
99
|
+
return cachedKey;
|
|
100
|
+
}
|
|
101
|
+
async function setEncryptionKey(keyHex) {
|
|
102
|
+
if (!/^[0-9a-f]{64}$/i.test(keyHex)) throw new Error("Invalid key format");
|
|
103
|
+
cachedKey = Buffer.from(keyHex, "hex");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ../server/src/services/agent-store.ts
|
|
22
107
|
var FILENAME = "agents.json";
|
|
23
108
|
var ALGORITHM = "aes-256-gcm";
|
|
24
109
|
function encrypt(plaintext) {
|
|
@@ -197,217 +282,304 @@ import { randomUUID as randomUUID2 } from "crypto";
|
|
|
197
282
|
import { readFile as readFile2, writeFile as writeFile2, rename as rename2, mkdir as mkdir2, chmod as chmod2 } from "fs/promises";
|
|
198
283
|
import { join as join2 } from "path";
|
|
199
284
|
|
|
285
|
+
// ../server/src/services/crypto-helpers.ts
|
|
286
|
+
import { randomBytes as randomBytes2, createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2 } from "crypto";
|
|
287
|
+
var ALGORITHM2 = "aes-256-gcm";
|
|
288
|
+
function encryptValue(plaintext) {
|
|
289
|
+
const maybeKey = getEncryptionKey();
|
|
290
|
+
if (!maybeKey) {
|
|
291
|
+
throw new Error("Encryption key not loaded \u2014 please provide the key via setup UI");
|
|
292
|
+
}
|
|
293
|
+
const key = maybeKey;
|
|
294
|
+
const iv = randomBytes2(16);
|
|
295
|
+
const cipher = createCipheriv2(ALGORITHM2, key, iv);
|
|
296
|
+
let enc = cipher.update(plaintext, "utf-8", "hex");
|
|
297
|
+
enc += cipher.final("hex");
|
|
298
|
+
const authTag = cipher.getAuthTag().toString("hex");
|
|
299
|
+
return `${iv.toString("hex")}:${authTag}:${enc}`;
|
|
300
|
+
}
|
|
301
|
+
function decryptValue(encrypted) {
|
|
302
|
+
const parts = encrypted.split(":");
|
|
303
|
+
if (parts.length !== 3) throw new Error("Invalid encrypted value format \u2014 expected iv:authTag:ciphertext");
|
|
304
|
+
const [ivHex, authTagHex, ciphertext] = parts;
|
|
305
|
+
if (!/^[0-9a-f]+$/i.test(ivHex) || !/^[0-9a-f]+$/i.test(authTagHex) || ciphertext !== "" && !/^[0-9a-f]+$/i.test(ciphertext)) {
|
|
306
|
+
throw new Error("Invalid hex in encrypted value \u2014 possible data corruption");
|
|
307
|
+
}
|
|
308
|
+
const maybeKey = getEncryptionKey();
|
|
309
|
+
if (!maybeKey) {
|
|
310
|
+
throw new Error("Encryption key not loaded \u2014 please provide the key via setup UI");
|
|
311
|
+
}
|
|
312
|
+
const key = maybeKey;
|
|
313
|
+
const iv = Buffer.from(ivHex, "hex");
|
|
314
|
+
const decipher = createDecipheriv2(ALGORITHM2, key, iv, { authTagLength: 16 });
|
|
315
|
+
decipher.setAuthTag(Buffer.from(authTagHex, "hex"));
|
|
316
|
+
let dec = decipher.update(ciphertext, "hex", "utf-8");
|
|
317
|
+
dec += decipher.final("utf-8");
|
|
318
|
+
return dec;
|
|
319
|
+
}
|
|
320
|
+
function stableEncryptValue(plaintext, existingEncrypted) {
|
|
321
|
+
if (existingEncrypted) {
|
|
322
|
+
try {
|
|
323
|
+
if (decryptValue(existingEncrypted) === plaintext) return existingEncrypted;
|
|
324
|
+
} catch {
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return encryptValue(plaintext);
|
|
328
|
+
}
|
|
329
|
+
function encryptVariableSlots(variables, existingEncrypted) {
|
|
330
|
+
const result = {};
|
|
331
|
+
for (const [key, variable] of Object.entries(variables)) {
|
|
332
|
+
const slot = variable.value;
|
|
333
|
+
if (slot.isSecret && slot.value) {
|
|
334
|
+
result[key] = { ...variable, value: { ...slot, value: stableEncryptValue(slot.value, existingEncrypted?.[key]) } };
|
|
335
|
+
} else {
|
|
336
|
+
result[key] = { ...variable, value: { ...slot } };
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return result;
|
|
340
|
+
}
|
|
341
|
+
function decryptVariableSlots(variables, contextLabel) {
|
|
342
|
+
const result = {};
|
|
343
|
+
for (const [key, variable] of Object.entries(variables)) {
|
|
344
|
+
const slot = variable.value;
|
|
345
|
+
if (slot.isSecret && slot.value) {
|
|
346
|
+
try {
|
|
347
|
+
result[key] = { ...variable, value: { ...slot, value: decryptValue(slot.value) } };
|
|
348
|
+
} catch (err) {
|
|
349
|
+
console.error(`[crypto-helpers] Failed to decrypt variable "${key}" for ${contextLabel}: ${err.message}`);
|
|
350
|
+
result[key] = { ...variable, value: { ...slot, value: "" } };
|
|
351
|
+
}
|
|
352
|
+
} else {
|
|
353
|
+
result[key] = { ...variable, value: { ...slot } };
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
358
|
+
function extractEncryptedVariableSlots(variables) {
|
|
359
|
+
const slots = {};
|
|
360
|
+
for (const [key, variable] of Object.entries(variables)) {
|
|
361
|
+
if (variable.value?.isSecret && variable.value?.value) {
|
|
362
|
+
slots[key] = variable.value.value;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return slots;
|
|
366
|
+
}
|
|
367
|
+
function isEncryptedValue(s) {
|
|
368
|
+
const parts = s.split(":");
|
|
369
|
+
return parts.length === 3 && /^[0-9a-f]{32}$/i.test(parts[0]) && /^[0-9a-f]{32}$/i.test(parts[1]);
|
|
370
|
+
}
|
|
371
|
+
|
|
200
372
|
// ../../packages/shared/src/schemas/user.schema.ts
|
|
201
|
-
import { z } from "zod";
|
|
202
|
-
var UserSchema =
|
|
203
|
-
id:
|
|
204
|
-
email:
|
|
205
|
-
name:
|
|
206
|
-
avatar:
|
|
373
|
+
import { z as z2 } from "zod";
|
|
374
|
+
var UserSchema = z2.object({
|
|
375
|
+
id: z2.string().max(128),
|
|
376
|
+
email: z2.string().email().max(320),
|
|
377
|
+
name: z2.string().min(1).max(500),
|
|
378
|
+
avatar: z2.string().url().max(2048).nullable().optional()
|
|
207
379
|
});
|
|
208
380
|
|
|
209
381
|
// ../../packages/shared/src/schemas/org.schema.ts
|
|
210
|
-
import { z as
|
|
211
|
-
var OrgSchema =
|
|
212
|
-
id:
|
|
213
|
-
name:
|
|
214
|
-
slug:
|
|
215
|
-
ownerId:
|
|
382
|
+
import { z as z3 } from "zod";
|
|
383
|
+
var OrgSchema = z3.object({
|
|
384
|
+
id: z3.string().max(128),
|
|
385
|
+
name: z3.string().min(1).max(100),
|
|
386
|
+
slug: z3.string().min(1).max(100).regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/),
|
|
387
|
+
ownerId: z3.string().max(128)
|
|
216
388
|
});
|
|
217
|
-
var OrgMemberSchema =
|
|
218
|
-
id:
|
|
219
|
-
orgId:
|
|
220
|
-
userId:
|
|
221
|
-
globalRole:
|
|
222
|
-
invitedAt:
|
|
223
|
-
joinedAt:
|
|
389
|
+
var OrgMemberSchema = z3.object({
|
|
390
|
+
id: z3.string().max(128),
|
|
391
|
+
orgId: z3.string().max(128),
|
|
392
|
+
userId: z3.string().max(128),
|
|
393
|
+
globalRole: z3.enum(["owner", "admin", "member"]),
|
|
394
|
+
invitedAt: z3.coerce.date(),
|
|
395
|
+
joinedAt: z3.coerce.date().nullable().optional()
|
|
224
396
|
});
|
|
225
397
|
|
|
226
398
|
// ../../packages/shared/src/schemas/project.schema.ts
|
|
227
|
-
import { z as
|
|
228
|
-
var ProjectSchema =
|
|
229
|
-
id:
|
|
230
|
-
orgId:
|
|
231
|
-
name:
|
|
232
|
-
description:
|
|
233
|
-
serviceIds:
|
|
399
|
+
import { z as z4 } from "zod";
|
|
400
|
+
var ProjectSchema = z4.object({
|
|
401
|
+
id: z4.string().max(128),
|
|
402
|
+
orgId: z4.string().max(128).nullable().optional(),
|
|
403
|
+
name: z4.string().min(1).max(200),
|
|
404
|
+
description: z4.string().max(1e4).optional().default(""),
|
|
405
|
+
serviceIds: z4.array(z4.string().max(128)).max(1e4).default([]),
|
|
234
406
|
// Environment support
|
|
235
407
|
// NOTE: activeEnvironmentId is runtime-only (not persisted to JSON)
|
|
236
408
|
// It's initialized to 'local' by default at load time
|
|
237
|
-
activeEnvironmentId:
|
|
238
|
-
environmentIds:
|
|
409
|
+
activeEnvironmentId: z4.string().max(128).optional(),
|
|
410
|
+
environmentIds: z4.array(z4.string().max(128)).max(100).default([]),
|
|
239
411
|
// Ordre d'affichage des groupes de services dans la sidebar (noms de groupes).
|
|
240
412
|
// Les groupes absents de cette liste sont affichés après, par ordre alphabétique.
|
|
241
|
-
groupOrder:
|
|
413
|
+
groupOrder: z4.array(z4.string().max(200)).max(100).default([])
|
|
242
414
|
});
|
|
243
415
|
var CreateProjectSchema = ProjectSchema.omit({ id: true }).partial().required({ name: true });
|
|
244
416
|
var UpdateProjectSchema = ProjectSchema.partial().required({ id: true });
|
|
245
417
|
|
|
246
418
|
// ../../packages/shared/src/schemas/service.schema.ts
|
|
247
|
-
import { z as
|
|
419
|
+
import { z as z8 } from "zod";
|
|
248
420
|
|
|
249
421
|
// ../../packages/shared/src/schemas/settings.schema.ts
|
|
250
|
-
import { z as
|
|
422
|
+
import { z as z6 } from "zod";
|
|
251
423
|
|
|
252
424
|
// ../../packages/shared/src/schemas/scenario.schema.ts
|
|
253
|
-
import { z as
|
|
254
|
-
var PositionSchema =
|
|
255
|
-
x:
|
|
256
|
-
y:
|
|
425
|
+
import { z as z5 } from "zod";
|
|
426
|
+
var PositionSchema = z5.object({
|
|
427
|
+
x: z5.number(),
|
|
428
|
+
y: z5.number()
|
|
257
429
|
});
|
|
258
|
-
var ScenarioGroupSchema =
|
|
259
|
-
id:
|
|
260
|
-
name:
|
|
261
|
-
description:
|
|
262
|
-
color:
|
|
430
|
+
var ScenarioGroupSchema = z5.object({
|
|
431
|
+
id: z5.string().min(1).max(128),
|
|
432
|
+
name: z5.string().min(1).max(200),
|
|
433
|
+
description: z5.string().max(1e3).optional(),
|
|
434
|
+
color: z5.string().max(32).optional(),
|
|
263
435
|
position: PositionSchema.default({ x: 0, y: 0 }),
|
|
264
|
-
width:
|
|
265
|
-
height:
|
|
436
|
+
width: z5.number().default(300),
|
|
437
|
+
height: z5.number().default(200)
|
|
266
438
|
});
|
|
267
|
-
var ScenarioPresetRoleSchema =
|
|
268
|
-
id:
|
|
269
|
-
name:
|
|
270
|
-
systemPrompt:
|
|
271
|
-
prompt:
|
|
272
|
-
});
|
|
273
|
-
var ScenarioPresetInitialDataSchema =
|
|
274
|
-
leaderId:
|
|
275
|
-
groups:
|
|
276
|
-
id:
|
|
277
|
-
name:
|
|
278
|
-
description:
|
|
279
|
-
color:
|
|
280
|
-
position:
|
|
281
|
-
width:
|
|
282
|
-
height:
|
|
439
|
+
var ScenarioPresetRoleSchema = z5.object({
|
|
440
|
+
id: z5.string().min(1).max(64),
|
|
441
|
+
name: z5.string().min(1).max(200),
|
|
442
|
+
systemPrompt: z5.string().max(1e4).default(""),
|
|
443
|
+
prompt: z5.string().max(1e4).default("")
|
|
444
|
+
});
|
|
445
|
+
var ScenarioPresetInitialDataSchema = z5.object({
|
|
446
|
+
leaderId: z5.string().min(1).max(128),
|
|
447
|
+
groups: z5.array(z5.object({
|
|
448
|
+
id: z5.string().min(1).max(128),
|
|
449
|
+
name: z5.string().min(1).max(200),
|
|
450
|
+
description: z5.string().max(1e3).optional(),
|
|
451
|
+
color: z5.string().max(32).optional(),
|
|
452
|
+
position: z5.object({ x: z5.number(), y: z5.number() }).default({ x: 0, y: 0 }),
|
|
453
|
+
width: z5.number().default(300),
|
|
454
|
+
height: z5.number().default(200)
|
|
283
455
|
})).max(100).default([]),
|
|
284
|
-
nodes:
|
|
285
|
-
id:
|
|
286
|
-
type:
|
|
287
|
-
parentIds:
|
|
288
|
-
groupId:
|
|
289
|
-
label:
|
|
290
|
-
role:
|
|
291
|
-
prompt:
|
|
292
|
-
question:
|
|
293
|
-
autoGenerated:
|
|
294
|
-
canAddNode:
|
|
295
|
-
aiCli:
|
|
296
|
-
model:
|
|
297
|
-
position:
|
|
456
|
+
nodes: z5.array(z5.object({
|
|
457
|
+
id: z5.string().min(1).max(128),
|
|
458
|
+
type: z5.enum(["ai", "ask"]).default("ai"),
|
|
459
|
+
parentIds: z5.array(z5.string().max(128)).default([]),
|
|
460
|
+
groupId: z5.string().max(128).nullable().default(null),
|
|
461
|
+
label: z5.string().max(240).default(""),
|
|
462
|
+
role: z5.string().max(64).default("other"),
|
|
463
|
+
prompt: z5.string().max(5e4).default(""),
|
|
464
|
+
question: z5.string().max(2e3).default(""),
|
|
465
|
+
autoGenerated: z5.boolean().default(true),
|
|
466
|
+
canAddNode: z5.boolean().default(false),
|
|
467
|
+
aiCli: z5.enum(["claude-code", "codex"]).default("claude-code"),
|
|
468
|
+
model: z5.string().max(128).default("sonnet"),
|
|
469
|
+
position: z5.object({ x: z5.number(), y: z5.number() }).default({ x: 0, y: 0 })
|
|
298
470
|
})).min(1).max(500)
|
|
299
471
|
});
|
|
300
|
-
var LocalizedStringSchema =
|
|
301
|
-
var ScenarioPresetLabelsSchema =
|
|
472
|
+
var LocalizedStringSchema = z5.record(z5.string(), z5.string().max(100));
|
|
473
|
+
var ScenarioPresetLabelsSchema = z5.object({
|
|
302
474
|
group: LocalizedStringSchema.optional(),
|
|
303
475
|
node: LocalizedStringSchema.optional(),
|
|
304
476
|
role: LocalizedStringSchema.optional(),
|
|
305
477
|
leader: LocalizedStringSchema.optional()
|
|
306
478
|
});
|
|
307
|
-
var ScenarioPresetSchema =
|
|
308
|
-
id:
|
|
309
|
-
name:
|
|
310
|
-
icon:
|
|
311
|
-
defaultTraversalMode:
|
|
312
|
-
canChangeTraversalMode:
|
|
313
|
-
roles:
|
|
479
|
+
var ScenarioPresetSchema = z5.object({
|
|
480
|
+
id: z5.string().min(1).max(128),
|
|
481
|
+
name: z5.string().min(1).max(200),
|
|
482
|
+
icon: z5.string().max(64).optional(),
|
|
483
|
+
defaultTraversalMode: z5.enum(["hierarchical", "topological"]).optional(),
|
|
484
|
+
canChangeTraversalMode: z5.boolean().default(true),
|
|
485
|
+
roles: z5.array(ScenarioPresetRoleSchema).min(1).max(100),
|
|
314
486
|
initialData: ScenarioPresetInitialDataSchema.optional(),
|
|
315
487
|
labels: ScenarioPresetLabelsSchema.optional()
|
|
316
488
|
});
|
|
317
|
-
var ScenarioNodeSchema =
|
|
318
|
-
id:
|
|
319
|
-
type:
|
|
320
|
-
parentIds:
|
|
321
|
-
groupId:
|
|
322
|
-
label:
|
|
323
|
-
role:
|
|
324
|
-
prompt:
|
|
325
|
-
question:
|
|
326
|
-
autoGenerated:
|
|
327
|
-
canAddNode:
|
|
328
|
-
aiCli:
|
|
329
|
-
model:
|
|
489
|
+
var ScenarioNodeSchema = z5.object({
|
|
490
|
+
id: z5.string().min(1).max(128),
|
|
491
|
+
type: z5.enum(["ai", "ask"]).default("ai"),
|
|
492
|
+
parentIds: z5.array(z5.string().max(128)).default([]),
|
|
493
|
+
groupId: z5.string().max(128).nullable().default(null),
|
|
494
|
+
label: z5.string().max(240).default(""),
|
|
495
|
+
role: z5.string().max(64).default("other"),
|
|
496
|
+
prompt: z5.string().max(5e4).default(""),
|
|
497
|
+
question: z5.string().max(2e3).default(""),
|
|
498
|
+
autoGenerated: z5.boolean().default(true),
|
|
499
|
+
canAddNode: z5.boolean().default(false),
|
|
500
|
+
aiCli: z5.enum(["claude-code", "codex"]).default("claude-code"),
|
|
501
|
+
model: z5.string().max(128).default("sonnet"),
|
|
330
502
|
position: PositionSchema.default({ x: 0, y: 0 }),
|
|
331
|
-
injectParentOutputs:
|
|
332
|
-
injectedAncestorIds:
|
|
503
|
+
injectParentOutputs: z5.boolean().default(false),
|
|
504
|
+
injectedAncestorIds: z5.array(z5.string().max(128)).default([])
|
|
333
505
|
});
|
|
334
|
-
var ScenarioSchema =
|
|
335
|
-
id:
|
|
336
|
-
name:
|
|
337
|
-
icon:
|
|
338
|
-
description:
|
|
339
|
-
leaderId:
|
|
340
|
-
groups:
|
|
341
|
-
nodes:
|
|
342
|
-
traversalMode:
|
|
343
|
-
presetId:
|
|
344
|
-
isPublished:
|
|
345
|
-
createdAt:
|
|
346
|
-
updatedAt:
|
|
506
|
+
var ScenarioSchema = z5.object({
|
|
507
|
+
id: z5.string().min(1).max(128),
|
|
508
|
+
name: z5.string().min(1).max(200),
|
|
509
|
+
icon: z5.string().max(64).optional(),
|
|
510
|
+
description: z5.string().max(2e3).optional(),
|
|
511
|
+
leaderId: z5.string().min(1).max(128),
|
|
512
|
+
groups: z5.array(ScenarioGroupSchema).max(100).default([]),
|
|
513
|
+
nodes: z5.array(ScenarioNodeSchema).min(1).max(500),
|
|
514
|
+
traversalMode: z5.enum(["hierarchical", "topological"]).default("hierarchical"),
|
|
515
|
+
presetId: z5.string().max(128).optional(),
|
|
516
|
+
isPublished: z5.boolean().default(false),
|
|
517
|
+
createdAt: z5.number(),
|
|
518
|
+
updatedAt: z5.number()
|
|
347
519
|
});
|
|
348
520
|
|
|
349
521
|
// ../../packages/shared/src/schemas/settings.schema.ts
|
|
350
522
|
var AI_PROVIDERS = ["anthropic", "openai", "mistral", "groq", "ollama"];
|
|
351
|
-
var AIProviderSchema =
|
|
352
|
-
id:
|
|
353
|
-
name:
|
|
354
|
-
provider:
|
|
355
|
-
encryptedApiKey:
|
|
356
|
-
model:
|
|
357
|
-
active:
|
|
358
|
-
createdAt:
|
|
359
|
-
updatedAt:
|
|
360
|
-
});
|
|
361
|
-
var JSLogParserSchema =
|
|
362
|
-
id:
|
|
363
|
-
name:
|
|
364
|
-
description:
|
|
365
|
-
code:
|
|
523
|
+
var AIProviderSchema = z6.object({
|
|
524
|
+
id: z6.string().min(1).max(128),
|
|
525
|
+
name: z6.string().min(1).max(200),
|
|
526
|
+
provider: z6.enum(AI_PROVIDERS),
|
|
527
|
+
encryptedApiKey: z6.string().max(2e3).default(""),
|
|
528
|
+
model: z6.string().max(200).optional(),
|
|
529
|
+
active: z6.boolean().default(false),
|
|
530
|
+
createdAt: z6.coerce.date(),
|
|
531
|
+
updatedAt: z6.coerce.date()
|
|
532
|
+
});
|
|
533
|
+
var JSLogParserSchema = z6.object({
|
|
534
|
+
id: z6.string().min(1).max(128),
|
|
535
|
+
name: z6.string().min(1).max(200),
|
|
536
|
+
description: z6.string().max(2e3).optional(),
|
|
537
|
+
code: z6.string().min(1).max(5e4).refine(
|
|
366
538
|
(s) => !s.includes("require(") && !s.includes("import ") && !s.includes("eval("),
|
|
367
539
|
{ message: "Code must not contain require, import, or eval patterns" }
|
|
368
540
|
),
|
|
369
|
-
enabled:
|
|
370
|
-
builtin:
|
|
371
|
-
createdAt:
|
|
372
|
-
updatedAt:
|
|
373
|
-
});
|
|
374
|
-
var NotificationPreferencesSchema =
|
|
375
|
-
scenario_waiting_input:
|
|
376
|
-
ai_conversation_complete:
|
|
377
|
-
ai_conversation_error:
|
|
378
|
-
service_error_log:
|
|
379
|
-
service_status_changed:
|
|
380
|
-
service_health_changed:
|
|
541
|
+
enabled: z6.boolean().default(true),
|
|
542
|
+
builtin: z6.boolean().optional(),
|
|
543
|
+
createdAt: z6.coerce.date(),
|
|
544
|
+
updatedAt: z6.coerce.date()
|
|
545
|
+
});
|
|
546
|
+
var NotificationPreferencesSchema = z6.object({
|
|
547
|
+
scenario_waiting_input: z6.boolean().default(true),
|
|
548
|
+
ai_conversation_complete: z6.boolean().default(true),
|
|
549
|
+
ai_conversation_error: z6.boolean().default(true),
|
|
550
|
+
service_error_log: z6.boolean().default(true),
|
|
551
|
+
service_status_changed: z6.boolean().default(true),
|
|
552
|
+
service_health_changed: z6.boolean().default(true),
|
|
381
553
|
/** Service IDs excluded from error-log notifications */
|
|
382
|
-
service_error_log_excluded:
|
|
554
|
+
service_error_log_excluded: z6.array(z6.string().max(100)).max(500).default([]),
|
|
383
555
|
/** Service IDs excluded from status-change notifications */
|
|
384
|
-
service_status_changed_excluded:
|
|
556
|
+
service_status_changed_excluded: z6.array(z6.string().max(100)).max(500).default([]),
|
|
385
557
|
/** Service IDs excluded from health-change notifications */
|
|
386
|
-
service_health_changed_excluded:
|
|
558
|
+
service_health_changed_excluded: z6.array(z6.string().max(100)).max(500).default([])
|
|
387
559
|
});
|
|
388
|
-
var SettingsSchema =
|
|
389
|
-
mode:
|
|
390
|
-
cloudUrl:
|
|
391
|
-
logParsers:
|
|
392
|
-
scenarios:
|
|
560
|
+
var SettingsSchema = z6.object({
|
|
561
|
+
mode: z6.enum(["local-simple", "cloud"]),
|
|
562
|
+
cloudUrl: z6.string().url().max(2048).nullable().optional(),
|
|
563
|
+
logParsers: z6.array(JSLogParserSchema).max(100).default([]),
|
|
564
|
+
scenarios: z6.array(ScenarioSchema).max(100).default([]),
|
|
393
565
|
/** Absolute path to the folder where the global wiki/docs markdown files live. Optional. */
|
|
394
|
-
globalDocsPath:
|
|
395
|
-
});
|
|
396
|
-
var TraefikConfigSchema =
|
|
397
|
-
enabled:
|
|
398
|
-
acmeEmail:
|
|
399
|
-
wildcardDomain:
|
|
400
|
-
httpPort:
|
|
401
|
-
httpsPort:
|
|
402
|
-
dnsProvider:
|
|
403
|
-
dnsCredentials:
|
|
404
|
-
acmeStaging:
|
|
405
|
-
encryptedCert:
|
|
406
|
-
encryptedCertKey:
|
|
407
|
-
});
|
|
408
|
-
var SettingsPrivateSchema =
|
|
409
|
-
aiProviders:
|
|
410
|
-
scenarios:
|
|
566
|
+
globalDocsPath: z6.string().max(4096).optional()
|
|
567
|
+
});
|
|
568
|
+
var TraefikConfigSchema = z6.object({
|
|
569
|
+
enabled: z6.boolean().default(false),
|
|
570
|
+
acmeEmail: z6.string().email().max(256).optional(),
|
|
571
|
+
wildcardDomain: z6.string().max(253).optional(),
|
|
572
|
+
httpPort: z6.number().int().min(1).max(65535).default(80),
|
|
573
|
+
httpsPort: z6.number().int().min(1).max(65535).default(443),
|
|
574
|
+
dnsProvider: z6.string().max(64).optional(),
|
|
575
|
+
dnsCredentials: z6.record(z6.string().max(64), z6.string().max(2048)).default({}),
|
|
576
|
+
acmeStaging: z6.boolean().default(false),
|
|
577
|
+
encryptedCert: z6.string().max(65536).optional(),
|
|
578
|
+
encryptedCertKey: z6.string().max(65536).optional()
|
|
579
|
+
});
|
|
580
|
+
var SettingsPrivateSchema = z6.object({
|
|
581
|
+
aiProviders: z6.array(AIProviderSchema).max(50).default([]),
|
|
582
|
+
scenarios: z6.array(ScenarioSchema).max(100).default([]),
|
|
411
583
|
notifications: NotificationPreferencesSchema.default(() => ({
|
|
412
584
|
scenario_waiting_input: true,
|
|
413
585
|
ai_conversation_complete: true,
|
|
@@ -421,57 +593,57 @@ var SettingsPrivateSchema = z5.object({
|
|
|
421
593
|
})),
|
|
422
594
|
traefikConfig: TraefikConfigSchema.optional()
|
|
423
595
|
});
|
|
424
|
-
var SchemaVersionSchema =
|
|
425
|
-
version:
|
|
426
|
-
migratedAt:
|
|
596
|
+
var SchemaVersionSchema = z6.object({
|
|
597
|
+
version: z6.number().int().positive(),
|
|
598
|
+
migratedAt: z6.coerce.date()
|
|
427
599
|
});
|
|
428
600
|
|
|
429
601
|
// ../../packages/shared/src/schemas/log-source.schema.ts
|
|
430
|
-
import { z as
|
|
431
|
-
var safePath =
|
|
602
|
+
import { z as z7 } from "zod";
|
|
603
|
+
var safePath = z7.string().min(1).max(4096).refine(
|
|
432
604
|
(p) => !p.includes("\0"),
|
|
433
605
|
{ message: "path must not contain null bytes" }
|
|
434
606
|
).refine(
|
|
435
607
|
(p) => !/(^|[/\\])\.\.([/\\]|$)/.test(p),
|
|
436
608
|
{ message: "path must not contain path-traversal sequences (..)" }
|
|
437
609
|
);
|
|
438
|
-
var ConsoleLogSourceSchema =
|
|
439
|
-
type:
|
|
610
|
+
var ConsoleLogSourceSchema = z7.object({
|
|
611
|
+
type: z7.literal("console")
|
|
440
612
|
});
|
|
441
|
-
var FileLogSourceSchema =
|
|
442
|
-
type:
|
|
613
|
+
var FileLogSourceSchema = z7.object({
|
|
614
|
+
type: z7.literal("file"),
|
|
443
615
|
path: safePath,
|
|
444
|
-
encoding:
|
|
445
|
-
startFromEnd:
|
|
446
|
-
createIfNotExists:
|
|
616
|
+
encoding: z7.string().max(32).default("utf-8"),
|
|
617
|
+
startFromEnd: z7.boolean().default(true),
|
|
618
|
+
createIfNotExists: z7.boolean().default(false)
|
|
447
619
|
});
|
|
448
|
-
var MongoLogSourceSchema =
|
|
449
|
-
type:
|
|
620
|
+
var MongoLogSourceSchema = z7.object({
|
|
621
|
+
type: z7.literal("mongo"),
|
|
450
622
|
/** @sensitive — stored encrypted (AES-256-GCM) on disk */
|
|
451
|
-
connectionString:
|
|
452
|
-
database:
|
|
453
|
-
collection:
|
|
454
|
-
filter:
|
|
455
|
-
timestampField:
|
|
456
|
-
messageField:
|
|
457
|
-
levelField:
|
|
458
|
-
});
|
|
459
|
-
var MySQLLogSourceSchema =
|
|
460
|
-
type:
|
|
461
|
-
host:
|
|
462
|
-
port:
|
|
463
|
-
user:
|
|
623
|
+
connectionString: z7.string().min(1).max(2048),
|
|
624
|
+
database: z7.string().min(1).max(256),
|
|
625
|
+
collection: z7.string().min(1).max(256),
|
|
626
|
+
filter: z7.record(z7.string(), z7.unknown()).optional(),
|
|
627
|
+
timestampField: z7.string().max(128).default("timestamp"),
|
|
628
|
+
messageField: z7.string().max(128).default("message"),
|
|
629
|
+
levelField: z7.string().max(128).optional()
|
|
630
|
+
});
|
|
631
|
+
var MySQLLogSourceSchema = z7.object({
|
|
632
|
+
type: z7.literal("mysql"),
|
|
633
|
+
host: z7.string().min(1).max(253),
|
|
634
|
+
port: z7.number().int().min(1).max(65535).default(3306),
|
|
635
|
+
user: z7.string().min(1).max(256),
|
|
464
636
|
/** @sensitive — stored encrypted (AES-256-GCM) on disk */
|
|
465
|
-
password:
|
|
466
|
-
database:
|
|
467
|
-
table:
|
|
468
|
-
query:
|
|
469
|
-
timestampColumn:
|
|
470
|
-
messageColumn:
|
|
471
|
-
levelColumn:
|
|
472
|
-
pollIntervalMs:
|
|
473
|
-
});
|
|
474
|
-
var LogSourceConfigSchema =
|
|
637
|
+
password: z7.string().max(2048),
|
|
638
|
+
database: z7.string().min(1).max(256),
|
|
639
|
+
table: z7.string().min(1).max(256),
|
|
640
|
+
query: z7.string().max(8192).optional(),
|
|
641
|
+
timestampColumn: z7.string().max(128).default("created_at"),
|
|
642
|
+
messageColumn: z7.string().max(128).default("message"),
|
|
643
|
+
levelColumn: z7.string().max(128).optional(),
|
|
644
|
+
pollIntervalMs: z7.number().int().min(500).max(6e4).default(2e3)
|
|
645
|
+
});
|
|
646
|
+
var LogSourceConfigSchema = z7.discriminatedUnion("type", [
|
|
475
647
|
ConsoleLogSourceSchema,
|
|
476
648
|
FileLogSourceSchema,
|
|
477
649
|
MongoLogSourceSchema,
|
|
@@ -479,293 +651,293 @@ var LogSourceConfigSchema = z6.discriminatedUnion("type", [
|
|
|
479
651
|
]);
|
|
480
652
|
|
|
481
653
|
// ../../packages/shared/src/schemas/service.schema.ts
|
|
482
|
-
var HealthCheckSchema =
|
|
483
|
-
type:
|
|
654
|
+
var HealthCheckSchema = z8.object({
|
|
655
|
+
type: z8.enum(["http", "command"]).default("http"),
|
|
484
656
|
// HTTP-specific (required when type=http)
|
|
485
|
-
path:
|
|
486
|
-
method:
|
|
487
|
-
expectedStatus:
|
|
657
|
+
path: z8.string().min(1).max(500).startsWith("/").optional(),
|
|
658
|
+
method: z8.enum(["GET", "HEAD", "POST", "PUT"]).optional().default("GET"),
|
|
659
|
+
expectedStatus: z8.number().int().min(100).max(599).optional().default(200),
|
|
488
660
|
// Command-specific (required when type=command)
|
|
489
|
-
command:
|
|
661
|
+
command: z8.string().min(1).max(4096).optional(),
|
|
490
662
|
// Shared
|
|
491
|
-
interval:
|
|
492
|
-
timeout:
|
|
493
|
-
retries:
|
|
494
|
-
initialDelay:
|
|
663
|
+
interval: z8.number().int().positive().default(1e3),
|
|
664
|
+
timeout: z8.number().int().positive().default(1e3),
|
|
665
|
+
retries: z8.number().int().nonnegative().default(3),
|
|
666
|
+
initialDelay: z8.number().int().nonnegative().optional().default(0)
|
|
495
667
|
}).refine(
|
|
496
668
|
(data) => data.type === "http" ? !!data.path : !!data.command,
|
|
497
669
|
{ message: "HTTP type requires path; command type requires command" }
|
|
498
670
|
);
|
|
499
|
-
var BootstrapCommandSchema =
|
|
500
|
-
id:
|
|
501
|
-
label:
|
|
502
|
-
entrypoint:
|
|
503
|
-
command:
|
|
504
|
-
user:
|
|
505
|
-
});
|
|
506
|
-
var DockerConfigSchema =
|
|
671
|
+
var BootstrapCommandSchema = z8.object({
|
|
672
|
+
id: z8.string().min(1).max(64),
|
|
673
|
+
label: z8.string().max(200).default(""),
|
|
674
|
+
entrypoint: z8.string().max(4096).optional(),
|
|
675
|
+
command: z8.string().max(4096).default(""),
|
|
676
|
+
user: z8.string().max(256).optional()
|
|
677
|
+
});
|
|
678
|
+
var DockerConfigSchema = z8.object({
|
|
507
679
|
// Image mode (pull from registry) — mutually exclusive with build mode in UI
|
|
508
|
-
image:
|
|
680
|
+
image: z8.string().min(1).max(1024).optional(),
|
|
509
681
|
// Build mode — Dockerfile stored inline in services.json
|
|
510
|
-
dockerfile:
|
|
511
|
-
buildContext:
|
|
512
|
-
buildArgs:
|
|
682
|
+
dockerfile: z8.string().max(65536).optional(),
|
|
683
|
+
buildContext: z8.string().max(4096).optional(),
|
|
684
|
+
buildArgs: z8.record(z8.string().max(256), z8.string().max(4096)).default({}).refine(
|
|
513
685
|
(obj) => Object.keys(obj).length <= 50,
|
|
514
686
|
{ message: "Max 50 build args" }
|
|
515
687
|
),
|
|
516
|
-
targetStage:
|
|
688
|
+
targetStage: z8.string().max(256).optional(),
|
|
517
689
|
// Runtime config
|
|
518
|
-
networkMode:
|
|
519
|
-
ports:
|
|
520
|
-
volumes:
|
|
521
|
-
mountRootpath:
|
|
522
|
-
entrypoint:
|
|
523
|
-
command:
|
|
524
|
-
user:
|
|
525
|
-
useNativeCommand:
|
|
526
|
-
nativeCommandMode:
|
|
527
|
-
nativeShell:
|
|
528
|
-
bootstrapCommands:
|
|
529
|
-
});
|
|
530
|
-
var RestartStrategySchema =
|
|
531
|
-
var ServiceShortcutSchema =
|
|
532
|
-
id:
|
|
533
|
-
label:
|
|
534
|
-
command:
|
|
535
|
-
cwd:
|
|
536
|
-
});
|
|
537
|
-
var ServiceCommandSchema =
|
|
538
|
-
id:
|
|
539
|
-
label:
|
|
540
|
-
command:
|
|
541
|
-
cwd:
|
|
542
|
-
shell:
|
|
543
|
-
});
|
|
544
|
-
var VariableSlotSchema =
|
|
545
|
-
value:
|
|
546
|
-
pre:
|
|
547
|
-
post:
|
|
548
|
-
isSecret:
|
|
690
|
+
networkMode: z8.enum(["host", "bridge"]).default("host"),
|
|
691
|
+
ports: z8.array(z8.string().max(64)).max(100).default([]),
|
|
692
|
+
volumes: z8.array(z8.string().max(1024)).max(100).default([]),
|
|
693
|
+
mountRootpath: z8.boolean().default(false),
|
|
694
|
+
entrypoint: z8.string().max(4096).optional(),
|
|
695
|
+
command: z8.string().max(4096).optional(),
|
|
696
|
+
user: z8.string().max(256).optional(),
|
|
697
|
+
useNativeCommand: z8.boolean().default(false),
|
|
698
|
+
nativeCommandMode: z8.enum(["shared", "isolated"]).default("isolated"),
|
|
699
|
+
nativeShell: z8.string().max(256).default("sh"),
|
|
700
|
+
bootstrapCommands: z8.array(BootstrapCommandSchema).max(20).default([])
|
|
701
|
+
});
|
|
702
|
+
var RestartStrategySchema = z8.enum(["none", "on-failure", "always", "unless-stopped"]).default("none");
|
|
703
|
+
var ServiceShortcutSchema = z8.object({
|
|
704
|
+
id: z8.string().min(1).max(64),
|
|
705
|
+
label: z8.string().max(200).default(""),
|
|
706
|
+
command: z8.string().max(4096).default(""),
|
|
707
|
+
cwd: z8.string().max(4096).optional()
|
|
708
|
+
});
|
|
709
|
+
var ServiceCommandSchema = z8.object({
|
|
710
|
+
id: z8.string().min(1).max(64),
|
|
711
|
+
label: z8.string().max(200).default(""),
|
|
712
|
+
command: z8.string().max(4096).default(""),
|
|
713
|
+
cwd: z8.string().max(4096).optional(),
|
|
714
|
+
shell: z8.boolean().optional().default(true)
|
|
715
|
+
});
|
|
716
|
+
var VariableSlotSchema = z8.object({
|
|
717
|
+
value: z8.string().max(8192).default(""),
|
|
718
|
+
pre: z8.string().max(8192).default(""),
|
|
719
|
+
post: z8.string().max(8192).default(""),
|
|
720
|
+
isSecret: z8.boolean().default(false),
|
|
549
721
|
// When true, this variable is injected into the process environment of AI
|
|
550
722
|
// agents (Claude Code, Codex, …) spawned while this environment is active.
|
|
551
723
|
// Opt-in: defaults to false so secrets are never leaked to AI agents by default.
|
|
552
|
-
injectIntoAi:
|
|
724
|
+
injectIntoAi: z8.boolean().default(false)
|
|
553
725
|
});
|
|
554
|
-
var VariableSchema =
|
|
555
|
-
key:
|
|
726
|
+
var VariableSchema = z8.object({
|
|
727
|
+
key: z8.string().min(1).max(256),
|
|
556
728
|
value: VariableSlotSchema
|
|
557
729
|
});
|
|
558
|
-
var VariablesRecordSchema =
|
|
559
|
-
|
|
730
|
+
var VariablesRecordSchema = z8.record(
|
|
731
|
+
z8.string().max(128),
|
|
560
732
|
VariableSchema
|
|
561
733
|
).refine(
|
|
562
734
|
(obj) => Object.keys(obj).length <= 200,
|
|
563
735
|
{ message: "Max 200 variables" }
|
|
564
736
|
);
|
|
565
|
-
var VariableSlotsRecordSchema =
|
|
566
|
-
|
|
737
|
+
var VariableSlotsRecordSchema = z8.record(
|
|
738
|
+
z8.string().max(256),
|
|
567
739
|
VariableSlotSchema
|
|
568
740
|
).refine(
|
|
569
741
|
(obj) => Object.keys(obj).length <= 200,
|
|
570
742
|
{ message: "Max 200 variable slots" }
|
|
571
743
|
);
|
|
572
|
-
var ServiceConfigSchema =
|
|
573
|
-
id:
|
|
574
|
-
orgId:
|
|
575
|
-
agentId:
|
|
744
|
+
var ServiceConfigSchema = z8.object({
|
|
745
|
+
id: z8.string().max(128),
|
|
746
|
+
orgId: z8.string().max(128).nullable().optional(),
|
|
747
|
+
agentId: z8.string().max(128).optional(),
|
|
576
748
|
// Optional: if absent, inherited from active environment's agentId
|
|
577
|
-
name:
|
|
578
|
-
commands:
|
|
579
|
-
cwd:
|
|
580
|
-
ports:
|
|
749
|
+
name: z8.string().min(1).max(200),
|
|
750
|
+
commands: z8.array(ServiceCommandSchema).max(50).optional().default([]),
|
|
751
|
+
cwd: z8.string().max(4096).optional(),
|
|
752
|
+
ports: z8.array(z8.number().int().positive().max(65535)).max(20).optional().default([]),
|
|
581
753
|
// Metadata fields (migration from old Runeya)
|
|
582
|
-
groups:
|
|
583
|
-
description:
|
|
754
|
+
groups: z8.array(z8.string().max(200)).max(20).optional().default([]),
|
|
755
|
+
description: z8.string().max(2e3).optional(),
|
|
584
756
|
/** Path (relative to service.cwd or absolute) where the service's docs/wiki markdown files live. Optional — defaults to service.cwd. */
|
|
585
|
-
docsPath:
|
|
586
|
-
url:
|
|
587
|
-
localUrls:
|
|
588
|
-
url:
|
|
589
|
-
port:
|
|
757
|
+
docsPath: z8.string().max(4096).optional(),
|
|
758
|
+
url: z8.string().max(2048).optional(),
|
|
759
|
+
localUrls: z8.array(z8.object({
|
|
760
|
+
url: z8.string().max(253).regex(/^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/),
|
|
761
|
+
port: z8.number().int().min(1).max(65535)
|
|
590
762
|
})).max(20).optional().default([]),
|
|
591
|
-
openapiUrl:
|
|
592
|
-
git:
|
|
593
|
-
remote:
|
|
594
|
-
home:
|
|
763
|
+
openapiUrl: z8.string().max(2048).optional(),
|
|
764
|
+
git: z8.object({
|
|
765
|
+
remote: z8.string().max(2048).optional(),
|
|
766
|
+
home: z8.string().max(2048).optional()
|
|
595
767
|
}).optional(),
|
|
596
|
-
meta:
|
|
768
|
+
meta: z8.record(z8.string().max(256), z8.string().max(2e3)).optional().refine((obj) => !obj || Object.keys(obj).length <= 100, { message: "Too many meta keys (max 100)" }),
|
|
597
769
|
// Transient env dict (resolved by server before deployment, used directly by agent runner — NOT persisted)
|
|
598
|
-
env:
|
|
770
|
+
env: z8.record(z8.string().max(256), z8.string().max(8192)).default({}).refine(
|
|
599
771
|
(obj) => Object.keys(obj).length <= 200,
|
|
600
772
|
{ message: "Too many env vars (max 200)" }
|
|
601
773
|
),
|
|
602
|
-
envSecrets:
|
|
774
|
+
envSecrets: z8.array(z8.string().max(256)).max(200).default([]),
|
|
603
775
|
// Transient: resolved JS log parsers (from parserIds, resolved by server before deployment — NOT persisted)
|
|
604
|
-
resolvedLogParsers:
|
|
776
|
+
resolvedLogParsers: z8.array(JSLogParserSchema).default([]).optional(),
|
|
605
777
|
// Transient: resolved working directory (cwd with env vars expanded — NOT persisted)
|
|
606
|
-
resolvedCwd:
|
|
607
|
-
runner:
|
|
778
|
+
resolvedCwd: z8.string().optional(),
|
|
779
|
+
runner: z8.enum(["native", "docker"]).optional().default("native"),
|
|
608
780
|
dockerConfig: DockerConfigSchema.optional(),
|
|
609
781
|
healthCheck: HealthCheckSchema.optional(),
|
|
610
|
-
parserIds:
|
|
611
|
-
shortcuts:
|
|
612
|
-
autoRestart:
|
|
613
|
-
clearLogsOnStart:
|
|
782
|
+
parserIds: z8.array(z8.string().max(128)).max(50).default([]),
|
|
783
|
+
shortcuts: z8.array(ServiceShortcutSchema).max(50).optional().default([]),
|
|
784
|
+
autoRestart: z8.boolean().optional().default(false),
|
|
785
|
+
clearLogsOnStart: z8.boolean().optional().default(false),
|
|
614
786
|
restartStrategy: RestartStrategySchema.optional(),
|
|
615
|
-
maxRestarts:
|
|
616
|
-
restartBackoffMs:
|
|
787
|
+
maxRestarts: z8.number().int().nonnegative().optional(),
|
|
788
|
+
restartBackoffMs: z8.number().int().positive().optional().default(1e3),
|
|
617
789
|
// Log sources additionnelles (au-delà du stdout/stderr console par défaut)
|
|
618
|
-
logSources:
|
|
790
|
+
logSources: z8.array(LogSourceConfigSchema).max(20).optional().default([])
|
|
619
791
|
});
|
|
620
792
|
var CreateServiceSchema = ServiceConfigSchema.omit({ id: true }).partial().required({ name: true });
|
|
621
793
|
var UpdateServiceSchema = ServiceConfigSchema.partial().required({ id: true }).extend({
|
|
622
|
-
agentId:
|
|
794
|
+
agentId: z8.string().max(128).nullable().optional(),
|
|
623
795
|
// null = clear (inherit from env), undefined = no change
|
|
624
|
-
cwd:
|
|
625
|
-
git:
|
|
626
|
-
meta:
|
|
796
|
+
cwd: z8.string().max(4096).nullable().optional(),
|
|
797
|
+
git: z8.object({ remote: z8.string().max(2048).optional(), home: z8.string().max(2048).optional() }).nullable().optional(),
|
|
798
|
+
meta: z8.record(z8.string().max(256), z8.string().max(2e3)).nullable().optional().refine((obj) => !obj || Object.keys(obj).length <= 100, { message: "Too many meta keys (max 100)" }),
|
|
627
799
|
healthCheck: HealthCheckSchema.nullable().optional()
|
|
628
800
|
});
|
|
629
801
|
|
|
630
802
|
// ../../packages/shared/src/schemas/process.schema.ts
|
|
631
|
-
import { z as
|
|
632
|
-
var ProcessStateSchema =
|
|
633
|
-
var HealthStatusSchema =
|
|
634
|
-
var ProcessStatusSchema =
|
|
635
|
-
id:
|
|
636
|
-
serviceId:
|
|
637
|
-
agentId:
|
|
803
|
+
import { z as z9 } from "zod";
|
|
804
|
+
var ProcessStateSchema = z9.enum(["starting", "running", "stopped", "errored"]);
|
|
805
|
+
var HealthStatusSchema = z9.enum(["healthy", "unhealthy", "unknown"]);
|
|
806
|
+
var ProcessStatusSchema = z9.object({
|
|
807
|
+
id: z9.string().max(128),
|
|
808
|
+
serviceId: z9.string().max(128),
|
|
809
|
+
agentId: z9.string().max(128),
|
|
638
810
|
state: ProcessStateSchema,
|
|
639
|
-
pid:
|
|
640
|
-
pids:
|
|
641
|
-
exitCode:
|
|
642
|
-
startedAt:
|
|
643
|
-
restartCount:
|
|
644
|
-
uptime:
|
|
811
|
+
pid: z9.number().int().nullable().optional(),
|
|
812
|
+
pids: z9.array(z9.number().int()).optional().default([]),
|
|
813
|
+
exitCode: z9.number().int().nullable().optional(),
|
|
814
|
+
startedAt: z9.coerce.date().nullable().optional(),
|
|
815
|
+
restartCount: z9.number().int().nonnegative().default(0),
|
|
816
|
+
uptime: z9.number().nonnegative().default(0),
|
|
645
817
|
healthStatus: HealthStatusSchema.default("unknown")
|
|
646
818
|
});
|
|
647
819
|
|
|
648
820
|
// ../../packages/shared/src/schemas/log.schema.ts
|
|
649
|
-
import { z as
|
|
650
|
-
var LogLevelSchema =
|
|
651
|
-
var LogLineSchema =
|
|
821
|
+
import { z as z10 } from "zod";
|
|
822
|
+
var LogLevelSchema = z10.enum(["debug", "info", "warn", "error", "fatal"]);
|
|
823
|
+
var LogLineSchema = z10.object({
|
|
652
824
|
/** Raw log line as received from the process (immutable context) */
|
|
653
|
-
raw:
|
|
825
|
+
raw: z10.string(),
|
|
654
826
|
/** Source stream (immutable context) */
|
|
655
|
-
stream:
|
|
827
|
+
stream: z10.enum(["stdout", "stderr"]),
|
|
656
828
|
/** Severity level */
|
|
657
829
|
level: LogLevelSchema,
|
|
658
830
|
/** Parsed/enriched message to display */
|
|
659
|
-
message:
|
|
831
|
+
message: z10.string(),
|
|
660
832
|
/** When true, the line is hidden from the log view */
|
|
661
|
-
hidden:
|
|
833
|
+
hidden: z10.boolean(),
|
|
662
834
|
/** Arbitrary key/value pairs shown in the detail panel */
|
|
663
|
-
metadata:
|
|
835
|
+
metadata: z10.record(z10.string().max(256), z10.unknown()).refine(
|
|
664
836
|
(obj) => Object.keys(obj).length <= 100,
|
|
665
837
|
{ message: "Too many metadata keys (max 100)" }
|
|
666
838
|
),
|
|
667
839
|
/** Full parsed JSON object when the line is JSON */
|
|
668
|
-
json:
|
|
840
|
+
json: z10.record(z10.string(), z10.unknown()).optional(),
|
|
669
841
|
/** Custom header for the JSON log card (supports HTML, sanitized before display) */
|
|
670
|
-
jsonHeader:
|
|
842
|
+
jsonHeader: z10.string().max(256).optional()
|
|
671
843
|
});
|
|
672
|
-
var LogCardDirectiveSchema =
|
|
673
|
-
id:
|
|
674
|
-
type:
|
|
675
|
-
header:
|
|
676
|
-
collapsable:
|
|
677
|
-
collapsed:
|
|
678
|
-
state:
|
|
844
|
+
var LogCardDirectiveSchema = z10.object({
|
|
845
|
+
id: z10.string().max(128),
|
|
846
|
+
type: z10.string().max(64),
|
|
847
|
+
header: z10.string().max(256),
|
|
848
|
+
collapsable: z10.boolean().optional(),
|
|
849
|
+
collapsed: z10.boolean().optional(),
|
|
850
|
+
state: z10.enum(["open", "append", "close", "self"])
|
|
679
851
|
});
|
|
680
|
-
var ParsedLogSchema =
|
|
681
|
-
id:
|
|
682
|
-
processId:
|
|
683
|
-
pid:
|
|
684
|
-
timestamp:
|
|
852
|
+
var ParsedLogSchema = z10.object({
|
|
853
|
+
id: z10.string().max(128),
|
|
854
|
+
processId: z10.string().max(128),
|
|
855
|
+
pid: z10.number().int().nullable().optional(),
|
|
856
|
+
timestamp: z10.coerce.date(),
|
|
685
857
|
level: LogLevelSchema.default("info"),
|
|
686
|
-
message:
|
|
687
|
-
raw:
|
|
688
|
-
stream:
|
|
689
|
-
hidden:
|
|
690
|
-
metadata:
|
|
858
|
+
message: z10.string().max(16384),
|
|
859
|
+
raw: z10.string().max(16384),
|
|
860
|
+
stream: z10.enum(["stdout", "stderr"]).default("stdout"),
|
|
861
|
+
hidden: z10.boolean().optional().default(false),
|
|
862
|
+
metadata: z10.record(z10.string().max(256), z10.unknown()).optional().refine(
|
|
691
863
|
(obj) => !obj || Object.keys(obj).length <= 100,
|
|
692
864
|
{ message: "Too many metadata keys (max 100)" }
|
|
693
865
|
),
|
|
694
|
-
json:
|
|
866
|
+
json: z10.record(z10.string(), z10.unknown()).optional(),
|
|
695
867
|
logCard: LogCardDirectiveSchema.optional(),
|
|
696
|
-
sourceType:
|
|
697
|
-
sourcePath:
|
|
868
|
+
sourceType: z10.enum(["console", "file", "mongo", "mysql"]).optional(),
|
|
869
|
+
sourcePath: z10.string().max(4096).optional()
|
|
698
870
|
});
|
|
699
871
|
|
|
700
872
|
// ../../packages/shared/src/schemas/agent.schema.ts
|
|
701
|
-
import { z as
|
|
873
|
+
import { z as z11 } from "zod";
|
|
702
874
|
var ENV_VAR_NAME_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
703
|
-
var AgentConfigSchema =
|
|
704
|
-
id:
|
|
705
|
-
name:
|
|
706
|
-
url:
|
|
707
|
-
passphrase:
|
|
708
|
-
passthroughEnv:
|
|
709
|
-
|
|
875
|
+
var AgentConfigSchema = z11.object({
|
|
876
|
+
id: z11.string().max(128),
|
|
877
|
+
name: z11.string().min(1).max(100),
|
|
878
|
+
url: z11.string().url().max(2048),
|
|
879
|
+
passphrase: z11.string().min(1).max(1024),
|
|
880
|
+
passthroughEnv: z11.array(
|
|
881
|
+
z11.string().regex(ENV_VAR_NAME_REGEX).max(256)
|
|
710
882
|
).max(100).default([])
|
|
711
883
|
});
|
|
712
|
-
var AgentStatusSchema =
|
|
713
|
-
connected:
|
|
714
|
-
lastSeen:
|
|
715
|
-
uptime:
|
|
716
|
-
runnersAvailable:
|
|
717
|
-
lanIp:
|
|
884
|
+
var AgentStatusSchema = z11.object({
|
|
885
|
+
connected: z11.boolean(),
|
|
886
|
+
lastSeen: z11.string().nullable().optional(),
|
|
887
|
+
uptime: z11.number().nonnegative().default(0),
|
|
888
|
+
runnersAvailable: z11.array(z11.enum(["native", "docker"])).default(["native"]),
|
|
889
|
+
lanIp: z11.string().optional()
|
|
718
890
|
});
|
|
719
891
|
|
|
720
892
|
// ../../packages/shared/src/schemas/permission.schema.ts
|
|
721
|
-
import { z as
|
|
722
|
-
var GlobalRoleSchema =
|
|
723
|
-
var ProjectRoleSchema =
|
|
724
|
-
var ProjectMemberRoleSchema =
|
|
725
|
-
id:
|
|
726
|
-
projectId:
|
|
727
|
-
userId:
|
|
893
|
+
import { z as z12 } from "zod";
|
|
894
|
+
var GlobalRoleSchema = z12.enum(["owner", "admin", "member"]);
|
|
895
|
+
var ProjectRoleSchema = z12.enum(["admin", "editor", "viewer"]);
|
|
896
|
+
var ProjectMemberRoleSchema = z12.object({
|
|
897
|
+
id: z12.string().max(128),
|
|
898
|
+
projectId: z12.string().max(128),
|
|
899
|
+
userId: z12.string().max(128),
|
|
728
900
|
role: ProjectRoleSchema
|
|
729
901
|
});
|
|
730
902
|
|
|
731
903
|
// ../../packages/shared/src/schemas/sync.schema.ts
|
|
732
|
-
import { z as
|
|
733
|
-
var ConfigVersionSchema =
|
|
734
|
-
id:
|
|
735
|
-
entityType:
|
|
736
|
-
entityId:
|
|
737
|
-
version:
|
|
738
|
-
parentVersion:
|
|
739
|
-
data:
|
|
904
|
+
import { z as z13 } from "zod";
|
|
905
|
+
var ConfigVersionSchema = z13.object({
|
|
906
|
+
id: z13.string().max(128),
|
|
907
|
+
entityType: z13.enum(["project", "service"]),
|
|
908
|
+
entityId: z13.string().max(128),
|
|
909
|
+
version: z13.string().max(128),
|
|
910
|
+
parentVersion: z13.string().max(128),
|
|
911
|
+
data: z13.record(z13.string(), z13.unknown()).refine(
|
|
740
912
|
(obj) => Object.keys(obj).length <= 1e3,
|
|
741
913
|
"Too many data keys (max 1000)"
|
|
742
914
|
),
|
|
743
|
-
patch:
|
|
744
|
-
userId:
|
|
745
|
-
timestamp:
|
|
746
|
-
resolved:
|
|
747
|
-
});
|
|
748
|
-
var ConfigChangeSchema =
|
|
749
|
-
entityType:
|
|
750
|
-
entityId:
|
|
751
|
-
version:
|
|
752
|
-
parentVersion:
|
|
753
|
-
data:
|
|
915
|
+
patch: z13.array(z13.record(z13.string(), z13.unknown())).max(1e3),
|
|
916
|
+
userId: z13.string().max(128),
|
|
917
|
+
timestamp: z13.coerce.date(),
|
|
918
|
+
resolved: z13.boolean().default(false)
|
|
919
|
+
});
|
|
920
|
+
var ConfigChangeSchema = z13.object({
|
|
921
|
+
entityType: z13.enum(["project", "service"]),
|
|
922
|
+
entityId: z13.string().max(128),
|
|
923
|
+
version: z13.string().max(128),
|
|
924
|
+
parentVersion: z13.string().max(128),
|
|
925
|
+
data: z13.record(z13.string(), z13.unknown()).refine(
|
|
754
926
|
(obj) => Object.keys(obj).length <= 1e3,
|
|
755
927
|
"Too many data keys (max 1000)"
|
|
756
928
|
),
|
|
757
|
-
patch:
|
|
929
|
+
patch: z13.array(z13.record(z13.string(), z13.unknown())).max(1e3)
|
|
758
930
|
});
|
|
759
|
-
var SyncStatusSchema =
|
|
760
|
-
connected:
|
|
761
|
-
lastSync:
|
|
762
|
-
pendingChanges:
|
|
763
|
-
conflicts:
|
|
931
|
+
var SyncStatusSchema = z13.object({
|
|
932
|
+
connected: z13.boolean(),
|
|
933
|
+
lastSync: z13.coerce.date().nullable().optional(),
|
|
934
|
+
pendingChanges: z13.number().int().nonnegative().default(0),
|
|
935
|
+
conflicts: z13.number().int().nonnegative().default(0)
|
|
764
936
|
});
|
|
765
937
|
|
|
766
938
|
// ../../packages/shared/src/schemas/audit.schema.ts
|
|
767
|
-
import { z as
|
|
768
|
-
var AuditActionSchema =
|
|
939
|
+
import { z as z14 } from "zod";
|
|
940
|
+
var AuditActionSchema = z14.enum([
|
|
769
941
|
"create",
|
|
770
942
|
"update",
|
|
771
943
|
"delete",
|
|
@@ -776,112 +948,122 @@ var AuditActionSchema = z13.enum([
|
|
|
776
948
|
"stop",
|
|
777
949
|
"roleChange"
|
|
778
950
|
]);
|
|
779
|
-
var AuditEntityTypeSchema =
|
|
951
|
+
var AuditEntityTypeSchema = z14.enum([
|
|
780
952
|
"org",
|
|
781
953
|
"project",
|
|
782
954
|
"service",
|
|
783
955
|
"member",
|
|
784
956
|
"permission"
|
|
785
957
|
]);
|
|
786
|
-
var AuditLogSchema =
|
|
787
|
-
id:
|
|
788
|
-
orgId:
|
|
789
|
-
userId:
|
|
958
|
+
var AuditLogSchema = z14.object({
|
|
959
|
+
id: z14.string().max(128),
|
|
960
|
+
orgId: z14.string().max(128),
|
|
961
|
+
userId: z14.string().max(128),
|
|
790
962
|
action: AuditActionSchema,
|
|
791
963
|
entityType: AuditEntityTypeSchema,
|
|
792
|
-
entityId:
|
|
793
|
-
metadata:
|
|
964
|
+
entityId: z14.string().max(128),
|
|
965
|
+
metadata: z14.record(z14.string().max(256), z14.unknown()).default({}).refine(
|
|
794
966
|
(obj) => Object.keys(obj).length <= 100,
|
|
795
967
|
{ message: "Too many metadata keys (max 100)" }
|
|
796
968
|
),
|
|
797
|
-
timestamp:
|
|
969
|
+
timestamp: z14.coerce.date()
|
|
798
970
|
});
|
|
799
971
|
|
|
800
972
|
// ../../packages/shared/src/schemas/metrics.schema.ts
|
|
801
|
-
import { z as
|
|
802
|
-
var ProcessMetricsSchema =
|
|
803
|
-
processId:
|
|
804
|
-
cpu:
|
|
805
|
-
memory:
|
|
806
|
-
timestamp:
|
|
973
|
+
import { z as z15 } from "zod";
|
|
974
|
+
var ProcessMetricsSchema = z15.object({
|
|
975
|
+
processId: z15.string().max(128),
|
|
976
|
+
cpu: z15.number().nonnegative(),
|
|
977
|
+
memory: z15.number().int().nonnegative(),
|
|
978
|
+
timestamp: z15.string()
|
|
807
979
|
});
|
|
808
980
|
|
|
809
981
|
// ../../packages/shared/src/schemas/environment.schema.ts
|
|
810
|
-
import { z as
|
|
811
|
-
var EnvironmentVariablesSchema =
|
|
812
|
-
|
|
982
|
+
import { z as z16 } from "zod";
|
|
983
|
+
var EnvironmentVariablesSchema = z16.record(
|
|
984
|
+
z16.string().max(256),
|
|
813
985
|
VariableSchema
|
|
814
986
|
).refine(
|
|
815
987
|
(obj) => Object.keys(obj).length <= 200,
|
|
816
988
|
{ message: "Max 200 variables" }
|
|
817
989
|
);
|
|
818
|
-
var EnvironmentSchema =
|
|
819
|
-
id:
|
|
820
|
-
projectId:
|
|
821
|
-
name:
|
|
822
|
-
description:
|
|
823
|
-
parentIds:
|
|
990
|
+
var EnvironmentSchema = z16.object({
|
|
991
|
+
id: z16.string().max(128),
|
|
992
|
+
projectId: z16.string().max(128),
|
|
993
|
+
name: z16.string().min(1).max(200),
|
|
994
|
+
description: z16.string().max(2e3).optional().default(""),
|
|
995
|
+
parentIds: z16.array(z16.string().max(128)).max(10).default([]),
|
|
824
996
|
variables: EnvironmentVariablesSchema.default({}),
|
|
825
997
|
// Scope: 'global' = project-level env, 'service' = per-service env
|
|
826
|
-
scope:
|
|
998
|
+
scope: z16.enum(["global", "service"]).default("global"),
|
|
827
999
|
// When scope='service': the serviceId this env belongs to
|
|
828
|
-
reference:
|
|
1000
|
+
reference: z16.string().max(128).optional(),
|
|
829
1001
|
// When scope='service': the globalEnvId this env activates on
|
|
830
|
-
activateOn:
|
|
831
|
-
immutable:
|
|
832
|
-
default:
|
|
833
|
-
color:
|
|
834
|
-
bgColor:
|
|
1002
|
+
activateOn: z16.string().max(128).optional(),
|
|
1003
|
+
immutable: z16.boolean().default(false),
|
|
1004
|
+
default: z16.boolean().optional().default(false),
|
|
1005
|
+
color: z16.string().max(20).optional(),
|
|
1006
|
+
bgColor: z16.string().max(20).optional(),
|
|
835
1007
|
// When scope='global': the default agent used by services that don't have an explicit agentId
|
|
836
|
-
agentId:
|
|
837
|
-
});
|
|
838
|
-
var ResolvedEnvironmentSchema =
|
|
839
|
-
variables:
|
|
840
|
-
env:
|
|
841
|
-
envSecrets:
|
|
842
|
-
sources:
|
|
843
|
-
environmentId:
|
|
844
|
-
environmentName:
|
|
845
|
-
overridden:
|
|
846
|
-
resolvedFrom:
|
|
847
|
-
environmentId:
|
|
848
|
-
environmentName:
|
|
1008
|
+
agentId: z16.string().max(128).optional()
|
|
1009
|
+
});
|
|
1010
|
+
var ResolvedEnvironmentSchema = z16.object({
|
|
1011
|
+
variables: z16.record(z16.string().max(256), VariableSchema).refine((obj) => Object.keys(obj).length <= 500, { message: "Max 500 resolved variables" }),
|
|
1012
|
+
env: z16.record(z16.string().max(256), z16.string().max(8192)).refine((obj) => Object.keys(obj).length <= 500, { message: "Max 500 resolved env vars" }),
|
|
1013
|
+
envSecrets: z16.array(z16.string().max(256)).max(500),
|
|
1014
|
+
sources: z16.record(z16.string().max(256), z16.object({
|
|
1015
|
+
environmentId: z16.string().max(128),
|
|
1016
|
+
environmentName: z16.string().max(200),
|
|
1017
|
+
overridden: z16.boolean(),
|
|
1018
|
+
resolvedFrom: z16.object({
|
|
1019
|
+
environmentId: z16.string().max(128),
|
|
1020
|
+
environmentName: z16.string().max(200)
|
|
1021
|
+
}).optional(),
|
|
1022
|
+
// Set when a machine-local override was applied to this variable, pointing
|
|
1023
|
+
// at the environment that carries the winning override. Distinct from
|
|
1024
|
+
// `overridden`, which also covers "shadows an inherited variable".
|
|
1025
|
+
overriddenBy: z16.object({
|
|
1026
|
+
environmentId: z16.string().max(128),
|
|
1027
|
+
environmentName: z16.string().max(200)
|
|
849
1028
|
}).optional()
|
|
850
1029
|
})).refine((obj) => Object.keys(obj).length <= 500, { message: "Max 500 source entries" })
|
|
851
1030
|
});
|
|
852
1031
|
var CreateEnvironmentSchema = EnvironmentSchema.omit({ id: true }).extend({
|
|
853
|
-
description:
|
|
854
|
-
parentIds:
|
|
1032
|
+
description: z16.string().max(2e3).optional().default(""),
|
|
1033
|
+
parentIds: z16.array(z16.string().max(128)).max(10).optional().default([]),
|
|
855
1034
|
variables: EnvironmentVariablesSchema.optional().default({}),
|
|
856
|
-
scope:
|
|
857
|
-
reference:
|
|
858
|
-
activateOn:
|
|
859
|
-
immutable:
|
|
1035
|
+
scope: z16.enum(["global", "service"]).optional().default("global"),
|
|
1036
|
+
reference: z16.string().max(128).optional(),
|
|
1037
|
+
activateOn: z16.string().max(128).optional(),
|
|
1038
|
+
immutable: z16.boolean().optional().default(false)
|
|
860
1039
|
});
|
|
861
1040
|
var UpdateEnvironmentSchema = EnvironmentSchema.partial().required({ id: true }).extend({
|
|
862
|
-
description:
|
|
863
|
-
parentIds:
|
|
1041
|
+
description: z16.string().max(2e3).optional(),
|
|
1042
|
+
parentIds: z16.array(z16.string().max(128)).max(10).optional(),
|
|
864
1043
|
variables: EnvironmentVariablesSchema.optional(),
|
|
865
|
-
scope:
|
|
866
|
-
immutable:
|
|
867
|
-
default:
|
|
868
|
-
agentId:
|
|
1044
|
+
scope: z16.enum(["global", "service"]).optional(),
|
|
1045
|
+
immutable: z16.boolean().optional(),
|
|
1046
|
+
default: z16.boolean().optional(),
|
|
1047
|
+
agentId: z16.string().max(128).nullable().optional()
|
|
869
1048
|
// null = clear (no default agent)
|
|
870
1049
|
});
|
|
871
1050
|
|
|
872
1051
|
// ../../packages/shared/src/schemas/environment-overrides.schema.ts
|
|
873
|
-
import { z as
|
|
874
|
-
var
|
|
875
|
-
|
|
876
|
-
|
|
1052
|
+
import { z as z17 } from "zod";
|
|
1053
|
+
var VariableOverrideSchema = z17.object({
|
|
1054
|
+
value: VariableSlotSchema
|
|
1055
|
+
});
|
|
1056
|
+
var EnvironmentOverridesSchema = z17.record(
|
|
1057
|
+
z17.string().max(128),
|
|
1058
|
+
VariableOverrideSchema
|
|
877
1059
|
).refine(
|
|
878
1060
|
(obj) => Object.keys(obj).length <= 5e3,
|
|
879
1061
|
{ message: "Max 5000 overrides" }
|
|
880
1062
|
);
|
|
881
1063
|
|
|
882
1064
|
// ../../packages/shared/src/schemas/api-key.schema.ts
|
|
883
|
-
import { z as
|
|
884
|
-
var ApiServiceActionSchema =
|
|
1065
|
+
import { z as z18 } from "zod";
|
|
1066
|
+
var ApiServiceActionSchema = z18.enum([
|
|
885
1067
|
"service:read",
|
|
886
1068
|
"service:start",
|
|
887
1069
|
"service:stop",
|
|
@@ -890,109 +1072,155 @@ var ApiServiceActionSchema = z17.enum([
|
|
|
890
1072
|
"service:status",
|
|
891
1073
|
"logs:read"
|
|
892
1074
|
]);
|
|
893
|
-
var ApiEnvActionSchema =
|
|
894
|
-
var ApiEnvPermSchema =
|
|
895
|
-
environmentId:
|
|
896
|
-
actions:
|
|
897
|
-
includeSecrets:
|
|
898
|
-
});
|
|
899
|
-
var ApiServicePermSchema =
|
|
900
|
-
serviceId:
|
|
901
|
-
actions:
|
|
902
|
-
environments:
|
|
903
|
-
});
|
|
904
|
-
var ApiKeyScopeSchema =
|
|
905
|
-
services:
|
|
906
|
-
});
|
|
907
|
-
var ApiKeySchema =
|
|
908
|
-
id:
|
|
909
|
-
name:
|
|
910
|
-
key:
|
|
1075
|
+
var ApiEnvActionSchema = z18.enum(["env:read", "env:write"]);
|
|
1076
|
+
var ApiEnvPermSchema = z18.object({
|
|
1077
|
+
environmentId: z18.string().max(128),
|
|
1078
|
+
actions: z18.array(ApiEnvActionSchema).max(10).default(["env:read"]),
|
|
1079
|
+
includeSecrets: z18.boolean().default(false)
|
|
1080
|
+
});
|
|
1081
|
+
var ApiServicePermSchema = z18.object({
|
|
1082
|
+
serviceId: z18.string().max(128),
|
|
1083
|
+
actions: z18.array(ApiServiceActionSchema).max(10).default(["service:read"]),
|
|
1084
|
+
environments: z18.array(ApiEnvPermSchema).max(100).default([])
|
|
1085
|
+
});
|
|
1086
|
+
var ApiKeyScopeSchema = z18.object({
|
|
1087
|
+
services: z18.array(ApiServicePermSchema).max(500).default([])
|
|
1088
|
+
});
|
|
1089
|
+
var ApiKeySchema = z18.object({
|
|
1090
|
+
id: z18.string().max(128),
|
|
1091
|
+
name: z18.string().min(1).max(200),
|
|
1092
|
+
key: z18.string().regex(/^[0-9a-f]{64}$/i),
|
|
911
1093
|
scopes: ApiKeyScopeSchema,
|
|
912
|
-
createdAt:
|
|
913
|
-
isPublic:
|
|
1094
|
+
createdAt: z18.string().max(64),
|
|
1095
|
+
isPublic: z18.boolean().default(false)
|
|
1096
|
+
});
|
|
1097
|
+
var PersistedApiKeySchema = ApiKeySchema.extend({
|
|
1098
|
+
key: z18.string().min(1).max(4096)
|
|
914
1099
|
});
|
|
915
|
-
var ApiKeysFileSchema =
|
|
916
|
-
keys:
|
|
1100
|
+
var ApiKeysFileSchema = z18.object({
|
|
1101
|
+
keys: z18.array(PersistedApiKeySchema).max(100)
|
|
1102
|
+
});
|
|
1103
|
+
var MaskedApiKeySchema = ApiKeySchema.omit({ key: true }).extend({
|
|
1104
|
+
/** Last 4 characters of the secret, for recognising a key in a list. */
|
|
1105
|
+
keyPreview: z18.string().max(8)
|
|
917
1106
|
});
|
|
918
1107
|
|
|
919
1108
|
// ../../packages/shared/src/schemas/image.schema.ts
|
|
920
|
-
import { z as
|
|
1109
|
+
import { z as z19 } from "zod";
|
|
921
1110
|
var ALLOWED_IMAGE_MIME_TYPES = ["image/png", "image/jpeg", "image/webp", "image/gif"];
|
|
922
|
-
var ImagePartSchema =
|
|
923
|
-
type:
|
|
924
|
-
imageId:
|
|
925
|
-
url:
|
|
926
|
-
mimeType:
|
|
927
|
-
altText:
|
|
928
|
-
});
|
|
929
|
-
var ImageUploadResponseSchema =
|
|
930
|
-
imageId:
|
|
931
|
-
url:
|
|
932
|
-
mimeType:
|
|
933
|
-
originalName:
|
|
934
|
-
});
|
|
935
|
-
var ImageMetaSchema =
|
|
936
|
-
imageId:
|
|
937
|
-
filePath:
|
|
938
|
-
mimeType:
|
|
939
|
-
originalName:
|
|
940
|
-
createdAt:
|
|
941
|
-
size:
|
|
1111
|
+
var ImagePartSchema = z19.object({
|
|
1112
|
+
type: z19.literal("image"),
|
|
1113
|
+
imageId: z19.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID"),
|
|
1114
|
+
url: z19.string().min(1),
|
|
1115
|
+
mimeType: z19.enum(ALLOWED_IMAGE_MIME_TYPES),
|
|
1116
|
+
altText: z19.string().max(500).optional()
|
|
1117
|
+
});
|
|
1118
|
+
var ImageUploadResponseSchema = z19.object({
|
|
1119
|
+
imageId: z19.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID"),
|
|
1120
|
+
url: z19.string().min(1),
|
|
1121
|
+
mimeType: z19.enum(ALLOWED_IMAGE_MIME_TYPES),
|
|
1122
|
+
originalName: z19.string()
|
|
1123
|
+
});
|
|
1124
|
+
var ImageMetaSchema = z19.object({
|
|
1125
|
+
imageId: z19.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID"),
|
|
1126
|
+
filePath: z19.string().min(1),
|
|
1127
|
+
mimeType: z19.enum(ALLOWED_IMAGE_MIME_TYPES),
|
|
1128
|
+
originalName: z19.string().min(1),
|
|
1129
|
+
createdAt: z19.number().positive(),
|
|
1130
|
+
size: z19.number().positive().optional()
|
|
942
1131
|
});
|
|
943
1132
|
|
|
944
1133
|
// ../../packages/shared/src/schemas/kanban.schema.ts
|
|
945
|
-
import { z as
|
|
946
|
-
var
|
|
947
|
-
|
|
948
|
-
|
|
1134
|
+
import { z as z20 } from "zod";
|
|
1135
|
+
var KanbanAttachmentSchema = z20.object({
|
|
1136
|
+
/** Server-issued id, also the storage key. */
|
|
1137
|
+
id: z20.string().max(128),
|
|
1138
|
+
name: z20.string().max(255),
|
|
1139
|
+
size: z20.number().int().nonnegative(),
|
|
1140
|
+
contentType: z20.string().max(128)
|
|
1141
|
+
});
|
|
1142
|
+
var KanbanCardEventSchema = z20.object({
|
|
1143
|
+
type: z20.enum(["created", "edited", "moved", "image_added", "image_removed", "title_changed", "conversation_started", "scenario_started", "comment"]),
|
|
1144
|
+
timestamp: z20.string(),
|
|
949
1145
|
/** Extra context: old/new column name, old/new title, comment text, etc. */
|
|
950
|
-
detail:
|
|
1146
|
+
detail: z20.string().max(5e3).optional(),
|
|
1147
|
+
/**
|
|
1148
|
+
* Stable identity of the event, used to tell an edit from an insertion when a
|
|
1149
|
+
* whole history is written back. Absent on events recorded before the field
|
|
1150
|
+
* existed; those fall back to (type, timestamp).
|
|
1151
|
+
*/
|
|
1152
|
+
id: z20.string().max(128).optional(),
|
|
951
1153
|
/** Who authored this event — 'ai' or 'user'. Only set for comment events. */
|
|
952
|
-
author:
|
|
1154
|
+
author: z20.enum(["ai", "user"]).optional(),
|
|
1155
|
+
/**
|
|
1156
|
+
* The human behind a comment, stamped by the server. This is what makes
|
|
1157
|
+
* "my own comment" answerable; `author` only separates AI from human.
|
|
1158
|
+
*/
|
|
1159
|
+
authorUser: z20.object({ id: z20.string().max(128), name: z20.string().max(200) }).optional(),
|
|
1160
|
+
/** Set when the author amended their comment, so the UI can say so. */
|
|
1161
|
+
editedAt: z20.string().optional(),
|
|
1162
|
+
/** Files attached to a comment — same storage as a card's own attachments. */
|
|
1163
|
+
attachments: z20.array(KanbanAttachmentSchema).max(20).optional(),
|
|
953
1164
|
/** Conversation that produced this event (comments only). Used to navigate back to the conversation. */
|
|
954
|
-
conversationId:
|
|
955
|
-
});
|
|
956
|
-
var KanbanCardSchema =
|
|
957
|
-
id:
|
|
958
|
-
title:
|
|
959
|
-
markdown:
|
|
960
|
-
/**
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
1165
|
+
conversationId: z20.string().optional()
|
|
1166
|
+
});
|
|
1167
|
+
var KanbanCardSchema = z20.object({
|
|
1168
|
+
id: z20.string(),
|
|
1169
|
+
title: z20.string().min(1).max(500),
|
|
1170
|
+
markdown: z20.string().max(1e5).default(""),
|
|
1171
|
+
/**
|
|
1172
|
+
* Legacy inline images, kept so boards written before object storage still
|
|
1173
|
+
* render. New uploads go to `attachments` instead.
|
|
1174
|
+
*/
|
|
1175
|
+
images: z20.array(z20.string()).default([]),
|
|
1176
|
+
/** Files attached to the card — stored out of band, referenced here. */
|
|
1177
|
+
attachments: z20.array(KanbanAttachmentSchema).max(50).default([]),
|
|
1178
|
+
order: z20.number().int(),
|
|
1179
|
+
history: z20.array(KanbanCardEventSchema).default([]),
|
|
1180
|
+
createdAt: z20.string(),
|
|
1181
|
+
updatedAt: z20.string(),
|
|
1182
|
+
/**
|
|
1183
|
+
* People assigned to the card. Names are denormalized for display; the server
|
|
1184
|
+
* keeps only members of the owning organization, and notifies newcomers.
|
|
1185
|
+
*/
|
|
1186
|
+
assignees: z20.array(z20.object({ id: z20.string().max(128), name: z20.string().max(200) })).max(20).default([]),
|
|
1187
|
+
/**
|
|
1188
|
+
* Who first created the card. Stamped by the server the first time a card id
|
|
1189
|
+
* appears in a board write, never taken from the client — a member could
|
|
1190
|
+
* otherwise claim any authorship. Absent on cards created before this field
|
|
1191
|
+
* existed, so readers must treat it as unknown rather than assume.
|
|
1192
|
+
*/
|
|
1193
|
+
createdBy: z20.object({ id: z20.string().max(128), name: z20.string().max(200) }).optional()
|
|
1194
|
+
});
|
|
1195
|
+
var KanbanColumnSchema = z20.object({
|
|
1196
|
+
id: z20.string(),
|
|
1197
|
+
title: z20.string().min(1).max(200),
|
|
1198
|
+
order: z20.number().int(),
|
|
1199
|
+
cards: z20.array(KanbanCardSchema).default([])
|
|
1200
|
+
});
|
|
1201
|
+
var KanbanBoardSchema = z20.object({
|
|
1202
|
+
id: z20.string(),
|
|
1203
|
+
name: z20.string().min(1).max(200),
|
|
1204
|
+
description: z20.string().max(1e4).default(""),
|
|
1205
|
+
columns: z20.array(KanbanColumnSchema).default([]),
|
|
1206
|
+
archived: z20.boolean().default(false),
|
|
1207
|
+
createdAt: z20.string(),
|
|
1208
|
+
updatedAt: z20.string()
|
|
1209
|
+
});
|
|
1210
|
+
var CreateKanbanBoardInput = z20.object({
|
|
1211
|
+
name: z20.string().min(1).max(200),
|
|
1212
|
+
description: z20.string().max(1e4).optional()
|
|
1213
|
+
});
|
|
1214
|
+
var UpdateKanbanBoardInput = z20.object({
|
|
1215
|
+
id: z20.string(),
|
|
1216
|
+
name: z20.string().min(1).max(200).optional(),
|
|
1217
|
+
description: z20.string().max(1e4).optional(),
|
|
1218
|
+
columns: z20.array(KanbanColumnSchema).optional(),
|
|
1219
|
+
archived: z20.boolean().optional()
|
|
992
1220
|
});
|
|
993
1221
|
|
|
994
1222
|
// ../../packages/shared/src/utils/crypto.ts
|
|
995
|
-
import { createCipheriv as
|
|
1223
|
+
import { createCipheriv as createCipheriv3, createDecipheriv as createDecipheriv3, randomBytes as randomBytes3, pbkdf2Sync } from "crypto";
|
|
996
1224
|
|
|
997
1225
|
// ../../packages/shared/src/native-parsers.ts
|
|
998
1226
|
var epoch = /* @__PURE__ */ new Date("2025-01-01T00:00:00Z");
|
|
@@ -1072,6 +1300,8 @@ var nativeParsers = [
|
|
|
1072
1300
|
// ../../packages/shared/src/js-log-parser.ts
|
|
1073
1301
|
import vm from "vm";
|
|
1074
1302
|
var VALID_LEVELS = /* @__PURE__ */ new Set(["debug", "info", "warn", "error", "fatal"]);
|
|
1303
|
+
var PARSE_TIMEOUT_MS = 50;
|
|
1304
|
+
var MAX_CONSECUTIVE_TIMEOUTS = 10;
|
|
1075
1305
|
var JSLogParser = class {
|
|
1076
1306
|
parsers = [];
|
|
1077
1307
|
constructor(definitions = []) {
|
|
@@ -1109,6 +1339,16 @@ var JSLogParser = class {
|
|
|
1109
1339
|
}
|
|
1110
1340
|
return this.sanitize(current);
|
|
1111
1341
|
}
|
|
1342
|
+
/**
|
|
1343
|
+
* Compile le code utilisateur en une fonction bornée en temps.
|
|
1344
|
+
*
|
|
1345
|
+
* Le `timeout` de `runInNewContext` ne couvre que l'évaluation de la factory :
|
|
1346
|
+
* la closure retournée s'exécutait ensuite ligne par ligne directement sur
|
|
1347
|
+
* l'event loop, sans aucune borne. Une regex à backtracking exponentiel
|
|
1348
|
+
* fournie par l'utilisateur figeait donc l'agent entier — logs, statuts et
|
|
1349
|
+
* métriques de *tous* les services. Chaque invocation repasse maintenant par
|
|
1350
|
+
* la vm, avec son propre budget.
|
|
1351
|
+
*/
|
|
1112
1352
|
compileParser(def) {
|
|
1113
1353
|
const forbidden = ["require(", "import ", "eval("];
|
|
1114
1354
|
for (const pat of forbidden) {
|
|
@@ -1133,17 +1373,44 @@ var JSLogParser = class {
|
|
|
1133
1373
|
} catch (err) {
|
|
1134
1374
|
throw new Error(`Compilation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1135
1375
|
}
|
|
1376
|
+
const context = vm.createContext({ ...sandbox, __line: null, __result: null });
|
|
1136
1377
|
let parserFn;
|
|
1137
1378
|
try {
|
|
1138
|
-
parserFn = script.
|
|
1379
|
+
parserFn = script.runInContext(context, { timeout: 100 });
|
|
1139
1380
|
} catch (err) {
|
|
1140
1381
|
throw new Error(`Execution failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1141
1382
|
}
|
|
1142
1383
|
if (typeof parserFn !== "function") {
|
|
1143
1384
|
throw new Error("Parser code must export a function");
|
|
1144
1385
|
}
|
|
1386
|
+
context["__parserFn"] = parserFn;
|
|
1387
|
+
const callScript = new vm.Script("__result = __parserFn(__line);", {
|
|
1388
|
+
filename: `parser-${def.id}-call.js`
|
|
1389
|
+
});
|
|
1390
|
+
let consecutiveTimeouts = 0;
|
|
1391
|
+
let disabled = false;
|
|
1145
1392
|
return (line) => {
|
|
1146
|
-
|
|
1393
|
+
if (disabled) return line;
|
|
1394
|
+
const ctx = context;
|
|
1395
|
+
ctx["__line"] = line;
|
|
1396
|
+
ctx["__result"] = null;
|
|
1397
|
+
try {
|
|
1398
|
+
callScript.runInContext(context, { timeout: PARSE_TIMEOUT_MS });
|
|
1399
|
+
consecutiveTimeouts = 0;
|
|
1400
|
+
} catch (err) {
|
|
1401
|
+
const e = err;
|
|
1402
|
+
const timedOut = !!e && (e.code === "ERR_SCRIPT_EXECUTION_TIMEOUT" || typeof e.message === "string" && /execution timed out/i.test(e.message));
|
|
1403
|
+
if (!timedOut) throw err;
|
|
1404
|
+
consecutiveTimeouts += 1;
|
|
1405
|
+
if (consecutiveTimeouts >= MAX_CONSECUTIVE_TIMEOUTS) {
|
|
1406
|
+
disabled = true;
|
|
1407
|
+
console.warn(
|
|
1408
|
+
`[js-log-parser] Parser "${def.name}" (${def.id}) disabled after ${MAX_CONSECUTIVE_TIMEOUTS} consecutive timeouts`
|
|
1409
|
+
);
|
|
1410
|
+
}
|
|
1411
|
+
return line;
|
|
1412
|
+
}
|
|
1413
|
+
const result = ctx["__result"];
|
|
1147
1414
|
if (result === null || result === void 0 || typeof result !== "object") {
|
|
1148
1415
|
return line;
|
|
1149
1416
|
}
|
|
@@ -1593,7 +1860,7 @@ var EnvironmentStore = class {
|
|
|
1593
1860
|
await this.load();
|
|
1594
1861
|
const parsed = EnvironmentSchema.safeParse({ ...fields, id });
|
|
1595
1862
|
if (!parsed.success) {
|
|
1596
|
-
console.error(
|
|
1863
|
+
console.error("[environment-store] Rejected remote environment %s:", id, parsed.error.message);
|
|
1597
1864
|
return { created: false };
|
|
1598
1865
|
}
|
|
1599
1866
|
const incoming = parsed.data;
|
|
@@ -1842,7 +2109,7 @@ var ServiceStore = class {
|
|
|
1842
2109
|
await this.load();
|
|
1843
2110
|
const parsed = ServiceConfigSchema.safeParse({ ...fields, id });
|
|
1844
2111
|
if (!parsed.success) {
|
|
1845
|
-
console.error(
|
|
2112
|
+
console.error("[service-store] Rejected remote service %s:", id, parsed.error.message);
|
|
1846
2113
|
return { created: false };
|
|
1847
2114
|
}
|
|
1848
2115
|
const incoming = parsed.data;
|
|
@@ -2343,13 +2610,13 @@ var AgentWSBridge = class extends EventEmitter {
|
|
|
2343
2610
|
};
|
|
2344
2611
|
|
|
2345
2612
|
// ../server/src/services/agent-manager.ts
|
|
2346
|
-
var HealthMessageSchema =
|
|
2347
|
-
status:
|
|
2348
|
-
uptime:
|
|
2349
|
-
runnersAvailable:
|
|
2350
|
-
processCount:
|
|
2351
|
-
runningCount:
|
|
2352
|
-
lanIp:
|
|
2613
|
+
var HealthMessageSchema = z21.object({
|
|
2614
|
+
status: z21.string(),
|
|
2615
|
+
uptime: z21.number(),
|
|
2616
|
+
runnersAvailable: z21.array(z21.enum(["native", "docker"])),
|
|
2617
|
+
processCount: z21.number(),
|
|
2618
|
+
runningCount: z21.number(),
|
|
2619
|
+
lanIp: z21.string().optional()
|
|
2353
2620
|
});
|
|
2354
2621
|
var MIN_RECONNECT_DELAY = WS_RECONNECT_MIN;
|
|
2355
2622
|
var MAX_RECONNECT_DELAY = WS_RECONNECT_MAX;
|
|
@@ -2773,6 +3040,19 @@ var AgentManager = class extends EventEmitter2 {
|
|
|
2773
3040
|
var agentManager = new AgentManager();
|
|
2774
3041
|
|
|
2775
3042
|
export {
|
|
3043
|
+
env,
|
|
3044
|
+
isCiMode,
|
|
3045
|
+
loadFromEnv,
|
|
3046
|
+
setPendingLegacyKey,
|
|
3047
|
+
getPendingLegacyKey,
|
|
3048
|
+
clearPendingLegacyKey,
|
|
3049
|
+
hasPendingLegacyKey,
|
|
3050
|
+
setEncryptionKeyInMemory,
|
|
3051
|
+
clearEncryptionKey,
|
|
3052
|
+
hasEncryptionKey,
|
|
3053
|
+
getEncryptionKey,
|
|
3054
|
+
ensureEncryptionKey,
|
|
3055
|
+
setEncryptionKey,
|
|
2776
3056
|
ProjectSchema,
|
|
2777
3057
|
ScenarioGroupSchema,
|
|
2778
3058
|
ScenarioNodeSchema,
|
|
@@ -2793,9 +3073,9 @@ export {
|
|
|
2793
3073
|
VariableSchema,
|
|
2794
3074
|
CreateEnvironmentSchema,
|
|
2795
3075
|
UpdateEnvironmentSchema,
|
|
3076
|
+
VariableOverrideSchema,
|
|
2796
3077
|
ApiKeyScopeSchema,
|
|
2797
3078
|
ApiKeysFileSchema,
|
|
2798
|
-
KanbanColumnSchema,
|
|
2799
3079
|
nativeParsers,
|
|
2800
3080
|
JSLogParser,
|
|
2801
3081
|
LOG_BUFFER_SIZE,
|
|
@@ -2806,6 +3086,13 @@ export {
|
|
|
2806
3086
|
getCollection,
|
|
2807
3087
|
readEntity,
|
|
2808
3088
|
writeEntity,
|
|
3089
|
+
encryptValue,
|
|
3090
|
+
decryptValue,
|
|
3091
|
+
stableEncryptValue,
|
|
3092
|
+
encryptVariableSlots,
|
|
3093
|
+
decryptVariableSlots,
|
|
3094
|
+
extractEncryptedVariableSlots,
|
|
3095
|
+
isEncryptedValue,
|
|
2809
3096
|
environmentStore,
|
|
2810
3097
|
serviceStore,
|
|
2811
3098
|
agentStore,
|
|
@@ -2813,4 +3100,4 @@ export {
|
|
|
2813
3100
|
traefikManager,
|
|
2814
3101
|
agentManager
|
|
2815
3102
|
};
|
|
2816
|
-
//# sourceMappingURL=chunk-
|
|
3103
|
+
//# sourceMappingURL=chunk-Y2R42AXQ.js.map
|