@runeya/runeya 2.0.21 → 2.0.23
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-3TOPUVAK.js} +1354 -1083
- package/src-3TOPUVAK.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
package/chunk-LZWBXYUE.js
DELETED
|
@@ -1,354 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
decryptValue,
|
|
3
|
-
encryptValue,
|
|
4
|
-
env
|
|
5
|
-
} from "./chunk-Q4N37KNN.js";
|
|
6
|
-
|
|
7
|
-
// ../server/src/services/kanban-commands.ts
|
|
8
|
-
import { randomUUID as randomUUID2 } from "crypto";
|
|
9
|
-
|
|
10
|
-
// ../server/src/services/kanban-store.ts
|
|
11
|
-
import { randomUUID } from "crypto";
|
|
12
|
-
import { EventEmitter } from "events";
|
|
13
|
-
import { readFile, writeFile, rename, mkdir, chmod } from "fs/promises";
|
|
14
|
-
import { join } from "path";
|
|
15
|
-
var FILENAME = "kanban.private.json.enc";
|
|
16
|
-
var KanbanStore = class {
|
|
17
|
-
boards = /* @__PURE__ */ new Map();
|
|
18
|
-
loaded = false;
|
|
19
|
-
events = new EventEmitter();
|
|
20
|
-
saveTimer = null;
|
|
21
|
-
getFilePath() {
|
|
22
|
-
return join(env.DATA_DIR, FILENAME);
|
|
23
|
-
}
|
|
24
|
-
async ensureDir() {
|
|
25
|
-
await mkdir(env.DATA_DIR, { recursive: true });
|
|
26
|
-
}
|
|
27
|
-
async load() {
|
|
28
|
-
if (this.loaded) return;
|
|
29
|
-
try {
|
|
30
|
-
const encrypted = await readFile(this.getFilePath(), "utf-8");
|
|
31
|
-
const raw = decryptValue(encrypted);
|
|
32
|
-
const data = JSON.parse(raw);
|
|
33
|
-
for (const b of data) {
|
|
34
|
-
this.boards.set(b.id, b);
|
|
35
|
-
}
|
|
36
|
-
} catch {
|
|
37
|
-
}
|
|
38
|
-
this.loaded = true;
|
|
39
|
-
}
|
|
40
|
-
async saveNow() {
|
|
41
|
-
await this.ensureDir();
|
|
42
|
-
const filePath = this.getFilePath();
|
|
43
|
-
const tmpPath = filePath + ".tmp";
|
|
44
|
-
const json = JSON.stringify(Array.from(this.boards.values()), null, 2);
|
|
45
|
-
const encrypted = encryptValue(json);
|
|
46
|
-
await writeFile(tmpPath, encrypted, "utf-8");
|
|
47
|
-
await rename(tmpPath, filePath);
|
|
48
|
-
await chmod(filePath, 384);
|
|
49
|
-
}
|
|
50
|
-
save() {
|
|
51
|
-
if (this.saveTimer) clearTimeout(this.saveTimer);
|
|
52
|
-
this.saveTimer = setTimeout(() => {
|
|
53
|
-
this.saveNow().catch((err) => {
|
|
54
|
-
console.error("[kanban-store] save failed:", err);
|
|
55
|
-
});
|
|
56
|
-
}, 200);
|
|
57
|
-
}
|
|
58
|
-
async list(includeArchived = false) {
|
|
59
|
-
await this.load();
|
|
60
|
-
const all = Array.from(this.boards.values());
|
|
61
|
-
return includeArchived ? all : all.filter((b) => !b.archived);
|
|
62
|
-
}
|
|
63
|
-
async get(id) {
|
|
64
|
-
await this.load();
|
|
65
|
-
return this.boards.get(id) ?? null;
|
|
66
|
-
}
|
|
67
|
-
async create(input) {
|
|
68
|
-
await this.load();
|
|
69
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
70
|
-
const board = {
|
|
71
|
-
id: randomUUID(),
|
|
72
|
-
name: input.name,
|
|
73
|
-
description: input.description ?? "",
|
|
74
|
-
columns: [],
|
|
75
|
-
archived: false,
|
|
76
|
-
createdAt: now,
|
|
77
|
-
updatedAt: now
|
|
78
|
-
};
|
|
79
|
-
this.boards.set(board.id, board);
|
|
80
|
-
this.save();
|
|
81
|
-
this.events.emit("changed", { type: "created", board });
|
|
82
|
-
return board;
|
|
83
|
-
}
|
|
84
|
-
async update(input) {
|
|
85
|
-
await this.load();
|
|
86
|
-
const existing = this.boards.get(input.id);
|
|
87
|
-
if (!existing) return null;
|
|
88
|
-
const updated = {
|
|
89
|
-
...existing,
|
|
90
|
-
...input.name !== void 0 && { name: input.name },
|
|
91
|
-
...input.description !== void 0 && { description: input.description },
|
|
92
|
-
...input.columns !== void 0 && { columns: input.columns },
|
|
93
|
-
...input.archived !== void 0 && { archived: input.archived },
|
|
94
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
95
|
-
};
|
|
96
|
-
this.boards.set(input.id, updated);
|
|
97
|
-
this.save();
|
|
98
|
-
this.events.emit("changed", { type: "updated", board: updated });
|
|
99
|
-
return updated;
|
|
100
|
-
}
|
|
101
|
-
async delete(id) {
|
|
102
|
-
await this.load();
|
|
103
|
-
if (!this.boards.has(id)) return false;
|
|
104
|
-
this.boards.delete(id);
|
|
105
|
-
this.save();
|
|
106
|
-
this.events.emit("changed", { type: "deleted", id });
|
|
107
|
-
return true;
|
|
108
|
-
}
|
|
109
|
-
onChanged(handler) {
|
|
110
|
-
this.events.on("changed", handler);
|
|
111
|
-
}
|
|
112
|
-
offChanged(handler) {
|
|
113
|
-
this.events.off("changed", handler);
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
var kanbanStore = new KanbanStore();
|
|
117
|
-
|
|
118
|
-
// ../server/src/services/kanban-commands.ts
|
|
119
|
-
async function executeKanbanCommands(boardId, cardId, commands, conversationId) {
|
|
120
|
-
if (commands.length === 0) return;
|
|
121
|
-
let board = await kanbanStore.get(boardId);
|
|
122
|
-
if (!board) {
|
|
123
|
-
console.warn(`[kanban-commands] Board ${boardId} not found, skipping ${commands.length} command(s)`);
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
const cardExistsInBoard = () => board.columns.some((col) => col.cards.some((c) => c.id === cardId));
|
|
127
|
-
if (!cardExistsInBoard()) {
|
|
128
|
-
for (let attempt = 1; attempt <= 5; attempt++) {
|
|
129
|
-
console.warn(`[kanban-commands] Card ${cardId} not found in board, retry ${attempt}/5...`);
|
|
130
|
-
await new Promise((r) => setTimeout(r, 500 * attempt));
|
|
131
|
-
board = await kanbanStore.get(boardId);
|
|
132
|
-
if (!board) return;
|
|
133
|
-
if (cardExistsInBoard()) break;
|
|
134
|
-
}
|
|
135
|
-
if (!cardExistsInBoard()) {
|
|
136
|
-
console.error(`[kanban-commands] Card ${cardId} still not found after retries, skipping ${commands.length} command(s)`);
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
for (const cmd of commands) {
|
|
141
|
-
if (cmd.type === "move_card" && cmd.columnTitle) {
|
|
142
|
-
const moved = moveCard(board, cardId, cmd.columnTitle);
|
|
143
|
-
if (!moved) console.warn(`[kanban-commands] move_card failed: card=${cardId} target="${cmd.columnTitle}"`);
|
|
144
|
-
} else if (cmd.type === "add_comment" && cmd.comment) {
|
|
145
|
-
addComment(board, cardId, cmd.comment, conversationId);
|
|
146
|
-
} else if (cmd.type === "add_card" && cmd.columnTitle && cmd.cardTitle) {
|
|
147
|
-
addCardToColumn(board, cmd.columnTitle, cmd.cardTitle, cmd.cardContent);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
await kanbanStore.update({ id: board.id, columns: board.columns });
|
|
151
|
-
}
|
|
152
|
-
async function executeKanbanBoardCommands(boardId, commands) {
|
|
153
|
-
if (commands.length === 0) return;
|
|
154
|
-
const board = await kanbanStore.get(boardId);
|
|
155
|
-
if (!board) return;
|
|
156
|
-
for (const cmd of commands) {
|
|
157
|
-
if (cmd.type === "add_card" && cmd.columnTitle && cmd.cardTitle) {
|
|
158
|
-
addCardToColumn(board, cmd.columnTitle, cmd.cardTitle, cmd.cardContent);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
await kanbanStore.update({ id: board.id, columns: board.columns });
|
|
162
|
-
}
|
|
163
|
-
function moveCard(board, cardId, targetColTitle) {
|
|
164
|
-
let sourceCol = "";
|
|
165
|
-
let card = null;
|
|
166
|
-
let sourceColIdx = -1;
|
|
167
|
-
let cardIdx = -1;
|
|
168
|
-
for (let ci = 0; ci < board.columns.length; ci++) {
|
|
169
|
-
const col = board.columns[ci];
|
|
170
|
-
const idx = col.cards.findIndex((c) => c.id === cardId);
|
|
171
|
-
if (idx !== -1) {
|
|
172
|
-
sourceCol = col.title;
|
|
173
|
-
card = col.cards[idx];
|
|
174
|
-
sourceColIdx = ci;
|
|
175
|
-
cardIdx = idx;
|
|
176
|
-
break;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if (!card || sourceColIdx === -1) return false;
|
|
180
|
-
const targetCol = board.columns.find(
|
|
181
|
-
(c) => c.title.toLowerCase() === targetColTitle.toLowerCase()
|
|
182
|
-
);
|
|
183
|
-
if (!targetCol) {
|
|
184
|
-
console.warn(`[kanban-commands] Target column "${targetColTitle}" not found. Available: ${board.columns.map((c) => c.title).join(", ")}`);
|
|
185
|
-
return false;
|
|
186
|
-
}
|
|
187
|
-
if (targetCol.id === board.columns[sourceColIdx].id) return true;
|
|
188
|
-
board.columns[sourceColIdx].cards.splice(cardIdx, 1);
|
|
189
|
-
card.order = targetCol.cards.length;
|
|
190
|
-
card.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
191
|
-
card.history = [...card.history ?? [], {
|
|
192
|
-
type: "moved",
|
|
193
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
194
|
-
detail: `"${sourceCol}" \u2192 "${targetCol.title}"`,
|
|
195
|
-
author: "ai"
|
|
196
|
-
}];
|
|
197
|
-
targetCol.cards.push(card);
|
|
198
|
-
return true;
|
|
199
|
-
}
|
|
200
|
-
function addCardToColumn(board, columnTitle, cardTitle, cardContent) {
|
|
201
|
-
const col = board.columns.find((c) => c.title.toLowerCase() === columnTitle.toLowerCase());
|
|
202
|
-
if (!col) return;
|
|
203
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
204
|
-
const card = {
|
|
205
|
-
id: randomUUID2(),
|
|
206
|
-
title: cardTitle,
|
|
207
|
-
markdown: cardContent ?? "",
|
|
208
|
-
images: [],
|
|
209
|
-
order: col.cards.length,
|
|
210
|
-
history: [{ type: "created", timestamp: now, detail: `AI \u2014 In column "${col.title}"` }],
|
|
211
|
-
createdAt: now,
|
|
212
|
-
updatedAt: now
|
|
213
|
-
};
|
|
214
|
-
col.cards.push(card);
|
|
215
|
-
}
|
|
216
|
-
function addComment(board, cardId, comment, conversationId) {
|
|
217
|
-
for (const col of board.columns) {
|
|
218
|
-
const card = col.cards.find((c) => c.id === cardId);
|
|
219
|
-
if (card) {
|
|
220
|
-
card.history = [...card.history ?? [], {
|
|
221
|
-
type: "comment",
|
|
222
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
223
|
-
detail: comment,
|
|
224
|
-
author: "ai",
|
|
225
|
-
...conversationId ? { conversationId } : {}
|
|
226
|
-
}];
|
|
227
|
-
card.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
function generateKanbanSystemPrompt(board, cardId) {
|
|
233
|
-
let currentColTitle = "";
|
|
234
|
-
let card = null;
|
|
235
|
-
for (const col of board.columns) {
|
|
236
|
-
const found = col.cards.find((c) => c.id === cardId);
|
|
237
|
-
if (found) {
|
|
238
|
-
currentColTitle = col.title;
|
|
239
|
-
card = found;
|
|
240
|
-
break;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
const sortedColumns = [...board.columns].sort((a, b) => a.order - b.order);
|
|
244
|
-
const lines = [];
|
|
245
|
-
lines.push("## Kanban Board Context");
|
|
246
|
-
lines.push("");
|
|
247
|
-
lines.push(`Tu travailles dans le contexte d'une carte Kanban.`);
|
|
248
|
-
lines.push(`- **Board** : ${board.name}`);
|
|
249
|
-
if (card) {
|
|
250
|
-
lines.push(`- **Carte** : ${card.title}`);
|
|
251
|
-
lines.push(`- **Colonne actuelle** : \`${currentColTitle}\``);
|
|
252
|
-
}
|
|
253
|
-
lines.push("");
|
|
254
|
-
lines.push("### Colonnes disponibles (noms exacts \xE0 utiliser) :");
|
|
255
|
-
for (const col of sortedColumns) {
|
|
256
|
-
const cardCount = col.cards.length;
|
|
257
|
-
const isCurrent = card && col.cards.some((c) => c.id === cardId);
|
|
258
|
-
lines.push(`- \`${col.title}\` (${cardCount} carte${cardCount !== 1 ? "s" : ""})${isCurrent ? " \u2190 **colonne actuelle**" : ""}`);
|
|
259
|
-
}
|
|
260
|
-
lines.push("");
|
|
261
|
-
if (card) {
|
|
262
|
-
const comments = (card.history ?? []).filter((e) => e.type === "comment");
|
|
263
|
-
if (comments.length > 0) {
|
|
264
|
-
lines.push("### Commentaires existants sur cette carte :");
|
|
265
|
-
lines.push("");
|
|
266
|
-
for (const c of comments.slice(-20)) {
|
|
267
|
-
const who = c.author === "ai" ? "AI" : "Utilisateur";
|
|
268
|
-
const date = new Date(c.timestamp).toLocaleString("fr-FR", { day: "numeric", month: "short", hour: "2-digit", minute: "2-digit" });
|
|
269
|
-
lines.push(`- **${who}** (${date}) : ${c.detail}`);
|
|
270
|
-
}
|
|
271
|
-
lines.push("");
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
lines.push("### Outils Kanban disponibles");
|
|
275
|
-
lines.push("");
|
|
276
|
-
lines.push(`- **boardId** (\xE0 passer dans tous les outils) : \`${board.id}\``);
|
|
277
|
-
if (card) lines.push(`- **cardId** (carte actuelle) : \`${card.id}\``);
|
|
278
|
-
lines.push("");
|
|
279
|
-
lines.push("Tu disposes des outils suivants pour interagir avec le board :");
|
|
280
|
-
lines.push("- `kanban_move_card(boardId, cardId, targetColumn)` \u2014 D\xE9placer la carte vers une autre colonne");
|
|
281
|
-
lines.push("- `kanban_add_comment(boardId, cardId, comment)` \u2014 Ajouter un commentaire sur la carte");
|
|
282
|
-
lines.push("");
|
|
283
|
-
lines.push("### OBLIGATOIRE \u2014 D\xE9cision Kanban");
|
|
284
|
-
lines.push("");
|
|
285
|
-
lines.push("\xC0 chaque r\xE9ponse, tu DOIS obligatoirement faire les deux actions suivantes :");
|
|
286
|
-
lines.push("");
|
|
287
|
-
lines.push("**1. \xC9valuer et d\xE9placer la carte si n\xE9cessaire** via `kanban_move_card` :");
|
|
288
|
-
lines.push(" - **Au d\xE9but** si tu sais d\xE9j\xE0 que tu vas travailler activement (ex. tu passes en `In progress`).");
|
|
289
|
-
lines.push(" - **\xC0 la fin** pour une d\xE9cision forte apr\xE8s analyse compl\xE8te (ex. tu conclus que c'est `Done`).");
|
|
290
|
-
lines.push(" - Si tu ne fais qu'analyser ou poser des questions \u2192 **ne pas d\xE9placer**.");
|
|
291
|
-
lines.push("");
|
|
292
|
-
lines.push(" > \u26A0\uFE0F **CRITIQUE** : En fin de r\xE9ponse, tu DOIS TOUJOURS \xE9valuer si la colonne actuelle est encore correcte.");
|
|
293
|
-
lines.push("");
|
|
294
|
-
lines.push("**2. Appeler `kanban_add_comment`** r\xE9sumant ce que tu as fait ou constat\xE9 (**\xE0 la fin** de ta r\xE9ponse).");
|
|
295
|
-
lines.push("");
|
|
296
|
-
lines.push("> \u{1F6AB} **INTERDIT** : Terminer une r\xE9ponse sans appeler `kanban_add_comment`. C'est non n\xE9gociable.");
|
|
297
|
-
lines.push("");
|
|
298
|
-
return lines.join("\n");
|
|
299
|
-
}
|
|
300
|
-
function generateKanbanPopulatePrompt(board) {
|
|
301
|
-
const lines = [];
|
|
302
|
-
lines.push("## Kanban Board \u2014 Mode Populate");
|
|
303
|
-
lines.push("");
|
|
304
|
-
lines.push(`Tu es en mode **populate** sur le tableau Kanban **"${board.name}"**.`);
|
|
305
|
-
lines.push(`Tu es un outil de gestion de projet. Quand l'utilisateur dit "cr\xE9er une card", "ajouter une t\xE2che", "cr\xE9er une carte", ou toute demande similaire, il parle EXCLUSIVEMENT d'une carte Kanban \xE0 ajouter au tableau \u2014 PAS d'un composant UI, PAS de code HTML ou CSS, PAS d'un composant React/Vue/Angular.`);
|
|
306
|
-
lines.push("");
|
|
307
|
-
lines.push("Ton UNIQUE r\xF4le est de cr\xE9er des cartes Kanban pertinentes en r\xE9ponse \xE0 la demande de l'utilisateur.");
|
|
308
|
-
lines.push("Tu ne dois PAS r\xE9pondre \xE0 la question, ni donner d'explication, ni \xE9crire du code, ni montrer de composant.");
|
|
309
|
-
lines.push("Tu dois UNIQUEMENT produire des tags XML `<kanban_add_card>` pour cr\xE9er des cartes dans le tableau.");
|
|
310
|
-
if (board.description) {
|
|
311
|
-
lines.push("");
|
|
312
|
-
lines.push(`Description du board : ${board.description}`);
|
|
313
|
-
}
|
|
314
|
-
lines.push("");
|
|
315
|
-
const sortedCols = [...board.columns].sort((a, b) => a.order - b.order);
|
|
316
|
-
lines.push("### Colonnes existantes (noms exacts \xE0 utiliser) :");
|
|
317
|
-
for (const col of sortedCols) {
|
|
318
|
-
const cardCount = col.cards.length;
|
|
319
|
-
lines.push(`- \`${col.title}\` (${cardCount} carte${cardCount !== 1 ? "s" : ""})`);
|
|
320
|
-
for (const card of col.cards) {
|
|
321
|
-
lines.push(` - ${card.title}`);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
lines.push("");
|
|
325
|
-
lines.push("### Outil disponible");
|
|
326
|
-
lines.push("");
|
|
327
|
-
lines.push(`- **boardId** (\xE0 passer dans tous les outils) : \`${board.id}\``);
|
|
328
|
-
lines.push("");
|
|
329
|
-
lines.push("Pour chaque carte \xE0 cr\xE9er, appelle l'outil `kanban_add_card(boardId, column, title, content)` :");
|
|
330
|
-
lines.push("- `column` : nom exact de la colonne cible");
|
|
331
|
-
lines.push("- `title` : titre concis de la carte");
|
|
332
|
-
lines.push("- `content` : contenu markdown d\xE9taill\xE9 et actionnable");
|
|
333
|
-
lines.push("");
|
|
334
|
-
lines.push("### R\xE8gles STRICTES");
|
|
335
|
-
lines.push("");
|
|
336
|
-
lines.push("1. **NE R\xC9PONDS PAS** \xE0 la question de l'utilisateur. Ne donne aucune explication, aucun texte libre.");
|
|
337
|
-
lines.push("2. **Appelle uniquement** `kanban_add_card`, rien d'autre.");
|
|
338
|
-
lines.push("3. Tu ne peux PAS cr\xE9er de nouvelles colonnes. Dispatch les cartes dans les colonnes existantes list\xE9es ci-dessus.");
|
|
339
|
-
lines.push("4. Utilise les noms **exacts** des colonnes.");
|
|
340
|
-
lines.push("5. Chaque carte doit avoir un titre concis et un contenu markdown d\xE9taill\xE9 et actionnable.");
|
|
341
|
-
lines.push("6. D\xE9compose la demande de l'utilisateur en t\xE2ches concr\xE8tes, chacune \xE9tant une carte.");
|
|
342
|
-
lines.push("7. Dispatch chaque carte dans la colonne la plus appropri\xE9e selon sa nature.");
|
|
343
|
-
lines.push("");
|
|
344
|
-
return lines.join("\n");
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
export {
|
|
348
|
-
kanbanStore,
|
|
349
|
-
executeKanbanCommands,
|
|
350
|
-
executeKanbanBoardCommands,
|
|
351
|
-
generateKanbanSystemPrompt,
|
|
352
|
-
generateKanbanPopulatePrompt
|
|
353
|
-
};
|
|
354
|
-
//# sourceMappingURL=chunk-LZWBXYUE.js.map
|
package/chunk-LZWBXYUE.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/src/services/kanban-commands.ts","../../server/src/services/kanban-store.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { kanbanStore } from './kanban-store.js';\nimport type { KanbanBoard, KanbanCard } from '@runeya/packages-shared';\n\n// ─── Command parsing ────────────────────────────────────────────────────────\n\nexport interface KanbanCommand {\n type: 'move_card' | 'add_comment' | 'add_card';\n /** Target column title (for move_card, add_card) */\n columnTitle?: string;\n /** Comment text (for add_comment) */\n comment?: string;\n /** Card title (for add_card) */\n cardTitle?: string;\n /** Card content / markdown (for add_card) */\n cardContent?: string;\n}\n\n// ─── Command execution ──────────────────────────────────────────────────────\n\nexport async function executeKanbanCommands(\n boardId: string,\n cardId: string,\n commands: KanbanCommand[],\n conversationId?: string,\n): Promise<void> {\n if (commands.length === 0) return;\n\n // Retry loading the board a few times — the card may not have been persisted yet\n // when the conversation was launched before the card was fully saved.\n let board = await kanbanStore.get(boardId);\n if (!board) {\n console.warn(`[kanban-commands] Board ${boardId} not found, skipping ${commands.length} command(s)`);\n return;\n }\n\n // Check if card exists in the board; if not, retry a few times with a short delay\n const cardExistsInBoard = () => board!.columns.some(col => col.cards.some(c => c.id === cardId));\n if (!cardExistsInBoard()) {\n for (let attempt = 1; attempt <= 5; attempt++) {\n console.warn(`[kanban-commands] Card ${cardId} not found in board, retry ${attempt}/5...`);\n await new Promise(r => setTimeout(r, 500 * attempt));\n board = await kanbanStore.get(boardId);\n if (!board) return;\n if (cardExistsInBoard()) break;\n }\n if (!cardExistsInBoard()) {\n console.error(`[kanban-commands] Card ${cardId} still not found after retries, skipping ${commands.length} command(s)`);\n return;\n }\n }\n\n for (const cmd of commands) {\n if (cmd.type === 'move_card' && cmd.columnTitle) {\n const moved = moveCard(board, cardId, cmd.columnTitle);\n if (!moved) console.warn(`[kanban-commands] move_card failed: card=${cardId} target=\"${cmd.columnTitle}\"`);\n } else if (cmd.type === 'add_comment' && cmd.comment) {\n addComment(board, cardId, cmd.comment, conversationId);\n } else if (cmd.type === 'add_card' && cmd.columnTitle && cmd.cardTitle) {\n addCardToColumn(board, cmd.columnTitle, cmd.cardTitle, cmd.cardContent);\n }\n }\n\n await kanbanStore.update({ id: board.id, columns: board.columns });\n}\n\n/**\n * Execute board-level commands (no card context needed).\n * Used by the AI populate feature.\n */\nexport async function executeKanbanBoardCommands(\n boardId: string,\n commands: KanbanCommand[],\n): Promise<void> {\n if (commands.length === 0) return;\n\n const board = await kanbanStore.get(boardId);\n if (!board) return;\n\n for (const cmd of commands) {\n if (cmd.type === 'add_card' && cmd.columnTitle && cmd.cardTitle) {\n addCardToColumn(board, cmd.columnTitle, cmd.cardTitle, cmd.cardContent);\n }\n }\n\n await kanbanStore.update({ id: board.id, columns: board.columns });\n}\n\nfunction moveCard(board: KanbanBoard, cardId: string, targetColTitle: string): boolean {\n let sourceCol = '';\n let card = null;\n let sourceColIdx = -1;\n let cardIdx = -1;\n\n for (let ci = 0; ci < board.columns.length; ci++) {\n const col = board.columns[ci];\n const idx = col.cards.findIndex(c => c.id === cardId);\n if (idx !== -1) {\n sourceCol = col.title;\n card = col.cards[idx];\n sourceColIdx = ci;\n cardIdx = idx;\n break;\n }\n }\n if (!card || sourceColIdx === -1) return false;\n\n const targetCol = board.columns.find(\n c => c.title.toLowerCase() === targetColTitle.toLowerCase(),\n );\n if (!targetCol) {\n console.warn(`[kanban-commands] Target column \"${targetColTitle}\" not found. Available: ${board.columns.map(c => c.title).join(', ')}`);\n return false;\n }\n if (targetCol.id === board.columns[sourceColIdx].id) return true; // already there\n\n board.columns[sourceColIdx].cards.splice(cardIdx, 1);\n\n card.order = targetCol.cards.length;\n card.updatedAt = new Date().toISOString();\n card.history = [...(card.history ?? []), {\n type: 'moved',\n timestamp: new Date().toISOString(),\n detail: `\"${sourceCol}\" → \"${targetCol.title}\"`,\n author: 'ai',\n }];\n\n targetCol.cards.push(card);\n return true;\n}\n\nfunction addCardToColumn(board: KanbanBoard, columnTitle: string, cardTitle: string, cardContent?: string): void {\n const col = board.columns.find(c => c.title.toLowerCase() === columnTitle.toLowerCase());\n // Ignore if column doesn't exist — AI must use existing columns\n if (!col) return;\n const now = new Date().toISOString();\n const card: KanbanCard = {\n id: randomUUID(),\n title: cardTitle,\n markdown: cardContent ?? '',\n images: [],\n order: col.cards.length,\n history: [{ type: 'created', timestamp: now, detail: `AI — In column \"${col.title}\"` }],\n createdAt: now,\n updatedAt: now,\n };\n col.cards.push(card);\n}\n\nfunction addComment(board: KanbanBoard, cardId: string, comment: string, conversationId?: string): void {\n for (const col of board.columns) {\n const card = col.cards.find(c => c.id === cardId);\n if (card) {\n card.history = [...(card.history ?? []), {\n type: 'comment',\n timestamp: new Date().toISOString(),\n detail: comment,\n author: 'ai',\n ...(conversationId ? { conversationId } : {}),\n }];\n card.updatedAt = new Date().toISOString();\n return;\n }\n }\n}\n\n// ─── System prompt for kanban context ───────────────────────────────────────\n\nexport function generateKanbanSystemPrompt(board: KanbanBoard, cardId: string): string {\n let currentColTitle = '';\n let card = null;\n for (const col of board.columns) {\n const found = col.cards.find(c => c.id === cardId);\n if (found) {\n currentColTitle = col.title;\n card = found;\n break;\n }\n }\n\n const sortedColumns = [...board.columns].sort((a, b) => a.order - b.order);\n\n const lines: string[] = [];\n lines.push('## Kanban Board Context');\n lines.push('');\n lines.push(`Tu travailles dans le contexte d'une carte Kanban.`);\n lines.push(`- **Board** : ${board.name}`);\n if (card) {\n lines.push(`- **Carte** : ${card.title}`);\n lines.push(`- **Colonne actuelle** : \\`${currentColTitle}\\``);\n }\n lines.push('');\n\n // List columns explicitly so the AI knows the exact names to use\n lines.push('### Colonnes disponibles (noms exacts à utiliser) :');\n for (const col of sortedColumns) {\n const cardCount = col.cards.length;\n const isCurrent = card && col.cards.some(c => c.id === cardId);\n lines.push(`- \\`${col.title}\\` (${cardCount} carte${cardCount !== 1 ? 's' : ''})${isCurrent ? ' ← **colonne actuelle**' : ''}`);\n }\n lines.push('');\n\n // Inject existing comments\n if (card) {\n const comments = (card.history ?? []).filter(e => e.type === 'comment');\n if (comments.length > 0) {\n lines.push('### Commentaires existants sur cette carte :');\n lines.push('');\n for (const c of comments.slice(-20)) { // Last 20 comments max\n const who = c.author === 'ai' ? 'AI' : 'Utilisateur';\n const date = new Date(c.timestamp).toLocaleString('fr-FR', { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' });\n lines.push(`- **${who}** (${date}) : ${c.detail}`);\n }\n lines.push('');\n }\n }\n\n lines.push('### Outils Kanban disponibles');\n lines.push('');\n lines.push(`- **boardId** (à passer dans tous les outils) : \\`${board.id}\\``);\n if (card) lines.push(`- **cardId** (carte actuelle) : \\`${card.id}\\``);\n lines.push('');\n lines.push('Tu disposes des outils suivants pour interagir avec le board :');\n lines.push('- `kanban_move_card(boardId, cardId, targetColumn)` — Déplacer la carte vers une autre colonne');\n lines.push('- `kanban_add_comment(boardId, cardId, comment)` — Ajouter un commentaire sur la carte');\n lines.push('');\n lines.push('### OBLIGATOIRE — Décision Kanban');\n lines.push('');\n lines.push('À chaque réponse, tu DOIS obligatoirement faire les deux actions suivantes :');\n lines.push('');\n lines.push('**1. Évaluer et déplacer la carte si nécessaire** via `kanban_move_card` :');\n lines.push(' - **Au début** si tu sais déjà que tu vas travailler activement (ex. tu passes en `In progress`).');\n lines.push(' - **À la fin** pour une décision forte après analyse complète (ex. tu conclus que c\\'est `Done`).');\n lines.push(' - Si tu ne fais qu\\'analyser ou poser des questions → **ne pas déplacer**.');\n lines.push('');\n lines.push(' > ⚠️ **CRITIQUE** : En fin de réponse, tu DOIS TOUJOURS évaluer si la colonne actuelle est encore correcte.');\n lines.push('');\n lines.push('**2. Appeler `kanban_add_comment`** résumant ce que tu as fait ou constaté (**à la fin** de ta réponse).');\n lines.push('');\n lines.push('> 🚫 **INTERDIT** : Terminer une réponse sans appeler `kanban_add_comment`. C\\'est non négociable.');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n// ─── Board-level populate prompt ─────────────────────────────────────────────\n\nexport function generateKanbanPopulatePrompt(board: KanbanBoard): string {\n const lines: string[] = [];\n lines.push('## Kanban Board — Mode Populate');\n lines.push('');\n lines.push(`Tu es en mode **populate** sur le tableau Kanban **\"${board.name}\"**.`);\n lines.push('Tu es un outil de gestion de projet. Quand l\\'utilisateur dit \"créer une card\", \"ajouter une tâche\", \"créer une carte\", ou toute demande similaire, il parle EXCLUSIVEMENT d\\'une carte Kanban à ajouter au tableau — PAS d\\'un composant UI, PAS de code HTML ou CSS, PAS d\\'un composant React/Vue/Angular.');\n lines.push('');\n lines.push('Ton UNIQUE rôle est de créer des cartes Kanban pertinentes en réponse à la demande de l\\'utilisateur.');\n lines.push('Tu ne dois PAS répondre à la question, ni donner d\\'explication, ni écrire du code, ni montrer de composant.');\n lines.push('Tu dois UNIQUEMENT produire des tags XML `<kanban_add_card>` pour créer des cartes dans le tableau.');\n if (board.description) {\n lines.push('');\n lines.push(`Description du board : ${board.description}`);\n }\n lines.push('');\n\n const sortedCols = [...board.columns].sort((a, b) => a.order - b.order);\n\n lines.push('### Colonnes existantes (noms exacts à utiliser) :');\n for (const col of sortedCols) {\n const cardCount = col.cards.length;\n lines.push(`- \\`${col.title}\\` (${cardCount} carte${cardCount !== 1 ? 's' : ''})`);\n for (const card of col.cards) {\n lines.push(` - ${card.title}`);\n }\n }\n lines.push('');\n\n lines.push('### Outil disponible');\n lines.push('');\n lines.push(`- **boardId** (à passer dans tous les outils) : \\`${board.id}\\``);\n lines.push('');\n lines.push('Pour chaque carte à créer, appelle l\\'outil `kanban_add_card(boardId, column, title, content)` :');\n lines.push('- `column` : nom exact de la colonne cible');\n lines.push('- `title` : titre concis de la carte');\n lines.push('- `content` : contenu markdown détaillé et actionnable');\n lines.push('');\n lines.push('### Règles STRICTES');\n lines.push('');\n lines.push('1. **NE RÉPONDS PAS** à la question de l\\'utilisateur. Ne donne aucune explication, aucun texte libre.');\n lines.push('2. **Appelle uniquement** `kanban_add_card`, rien d\\'autre.');\n lines.push('3. Tu ne peux PAS créer de nouvelles colonnes. Dispatch les cartes dans les colonnes existantes listées ci-dessus.');\n lines.push('4. Utilise les noms **exacts** des colonnes.');\n lines.push('5. Chaque carte doit avoir un titre concis et un contenu markdown détaillé et actionnable.');\n lines.push('6. Décompose la demande de l\\'utilisateur en tâches concrètes, chacune étant une carte.');\n lines.push('7. Dispatch chaque carte dans la colonne la plus appropriée selon sa nature.');\n lines.push('');\n\n return lines.join('\\n');\n}\n","import { randomUUID } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport { readFile, writeFile, rename, mkdir, chmod } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { env } from '../config/env.js';\nimport { encryptValue, decryptValue } from './crypto-helpers.js';\nimport type { KanbanBoard, CreateKanbanBoardInput, UpdateKanbanBoardInput } from '@runeya/packages-shared';\n\nexport type KanbanChangeEvent =\n | { type: 'created'; board: KanbanBoard }\n | { type: 'updated'; board: KanbanBoard }\n | { type: 'deleted'; id: string };\n\nconst FILENAME = 'kanban.private.json.enc';\n\nclass KanbanStore {\n private boards: Map<string, KanbanBoard> = new Map();\n private loaded = false;\n private readonly events = new EventEmitter();\n private saveTimer: ReturnType<typeof setTimeout> | null = null;\n\n private getFilePath(): string {\n return join(env.DATA_DIR, FILENAME);\n }\n\n private async ensureDir(): Promise<void> {\n await mkdir(env.DATA_DIR, { recursive: true });\n }\n\n private async load(): Promise<void> {\n if (this.loaded) return;\n try {\n const encrypted = await readFile(this.getFilePath(), 'utf-8');\n const raw = decryptValue(encrypted);\n const data: KanbanBoard[] = JSON.parse(raw);\n for (const b of data) {\n this.boards.set(b.id, b);\n }\n } catch {\n // File doesn't exist yet or decryption failed, start empty\n }\n this.loaded = true;\n }\n\n private async saveNow(): Promise<void> {\n await this.ensureDir();\n const filePath = this.getFilePath();\n const tmpPath = filePath + '.tmp';\n const json = JSON.stringify(Array.from(this.boards.values()), null, 2);\n const encrypted = encryptValue(json);\n await writeFile(tmpPath, encrypted, 'utf-8');\n await rename(tmpPath, filePath);\n await chmod(filePath, 0o600);\n }\n\n private save(): void {\n if (this.saveTimer) clearTimeout(this.saveTimer);\n this.saveTimer = setTimeout(() => {\n this.saveNow().catch((err) => {\n console.error('[kanban-store] save failed:', err);\n });\n }, 200);\n }\n\n async list(includeArchived = false): Promise<KanbanBoard[]> {\n await this.load();\n const all = Array.from(this.boards.values());\n return includeArchived ? all : all.filter(b => !b.archived);\n }\n\n async get(id: string): Promise<KanbanBoard | null> {\n await this.load();\n return this.boards.get(id) ?? null;\n }\n\n async create(input: CreateKanbanBoardInput): Promise<KanbanBoard> {\n await this.load();\n const now = new Date().toISOString();\n const board: KanbanBoard = {\n id: randomUUID(),\n name: input.name,\n description: input.description ?? '',\n columns: [],\n archived: false,\n createdAt: now,\n updatedAt: now,\n };\n this.boards.set(board.id, board);\n this.save();\n this.events.emit('changed', { type: 'created', board } as KanbanChangeEvent);\n return board;\n }\n\n async update(input: UpdateKanbanBoardInput): Promise<KanbanBoard | null> {\n await this.load();\n const existing = this.boards.get(input.id);\n if (!existing) return null;\n const updated: KanbanBoard = {\n ...existing,\n ...(input.name !== undefined && { name: input.name }),\n ...(input.description !== undefined && { description: input.description }),\n ...(input.columns !== undefined && { columns: input.columns }),\n ...(input.archived !== undefined && { archived: input.archived }),\n updatedAt: new Date().toISOString(),\n };\n this.boards.set(input.id, updated);\n this.save();\n this.events.emit('changed', { type: 'updated', board: updated } as KanbanChangeEvent);\n return updated;\n }\n\n async delete(id: string): Promise<boolean> {\n await this.load();\n if (!this.boards.has(id)) return false;\n this.boards.delete(id);\n this.save();\n this.events.emit('changed', { type: 'deleted', id } as KanbanChangeEvent);\n return true;\n }\n\n onChanged(handler: (event: KanbanChangeEvent) => void): void {\n this.events.on('changed', handler);\n }\n\n offChanged(handler: (event: KanbanChangeEvent) => void): void {\n this.events.off('changed', handler);\n }\n}\n\nexport const kanbanStore = new KanbanStore();\n"],"mappings":"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","names":["randomUUID","randomUUID"]}
|