@runeya/runeya 2.0.106 → 2.0.108
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-manager-EI7SXPN5.js +9 -0
- package/{chat-N6XONNVG.js → chat-WMT34BXJ.js} +6 -6
- package/{chunk-YQISK6BL.js → chunk-4SJCPFGK.js} +401 -72
- package/chunk-4SJCPFGK.js.map +1 -0
- package/{chunk-5GYBAMHV.js → chunk-D2PF2FYU.js} +2 -2
- package/{chunk-CQCCVPTX.js → chunk-DS66SEYH.js} +29 -7
- package/chunk-DS66SEYH.js.map +1 -0
- package/{chunk-NPORVPEO.js → chunk-RIITTBK3.js} +2 -2
- package/{chunk-LTLOVQJQ.js → chunk-ZFELQG4B.js} +49 -3
- package/chunk-ZFELQG4B.js.map +1 -0
- package/{companion-7AFRBUQI.js → companion-EPINTIC7.js} +4 -4
- package/index.js +3 -3
- package/package.json +1 -1
- package/settings-manager-YSH7ZCLP.js +9 -0
- package/{src-US4EBM64.js → src-LONZKLMU.js} +174 -42
- package/src-LONZKLMU.js.map +1 -0
- package/{vault-resolver-JR7TCITD.js → vault-resolver-57Q2DVOR.js} +8 -2
- package/web/assets/AgentScalarChatInterface.vue-CElmj8LJ.js +13 -0
- package/web/assets/AgentTerminalPage-hk46uwat.js +1 -0
- package/web/assets/AiChatPage-wCWG0TXA.js +1 -0
- package/web/assets/{AppLayout-EhZfYcsl.css → AppLayout-6LmWDDMH.css} +1 -1
- package/web/assets/AppLayout-CHxGU2pw.js +1 -0
- package/web/assets/AuditPage-CSRVCGZi.js +1 -0
- package/web/assets/CloudAccountPage-CfMY69pk.css +1 -0
- package/web/assets/CloudAccountPage-DjQdxy2v.js +1 -0
- package/web/assets/CloudAccountPage-UnmpE1jD.js +1 -0
- package/web/assets/CloudMessagingPage-BRwxGiH2.css +1 -0
- package/web/assets/CloudMessagingPage-jh1AWzKj.js +2 -0
- package/web/assets/DashboardPage-CiihNr9b.js +164 -0
- package/web/assets/DirectoryPickerDialog-Dy1zyHux.js +1 -0
- package/web/assets/{EditorIcon-BWhMJTSH.js → EditorIcon-DvX4OCO1.js} +2 -2
- package/web/assets/EnvironmentForm-D2JDn5Zc.js +108 -0
- package/web/assets/EnvironmentFormPage-BPDo_AMy.js +1 -0
- package/web/assets/EnvironmentListPage-BFT6nMkR.js +1 -0
- package/web/assets/KanbanBoardPage-6vbnqxkk.js +4 -0
- package/web/assets/KanbanBoardPage-CoTX8nB6.css +1 -0
- package/web/assets/KanbanListPage-BBLCnzN8.js +1 -0
- package/web/assets/LaunchProjectPage-BHLH3peH.css +1 -0
- package/web/assets/LaunchProjectPage-Cznkvcvm.js +1 -0
- package/web/assets/LaunchServicesPage-DwkYQefD.js +1 -0
- package/web/assets/LogViewer-x7JfZfN8.js +3 -0
- package/web/assets/OrgKeyPrompt-DPWfDcID.js +1 -0
- package/web/assets/{ProcessControls-B6blcC2b.js → ProcessControls-DPOmEvIy.js} +1 -1
- package/web/assets/ProcessDetailPage-BDsM9dnQ.js +1 -0
- package/web/assets/{ProcessMetrics-luXa72sd.js → ProcessMetrics-C2YI8_M5.js} +2 -2
- package/web/assets/{RandomJobTestPage-uuy7by63.js → RandomJobTestPage-DGA72-VM.js} +1 -1
- package/web/assets/ScenarioEditorPage-B4zEfHEz.js +14 -0
- package/web/assets/SendToChatDialog-8RfesH1F.js +1 -0
- package/web/assets/ServiceControlsBar-DLHgd13V.js +1 -0
- package/web/assets/ServiceDetailPage-na_wgdlZ.js +2 -0
- package/web/assets/ServiceFormPage-Cn_FPvKf.js +1 -0
- package/web/assets/{SettingsPage-CrzdGJlG.css → SettingsPage-B7yKfXK2.css} +1 -1
- package/web/assets/SettingsPage-QBOlzawK.js +2063 -0
- package/web/assets/UnlockPage-A75PjxBe.js +1 -0
- package/web/assets/VariablesTable-D8Oh3-1C.js +1 -0
- package/web/assets/VaultMigrationPage-DA9H-AhS.js +1 -0
- package/web/assets/VersionBadge-DNDzBQcJ.js +1 -0
- package/web/assets/WikiPage-DdY1dy8w.js +1 -0
- package/web/assets/WikiView-Td2Ice0P.js +1 -0
- package/web/assets/add-scalar-classes-D0W5Egzt.js +387 -0
- package/web/assets/{autocomplete-COj-K1Nc.js → autocomplete-DXp2_8rJ.js} +3 -3
- package/web/assets/{basic-shape-diamond.svg-Dw9kJc3l.js → basic-shape-diamond.svg-CUsdhYKG.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-DeTUNvAm.js → basic-shape-hexagon.svg-BPfS9EDA.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-CZe21n5k.js → basic-shape-primary-circle-ellipse-round.svg-C0Y2bkJl.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-DIvBb7uH.js → basic-shape-primary-square-rectangle.svg-1LwihH2B.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-D2Ttq4yx.js → basic-shape-shield.svg-DGe2vG6Z.js} +1 -1
- package/web/assets/{browser-BtPtEa-Z.js → browser-CQu9nsVO.js} +1 -1
- package/web/assets/{browser-8qE0e05E.js → browser-QoavDMKL.js} +1 -1
- package/web/assets/{card-pbrPkbmk.js → card-zbAp8JZP.js} +2 -2
- package/web/assets/{checkbox-g16PaQaN.js → checkbox-BKV4svPN.js} +3 -3
- package/web/assets/{chip-B1jaR69s.js → chip-DA83o4Kg.js} +2 -2
- package/web/assets/client-Cb_xJW-8.js +24 -0
- package/web/assets/cloud-chat.store-BA5nPaX6.js +1 -0
- package/web/assets/cloud-client-C_MUljS_.js +1 -0
- package/web/assets/cloud-session-BRyDsLxd.js +1 -0
- package/web/assets/cloud-session-DqTwnX4d.js +2 -0
- package/web/assets/column-BVUPaQkA.js +907 -0
- package/web/assets/{computer-device-desktop-monitor.svg-BpU1vmqL.js → computer-device-desktop-monitor.svg-CAldNRkh.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-CofWATKj.js → computer-device-desktop.svg-DwVKMGyS.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-Bk0WdntU.js → computer-device-laptop.svg-fyjI7tSV.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-4jDLeTUE.js → computer-device-mobile-phone-android-samsung-back.svg-CNHunNo4.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-BtDfk53W.js → computer-device-mobile-phone-android-samsung.svg-WhhpuflD.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-mrfLt2LS.js → computer-device-mobile-phone-iphone-x-back.svg-RveI1E1x.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-D3hLzA-f.js → computer-device-mobile-phone-iphone-x.svg-Cyjp0aan.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-URFOvX2G.js → computer-device-mobile-tablet-touch.svg-u88Qx92m.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-CIdkHAYo.js → computer-device-mobile-tablet.svg-Dzdz4e4O.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-BEC9unNd.js → computer-device-network-ethernet-cat6.svg-BW1j1BkJ.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-C_WEyWn-.js → computer-device-network-lan-www.svg-CxNGv37e.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-D2xhIyf7.js → computer-device-network-wifi-connection.svg-Ck3nAZv3.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-DwIQxKAQ.js → computer-device-network-wifi-router.svg-gWXKoMXh.js} +1 -1
- package/web/assets/{cssMode-YcxdUWNT.js → cssMode-D8Jyxeqc.js} +1 -1
- package/web/assets/{divider-C95jkWZ7.js → divider-D-Mvqkj1.js} +2 -2
- package/web/assets/{docx-preview-B1K7Js_Q.js → docx-preview-DxSIfBtK.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-DOmkHECy.js → ecology-science-erlenmeyer-flask.svg-psfHQe5z.js} +1 -1
- package/web/assets/{fieldset-DEPqiZWe.js → fieldset-oHSSpvVY.js} +2 -2
- package/web/assets/{freemarker2-Bzhvjbz4.js → freemarker2-DlJBY4WY.js} +1 -1
- package/web/assets/{handlebars-CymxzXg4.js → handlebars-DTEXdr2O.js} +1 -1
- package/web/assets/{html-CouVDmTR.js → html-eYBbc2Bx.js} +1 -1
- package/web/assets/{htmlMode-Be-vsCic.js → htmlMode-B4O_yjGK.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-CTaPLIBa.js → image-flash-lightning.svg-r_oTLRoo.js} +1 -1
- package/web/assets/{image-picture-flower.svg-BkIdyuJf.js → image-picture-flower.svg-8nv9asUS.js} +1 -1
- package/web/assets/{index-DkeyMLje.js → index-B9x3uCZ9.js} +6 -6
- package/web/assets/{interface-alert-exclamation-diamond.svg-LE6wXJfb.js → interface-alert-exclamation-diamond.svg-A5K0l-78.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-DnJUBUVG.js → interface-alert-exclamation-triangle-warning.svg-Dq66i82G.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-BBESAf3A.js → interface-alert-information-circle.svg-B4ROZIk0.js} +1 -1
- package/web/assets/{interface-award-crown.svg-A9FnpbJ_.js → interface-award-crown.svg-DRnv1a4n.js} +1 -1
- package/web/assets/{interface-bookmark.svg-BMCuN1KQ.js → interface-bookmark-tag.svg-Dwwi4iOX.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-CONBx7yi.js → interface-bookmark.svg-CopCSuT2.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-BsHBSc-o.js → interface-calendar-date-one.svg-BxkYYC67.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-BsndNDne.js → interface-content-book-open-pages.svg-BJozsCHP.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-D9O4ldas.js → interface-content-book-page.svg-CbWXY0Yb.js} +1 -1
- package/web/assets/{interface-content-file.svg-3hZDtYrB.js → interface-content-file.svg-Ck3RuXRm.js} +1 -1
- package/web/assets/{interface-content-folder.svg-D2PGz4rg.js → interface-content-folder.svg-LK0HJ4yQ.js} +1 -1
- package/web/assets/interface-content-folder.svg-pxt6DqMZ.js +1 -0
- package/web/assets/{interface-copy-clipboard.svg-DDENzgQo.js → interface-copy-clipboard.svg-vkTPN1aA.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-D2cQZV5Q.js → interface-edit-attachment.svg-CjCh5Lb1.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-DrIFa0gk.js → interface-edit-binocular.svg-Dos2P4t_.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-AnGByEQd.js → interface-edit-magic-wand.svg-fxAohPEI.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-KNrFMeco.js → interface-edit-tool-paint-roller.svg-JLIYavUO.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-DF9u9WDQ.js → interface-edit-tool-pencil.svg-Tkm527sw.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-mkb9vXWE.js → interface-favorite-award.svg-O-HQC6xP.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-BDIYdX-W.js → interface-favorite-flag.svg-DWSuqI-W.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-DtIvO6z9.js → interface-favorite-heart.svg-3md2synz.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-CEv2Io1P.js → interface-favorite-star.svg-MnNO7Wk6.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-D0SoJbJE.js → interface-favorite-stars-sparkles.svg-WKCS18Oo.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-B-kMOZH8.js → interface-hierarchy-flowchart.svg-KnHJ7War.js} +1 -1
- package/web/assets/{interface-home-house.svg-FOYUzOig.js → interface-home-house.svg-2bdYCM0o.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-BaPGYtZM.js → interface-hyperlink.svg-dTQQRFwy.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-ddMiifOe.js → interface-lighting-brightness.svg-CwI2OM6O.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-WGGCrOPW.js → interface-lock-closed.svg-BcnsrWQP.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-BHdzRkd9.js → interface-lock-open-unlock.svg-Du_CfbnO.js} +1 -1
- package/web/assets/{interface-login-key.svg-C-CaH8gN.js → interface-login-key.svg-C3Hh7Lxb.js} +1 -1
- package/web/assets/{interface-search.svg-BWvztnST.js → interface-search.svg-DRez-w7-.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-BiiP7i7e.js → interface-setting-cog.svg-BbO7fWvj.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-BaNwYllj.js → interface-share-megaphone-bullhorn.svg-BbNIqS3V.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-DpVzHxi1.js → interface-share-rocket.svg-NYzb39WL.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-DVMadDln.js → interface-share-satellite.svg-BVbcZIy6.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-B1a7LlLT.js → interface-share-space-ship.svg-BFY5IO9d.js} +1 -1
- package/web/assets/{interface-share.svg-BknNtx4U.js → interface-share.svg-BTd9ID7k.js} +1 -1
- package/web/assets/{interface-signal-square.svg-DTf1mlii.js → interface-signal-square.svg-MjEdhTXk.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-DT6LHPex.js → interface-time-clock-circle.svg-ChSylXjE.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-CNCTqw_R.js → interface-time-hour-glass.svg-BZQl9M_C.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-DuMlS4pH.js → interface-users-multiple.svg-BmvFtDD2.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-BfOraF6E.js → interface-weather-moon.svg-CU_uP2aE.js} +1 -1
- package/web/assets/{javascript-CSbYcb4a.js → javascript-CzJXS_Bo.js} +1 -1
- package/web/assets/{jsonMode-BfABTJ_P.js → jsonMode-ClLnazHL.js} +1 -1
- package/web/assets/{liquid-D8zk2iFJ.js → liquid-k8yO1VdQ.js} +1 -1
- package/web/assets/{lspLanguageFeatures-CDjcX5cq.js → lspLanguageFeatures-BdUk3xiz.js} +3 -3
- package/web/assets/{mail-chat-bubble-square.svg-B57LhJ7L.js → mail-chat-bubble-square.svg-UruTYt7K.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-Zh4WfmfD.js → mail-send-email-paper-airplane.svg-CQ8gOMxm.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-B3JTaotd.js → mail-send-envelope.svg-B8XF7xYz.js} +1 -1
- package/web/assets/{mdx-Rt1S5V6O.js → mdx-Dpg5Mbqd.js} +1 -1
- package/web/assets/{minus-h_LYd9EK.js → minus-CM-56m8R.js} +2 -2
- package/web/assets/modal-DD3RK2dR.js +5 -0
- package/web/assets/modal-DXywOsPE.js +1 -0
- package/web/assets/{money-cashier-receipt.svg-BYcjjmII.js → money-cashier-receipt.svg-BGvvrVYh.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-D_eoPfYw.js → money-currency-dollar-pay.svg-oPVgaUnC.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-BVafbTUR.js → money-graph-arrow-increase.svg-DbW43WXz.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-DFCnoSVq.js → money-graph-bar-chart-increase.svg-BecdDdvJ.js} +1 -1
- package/web/assets/multiselect-Bk3EZIJC.js +251 -0
- package/web/assets/{nature-ecology-leaf.svg-DI19KkR3.js → nature-ecology-leaf.svg-CZxwEqo2.js} +1 -1
- package/web/assets/{password-BQyr-83Q.js → password-CJ4ckRGW.js} +4 -4
- package/web/assets/{phone-telephone.svg-si7GWPbw.js → phone-telephone.svg-U4WTbEXR.js} +1 -1
- package/web/assets/{plus-yTeMgVZF.js → plus-DvnsNNSA.js} +6 -6
- package/web/assets/process.store-utLBiVI8.js +1 -0
- package/web/assets/{programming-bug.svg-C8_FsRk_.js → programming-bug.svg-D-ueh13g.js} +1 -1
- package/web/assets/{programming-cloud.svg-Djjnh8pM.js → programming-cloud.svg-DW3eNYjS.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-Cw72ZkUG.js → programming-computer-database-server.svg-bBeXwbmi.js} +1 -1
- package/web/assets/{programming-computer-database.svg-C0Z7_RVR.js → programming-computer-database.svg-DP1oJ-Xb.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-BvERcUAT.js → programming-module-four-layout.svg-BCRfiu3A.js} +1 -1
- package/web/assets/{programming-module-three.svg-BkoUon6u.js → programming-module-three.svg-Cb8y-suF.js} +1 -1
- package/web/assets/{programming-module.svg-CK1yw5W-.js → programming-module.svg-CCF23Kn-.js} +1 -1
- package/web/assets/{programming-script-code.svg-BhU73hpj.js → programming-script-code.svg-D7zugBoU.js} +1 -1
- package/web/assets/project-launch.store-D0bLcuPZ.js +1 -0
- package/web/assets/project.store-BcKEFAKW.js +1 -0
- package/web/assets/{python-CSf8HAN9.js → python-C2Xee937.js} +1 -1
- package/web/assets/{razor-BKjp9q-U.js → razor-DP11amFn.js} +1 -1
- package/web/assets/router-BhS8cxIJ.js +1 -0
- package/web/assets/settings-scope-KsJCT82K.js +1 -0
- package/web/assets/{settings.store-BBoXO9_c.js → settings.store-FxdXT3wT.js} +1 -1
- package/web/assets/{shopping-cart.svg-CgRtQ4k-.js → shopping-cart.svg-DWikcMT4.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-XdAdBUaO.js → shopping-gift-present.svg-4RQmBLlg.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-BaFPv3xL.js → shopping-shipping-box-parcel-package.svg-D1lBxinA.js} +1 -1
- package/web/assets/src-BQn5mgNu.js +1 -0
- package/web/assets/src-Dq9wfPM5.css +1 -0
- package/web/assets/{src-DeCIcklm.js → src-Dwvd5kd0.js} +33 -33
- package/web/assets/src-vE4VZ3D3.js +572 -0
- package/web/assets/tabpanel-ep3FBKze.js +150 -0
- package/web/assets/{tag-new-circle.svg-BwxdYwp4.js → tag-new-circle.svg-C1MFrgC6.js} +1 -1
- package/web/assets/theme-DAUZuThi.js +1 -0
- package/web/assets/{toggleswitch-DKXm3drm.js → toggleswitch-6H_VuZ4L.js} +2 -2
- package/web/assets/{travel-map-earth-globe.svg-B3QIUens.js → travel-map-earth-globe.svg-tCJZglOg.js} +1 -1
- package/web/assets/trpc-DZ27KTOo.js +1 -0
- package/web/assets/{tsMode-KbYg0Qfw.js → tsMode-9MCfBuVI.js} +5 -5
- package/web/assets/{typescript-UzU12abv.js → typescript-BPNkI37D.js} +1 -1
- package/web/assets/useAiChatDrawer-tSsNrRPY.js +1 -0
- package/web/assets/useCloudOrg-kMh7h7gI.js +1 -0
- package/web/assets/useProjectCatalog-BkL5z9lS.js +1 -0
- package/web/assets/useProjectCloudOrg-qr_xZto1.js +1 -0
- package/web/assets/{xml-CkgxvNFc.js → xml-CsWY9129.js} +1 -1
- package/web/assets/{yaml-Cjr4aAq9.js → yaml-CUnJQoDT.js} +1 -1
- package/web/index.html +1 -1
- package/agent-manager-4XJUIZKL.js +0 -9
- package/chunk-CQCCVPTX.js.map +0 -1
- package/chunk-LTLOVQJQ.js.map +0 -1
- package/chunk-YQISK6BL.js.map +0 -1
- package/settings-manager-Y4GNAXOH.js +0 -9
- package/src-US4EBM64.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-BXv2YF_7.js +0 -13
- package/web/assets/AgentTerminalPage-HbM44kg8.js +0 -1
- package/web/assets/AiChatPage-BTsALiaV.js +0 -1
- package/web/assets/AppLayout-DJ1dZUtQ.js +0 -1
- package/web/assets/AuditPage-CF53LMHt.js +0 -1
- package/web/assets/CloudAccountPage-BttYjaR8.js +0 -1
- package/web/assets/CloudAccountPage-Dou70Ljn.js +0 -1
- package/web/assets/CloudAccountPage-g6lFVpsX.css +0 -1
- package/web/assets/CloudMessagingPage-D15sTToL.js +0 -2
- package/web/assets/CloudMessagingPage-Dl7hHYeb.css +0 -1
- package/web/assets/DashboardPage-inYgcB3J.js +0 -164
- package/web/assets/DirectoryPickerDialog-DDWbon2r.js +0 -1
- package/web/assets/EnvironmentForm-DG_9AXml.js +0 -108
- package/web/assets/EnvironmentFormPage-DYmI2BfZ.js +0 -1
- package/web/assets/EnvironmentListPage-D2l91HzS.js +0 -1
- package/web/assets/KanbanBoardPage-BOVq3zOt.css +0 -1
- package/web/assets/KanbanBoardPage-BPH1ywhH.js +0 -4
- package/web/assets/KanbanListPage-Bj9-EbPv.js +0 -1
- package/web/assets/LaunchProjectPage-CHpVVYBa.css +0 -1
- package/web/assets/LaunchProjectPage-ObKhBvlS.js +0 -1
- package/web/assets/LaunchServicesPage-CAdAAyfG.js +0 -1
- package/web/assets/LogViewer-QRpqcjXC.js +0 -3
- package/web/assets/OrgKeyPrompt-uMjz7Y5A.js +0 -1
- package/web/assets/ProcessDetailPage-Bi5vk4ah.js +0 -1
- package/web/assets/ScenarioEditorPage-oyhLaoVE.js +0 -14
- package/web/assets/SendToChatDialog-BnZEu35Q.js +0 -1
- package/web/assets/ServiceControlsBar-Dp3r57J4.js +0 -1
- package/web/assets/ServiceDetailPage-DBm79vOL.js +0 -2
- package/web/assets/ServiceFormPage-BGWjKCUH.js +0 -1
- package/web/assets/SettingsPage-BIVmZT7t.js +0 -2063
- package/web/assets/UnlockPage-DYRFhdrT.js +0 -1
- package/web/assets/VariablesTable-Cbc_RlnE.js +0 -1
- package/web/assets/VaultMigrationPage-GlJyIJAw.js +0 -1
- package/web/assets/VersionBadge-CSX89ryT.js +0 -1
- package/web/assets/WikiPage-DAPhZkpS.js +0 -1
- package/web/assets/WikiView-DyU4eNEh.js +0 -1
- package/web/assets/add-scalar-classes-CxpzHvBM.js +0 -387
- package/web/assets/client-DZg134cQ.js +0 -24
- package/web/assets/cloud-chat.store-D899jVQ4.js +0 -1
- package/web/assets/cloud-session-DSjPbs8C.js +0 -1
- package/web/assets/column-Pmg7Ma5f.js +0 -907
- package/web/assets/interface-content-folder.svg-GTysMuP_.js +0 -1
- package/web/assets/modal--Ilf4bg_.js +0 -5
- package/web/assets/modal-Wk0CWaUJ.js +0 -1
- package/web/assets/multiselect-DlGWFLJR.js +0 -251
- package/web/assets/process.store-CvrK-4rR.js +0 -1
- package/web/assets/project-launch.store-D5cyKKyw.js +0 -1
- package/web/assets/project.store-OwPRdjA0.js +0 -1
- package/web/assets/router-DuWVvMLT.js +0 -1
- package/web/assets/settings-scope-D7NFCXjg.js +0 -1
- package/web/assets/src-CRQ32_Qg.js +0 -1
- package/web/assets/src-S24lFUYb.js +0 -572
- package/web/assets/src-dpFgucNZ.css +0 -1
- package/web/assets/tabpanel-DbMhKzgJ.js +0 -150
- package/web/assets/theme-pRVEu5SJ.js +0 -1
- package/web/assets/trpc-Cf_8kWCl.js +0 -1
- package/web/assets/useAiChatDrawer-DCVhP5N0.js +0 -1
- package/web/assets/useCloudOrg-CXvwb5Fo.js +0 -1
- package/web/assets/useProjectCatalog-Bth_aDP4.js +0 -1
- package/web/assets/useProjectCloudOrg-MUCjKP3P.js +0 -1
- /package/{agent-manager-4XJUIZKL.js.map → agent-manager-EI7SXPN5.js.map} +0 -0
- /package/{chat-N6XONNVG.js.map → chat-WMT34BXJ.js.map} +0 -0
- /package/{chunk-5GYBAMHV.js.map → chunk-D2PF2FYU.js.map} +0 -0
- /package/{chunk-NPORVPEO.js.map → chunk-RIITTBK3.js.map} +0 -0
- /package/{companion-7AFRBUQI.js.map → companion-EPINTIC7.js.map} +0 -0
- /package/{settings-manager-Y4GNAXOH.js.map → settings-manager-YSH7ZCLP.js.map} +0 -0
- /package/{vault-resolver-JR7TCITD.js.map → vault-resolver-57Q2DVOR.js.map} +0 -0
- /package/web/assets/{abap-DIWaXxy4.js → abap-B8g_2xYy.js} +0 -0
- /package/web/assets/{apex-D4-KnjW_.js → apex-Bm8w4T5A.js} +0 -0
- /package/web/assets/{azcli-IfDsRCLo.js → azcli-BqdUW6F8.js} +0 -0
- /package/web/assets/{bat-DWkIEnW3.js → bat-Bngf0lQU.js} +0 -0
- /package/web/assets/{bicep-CsOqEKmZ.js → bicep-DzO554JS.js} +0 -0
- /package/web/assets/{browser-BRPZK8RN.js → browser-BJX5ZrVN.js} +0 -0
- /package/web/assets/{cameligo-CVJihesZ.js → cameligo-Bcy3ohdb.js} +0 -0
- /package/web/assets/{clojure-CPXjbAsV.js → clojure-CZbiqkDV.js} +0 -0
- /package/web/assets/{coffee-Dk6AGUBs.js → coffee-CDuhyV-7.js} +0 -0
- /package/web/assets/{cpp-D8TcNCkN.js → cpp-BklV8f4x.js} +0 -0
- /package/web/assets/{csharp-B_ijQZWm.js → csharp-BelR_XiC.js} +0 -0
- /package/web/assets/{csp-CT_qVlF1.js → csp-DUjeBS2K.js} +0 -0
- /package/web/assets/{css-BNKulUcx.js → css-CvbYbEko.js} +0 -0
- /package/web/assets/{cypher-BZUAEEC-.js → cypher-Dwrbk-SP.js} +0 -0
- /package/web/assets/{dart-H8Ri9IID.js → dart-BW1E5h9O.js} +0 -0
- /package/web/assets/{dockerfile-BibtL7_E.js → dockerfile-B41ilpF9.js} +0 -0
- /package/web/assets/{ecl-Cq6OzwoI.js → ecl-BZE6Vxna.js} +0 -0
- /package/web/assets/{elixir-DEzZo1Bn.js → elixir-CtYg0bLh.js} +0 -0
- /package/web/assets/{flow9-CJjg7TJH.js → flow9-Sgvy48_I.js} +0 -0
- /package/web/assets/{fsharp-vGx-8LrK.js → fsharp-BzAfXfKg.js} +0 -0
- /package/web/assets/{go-CHEkyua-.js → go-D7oonABu.js} +0 -0
- /package/web/assets/{graphql--iPbFyYe.js → graphql-BEN-qkl0.js} +0 -0
- /package/web/assets/{hcl-C8EkclQS.js → hcl-CE0OhwCq.js} +0 -0
- /package/web/assets/{ini-DkuTJDAH.js → ini-CCLtcvjA.js} +0 -0
- /package/web/assets/{java-DzuDjs1c.js → java-Bao8w_gp.js} +0 -0
- /package/web/assets/{julia-BUS80tf_.js → julia-Dr0hFYrl.js} +0 -0
- /package/web/assets/{kotlin-s0eIc-h2.js → kotlin-Cbfu8lcM.js} +0 -0
- /package/web/assets/{less-o5f3n-o_.js → less-BU4gEpXr.js} +0 -0
- /package/web/assets/{lexon-AgKBNlrf.js → lexon-GpBGGdTS.js} +0 -0
- /package/web/assets/{lua-DUTvSobZ.js → lua-DIPKk37y.js} +0 -0
- /package/web/assets/{m3-DoULJRPc.js → m3-CSOypKGf.js} +0 -0
- /package/web/assets/{markdown-f9-EhcTi.js → markdown-VDqAgkyM.js} +0 -0
- /package/web/assets/{mips-aCd_43tp.js → mips-BJWI6dX7.js} +0 -0
- /package/web/assets/{msdax-cwHq3sFu.js → msdax-BLpuE5Dc.js} +0 -0
- /package/web/assets/{mysql-ITCpZRvB.js → mysql-ZsxiEUoY.js} +0 -0
- /package/web/assets/{objective-c-BjU-4cpP.js → objective-c-DcQa1iPc.js} +0 -0
- /package/web/assets/{pascal-Dmt8LI08.js → pascal-u-hmXdyn.js} +0 -0
- /package/web/assets/{pascaligo-DrXjRBef.js → pascaligo-DqbP-1C6.js} +0 -0
- /package/web/assets/{perl-BbJKyW-Z.js → perl-CUeQpRkH.js} +0 -0
- /package/web/assets/{pgsql-CLT36ygM.js → pgsql-CQ7FhAFN.js} +0 -0
- /package/web/assets/{php-BIcyBKEQ.js → php-BEf_fu3E.js} +0 -0
- /package/web/assets/{pla-sVewnHw1.js → pla-CXNNbT0w.js} +0 -0
- /package/web/assets/{postiats-D9DrURSm.js → postiats-CIXLZwPb.js} +0 -0
- /package/web/assets/{powerquery-BEjdKhpn.js → powerquery-DnGPASFA.js} +0 -0
- /package/web/assets/{powershell-BynZyJK1.js → powershell-1Y1kqIZS.js} +0 -0
- /package/web/assets/{process-DIamAPAU.js → process-Cf4Ob2V-.js} +0 -0
- /package/web/assets/{protobuf-BQ34Qnv5.js → protobuf-Cfo9haoG.js} +0 -0
- /package/web/assets/{pug--jmF9o7P.js → pug-BujEZqmy.js} +0 -0
- /package/web/assets/{qsharp-BDe4Axn9.js → qsharp-BL9AqNGD.js} +0 -0
- /package/web/assets/{r-DpjaSKX3.js → r-D0dhpGOM.js} +0 -0
- /package/web/assets/{redis-C_Q-xUDt.js → redis-BMLwD7W9.js} +0 -0
- /package/web/assets/{redshift-CHNShrpo.js → redshift-CkHh73og.js} +0 -0
- /package/web/assets/{restructuredtext-CVN0W1xR.js → restructuredtext-DZ-LF65W.js} +0 -0
- /package/web/assets/{ruby-CaKcv4f1.js → ruby-UzPHTzc9.js} +0 -0
- /package/web/assets/{rust-CbqMT_Ew.js → rust-ja9NGnXZ.js} +0 -0
- /package/web/assets/{sb-DIdUmAXV.js → sb-BNdOJbMY.js} +0 -0
- /package/web/assets/{scala-DVyALEcz.js → scala-LlhkyN6l.js} +0 -0
- /package/web/assets/{scheme-Cox4VpHa.js → scheme-BAj99YIn.js} +0 -0
- /package/web/assets/{scss-MW_l4ZY_.js → scss-chS-xxB3.js} +0 -0
- /package/web/assets/{shared-sse-BjXwPkLo.js → shared-sse-_VzlL_VX.js} +0 -0
- /package/web/assets/{shell-CP5qAt5e.js → shell-CcH7eYIc.js} +0 -0
- /package/web/assets/{solidity-1ctHOHIb.js → solidity-cVvnqX-K.js} +0 -0
- /package/web/assets/{sophia-DRAqvk2I.js → sophia-BBT-EdFw.js} +0 -0
- /package/web/assets/{sparql-8_9Nt5xp.js → sparql-DGEqOrB6.js} +0 -0
- /package/web/assets/{sql-owsrW4c3.js → sql-CcTErTxM.js} +0 -0
- /package/web/assets/{st-BDgXslxD.js → st-Bjw-B4mN.js} +0 -0
- /package/web/assets/{swift-TE6gFxno.js → swift-Bid-7bBd.js} +0 -0
- /package/web/assets/{systemverilog-DVGMenxt.js → systemverilog-CXju7Nd-.js} +0 -0
- /package/web/assets/{tcl-D6NP8_oR.js → tcl-D-Dw7JFz.js} +0 -0
- /package/web/assets/{twig-CVnYtCc5.js → twig-BIPbzEWT.js} +0 -0
- /package/web/assets/{typespec-BkD2qKRU.js → typespec-UJSutGCV.js} +0 -0
- /package/web/assets/{uuid-u4W9vzU3.js → uuid--pMuF47W.js} +0 -0
- /package/web/assets/{vb--Oo_cy-E.js → vb-oyG_LJw0.js} +0 -0
- /package/web/assets/{w3c-keyname-Dfw8VxXe.js → w3c-keyname-DtJs0qQm.js} +0 -0
- /package/web/assets/{wgsl-CrnkJFcw.js → wgsl-DXZ6ljB6.js} +0 -0
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
resetRelaunches,
|
|
29
29
|
syncConversationFromClaudeTranscript,
|
|
30
30
|
verifyJwt
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-DS66SEYH.js";
|
|
32
32
|
import {
|
|
33
33
|
agentManager,
|
|
34
34
|
agentStore,
|
|
@@ -48,10 +48,10 @@ import {
|
|
|
48
48
|
rememberFile,
|
|
49
49
|
serviceStore,
|
|
50
50
|
wasRead
|
|
51
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-RIITTBK3.js";
|
|
52
52
|
import {
|
|
53
53
|
settingsManager
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-D2PF2FYU.js";
|
|
55
55
|
import {
|
|
56
56
|
AGENT_STOP_FETCH_TIMEOUT,
|
|
57
57
|
ApiKeysFileSchema,
|
|
@@ -83,7 +83,7 @@ import {
|
|
|
83
83
|
machineRoot,
|
|
84
84
|
orgVaultRoot,
|
|
85
85
|
vaultIdOfRoot
|
|
86
|
-
} from "./chunk-
|
|
86
|
+
} from "./chunk-ZFELQG4B.js";
|
|
87
87
|
|
|
88
88
|
// ../server/src/trpc/routers/chat.ts
|
|
89
89
|
import { z as z5 } from "zod";
|
|
@@ -3549,11 +3549,14 @@ import { TRPCError as TRPCError3 } from "@trpc/server";
|
|
|
3549
3549
|
// ../server/src/services/cloud-session-store.ts
|
|
3550
3550
|
import { readFile as readFile7, writeFile as writeFile5, rename as rename5, mkdir as mkdir7, chmod as chmod4, unlink as unlink3 } from "fs/promises";
|
|
3551
3551
|
import { dirname as dirname5 } from "path";
|
|
3552
|
-
import { randomBytes as randomBytes2, timingSafeEqual as timingSafeEqual2 } from "crypto";
|
|
3552
|
+
import { randomBytes as randomBytes2, createHash, timingSafeEqual as timingSafeEqual2 } from "crypto";
|
|
3553
3553
|
var FILENAME2 = "cloud-session.json";
|
|
3554
3554
|
var STATE_TTL_MS = 5 * 60 * 1e3;
|
|
3555
|
+
function accountIdFor(cloudUrl, userId) {
|
|
3556
|
+
return createHash("sha256").update(`${cloudUrl.replace(/\/+$/, "")}|${userId}`).digest("hex").slice(0, 32);
|
|
3557
|
+
}
|
|
3555
3558
|
var CloudSessionStore = class {
|
|
3556
|
-
|
|
3559
|
+
accounts = [];
|
|
3557
3560
|
loaded = false;
|
|
3558
3561
|
/** Pending login states (CSRF binding between `start` and the callback). */
|
|
3559
3562
|
pending = /* @__PURE__ */ new Map();
|
|
@@ -3581,11 +3584,37 @@ var CloudSessionStore = class {
|
|
|
3581
3584
|
return readFile7(this.getLegacyFilePath(), "utf-8");
|
|
3582
3585
|
}
|
|
3583
3586
|
}
|
|
3587
|
+
/**
|
|
3588
|
+
* Relire le fichier, quelle que soit sa version.
|
|
3589
|
+
*
|
|
3590
|
+
* La forme d'avant n'est pas convertie sur disque ici : elle est lue telle
|
|
3591
|
+
* quelle et prend un id dérivé de son seul cloud. L'identité manque — le
|
|
3592
|
+
* compte n'était pas décrit — et se remplira au premier appel qui la
|
|
3593
|
+
* connaîtra. Réécrire le fichier au chargement le rendrait illisible à une
|
|
3594
|
+
* Runeya plus ancienne pour rien.
|
|
3595
|
+
*/
|
|
3584
3596
|
async load() {
|
|
3585
3597
|
if (this.loaded) return;
|
|
3586
3598
|
try {
|
|
3587
|
-
const
|
|
3588
|
-
|
|
3599
|
+
const parsed = JSON.parse(await this.readFromDisk());
|
|
3600
|
+
if ("accounts" in parsed && Array.isArray(parsed.accounts)) {
|
|
3601
|
+
this.accounts = parsed.accounts.filter(
|
|
3602
|
+
(a) => typeof a?.id === "string" && typeof a?.encryptedToken === "string"
|
|
3603
|
+
);
|
|
3604
|
+
} else if (typeof parsed.encryptedToken === "string") {
|
|
3605
|
+
const legacy = parsed;
|
|
3606
|
+
this.accounts = [{
|
|
3607
|
+
// Pas d'utilisateur connu : le cloud seul fonde l'id, et la première
|
|
3608
|
+
// identité lue le remplacera par le définitif.
|
|
3609
|
+
id: accountIdFor(legacy.cloudUrl, ""),
|
|
3610
|
+
cloudUrl: legacy.cloudUrl,
|
|
3611
|
+
encryptedToken: legacy.encryptedToken,
|
|
3612
|
+
userId: "",
|
|
3613
|
+
email: "",
|
|
3614
|
+
name: "",
|
|
3615
|
+
image: null
|
|
3616
|
+
}];
|
|
3617
|
+
}
|
|
3589
3618
|
} catch {
|
|
3590
3619
|
}
|
|
3591
3620
|
this.loaded = true;
|
|
@@ -3625,48 +3654,137 @@ var CloudSessionStore = class {
|
|
|
3625
3654
|
}
|
|
3626
3655
|
}
|
|
3627
3656
|
async save() {
|
|
3628
|
-
await mkdir7(dirname5(await this.getFilePath()), { recursive: true });
|
|
3629
3657
|
const filePath = await this.getFilePath();
|
|
3658
|
+
await mkdir7(dirname5(filePath), { recursive: true });
|
|
3659
|
+
const payload = { version: 2, accounts: this.accounts };
|
|
3630
3660
|
const tmpPath = filePath + ".tmp";
|
|
3631
|
-
await writeFile5(tmpPath, JSON.stringify(
|
|
3661
|
+
await writeFile5(tmpPath, JSON.stringify(payload, null, 2), "utf-8");
|
|
3632
3662
|
await rename5(tmpPath, filePath);
|
|
3633
3663
|
await chmod4(filePath, 384);
|
|
3634
3664
|
}
|
|
3635
|
-
/**
|
|
3636
|
-
|
|
3665
|
+
/**
|
|
3666
|
+
* Ranger le token obtenu par l'échange de jeton à usage unique.
|
|
3667
|
+
*
|
|
3668
|
+
* L'identité est fournie par l'appelant, qui vient de la lire avec ce token :
|
|
3669
|
+
* c'est elle qui donne son id au compte, et donc ce qui fait qu'une seconde
|
|
3670
|
+
* connexion du même utilisateur remplace la première au lieu de s'ajouter.
|
|
3671
|
+
*/
|
|
3672
|
+
async add(cloudUrl, token, identity) {
|
|
3637
3673
|
await this.load();
|
|
3638
|
-
|
|
3674
|
+
const account = {
|
|
3675
|
+
...identity,
|
|
3676
|
+
id: accountIdFor(cloudUrl, identity.userId),
|
|
3677
|
+
cloudUrl,
|
|
3678
|
+
encryptedToken: encryptValue(token)
|
|
3679
|
+
};
|
|
3680
|
+
const at = this.accounts.findIndex((a) => a.id === account.id);
|
|
3681
|
+
if (at >= 0) this.accounts[at] = account;
|
|
3682
|
+
else this.accounts.push(account);
|
|
3639
3683
|
await this.save();
|
|
3684
|
+
return this.publicView(account);
|
|
3640
3685
|
}
|
|
3641
|
-
|
|
3642
|
-
|
|
3686
|
+
publicView(account) {
|
|
3687
|
+
const { encryptedToken: _token, ...rest } = account;
|
|
3688
|
+
return rest;
|
|
3689
|
+
}
|
|
3690
|
+
/** Les comptes liés à ce poste, sans rien de secret. */
|
|
3691
|
+
async list() {
|
|
3692
|
+
await this.load();
|
|
3693
|
+
return this.accounts.map((a) => this.publicView(a));
|
|
3694
|
+
}
|
|
3695
|
+
/** Un compte par son id, ou null. */
|
|
3696
|
+
async get(accountId) {
|
|
3697
|
+
await this.load();
|
|
3698
|
+
const found = this.accounts.find((a) => a.id === accountId);
|
|
3699
|
+
return found ? this.publicView(found) : null;
|
|
3700
|
+
}
|
|
3701
|
+
/**
|
|
3702
|
+
* Compléter ce qu'on sait d'un compte, une fois le cloud interrogé.
|
|
3703
|
+
*
|
|
3704
|
+
* Sert à la forme héritée, liée avant que l'identité soit retenue : son id
|
|
3705
|
+
* provisoire (fondé sur le seul cloud) devient le définitif, et les tampons
|
|
3706
|
+
* d'organisation qui le désignaient sont suivis par l'appelant.
|
|
3707
|
+
*/
|
|
3708
|
+
async describe(accountId, identity) {
|
|
3709
|
+
await this.load();
|
|
3710
|
+
const at = this.accounts.findIndex((a) => a.id === accountId);
|
|
3711
|
+
if (at < 0) return accountId;
|
|
3712
|
+
const current = this.accounts[at];
|
|
3713
|
+
const nextId = accountIdFor(current.cloudUrl, identity.userId);
|
|
3714
|
+
if (current.id === nextId && current.email === identity.email && current.name === identity.name) {
|
|
3715
|
+
return current.id;
|
|
3716
|
+
}
|
|
3717
|
+
const duplicate = this.accounts.findIndex((a) => a.id === nextId && a.id !== current.id);
|
|
3718
|
+
if (duplicate >= 0) this.accounts.splice(duplicate, 1);
|
|
3719
|
+
this.accounts[this.accounts.findIndex((a) => a.id === accountId)] = {
|
|
3720
|
+
...current,
|
|
3721
|
+
...identity,
|
|
3722
|
+
id: nextId
|
|
3723
|
+
};
|
|
3724
|
+
await this.save();
|
|
3725
|
+
return nextId;
|
|
3726
|
+
}
|
|
3727
|
+
/**
|
|
3728
|
+
* Le token déchiffré d'un compte, ou null.
|
|
3729
|
+
*
|
|
3730
|
+
* Sans id : le compte unique du poste, et rien du tout dès qu'il y en a
|
|
3731
|
+
* plusieurs — deviner lequel reviendrait à parler au cloud d'un autre
|
|
3732
|
+
* utilisateur, ce qu'aucun appel ne veut jamais.
|
|
3733
|
+
*/
|
|
3734
|
+
async getToken(accountId) {
|
|
3643
3735
|
await this.load();
|
|
3644
|
-
|
|
3736
|
+
const account = accountId ? this.accounts.find((a) => a.id === accountId) : this.accounts.length === 1 ? this.accounts[0] : void 0;
|
|
3737
|
+
if (!account) return null;
|
|
3645
3738
|
try {
|
|
3646
|
-
return decryptValue(
|
|
3739
|
+
return decryptValue(account.encryptedToken);
|
|
3647
3740
|
} catch {
|
|
3648
3741
|
return null;
|
|
3649
3742
|
}
|
|
3650
3743
|
}
|
|
3651
3744
|
/**
|
|
3652
|
-
* The cloud
|
|
3745
|
+
* The cloud a given account is signed into, or null when unknown.
|
|
3653
3746
|
*
|
|
3654
3747
|
* Needed to tell "an org I am not a member of" apart from "an org of another
|
|
3655
3748
|
* cloud instance entirely" — the ids of two clouds share no namespace, so
|
|
3656
3749
|
* comparing them without this would call every foreign-cloud project a
|
|
3657
3750
|
* permission problem.
|
|
3658
3751
|
*/
|
|
3659
|
-
async getCloudUrl() {
|
|
3752
|
+
async getCloudUrl(accountId) {
|
|
3660
3753
|
await this.load();
|
|
3661
|
-
|
|
3754
|
+
const account = accountId ? this.accounts.find((a) => a.id === accountId) : this.accounts.length === 1 ? this.accounts[0] : void 0;
|
|
3755
|
+
return account?.cloudUrl ?? null;
|
|
3662
3756
|
}
|
|
3757
|
+
/** Au moins un compte lié — l'état du poste, pas celui d'un compte précis. */
|
|
3663
3758
|
async isLinked() {
|
|
3664
|
-
|
|
3759
|
+
await this.load();
|
|
3760
|
+
return this.accounts.length > 0;
|
|
3665
3761
|
}
|
|
3666
|
-
/**
|
|
3762
|
+
/** Ce compte-là est-il utilisable ? */
|
|
3763
|
+
async isAccountLinked(accountId) {
|
|
3764
|
+
return await this.getToken(accountId) !== null;
|
|
3765
|
+
}
|
|
3766
|
+
/**
|
|
3767
|
+
* Oublier un compte, en laissant les autres tranquilles.
|
|
3768
|
+
*
|
|
3769
|
+
* Les organisations qui en dépendaient passent hors ligne d'elles-mêmes : leur
|
|
3770
|
+
* tampon désigne un compte qui n'est plus là, et la résolution rend « non
|
|
3771
|
+
* lié » plutôt que d'aller frapper au cloud avec le token du voisin.
|
|
3772
|
+
*/
|
|
3773
|
+
async remove(accountId) {
|
|
3774
|
+
await this.load();
|
|
3775
|
+
const before = this.accounts.length;
|
|
3776
|
+
this.accounts = this.accounts.filter((a) => a.id !== accountId);
|
|
3777
|
+
if (this.accounts.length === before) return;
|
|
3778
|
+
if (this.accounts.length === 0) {
|
|
3779
|
+
await this.clear();
|
|
3780
|
+
return;
|
|
3781
|
+
}
|
|
3782
|
+
await this.save();
|
|
3783
|
+
}
|
|
3784
|
+
/** Forget every session (full sign-out of this machine). */
|
|
3667
3785
|
async clear() {
|
|
3668
3786
|
await this.load();
|
|
3669
|
-
this.
|
|
3787
|
+
this.accounts = [];
|
|
3670
3788
|
this.pending.clear();
|
|
3671
3789
|
try {
|
|
3672
3790
|
await unlink3(await this.getFilePath());
|
|
@@ -3803,13 +3921,33 @@ function getCloudApiUrl() {
|
|
|
3803
3921
|
return (env.CLOUD_URL ?? DEFAULT_CLOUD_API_URL).replace(/\/+$/, "");
|
|
3804
3922
|
}
|
|
3805
3923
|
async function orgCloudUrl(orgId) {
|
|
3806
|
-
const { readOrgClouds } = await import("./vault-resolver-
|
|
3924
|
+
const { readOrgClouds } = await import("./vault-resolver-57Q2DVOR.js");
|
|
3807
3925
|
const clouds = await readOrgClouds();
|
|
3808
3926
|
return (clouds[orgId] ?? getCloudApiUrl()).replace(/\/+$/, "");
|
|
3809
3927
|
}
|
|
3928
|
+
async function accountForOrg(orgId) {
|
|
3929
|
+
const { readOrgAccounts, readOrgClouds } = await import("./vault-resolver-57Q2DVOR.js");
|
|
3930
|
+
const [stampedAccounts, stampedClouds, accounts] = await Promise.all([
|
|
3931
|
+
readOrgAccounts(),
|
|
3932
|
+
readOrgClouds(),
|
|
3933
|
+
cloudSessionStore.list()
|
|
3934
|
+
]);
|
|
3935
|
+
const orgCloud = stampedClouds[orgId]?.replace(/\/+$/, "");
|
|
3936
|
+
const candidates = orgCloud ? accounts.filter((a) => a.cloudUrl.replace(/\/+$/, "") === orgCloud) : accounts;
|
|
3937
|
+
const stamped = stampedAccounts[orgId];
|
|
3938
|
+
if (stamped && candidates.some((a) => a.id === stamped)) return stamped;
|
|
3939
|
+
return candidates.length === 1 ? candidates[0].id : null;
|
|
3940
|
+
}
|
|
3810
3941
|
function getCloudAppUrl() {
|
|
3811
3942
|
return (env.CLOUD_APP_URL ?? DEFAULT_CLOUD_APP_URL).replace(/\/+$/, "");
|
|
3812
3943
|
}
|
|
3944
|
+
var CloudAmbiguousAccountError = class extends Error {
|
|
3945
|
+
code = "CLOUD_AMBIGUOUS_ACCOUNT";
|
|
3946
|
+
constructor() {
|
|
3947
|
+
super("Several cloud accounts are linked; name the organization this call belongs to.");
|
|
3948
|
+
this.name = "CloudAmbiguousAccountError";
|
|
3949
|
+
}
|
|
3950
|
+
};
|
|
3813
3951
|
var CloudNotLinkedError = class extends Error {
|
|
3814
3952
|
code = "CLOUD_NOT_LINKED";
|
|
3815
3953
|
constructor() {
|
|
@@ -3817,10 +3955,23 @@ var CloudNotLinkedError = class extends Error {
|
|
|
3817
3955
|
this.name = "CloudNotLinkedError";
|
|
3818
3956
|
}
|
|
3819
3957
|
};
|
|
3820
|
-
async function
|
|
3821
|
-
const
|
|
3958
|
+
async function accountForOrgOrThrow(orgId) {
|
|
3959
|
+
const accountId = await accountForOrg(orgId);
|
|
3960
|
+
if (!accountId) throw new CloudNotLinkedError();
|
|
3961
|
+
return accountId;
|
|
3962
|
+
}
|
|
3963
|
+
async function soleAccountOrThrow() {
|
|
3964
|
+
const accounts = await cloudSessionStore.list();
|
|
3965
|
+
if (accounts.length === 1) return accounts[0].id;
|
|
3966
|
+
if (accounts.length === 0) throw new CloudNotLinkedError();
|
|
3967
|
+
throw new CloudAmbiguousAccountError();
|
|
3968
|
+
}
|
|
3969
|
+
async function cloudFetch(path, init) {
|
|
3970
|
+
const { accountId } = init;
|
|
3971
|
+
const token = await cloudSessionStore.getToken(accountId);
|
|
3822
3972
|
if (!token) throw new CloudNotLinkedError();
|
|
3823
|
-
|
|
3973
|
+
const base = await cloudSessionStore.getCloudUrl(accountId) ?? getCloudApiUrl();
|
|
3974
|
+
return fetch(`${base.replace(/\/+$/, "")}${path}`, {
|
|
3824
3975
|
method: init.method ?? "GET",
|
|
3825
3976
|
headers: {
|
|
3826
3977
|
Authorization: `Bearer ${token}`,
|
|
@@ -3833,6 +3984,26 @@ async function cloudFetch(path, init = {}) {
|
|
|
3833
3984
|
signal: AbortSignal.timeout(init.timeoutMs ?? 15e3)
|
|
3834
3985
|
});
|
|
3835
3986
|
}
|
|
3987
|
+
async function readCloudIdentity(cloudUrl, token) {
|
|
3988
|
+
try {
|
|
3989
|
+
const res = await fetch(`${cloudUrl.replace(/\/+$/, "")}/api/auth/get-session`, {
|
|
3990
|
+
headers: { Authorization: `Bearer ${token}`, [APP_VERSION_HEADER]: appVersion },
|
|
3991
|
+
signal: AbortSignal.timeout(15e3)
|
|
3992
|
+
});
|
|
3993
|
+
if (!res.ok) return null;
|
|
3994
|
+
const body = await res.json();
|
|
3995
|
+
const id = body.user?.id;
|
|
3996
|
+
if (typeof id !== "string" || !id) return null;
|
|
3997
|
+
return {
|
|
3998
|
+
userId: id,
|
|
3999
|
+
email: typeof body.user?.email === "string" ? body.user.email : "",
|
|
4000
|
+
name: typeof body.user?.name === "string" ? body.user.name : "",
|
|
4001
|
+
image: typeof body.user?.image === "string" ? body.user.image : null
|
|
4002
|
+
};
|
|
4003
|
+
} catch {
|
|
4004
|
+
return null;
|
|
4005
|
+
}
|
|
4006
|
+
}
|
|
3836
4007
|
|
|
3837
4008
|
// ../server/src/trpc/routers/cloud-auth.ts
|
|
3838
4009
|
function getDeviceName() {
|
|
@@ -3860,7 +4031,7 @@ function callbackForReturnTo(url) {
|
|
|
3860
4031
|
if (!lanIps().includes(hostname2)) return null;
|
|
3861
4032
|
return `${parsed.origin}/api/cloud/callback`;
|
|
3862
4033
|
}
|
|
3863
|
-
async function cloudFetch2(path, init
|
|
4034
|
+
async function cloudFetch2(path, init) {
|
|
3864
4035
|
try {
|
|
3865
4036
|
return await cloudFetch(path, init);
|
|
3866
4037
|
} catch (err) {
|
|
@@ -3868,12 +4039,37 @@ async function cloudFetch2(path, init = {}) {
|
|
|
3868
4039
|
throw new TRPCError3({ code: "PRECONDITION_FAILED", message: err.message });
|
|
3869
4040
|
}
|
|
3870
4041
|
}
|
|
4042
|
+
async function accountForOrgScope(orgId) {
|
|
4043
|
+
try {
|
|
4044
|
+
return await accountForOrgOrThrow(orgId);
|
|
4045
|
+
} catch (err) {
|
|
4046
|
+
if (!(err instanceof CloudNotLinkedError)) throw err;
|
|
4047
|
+
throw new TRPCError3({ code: "PRECONDITION_FAILED", message: err.message });
|
|
4048
|
+
}
|
|
4049
|
+
}
|
|
4050
|
+
async function soleAccountScope() {
|
|
4051
|
+
try {
|
|
4052
|
+
return await soleAccountOrThrow();
|
|
4053
|
+
} catch (err) {
|
|
4054
|
+
if (err instanceof CloudAmbiguousAccountError) {
|
|
4055
|
+
throw new TRPCError3({ code: "BAD_REQUEST", message: err.message });
|
|
4056
|
+
}
|
|
4057
|
+
if (!(err instanceof CloudNotLinkedError)) throw err;
|
|
4058
|
+
throw new TRPCError3({ code: "PRECONDITION_FAILED", message: err.message });
|
|
4059
|
+
}
|
|
4060
|
+
}
|
|
3871
4061
|
var PROXY_PREFIXES = ["/organization/", "/project/", "/chat/", "/kanban/", "/user/prefs"];
|
|
3872
4062
|
function isAllowedProxyPath(path) {
|
|
3873
4063
|
if (!path.startsWith("/") || path.includes("..")) return false;
|
|
3874
4064
|
const [pathname] = path.split("?");
|
|
3875
4065
|
return PROXY_PREFIXES.some((p) => pathname === p || pathname.startsWith(p));
|
|
3876
4066
|
}
|
|
4067
|
+
var ScopeSchema = z4.object({
|
|
4068
|
+
accountId: z4.string().min(1).max(64)
|
|
4069
|
+
});
|
|
4070
|
+
function scopeOf(input) {
|
|
4071
|
+
return { accountId: input.accountId };
|
|
4072
|
+
}
|
|
3877
4073
|
var cloudAuthRouter = router({
|
|
3878
4074
|
/** Build the cloud authorization URL to open in the browser. */
|
|
3879
4075
|
startLogin: protectedProcedure.input(z4.object({ returnTo: z4.string().url().max(2048) })).mutation(async ({ input }) => {
|
|
@@ -3888,31 +4084,77 @@ var cloudAuthRouter = router({
|
|
|
3888
4084
|
const url = `${getCloudAppUrl()}/link-local?callback=${encodeURIComponent(callback)}&state=${encodeURIComponent(state)}`;
|
|
3889
4085
|
return { url };
|
|
3890
4086
|
}),
|
|
3891
|
-
/**
|
|
4087
|
+
/**
|
|
4088
|
+
* Whether this machine holds any cloud session, and against which cloud.
|
|
4089
|
+
*
|
|
4090
|
+
* `cloudUrl` n'a de sens qu'avec un seul compte : au-delà, il n'y a plus « le »
|
|
4091
|
+
* cloud du poste, et c'est `accounts` qu'il faut lire.
|
|
4092
|
+
*/
|
|
3892
4093
|
status: protectedProcedure.query(async () => {
|
|
3893
|
-
const
|
|
3894
|
-
return {
|
|
4094
|
+
const accounts = await cloudSessionStore.list();
|
|
4095
|
+
return {
|
|
4096
|
+
linked: accounts.length > 0,
|
|
4097
|
+
cloudUrl: accounts.length === 1 ? accounts[0].cloudUrl : null,
|
|
4098
|
+
accountCount: accounts.length
|
|
4099
|
+
};
|
|
4100
|
+
}),
|
|
4101
|
+
/**
|
|
4102
|
+
* Le compte dont relève une organisation.
|
|
4103
|
+
*
|
|
4104
|
+
* La question que l'interface pose à chaque changement de projet : le projet
|
|
4105
|
+
* ouvert donne son organisation, l'organisation donne son compte. Répondue
|
|
4106
|
+
* ici plutôt que déduite d'une carte tenue dans le navigateur — une carte se
|
|
4107
|
+
* périme dès qu'un coffre est tamponné, et l'interface restait alors sur le
|
|
4108
|
+
* compte précédent sans que rien ne le dise.
|
|
4109
|
+
*
|
|
4110
|
+
* `null` quand rien ne rattache cette organisation à un compte de ce poste :
|
|
4111
|
+
* l'interface l'affiche comme déconnectée, ce qu'elle est.
|
|
4112
|
+
*/
|
|
4113
|
+
accountForOrg: protectedProcedure.input(z4.object({ orgId: z4.string().min(1).max(128) })).query(async ({ input }) => ({ accountId: await accountForOrg(input.orgId) })),
|
|
4114
|
+
/**
|
|
4115
|
+
* Les comptes liés à ce poste, et l'organisation dont chacun répond.
|
|
4116
|
+
*
|
|
4117
|
+
* Aucun token n'en sort : de quoi peupler la page Compte et afficher, à côté
|
|
4118
|
+
* du projet ouvert, sous quel compte il se synchronise.
|
|
4119
|
+
*/
|
|
4120
|
+
accounts: protectedProcedure.query(async () => {
|
|
4121
|
+
const { readOrgAccounts } = await import("./vault-resolver-57Q2DVOR.js");
|
|
4122
|
+
return { accounts: await cloudSessionStore.list(), orgAccounts: await readOrgAccounts() };
|
|
3895
4123
|
}),
|
|
3896
4124
|
/** The cloud session (user + org), fetched with the stored token. */
|
|
3897
|
-
session: protectedProcedure.query(async () => {
|
|
3898
|
-
|
|
3899
|
-
|
|
4125
|
+
session: protectedProcedure.input(ScopeSchema).query(async ({ input }) => {
|
|
4126
|
+
const { accountId } = input;
|
|
4127
|
+
if (!await cloudSessionStore.isAccountLinked(accountId)) return null;
|
|
4128
|
+
const res = await cloudFetch2("/api/auth/get-session", { accountId });
|
|
3900
4129
|
if (!res.ok) {
|
|
3901
|
-
if (res.status === 401) await cloudSessionStore.
|
|
4130
|
+
if (res.status === 401) await cloudSessionStore.remove(accountId);
|
|
3902
4131
|
return null;
|
|
3903
4132
|
}
|
|
3904
|
-
|
|
4133
|
+
const payload = await res.json();
|
|
4134
|
+
const account = await cloudSessionStore.get(accountId);
|
|
4135
|
+
if (account && !account.userId) {
|
|
4136
|
+
const identity = await readCloudIdentity(account.cloudUrl, await cloudSessionStore.getToken(accountId) ?? "");
|
|
4137
|
+
if (identity) {
|
|
4138
|
+
const settled = await cloudSessionStore.describe(accountId, identity);
|
|
4139
|
+
const { renameOrgAccount } = await import("./vault-resolver-57Q2DVOR.js");
|
|
4140
|
+
await renameOrgAccount(accountId, settled);
|
|
4141
|
+
}
|
|
4142
|
+
}
|
|
4143
|
+
return payload;
|
|
3905
4144
|
}),
|
|
3906
4145
|
/**
|
|
3907
4146
|
* Every session of the cloud account: the machines linked to it and the
|
|
3908
4147
|
* browsers signed into it. No token material — the cloud only ever returns
|
|
3909
4148
|
* ids and labels here.
|
|
3910
4149
|
*/
|
|
3911
|
-
devices: protectedProcedure.query(async () => {
|
|
3912
|
-
|
|
3913
|
-
|
|
4150
|
+
devices: protectedProcedure.input(ScopeSchema).query(async ({ input }) => {
|
|
4151
|
+
const { accountId } = input;
|
|
4152
|
+
if (!accountId || !await cloudSessionStore.isAccountLinked(accountId)) {
|
|
4153
|
+
return { devices: [] };
|
|
4154
|
+
}
|
|
4155
|
+
const res = await cloudFetch2("/api/auth/device/list", { accountId });
|
|
3914
4156
|
if (!res.ok) {
|
|
3915
|
-
if (res.status === 401) await cloudSessionStore.
|
|
4157
|
+
if (res.status === 401) await cloudSessionStore.remove(accountId);
|
|
3916
4158
|
return { devices: [] };
|
|
3917
4159
|
}
|
|
3918
4160
|
return await res.json();
|
|
@@ -3924,14 +4166,20 @@ var cloudAuthRouter = router({
|
|
|
3924
4166
|
* drops the session, and the local token is dropped here too, so nothing is
|
|
3925
4167
|
* left holding a dead credential.
|
|
3926
4168
|
*/
|
|
3927
|
-
revokeDevice: protectedProcedure.input(
|
|
3928
|
-
const
|
|
4169
|
+
revokeDevice: protectedProcedure.input(ScopeSchema.extend({ id: z4.string().min(1).max(128) })).mutation(async ({ input }) => {
|
|
4170
|
+
const { accountId } = input;
|
|
4171
|
+
if (!accountId) throw new TRPCError3({ code: "PRECONDITION_FAILED", message: "No cloud account for this scope." });
|
|
4172
|
+
const res = await cloudFetch2("/api/auth/device/revoke", {
|
|
4173
|
+
method: "POST",
|
|
4174
|
+
body: { id: input.id },
|
|
4175
|
+
accountId
|
|
4176
|
+
});
|
|
3929
4177
|
if (!res.ok) {
|
|
3930
|
-
if (res.status === 401) await cloudSessionStore.
|
|
4178
|
+
if (res.status === 401) await cloudSessionStore.remove(accountId);
|
|
3931
4179
|
throw new TRPCError3({ code: "BAD_REQUEST", message: "Could not revoke this session." });
|
|
3932
4180
|
}
|
|
3933
4181
|
const { self } = await res.json();
|
|
3934
|
-
if (self) await cloudSessionStore.
|
|
4182
|
+
if (self) await cloudSessionStore.remove(accountId);
|
|
3935
4183
|
return { success: true, self: self === true };
|
|
3936
4184
|
}),
|
|
3937
4185
|
/**
|
|
@@ -3945,7 +4193,13 @@ var cloudAuthRouter = router({
|
|
|
3945
4193
|
path: z4.string().min(1).max(512),
|
|
3946
4194
|
method: z4.enum(["GET", "POST"]).default("GET"),
|
|
3947
4195
|
query: z4.record(z4.string().max(128), z4.string().max(2048)).optional(),
|
|
3948
|
-
body: z4.unknown().optional()
|
|
4196
|
+
body: z4.unknown().optional(),
|
|
4197
|
+
// Obligatoire, et seul : c'est la porte par laquelle passent tous les
|
|
4198
|
+
// appels cloud de l'interface. La laisser optionnelle est ce qui a
|
|
4199
|
+
// permis aux composables partagées de n'envoyer aucune portée pendant
|
|
4200
|
+
// trente routes, et au serveur de retomber sur « le compte unique du
|
|
4201
|
+
// poste » — muet dès qu'il y en a eu deux.
|
|
4202
|
+
accountId: z4.string().min(1).max(64)
|
|
3949
4203
|
})
|
|
3950
4204
|
).mutation(async ({ input }) => {
|
|
3951
4205
|
if (!isAllowedProxyPath(input.path)) {
|
|
@@ -3954,7 +4208,8 @@ var cloudAuthRouter = router({
|
|
|
3954
4208
|
const qs = input.query ? `?${new URLSearchParams(input.query).toString()}` : "";
|
|
3955
4209
|
const res = await cloudFetch2(`/api/auth${input.path}${qs}`, {
|
|
3956
4210
|
method: input.method,
|
|
3957
|
-
...input.method === "POST" ? { body: input.body ?? {} } : {}
|
|
4211
|
+
...input.method === "POST" ? { body: input.body ?? {} } : {},
|
|
4212
|
+
...scopeOf(input)
|
|
3958
4213
|
});
|
|
3959
4214
|
const text = await res.text();
|
|
3960
4215
|
let data = null;
|
|
@@ -3973,14 +4228,15 @@ var cloudAuthRouter = router({
|
|
|
3973
4228
|
* browser's session — signing out here leaves the web app signed in, and vice
|
|
3974
4229
|
* versa.
|
|
3975
4230
|
*/
|
|
3976
|
-
signOut: protectedProcedure.mutation(async () => {
|
|
3977
|
-
|
|
4231
|
+
signOut: protectedProcedure.input(ScopeSchema).mutation(async ({ input }) => {
|
|
4232
|
+
const { accountId } = input;
|
|
4233
|
+
if (await cloudSessionStore.isAccountLinked(accountId)) {
|
|
3978
4234
|
try {
|
|
3979
|
-
await cloudFetch2("/api/auth/sign-out", { method: "POST", body: {} });
|
|
4235
|
+
await cloudFetch2("/api/auth/sign-out", { method: "POST", body: {}, accountId });
|
|
3980
4236
|
} catch {
|
|
3981
4237
|
}
|
|
3982
4238
|
}
|
|
3983
|
-
await cloudSessionStore.
|
|
4239
|
+
await cloudSessionStore.remove(accountId);
|
|
3984
4240
|
return { success: true };
|
|
3985
4241
|
})
|
|
3986
4242
|
});
|
|
@@ -4001,7 +4257,7 @@ function planGateMessage(status, path) {
|
|
|
4001
4257
|
}
|
|
4002
4258
|
return `Le cloud a r\xE9pondu HTTP ${status} sur ${path}.`;
|
|
4003
4259
|
}
|
|
4004
|
-
async function callCloud(path, init
|
|
4260
|
+
async function callCloud(path, init) {
|
|
4005
4261
|
try {
|
|
4006
4262
|
const res = await cloudFetch2(`/api/auth${path}`, init);
|
|
4007
4263
|
if (!res.ok) {
|
|
@@ -4020,12 +4276,56 @@ function must(res) {
|
|
|
4020
4276
|
}
|
|
4021
4277
|
return res.data;
|
|
4022
4278
|
}
|
|
4279
|
+
var boardAccounts = /* @__PURE__ */ new Map();
|
|
4280
|
+
async function accountOfOrg(orgId) {
|
|
4281
|
+
return accountForOrgScope(orgId);
|
|
4282
|
+
}
|
|
4283
|
+
function rememberBoardAccount(boardId, accountId) {
|
|
4284
|
+
boardAccounts.set(boardId, accountId);
|
|
4285
|
+
}
|
|
4286
|
+
async function accountOfBoard(boardId) {
|
|
4287
|
+
const memo = boardAccounts.get(boardId);
|
|
4288
|
+
if (memo) return memo;
|
|
4289
|
+
const accounts = await cloudSessionStore.list();
|
|
4290
|
+
if (accounts.length <= 1) return soleAccountScope();
|
|
4291
|
+
const owners = await Promise.all(accounts.map(async (account) => {
|
|
4292
|
+
const res = await callCloud(
|
|
4293
|
+
`/kanban/board/get?id=${encodeURIComponent(boardId)}`,
|
|
4294
|
+
{ accountId: account.id }
|
|
4295
|
+
);
|
|
4296
|
+
return res.ok && res.data?.board ? account.id : null;
|
|
4297
|
+
}));
|
|
4298
|
+
const owner = owners.find((id) => id !== null);
|
|
4299
|
+
if (owner) {
|
|
4300
|
+
boardAccounts.set(boardId, owner);
|
|
4301
|
+
return owner;
|
|
4302
|
+
}
|
|
4303
|
+
throw new KanbanUnavailableError(
|
|
4304
|
+
`Aucun des ${accounts.length} comptes li\xE9s \xE0 ce poste ne conna\xEEt le tableau ${boardId}.`
|
|
4305
|
+
);
|
|
4306
|
+
}
|
|
4307
|
+
async function scopeOfBoard(boardId) {
|
|
4308
|
+
return { accountId: await accountOfBoard(boardId) };
|
|
4309
|
+
}
|
|
4023
4310
|
async function resolveOrganizationId(explicit) {
|
|
4024
4311
|
if (explicit) return explicit;
|
|
4025
|
-
const
|
|
4312
|
+
const accounts = await cloudSessionStore.list();
|
|
4313
|
+
if (accounts.length > 1) {
|
|
4314
|
+
throw new KanbanUnavailableError(
|
|
4315
|
+
`Ce poste est li\xE9 \xE0 ${accounts.length} comptes cloud : pr\xE9cisez organizationId, sans quoi rien ne dit lequel interroger.`
|
|
4316
|
+
);
|
|
4317
|
+
}
|
|
4318
|
+
const accountId = await soleAccountScope();
|
|
4319
|
+
const session = await callCloud(
|
|
4320
|
+
"/get-session",
|
|
4321
|
+
{ accountId }
|
|
4322
|
+
);
|
|
4026
4323
|
const active = session.data?.session?.activeOrganizationId;
|
|
4027
4324
|
if (active) return active;
|
|
4028
|
-
const orgs = must(await callCloud(
|
|
4325
|
+
const orgs = must(await callCloud(
|
|
4326
|
+
"/organization/list",
|
|
4327
|
+
{ accountId }
|
|
4328
|
+
));
|
|
4029
4329
|
if (orgs.length === 1) return orgs[0].id;
|
|
4030
4330
|
if (orgs.length === 0) {
|
|
4031
4331
|
throw new KanbanUnavailableError(
|
|
@@ -4047,7 +4347,12 @@ var KanbanStore = class {
|
|
|
4047
4347
|
async list(includeArchived = false, organizationId) {
|
|
4048
4348
|
const orgId = await resolveOrganizationId(organizationId);
|
|
4049
4349
|
const query = `?organizationId=${encodeURIComponent(orgId)}` + (includeArchived ? "&includeArchived=true" : "");
|
|
4050
|
-
const
|
|
4350
|
+
const accountId = await accountOfOrg(orgId);
|
|
4351
|
+
const res = must(await callCloud(
|
|
4352
|
+
`/kanban/board/list${query}`,
|
|
4353
|
+
{ accountId }
|
|
4354
|
+
));
|
|
4355
|
+
for (const board of res.boards ?? []) rememberBoardAccount(board.id, accountId);
|
|
4051
4356
|
return { organizationId: orgId, boards: res.boards ?? [] };
|
|
4052
4357
|
}
|
|
4053
4358
|
/**
|
|
@@ -4058,13 +4363,18 @@ var KanbanStore = class {
|
|
|
4058
4363
|
*/
|
|
4059
4364
|
async get(id, opts = {}) {
|
|
4060
4365
|
const query = `?id=${encodeURIComponent(id)}${opts.withHistory ? "&withHistory=true" : ""}`;
|
|
4061
|
-
const
|
|
4366
|
+
const accountId = await accountOfBoard(id);
|
|
4367
|
+
const res = must(await callCloud(
|
|
4368
|
+
`/kanban/board/get${query}`,
|
|
4369
|
+
{ accountId }
|
|
4370
|
+
));
|
|
4062
4371
|
return res.board ?? null;
|
|
4063
4372
|
}
|
|
4064
4373
|
/** Le journal d'une seule carte — ce que le contexte d'un agent demande. */
|
|
4065
4374
|
async cardHistory(boardId, cardId) {
|
|
4066
4375
|
const res = await callCloud(
|
|
4067
|
-
`/kanban/card/history?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}
|
|
4376
|
+
`/kanban/card/history?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}`,
|
|
4377
|
+
await scopeOfBoard(boardId)
|
|
4068
4378
|
);
|
|
4069
4379
|
return res.data?.history ?? [];
|
|
4070
4380
|
}
|
|
@@ -4078,7 +4388,8 @@ var KanbanStore = class {
|
|
|
4078
4388
|
async addComment(boardId, cardId, detail, conversationId) {
|
|
4079
4389
|
const res = await callCloud("/kanban/card/comment/add", {
|
|
4080
4390
|
method: "POST",
|
|
4081
|
-
body: { boardId, cardId, detail, author: "ai", ...conversationId ? { conversationId } : {} }
|
|
4391
|
+
body: { boardId, cardId, detail, author: "ai", ...conversationId ? { conversationId } : {} },
|
|
4392
|
+
...await scopeOfBoard(boardId)
|
|
4082
4393
|
});
|
|
4083
4394
|
return res.ok;
|
|
4084
4395
|
}
|
|
@@ -4086,7 +4397,8 @@ var KanbanStore = class {
|
|
|
4086
4397
|
async addCardEvent(boardId, cardId, type, detail) {
|
|
4087
4398
|
const res = await callCloud("/kanban/card/event/add", {
|
|
4088
4399
|
method: "POST",
|
|
4089
|
-
body: { boardId, cardId, type, detail }
|
|
4400
|
+
body: { boardId, cardId, type, detail },
|
|
4401
|
+
...await scopeOfBoard(boardId)
|
|
4090
4402
|
});
|
|
4091
4403
|
return res.ok;
|
|
4092
4404
|
}
|
|
@@ -4100,14 +4412,16 @@ var KanbanStore = class {
|
|
|
4100
4412
|
async addCard(boardId, input) {
|
|
4101
4413
|
const res = await callCloud("/kanban/card/add", {
|
|
4102
4414
|
method: "POST",
|
|
4103
|
-
body: { boardId, ...input }
|
|
4415
|
+
body: { boardId, ...input },
|
|
4416
|
+
...await scopeOfBoard(boardId)
|
|
4104
4417
|
});
|
|
4105
4418
|
return { card: res.data?.card ?? null, unsupported: res.status === 404 };
|
|
4106
4419
|
}
|
|
4107
4420
|
/** Une carte, par son identifiant — archivée comprise. */
|
|
4108
4421
|
async card(boardId, cardId) {
|
|
4109
4422
|
const res = await callCloud(
|
|
4110
|
-
`/kanban/card/get?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}
|
|
4423
|
+
`/kanban/card/get?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}`,
|
|
4424
|
+
await scopeOfBoard(boardId)
|
|
4111
4425
|
);
|
|
4112
4426
|
return res.data ?? null;
|
|
4113
4427
|
}
|
|
@@ -4121,7 +4435,8 @@ var KanbanStore = class {
|
|
|
4121
4435
|
async updateCard(boardId, cardId, patch) {
|
|
4122
4436
|
const res = await callCloud("/kanban/card/update", {
|
|
4123
4437
|
method: "POST",
|
|
4124
|
-
body: { boardId, cardId, ...patch }
|
|
4438
|
+
body: { boardId, cardId, ...patch },
|
|
4439
|
+
...await scopeOfBoard(boardId)
|
|
4125
4440
|
});
|
|
4126
4441
|
return res.data?.card ?? null;
|
|
4127
4442
|
}
|
|
@@ -4129,7 +4444,8 @@ var KanbanStore = class {
|
|
|
4129
4444
|
async setCardArchived(boardId, cardId, archived) {
|
|
4130
4445
|
const res = await callCloud(`/kanban/card/${archived ? "archive" : "unarchive"}`, {
|
|
4131
4446
|
method: "POST",
|
|
4132
|
-
body: { boardId, cardId }
|
|
4447
|
+
body: { boardId, cardId },
|
|
4448
|
+
...await scopeOfBoard(boardId)
|
|
4133
4449
|
});
|
|
4134
4450
|
return res.ok;
|
|
4135
4451
|
}
|
|
@@ -4141,7 +4457,8 @@ var KanbanStore = class {
|
|
|
4141
4457
|
const orgId = await resolveOrganizationId(organizationId);
|
|
4142
4458
|
const res = must(
|
|
4143
4459
|
await callCloud(
|
|
4144
|
-
`/organization/get-full-organization?organizationId=${encodeURIComponent(orgId)}
|
|
4460
|
+
`/organization/get-full-organization?organizationId=${encodeURIComponent(orgId)}`,
|
|
4461
|
+
{ accountId: await accountOfOrg(orgId) }
|
|
4145
4462
|
)
|
|
4146
4463
|
);
|
|
4147
4464
|
return (res.members ?? []).map((m) => ({
|
|
@@ -4169,7 +4486,8 @@ var KanbanStore = class {
|
|
|
4169
4486
|
if (input.limit) query.set("limit", String(input.limit));
|
|
4170
4487
|
const res = must(
|
|
4171
4488
|
await callCloud(
|
|
4172
|
-
`/kanban/card/search?${query.toString()}
|
|
4489
|
+
`/kanban/card/search?${query.toString()}`,
|
|
4490
|
+
{ accountId: await accountOfOrg(orgId) }
|
|
4173
4491
|
)
|
|
4174
4492
|
);
|
|
4175
4493
|
return { cards: res.cards ?? [], total: res.total ?? 0, truncated: Boolean(res.truncated) };
|
|
@@ -4178,7 +4496,8 @@ var KanbanStore = class {
|
|
|
4178
4496
|
async moveCard(boardId, cardId, toColumnId) {
|
|
4179
4497
|
const res = await callCloud("/kanban/card/move", {
|
|
4180
4498
|
method: "POST",
|
|
4181
|
-
body: { boardId, cardId, toColumnId }
|
|
4499
|
+
body: { boardId, cardId, toColumnId },
|
|
4500
|
+
...await scopeOfBoard(boardId)
|
|
4182
4501
|
});
|
|
4183
4502
|
return res.ok;
|
|
4184
4503
|
}
|
|
@@ -4191,7 +4510,8 @@ var KanbanStore = class {
|
|
|
4191
4510
|
*/
|
|
4192
4511
|
async cardLinks(boardId) {
|
|
4193
4512
|
const res = await callCloud(
|
|
4194
|
-
`/kanban/card-link/list?boardId=${encodeURIComponent(boardId)}
|
|
4513
|
+
`/kanban/card-link/list?boardId=${encodeURIComponent(boardId)}`,
|
|
4514
|
+
await scopeOfBoard(boardId)
|
|
4195
4515
|
);
|
|
4196
4516
|
return { links: res.data?.links ?? [], cards: res.data?.cards ?? [] };
|
|
4197
4517
|
}
|
|
@@ -4209,7 +4529,8 @@ var KanbanStore = class {
|
|
|
4209
4529
|
cardId,
|
|
4210
4530
|
parentBoardId: parent?.boardId ?? null,
|
|
4211
4531
|
parentCardId: parent?.cardId ?? null
|
|
4212
|
-
}
|
|
4532
|
+
},
|
|
4533
|
+
...await scopeOfBoard(boardId)
|
|
4213
4534
|
});
|
|
4214
4535
|
return res.ok;
|
|
4215
4536
|
}
|
|
@@ -4218,6 +4539,7 @@ var KanbanStore = class {
|
|
|
4218
4539
|
if (!organizationId) return null;
|
|
4219
4540
|
const res = await callCloud("/kanban/board/create", {
|
|
4220
4541
|
method: "POST",
|
|
4542
|
+
accountId: await accountOfOrg(organizationId),
|
|
4221
4543
|
body: {
|
|
4222
4544
|
organizationId,
|
|
4223
4545
|
name: input.name,
|
|
@@ -4230,14 +4552,16 @@ var KanbanStore = class {
|
|
|
4230
4552
|
async update(input) {
|
|
4231
4553
|
const res = await callCloud("/kanban/board/update", {
|
|
4232
4554
|
method: "POST",
|
|
4233
|
-
body: input
|
|
4555
|
+
body: input,
|
|
4556
|
+
...await scopeOfBoard(input.id)
|
|
4234
4557
|
});
|
|
4235
4558
|
return res.data?.board ?? null;
|
|
4236
4559
|
}
|
|
4237
4560
|
async delete(id) {
|
|
4238
4561
|
const res = await callCloud("/kanban/board/delete", {
|
|
4239
4562
|
method: "POST",
|
|
4240
|
-
body: { id }
|
|
4563
|
+
body: { id },
|
|
4564
|
+
...await scopeOfBoard(id)
|
|
4241
4565
|
});
|
|
4242
4566
|
return res.data?.success ?? false;
|
|
4243
4567
|
}
|
|
@@ -4657,7 +4981,7 @@ function tailTranscript(opts) {
|
|
|
4657
4981
|
|
|
4658
4982
|
// ../server/src/services/ai-runners/claude-pty-runner.ts
|
|
4659
4983
|
async function getAgentManager() {
|
|
4660
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
4984
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-EI7SXPN5.js");
|
|
4661
4985
|
return agentManager2;
|
|
4662
4986
|
}
|
|
4663
4987
|
function buildPtyArgs(params, sessionId, opts) {
|
|
@@ -5349,7 +5673,7 @@ async function shutdownCodexAppServer() {
|
|
|
5349
5673
|
}
|
|
5350
5674
|
}
|
|
5351
5675
|
async function getAgentManager2() {
|
|
5352
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
5676
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-EI7SXPN5.js");
|
|
5353
5677
|
return agentManager2;
|
|
5354
5678
|
}
|
|
5355
5679
|
function parseRuneyaCurlCommand(command) {
|
|
@@ -7297,7 +7621,10 @@ export {
|
|
|
7297
7621
|
cloudSessionStore,
|
|
7298
7622
|
getCloudApiUrl,
|
|
7299
7623
|
orgCloudUrl,
|
|
7624
|
+
accountForOrg,
|
|
7625
|
+
accountForOrgOrThrow,
|
|
7300
7626
|
cloudFetch,
|
|
7627
|
+
readCloudIdentity,
|
|
7301
7628
|
environmentOverridesStore,
|
|
7302
7629
|
environmentResolver,
|
|
7303
7630
|
auditService,
|
|
@@ -7332,6 +7659,8 @@ export {
|
|
|
7332
7659
|
imageStorageService,
|
|
7333
7660
|
getDeviceName,
|
|
7334
7661
|
cloudFetch2,
|
|
7662
|
+
accountForOrgScope,
|
|
7663
|
+
soleAccountScope,
|
|
7335
7664
|
cloudAuthRouter,
|
|
7336
7665
|
kanbanStore,
|
|
7337
7666
|
executeKanbanCommands,
|
|
@@ -7344,4 +7673,4 @@ export {
|
|
|
7344
7673
|
startCliSession,
|
|
7345
7674
|
chatRouter
|
|
7346
7675
|
};
|
|
7347
|
-
//# sourceMappingURL=chunk-
|
|
7676
|
+
//# sourceMappingURL=chunk-4SJCPFGK.js.map
|