@runeya/runeya 2.0.138 → 2.0.139
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/index.js +12 -0
- package/agent/index.js.map +1 -1
- package/agent-manager-NAGIMH2T.js +11 -0
- package/chat-Q2UMYXQL.js +21 -0
- package/{chunk-ZFELQG4B.js → chunk-EV3TBM7E.js} +78 -5
- package/chunk-EV3TBM7E.js.map +1 -0
- package/{chunk-C6LIGJFX.js → chunk-GLIU3J47.js} +354 -128
- package/chunk-GLIU3J47.js.map +1 -0
- package/{chunk-BDQOBEZ3.js → chunk-GOMF7NWS.js} +2 -2
- package/{desktop-launcher-3COY6F6H.js → chunk-GWQV5KKU.js} +193 -13
- package/chunk-GWQV5KKU.js.map +1 -0
- package/{chunk-5EMEJNVU.js → chunk-LE6XQ3OV.js} +13 -1
- package/chunk-LE6XQ3OV.js.map +1 -0
- package/{chunk-ALWA4K5L.js → chunk-MSICJEZD.js} +4 -4
- package/{chunk-GUIONCNA.js → chunk-WNCXZ6E7.js} +164 -124
- package/chunk-WNCXZ6E7.js.map +1 -0
- package/{chunk-I7JHF5FE.js → chunk-XHGJHYDC.js} +4 -4
- package/chunk-YSYLL57J.js +87 -0
- package/chunk-YSYLL57J.js.map +1 -0
- package/{companion-JYLQKSFO.js → companion-MGX62L4T.js} +8 -6
- package/desktop-installer-page-OJTOKP7V.js +598 -0
- package/desktop-installer-page-OJTOKP7V.js.map +1 -0
- package/desktop-launcher-HKXP4LRI.js +43 -0
- package/desktop-wizard-XIDDAG7L.js +15 -0
- package/index.js +29 -20
- package/index.js.map +1 -1
- package/mcp-server/index.js +49 -1
- package/mcp-server/index.js.map +1 -1
- package/package.json +1 -1
- package/settings-manager-BBNCDDQJ.js +10 -0
- package/settings-manager-BBNCDDQJ.js.map +1 -0
- package/{src-42DMJB3D.js → src-KWLVQD36.js} +191 -90
- package/src-KWLVQD36.js.map +1 -0
- package/{vault-resolver-57Q2DVOR.js → vault-resolver-B5P2OUI5.js} +20 -2
- package/vault-resolver-B5P2OUI5.js.map +1 -0
- package/web/assets/AgentScalarChatInterface.vue-CqGVVIo8.js +13 -0
- package/web/assets/AgentTerminalPage-mVD1jsWC.js +1 -0
- package/web/assets/AiChatPage-J-JAXhoT.js +1 -0
- package/web/assets/AppLayout-6eKmu_TP.css +1 -0
- package/web/assets/AppLayout-CsUnvWA0.js +1 -0
- package/web/assets/AuditPage-gzMJbY4c.js +1 -0
- package/web/assets/CloudAccountPage-CIUmdyoI.js +1 -0
- package/web/assets/CloudAccountPage-Cm1ibhZY.js +1 -0
- package/web/assets/CloudAccountPage-eoNciq1Q.css +1 -0
- package/web/assets/CloudMessagingPage-EV4MwYrk.js +2 -0
- package/web/assets/DashboardPage-CrMccWRA.js +1 -0
- package/web/assets/DirectoryPickerDialog-Cnr4SkLc.js +1 -0
- package/web/assets/DirectoryPickerDialog-D1lQ83i5.css +1 -0
- package/web/assets/{EditorIcon-DXYoMZnL.js → EditorIcon-Dlr9ami0.js} +2 -2
- package/web/assets/{EnvironmentForm-D3pZuxVn.js → EnvironmentForm-NiG4dzT9.js} +2 -2
- package/web/assets/EnvironmentFormPage-TJzOWwS7.js +1 -0
- package/web/assets/EnvironmentListPage-oR335kl1.js +1 -0
- package/web/assets/KanbanBoardPage-Cta-iCIL.css +1 -0
- package/web/assets/KanbanBoardPage-Dol6K6rI.js +4 -0
- package/web/assets/KanbanListPage-C2yhMB2L.js +1 -0
- package/web/assets/{KanbanListPage-DxJFx6A6.css → KanbanListPage-CEJ9Vluh.css} +1 -1
- package/web/assets/LaunchProjectPage-BGIRMKdM.js +1 -0
- package/web/assets/LaunchProjectPage-CU2iF25_.css +1 -0
- package/web/assets/LaunchServicesPage-9aAno4Gc.css +1 -0
- package/web/assets/LaunchServicesPage-DqIG8ZDk.js +1 -0
- package/web/assets/LaunchShell-C7RrqA4k.js +1 -0
- package/web/assets/LaunchShell-CGtjrl6_.css +1 -0
- package/web/assets/LogViewer-BWtCyqa4.js +3 -0
- package/web/assets/OrgKeyPrompt-B343sYVi.css +1 -0
- package/web/assets/OrgKeyPrompt-IjlZPHOI.js +1 -0
- package/web/assets/OrgLogo-B0TayK5W.js +1 -0
- package/web/assets/ProcessControls-Bw28Duzs.js +1 -0
- package/web/assets/ProcessDetailPage-CVYQJ4aI.js +1 -0
- package/web/assets/{ProcessMetrics-CdQc_8Z0.js → ProcessMetrics-D0HzDnGO.js} +3 -3
- package/web/assets/ProjectCreateDialog-CLFPf8ds.js +1 -0
- package/web/assets/ProjectCreateDialog-UEIYMerY.css +1 -0
- package/web/assets/ProjectLocationGate-D68jdBcV.js +1 -0
- package/web/assets/ProjectPublishDialog-CDpS6xcQ.css +1 -0
- package/web/assets/ProjectPublishDialog-Cvvjeuyq.js +1 -0
- package/web/assets/RandomJobTestPage-CuUJfwwb.js +2 -0
- package/web/assets/ScenarioEditorPage-Ckq6XNl2.js +14 -0
- package/web/assets/SendToChatDialog-4a4_2amD.js +1 -0
- package/web/assets/ServiceControlsBar-OC7cDCM7.js +1 -0
- package/web/assets/ServiceDetailPage-BMlS1q4i.js +2 -0
- package/web/assets/ServiceFormPage-CozmJNy1.js +1 -0
- package/web/assets/{SettingsPage-DA7lVKfg.css → SettingsPage-CF548HPl.css} +1 -1
- package/web/assets/SettingsPage-CkJQwWCW.js +2063 -0
- package/web/assets/UnlockPage-94m6Ap-H.js +1 -0
- package/web/assets/VaultMigrationPage-Bj6KgIUi.js +1 -0
- package/web/assets/VersionBadge-DjTAz-tn.js +1 -0
- package/web/assets/WikiPage-n_vxXevo.js +1 -0
- package/web/assets/WikiView-lxEITfCa.js +1 -0
- package/web/assets/add-scalar-classes-lFkCrmFv.js +387 -0
- package/web/assets/{autocomplete-DobAPPYJ.js → autocomplete-bClqtFV-.js} +3 -3
- package/web/assets/{basic-shape-diamond.svg-FbeAPLc-.js → basic-shape-diamond.svg-DFdUK3gN.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-CtwcdpTe.js → basic-shape-hexagon.svg-BKiT9xxU.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-DsSs3S2_.js → basic-shape-primary-circle-ellipse-round.svg-tmXcRxRQ.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-CNe1RNx8.js → basic-shape-primary-square-rectangle.svg-C9duFSNc.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-DwZMLfah.js → basic-shape-shield.svg-CLzO94DF.js} +1 -1
- package/web/assets/{browser-Dz1gvldT.js → browser-BEDlGGfe.js} +1 -1
- package/web/assets/{browser-DsZ9HxVm.js → browser-CivlztYP.js} +1 -1
- package/web/assets/card-wcTFC8yG.js +32 -0
- package/web/assets/{checkbox-DPknldTJ.js → checkbox-TtO_mmrY.js} +2 -2
- package/web/assets/{chevronup-D2Lr2GiV.js → chevronup-Cd93cHVj.js} +4 -4
- package/web/assets/{chip-Caiakd-N.js → chip-omKmLLWH.js} +2 -2
- package/web/assets/client-BKIls6aD.js +24 -0
- package/web/assets/cloud-chat.store-Bskr_EXO.js +1 -0
- package/web/assets/cloud-client-rcfqjfUK.js +1 -0
- package/web/assets/cloud-session-CycNU7YV.js +1 -0
- package/web/assets/cloud-session-DiaAeCJI.js +2 -0
- package/web/assets/column-DgtEciO-.js +763 -0
- package/web/assets/composables-Ce8WccBy.js +1 -0
- package/web/assets/{computer-device-desktop-monitor.svg-CwiGN14T.js → computer-device-desktop-monitor.svg-D3YaocxY.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-BC2VdXDZ.js → computer-device-desktop.svg-lnn_cyCx.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-BOp8AKN6.js → computer-device-laptop.svg-9f5_Ipnq.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-CmbpPX1u.js → computer-device-mobile-phone-android-samsung-back.svg-DxHwZI5u.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-_WGKWVtZ.js → computer-device-mobile-phone-android-samsung.svg-CnYqoXt4.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-DmLh97KG.js → computer-device-mobile-phone-iphone-x-back.svg-D8JfsF_0.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-C7-5mdyV.js → computer-device-mobile-phone-iphone-x.svg-CUbRWc7v.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-DiUaSnhU.js → computer-device-mobile-tablet-touch.svg-CBX2kbI1.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-B6nfbYm_.js → computer-device-mobile-tablet.svg-CIn05KEg.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-DwtVKy79.js → computer-device-network-ethernet-cat6.svg-Dj0GRqXd.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-vQKfG3Xz.js → computer-device-network-lan-www.svg-D-G7js6t.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-DhHaOUge.js → computer-device-network-wifi-connection.svg-JnvMwBMA.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-1dQS4k4J.js → computer-device-network-wifi-router.svg--XxSrk_J.js} +1 -1
- package/web/assets/{cssMode-CdQL22W5.js → cssMode-C3gHbz_w.js} +1 -1
- package/web/assets/{divider-DhYR4BAO.js → divider-eMI33mv1.js} +2 -2
- package/web/assets/{docx-preview-D-jP_CCs.js → docx-preview-CTkzTOcl.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-D76wQVA2.js → ecology-science-erlenmeyer-flask.svg-DrHKX7bH.js} +1 -1
- package/web/assets/{fieldset-BtOjs_Hh.js → fieldset-CiIJH8Xe.js} +2 -2
- package/web/assets/{freemarker2-BADW9vhy.js → freemarker2-DWxB7Wcd.js} +1 -1
- package/web/assets/{handlebars-CwWQD_C8.js → handlebars-CWUdFsNH.js} +1 -1
- package/web/assets/{html-y87CEbe3.js → html-DhvF7iHg.js} +1 -1
- package/web/assets/{htmlMode-CVagtvVh.js → htmlMode-CIuDa6YW.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-OvpKi3a3.js → image-flash-lightning.svg-qFK_1eYx.js} +1 -1
- package/web/assets/{image-picture-flower.svg-DLOePozT.js → image-picture-flower.svg-qAmkHnOu.js} +1 -1
- package/web/assets/{index-CcIrffU_.js → index-CzSAFmCu.js} +363 -363
- package/web/assets/index-D0IPNhsg.css +1 -0
- package/web/assets/{interface-alert-exclamation-diamond.svg-4Vk7SoQ1.js → interface-alert-exclamation-diamond.svg-Dugh0ymo.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-BLAvc4am.js → interface-alert-exclamation-triangle-warning.svg-8neoRFVP.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-CaAXpDAI.js → interface-alert-information-circle.svg-DM9S7DBv.js} +1 -1
- package/web/assets/{interface-award-crown.svg-CW7XG0wx.js → interface-award-crown.svg--68HCcUG.js} +1 -1
- package/web/assets/{interface-bookmark.svg-BpLEuOv2.js → interface-bookmark-tag.svg-BESGrlZw.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-DPWVVeZU.js → interface-bookmark.svg-CVadIwuA.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-DbBgvI4W.js → interface-calendar-date-one.svg-D9XP9Dv_.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-BbsuvPZM.js → interface-content-book-open-pages.svg-DMI3yFmk.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-DbRPz1j8.js → interface-content-book-page.svg-BPxSHq3g.js} +1 -1
- package/web/assets/{interface-content-file.svg-OJPKABxS.js → interface-content-file.svg-D0Mbjb8x.js} +1 -1
- package/web/assets/interface-content-folder.svg-D3wbwhAD.js +1 -0
- package/web/assets/{interface-content-folder.svg-3D_5OE_-.js → interface-content-folder.svg-EUO1l7Mn.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-DqthVh9J.js → interface-copy-clipboard.svg-DI-wp72J.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-BAPCnZ0B.js → interface-edit-attachment.svg-CrWbaWn_.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-BoV39ouF.js → interface-edit-binocular.svg-BzUDq1Il.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-Cz36nKVn.js → interface-edit-magic-wand.svg-DaAdEL5x.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-DZUQotD5.js → interface-edit-tool-paint-roller.svg-C972BXSM.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-DBf1Y9Tj.js → interface-edit-tool-pencil.svg-47QCYH9f.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-B93sRjxf.js → interface-favorite-award.svg-DROP-rzN.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-DKHuT11J.js → interface-favorite-flag.svg-B1gpMdkg.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-Bw5FZQ7d.js → interface-favorite-heart.svg-Dc0MMGJl.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-CgLbct_b.js → interface-favorite-star.svg-D6A5KWft.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-B7cYS4ef.js → interface-favorite-stars-sparkles.svg-CpEr4y41.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-zwuaRdWq.js → interface-hierarchy-flowchart.svg-DjvgRFcZ.js} +1 -1
- package/web/assets/{interface-home-house.svg-B85yMFCe.js → interface-home-house.svg-BMmVKlSc.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-US6b-Svn.js → interface-hyperlink.svg-BewFXeyZ.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-mZWkhb7f.js → interface-lighting-brightness.svg-B74_Fwt9.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-9oHuNwuY.js → interface-lock-closed.svg-B_kTyHSd.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-DBetdJny.js → interface-lock-open-unlock.svg-BpmOnQWL.js} +1 -1
- package/web/assets/{interface-login-key.svg-BZnZTYd1.js → interface-login-key.svg-CjYpI4bh.js} +1 -1
- package/web/assets/{interface-search.svg-CMXAOoam.js → interface-search.svg-FJmFWdB4.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-CKckatt7.js → interface-setting-cog.svg-CfzSne-G.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-DH7kVqN-.js → interface-share-megaphone-bullhorn.svg-CIIzDsMB.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-BNXcMugi.js → interface-share-rocket.svg-DqTBI7lO.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-Bb8t607w.js → interface-share-satellite.svg-nJfwIxpE.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-Dk4rbLtF.js → interface-share-space-ship.svg-hSmFC9Bt.js} +1 -1
- package/web/assets/{interface-share.svg-CtX8dq5i.js → interface-share.svg-DW5W5LS6.js} +1 -1
- package/web/assets/{interface-signal-square.svg-DmUIlYTd.js → interface-signal-square.svg-CxjWE1n9.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-D2ZNaXT3.js → interface-time-clock-circle.svg-OliTsm3U.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-Ddo-8hHe.js → interface-time-hour-glass.svg-Cq5G77ft.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-Jh7S0sT4.js → interface-users-multiple.svg-BZxMlLou.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-DbdQFgL2.js → interface-weather-moon.svg-lFXrwEyz.js} +1 -1
- package/web/assets/{javascript-BVGFyXBk.js → javascript-BVZ1omk1.js} +1 -1
- package/web/assets/{jsonMode-vnFlxYl9.js → jsonMode-CiBARvaV.js} +2 -2
- package/web/assets/{liquid-DieKMEvN.js → liquid-CUYREU3G.js} +1 -1
- package/web/assets/{lspLanguageFeatures-DoeI-8Y7.js → lspLanguageFeatures-BCfkeNgB.js} +3 -3
- package/web/assets/{mail-chat-bubble-square.svg-CApdU2ea.js → mail-chat-bubble-square.svg-DbOh-u2f.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-jjZ0KB32.js → mail-send-email-paper-airplane.svg-Ci3654Ap.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-B6Tsoh-8.js → mail-send-envelope.svg-BUCSUoVb.js} +1 -1
- package/web/assets/{mdx-BCkszXid.js → mdx-GNBOgT3C.js} +1 -1
- package/web/assets/{minus-DfLQX3s2.js → minus-qBqqwoxz.js} +2 -2
- package/web/assets/modal-CsKPvO45.js +5 -0
- package/web/assets/modal-E9FRG--u.js +1 -0
- package/web/assets/{money-cashier-receipt.svg-DM-I8Snr.js → money-cashier-receipt.svg-qOZhZZs2.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-CkDRewrV.js → money-currency-dollar-pay.svg-WYlopKIm.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-BT4KLHWz.js → money-graph-arrow-increase.svg-DAcyYWIw.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-EvyIJ3Uu.js → money-graph-bar-chart-increase.svg-Bcjxz1Kd.js} +1 -1
- package/web/assets/multiselect-DiGSzibm.js +251 -0
- package/web/assets/{nature-ecology-leaf.svg-uZBwXdg9.js → nature-ecology-leaf.svg-d0AKmyxH.js} +1 -1
- package/web/assets/{password-D1R5w1qL.js → password-BwMjgK0Q.js} +4 -4
- package/web/assets/{phone-telephone.svg-BSvOskIB.js → phone-telephone.svg-BzKK2wbN.js} +1 -1
- package/web/assets/{plus-CNGSRnxy.js → plus-D6Rlmwbp.js} +6 -6
- package/web/assets/process.store-I5VZVT0x.js +1 -0
- package/web/assets/{programming-bug.svg-CLnGs4K-.js → programming-bug.svg-BtSROvd5.js} +1 -1
- package/web/assets/{programming-cloud.svg-CxBovXBR.js → programming-cloud.svg-YDPFJdYt.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-C1JmOyio.js → programming-computer-database-server.svg-C_7cgE9Q.js} +1 -1
- package/web/assets/{programming-computer-database.svg-BRjyOzP4.js → programming-computer-database.svg-CLw76mik.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-Blwzw6Qz.js → programming-module-four-layout.svg-BsoC5ySI.js} +1 -1
- package/web/assets/{programming-module-three.svg-6bkrmWsU.js → programming-module-three.svg-CThoMoAk.js} +1 -1
- package/web/assets/{programming-module.svg-CBS9xKxX.js → programming-module.svg-BQ1YjjAj.js} +1 -1
- package/web/assets/{programming-script-code.svg-BVhyoAD3.js → programming-script-code.svg-BKT_wilO.js} +1 -1
- package/web/assets/project-launch.store-CBnJKGQe.js +1 -0
- package/web/assets/project.store-JIcOcKSg.js +1 -0
- package/web/assets/{python-CiPYtj_d.js → python-BXwGt-Ip.js} +1 -1
- package/web/assets/{radiobutton--KWBHcDP.js → radiobutton-D20sH1UN.js} +3 -3
- package/web/assets/{razor-CSoWGP30.js → razor-RXambmP2.js} +1 -1
- package/web/assets/router-BXj_oCbf.js +1 -0
- package/web/assets/{selectbutton-C0NL5n4w.js → selectbutton-rLcf19Xf.js} +4 -4
- package/web/assets/settings-scope-Cy_9OGE1.js +1 -0
- package/web/assets/settings.store-DrKeFdgW.js +1 -0
- package/web/assets/{shopping-cart.svg-C-8NG_Po.js → shopping-cart.svg-EjTn3XQF.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-Bp6q5VzJ.js → shopping-gift-present.svg-AQNlzazh.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-DeWaEIwm.js → shopping-shipping-box-parcel-package.svg-VB9n6UNi.js} +1 -1
- package/web/assets/src-ByEHJyfr.js +1 -0
- package/web/assets/{src-BHR3l7pa.js → src-CUwD1xPP.js} +35 -35
- package/web/assets/src-C_auNJtg.css +1 -0
- package/web/assets/{tag-new-circle.svg-CTljXsqE.js → tag-new-circle.svg-BllOd5JW.js} +1 -1
- package/web/assets/theme-DuAHBQRP.js +1 -0
- package/web/assets/{toggleswitch-d41l5g27.js → toggleswitch-C-88_GnB.js} +2 -2
- package/web/assets/{travel-map-earth-globe.svg-BUkcntCp.js → travel-map-earth-globe.svg-ChLDmmU9.js} +1 -1
- package/web/assets/trpc-BoKwANhj.js +1 -0
- package/web/assets/{tsMode-B2c-rCAa.js → tsMode-CIN3QIw8.js} +6 -6
- package/web/assets/{typescript-CmW4u_GQ.js → typescript-wXu_7Eym.js} +1 -1
- package/web/assets/useAiChatDrawer-Bs1Gxhn2.js +1 -0
- package/web/assets/{useCloudOrg-E4l-99WA.js → useCloudOrg-0AZ58M3V.js} +1 -1
- package/web/assets/useEnvVarAutocomplete-BXC_JUF7.js +102 -0
- package/web/assets/{useEnvVarAutocomplete-DsxEF6Ya.css → useEnvVarAutocomplete-dxAmKsn7.css} +1 -1
- package/web/assets/useProjectCloudOrg-UIfVePy9.js +1 -0
- package/web/assets/useServiceUrlHost-BXbIxPaT.js +1 -0
- package/web/assets/{xml-BxMqu3hT.js → xml-FTYGqn2R.js} +1 -1
- package/web/assets/{yaml-Djx7E3R1.js → yaml-DQEEK2dU.js} +1 -1
- package/web/index.html +2 -2
- package/agent-manager-2AZVCQRI.js +0 -11
- package/chat-SWYI4ENT.js +0 -21
- package/chunk-5EMEJNVU.js.map +0 -1
- package/chunk-C6LIGJFX.js.map +0 -1
- package/chunk-GUIONCNA.js.map +0 -1
- package/chunk-ZFELQG4B.js.map +0 -1
- package/desktop-launcher-3COY6F6H.js.map +0 -1
- package/desktop-wizard-4CYANX2O.js +0 -209
- package/desktop-wizard-4CYANX2O.js.map +0 -1
- package/settings-manager-J4QBIU3T.js +0 -10
- package/src-42DMJB3D.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-BGGkpyp3.js +0 -13
- package/web/assets/AgentTerminalPage-B8gLray2.js +0 -1
- package/web/assets/AiChatPage-BKITsyMx.js +0 -1
- package/web/assets/AppLayout-B72S4nTi.css +0 -1
- package/web/assets/AppLayout-BYw7v2sp.js +0 -1
- package/web/assets/AuditPage-nHTwzyia.js +0 -1
- package/web/assets/CloudAccountPage-DYOvfMjD.css +0 -1
- package/web/assets/CloudAccountPage-DuaZz2j4.js +0 -1
- package/web/assets/CloudAccountPage-XHxI-ixD.js +0 -1
- package/web/assets/CloudMessagingPage-B2N5K-Xs.js +0 -2
- package/web/assets/DashboardPage-VoWJeWh_.js +0 -1
- package/web/assets/DirectoryPickerDialog-B5SuJOhv.js +0 -1
- package/web/assets/DirectoryPickerDialog-Ctp1lYoS.css +0 -1
- package/web/assets/EnvironmentFormPage-BIXbPTN5.js +0 -1
- package/web/assets/EnvironmentListPage-CHa-Ni3w.js +0 -1
- package/web/assets/KanbanBoardPage-B46zbE2H.css +0 -1
- package/web/assets/KanbanBoardPage-BFTNpm8P.js +0 -4
- package/web/assets/KanbanListPage-CYuIrKXH.js +0 -1
- package/web/assets/LaunchProjectPage-9hhGBdOh.css +0 -1
- package/web/assets/LaunchProjectPage-jy-R3Fiw.js +0 -1
- package/web/assets/LaunchServicesPage-BMtm_8yP.css +0 -1
- package/web/assets/LaunchServicesPage-DX7nyo36.js +0 -1
- package/web/assets/LaunchShell-BHfseuPM.js +0 -1
- package/web/assets/LaunchShell-HenrOlHV.css +0 -1
- package/web/assets/LogViewer-C-pHXudR.js +0 -3
- package/web/assets/OrgKeyPrompt-CrHXZdKL.css +0 -1
- package/web/assets/OrgKeyPrompt-OPnK5oPm.js +0 -1
- package/web/assets/OrgLogo-Cxa49Tl3.js +0 -1
- package/web/assets/ProcessControls-DXDyR6XX.js +0 -1
- package/web/assets/ProcessDetailPage-DNKTwgPW.js +0 -1
- package/web/assets/RandomJobTestPage-BE8HkgSb.js +0 -2
- package/web/assets/ScenarioEditorPage-Coo6ExzZ.js +0 -14
- package/web/assets/SendToChatDialog-ClXerpCU.js +0 -1
- package/web/assets/ServiceControlsBar-C7HrPjQI.js +0 -1
- package/web/assets/ServiceDetailPage-Cxuy0Yix.js +0 -2
- package/web/assets/ServiceFormPage-CCOu1h8v.js +0 -1
- package/web/assets/SettingsPage-Dt1ViDQe.js +0 -2063
- package/web/assets/UnlockPage-C5iEOAKH.js +0 -1
- package/web/assets/VaultMigrationPage-CwRWvFY7.js +0 -1
- package/web/assets/VersionBadge-Bqb72GXf.js +0 -1
- package/web/assets/WikiPage-Bl1jDKKp.js +0 -1
- package/web/assets/WikiView-58u6vU3q.js +0 -1
- package/web/assets/add-scalar-classes-CT5KQbzH.js +0 -387
- package/web/assets/card-46tM5yU0.js +0 -32
- package/web/assets/client-KL5c1Dog.js +0 -24
- package/web/assets/cloud-chat.store-Belo5SKd.js +0 -1
- package/web/assets/cloud-client-Cqa2Udt8.js +0 -1
- package/web/assets/cloud-session-56bUtkSL.js +0 -2
- package/web/assets/cloud-session-Dqm0C6H5.js +0 -1
- package/web/assets/column-DQ53_qc6.js +0 -763
- package/web/assets/composables-CHyZa9ag.js +0 -1
- package/web/assets/index-CKOtBNaZ.css +0 -1
- package/web/assets/interface-content-folder.svg-8mYqkDao.js +0 -1
- package/web/assets/modal-CCco27Sn.js +0 -5
- package/web/assets/modal-D4J85_wC.js +0 -1
- package/web/assets/multiselect-BmjidXlj.js +0 -251
- package/web/assets/process.store-p1LqnpY2.js +0 -1
- package/web/assets/project-launch.store-BBYtCcv8.js +0 -1
- package/web/assets/project.store-D_2v7amt.js +0 -1
- package/web/assets/router-CRKT3825.js +0 -1
- package/web/assets/settings-scope-DblmUa3N.js +0 -1
- package/web/assets/settings.store-DKTQyerJ.js +0 -1
- package/web/assets/src-BN5gTC76.css +0 -1
- package/web/assets/src-BRLkogf3.js +0 -1
- package/web/assets/theme-BZzt_Sgl.js +0 -1
- package/web/assets/trpc-Db0Atu8A.js +0 -1
- package/web/assets/useAiChatDrawer-0QJJVXul.js +0 -1
- package/web/assets/useEnvVarAutocomplete-BDqUWoGr.js +0 -102
- package/web/assets/useProjectCatalog-Cxt-hL1H.js +0 -1
- package/web/assets/useProjectCloudOrg-CwLTQLIO.js +0 -1
- package/web/assets/useServiceUrlHost-VIA3uP5-.js +0 -1
- /package/{agent-manager-2AZVCQRI.js.map → agent-manager-NAGIMH2T.js.map} +0 -0
- /package/{chat-SWYI4ENT.js.map → chat-Q2UMYXQL.js.map} +0 -0
- /package/{chunk-BDQOBEZ3.js.map → chunk-GOMF7NWS.js.map} +0 -0
- /package/{chunk-ALWA4K5L.js.map → chunk-MSICJEZD.js.map} +0 -0
- /package/{chunk-I7JHF5FE.js.map → chunk-XHGJHYDC.js.map} +0 -0
- /package/{companion-JYLQKSFO.js.map → companion-MGX62L4T.js.map} +0 -0
- /package/{settings-manager-J4QBIU3T.js.map → desktop-launcher-HKXP4LRI.js.map} +0 -0
- /package/{vault-resolver-57Q2DVOR.js.map → desktop-wizard-XIDDAG7L.js.map} +0 -0
- /package/web/assets/{abap-BwLGULgU.js → abap-CRsXUZTC.js} +0 -0
- /package/web/assets/{apex-BmwhxS2n.js → apex-CN6ZSzwM.js} +0 -0
- /package/web/assets/{azcli-7RvE_Zal.js → azcli-ULFzG1xV.js} +0 -0
- /package/web/assets/{bat-DRPmS6Na.js → bat-BVH8lwB4.js} +0 -0
- /package/web/assets/{bicep-BwfkS7ZV.js → bicep-B8jMqZ8i.js} +0 -0
- /package/web/assets/{browser-D3d3061H.js → browser-xa0YgePN.js} +0 -0
- /package/web/assets/{cameligo-BJ_mdC8E.js → cameligo-DuuRwBiE.js} +0 -0
- /package/web/assets/{clojure-CQKq7DWt.js → clojure-DUpiEmPZ.js} +0 -0
- /package/web/assets/{coffee-DJRj2iwd.js → coffee-BO4ou798.js} +0 -0
- /package/web/assets/{cpp-BC1yJTUW.js → cpp-CHOtY2DW.js} +0 -0
- /package/web/assets/{csharp-D6U2fAAT.js → csharp-D3t5O1XD.js} +0 -0
- /package/web/assets/{csp-B2Ue_UmV.js → csp-CJpJWgPE.js} +0 -0
- /package/web/assets/{css-CEzlcbMY.js → css-CAeYpQS5.js} +0 -0
- /package/web/assets/{cypher-D5Sg38Yj.js → cypher-D9-TC6ep.js} +0 -0
- /package/web/assets/{dart-BhjKRv6v.js → dart-CYoMdUUD.js} +0 -0
- /package/web/assets/{dockerfile-BnivEbtE.js → dockerfile-B2ffS5e2.js} +0 -0
- /package/web/assets/{ecl-TS1StLK1.js → ecl-BL_MLv5o.js} +0 -0
- /package/web/assets/{elixir-BX9ta6DO.js → elixir-DTTK5HpM.js} +0 -0
- /package/web/assets/{flow9-CoOB42ee.js → flow9-CnqIliGA.js} +0 -0
- /package/web/assets/{fsharp-DmQslDFn.js → fsharp-BtsygJkw.js} +0 -0
- /package/web/assets/{go-BbEGGooY.js → go-DksUoC0w.js} +0 -0
- /package/web/assets/{graphql-E24y5sn9.js → graphql-DCtJGb0Q.js} +0 -0
- /package/web/assets/{hcl-pBZphP8G.js → hcl-Vm6MaTNZ.js} +0 -0
- /package/web/assets/{ini-BSbRgr25.js → ini-DdyyiZLB.js} +0 -0
- /package/web/assets/{java-D8KvzsMp.js → java-D9tw0Sq3.js} +0 -0
- /package/web/assets/{julia-BDRytf15.js → julia-DsaDhMSi.js} +0 -0
- /package/web/assets/{kotlin-CNcQo-uP.js → kotlin-eMyqSg05.js} +0 -0
- /package/web/assets/{less-0HRV-2Rz.js → less-BTExquT2.js} +0 -0
- /package/web/assets/{lexon-DdJG3_pW.js → lexon-Btiu1CPR.js} +0 -0
- /package/web/assets/{lua-Blq8Mukj.js → lua-uIHSqSt_.js} +0 -0
- /package/web/assets/{m3-CXbmzr9W.js → m3-DtY-QwwW.js} +0 -0
- /package/web/assets/{markdown-DFIISzT8.js → markdown-DalwAnMR.js} +0 -0
- /package/web/assets/{mips-C2XSYglv.js → mips-BocGRfi2.js} +0 -0
- /package/web/assets/{msdax-D3Jl6oAY.js → msdax-CQFbyz50.js} +0 -0
- /package/web/assets/{mysql-mCqxt_Co.js → mysql-BM8uo0J8.js} +0 -0
- /package/web/assets/{objective-c-CUKLr4E9.js → objective-c-H3c5-SZb.js} +0 -0
- /package/web/assets/{pascal-BpqDI6Ur.js → pascal-BgiV8eY7.js} +0 -0
- /package/web/assets/{pascaligo-BVchPyL4.js → pascaligo-DT9ZcxD2.js} +0 -0
- /package/web/assets/{perl-Dgc9v23P.js → perl-B0U4-W-w.js} +0 -0
- /package/web/assets/{pgsql-Dk9IX1G_.js → pgsql-B6kZRXs9.js} +0 -0
- /package/web/assets/{php-XeFLn3yL.js → php-DG9vCwQM.js} +0 -0
- /package/web/assets/{pla-DQMfrdXZ.js → pla-B4Y4wk5I.js} +0 -0
- /package/web/assets/{postiats-DiKrdL3K.js → postiats-C_eWfeAP.js} +0 -0
- /package/web/assets/{powerquery-Cj9Q91Zv.js → powerquery-DfX2HFDF.js} +0 -0
- /package/web/assets/{powershell-DxLElnzU.js → powershell-Bxsmga8Z.js} +0 -0
- /package/web/assets/{protobuf-7vT2HdZD.js → protobuf-BjgmCR9H.js} +0 -0
- /package/web/assets/{pug-oi96TUbQ.js → pug-ryXuxA3i.js} +0 -0
- /package/web/assets/{qsharp-DNr9IwS2.js → qsharp-91Kv1jwy.js} +0 -0
- /package/web/assets/{r-C-REi_Zk.js → r-j6OkO-Lp.js} +0 -0
- /package/web/assets/{redis-BvOCrLoN.js → redis-B2Usw_gW.js} +0 -0
- /package/web/assets/{redshift-jNEw-REz.js → redshift-Bl5n-UlH.js} +0 -0
- /package/web/assets/{restructuredtext-B9ET-x7N.js → restructuredtext-IIWeXmeu.js} +0 -0
- /package/web/assets/{ruby-BIEBiJDZ.js → ruby-DQH1R4pC.js} +0 -0
- /package/web/assets/{rust-BnoIVewm.js → rust-BJi0001n.js} +0 -0
- /package/web/assets/{sb-Bwvy9clh.js → sb-C34JQX0H.js} +0 -0
- /package/web/assets/{scala-DPv5zS47.js → scala-BqHjuqsC.js} +0 -0
- /package/web/assets/{scheme-BQqNVxf_.js → scheme-DIfjDH23.js} +0 -0
- /package/web/assets/{scss-Ck1AFDEz.js → scss-MxgEDdb7.js} +0 -0
- /package/web/assets/{shell-C4IYs9Z7.js → shell-D_SMEq6l.js} +0 -0
- /package/web/assets/{solidity-D3bS77xq.js → solidity-CyBHDO6p.js} +0 -0
- /package/web/assets/{sophia-BSTVfueD.js → sophia-8_L-7Xrk.js} +0 -0
- /package/web/assets/{sparql-BGcXD7s2.js → sparql-CXxyP-1c.js} +0 -0
- /package/web/assets/{sql-CIsSgyam.js → sql-DNd4NFJw.js} +0 -0
- /package/web/assets/{st-dV1d_AXx.js → st-DPFJcK-4.js} +0 -0
- /package/web/assets/{swift-CK8gXWQn.js → swift-DE_LJ5Ub.js} +0 -0
- /package/web/assets/{systemverilog-B9tHBIJU.js → systemverilog-IgPgwLQ7.js} +0 -0
- /package/web/assets/{tcl-BgRT60RV.js → tcl-Cr-fmmH0.js} +0 -0
- /package/web/assets/{twig-CGkLO4Nl.js → twig-Dd_ODPfV.js} +0 -0
- /package/web/assets/{typespec-DMP9WuzC.js → typespec-CeK8X8vB.js} +0 -0
- /package/web/assets/{uuid-H0yY5A03.js → uuid-6HQMUkhT.js} +0 -0
- /package/web/assets/{vb-DfSbhl3d.js → vb-CyLVxxH6.js} +0 -0
- /package/web/assets/{wgsl-CaJmoLY5.js → wgsl-CmRFGM3r.js} +0 -0
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
findThreadDb,
|
|
3
|
-
lastTurn,
|
|
4
|
-
threadMessages,
|
|
5
|
-
threadsStartedAfter
|
|
6
|
-
} from "./chunk-MD3VW4HQ.js";
|
|
7
1
|
import {
|
|
8
2
|
AmbiguousProjectError,
|
|
9
3
|
StoreDiskCoordinator,
|
|
@@ -23,48 +17,61 @@ import {
|
|
|
23
17
|
serviceStore,
|
|
24
18
|
setProjectServices,
|
|
25
19
|
setProjectVault
|
|
26
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-MSICJEZD.js";
|
|
27
21
|
import {
|
|
28
22
|
atomicWriteSecure,
|
|
29
23
|
fingerprintFiles,
|
|
30
24
|
hasChangedSinceRead,
|
|
31
25
|
rememberFile,
|
|
32
26
|
wasRead
|
|
33
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-GOMF7NWS.js";
|
|
28
|
+
import {
|
|
29
|
+
findThreadDb,
|
|
30
|
+
lastTurn,
|
|
31
|
+
threadMessages,
|
|
32
|
+
threadsStartedAfter
|
|
33
|
+
} from "./chunk-MD3VW4HQ.js";
|
|
34
34
|
import {
|
|
35
35
|
COMPANION_RELAY_CLOSE,
|
|
36
36
|
COMPANION_RELAY_OPEN,
|
|
37
37
|
ProjectSchema,
|
|
38
38
|
extractCompanionRelay
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-LE6XQ3OV.js";
|
|
40
40
|
import {
|
|
41
41
|
allVaultRoots,
|
|
42
|
-
|
|
42
|
+
collidesWithMachineRoot,
|
|
43
|
+
forgetLocalProjectRoot,
|
|
43
44
|
keyedFilePath,
|
|
44
45
|
legacyMachineFilePath,
|
|
45
46
|
listCloudVaults,
|
|
47
|
+
localProjectVaultRoot,
|
|
48
|
+
localVaultCollidesWithMachineRoot,
|
|
46
49
|
localVaultRoot,
|
|
47
50
|
machineFilePath,
|
|
48
51
|
machineRoot,
|
|
49
52
|
orgIdOfRoot,
|
|
53
|
+
readLocalProjectDirs,
|
|
54
|
+
registerLocalProjectDir,
|
|
55
|
+
setLocalProjectRoot,
|
|
56
|
+
unregisterLocalProjectDir,
|
|
50
57
|
vaultFor,
|
|
51
58
|
vaultIdOfRoot
|
|
52
|
-
} from "./chunk-
|
|
59
|
+
} from "./chunk-EV3TBM7E.js";
|
|
53
60
|
|
|
54
61
|
// ../server/src/services/companion.ts
|
|
55
62
|
import { EventEmitter as EventEmitter4 } from "events";
|
|
56
63
|
|
|
57
64
|
// ../server/src/services/conversation-store.ts
|
|
58
65
|
import { randomUUID as randomUUID2 } from "crypto";
|
|
59
|
-
import { readFile as readFile3, mkdir as
|
|
60
|
-
import { dirname, join as join4 } from "path";
|
|
66
|
+
import { readFile as readFile3, mkdir as mkdir3 } from "fs/promises";
|
|
67
|
+
import { dirname as dirname2, join as join4 } from "path";
|
|
61
68
|
import { EventEmitter as EventEmitter2 } from "events";
|
|
62
69
|
|
|
63
70
|
// ../server/src/services/project-store.ts
|
|
64
71
|
import { randomUUID } from "crypto";
|
|
65
72
|
import { EventEmitter } from "events";
|
|
66
|
-
import { readFile as readFile2, rename as rename2, rm } from "fs/promises";
|
|
67
|
-
import { join as join3 } from "path";
|
|
73
|
+
import { mkdir as mkdir2, readFile as readFile2, rename as rename2, rm } from "fs/promises";
|
|
74
|
+
import { dirname, join as join3, resolve as resolve2 } from "path";
|
|
68
75
|
|
|
69
76
|
// ../server/src/utils/ensure-data-gitignore.ts
|
|
70
77
|
import { writeFile } from "fs/promises";
|
|
@@ -198,14 +205,7 @@ function isPathMap(value) {
|
|
|
198
205
|
return !!value && typeof value === "object" && !Array.isArray(value) && Object.values(value).every((v) => typeof v === "string");
|
|
199
206
|
}
|
|
200
207
|
async function holdsRuneyaProject(path) {
|
|
201
|
-
|
|
202
|
-
try {
|
|
203
|
-
await stat(join2(path, ".runeya", candidate));
|
|
204
|
-
return true;
|
|
205
|
-
} catch {
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return false;
|
|
208
|
+
return stat(join2(path, ".runeya", "project.json")).then(() => true, () => false);
|
|
209
209
|
}
|
|
210
210
|
var projectPathStore = new ProjectPathStore();
|
|
211
211
|
|
|
@@ -242,6 +242,17 @@ async function readLocalProject() {
|
|
|
242
242
|
}
|
|
243
243
|
return { local: locals[0] ?? null, strayCloud };
|
|
244
244
|
}
|
|
245
|
+
function isRegistrable(root) {
|
|
246
|
+
return localProjectVaultRoot(dirname(root)) === resolve2(root);
|
|
247
|
+
}
|
|
248
|
+
async function readLocalProjectAt(root) {
|
|
249
|
+
try {
|
|
250
|
+
const parsed = ProjectSchema.safeParse(JSON.parse(await readFile2(join3(root, FILENAME2), "utf-8")));
|
|
251
|
+
return parsed.success && !parsed.data.orgId ? parsed.data : null;
|
|
252
|
+
} catch {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
245
256
|
async function readCloudProjects() {
|
|
246
257
|
const found = [];
|
|
247
258
|
for (const { orgId, projectId, root } of await listCloudVaults()) {
|
|
@@ -254,7 +265,9 @@ async function readCloudProjects() {
|
|
|
254
265
|
}
|
|
255
266
|
return found;
|
|
256
267
|
}
|
|
257
|
-
var
|
|
268
|
+
var LocalProjectRefusedError = class extends Error {
|
|
269
|
+
};
|
|
270
|
+
var LocalProjectExistsError = class extends LocalProjectRefusedError {
|
|
258
271
|
constructor(projectName) {
|
|
259
272
|
super(
|
|
260
273
|
`This directory already holds the local project "${projectName}". A directory holds one local project: use another directory, or create the project in an organization.`
|
|
@@ -264,6 +277,29 @@ var LocalProjectExistsError = class extends Error {
|
|
|
264
277
|
}
|
|
265
278
|
code = "LOCAL_PROJECT_EXISTS";
|
|
266
279
|
};
|
|
280
|
+
var LocalProjectInMachineRootError = class extends LocalProjectRefusedError {
|
|
281
|
+
code = "LOCAL_PROJECT_IN_MACHINE_ROOT";
|
|
282
|
+
constructor() {
|
|
283
|
+
super(
|
|
284
|
+
"This directory holds Runeya's own data. A local project here would mix its files with the machine's vaults: launch Runeya from another directory, or create the project in an organization."
|
|
285
|
+
);
|
|
286
|
+
this.name = "LocalProjectInMachineRootError";
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
var LocalProjectCloudLinkedError = class extends LocalProjectRefusedError {
|
|
290
|
+
code = "LOCAL_PROJECT_CLOUD_LINKED";
|
|
291
|
+
constructor() {
|
|
292
|
+
super("This directory is already linked to an organization project. Choose another directory.");
|
|
293
|
+
this.name = "LocalProjectCloudLinkedError";
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
var LocalProjectNotFoundError = class extends LocalProjectRefusedError {
|
|
297
|
+
code = "LOCAL_PROJECT_NOT_FOUND";
|
|
298
|
+
constructor() {
|
|
299
|
+
super("This directory holds no local Runeya project to import.");
|
|
300
|
+
this.name = "LocalProjectNotFoundError";
|
|
301
|
+
}
|
|
302
|
+
};
|
|
267
303
|
var ProjectStore = class {
|
|
268
304
|
/**
|
|
269
305
|
* Keyed by the (organization, project) couple, never by the project id alone:
|
|
@@ -272,6 +308,12 @@ var ProjectStore = class {
|
|
|
272
308
|
* wrote that survivor back into both vaults.
|
|
273
309
|
*/
|
|
274
310
|
projects = /* @__PURE__ */ new Map();
|
|
311
|
+
/**
|
|
312
|
+
* Les coffres où un projet local a été lu ou écrit. À l'écriture, un coffre
|
|
313
|
+
* de cette liste qui n'a plus de projet perd sa fiche : c'est ainsi qu'une
|
|
314
|
+
* suppression ou une publication vide le dossier qu'elle quitte.
|
|
315
|
+
*/
|
|
316
|
+
localRoots = /* @__PURE__ */ new Set();
|
|
275
317
|
loaded = false;
|
|
276
318
|
/**
|
|
277
319
|
* L'état du disque tel qu'il était au dernier chargement.
|
|
@@ -300,6 +342,10 @@ var ProjectStore = class {
|
|
|
300
342
|
// Prefer the env marked default, fall back to first env
|
|
301
343
|
activeEnvironmentId: defaultEnv?.id ?? p.environmentIds?.[0]
|
|
302
344
|
});
|
|
345
|
+
if (!p.orgId) {
|
|
346
|
+
setLocalProjectRoot(p.id, root);
|
|
347
|
+
this.localRoots.add(root);
|
|
348
|
+
}
|
|
303
349
|
setProjectVault(p, root);
|
|
304
350
|
setProjectServices(p, p.serviceIds ?? []);
|
|
305
351
|
}
|
|
@@ -315,6 +361,7 @@ var ProjectStore = class {
|
|
|
315
361
|
async diskFingerprint() {
|
|
316
362
|
return fingerprintFiles([
|
|
317
363
|
this.getFilePath(),
|
|
364
|
+
...(await readLocalProjectDirs()).map((dir) => this.getFilePath(localProjectVaultRoot(dir))),
|
|
318
365
|
...(await listCloudVaults()).map((v) => this.getFilePath(v.root))
|
|
319
366
|
]);
|
|
320
367
|
}
|
|
@@ -358,8 +405,22 @@ var ProjectStore = class {
|
|
|
358
405
|
/** Le parcours proprement dit, dans une table neuve que `load` substitue. */
|
|
359
406
|
async readVaults() {
|
|
360
407
|
const projects = /* @__PURE__ */ new Map();
|
|
408
|
+
this.localRoots = /* @__PURE__ */ new Set();
|
|
361
409
|
const { local, strayCloud } = await readLocalProject();
|
|
362
|
-
if (local)
|
|
410
|
+
if (local) {
|
|
411
|
+
await this.absorb(projects, local, localVaultRoot());
|
|
412
|
+
if (!localVaultCollidesWithMachineRoot() && isRegistrable(localVaultRoot())) {
|
|
413
|
+
await registerLocalProjectDir(dirname(localVaultRoot())).catch(() => {
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
for (const dir of await readLocalProjectDirs()) {
|
|
418
|
+
const root = localProjectVaultRoot(dir);
|
|
419
|
+
if (root === localVaultRoot()) continue;
|
|
420
|
+
const found = await readLocalProjectAt(root);
|
|
421
|
+
if (!found || projects.has(projectKey(found))) continue;
|
|
422
|
+
await this.absorb(projects, found, root);
|
|
423
|
+
}
|
|
363
424
|
let migrated = false;
|
|
364
425
|
for (const project of strayCloud) {
|
|
365
426
|
try {
|
|
@@ -390,20 +451,30 @@ var ProjectStore = class {
|
|
|
390
451
|
if (!project.orgId) locals.push(project);
|
|
391
452
|
else cloud.push({ project, root: vaultFor(project).root });
|
|
392
453
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
)
|
|
454
|
+
const written = /* @__PURE__ */ new Map();
|
|
455
|
+
for (const local of locals) {
|
|
456
|
+
const root = vaultFor(local).root;
|
|
457
|
+
const other = written.get(root);
|
|
458
|
+
if (other) {
|
|
459
|
+
throw new Error(
|
|
460
|
+
`Refusing to save two local projects in ${root}: "${other.name}" and "${local.name}". A directory holds a single local project.`
|
|
461
|
+
);
|
|
462
|
+
}
|
|
463
|
+
written.set(root, local);
|
|
398
464
|
}
|
|
399
|
-
const [local]
|
|
400
|
-
|
|
401
|
-
await
|
|
402
|
-
await
|
|
403
|
-
|
|
404
|
-
}
|
|
405
|
-
|
|
465
|
+
for (const [root, local] of written) {
|
|
466
|
+
await mkdir2(root, { recursive: true });
|
|
467
|
+
await ensureDataGitignore(root);
|
|
468
|
+
await atomicWriteSecure(this.getFilePath(root), JSON.stringify(toDiskForm(local), null, 2));
|
|
469
|
+
this.localRoots.add(root);
|
|
470
|
+
}
|
|
471
|
+
for (const root of this.localRoots) {
|
|
472
|
+
if (written.has(root)) continue;
|
|
473
|
+
await rm(this.getFilePath(root), { force: true }).catch(() => {
|
|
474
|
+
});
|
|
475
|
+
if (isRegistrable(root)) await unregisterLocalProjectDir(dirname(root)).catch(() => {
|
|
406
476
|
});
|
|
477
|
+
this.localRoots.delete(root);
|
|
407
478
|
}
|
|
408
479
|
await rename2(join3(localVaultRoot(), LEGACY_FILENAME), join3(localVaultRoot(), LEGACY_FILENAME + ".bak")).catch(() => {
|
|
409
480
|
});
|
|
@@ -445,14 +516,29 @@ var ProjectStore = class {
|
|
|
445
516
|
await this.load();
|
|
446
517
|
return this.find(target)?.project ?? null;
|
|
447
518
|
}
|
|
448
|
-
|
|
519
|
+
/**
|
|
520
|
+
* Vérifier qu'un dossier peut accueillir un projet local, et rendre son coffre.
|
|
521
|
+
*
|
|
522
|
+
* Refusé si son `.runeya` serait la racine machine, si le dossier est déjà
|
|
523
|
+
* l'emplacement d'un projet d'organisation, ou s'il porte déjà un projet.
|
|
524
|
+
*/
|
|
525
|
+
async localRootFor(root) {
|
|
526
|
+
if (collidesWithMachineRoot(root)) throw new LocalProjectInMachineRootError();
|
|
527
|
+
if (await projectPathStore.projectAt(dirname(root))) throw new LocalProjectCloudLinkedError();
|
|
528
|
+
const known = Array.from(this.projects.values()).find((p) => !p.orgId && vaultFor(p).root === root);
|
|
529
|
+
if (known) throw new LocalProjectExistsError(known.name);
|
|
530
|
+
const onDisk = await readLocalProjectAt(root);
|
|
531
|
+
if (onDisk) throw new LocalProjectExistsError(onDisk.name);
|
|
532
|
+
if (root !== localVaultRoot() && await holdsRuneyaProject(dirname(root))) throw new LocalProjectExistsError("");
|
|
533
|
+
return root;
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* `localDir` : le dossier d'un projet local. Omis, c'est le dossier de
|
|
537
|
+
* lancement, comme avant que les projets locaux aient chacun le leur.
|
|
538
|
+
*/
|
|
539
|
+
async create(input, localDir) {
|
|
449
540
|
await this.load();
|
|
450
|
-
|
|
451
|
-
const existing = Array.from(this.projects.values()).find((p) => !p.orgId);
|
|
452
|
-
if (existing) {
|
|
453
|
-
throw new LocalProjectExistsError(existing.name);
|
|
454
|
-
}
|
|
455
|
-
}
|
|
541
|
+
const localRoot = input.orgId ? null : await this.localRootFor(localDir ? localProjectVaultRoot(localDir) : localVaultRoot());
|
|
456
542
|
const project = {
|
|
457
543
|
id: randomUUID(),
|
|
458
544
|
orgId: input.orgId ?? null,
|
|
@@ -464,11 +550,52 @@ var ProjectStore = class {
|
|
|
464
550
|
groupOrder: input.groupOrder ?? []
|
|
465
551
|
};
|
|
466
552
|
this.projects.set(projectKey(project), project);
|
|
553
|
+
if (localRoot) {
|
|
554
|
+
setLocalProjectRoot(project.id, localRoot);
|
|
555
|
+
if (isRegistrable(localRoot)) await registerLocalProjectDir(dirname(localRoot));
|
|
556
|
+
}
|
|
467
557
|
setProjectVault(project, vaultFor(project).root);
|
|
468
558
|
setProjectServices(project, project.serviceIds);
|
|
469
559
|
await this.save();
|
|
470
560
|
return project;
|
|
471
561
|
}
|
|
562
|
+
/**
|
|
563
|
+
* Ce qu'un dossier permet pour un projet local : en créer un (`available`),
|
|
564
|
+
* importer celui qu'il porte (`importable`), rien parce qu'il est déjà dans
|
|
565
|
+
* la liste (`listed`), ou rien parce qu'il est refusé.
|
|
566
|
+
*/
|
|
567
|
+
async inspectLocalDir(dir) {
|
|
568
|
+
await this.load();
|
|
569
|
+
const root = localProjectVaultRoot(dir);
|
|
570
|
+
if (collidesWithMachineRoot(root)) return { status: "machine-root", projectName: null };
|
|
571
|
+
if (await projectPathStore.projectAt(resolve2(dir))) return { status: "cloud-linked", projectName: null };
|
|
572
|
+
const known = Array.from(this.projects.values()).find((p) => !p.orgId && vaultFor(p).root === root);
|
|
573
|
+
if (known) return { status: "listed", projectName: known.name };
|
|
574
|
+
const onDisk = await readLocalProjectAt(root);
|
|
575
|
+
if (onDisk) return { status: "importable", projectName: onDisk.name };
|
|
576
|
+
if (await holdsRuneyaProject(dirname(root))) return { status: "unreadable", projectName: null };
|
|
577
|
+
return { status: "available", projectName: null };
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Ajouter à la liste le projet local déjà présent dans ce dossier.
|
|
581
|
+
*
|
|
582
|
+
* Son `.runeya` n'est pas touché : le dossier est seulement enregistré, et le
|
|
583
|
+
* projet relu comme les autres.
|
|
584
|
+
*/
|
|
585
|
+
async importLocal(dir) {
|
|
586
|
+
await this.load();
|
|
587
|
+
const root = localProjectVaultRoot(dir);
|
|
588
|
+
if (collidesWithMachineRoot(root)) throw new LocalProjectInMachineRootError();
|
|
589
|
+
if (await projectPathStore.projectAt(resolve2(dir))) throw new LocalProjectCloudLinkedError();
|
|
590
|
+
const found = await readLocalProjectAt(root);
|
|
591
|
+
if (!found) throw new LocalProjectNotFoundError();
|
|
592
|
+
const known = this.projects.get(projectKey(found));
|
|
593
|
+
if (known) return known;
|
|
594
|
+
await registerLocalProjectDir(dirname(root));
|
|
595
|
+
this.loaded = false;
|
|
596
|
+
await this.load();
|
|
597
|
+
return this.projects.get(projectKey(found)) ?? found;
|
|
598
|
+
}
|
|
472
599
|
/**
|
|
473
600
|
* `input.orgId` names which project is being updated, it does not move it:
|
|
474
601
|
* a project is born local or in an organization and stays there, so treating
|
|
@@ -519,13 +646,19 @@ var ProjectStore = class {
|
|
|
519
646
|
if (this.projects.get(projectKey({ id: projectId, orgId }))) {
|
|
520
647
|
throw new Error("PROJECT_ALREADY_IN_ORG");
|
|
521
648
|
}
|
|
649
|
+
const localRoot = vaultFor(local).root;
|
|
650
|
+
const localDir = localRoot === localVaultRoot() ? null : dirname(localRoot);
|
|
522
651
|
const moved = { ...local, orgId };
|
|
523
652
|
this.projects.delete(projectKey(local));
|
|
524
653
|
forgetProject(local);
|
|
654
|
+
forgetLocalProjectRoot(local.id);
|
|
525
655
|
this.projects.set(projectKey(moved), moved);
|
|
526
656
|
setProjectVault(moved, vaultFor(moved).root);
|
|
527
657
|
setProjectServices(moved, moved.serviceIds ?? []);
|
|
528
658
|
await this.save();
|
|
659
|
+
if (localDir && !await projectPathStore.get(moved)) {
|
|
660
|
+
await projectPathStore.set(moved, localDir);
|
|
661
|
+
}
|
|
529
662
|
await serviceStore.reassignOrg(moved.serviceIds ?? [], orgId);
|
|
530
663
|
await environmentStore.relocateAll();
|
|
531
664
|
return moved;
|
|
@@ -551,6 +684,7 @@ var ProjectStore = class {
|
|
|
551
684
|
*/
|
|
552
685
|
async discardVault(project) {
|
|
553
686
|
forgetProject(project);
|
|
687
|
+
if (!project.orgId) forgetLocalProjectRoot(project.id);
|
|
554
688
|
if (!project.orgId) return;
|
|
555
689
|
await rm(vaultFor(project).root, { recursive: true, force: true }).catch(() => {
|
|
556
690
|
});
|
|
@@ -775,7 +909,7 @@ var ConversationStore = class {
|
|
|
775
909
|
}
|
|
776
910
|
}
|
|
777
911
|
async ensureDir() {
|
|
778
|
-
await
|
|
912
|
+
await mkdir3(dirname2(await this.getFilePath()), { recursive: true });
|
|
779
913
|
}
|
|
780
914
|
encryptMessages(messages, vault) {
|
|
781
915
|
return encryptValue(JSON.stringify(messages), vault);
|
|
@@ -823,9 +957,11 @@ ${new Error("trace").stack}`
|
|
|
823
957
|
workflowType: conv.workflowType,
|
|
824
958
|
kanbanBoardId: conv.kanbanBoardId,
|
|
825
959
|
kanbanCardId: conv.kanbanCardId,
|
|
960
|
+
agentId: conv.agentId,
|
|
826
961
|
companionEnabled: conv.companionEnabled,
|
|
827
962
|
companionRunner: conv.companionRunner,
|
|
828
963
|
companionConversationId: conv.companionConversationId,
|
|
964
|
+
companionBaseSha: conv.companionBaseSha,
|
|
829
965
|
isCompanion: conv.isCompanion,
|
|
830
966
|
archived: conv.archived,
|
|
831
967
|
pinOrder: conv.pinOrder,
|
|
@@ -849,9 +985,11 @@ ${new Error("trace").stack}`
|
|
|
849
985
|
workflowType,
|
|
850
986
|
kanbanBoardId: disk.kanbanBoardId,
|
|
851
987
|
kanbanCardId: disk.kanbanCardId,
|
|
988
|
+
agentId: disk.agentId,
|
|
852
989
|
companionEnabled: disk.companionEnabled,
|
|
853
990
|
companionRunner: disk.companionRunner,
|
|
854
991
|
companionConversationId: disk.companionConversationId,
|
|
992
|
+
companionBaseSha: disk.companionBaseSha,
|
|
855
993
|
isCompanion: disk.isCompanion,
|
|
856
994
|
archived: disk.archived,
|
|
857
995
|
pinOrder: disk.pinOrder,
|
|
@@ -910,7 +1048,7 @@ ${new Error("trace").stack}`
|
|
|
910
1048
|
continue;
|
|
911
1049
|
}
|
|
912
1050
|
const inherited = legacy ? await localProjectId() : null;
|
|
913
|
-
const root =
|
|
1051
|
+
const root = dirname2(path);
|
|
914
1052
|
await rememberFile(path);
|
|
915
1053
|
for (const item of data) {
|
|
916
1054
|
try {
|
|
@@ -1006,7 +1144,7 @@ ${new Error("trace").stack}`
|
|
|
1006
1144
|
async rootFor(conv) {
|
|
1007
1145
|
const known = this.roots.get(conv.id) ?? null;
|
|
1008
1146
|
if (conv.projectId) return rootOfProjectAmong(conv.projectId, known);
|
|
1009
|
-
return known ??
|
|
1147
|
+
return known ?? dirname2(await keyedFilePath(FILENAME3));
|
|
1010
1148
|
}
|
|
1011
1149
|
/**
|
|
1012
1150
|
* Le projet d'une conversation, organisation comprise.
|
|
@@ -1059,16 +1197,16 @@ ${new Error("trace").stack}`
|
|
|
1059
1197
|
*/
|
|
1060
1198
|
async matcherForProject(ref) {
|
|
1061
1199
|
await this.load();
|
|
1062
|
-
let
|
|
1200
|
+
let projectRoot2 = null;
|
|
1063
1201
|
try {
|
|
1064
|
-
|
|
1202
|
+
projectRoot2 = ref.orgId === void 0 ? rootOfProjectAmong(ref.id, null) : rootOfProjectRef({ id: ref.id, orgId: ref.orgId ?? null });
|
|
1065
1203
|
} catch {
|
|
1066
|
-
|
|
1204
|
+
projectRoot2 = null;
|
|
1067
1205
|
}
|
|
1068
1206
|
return (conv) => {
|
|
1069
1207
|
if (conv.projectId) return conv.projectId === ref.id;
|
|
1070
|
-
if (!
|
|
1071
|
-
return this.roots.get(conv.id) ===
|
|
1208
|
+
if (!projectRoot2) return true;
|
|
1209
|
+
return this.roots.get(conv.id) === projectRoot2;
|
|
1072
1210
|
};
|
|
1073
1211
|
}
|
|
1074
1212
|
async get(id) {
|
|
@@ -1090,6 +1228,7 @@ ${new Error("trace").stack}`
|
|
|
1090
1228
|
workflowType,
|
|
1091
1229
|
kanbanBoardId,
|
|
1092
1230
|
kanbanCardId,
|
|
1231
|
+
agentId: extra?.agentId,
|
|
1093
1232
|
isCompanion: extra?.isCompanion,
|
|
1094
1233
|
companionEnabled: extra?.companionEnabled,
|
|
1095
1234
|
companionRunner: extra?.companionRunner,
|
|
@@ -1117,6 +1256,7 @@ ${new Error("trace").stack}`
|
|
|
1117
1256
|
if (patch.companionEnabled !== void 0) conv.companionEnabled = patch.companionEnabled;
|
|
1118
1257
|
if (patch.companionRunner !== void 0) conv.companionRunner = patch.companionRunner;
|
|
1119
1258
|
if (patch.companionConversationId !== void 0) conv.companionConversationId = patch.companionConversationId;
|
|
1259
|
+
if (patch.companionBaseSha !== void 0) conv.companionBaseSha = patch.companionBaseSha;
|
|
1120
1260
|
if (options?.touch !== false) conv.updatedAt = Date.now();
|
|
1121
1261
|
await this.save();
|
|
1122
1262
|
if (!options?.silent) {
|
|
@@ -1209,6 +1349,69 @@ ${new Error("trace").stack}`
|
|
|
1209
1349
|
};
|
|
1210
1350
|
var conversationStore = new ConversationStore();
|
|
1211
1351
|
|
|
1352
|
+
// ../server/src/services/workspace-cwd.ts
|
|
1353
|
+
import { isAbsolute as isAbsolute2, join as join5, dirname as dirname3 } from "path";
|
|
1354
|
+
async function projectRoot(ref) {
|
|
1355
|
+
const project = await projectStore.get(ref);
|
|
1356
|
+
if (!project) return null;
|
|
1357
|
+
if (!project.orgId) {
|
|
1358
|
+
const root = vaultFor(project).root;
|
|
1359
|
+
return root === localVaultRoot() ? null : dirname3(root);
|
|
1360
|
+
}
|
|
1361
|
+
return projectPathStore.get(project);
|
|
1362
|
+
}
|
|
1363
|
+
async function resolveWorkspaceCwd(target) {
|
|
1364
|
+
const launchDir = localVaultRootParent();
|
|
1365
|
+
if (target.serviceId) {
|
|
1366
|
+
const service = await serviceStore.get(target.serviceId);
|
|
1367
|
+
if (service) {
|
|
1368
|
+
const raw = (target.override ?? service.cwd ?? "").trim();
|
|
1369
|
+
const projects = await projectStore.list();
|
|
1370
|
+
const owner = projects.find((p) => p.serviceIds.includes(service.id));
|
|
1371
|
+
const root = owner ? await projectRoot(owner) : null;
|
|
1372
|
+
return root ? anchor(root, raw) : raw || ".";
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
if (target.projectId) {
|
|
1376
|
+
const root = await projectRoot({ id: target.projectId, orgId: target.orgId });
|
|
1377
|
+
const raw = (target.override ?? "").trim();
|
|
1378
|
+
return root ? anchor(root, raw) : raw || launchDir;
|
|
1379
|
+
}
|
|
1380
|
+
return anchor(launchDir, (target.override ?? "").trim());
|
|
1381
|
+
}
|
|
1382
|
+
function anchor(base, raw) {
|
|
1383
|
+
if (!raw || raw === ".") return base;
|
|
1384
|
+
if (raw.startsWith("~") || raw.startsWith("$") || isAbsolute2(raw)) return raw;
|
|
1385
|
+
return join5(base, raw);
|
|
1386
|
+
}
|
|
1387
|
+
function localVaultRootParent() {
|
|
1388
|
+
return dirname3(localVaultRoot());
|
|
1389
|
+
}
|
|
1390
|
+
async function resolveAgentCwd(target) {
|
|
1391
|
+
if (target.serviceId) {
|
|
1392
|
+
const service = await serviceStore.get(target.serviceId);
|
|
1393
|
+
if (service) {
|
|
1394
|
+
const projects = await projectStore.list();
|
|
1395
|
+
const owner = projects.find((p) => p.serviceIds.includes(service.id));
|
|
1396
|
+
const root = owner ? await projectRoot(owner) : null;
|
|
1397
|
+
if (!root) return void 0;
|
|
1398
|
+
return anchor(root, (target.override ?? service.cwd ?? "").trim());
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
if (target.projectId) {
|
|
1402
|
+
const root = await projectRoot({ id: target.projectId, orgId: target.orgId });
|
|
1403
|
+
if (!root) return void 0;
|
|
1404
|
+
return anchor(root, (target.override ?? "").trim());
|
|
1405
|
+
}
|
|
1406
|
+
return void 0;
|
|
1407
|
+
}
|
|
1408
|
+
async function resolveConversationCwd(conversationId) {
|
|
1409
|
+
const conv = await conversationStore.get(conversationId);
|
|
1410
|
+
const ref = conv ? await conversationStore.projectRefOf(conv) : null;
|
|
1411
|
+
if (!ref) return resolveAgentCwd({});
|
|
1412
|
+
return resolveAgentCwd({ projectId: ref.id, orgId: ref.orgId });
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1212
1415
|
// ../server/src/services/turn-events.ts
|
|
1213
1416
|
import { EventEmitter as EventEmitter3 } from "events";
|
|
1214
1417
|
var bus = new EventEmitter3();
|
|
@@ -1227,8 +1430,8 @@ function onTurnFinished(listener) {
|
|
|
1227
1430
|
import { readdir, access, readFile as readFile4 } from "fs/promises";
|
|
1228
1431
|
import { watch } from "fs";
|
|
1229
1432
|
import { homedir } from "os";
|
|
1230
|
-
import { join as
|
|
1231
|
-
var PROJECTS_DIR =
|
|
1433
|
+
import { join as join6 } from "path";
|
|
1434
|
+
var PROJECTS_DIR = join6(homedir(), ".claude", "projects");
|
|
1232
1435
|
var DEFAULT_TITLES = /* @__PURE__ */ new Set(["", "New conversation", "Nouvelle conversation"]);
|
|
1233
1436
|
async function findClaudeSessionFile(sessionId) {
|
|
1234
1437
|
let entries;
|
|
@@ -1239,7 +1442,7 @@ async function findClaudeSessionFile(sessionId) {
|
|
|
1239
1442
|
}
|
|
1240
1443
|
const filename = `${sessionId}.jsonl`;
|
|
1241
1444
|
for (const dir of entries) {
|
|
1242
|
-
const candidate =
|
|
1445
|
+
const candidate = join6(PROJECTS_DIR, dir, filename);
|
|
1243
1446
|
try {
|
|
1244
1447
|
await access(candidate);
|
|
1245
1448
|
return candidate;
|
|
@@ -1429,7 +1632,7 @@ async function startClaudeTranscriptWatcher() {
|
|
|
1429
1632
|
}
|
|
1430
1633
|
for (const dir of topLevel) {
|
|
1431
1634
|
try {
|
|
1432
|
-
const w = watch(
|
|
1635
|
+
const w = watch(join6(PROJECTS_DIR, dir), (_event, filename) => {
|
|
1433
1636
|
handleFsEvent(filename ? filename.toString() : null);
|
|
1434
1637
|
});
|
|
1435
1638
|
w.on("error", () => {
|
|
@@ -1454,7 +1657,7 @@ function stopClaudeTranscriptWatcher() {
|
|
|
1454
1657
|
|
|
1455
1658
|
// ../server/src/services/codex-transcript-sync.ts
|
|
1456
1659
|
import { watch as watch2 } from "fs";
|
|
1457
|
-
import { dirname as
|
|
1660
|
+
import { dirname as dirname4 } from "path";
|
|
1458
1661
|
var announced = /* @__PURE__ */ new Map();
|
|
1459
1662
|
function forgetCodexTurns(conversationId) {
|
|
1460
1663
|
announced.delete(conversationId);
|
|
@@ -1508,7 +1711,7 @@ function startCodexTranscriptWatcher() {
|
|
|
1508
1711
|
const db = findThreadDb();
|
|
1509
1712
|
if (!db) return;
|
|
1510
1713
|
try {
|
|
1511
|
-
watcher = watch2(
|
|
1714
|
+
watcher = watch2(dirname4(db), (_event, filename) => {
|
|
1512
1715
|
if (!filename || !/^thread_history_\d+\.sqlite/.test(filename.toString())) return;
|
|
1513
1716
|
if (debounce) clearTimeout(debounce);
|
|
1514
1717
|
debounce = setTimeout(() => {
|
|
@@ -1873,70 +2076,35 @@ function formatExchange(messages, from) {
|
|
|
1873
2076
|
}
|
|
1874
2077
|
function fullInstructions() {
|
|
1875
2078
|
return [
|
|
1876
|
-
"Tu relis le travail d'un autre agent, dans la m\xEAme conversation
|
|
1877
|
-
"
|
|
1878
|
-
"
|
|
1879
|
-
"lire, mais tu ne la d\xE9places pas, tu ne la commentes pas, tu ne la modifies pas.",
|
|
1880
|
-
"",
|
|
1881
|
-
"Les images ne te sont PAS jointes : l'\xE9change n'en porte que le chemin, sous la",
|
|
1882
|
-
"forme [Image: source: /chemin/fichier.png]. Pour en lire une, ouvre ce chemin avec ton outil de lecture de fichiers \u2014 tu en as un.",
|
|
1883
|
-
"N'invente JAMAIS le contenu d'une image que tu n'as pas ouverte : dis que la",
|
|
1884
|
-
"lecture a \xE9chou\xE9. On te croirait.",
|
|
1885
|
-
"",
|
|
1886
|
-
"R\xC8GLE 1 \u2014 ON PEUT T'ADRESSER LA PAROLE, ET ALORS TU R\xC9PONDS.",
|
|
1887
|
-
"Si l'\xE9change te parle, te nomme, te demande quelque chose : tu r\xE9ponds, TOUJOURS,",
|
|
1888
|
-
"m\xEAme si c'est trivial ou sans rapport avec la relecture. Ne r\xE9ponds JAMAIS " + VERDICT_NOTHING,
|
|
1889
|
-
"dans ce cas.",
|
|
1890
|
-
"Quand l'agent r\xE9pond \xE0 ta remarque \u2014 il l'a corrig\xE9e, contest\xE9e, ou en prend acte \u2014",
|
|
1891
|
-
"il ne t'adresse PAS la parole : il te r\xE9pond. Tu ne r\xE9ponds que s'il te pose une",
|
|
1892
|
-
"question, ou si sa r\xE9ponse est fausse ou incompl\xE8te. Sinon : " + VERDICT_NOTHING + ".",
|
|
2079
|
+
"Tu relis le travail d'un autre agent, dans la m\xEAme conversation. Tu ne modifies",
|
|
2080
|
+
"rien : ni le code, ni la carte kanban, que tu peux lire mais pas d\xE9placer ni",
|
|
2081
|
+
"commenter. Tu ne d\xE9l\xE8gues pas \xE0 un sous-agent.",
|
|
1893
2082
|
"",
|
|
1894
|
-
"
|
|
1895
|
-
"
|
|
1896
|
-
"
|
|
1897
|
-
"message ne contient ni d\xE9faut, ni question, ni r\xE9ponse \xE0 une question : " + VERDICT_NOTHING + ".",
|
|
2083
|
+
"Images : l'\xE9change ne porte que leur chemin, [Image: source: /chemin.png].",
|
|
2084
|
+
"Ouvre-le avec ton outil de lecture. Si la lecture \xE9choue, dis-le. N'invente",
|
|
2085
|
+
"jamais le contenu d'une image.",
|
|
1898
2086
|
"",
|
|
1899
|
-
"
|
|
1900
|
-
"
|
|
1901
|
-
"
|
|
1902
|
-
"
|
|
1903
|
-
"
|
|
1904
|
-
"
|
|
1905
|
-
"
|
|
2087
|
+
"QUAND PARLER",
|
|
2088
|
+
"- Si l'\xE9change te parle ou te pose une question, r\xE9ponds toujours.",
|
|
2089
|
+
"- Sinon, parle seulement si tu as trouv\xE9 un d\xE9faut : r\xE9gression, effet de bord,",
|
|
2090
|
+
" duplication de code existant, faille de s\xE9curit\xE9, affirmation non v\xE9rifi\xE9e.",
|
|
2091
|
+
"- Pas d'accus\xE9 de r\xE9ception, de remerciement ni de \xAB rien \xE0 signaler \xBB : chacun",
|
|
2092
|
+
" relance l'agent. Quand il r\xE9pond \xE0 ta remarque, tais-toi, sauf s'il pose une",
|
|
2093
|
+
" question ou si sa r\xE9ponse est fausse.",
|
|
1906
2094
|
"",
|
|
1907
|
-
"
|
|
1908
|
-
"
|
|
1909
|
-
"
|
|
1910
|
-
"
|
|
1911
|
-
"",
|
|
1912
|
-
"
|
|
1913
|
-
"
|
|
1914
|
-
"
|
|
1915
|
-
"
|
|
1916
|
-
"
|
|
1917
|
-
"
|
|
1918
|
-
"
|
|
1919
|
-
"d\
|
|
1920
|
-
"",
|
|
1921
|
-
"Classe : bloquant, risqu\xE9, mineur. Jamais de pr\xE9f\xE9rence de style.",
|
|
1922
|
-
"Dis s\xE9par\xE9ment ce que tu n'as PAS pu v\xE9rifier \u2014 fichier non lu, d\xE9pendance",
|
|
1923
|
-
"externe, comportement \xE0 l'ex\xE9cution \u2014 plut\xF4t que de supposer.",
|
|
1924
|
-
"",
|
|
1925
|
-
"D'un tour \xE0 l'autre tu gardes le fil : on ne te donne que ce que tu n'as pas",
|
|
1926
|
-
"encore relu. Ne resignale pas ce que tu as d\xE9j\xE0 signal\xE9 \u2014 v\xE9rifie si \xE7'a \xE9t\xE9",
|
|
1927
|
-
"trait\xE9, et reviens dessus seulement sinon.",
|
|
1928
|
-
"",
|
|
1929
|
-
"Le tour a-t-il modifi\xE9 du code ? S'il n'a rien chang\xE9 \u2014 question, explication,",
|
|
1930
|
-
"refus \u2014 n'inspecte PAS le d\xE9p\xF4t. Sinon va le lire toi-m\xEAme : `git diff`, `git",
|
|
1931
|
-
"status`, les fichiers touch\xE9s. Ne demande rien, cherche.",
|
|
1932
|
-
"Le p\xE9rim\xE8tre n'est pas les lignes du diff, c'est ce dont ce tour est RESPONSABLE :",
|
|
1933
|
-
"ce qu'il engage \u2014 appelants, autres entr\xE9es d'une m\xEAme ressource \u2014 et ce que le",
|
|
1934
|
-
"code neuf aurait d\xFB pr\xE9voir. Un d\xE9faut dans du code non modifi\xE9 te regarde s'il",
|
|
1935
|
-
"na\xEEt de ce tour ou si ce tour l'a rendu atteignable ; ce qui vivait sans lui, non.",
|
|
1936
|
-
"",
|
|
1937
|
-
"Tu v\xE9rifies dans ton propre tour : ne d\xE9l\xE8gue jamais \xE0 un sous-agent \u2014 ta r\xE9ponse",
|
|
1938
|
-
"est lue au moment o\xF9 tu la renvoies, ce qu'un sous-agent dirait apr\xE8s",
|
|
1939
|
-
"n'atteindrait plus personne. Lis, cherche, conclus \u2014 ou ne dis rien.",
|
|
2095
|
+
"COMMENT RELIRE",
|
|
2096
|
+
"- Lis le code r\xE9el : `git diff`, `git status`, les fichiers touch\xE9s, leurs",
|
|
2097
|
+
" appelants. Ne te fie ni aux commentaires, ni aux messages de commit, ni \xE0 ce",
|
|
2098
|
+
" qu'affirme l'agent : ils donnent l'intention, pas le code.",
|
|
2099
|
+
"- Ce tour r\xE9pond de ce qu'il modifie et de ce qu'il rend atteignable, pas de ce",
|
|
2100
|
+
" qui existait sans lui.",
|
|
2101
|
+
"- S\xE9curit\xE9 : regarde aussi ce qui a \xE9t\xE9 retir\xE9, et les contr\xF4les absents sur",
|
|
2102
|
+
" chaque entr\xE9e qui m\xE8ne \xE0 la ressource.",
|
|
2103
|
+
"- Cite fichier et ligne. Classe : bloquant, risqu\xE9, mineur. Dis ce que tu n'as",
|
|
2104
|
+
" pas pu v\xE9rifier.",
|
|
2105
|
+
"- Pas de tests complets, build, typecheck global ni serveur : s'il en faut, dis",
|
|
2106
|
+
" \xE0 l'agent quoi lancer.",
|
|
2107
|
+
"- Ne resignale pas ce qui a d\xE9j\xE0 \xE9t\xE9 signal\xE9, sauf si ce n'est pas trait\xE9.",
|
|
1940
2108
|
"",
|
|
1941
2109
|
"Ces consignes valent pour toute la session : elles ne te seront pas r\xE9p\xE9t\xE9es."
|
|
1942
2110
|
].join("\n");
|
|
@@ -1970,7 +2138,10 @@ function reminder() {
|
|
|
1970
2138
|
function companionDefaultPrompt() {
|
|
1971
2139
|
return fullInstructions();
|
|
1972
2140
|
}
|
|
1973
|
-
function
|
|
2141
|
+
function baseLine(baseSha) {
|
|
2142
|
+
return `Point de d\xE9part : le travail de la conversation, commits compris, est dans \`git diff ${baseSha}\`.`;
|
|
2143
|
+
}
|
|
2144
|
+
function buildCompanionPrompt(exchange, isFirstTurn = true, custom, baseSha) {
|
|
1974
2145
|
const customInstructions = custom?.trim();
|
|
1975
2146
|
const instructions = isFirstTurn ? [
|
|
1976
2147
|
fullInstructions(),
|
|
@@ -1986,6 +2157,7 @@ function buildCompanionPrompt(exchange, isFirstTurn = true, custom) {
|
|
|
1986
2157
|
].join("\n") : reminder();
|
|
1987
2158
|
return [
|
|
1988
2159
|
instructions,
|
|
2160
|
+
...baseSha ? ["", baseLine(baseSha)] : [],
|
|
1989
2161
|
"",
|
|
1990
2162
|
"--- Ce que tu n'as pas encore relu de la conversation ---",
|
|
1991
2163
|
exchange || "(vide)"
|
|
@@ -2037,12 +2209,13 @@ async function runCompanionForTurn(conversationId) {
|
|
|
2037
2209
|
if (!hasNew) {
|
|
2038
2210
|
return skip(conversationId, "nothingNew", `rien de neuf \xE0 relire (${messageCount} messages)`);
|
|
2039
2211
|
}
|
|
2040
|
-
const { startCliSession } = await import("./chat-
|
|
2212
|
+
const { startCliSession } = await import("./chat-Q2UMYXQL.js");
|
|
2041
2213
|
const companionConv = await ensureCompanionConversation(conv);
|
|
2042
2214
|
const isFirstTurn = (companionConv.messages?.length ?? 0) === 0;
|
|
2043
2215
|
const exchange = formatExchange(conv.messages, from);
|
|
2044
2216
|
const { prompt: customPrompt } = await companionSettings();
|
|
2045
|
-
const
|
|
2217
|
+
const baseSha = await ensureCompanionBase(conv);
|
|
2218
|
+
const prompt = buildCompanionPrompt(exchange, isFirstTurn, customPrompt, baseSha);
|
|
2046
2219
|
const jwt = await signJwt();
|
|
2047
2220
|
const environmentId = await activeEnvironmentOf(conv);
|
|
2048
2221
|
const agentId = companionAgentId(
|
|
@@ -2152,7 +2325,7 @@ async function deliverToMainConversation(conv, message) {
|
|
|
2152
2325
|
async function attemptDelivery(conv, message) {
|
|
2153
2326
|
if (await writeToLivePty(conv.id, message)) return "pty";
|
|
2154
2327
|
try {
|
|
2155
|
-
const { startCliSession } = await import("./chat-
|
|
2328
|
+
const { startCliSession } = await import("./chat-Q2UMYXQL.js");
|
|
2156
2329
|
await startCliSession(conv.runner, conv.id, message, { jwt: await signJwt() });
|
|
2157
2330
|
return "headless";
|
|
2158
2331
|
} catch (err) {
|
|
@@ -2175,7 +2348,7 @@ async function writeToLivePty(conversationId, message) {
|
|
|
2175
2348
|
}
|
|
2176
2349
|
async function companionSettings() {
|
|
2177
2350
|
try {
|
|
2178
|
-
const { settingsManager } = await import("./settings-manager-
|
|
2351
|
+
const { settingsManager } = await import("./settings-manager-BBNCDDQJ.js");
|
|
2179
2352
|
const settings = await settingsManager.getSettings();
|
|
2180
2353
|
return settings.companion ?? { enabledByDefault: false };
|
|
2181
2354
|
} catch {
|
|
@@ -2242,7 +2415,12 @@ async function ensureCompanionConversation(conv) {
|
|
|
2242
2415
|
void 0,
|
|
2243
2416
|
conv.projectId,
|
|
2244
2417
|
void 0,
|
|
2245
|
-
|
|
2418
|
+
// Le même agent que la conversation relue — c'est lui qui décide du dépôt,
|
|
2419
|
+
// et le compagnon relit ce dépôt-là. Le LANCEMENT visait déjà le bon agent
|
|
2420
|
+
// (`companionAgentId`) ; ce qui manquait, c'est que sa conversation le dise :
|
|
2421
|
+
// sans ce champ, tout ce qui la lit — bouton Git, terminal, activité du PTY —
|
|
2422
|
+
// retombait sur l'agent par défaut du serveur, donc sur un autre dépôt.
|
|
2423
|
+
{ isCompanion: true, agentId: conv.agentId }
|
|
2246
2424
|
);
|
|
2247
2425
|
await conversationStore.update(conv.id, { companionConversationId: companion.id });
|
|
2248
2426
|
return companion;
|
|
@@ -2252,14 +2430,58 @@ async function runCompanionNow(conversationId) {
|
|
|
2252
2430
|
resetRelaunches(conversationId);
|
|
2253
2431
|
await runCompanionForTurn(conversationId);
|
|
2254
2432
|
}
|
|
2433
|
+
var SHA_RE = /^[0-9a-f]{40}$|^[0-9a-f]{64}$/;
|
|
2434
|
+
async function headCommit(queryLog) {
|
|
2435
|
+
try {
|
|
2436
|
+
const log = await queryLog();
|
|
2437
|
+
const first = Array.isArray(log) ? log[0] : void 0;
|
|
2438
|
+
const hash = first && typeof first === "object" && "hash" in first ? first.hash : void 0;
|
|
2439
|
+
return typeof hash === "string" && SHA_RE.test(hash) ? hash : void 0;
|
|
2440
|
+
} catch {
|
|
2441
|
+
return void 0;
|
|
2442
|
+
}
|
|
2443
|
+
}
|
|
2444
|
+
var capturingBase = /* @__PURE__ */ new Set();
|
|
2445
|
+
var baseTriedOnChange = /* @__PURE__ */ new Set();
|
|
2446
|
+
async function ensureCompanionBase(conv) {
|
|
2447
|
+
if (conv.companionBaseSha) return conv.companionBaseSha;
|
|
2448
|
+
if (conv.isCompanion || !conv.companionEnabled || capturingBase.has(conv.id)) return void 0;
|
|
2449
|
+
capturingBase.add(conv.id);
|
|
2450
|
+
try {
|
|
2451
|
+
const agentId = conv.agentId ?? agentManager.getDefaultAgentId();
|
|
2452
|
+
if (!agentId) return void 0;
|
|
2453
|
+
const cwd = await resolveConversationCwd(conv.id) ?? ".";
|
|
2454
|
+
const sha = await headCommit(() => agentManager.agentQuery(agentId, "git.log", { cwd, limit: 1 }));
|
|
2455
|
+
if (!sha) return void 0;
|
|
2456
|
+
await conversationStore.update(conv.id, { companionBaseSha: sha }, { silent: true, touch: false });
|
|
2457
|
+
return sha;
|
|
2458
|
+
} finally {
|
|
2459
|
+
capturingBase.delete(conv.id);
|
|
2460
|
+
}
|
|
2461
|
+
}
|
|
2255
2462
|
var unsubscribe = null;
|
|
2256
2463
|
function initCompanion() {
|
|
2257
2464
|
if (unsubscribe) return;
|
|
2258
|
-
|
|
2465
|
+
const offTurn = onTurnFinished((conversationId) => {
|
|
2259
2466
|
runCompanionForTurn(conversationId).catch((err) => {
|
|
2260
2467
|
console.error("[companion]", err.message);
|
|
2261
2468
|
});
|
|
2262
2469
|
});
|
|
2470
|
+
const onChange = (event) => {
|
|
2471
|
+
if (event.type !== "created" && event.type !== "updated") return;
|
|
2472
|
+
const conv = event.conversation;
|
|
2473
|
+
if (!conv.companionEnabled || conv.isCompanion || conv.companionBaseSha) return;
|
|
2474
|
+
if (baseTriedOnChange.has(conv.id)) return;
|
|
2475
|
+
baseTriedOnChange.add(conv.id);
|
|
2476
|
+
ensureCompanionBase(conv).catch((err) => {
|
|
2477
|
+
console.error("[companion] point de d\xE9part :", err.message);
|
|
2478
|
+
});
|
|
2479
|
+
};
|
|
2480
|
+
conversationStore.onChanged(onChange);
|
|
2481
|
+
unsubscribe = () => {
|
|
2482
|
+
offTurn();
|
|
2483
|
+
conversationStore.offChanged(onChange);
|
|
2484
|
+
};
|
|
2263
2485
|
}
|
|
2264
2486
|
|
|
2265
2487
|
export {
|
|
@@ -2270,9 +2492,12 @@ export {
|
|
|
2270
2492
|
ensureDataGitignore,
|
|
2271
2493
|
holdsRuneyaProject,
|
|
2272
2494
|
projectPathStore,
|
|
2273
|
-
|
|
2495
|
+
LocalProjectRefusedError,
|
|
2274
2496
|
projectStore,
|
|
2275
2497
|
conversationStore,
|
|
2498
|
+
resolveWorkspaceCwd,
|
|
2499
|
+
resolveAgentCwd,
|
|
2500
|
+
resolveConversationCwd,
|
|
2276
2501
|
findClaudeSessionFile,
|
|
2277
2502
|
claudeSessionExists,
|
|
2278
2503
|
readClaudeTranscript,
|
|
@@ -2315,6 +2540,7 @@ export {
|
|
|
2315
2540
|
companionSettings,
|
|
2316
2541
|
answerOfTurn,
|
|
2317
2542
|
runCompanionNow,
|
|
2543
|
+
headCommit,
|
|
2318
2544
|
initCompanion
|
|
2319
2545
|
};
|
|
2320
|
-
//# sourceMappingURL=chunk-
|
|
2546
|
+
//# sourceMappingURL=chunk-GLIU3J47.js.map
|