@runeya/runeya 2.0.105 → 2.0.107
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-2RWV2SXZ.js +9 -0
- package/{chat-3XDVULFH.js → chat-O7ZXCCKV.js} +6 -6
- package/{chunk-NPORVPEO.js → chunk-ELI2TELD.js} +2 -2
- package/{chunk-LTLOVQJQ.js → chunk-J3NAI636.js} +53 -3
- package/chunk-J3NAI636.js.map +1 -0
- package/{chunk-IOAGFK3P.js → chunk-JNI4CXJ7.js} +368 -76
- package/chunk-JNI4CXJ7.js.map +1 -0
- package/{chunk-AAK7ACHG.js → chunk-TE57T5GO.js} +29 -7
- package/chunk-TE57T5GO.js.map +1 -0
- package/{chunk-5GYBAMHV.js → chunk-ZDHLWTHW.js} +2 -2
- package/{companion-MUFVXURV.js → companion-NZU7FNID.js} +4 -4
- package/index.js +3 -3
- package/package.json +1 -1
- package/settings-manager-Q4PZ3UD5.js +9 -0
- package/{src-TEL7L4K2.js → src-MILB2SQA.js} +115 -42
- package/src-MILB2SQA.js.map +1 -0
- package/{vault-resolver-JR7TCITD.js → vault-resolver-V7KH4FTC.js} +8 -2
- package/web/assets/{AgentScalarChatInterface.vue-BJM35DeL.js → AgentScalarChatInterface.vue-CvSuHoWx.js} +1 -1
- package/web/assets/{AgentTerminalPage-BQGPZrpQ.js → AgentTerminalPage-DM7AvnyQ.js} +1 -1
- package/web/assets/AiChatPage-DuXpncYG.js +1 -0
- package/web/assets/{AppLayout-CYQBjQBU.css → AppLayout-DK0hjOjl.css} +1 -1
- package/web/assets/AppLayout-DimGQa7G.js +1 -0
- package/web/assets/{AuditPage-C4Bfji8d.js → AuditPage-B_0kBq_9.js} +1 -1
- package/web/assets/CloudAccountPage-BJK2BN44.js +1 -0
- package/web/assets/CloudAccountPage-Bxa_0f6m.css +1 -0
- package/web/assets/CloudAccountPage-HGWX4TH4.js +1 -0
- package/web/assets/{CloudMessagingPage-TQa2f3jG.js → CloudMessagingPage-CWv16kIi.js} +1 -1
- package/web/assets/DashboardPage-CspSBpVO.css +1 -0
- package/web/assets/DashboardPage-D7uW5Gte.js +164 -0
- package/web/assets/DirectoryPickerDialog-BbYn-Yjo.css +1 -0
- package/web/assets/DirectoryPickerDialog-FsJTp3yS.js +1 -0
- package/web/assets/{EditorIcon-CCcs39RM.js → EditorIcon-DAVCsZGN.js} +1 -1
- package/web/assets/{EnvironmentForm-BpbqiF1L.js → EnvironmentForm-DNUk-CLn.js} +1 -1
- package/web/assets/{EnvironmentFormPage-DAL6SWk4.js → EnvironmentFormPage-AeYFkQiH.js} +1 -1
- package/web/assets/{EnvironmentListPage-DnOf6mxI.js → EnvironmentListPage-zo_QJeYZ.js} +1 -1
- package/web/assets/{KanbanBoardPage-DivLHOst.js → KanbanBoardPage-CXSqV6Qh.js} +3 -3
- package/web/assets/KanbanBoardPage-hU10A0U8.css +1 -0
- package/web/assets/{KanbanListPage-BZBp2SEM.js → KanbanListPage-DZBXXH0r.js} +1 -1
- package/web/assets/LaunchProjectPage-BHLH3peH.css +1 -0
- package/web/assets/LaunchProjectPage-D_Ivnho3.js +1 -0
- package/web/assets/{LaunchServicesPage-faagFx5s.js → LaunchServicesPage-BTXi6jNU.js} +1 -1
- package/web/assets/{LogViewer-Bo1AijCY.js → LogViewer-Bqe-albM.js} +1 -1
- package/web/assets/{OrgKeyPrompt-K3QpeVbX.js → OrgKeyPrompt-D05OEwQM.js} +1 -1
- package/web/assets/ProcessControls-BnlYc5oo.js +1 -0
- package/web/assets/ProcessControls-Dk1xgpaC.css +1 -0
- package/web/assets/{ProcessDetailPage-Cb0xkhWa.js → ProcessDetailPage-CsbqvXk8.js} +1 -1
- package/web/assets/{ProcessMetrics-BUduv_zs.js → ProcessMetrics-3iA0I20o.js} +1 -1
- package/web/assets/{RandomJobTestPage-CrfiasmN.js → RandomJobTestPage-BO3b4l7T.js} +1 -1
- package/web/assets/{ScenarioEditorPage-D-YgluX0.js → ScenarioEditorPage-CHX44wHI.js} +1 -1
- package/web/assets/{SendToChatDialog-C8hGseVF.js → SendToChatDialog-8ToadFnr.js} +1 -1
- package/web/assets/ServiceControlsBar-BtnWYJmp.css +1 -0
- package/web/assets/ServiceControlsBar-OVSGVoGc.js +1 -0
- package/web/assets/{ServiceDetailPage-IU_BrMof.css → ServiceDetailPage-DpgtCJPg.css} +1 -1
- package/web/assets/{ServiceDetailPage-CKv5okTI.js → ServiceDetailPage-DpqDQl76.js} +2 -2
- package/web/assets/{ServiceFormPage-B7Pqd-8G.js → ServiceFormPage-COlkaDyA.js} +1 -1
- package/web/assets/{SettingsPage-Dw6tbcbw.css → SettingsPage-B7yKfXK2.css} +1 -1
- package/web/assets/{SettingsPage-D98i-wTG.js → SettingsPage-YOKL8o_O.js} +30 -30
- package/web/assets/{UnlockPage-CfunNJaH.js → UnlockPage-B75f6TuX.js} +1 -1
- package/web/assets/{VariablesTable-Df6zcci3.js → VariablesTable-siiUpJXY.js} +1 -1
- package/web/assets/{VaultMigrationPage-qbvc94kb.js → VaultMigrationPage-DcYkoGTq.js} +1 -1
- package/web/assets/{VersionBadge-BXnLklpJ.js → VersionBadge-BH9S4OPH.js} +1 -1
- package/web/assets/WikiPage-CxBVPs9x.js +1 -0
- package/web/assets/{WikiView-Bh6RXQBq.js → WikiView-DnQhoJpH.js} +1 -1
- package/web/assets/{add-scalar-classes-DB2_WLIJ.js → add-scalar-classes-B2maka72.js} +3 -3
- package/web/assets/{autocomplete-DGCoxfNS.js → autocomplete-CsyixLlY.js} +1 -1
- package/web/assets/{basic-shape-diamond.svg-xNT6X1Qb.js → basic-shape-diamond.svg-BbOA3Gz6.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-BmcZ747R.js → basic-shape-hexagon.svg-DdJgnvDo.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-Dcbz9NPd.js → basic-shape-primary-circle-ellipse-round.svg-Bg3fLGGT.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-BzBIQx14.js → basic-shape-primary-square-rectangle.svg-CESoq0fN.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-B4CvRcje.js → basic-shape-shield.svg-ElM9Zp2x.js} +1 -1
- package/web/assets/{browser-Shq-eT-m.js → browser-CwiIrBV5.js} +1 -1
- package/web/assets/{browser-B8JtJhR2.js → browser-MtZH8oRn.js} +1 -1
- package/web/assets/{card-DEu7dF-F.js → card-D8i3Wb9E.js} +1 -1
- package/web/assets/{checkbox-BqnZ2cD-.js → checkbox-DfhW4jIw.js} +1 -1
- package/web/assets/{chip-CRixbx-S.js → chip-jxWVyF6O.js} +1 -1
- package/web/assets/{client-DNoHdxn1.js → client-BgGTZAbs.js} +1 -1
- package/web/assets/{cloud-chat.store-kZqNLo_z.js → cloud-chat.store-DnjVk4Ss.js} +1 -1
- package/web/assets/cloud-client-CJH_Ql5a.js +1 -0
- package/web/assets/cloud-session-DWaO5I68.js +2 -0
- package/web/assets/{column-FgvQtAh0.js → column-DucGv9T0.js} +1 -1
- package/web/assets/{computer-device-desktop-monitor.svg-z7kHUC1x.js → computer-device-desktop-monitor.svg-DJbi1v8s.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-1eUZaHqA.js → computer-device-desktop.svg-DJtxrGiU.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-C8DpBfkH.js → computer-device-laptop.svg-BxPl4SOy.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-DS-ddRO-.js → computer-device-mobile-phone-android-samsung-back.svg-DZyVWDjs.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-LpEMij2S.js → computer-device-mobile-phone-android-samsung.svg-CY2rayd7.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-CDcSloCw.js → computer-device-mobile-phone-iphone-x-back.svg-wB3dvTWI.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-BPSexk0x.js → computer-device-mobile-phone-iphone-x.svg-DlRKY5sj.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-BZig4Aw5.js → computer-device-mobile-tablet-touch.svg-DfslXQQZ.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-CXPB_xSf.js → computer-device-mobile-tablet.svg-CcURGna7.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-wwCSAfIt.js → computer-device-network-ethernet-cat6.svg-Dp-TzO2e.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-DXoH7L3O.js → computer-device-network-lan-www.svg-BPpSMigg.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-CIrSHEuj.js → computer-device-network-wifi-connection.svg-CYQyIbfa.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-56FYxHPI.js → computer-device-network-wifi-router.svg-DSAd7WFk.js} +1 -1
- package/web/assets/{cssMode-BdDocn_D.js → cssMode-COezfEv9.js} +1 -1
- package/web/assets/{divider-DFPJ77yz.js → divider-DUL-UFyL.js} +1 -1
- package/web/assets/{docx-preview-DsY2e1A4.js → docx-preview-BF14ztI2.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-COnAvvj3.js → ecology-science-erlenmeyer-flask.svg-ETcpyMYz.js} +1 -1
- package/web/assets/{fieldset-B-99T0TX.js → fieldset-CSn4dPXR.js} +1 -1
- package/web/assets/{freemarker2-BtdxIkTn.js → freemarker2-CqLlcxHC.js} +1 -1
- package/web/assets/{handlebars-B_TMkJpv.js → handlebars-Cp1TiX9f.js} +1 -1
- package/web/assets/{html-BcZ8MAy0.js → html-BzArqvCu.js} +1 -1
- package/web/assets/{htmlMode-CSum4yQL.js → htmlMode-CIRVb85i.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-C5Ehowdy.js → image-flash-lightning.svg-CSTusJ5t.js} +1 -1
- package/web/assets/{image-picture-flower.svg-DK1MFmFP.js → image-picture-flower.svg-Cg9aaOhh.js} +1 -1
- package/web/assets/{index-D6vlk4RR.js → index-Q9nkGIct.js} +6 -6
- package/web/assets/{interface-alert-exclamation-diamond.svg-BaPdeW3w.js → interface-alert-exclamation-diamond.svg-JL4lYLy1.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-DLEIttIL.js → interface-alert-exclamation-triangle-warning.svg-kvz8dLNC.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-cK7L3kmy.js → interface-alert-information-circle.svg-DRqP_pYe.js} +1 -1
- package/web/assets/{interface-award-crown.svg-Cbv0R-2a.js → interface-award-crown.svg-CX4w4INE.js} +1 -1
- package/web/assets/{interface-bookmark.svg-BNvWiMpP.js → interface-bookmark-tag.svg-D5LiJMAo.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-BgjPjB44.js → interface-bookmark.svg-Bx06-XmV.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-D6FudaOV.js → interface-calendar-date-one.svg-D28mjrW2.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-BYcFukt9.js → interface-content-book-open-pages.svg-DvkccrQv.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-CgCqBGB3.js → interface-content-book-page.svg-Co_Rf29J.js} +1 -1
- package/web/assets/{interface-content-file.svg-Dysqj4Fy.js → interface-content-file.svg-CLqtAgLt.js} +1 -1
- package/web/assets/{interface-content-folder.svg-BMTtpWbW.js → interface-content-folder.svg-C9dHyqkp.js} +1 -1
- package/web/assets/interface-content-folder.svg-kYcgQcTJ.js +1 -0
- package/web/assets/{interface-copy-clipboard.svg-xmJL-B3E.js → interface-copy-clipboard.svg-DmF1P-Po.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-Kbr1DoBE.js → interface-edit-attachment.svg-BD_k5qE4.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-BcsYL2QR.js → interface-edit-binocular.svg-BzKsCrsk.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-CK8-73Ic.js → interface-edit-magic-wand.svg-CJkxoH8r.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-CCD7IuyY.js → interface-edit-tool-paint-roller.svg-CgXiF7qe.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-BdGTUe8h.js → interface-edit-tool-pencil.svg-CeWHirTd.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-BZYmjBJ0.js → interface-favorite-award.svg-B9Vd9Hf6.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-LR6s8mSA.js → interface-favorite-flag.svg-BRp3aMEx.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-DUAidg15.js → interface-favorite-heart.svg-B2zeO1q2.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-DFJjoSSa.js → interface-favorite-star.svg-vkH4UOle.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-BaeA0vH3.js → interface-favorite-stars-sparkles.svg-CPTglDfo.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-W4RZfGqV.js → interface-hierarchy-flowchart.svg-D_WG90fj.js} +1 -1
- package/web/assets/{interface-home-house.svg-IUjMMgjK.js → interface-home-house.svg-BUYqjZPI.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-DNChYQsh.js → interface-hyperlink.svg-DU6gyhSU.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-DCA2rpRD.js → interface-lighting-brightness.svg-BMX-UMmG.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-Bp7Fx_R6.js → interface-lock-closed.svg-fm6gJnaL.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-Dd4Ds1Mm.js → interface-lock-open-unlock.svg-D0IkCqrd.js} +1 -1
- package/web/assets/{interface-login-key.svg-DcALDMbk.js → interface-login-key.svg-BjXwMM_4.js} +1 -1
- package/web/assets/{interface-search.svg-BJyEByV1.js → interface-search.svg-Ce8_4eqn.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-C9CHFT84.js → interface-setting-cog.svg-BCQ9oWrI.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-DVTxsp89.js → interface-share-megaphone-bullhorn.svg-IraxN-RR.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-C3e8NQFf.js → interface-share-rocket.svg-NzwY-7pd.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-BoO44o5l.js → interface-share-satellite.svg-CN8f5zE5.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-VZGcbybh.js → interface-share-space-ship.svg-BMm5tIIq.js} +1 -1
- package/web/assets/{interface-share.svg-CkLVy8dR.js → interface-share.svg-5RMe9Dry.js} +1 -1
- package/web/assets/{interface-signal-square.svg-CKBqMegG.js → interface-signal-square.svg-C-RuIJu1.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-gRZDDZT4.js → interface-time-clock-circle.svg-B3CNKtVN.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-CMgMgKWz.js → interface-time-hour-glass.svg-o3F09IxK.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-Cgmhb2aK.js → interface-users-multiple.svg-Cmqji5Ln.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-D6FglJLb.js → interface-weather-moon.svg-CGM-ZS56.js} +1 -1
- package/web/assets/{javascript-CxLmzzum.js → javascript-qSezXPr1.js} +1 -1
- package/web/assets/{jsonMode-16vzngns.js → jsonMode-BvjmRSYr.js} +1 -1
- package/web/assets/{liquid-BMvGrjUy.js → liquid-CH1qgG2G.js} +1 -1
- package/web/assets/{lspLanguageFeatures-ZfLU0fCP.js → lspLanguageFeatures-CtBsCddT.js} +1 -1
- package/web/assets/{mail-chat-bubble-square.svg-Bhoao44r.js → mail-chat-bubble-square.svg-DvStF3KW.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-C-egVj6i.js → mail-send-email-paper-airplane.svg-CwTkfLk9.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-D723XNWw.js → mail-send-envelope.svg-Dkh_5t2W.js} +1 -1
- package/web/assets/{mdx-Dskq_gBs.js → mdx-BqogtCJ-.js} +1 -1
- package/web/assets/{minus-C4zA3VBS.js → minus-B2dZQvCq.js} +1 -1
- package/web/assets/modal-B6NeZlOc.js +1 -0
- package/web/assets/{modal-D6-v9xXV.js → modal-BkbDSZxh.js} +1 -1
- package/web/assets/{money-cashier-receipt.svg-Cn_o2XiU.js → money-cashier-receipt.svg-zKWFfD0k.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-Tq93pTtL.js → money-currency-dollar-pay.svg-D5lfefuk.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-DAbQJAlv.js → money-graph-arrow-increase.svg-Bd2mW0uZ.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-BQYFgvXE.js → money-graph-bar-chart-increase.svg-DegjdGbk.js} +1 -1
- package/web/assets/{multiselect-Bda52k7g.js → multiselect-DeUaJiPX.js} +1 -1
- package/web/assets/{nature-ecology-leaf.svg-CdYkDNjw.js → nature-ecology-leaf.svg-BbmZ_3cd.js} +1 -1
- package/web/assets/{password-lFG11ZeE.js → password-D1YX3MCu.js} +1 -1
- package/web/assets/{phone-telephone.svg-DYkDJPKM.js → phone-telephone.svg-B6UL6Fhu.js} +1 -1
- package/web/assets/{plus-CECpnqNx.js → plus-BmifHgiX.js} +1 -1
- package/web/assets/process-Cf4Ob2V-.js +1 -0
- package/web/assets/process.store-BucXc8GP.js +1 -0
- package/web/assets/{programming-bug.svg-DPFmQ2Ab.js → programming-bug.svg-Dhr7h5Lm.js} +1 -1
- package/web/assets/{programming-cloud.svg-BSvYHyhc.js → programming-cloud.svg-DIse9DrB.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-DKa5-ARn.js → programming-computer-database-server.svg-BlKvXZnN.js} +1 -1
- package/web/assets/{programming-computer-database.svg-DK5Yq5sD.js → programming-computer-database.svg-Du4GGdek.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-CRBEelP3.js → programming-module-four-layout.svg-TcO3xW7h.js} +1 -1
- package/web/assets/{programming-module-three.svg-B8nxwrWw.js → programming-module-three.svg-6UNuJszx.js} +1 -1
- package/web/assets/{programming-module.svg-Bb6iwh2f.js → programming-module.svg-BFkOw80L.js} +1 -1
- package/web/assets/{programming-script-code.svg-CRAVnrbs.js → programming-script-code.svg-CPNpYr6l.js} +1 -1
- package/web/assets/project-launch.store-Xo3pwupQ.js +1 -0
- package/web/assets/project.store-Bdp-Dw-w.js +1 -0
- package/web/assets/{python-CQW-C81Q.js → python-W_UHovJ1.js} +1 -1
- package/web/assets/{razor-B7SCC_B7.js → razor-BQiPtbwG.js} +1 -1
- package/web/assets/router-DZShz0-l.js +1 -0
- package/web/assets/settings-scope-vqQX-GF1.js +1 -0
- package/web/assets/{settings.store-DNUlgguP.js → settings.store-DqnPoZDR.js} +1 -1
- package/web/assets/{shopping-cart.svg-DERhock-.js → shopping-cart.svg-Bux9YEU6.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-HMeHtFW6.js → shopping-gift-present.svg-_h-yzC6c.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-DEpdMc5I.js → shopping-shipping-box-parcel-package.svg-BdhGUAKV.js} +1 -1
- package/web/assets/{src-8KyOvDDb.js → src-BL1Lafqz.js} +1 -1
- package/web/assets/{src-C0LwOALj.js → src-BsHOvodv.js} +1 -1
- package/web/assets/{src-DftTbqy5.js → src-cvMrX61Z.js} +3 -3
- package/web/assets/{tabpanel-nkEYF5o-.js → tabpanel-B7UUtaKJ.js} +1 -1
- package/web/assets/{tag-new-circle.svg-DnAk78Qj.js → tag-new-circle.svg-CPl83AFc.js} +1 -1
- package/web/assets/theme-CuU9r36Y.js +1 -0
- package/web/assets/{toggleswitch-0zBATIJn.js → toggleswitch-CqZ2j960.js} +1 -1
- package/web/assets/{travel-map-earth-globe.svg-DzHYfc08.js → travel-map-earth-globe.svg-mdZXLqAH.js} +1 -1
- package/web/assets/trpc-i_kC7f4I.js +1 -0
- package/web/assets/{tsMode-C2keJEki.js → tsMode-BTrmDRFt.js} +1 -1
- package/web/assets/{typescript-CVUrqWO5.js → typescript-B5jdwmxa.js} +1 -1
- package/web/assets/useAiChatDrawer-ChqgY66m.js +1 -0
- package/web/assets/{useCloudOrg-wtm9hvmX.js → useCloudOrg-Dq8l_9Ry.js} +1 -1
- package/web/assets/useProjectCatalog-BE9Yy2SC.js +1 -0
- package/web/assets/useProjectCloudOrg-DAj0XB8D.js +1 -0
- package/web/assets/{xml-CsqBxYHJ.js → xml-vcJlRCph.js} +1 -1
- package/web/assets/{yaml-DnOc8lIk.js → yaml-CfcdnZ_c.js} +1 -1
- package/web/index.html +1 -1
- package/agent-manager-4XJUIZKL.js +0 -9
- package/chunk-AAK7ACHG.js.map +0 -1
- package/chunk-IOAGFK3P.js.map +0 -1
- package/chunk-LTLOVQJQ.js.map +0 -1
- package/settings-manager-Y4GNAXOH.js +0 -9
- package/src-TEL7L4K2.js.map +0 -1
- package/web/assets/AiChatPage-CGrkzNTM.js +0 -1
- package/web/assets/AppLayout-CuyxD3Fj.js +0 -1
- package/web/assets/CloudAccountPage-CEstzRsK.js +0 -1
- package/web/assets/CloudAccountPage-d2w3Llk8.js +0 -1
- package/web/assets/CloudAccountPage-g6lFVpsX.css +0 -1
- package/web/assets/DashboardPage-CSkUCQHY.css +0 -1
- package/web/assets/DashboardPage-qb6Jt5gw.js +0 -1
- package/web/assets/DirectoryPickerDialog-CSGtvSIk.css +0 -1
- package/web/assets/DirectoryPickerDialog-gxJmcCKx.js +0 -1
- package/web/assets/KanbanBoardPage-BOVq3zOt.css +0 -1
- package/web/assets/LaunchProjectPage-BWHrGBHM.js +0 -1
- package/web/assets/LaunchProjectPage-CHpVVYBa.css +0 -1
- package/web/assets/ProcessControls-C06DpNzE.js +0 -1
- package/web/assets/ProcessControls-CKmB6sB9.css +0 -1
- package/web/assets/ProjectDetailPage-BHO55O9a.js +0 -1
- package/web/assets/ProjectDetailPage-CLbj9ZT4.css +0 -1
- package/web/assets/ProjectListPage-DL2qYiZa.js +0 -1
- package/web/assets/ProjectListPage-DYs6X7r2.css +0 -1
- package/web/assets/ServiceControlsBar-DWc-XpTV.js +0 -1
- package/web/assets/ServiceControlsBar-D_S_sGQj.css +0 -1
- package/web/assets/WikiPage-Mk00z3rs.js +0 -1
- package/web/assets/cloud-session-B7VyKT9t.js +0 -1
- package/web/assets/interface-content-folder.svg-CpQzzRRt.js +0 -1
- package/web/assets/modal-DtDtuH8f.js +0 -1
- package/web/assets/process.store-CTqCW-2E.js +0 -1
- package/web/assets/router-D7nqyJGv.js +0 -1
- package/web/assets/settings-scope-D1s_O2Eh.js +0 -1
- package/web/assets/theme-Qzouwh8w.js +0 -1
- package/web/assets/trpc-BPM_4m6N.js +0 -1
- package/web/assets/useAiChatDrawer-DWVagwvc.js +0 -1
- package/web/assets/useProjectCatalog-BpucrxV2.js +0 -1
- package/web/assets/useProjectCloudOrg-DYdsja7j.js +0 -1
- /package/{agent-manager-4XJUIZKL.js.map → agent-manager-2RWV2SXZ.js.map} +0 -0
- /package/{chat-3XDVULFH.js.map → chat-O7ZXCCKV.js.map} +0 -0
- /package/{chunk-NPORVPEO.js.map → chunk-ELI2TELD.js.map} +0 -0
- /package/{chunk-5GYBAMHV.js.map → chunk-ZDHLWTHW.js.map} +0 -0
- /package/{companion-MUFVXURV.js.map → companion-NZU7FNID.js.map} +0 -0
- /package/{settings-manager-Y4GNAXOH.js.map → settings-manager-Q4PZ3UD5.js.map} +0 -0
- /package/{vault-resolver-JR7TCITD.js.map → vault-resolver-V7KH4FTC.js.map} +0 -0
- /package/web/assets/{abap-PT-N0eyj.js → abap-cDlgWO6H.js} +0 -0
- /package/web/assets/{apex-BYovhaVz.js → apex-DxzSGotK.js} +0 -0
- /package/web/assets/{azcli-DOxZ9r2f.js → azcli-CUNfZLtQ.js} +0 -0
- /package/web/assets/{bat-B29juGG4.js → bat-C-oKGifY.js} +0 -0
- /package/web/assets/{bicep-7-ApPSlE.js → bicep-C4xTl9QV.js} +0 -0
- /package/web/assets/{browser-N7UrAcvB.js → browser-CE5P0iHW.js} +0 -0
- /package/web/assets/{cameligo-BipBUQCp.js → cameligo-COpO1ZvP.js} +0 -0
- /package/web/assets/{clojure-DBgUdyK0.js → clojure-D8gp5eAN.js} +0 -0
- /package/web/assets/{coffee-DIU_x8Zp.js → coffee-De9HMN-q.js} +0 -0
- /package/web/assets/{cpp-CAPjLTys.js → cpp-C4pJyeKy.js} +0 -0
- /package/web/assets/{csharp-kFCIHjec.js → csharp-B4wLqqiU.js} +0 -0
- /package/web/assets/{csp-BFKsjgRE.js → csp-Do0Gg4qE.js} +0 -0
- /package/web/assets/{css-C3uiAvXV.js → css-BLq1nXK0.js} +0 -0
- /package/web/assets/{cypher-BC8El989.js → cypher-CDQzi0TV.js} +0 -0
- /package/web/assets/{dart-BAClpSRO.js → dart-bTPYn7bY.js} +0 -0
- /package/web/assets/{dockerfile-DVZSJ3rq.js → dockerfile-yM7ZnQpo.js} +0 -0
- /package/web/assets/{ecl-Dis7T_5W.js → ecl-BgTpp_c4.js} +0 -0
- /package/web/assets/{elixir-B0xfsmfq.js → elixir-DO7wJ1ib.js} +0 -0
- /package/web/assets/{flow9-DbTJxEBz.js → flow9-B2Ko_py3.js} +0 -0
- /package/web/assets/{fsharp-DTOqftZo.js → fsharp-DNdx3wKW.js} +0 -0
- /package/web/assets/{go-KWOR5hag.js → go-D7LajbkE.js} +0 -0
- /package/web/assets/{graphql-DjYFSl6G.js → graphql-BCQSwUPo.js} +0 -0
- /package/web/assets/{hcl-D8RrENjV.js → hcl-DR3uNUXT.js} +0 -0
- /package/web/assets/{ini-BOtkgeoY.js → ini-zkzQPitL.js} +0 -0
- /package/web/assets/{java-DKd4_eEX.js → java-YFwuCa4S.js} +0 -0
- /package/web/assets/{julia-XpEGblEj.js → julia-WWwv4jLR.js} +0 -0
- /package/web/assets/{kotlin-BZv3QweN.js → kotlin-FwlJkapy.js} +0 -0
- /package/web/assets/{less-H5kV6pUj.js → less-CyhHW1nH.js} +0 -0
- /package/web/assets/{lexon-Bg4gEB0s.js → lexon-BScN_v1c.js} +0 -0
- /package/web/assets/{lua-D7eb4Dnq.js → lua-eWb9GpZJ.js} +0 -0
- /package/web/assets/{m3-BjDYXZ0c.js → m3-C4NDU793.js} +0 -0
- /package/web/assets/{markdown-Cl5YxO_y.js → markdown-DWWpXAtL.js} +0 -0
- /package/web/assets/{mips-sklxJ87A.js → mips-BpJKGw00.js} +0 -0
- /package/web/assets/{msdax-C0nZ2Nk3.js → msdax-BiuvyZwP.js} +0 -0
- /package/web/assets/{mysql-D6eZPdeQ.js → mysql-DJW9Aa9q.js} +0 -0
- /package/web/assets/{objective-c-W10E2fSz.js → objective-c-YouNnWOW.js} +0 -0
- /package/web/assets/{pascal-Cd0rtL9J.js → pascal-jQsRnBre.js} +0 -0
- /package/web/assets/{pascaligo-BbE09f5f.js → pascaligo-DZI84_dt.js} +0 -0
- /package/web/assets/{perl-bnuvlUCT.js → perl-D9TKt-s6.js} +0 -0
- /package/web/assets/{pgsql-BETeeS25.js → pgsql-DXgI6ehC.js} +0 -0
- /package/web/assets/{php-zaSPUC-m.js → php-Cgqd4wfW.js} +0 -0
- /package/web/assets/{pla-ChOKgzpJ.js → pla-DRDkvVUU.js} +0 -0
- /package/web/assets/{postiats-By_SllB5.js → postiats-BOLeCCau.js} +0 -0
- /package/web/assets/{powerquery-CB5gIeJ1.js → powerquery-DCDtPNBU.js} +0 -0
- /package/web/assets/{powershell-CgdaEQwq.js → powershell-WnZ4e5ia.js} +0 -0
- /package/web/assets/{protobuf-P7fNUpCt.js → protobuf-C9Dg-C9o.js} +0 -0
- /package/web/assets/{pug-DZaxV_Nc.js → pug-Dr8RhWun.js} +0 -0
- /package/web/assets/{qsharp-BdkO9QAN.js → qsharp-DukGWvWZ.js} +0 -0
- /package/web/assets/{r-C-pPWc3R.js → r-BC41pTgC.js} +0 -0
- /package/web/assets/{redis-BT1HxrEq.js → redis-D-gYIUku.js} +0 -0
- /package/web/assets/{redshift-CDnJNPnz.js → redshift-r0XbF8XS.js} +0 -0
- /package/web/assets/{restructuredtext-Bt8v-MuE.js → restructuredtext-DsJDS7Eu.js} +0 -0
- /package/web/assets/{ruby-BLxqHkKg.js → ruby-JPrm3ODz.js} +0 -0
- /package/web/assets/{rust-CIh7vugr.js → rust-C8IjEXni.js} +0 -0
- /package/web/assets/{sb-eE41pfwD.js → sb-D8vNiFl9.js} +0 -0
- /package/web/assets/{scala-COBuWHwn.js → scala-DThahuqf.js} +0 -0
- /package/web/assets/{scheme-BsGc_ajc.js → scheme-CvEQUYYf.js} +0 -0
- /package/web/assets/{scss-DLmucKJk.js → scss-C6obpl8K.js} +0 -0
- /package/web/assets/{shared-sse---by8uTc.js → shared-sse-Bpqv2-GI.js} +0 -0
- /package/web/assets/{shell-8IUXMVcg.js → shell-BnVmd31t.js} +0 -0
- /package/web/assets/{solidity-DUTott7T.js → solidity-Bo6zEybc.js} +0 -0
- /package/web/assets/{sophia-GqIrTWz8.js → sophia-DuB3Px8n.js} +0 -0
- /package/web/assets/{sparql-BfkJA0CL.js → sparql-CW9HqMW2.js} +0 -0
- /package/web/assets/{sql-BF_o1CCN.js → sql-CPCPCQON.js} +0 -0
- /package/web/assets/{st-B6_wiXyW.js → st-AxC3n-1-.js} +0 -0
- /package/web/assets/{swift-BHDD2Ajh.js → swift-CgZOS_MZ.js} +0 -0
- /package/web/assets/{systemverilog-BG_Ebh2a.js → systemverilog-DYR-yx39.js} +0 -0
- /package/web/assets/{tcl-ocTQVTM_.js → tcl-4hAvWv0d.js} +0 -0
- /package/web/assets/{twig-CF5whnDX.js → twig-Cf_07aFW.js} +0 -0
- /package/web/assets/{typespec-5BWfbhTE.js → typespec-2tXj8s11.js} +0 -0
- /package/web/assets/{uuid-FpfcaBnR.js → uuid--pMuF47W.js} +0 -0
- /package/web/assets/{vb-agPNUcOk.js → vb-DLpM4f4s.js} +0 -0
- /package/web/assets/{w3c-keyname-2_K_z_q5.js → w3c-keyname-CIiluUot.js} +0 -0
- /package/web/assets/{wgsl-CufoMn6o.js → wgsl-BcECae_z.js} +0 -0
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
resetRelaunches,
|
|
29
29
|
syncConversationFromClaudeTranscript,
|
|
30
30
|
verifyJwt
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-TE57T5GO.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-ELI2TELD.js";
|
|
52
52
|
import {
|
|
53
53
|
settingsManager
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-ZDHLWTHW.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-J3NAI636.js";
|
|
87
87
|
|
|
88
88
|
// ../server/src/trpc/routers/chat.ts
|
|
89
89
|
import { z as z5 } from "zod";
|
|
@@ -2335,16 +2335,21 @@ async function resolveServiceVariables(service) {
|
|
|
2335
2335
|
var DockerConfigInput = DockerConfigSchema;
|
|
2336
2336
|
var serviceRouter = router({
|
|
2337
2337
|
/**
|
|
2338
|
-
* Sans
|
|
2339
|
-
*
|
|
2340
|
-
*
|
|
2341
|
-
*
|
|
2338
|
+
* Sans filtre, la réponse couvre TOUT le poste : `serviceStore.list()` rend
|
|
2339
|
+
* chaque coffre, donc chaque organisation et chaque projet de la machine.
|
|
2340
|
+
* Deux portées permettent de s'y borner, de la plus étroite à la plus large :
|
|
2341
|
+
*
|
|
2342
|
+
* - `projectId` (+ `orgId` pour le désigner) : les services de ce projet.
|
|
2343
|
+
* - `orgId` seul : les services de cette organisation — `null` désigne le
|
|
2344
|
+
* coffre local, ce qui n'est pas la même chose que l'absence de filtre.
|
|
2345
|
+
* C'est la portée d'un écran qui doit proposer des services hors du projet
|
|
2346
|
+
* ouvert sans pour autant montrer ceux des autres organisations.
|
|
2342
2347
|
*
|
|
2343
2348
|
* Un projet introuvable rend une liste vide, jamais tout le poste : un repli
|
|
2344
2349
|
* silencieux ferait croire au filtrage tout en rendant les services des
|
|
2345
2350
|
* autres organisations.
|
|
2346
2351
|
*/
|
|
2347
|
-
list: protectedProcedure.meta({ openapi: { method: "GET", path: "/services", tags: ["services"], summary: "List services (every project of the machine unless narrowed)", protect: true } }).input(z2.object({
|
|
2352
|
+
list: protectedProcedure.meta({ openapi: { method: "GET", path: "/services", tags: ["services"], summary: "List services (every project of the machine unless narrowed by project or organization)", protect: true } }).input(z2.object({
|
|
2348
2353
|
projectId: z2.string().max(128).optional(),
|
|
2349
2354
|
orgId: z2.string().max(128).nullable().optional()
|
|
2350
2355
|
}).optional()).output(z2.any()).query(async ({ input, ctx }) => {
|
|
@@ -2358,6 +2363,9 @@ var serviceRouter = router({
|
|
|
2358
2363
|
});
|
|
2359
2364
|
const ids = new Set(project?.serviceIds ?? []);
|
|
2360
2365
|
filtered = filtered.filter((s) => ids.has(s.id));
|
|
2366
|
+
} else if (input && "orgId" in input && input.orgId !== void 0) {
|
|
2367
|
+
const orgId = input.orgId ?? null;
|
|
2368
|
+
filtered = filtered.filter((s) => (s.orgId ?? null) === orgId);
|
|
2361
2369
|
}
|
|
2362
2370
|
return Promise.all(filtered.map(async (s) => ({
|
|
2363
2371
|
...s,
|
|
@@ -2370,7 +2378,7 @@ var serviceRouter = router({
|
|
|
2370
2378
|
if (!service) {
|
|
2371
2379
|
throw new TRPCError2({ code: "NOT_FOUND", message: `Service ${input.id} not found` });
|
|
2372
2380
|
}
|
|
2373
|
-
return service;
|
|
2381
|
+
return { ...service, effectiveAgentId: await resolveEffectiveAgentId(service) };
|
|
2374
2382
|
}),
|
|
2375
2383
|
create: protectedProcedure.meta({ openapi: { method: "POST", path: "/services", tags: ["services"], summary: "Create a new service", protect: true } }).output(z2.any()).input(
|
|
2376
2384
|
z2.object({
|
|
@@ -3541,11 +3549,14 @@ import { TRPCError as TRPCError3 } from "@trpc/server";
|
|
|
3541
3549
|
// ../server/src/services/cloud-session-store.ts
|
|
3542
3550
|
import { readFile as readFile7, writeFile as writeFile5, rename as rename5, mkdir as mkdir7, chmod as chmod4, unlink as unlink3 } from "fs/promises";
|
|
3543
3551
|
import { dirname as dirname5 } from "path";
|
|
3544
|
-
import { randomBytes as randomBytes2, timingSafeEqual as timingSafeEqual2 } from "crypto";
|
|
3552
|
+
import { randomBytes as randomBytes2, createHash, timingSafeEqual as timingSafeEqual2 } from "crypto";
|
|
3545
3553
|
var FILENAME2 = "cloud-session.json";
|
|
3546
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
|
+
}
|
|
3547
3558
|
var CloudSessionStore = class {
|
|
3548
|
-
|
|
3559
|
+
accounts = [];
|
|
3549
3560
|
loaded = false;
|
|
3550
3561
|
/** Pending login states (CSRF binding between `start` and the callback). */
|
|
3551
3562
|
pending = /* @__PURE__ */ new Map();
|
|
@@ -3573,11 +3584,37 @@ var CloudSessionStore = class {
|
|
|
3573
3584
|
return readFile7(this.getLegacyFilePath(), "utf-8");
|
|
3574
3585
|
}
|
|
3575
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
|
+
*/
|
|
3576
3596
|
async load() {
|
|
3577
3597
|
if (this.loaded) return;
|
|
3578
3598
|
try {
|
|
3579
|
-
const
|
|
3580
|
-
|
|
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
|
+
}
|
|
3581
3618
|
} catch {
|
|
3582
3619
|
}
|
|
3583
3620
|
this.loaded = true;
|
|
@@ -3617,48 +3654,137 @@ var CloudSessionStore = class {
|
|
|
3617
3654
|
}
|
|
3618
3655
|
}
|
|
3619
3656
|
async save() {
|
|
3620
|
-
await mkdir7(dirname5(await this.getFilePath()), { recursive: true });
|
|
3621
3657
|
const filePath = await this.getFilePath();
|
|
3658
|
+
await mkdir7(dirname5(filePath), { recursive: true });
|
|
3659
|
+
const payload = { version: 2, accounts: this.accounts };
|
|
3622
3660
|
const tmpPath = filePath + ".tmp";
|
|
3623
|
-
await writeFile5(tmpPath, JSON.stringify(
|
|
3661
|
+
await writeFile5(tmpPath, JSON.stringify(payload, null, 2), "utf-8");
|
|
3624
3662
|
await rename5(tmpPath, filePath);
|
|
3625
3663
|
await chmod4(filePath, 384);
|
|
3626
3664
|
}
|
|
3627
|
-
/**
|
|
3628
|
-
|
|
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) {
|
|
3673
|
+
await this.load();
|
|
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);
|
|
3683
|
+
await this.save();
|
|
3684
|
+
return this.publicView(account);
|
|
3685
|
+
}
|
|
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) {
|
|
3629
3709
|
await this.load();
|
|
3630
|
-
this.
|
|
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
|
+
};
|
|
3631
3724
|
await this.save();
|
|
3725
|
+
return nextId;
|
|
3632
3726
|
}
|
|
3633
|
-
/**
|
|
3634
|
-
|
|
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) {
|
|
3635
3735
|
await this.load();
|
|
3636
|
-
|
|
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;
|
|
3637
3738
|
try {
|
|
3638
|
-
return decryptValue(
|
|
3739
|
+
return decryptValue(account.encryptedToken);
|
|
3639
3740
|
} catch {
|
|
3640
3741
|
return null;
|
|
3641
3742
|
}
|
|
3642
3743
|
}
|
|
3643
3744
|
/**
|
|
3644
|
-
* The cloud
|
|
3745
|
+
* The cloud a given account is signed into, or null when unknown.
|
|
3645
3746
|
*
|
|
3646
3747
|
* Needed to tell "an org I am not a member of" apart from "an org of another
|
|
3647
3748
|
* cloud instance entirely" — the ids of two clouds share no namespace, so
|
|
3648
3749
|
* comparing them without this would call every foreign-cloud project a
|
|
3649
3750
|
* permission problem.
|
|
3650
3751
|
*/
|
|
3651
|
-
async getCloudUrl() {
|
|
3752
|
+
async getCloudUrl(accountId) {
|
|
3652
3753
|
await this.load();
|
|
3653
|
-
|
|
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;
|
|
3654
3756
|
}
|
|
3757
|
+
/** Au moins un compte lié — l'état du poste, pas celui d'un compte précis. */
|
|
3655
3758
|
async isLinked() {
|
|
3656
|
-
|
|
3759
|
+
await this.load();
|
|
3760
|
+
return this.accounts.length > 0;
|
|
3761
|
+
}
|
|
3762
|
+
/** Ce compte-là est-il utilisable ? */
|
|
3763
|
+
async isAccountLinked(accountId) {
|
|
3764
|
+
return await this.getToken(accountId) !== null;
|
|
3657
3765
|
}
|
|
3658
|
-
/**
|
|
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). */
|
|
3659
3785
|
async clear() {
|
|
3660
3786
|
await this.load();
|
|
3661
|
-
this.
|
|
3787
|
+
this.accounts = [];
|
|
3662
3788
|
this.pending.clear();
|
|
3663
3789
|
try {
|
|
3664
3790
|
await unlink3(await this.getFilePath());
|
|
@@ -3795,10 +3921,17 @@ function getCloudApiUrl() {
|
|
|
3795
3921
|
return (env.CLOUD_URL ?? DEFAULT_CLOUD_API_URL).replace(/\/+$/, "");
|
|
3796
3922
|
}
|
|
3797
3923
|
async function orgCloudUrl(orgId) {
|
|
3798
|
-
const { readOrgClouds } = await import("./vault-resolver-
|
|
3924
|
+
const { readOrgClouds } = await import("./vault-resolver-V7KH4FTC.js");
|
|
3799
3925
|
const clouds = await readOrgClouds();
|
|
3800
3926
|
return (clouds[orgId] ?? getCloudApiUrl()).replace(/\/+$/, "");
|
|
3801
3927
|
}
|
|
3928
|
+
async function accountForOrg(orgId) {
|
|
3929
|
+
const { readOrgAccounts } = await import("./vault-resolver-V7KH4FTC.js");
|
|
3930
|
+
const stamped = (await readOrgAccounts())[orgId];
|
|
3931
|
+
const accounts = await cloudSessionStore.list();
|
|
3932
|
+
if (stamped && accounts.some((a) => a.id === stamped)) return stamped;
|
|
3933
|
+
return accounts.length === 1 ? accounts[0].id : null;
|
|
3934
|
+
}
|
|
3802
3935
|
function getCloudAppUrl() {
|
|
3803
3936
|
return (env.CLOUD_APP_URL ?? DEFAULT_CLOUD_APP_URL).replace(/\/+$/, "");
|
|
3804
3937
|
}
|
|
@@ -3809,10 +3942,18 @@ var CloudNotLinkedError = class extends Error {
|
|
|
3809
3942
|
this.name = "CloudNotLinkedError";
|
|
3810
3943
|
}
|
|
3811
3944
|
};
|
|
3945
|
+
async function resolveAccountId(scope) {
|
|
3946
|
+
if (scope.accountId) return scope.accountId;
|
|
3947
|
+
if (scope.orgId) return accountForOrg(scope.orgId);
|
|
3948
|
+
const accounts = await cloudSessionStore.list();
|
|
3949
|
+
return accounts.length === 1 ? accounts[0].id : null;
|
|
3950
|
+
}
|
|
3812
3951
|
async function cloudFetch(path, init = {}) {
|
|
3813
|
-
const
|
|
3814
|
-
|
|
3815
|
-
|
|
3952
|
+
const accountId = await resolveAccountId(init);
|
|
3953
|
+
const token = accountId ? await cloudSessionStore.getToken(accountId) : null;
|
|
3954
|
+
if (!accountId || !token) throw new CloudNotLinkedError();
|
|
3955
|
+
const base = await cloudSessionStore.getCloudUrl(accountId) ?? getCloudApiUrl();
|
|
3956
|
+
return fetch(`${base.replace(/\/+$/, "")}${path}`, {
|
|
3816
3957
|
method: init.method ?? "GET",
|
|
3817
3958
|
headers: {
|
|
3818
3959
|
Authorization: `Bearer ${token}`,
|
|
@@ -3825,6 +3966,26 @@ async function cloudFetch(path, init = {}) {
|
|
|
3825
3966
|
signal: AbortSignal.timeout(init.timeoutMs ?? 15e3)
|
|
3826
3967
|
});
|
|
3827
3968
|
}
|
|
3969
|
+
async function readCloudIdentity(cloudUrl, token) {
|
|
3970
|
+
try {
|
|
3971
|
+
const res = await fetch(`${cloudUrl.replace(/\/+$/, "")}/api/auth/get-session`, {
|
|
3972
|
+
headers: { Authorization: `Bearer ${token}`, [APP_VERSION_HEADER]: appVersion },
|
|
3973
|
+
signal: AbortSignal.timeout(15e3)
|
|
3974
|
+
});
|
|
3975
|
+
if (!res.ok) return null;
|
|
3976
|
+
const body = await res.json();
|
|
3977
|
+
const id = body.user?.id;
|
|
3978
|
+
if (typeof id !== "string" || !id) return null;
|
|
3979
|
+
return {
|
|
3980
|
+
userId: id,
|
|
3981
|
+
email: typeof body.user?.email === "string" ? body.user.email : "",
|
|
3982
|
+
name: typeof body.user?.name === "string" ? body.user.name : "",
|
|
3983
|
+
image: typeof body.user?.image === "string" ? body.user.image : null
|
|
3984
|
+
};
|
|
3985
|
+
} catch {
|
|
3986
|
+
return null;
|
|
3987
|
+
}
|
|
3988
|
+
}
|
|
3828
3989
|
|
|
3829
3990
|
// ../server/src/trpc/routers/cloud-auth.ts
|
|
3830
3991
|
function getDeviceName() {
|
|
@@ -3866,6 +4027,19 @@ function isAllowedProxyPath(path) {
|
|
|
3866
4027
|
const [pathname] = path.split("?");
|
|
3867
4028
|
return PROXY_PREFIXES.some((p) => pathname === p || pathname.startsWith(p));
|
|
3868
4029
|
}
|
|
4030
|
+
var ScopeSchema = z4.object({
|
|
4031
|
+
accountId: z4.string().max(64).optional(),
|
|
4032
|
+
orgId: z4.string().max(128).optional()
|
|
4033
|
+
});
|
|
4034
|
+
function scopeOf(input) {
|
|
4035
|
+
return { accountId: input.accountId, orgId: input.orgId };
|
|
4036
|
+
}
|
|
4037
|
+
async function scopedAccountId(input) {
|
|
4038
|
+
if (input.accountId) return input.accountId;
|
|
4039
|
+
if (input.orgId) return accountForOrg(input.orgId);
|
|
4040
|
+
const accounts = await cloudSessionStore.list();
|
|
4041
|
+
return accounts.length === 1 ? accounts[0].id : null;
|
|
4042
|
+
}
|
|
3869
4043
|
var cloudAuthRouter = router({
|
|
3870
4044
|
/** Build the cloud authorization URL to open in the browser. */
|
|
3871
4045
|
startLogin: protectedProcedure.input(z4.object({ returnTo: z4.string().url().max(2048) })).mutation(async ({ input }) => {
|
|
@@ -3880,31 +4054,64 @@ var cloudAuthRouter = router({
|
|
|
3880
4054
|
const url = `${getCloudAppUrl()}/link-local?callback=${encodeURIComponent(callback)}&state=${encodeURIComponent(state)}`;
|
|
3881
4055
|
return { url };
|
|
3882
4056
|
}),
|
|
3883
|
-
/**
|
|
4057
|
+
/**
|
|
4058
|
+
* Whether this machine holds any cloud session, and against which cloud.
|
|
4059
|
+
*
|
|
4060
|
+
* `cloudUrl` n'a de sens qu'avec un seul compte : au-delà, il n'y a plus « le »
|
|
4061
|
+
* cloud du poste, et c'est `accounts` qu'il faut lire.
|
|
4062
|
+
*/
|
|
3884
4063
|
status: protectedProcedure.query(async () => {
|
|
3885
|
-
const
|
|
3886
|
-
return {
|
|
4064
|
+
const accounts = await cloudSessionStore.list();
|
|
4065
|
+
return {
|
|
4066
|
+
linked: accounts.length > 0,
|
|
4067
|
+
cloudUrl: accounts.length === 1 ? accounts[0].cloudUrl : null,
|
|
4068
|
+
accountCount: accounts.length
|
|
4069
|
+
};
|
|
4070
|
+
}),
|
|
4071
|
+
/**
|
|
4072
|
+
* Les comptes liés à ce poste, et l'organisation dont chacun répond.
|
|
4073
|
+
*
|
|
4074
|
+
* Aucun token n'en sort : de quoi peupler la page Compte et afficher, à côté
|
|
4075
|
+
* du projet ouvert, sous quel compte il se synchronise.
|
|
4076
|
+
*/
|
|
4077
|
+
accounts: protectedProcedure.query(async () => {
|
|
4078
|
+
const { readOrgAccounts } = await import("./vault-resolver-V7KH4FTC.js");
|
|
4079
|
+
return { accounts: await cloudSessionStore.list(), orgAccounts: await readOrgAccounts() };
|
|
3887
4080
|
}),
|
|
3888
4081
|
/** The cloud session (user + org), fetched with the stored token. */
|
|
3889
|
-
session: protectedProcedure.query(async () => {
|
|
3890
|
-
|
|
3891
|
-
|
|
4082
|
+
session: protectedProcedure.input(ScopeSchema.optional()).query(async ({ input }) => {
|
|
4083
|
+
const accountId = await scopedAccountId(input ?? {});
|
|
4084
|
+
if (!accountId || !await cloudSessionStore.isAccountLinked(accountId)) return null;
|
|
4085
|
+
const res = await cloudFetch2("/api/auth/get-session", { accountId });
|
|
3892
4086
|
if (!res.ok) {
|
|
3893
|
-
if (res.status === 401) await cloudSessionStore.
|
|
4087
|
+
if (res.status === 401) await cloudSessionStore.remove(accountId);
|
|
3894
4088
|
return null;
|
|
3895
4089
|
}
|
|
3896
|
-
|
|
4090
|
+
const payload = await res.json();
|
|
4091
|
+
const account = await cloudSessionStore.get(accountId);
|
|
4092
|
+
if (account && !account.userId) {
|
|
4093
|
+
const identity = await readCloudIdentity(account.cloudUrl, await cloudSessionStore.getToken(accountId) ?? "");
|
|
4094
|
+
if (identity) {
|
|
4095
|
+
const settled = await cloudSessionStore.describe(accountId, identity);
|
|
4096
|
+
const { renameOrgAccount } = await import("./vault-resolver-V7KH4FTC.js");
|
|
4097
|
+
await renameOrgAccount(accountId, settled);
|
|
4098
|
+
}
|
|
4099
|
+
}
|
|
4100
|
+
return payload;
|
|
3897
4101
|
}),
|
|
3898
4102
|
/**
|
|
3899
4103
|
* Every session of the cloud account: the machines linked to it and the
|
|
3900
4104
|
* browsers signed into it. No token material — the cloud only ever returns
|
|
3901
4105
|
* ids and labels here.
|
|
3902
4106
|
*/
|
|
3903
|
-
devices: protectedProcedure.query(async () => {
|
|
3904
|
-
|
|
3905
|
-
|
|
4107
|
+
devices: protectedProcedure.input(ScopeSchema.optional()).query(async ({ input }) => {
|
|
4108
|
+
const accountId = await scopedAccountId(input ?? {});
|
|
4109
|
+
if (!accountId || !await cloudSessionStore.isAccountLinked(accountId)) {
|
|
4110
|
+
return { devices: [] };
|
|
4111
|
+
}
|
|
4112
|
+
const res = await cloudFetch2("/api/auth/device/list", { accountId });
|
|
3906
4113
|
if (!res.ok) {
|
|
3907
|
-
if (res.status === 401) await cloudSessionStore.
|
|
4114
|
+
if (res.status === 401) await cloudSessionStore.remove(accountId);
|
|
3908
4115
|
return { devices: [] };
|
|
3909
4116
|
}
|
|
3910
4117
|
return await res.json();
|
|
@@ -3916,14 +4123,20 @@ var cloudAuthRouter = router({
|
|
|
3916
4123
|
* drops the session, and the local token is dropped here too, so nothing is
|
|
3917
4124
|
* left holding a dead credential.
|
|
3918
4125
|
*/
|
|
3919
|
-
revokeDevice: protectedProcedure.input(
|
|
3920
|
-
const
|
|
4126
|
+
revokeDevice: protectedProcedure.input(ScopeSchema.extend({ id: z4.string().min(1).max(128) })).mutation(async ({ input }) => {
|
|
4127
|
+
const accountId = await scopedAccountId(input);
|
|
4128
|
+
if (!accountId) throw new TRPCError3({ code: "PRECONDITION_FAILED", message: "No cloud account for this scope." });
|
|
4129
|
+
const res = await cloudFetch2("/api/auth/device/revoke", {
|
|
4130
|
+
method: "POST",
|
|
4131
|
+
body: { id: input.id },
|
|
4132
|
+
accountId
|
|
4133
|
+
});
|
|
3921
4134
|
if (!res.ok) {
|
|
3922
|
-
if (res.status === 401) await cloudSessionStore.
|
|
4135
|
+
if (res.status === 401) await cloudSessionStore.remove(accountId);
|
|
3923
4136
|
throw new TRPCError3({ code: "BAD_REQUEST", message: "Could not revoke this session." });
|
|
3924
4137
|
}
|
|
3925
4138
|
const { self } = await res.json();
|
|
3926
|
-
if (self) await cloudSessionStore.
|
|
4139
|
+
if (self) await cloudSessionStore.remove(accountId);
|
|
3927
4140
|
return { success: true, self: self === true };
|
|
3928
4141
|
}),
|
|
3929
4142
|
/**
|
|
@@ -3937,7 +4150,9 @@ var cloudAuthRouter = router({
|
|
|
3937
4150
|
path: z4.string().min(1).max(512),
|
|
3938
4151
|
method: z4.enum(["GET", "POST"]).default("GET"),
|
|
3939
4152
|
query: z4.record(z4.string().max(128), z4.string().max(2048)).optional(),
|
|
3940
|
-
body: z4.unknown().optional()
|
|
4153
|
+
body: z4.unknown().optional(),
|
|
4154
|
+
accountId: z4.string().max(64).optional(),
|
|
4155
|
+
orgId: z4.string().max(128).optional()
|
|
3941
4156
|
})
|
|
3942
4157
|
).mutation(async ({ input }) => {
|
|
3943
4158
|
if (!isAllowedProxyPath(input.path)) {
|
|
@@ -3946,7 +4161,8 @@ var cloudAuthRouter = router({
|
|
|
3946
4161
|
const qs = input.query ? `?${new URLSearchParams(input.query).toString()}` : "";
|
|
3947
4162
|
const res = await cloudFetch2(`/api/auth${input.path}${qs}`, {
|
|
3948
4163
|
method: input.method,
|
|
3949
|
-
...input.method === "POST" ? { body: input.body ?? {} } : {}
|
|
4164
|
+
...input.method === "POST" ? { body: input.body ?? {} } : {},
|
|
4165
|
+
...scopeOf(input)
|
|
3950
4166
|
});
|
|
3951
4167
|
const text = await res.text();
|
|
3952
4168
|
let data = null;
|
|
@@ -3965,14 +4181,19 @@ var cloudAuthRouter = router({
|
|
|
3965
4181
|
* browser's session — signing out here leaves the web app signed in, and vice
|
|
3966
4182
|
* versa.
|
|
3967
4183
|
*/
|
|
3968
|
-
signOut: protectedProcedure.mutation(async () => {
|
|
3969
|
-
|
|
4184
|
+
signOut: protectedProcedure.input(ScopeSchema.optional()).mutation(async ({ input }) => {
|
|
4185
|
+
const accountId = await scopedAccountId(input ?? {});
|
|
4186
|
+
if (!accountId) {
|
|
4187
|
+
if ((await cloudSessionStore.list()).length === 0) return { success: true };
|
|
4188
|
+
throw new TRPCError3({ code: "BAD_REQUEST", message: "Which account? Several are linked." });
|
|
4189
|
+
}
|
|
4190
|
+
if (await cloudSessionStore.isAccountLinked(accountId)) {
|
|
3970
4191
|
try {
|
|
3971
|
-
await cloudFetch2("/api/auth/sign-out", { method: "POST", body: {} });
|
|
4192
|
+
await cloudFetch2("/api/auth/sign-out", { method: "POST", body: {}, accountId });
|
|
3972
4193
|
} catch {
|
|
3973
4194
|
}
|
|
3974
4195
|
}
|
|
3975
|
-
await cloudSessionStore.
|
|
4196
|
+
await cloudSessionStore.remove(accountId);
|
|
3976
4197
|
return { success: true };
|
|
3977
4198
|
})
|
|
3978
4199
|
});
|
|
@@ -4012,12 +4233,57 @@ function must(res) {
|
|
|
4012
4233
|
}
|
|
4013
4234
|
return res.data;
|
|
4014
4235
|
}
|
|
4236
|
+
var boardAccounts = /* @__PURE__ */ new Map();
|
|
4237
|
+
async function accountOfOrg(orgId) {
|
|
4238
|
+
return await accountForOrg(orgId) ?? void 0;
|
|
4239
|
+
}
|
|
4240
|
+
function rememberBoardAccount(boardId, accountId) {
|
|
4241
|
+
if (accountId) boardAccounts.set(boardId, accountId);
|
|
4242
|
+
}
|
|
4243
|
+
async function accountOfBoard(boardId) {
|
|
4244
|
+
const memo = boardAccounts.get(boardId);
|
|
4245
|
+
if (memo) return memo;
|
|
4246
|
+
const accounts = await cloudSessionStore.list();
|
|
4247
|
+
if (accounts.length <= 1) return accounts[0]?.id;
|
|
4248
|
+
const owners = await Promise.all(accounts.map(async (account) => {
|
|
4249
|
+
const res = await callCloud(
|
|
4250
|
+
`/kanban/board/get?id=${encodeURIComponent(boardId)}`,
|
|
4251
|
+
{ accountId: account.id }
|
|
4252
|
+
);
|
|
4253
|
+
return res.ok && res.data?.board ? account.id : null;
|
|
4254
|
+
}));
|
|
4255
|
+
const owner = owners.find((id) => id !== null);
|
|
4256
|
+
if (owner) {
|
|
4257
|
+
boardAccounts.set(boardId, owner);
|
|
4258
|
+
return owner;
|
|
4259
|
+
}
|
|
4260
|
+
throw new KanbanUnavailableError(
|
|
4261
|
+
`Aucun des ${accounts.length} comptes li\xE9s \xE0 ce poste ne conna\xEEt le tableau ${boardId}.`
|
|
4262
|
+
);
|
|
4263
|
+
}
|
|
4264
|
+
async function scopeOfBoard(boardId) {
|
|
4265
|
+
const accountId = await accountOfBoard(boardId);
|
|
4266
|
+
return accountId ? { accountId } : {};
|
|
4267
|
+
}
|
|
4015
4268
|
async function resolveOrganizationId(explicit) {
|
|
4016
4269
|
if (explicit) return explicit;
|
|
4017
|
-
const
|
|
4270
|
+
const accounts = await cloudSessionStore.list();
|
|
4271
|
+
if (accounts.length > 1) {
|
|
4272
|
+
throw new KanbanUnavailableError(
|
|
4273
|
+
`Ce poste est li\xE9 \xE0 ${accounts.length} comptes cloud : pr\xE9cisez organizationId, sans quoi rien ne dit lequel interroger.`
|
|
4274
|
+
);
|
|
4275
|
+
}
|
|
4276
|
+
const accountId = accounts[0]?.id;
|
|
4277
|
+
const session = await callCloud(
|
|
4278
|
+
"/get-session",
|
|
4279
|
+
accountId ? { accountId } : {}
|
|
4280
|
+
);
|
|
4018
4281
|
const active = session.data?.session?.activeOrganizationId;
|
|
4019
4282
|
if (active) return active;
|
|
4020
|
-
const orgs = must(await callCloud(
|
|
4283
|
+
const orgs = must(await callCloud(
|
|
4284
|
+
"/organization/list",
|
|
4285
|
+
accountId ? { accountId } : {}
|
|
4286
|
+
));
|
|
4021
4287
|
if (orgs.length === 1) return orgs[0].id;
|
|
4022
4288
|
if (orgs.length === 0) {
|
|
4023
4289
|
throw new KanbanUnavailableError(
|
|
@@ -4039,7 +4305,12 @@ var KanbanStore = class {
|
|
|
4039
4305
|
async list(includeArchived = false, organizationId) {
|
|
4040
4306
|
const orgId = await resolveOrganizationId(organizationId);
|
|
4041
4307
|
const query = `?organizationId=${encodeURIComponent(orgId)}` + (includeArchived ? "&includeArchived=true" : "");
|
|
4042
|
-
const
|
|
4308
|
+
const accountId = await accountOfOrg(orgId);
|
|
4309
|
+
const res = must(await callCloud(
|
|
4310
|
+
`/kanban/board/list${query}`,
|
|
4311
|
+
accountId ? { accountId } : {}
|
|
4312
|
+
));
|
|
4313
|
+
for (const board of res.boards ?? []) rememberBoardAccount(board.id, accountId);
|
|
4043
4314
|
return { organizationId: orgId, boards: res.boards ?? [] };
|
|
4044
4315
|
}
|
|
4045
4316
|
/**
|
|
@@ -4050,13 +4321,18 @@ var KanbanStore = class {
|
|
|
4050
4321
|
*/
|
|
4051
4322
|
async get(id, opts = {}) {
|
|
4052
4323
|
const query = `?id=${encodeURIComponent(id)}${opts.withHistory ? "&withHistory=true" : ""}`;
|
|
4053
|
-
const
|
|
4324
|
+
const accountId = await accountOfBoard(id);
|
|
4325
|
+
const res = must(await callCloud(
|
|
4326
|
+
`/kanban/board/get${query}`,
|
|
4327
|
+
accountId ? { accountId } : {}
|
|
4328
|
+
));
|
|
4054
4329
|
return res.board ?? null;
|
|
4055
4330
|
}
|
|
4056
4331
|
/** Le journal d'une seule carte — ce que le contexte d'un agent demande. */
|
|
4057
4332
|
async cardHistory(boardId, cardId) {
|
|
4058
4333
|
const res = await callCloud(
|
|
4059
|
-
`/kanban/card/history?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}
|
|
4334
|
+
`/kanban/card/history?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}`,
|
|
4335
|
+
await scopeOfBoard(boardId)
|
|
4060
4336
|
);
|
|
4061
4337
|
return res.data?.history ?? [];
|
|
4062
4338
|
}
|
|
@@ -4070,7 +4346,8 @@ var KanbanStore = class {
|
|
|
4070
4346
|
async addComment(boardId, cardId, detail, conversationId) {
|
|
4071
4347
|
const res = await callCloud("/kanban/card/comment/add", {
|
|
4072
4348
|
method: "POST",
|
|
4073
|
-
body: { boardId, cardId, detail, author: "ai", ...conversationId ? { conversationId } : {} }
|
|
4349
|
+
body: { boardId, cardId, detail, author: "ai", ...conversationId ? { conversationId } : {} },
|
|
4350
|
+
...await scopeOfBoard(boardId)
|
|
4074
4351
|
});
|
|
4075
4352
|
return res.ok;
|
|
4076
4353
|
}
|
|
@@ -4078,7 +4355,8 @@ var KanbanStore = class {
|
|
|
4078
4355
|
async addCardEvent(boardId, cardId, type, detail) {
|
|
4079
4356
|
const res = await callCloud("/kanban/card/event/add", {
|
|
4080
4357
|
method: "POST",
|
|
4081
|
-
body: { boardId, cardId, type, detail }
|
|
4358
|
+
body: { boardId, cardId, type, detail },
|
|
4359
|
+
...await scopeOfBoard(boardId)
|
|
4082
4360
|
});
|
|
4083
4361
|
return res.ok;
|
|
4084
4362
|
}
|
|
@@ -4092,14 +4370,16 @@ var KanbanStore = class {
|
|
|
4092
4370
|
async addCard(boardId, input) {
|
|
4093
4371
|
const res = await callCloud("/kanban/card/add", {
|
|
4094
4372
|
method: "POST",
|
|
4095
|
-
body: { boardId, ...input }
|
|
4373
|
+
body: { boardId, ...input },
|
|
4374
|
+
...await scopeOfBoard(boardId)
|
|
4096
4375
|
});
|
|
4097
4376
|
return { card: res.data?.card ?? null, unsupported: res.status === 404 };
|
|
4098
4377
|
}
|
|
4099
4378
|
/** Une carte, par son identifiant — archivée comprise. */
|
|
4100
4379
|
async card(boardId, cardId) {
|
|
4101
4380
|
const res = await callCloud(
|
|
4102
|
-
`/kanban/card/get?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}
|
|
4381
|
+
`/kanban/card/get?boardId=${encodeURIComponent(boardId)}&cardId=${encodeURIComponent(cardId)}`,
|
|
4382
|
+
await scopeOfBoard(boardId)
|
|
4103
4383
|
);
|
|
4104
4384
|
return res.data ?? null;
|
|
4105
4385
|
}
|
|
@@ -4113,7 +4393,8 @@ var KanbanStore = class {
|
|
|
4113
4393
|
async updateCard(boardId, cardId, patch) {
|
|
4114
4394
|
const res = await callCloud("/kanban/card/update", {
|
|
4115
4395
|
method: "POST",
|
|
4116
|
-
body: { boardId, cardId, ...patch }
|
|
4396
|
+
body: { boardId, cardId, ...patch },
|
|
4397
|
+
...await scopeOfBoard(boardId)
|
|
4117
4398
|
});
|
|
4118
4399
|
return res.data?.card ?? null;
|
|
4119
4400
|
}
|
|
@@ -4121,7 +4402,8 @@ var KanbanStore = class {
|
|
|
4121
4402
|
async setCardArchived(boardId, cardId, archived) {
|
|
4122
4403
|
const res = await callCloud(`/kanban/card/${archived ? "archive" : "unarchive"}`, {
|
|
4123
4404
|
method: "POST",
|
|
4124
|
-
body: { boardId, cardId }
|
|
4405
|
+
body: { boardId, cardId },
|
|
4406
|
+
...await scopeOfBoard(boardId)
|
|
4125
4407
|
});
|
|
4126
4408
|
return res.ok;
|
|
4127
4409
|
}
|
|
@@ -4133,7 +4415,8 @@ var KanbanStore = class {
|
|
|
4133
4415
|
const orgId = await resolveOrganizationId(organizationId);
|
|
4134
4416
|
const res = must(
|
|
4135
4417
|
await callCloud(
|
|
4136
|
-
`/organization/get-full-organization?organizationId=${encodeURIComponent(orgId)}
|
|
4418
|
+
`/organization/get-full-organization?organizationId=${encodeURIComponent(orgId)}`,
|
|
4419
|
+
{ orgId }
|
|
4137
4420
|
)
|
|
4138
4421
|
);
|
|
4139
4422
|
return (res.members ?? []).map((m) => ({
|
|
@@ -4161,7 +4444,8 @@ var KanbanStore = class {
|
|
|
4161
4444
|
if (input.limit) query.set("limit", String(input.limit));
|
|
4162
4445
|
const res = must(
|
|
4163
4446
|
await callCloud(
|
|
4164
|
-
`/kanban/card/search?${query.toString()}
|
|
4447
|
+
`/kanban/card/search?${query.toString()}`,
|
|
4448
|
+
{ orgId }
|
|
4165
4449
|
)
|
|
4166
4450
|
);
|
|
4167
4451
|
return { cards: res.cards ?? [], total: res.total ?? 0, truncated: Boolean(res.truncated) };
|
|
@@ -4170,7 +4454,8 @@ var KanbanStore = class {
|
|
|
4170
4454
|
async moveCard(boardId, cardId, toColumnId) {
|
|
4171
4455
|
const res = await callCloud("/kanban/card/move", {
|
|
4172
4456
|
method: "POST",
|
|
4173
|
-
body: { boardId, cardId, toColumnId }
|
|
4457
|
+
body: { boardId, cardId, toColumnId },
|
|
4458
|
+
...await scopeOfBoard(boardId)
|
|
4174
4459
|
});
|
|
4175
4460
|
return res.ok;
|
|
4176
4461
|
}
|
|
@@ -4183,7 +4468,8 @@ var KanbanStore = class {
|
|
|
4183
4468
|
*/
|
|
4184
4469
|
async cardLinks(boardId) {
|
|
4185
4470
|
const res = await callCloud(
|
|
4186
|
-
`/kanban/card-link/list?boardId=${encodeURIComponent(boardId)}
|
|
4471
|
+
`/kanban/card-link/list?boardId=${encodeURIComponent(boardId)}`,
|
|
4472
|
+
await scopeOfBoard(boardId)
|
|
4187
4473
|
);
|
|
4188
4474
|
return { links: res.data?.links ?? [], cards: res.data?.cards ?? [] };
|
|
4189
4475
|
}
|
|
@@ -4201,7 +4487,8 @@ var KanbanStore = class {
|
|
|
4201
4487
|
cardId,
|
|
4202
4488
|
parentBoardId: parent?.boardId ?? null,
|
|
4203
4489
|
parentCardId: parent?.cardId ?? null
|
|
4204
|
-
}
|
|
4490
|
+
},
|
|
4491
|
+
...await scopeOfBoard(boardId)
|
|
4205
4492
|
});
|
|
4206
4493
|
return res.ok;
|
|
4207
4494
|
}
|
|
@@ -4210,6 +4497,7 @@ var KanbanStore = class {
|
|
|
4210
4497
|
if (!organizationId) return null;
|
|
4211
4498
|
const res = await callCloud("/kanban/board/create", {
|
|
4212
4499
|
method: "POST",
|
|
4500
|
+
orgId: organizationId,
|
|
4213
4501
|
body: {
|
|
4214
4502
|
organizationId,
|
|
4215
4503
|
name: input.name,
|
|
@@ -4222,14 +4510,16 @@ var KanbanStore = class {
|
|
|
4222
4510
|
async update(input) {
|
|
4223
4511
|
const res = await callCloud("/kanban/board/update", {
|
|
4224
4512
|
method: "POST",
|
|
4225
|
-
body: input
|
|
4513
|
+
body: input,
|
|
4514
|
+
...await scopeOfBoard(input.id)
|
|
4226
4515
|
});
|
|
4227
4516
|
return res.data?.board ?? null;
|
|
4228
4517
|
}
|
|
4229
4518
|
async delete(id) {
|
|
4230
4519
|
const res = await callCloud("/kanban/board/delete", {
|
|
4231
4520
|
method: "POST",
|
|
4232
|
-
body: { id }
|
|
4521
|
+
body: { id },
|
|
4522
|
+
...await scopeOfBoard(id)
|
|
4233
4523
|
});
|
|
4234
4524
|
return res.data?.success ?? false;
|
|
4235
4525
|
}
|
|
@@ -4649,7 +4939,7 @@ function tailTranscript(opts) {
|
|
|
4649
4939
|
|
|
4650
4940
|
// ../server/src/services/ai-runners/claude-pty-runner.ts
|
|
4651
4941
|
async function getAgentManager() {
|
|
4652
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
4942
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-2RWV2SXZ.js");
|
|
4653
4943
|
return agentManager2;
|
|
4654
4944
|
}
|
|
4655
4945
|
function buildPtyArgs(params, sessionId, opts) {
|
|
@@ -5341,7 +5631,7 @@ async function shutdownCodexAppServer() {
|
|
|
5341
5631
|
}
|
|
5342
5632
|
}
|
|
5343
5633
|
async function getAgentManager2() {
|
|
5344
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
5634
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-2RWV2SXZ.js");
|
|
5345
5635
|
return agentManager2;
|
|
5346
5636
|
}
|
|
5347
5637
|
function parseRuneyaCurlCommand(command) {
|
|
@@ -7289,7 +7579,9 @@ export {
|
|
|
7289
7579
|
cloudSessionStore,
|
|
7290
7580
|
getCloudApiUrl,
|
|
7291
7581
|
orgCloudUrl,
|
|
7582
|
+
accountForOrg,
|
|
7292
7583
|
cloudFetch,
|
|
7584
|
+
readCloudIdentity,
|
|
7293
7585
|
environmentOverridesStore,
|
|
7294
7586
|
environmentResolver,
|
|
7295
7587
|
auditService,
|
|
@@ -7336,4 +7628,4 @@ export {
|
|
|
7336
7628
|
startCliSession,
|
|
7337
7629
|
chatRouter
|
|
7338
7630
|
};
|
|
7339
|
-
//# sourceMappingURL=chunk-
|
|
7631
|
+
//# sourceMappingURL=chunk-JNI4CXJ7.js.map
|