specrails-desktop 2.29.1 → 2.29.3
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/client/dist/assets/ActivityFeedPage-CFB4UBhT.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-C-T0r16B.js +1 -0
- package/client/dist/assets/AgentModeCodePane-IljV5FOQ.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-B5miH10_.js +1 -0
- package/client/dist/assets/AgentsPage-BgYQrAcH.js +86 -0
- package/client/dist/assets/AnalyticsPage-BtVCuNjL.js +1 -0
- package/client/dist/assets/BarChart-nBOMNfiy.js +33 -0
- package/client/dist/assets/CodePage-Cb_jAjSV.js +2 -0
- package/client/dist/assets/DesktopAnalyticsPage-s_Cc_JL1.js +1 -0
- package/client/dist/assets/DocsDialog-Cr47QI9L.js +11 -0
- package/client/dist/assets/DocsPage-C_WPRuG_.js +11 -0
- package/client/dist/assets/ExportDropdown-BrtfWzEG.js +1 -0
- package/client/dist/assets/IntegrationsPage-Bs00_tl4.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-NfFOciRB.js +19 -0
- package/client/dist/assets/JobDetailModal-DqEW7Z7K.js +1 -0
- package/client/dist/assets/JobDetailPage-D4ppEpDE.js +1 -0
- package/client/dist/assets/JobsPage-DStSoMyq.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DltCwS4P.js +7 -0
- package/client/dist/assets/LoopPreviewModal-BWaiAbUq.js +1 -0
- package/client/dist/assets/LoopsPage-BqjbXuBZ.js +1 -0
- package/client/dist/assets/MinimizedChatsContext--o3JAM9F.js +1 -0
- package/client/dist/assets/PluginsPage-B-UOmzXw.js +2 -0
- package/client/dist/assets/ProjectSettingsDialog-DkGajIxE.js +1 -0
- package/client/dist/assets/TemplatePreviewModal-5CUXlkw7.js +1 -0
- package/client/dist/assets/TicketDetailModal-B_igqmti.js +14 -0
- package/client/dist/assets/Trans-DDMIBBUd.js +1 -0
- package/client/dist/assets/activity-DiyjsgQV.js +1 -0
- package/client/dist/assets/addon-image-BRmmRHgQ.js +1 -0
- package/client/dist/assets/addon-ligatures-qIZUPvRV.js +2 -0
- package/client/dist/assets/{addon-webgl-DMbGeI_u.js → addon-webgl-C2d7lriQ.js} +3 -3
- package/client/dist/assets/addspec-Rw8uVBC1.js +1 -0
- package/client/dist/assets/agent-BXc59ARK2.js +1 -0
- package/client/dist/assets/agent-BbIFXdDq.js +1 -0
- package/client/dist/assets/agent-BqEfA5u5.js +1 -0
- package/client/dist/assets/agent-BtGzgTC4.js +1 -0
- package/client/dist/assets/agent-CIhys_5d.js +1 -0
- package/client/dist/assets/agent-CJPaqsVR.js +1 -0
- package/client/dist/assets/agent-n-hY4GuL.js +1 -0
- package/client/dist/assets/agent-tJ-efa3_2.js +1 -0
- package/client/dist/assets/agents-DhG7mg6-.js +1 -0
- package/client/dist/assets/agentstudio-BIUe1Im2.js +1 -0
- package/client/dist/assets/aiedit-iIjz2_Qk.js +1 -0
- package/client/dist/assets/analytics-DZ8Aoq3I.js +1 -0
- package/client/dist/assets/api-B2M7CtDw.js +1 -0
- package/client/dist/assets/arrow-left-CpIR4j7G.js +1 -0
- package/client/dist/assets/arrow-up-right-9DoMn7fD.js +1 -0
- package/client/dist/assets/attachments-B53PG733.js +1 -0
- package/client/dist/assets/brain-DI9lHkKY.js +1 -0
- package/client/dist/assets/browser-CXUcnTMI.js +1 -0
- package/client/dist/assets/button-BUIIBQPT.js +1 -0
- package/client/dist/assets/chat-BGD7MXAy.js +1 -0
- package/client/dist/assets/chevron-right-CViMxucY.js +1 -0
- package/client/dist/assets/chunk-KS7C4IRE-Cx5sqopX.js +3 -0
- package/client/dist/assets/circle-x-CMYsN4ZH.js +1 -0
- package/client/dist/assets/code-BDXEM4ml.js +1 -0
- package/client/dist/assets/commands-DyUZQ1FI.js +1 -0
- package/client/dist/assets/common-6MLbD-jM.js +1 -0
- package/client/dist/assets/common-BKGEu4rm.js +1 -0
- package/client/dist/assets/common-BNbnv8cE2.js +1 -0
- package/client/dist/assets/common-BqGWtDbt.js +1 -0
- package/client/dist/assets/common-DBtTzeYm2.js +1 -0
- package/client/dist/assets/common-DEW3Nr8n.js +1 -0
- package/client/dist/assets/common-DHsv9N5d.js +1 -0
- package/client/dist/assets/common-mkrEcW-Y.js +1 -0
- package/client/dist/assets/createLucideIcon-Bjbbp_KS.js +1 -0
- package/client/dist/assets/{css.worker-Wv5dxAWO.js → css.worker-yKcq13f2.js} +13 -13
- package/client/dist/assets/{cssMode-DBHbkBvI.js → cssMode-BM4z9OX0.js} +1 -1
- package/client/dist/assets/dashboard-BYzxom0L.js +1 -0
- package/client/dist/assets/dashboard-BmDZmHyY.js +1 -0
- package/client/dist/assets/dashboard-CnNtJBQ5.js +1 -0
- package/client/dist/assets/dashboard-D4Uj-XWc2.js +1 -0
- package/client/dist/assets/dashboard-D57uRaGw2.js +1 -0
- package/client/dist/assets/dashboard-DAr6F9et.js +1 -0
- package/client/dist/assets/dashboard-vAcsn0L3.js +1 -0
- package/client/dist/assets/dashboard-vrjZvxWy.js +1 -0
- package/client/dist/assets/dialog-CzIekCw0.js +45 -0
- package/client/dist/assets/dist-Cez5CRkX.js +1 -0
- package/client/dist/assets/dist-bVqfYmby.js +1 -0
- package/client/dist/assets/{dist-js-CgpP6tKI.js → dist-js-BCUhGUXS.js} +1 -1
- package/client/dist/assets/{dist-js-DHiN-A_E.js → dist-js-DcoXTnEI.js} +1 -1
- package/client/dist/assets/download-CFHyyHcw.js +1 -0
- package/client/dist/assets/editor.api2-4ndOupAA.js +872 -0
- package/client/dist/assets/{editor.main-C9J2ikJK.js → editor.main-DxrmGfoq.js} +2 -2
- package/client/dist/assets/editor.worker-tytyn86m.js +26 -0
- package/client/dist/assets/explore-DgBACn39.js +1 -0
- package/client/dist/assets/external-link-BcU5EWZp.js +1 -0
- package/client/dist/assets/file-text-CFT-xXKN.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DP3Ab6fX.js +1 -0
- package/client/dist/assets/{freemarker2-J5iIIIK-.js → freemarker2-CELlTDJ2.js} +1 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-DdKKL8Fx.js +1 -0
- package/client/dist/assets/git-branch-BRM0F5GN.js +1 -0
- package/client/dist/assets/{handlebars-DSw1l_tw.js → handlebars-NEjHJ7o_.js} +1 -1
- package/client/dist/assets/{html-h2-wE1Lj.js → html-CA10zN5A.js} +1 -1
- package/client/dist/assets/{html.worker-CQP8QQsS.js → html.worker-DSJ9zmd7.js} +12 -12
- package/client/dist/assets/{htmlMode-Cc_ij7lW.js → htmlMode-89rPYiyq.js} +1 -1
- package/client/dist/assets/i18n-DREQCE2F.js +2 -0
- package/client/dist/assets/index-B784m8RT.js +76 -0
- package/client/dist/assets/index-CQBIemiz.css +2 -0
- package/client/dist/assets/integrations-mB-7zoyT.js +1 -0
- package/client/dist/assets/{javascript-C1q3xv6N.js → javascript-B1gDmwzS.js} +1 -1
- package/client/dist/assets/jira-CmKWERE0.js +1 -0
- package/client/dist/assets/jira-api-BgFIr8eD.js +1 -0
- package/client/dist/assets/job-time-BCL7wee9.js +1 -0
- package/client/dist/assets/jobs-B-sDHEay2.js +1 -0
- package/client/dist/assets/jobs-BCtGfgUA.js +1 -0
- package/client/dist/assets/jobs-BHR_EnDI.js +1 -0
- package/client/dist/assets/jobs-BMbZJjJJ.js +1 -0
- package/client/dist/assets/jobs-CVFD8rar.js +1 -0
- package/client/dist/assets/jobs-DoSaFzAa.js +1 -0
- package/client/dist/assets/jobs-DzSIR8V62.js +1 -0
- package/client/dist/assets/jobs-lk1_Dq1U.js +1 -0
- package/client/dist/assets/json.worker-Oa9UrkKE.js +58 -0
- package/client/dist/assets/{jsonMode-CeaCdEhr.js → jsonMode-xHLMfzhF.js} +1 -1
- package/client/dist/assets/jsx-runtime-zu2_FqZY.js +1 -0
- package/client/dist/assets/lib-C7Mhm-gT.js +7 -0
- package/client/dist/assets/lib-CGdyxIWg.js +29 -0
- package/client/dist/assets/{liquid-eFsVK0V-.js → liquid-BY6hCUXG.js} +1 -1
- package/client/dist/assets/loader-circle-DcygOQpC.js +1 -0
- package/client/dist/assets/loops-BzfXWEwO.js +1 -0
- package/client/dist/assets/{lspLanguageFeatures-DT3-bbhn.js → lspLanguageFeatures-ira2aEJh.js} +1 -1
- package/client/dist/assets/mcp-uDkXYu4L.js +1 -0
- package/client/dist/assets/{mdx-Fuwnh1cX.js → mdx-BNx0xr3N.js} +1 -1
- package/client/dist/assets/monaco.contribution-Bt92R3Vw.js +2 -0
- package/client/dist/assets/nav-myFaXRHD.js +1 -0
- package/client/dist/assets/pencil-C9RkrIPZ.js +1 -0
- package/client/dist/assets/play-DNlrawbS.js +1 -0
- package/client/dist/assets/plus-CsnjfkmX.js +1 -0
- package/client/dist/assets/preload-helper-Czpn1I53.js +1 -0
- package/client/dist/assets/{python-BgoEs6Cj.js → python-DLdbtmNw.js} +1 -1
- package/client/dist/assets/{razor-CM1sPMMq.js → razor-B9gdhAbR.js} +1 -1
- package/client/dist/assets/react-dom-DiWzBDP9.js +1 -0
- package/client/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
- package/client/dist/assets/save-28sIlCdr.js +1 -0
- package/client/dist/assets/search-Cq_gE3Ik.js +1 -0
- package/client/dist/assets/settings-B0ypw9uw.js +1 -0
- package/client/dist/assets/setup-CmK87LuS.js +1 -0
- package/client/dist/assets/sparkles-DrY8hb0X.js +1 -0
- package/client/dist/assets/specs-DII0C8gw.js +1 -0
- package/client/dist/assets/spending-CtY7yYes.js +1 -0
- package/client/dist/assets/terminal-BFRZnMPP.js +1 -0
- package/client/dist/assets/tickets-B8BuAaj5.js +1 -0
- package/client/dist/assets/tickets-B_yh4qQk.js +1 -0
- package/client/dist/assets/tickets-Bs37scwY2.js +1 -0
- package/client/dist/assets/tickets-CFk2n2Or.js +1 -0
- package/client/dist/assets/tickets-DQp7JS2R2.js +1 -0
- package/client/dist/assets/tickets-D_yDquEw.js +1 -0
- package/client/dist/assets/tickets-DpmdE8tv2.js +1 -0
- package/client/dist/assets/tickets-pAUJkDTu.js +1 -0
- package/client/dist/assets/trash-2-BOU3WdZZ.js +1 -0
- package/client/dist/assets/triangle-alert-H9T4jAmh.js +1 -0
- package/client/dist/assets/{ts.worker-METxwbDZ.js → ts.worker-BtjBFNHX.js} +48 -33
- package/client/dist/assets/{tsMode-BmT8WogI.js → tsMode-DEjSThU9.js} +1 -1
- package/client/dist/assets/{typescript-CQrQPsoW.js → typescript-CRRnD2Ts.js} +1 -1
- package/client/dist/assets/upload-DYMjAQ6M.js +1 -0
- package/client/dist/assets/useBrowserCaptureSession-BFBdW59q.js +1 -0
- package/client/dist/assets/useDesktop-uWVZ8eia.js +1 -0
- package/client/dist/assets/useSharedWebSocket-DaPh7QBL.js +1 -0
- package/client/dist/assets/utils-BC4DHlz2.js +1 -0
- package/client/dist/assets/value-s-gzBeyF.js +1 -0
- package/client/dist/assets/{workers-U0UXyLUf.js → workers-uOo7WLaa.js} +1 -1
- package/client/dist/assets/x-CBMI9ejn.js +1 -0
- package/client/dist/assets/{xml-WRxJs8_I.js → xml-EDREH2X7.js} +1 -1
- package/client/dist/assets/{yaml-CjpSTjJU.js → yaml-BjaDVX1E.js} +1 -1
- package/client/dist/assets/zap-CHo3aCD1.js +1 -0
- package/client/dist/index.html +73 -32
- package/docs/guide/en/integrations/5-mcp-server.md +2 -2
- package/docs/internals/safe-pr-review-flow.md +382 -141
- package/docs/mcp.md +15 -5
- package/package.json +11 -7
- package/server/dist/active-pr-continuation.js +250 -50
- package/server/dist/agent-chat-manager.js +387 -191
- package/server/dist/agent-cwd-manager.js +52 -8
- package/server/dist/agent-generator.js +90 -48
- package/server/dist/agent-mcp-config.js +69 -36
- package/server/dist/agent-operator-prompt.js +3 -2
- package/server/dist/agent-refine-manager.js +47 -6
- package/server/dist/agent-store.js +19 -4
- package/server/dist/agent-tier.js +13 -11
- package/server/dist/artifact-registry.js +33 -2
- package/server/dist/auth.js +5 -4
- package/server/dist/browser-capture-manager.js +92 -29
- package/server/dist/chat-manager.js +302 -46
- package/server/dist/contract-refine-runner.js +19 -6
- package/server/dist/db.js +686 -8
- package/server/dist/desktop-router.js +1 -2
- package/server/dist/headroom-manager.js +1310 -121
- package/server/dist/headroom-routing.js +120 -2
- package/server/dist/index.js +48 -13
- package/server/dist/interactive-job-session.js +237 -82
- package/server/dist/jira/jira-adf.js +10 -0
- package/server/dist/jira/jira-db.js +15 -3
- package/server/dist/jira/jira-sync-manager.js +182 -13
- package/server/dist/job-listing.js +140 -0
- package/server/dist/job-spawn-idempotency.js +67 -0
- package/server/dist/loop-run-manager.js +508 -98
- package/server/dist/loop-runs-store.js +266 -13
- package/server/dist/mcp/agent-capability.js +71 -0
- package/server/dist/mcp/guide.js +5 -2
- package/server/dist/mcp/mcp-server.js +5 -10
- package/server/dist/mcp/mcp-token.js +5 -5
- package/server/dist/mcp/tools/jobs.js +20 -13
- package/server/dist/mcp/tools/types.js +20 -42
- package/server/dist/mobile/mobile-router.js +1 -1
- package/server/dist/pr-lifecycle.js +169 -0
- package/server/dist/pr-publisher.js +94 -27
- package/server/dist/process-admission.js +82 -0
- package/server/dist/project-git.js +62 -2
- package/server/dist/project-registry.js +572 -174
- package/server/dist/project-router-git.js +13 -2
- package/server/dist/project-router-jobs.js +111 -55
- package/server/dist/project-router-tickets.js +32 -2
- package/server/dist/providers/claude-adapter.js +21 -13
- package/server/dist/queue-manager.js +2332 -623
- package/server/dist/rail-isolated-launch.js +1679 -296
- package/server/dist/rail-isolation.js +4 -2
- package/server/dist/rail-pr-decision.js +1665 -307
- package/server/dist/rail-pr-delivery.js +2 -1
- package/server/dist/rail-pr-recovery-git.js +235 -0
- package/server/dist/rail-pr-store.js +429 -19
- package/server/dist/rail-pr-ticket-effects.js +328 -0
- package/server/dist/rail-worktree-release.js +305 -3
- package/server/dist/rails-router.js +238 -120
- package/server/dist/rails-store.js +106 -3
- package/server/dist/ticket-store.js +23 -1
- package/server/dist/transient-children.js +13 -0
- package/server/dist/util/cli-prompt.js +42 -8
- package/server/dist/util/secure-token-file.js +84 -0
- package/server/dist/worktree-manager.js +126 -21
- package/server/dist/worktree-overlay.js +166 -4
- package/client/dist/assets/ActivityFeedPage-D8RKRRoM.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-BUHPHNSN.js +0 -1
- package/client/dist/assets/AgentModeCodePane-GZc8bNGT.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-DWtQqj3k.js +0 -1
- package/client/dist/assets/AgentsPage-CKPtHkRP.js +0 -86
- package/client/dist/assets/AnalyticsPage-CZW8c77k.js +0 -1
- package/client/dist/assets/BarChart-DugEoe2q.js +0 -33
- package/client/dist/assets/CodePage-CQ-uKETG.js +0 -2
- package/client/dist/assets/DesktopAnalyticsPage-Bgo4SyCH.js +0 -1
- package/client/dist/assets/DocsDialog-DxpWw_La.js +0 -11
- package/client/dist/assets/DocsPage-CmcOkK19.js +0 -11
- package/client/dist/assets/ExportDropdown-DvTS2wc7.js +0 -1
- package/client/dist/assets/IntegrationsPage-B72WxJ3Z.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-B5gh4Qoy.js +0 -19
- package/client/dist/assets/JobDetailModal-D-BeqsJ6.js +0 -1
- package/client/dist/assets/JobDetailPage-DwdozwLO.js +0 -1
- package/client/dist/assets/JobsPage-BDkinklt.js +0 -1
- package/client/dist/assets/LoopBuilderPage-CclJ3VZA.js +0 -7
- package/client/dist/assets/LoopPreviewModal-Dw4UgoLu.js +0 -1
- package/client/dist/assets/LoopsPage-D7ac4M24.js +0 -1
- package/client/dist/assets/PluginsPage-wdC-qa40.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-BlTlRtGI.js +0 -1
- package/client/dist/assets/TemplatePreviewModal-CeMx2Red.js +0 -1
- package/client/dist/assets/activity-Dbl71S-E.js +0 -1
- package/client/dist/assets/addon-image-CwoZj17F.js +0 -1
- package/client/dist/assets/addon-ligatures-CWDrED80.js +0 -2
- package/client/dist/assets/addspec-DrXqP8ip.js +0 -1
- package/client/dist/assets/agent-B8BXmlUQ2.js +0 -1
- package/client/dist/assets/agent-BEXYxDbs.js +0 -1
- package/client/dist/assets/agent-BYc3-6Ln2.js +0 -1
- package/client/dist/assets/agent-BbJorPdT.js +0 -1
- package/client/dist/assets/agent-CewFImgL.js +0 -1
- package/client/dist/assets/agent-DfhYoUmp.js +0 -1
- package/client/dist/assets/agent-TK_rrK4d.js +0 -1
- package/client/dist/assets/agent-bHjA9R_j2.js +0 -1
- package/client/dist/assets/agents-CGDn_3kB.js +0 -1
- package/client/dist/assets/agentstudio-Dxe_94PK.js +0 -1
- package/client/dist/assets/aiedit-DrfHQnlz.js +0 -1
- package/client/dist/assets/analytics-CxDYcBl9.js +0 -1
- package/client/dist/assets/attachments-DvxQbBTC.js +0 -1
- package/client/dist/assets/brain-C92rjjYP.js +0 -1
- package/client/dist/assets/browser-DM8G151q.js +0 -1
- package/client/dist/assets/chat-0dg5hOo_.js +0 -1
- package/client/dist/assets/chunk-BNv3lrIs.js +0 -1
- package/client/dist/assets/code-B62fClk-.js +0 -1
- package/client/dist/assets/commands-DCJ-R9E4.js +0 -1
- package/client/dist/assets/common-BM3LFLCE2.js +0 -1
- package/client/dist/assets/common-Bwafujnc2.js +0 -1
- package/client/dist/assets/common-C-vU-j-I.js +0 -1
- package/client/dist/assets/common-C5HKSbbz.js +0 -1
- package/client/dist/assets/common-DXrmj6WD.js +0 -1
- package/client/dist/assets/common-DhWTkocg.js +0 -1
- package/client/dist/assets/common-DiPTT7V_2.js +0 -1
- package/client/dist/assets/common-DmqBPwZG.js +0 -1
- package/client/dist/assets/dashboard-B5ang-ZS.js +0 -1
- package/client/dist/assets/dashboard-CHHcOWVL2.js +0 -1
- package/client/dist/assets/dashboard-DBD4wPGY2.js +0 -1
- package/client/dist/assets/dashboard-DBuLfWo9.js +0 -1
- package/client/dist/assets/dashboard-DSnztwWH.js +0 -1
- package/client/dist/assets/dashboard-D_aP_InU.js +0 -1
- package/client/dist/assets/dashboard-DmBcdl1B.js +0 -1
- package/client/dist/assets/dashboard-RIcUKY1Y2.js +0 -1
- package/client/dist/assets/editor.api2-C3B0tp2x.js +0 -872
- package/client/dist/assets/editor.worker-Bd9IXS8d.js +0 -26
- package/client/dist/assets/explore-_XyU5e7R.js +0 -1
- package/client/dist/assets/index-BVbgKXUu.css +0 -2
- package/client/dist/assets/index-DyY1QyIn.js +0 -158
- package/client/dist/assets/integrations-By80EBkf.js +0 -1
- package/client/dist/assets/jira-DeIjwCK3.js +0 -1
- package/client/dist/assets/jobs-1GV2-4zd2.js +0 -1
- package/client/dist/assets/jobs-26F9gGcE.js +0 -1
- package/client/dist/assets/jobs-BgQzB0Sx2.js +0 -1
- package/client/dist/assets/jobs-BqWui9_f.js +0 -1
- package/client/dist/assets/jobs-CE8qeIYj.js +0 -1
- package/client/dist/assets/jobs-DrYmsKy5.js +0 -1
- package/client/dist/assets/jobs-DzeuASRf.js +0 -1
- package/client/dist/assets/jobs-Wh7dn28q2.js +0 -1
- package/client/dist/assets/json.worker-DzV-CpCQ.js +0 -58
- package/client/dist/assets/lib-0PFDyMxJ.js +0 -7
- package/client/dist/assets/loops-CO6q75W8.js +0 -1
- package/client/dist/assets/mcp-HwBbQDk0.js +0 -1
- package/client/dist/assets/monaco.contribution-Desq7oq4.js +0 -2
- package/client/dist/assets/nav-BTg8s-cD.js +0 -1
- package/client/dist/assets/preload-helper-DSXbuxSR.js +0 -1
- package/client/dist/assets/settings-cJNynGIZ.js +0 -1
- package/client/dist/assets/setup-D2CmgAro.js +0 -1
- package/client/dist/assets/specs-PGIOzMtc.js +0 -1
- package/client/dist/assets/terminal-CFt56A5f.js +0 -1
- package/client/dist/assets/tickets-B7zT4IRf.js +0 -1
- package/client/dist/assets/tickets-BHv3ewvq.js +0 -1
- package/client/dist/assets/tickets-BoXom7l8.js +0 -1
- package/client/dist/assets/tickets-C3b8cHhd2.js +0 -1
- package/client/dist/assets/tickets-CFXnJsYF.js +0 -1
- package/client/dist/assets/tickets-CWYFvx1W2.js +0 -1
- package/client/dist/assets/tickets-DTHo9c3C.js +0 -1
- package/client/dist/assets/tickets-SuX_HkK4.js +0 -1
- package/client/dist/assets/upload-CmR4h9H1.js +0 -1
- package/client/dist/assets/value-JA3bf47v.js +0 -1
- /package/client/dist/assets/{abap-D0E4FfVW.js → abap-08VXUWAP.js} +0 -0
- /package/client/dist/assets/{activity--iN4Ad2R2.js → activity-B-rp4h_v.js} +0 -0
- /package/client/dist/assets/{activity-6hM_ZSg9.js → activity-C6kJpm9q2.js} +0 -0
- /package/client/dist/assets/{activity-CIOLxGvh.js → activity-CGx4kb_j.js} +0 -0
- /package/client/dist/assets/{activity-BZNfOdiS.js → activity-CnoX2bH7.js} +0 -0
- /package/client/dist/assets/{activity-BuVo5sPB.js → activity-DAyekdlt2.js} +0 -0
- /package/client/dist/assets/{activity-D2r2h3SE2.js → activity-DCxtpT7j.js} +0 -0
- /package/client/dist/assets/{activity-DtxrAUMo2.js → activity-JzwRaWPD.js} +0 -0
- /package/client/dist/assets/{addspec-BMtLZLW62.js → addspec-BXjvkh5q.js} +0 -0
- /package/client/dist/assets/{addspec-CRuvWn8d.js → addspec-C4bwrmpi.js} +0 -0
- /package/client/dist/assets/{addspec-D-JLDsUV.js → addspec-CArHXUDM.js} +0 -0
- /package/client/dist/assets/{addspec-mgPOt5q02.js → addspec-DTKJcXiR.js} +0 -0
- /package/client/dist/assets/{addspec-DfhDbg5c.js → addspec-DbNBbrha2.js} +0 -0
- /package/client/dist/assets/{addspec-CP0HRuxY.js → addspec-htHGZHOe2.js} +0 -0
- /package/client/dist/assets/{addspec-bsNDdqRm2.js → addspec-lr_LP6jk.js} +0 -0
- /package/client/dist/assets/{agents-78bTZGZh.js → agents-6ZOJXWVk2.js} +0 -0
- /package/client/dist/assets/{agents-DDtCJ5M02.js → agents-BZ0XQKjg.js} +0 -0
- /package/client/dist/assets/{agents-CWo-KyAB.js → agents-BqWklnHR.js} +0 -0
- /package/client/dist/assets/{agents-BUdEi3-N.js → agents-Bz-thHkB2.js} +0 -0
- /package/client/dist/assets/{agents-bvyRLczL.js → agents-CJclElx6.js} +0 -0
- /package/client/dist/assets/{agents-BpoUaoW92.js → agents-D_l9L0VA.js} +0 -0
- /package/client/dist/assets/{agents-BLhWCmDS2.js → agents-u_C0jPB5.js} +0 -0
- /package/client/dist/assets/{agentstudio-BMQxc_bz.js → agentstudio-BF19hbXj.js} +0 -0
- /package/client/dist/assets/{agentstudio-C_Jq8Tl4.js → agentstudio-BLGvxWBx2.js} +0 -0
- /package/client/dist/assets/{agentstudio-Dtq3dGYk.js → agentstudio-D9UKiWTj2.js} +0 -0
- /package/client/dist/assets/{agentstudio-CWgXG5W52.js → agentstudio-Drs37nIM.js} +0 -0
- /package/client/dist/assets/{agentstudio-sI27TpBu2.js → agentstudio-nEnKkcXM.js} +0 -0
- /package/client/dist/assets/{agentstudio-jKMTdT70.js → agentstudio-pyFcSBKy.js} +0 -0
- /package/client/dist/assets/{agentstudio-COZriimI2.js → agentstudio-zfTzQh3U.js} +0 -0
- /package/client/dist/assets/{aiedit-hknZlly82.js → aiedit-B0KUbpB6.js} +0 -0
- /package/client/dist/assets/{aiedit-eMN4eQPF.js → aiedit-BoG24nlg2.js} +0 -0
- /package/client/dist/assets/{aiedit-pc5JDUq1.js → aiedit-CjlSRQVP.js} +0 -0
- /package/client/dist/assets/{aiedit-B03pD_Na.js → aiedit-DCjA7jLJ.js} +0 -0
- /package/client/dist/assets/{aiedit-6CHdb_iv2.js → aiedit-DNXxq_Dr.js} +0 -0
- /package/client/dist/assets/{aiedit-igmw-ZoZ2.js → aiedit-DQ-0_pvE.js} +0 -0
- /package/client/dist/assets/{aiedit-BtRqRxML.js → aiedit-olnv3QSt2.js} +0 -0
- /package/client/dist/assets/{analytics-CCprAqk3.js → analytics-BC7mwR4s.js} +0 -0
- /package/client/dist/assets/{analytics-CR1TJqUi2.js → analytics-BiNg8edP.js} +0 -0
- /package/client/dist/assets/{analytics-Bj-SmKHa.js → analytics-C0s_T2GN.js} +0 -0
- /package/client/dist/assets/{analytics-C5dpiS0o.js → analytics-CdsAPAwZ2.js} +0 -0
- /package/client/dist/assets/{analytics-BWMUZ2Pq2.js → analytics-Cr1_q-lC.js} +0 -0
- /package/client/dist/assets/{analytics-DfNdXR0y2.js → analytics-IEsKZvpW2.js} +0 -0
- /package/client/dist/assets/{analytics-rmHuJv0V.js → analytics-SRPf84OT.js} +0 -0
- /package/client/dist/assets/{apex-D_X_8J4d.js → apex-BWPQTe0t.js} +0 -0
- /package/client/dist/assets/{atom-one-dark-BMDPFwRZ.js → atom-one-dark-qiGhVQxg.js} +0 -0
- /package/client/dist/assets/{attachments-BgBNSqQd.js → attachments-D0wXXt9T2.js} +0 -0
- /package/client/dist/assets/{attachments-C9GTTJsx2.js → attachments-DenIjuVI.js} +0 -0
- /package/client/dist/assets/{attachments-BjyMmrwE.js → attachments-DhO7LPfy.js} +0 -0
- /package/client/dist/assets/{attachments-DPCmkFZu2.js → attachments-DoH5w0x4.js} +0 -0
- /package/client/dist/assets/{attachments-DCZOL1RU.js → attachments-Q9yNtiEM.js} +0 -0
- /package/client/dist/assets/{attachments-rNn1ekRy2.js → attachments-V_WZAYXx2.js} +0 -0
- /package/client/dist/assets/{attachments-DL-bPy9E.js → attachments-eaeScpjM.js} +0 -0
- /package/client/dist/assets/{auth-DpZq5p1e.js → auth-D_5bQv5W.js} +0 -0
- /package/client/dist/assets/{azcli-PZLnZ3jH.js → azcli-Bc_sGQ0U.js} +0 -0
- /package/client/dist/assets/{bat-KlBOxpO4.js → bat-i0X4ZdIN.js} +0 -0
- /package/client/dist/assets/{bicep-CgG9oF3V.js → bicep-B5-_aFwp.js} +0 -0
- /package/client/dist/assets/{browser-BPkhILSJ.js → browser-C25DkQiO.js} +0 -0
- /package/client/dist/assets/{browser-BqLqJVVT.js → browser-CiJ7-L32.js} +0 -0
- /package/client/dist/assets/{browser-rWKj-RR_2.js → browser-CvgDySd9.js} +0 -0
- /package/client/dist/assets/{browser-Cvg-QHvd2.js → browser-CyR1Kp3m2.js} +0 -0
- /package/client/dist/assets/{browser-FRv8P02E.js → browser-DwZljcRh2.js} +0 -0
- /package/client/dist/assets/{browser-Cc0iDqUi.js → browser-DxP-alBK.js} +0 -0
- /package/client/dist/assets/{browser-BijVYG0Y2.js → browser-rRCwi7Y7.js} +0 -0
- /package/client/dist/assets/{cameligo-6R45j6Ph.js → cameligo-DMUM7wLl.js} +0 -0
- /package/client/dist/assets/{chat-Bom6bqK3.js → chat-2rIB8HhT.js} +0 -0
- /package/client/dist/assets/{chat-vylxqR0P2.js → chat-BR8oe53x2.js} +0 -0
- /package/client/dist/assets/{chat-Dnwg-NpQ.js → chat-Bua03tty.js} +0 -0
- /package/client/dist/assets/{chat-BgL3zv6x2.js → chat-CZpAQan1.js} +0 -0
- /package/client/dist/assets/{chat-DsbwJhus.js → chat-CdY5SGvS.js} +0 -0
- /package/client/dist/assets/{chat-Bh3NdgJs.js → chat-DZyu3ImY2.js} +0 -0
- /package/client/dist/assets/{chat-DdwZjT8K2.js → chat-D_I7nU5K.js} +0 -0
- /package/client/dist/assets/{clojure-CLAAMO7J.js → clojure-Cm7r79vr.js} +0 -0
- /package/client/dist/assets/{clsx-CNmW0Nip.js → clsx-CjueKrWZ.js} +0 -0
- /package/client/dist/assets/{code-UPVvmAKM2.js → code-76gS0IdL.js} +0 -0
- /package/client/dist/assets/{code-BRcDlze52.js → code-C1VwxlML.js} +0 -0
- /package/client/dist/assets/{code-CeQ0FZpC.js → code-CnMZyJpr.js} +0 -0
- /package/client/dist/assets/{code-DgeHz9CB.js → code-D20ef9Cf2.js} +0 -0
- /package/client/dist/assets/{code-DzC1rMk12.js → code-DdOXaWRY.js} +0 -0
- /package/client/dist/assets/{code-CwnBPPyA.js → code-Duohuf9l.js} +0 -0
- /package/client/dist/assets/{code-BdMy3Ffq.js → code-geHmknB92.js} +0 -0
- /package/client/dist/assets/{coffee-AruSygo-.js → coffee-Ba7i2nA0.js} +0 -0
- /package/client/dist/assets/{commands-DkU0qliq.js → commands-B9RZO4qS.js} +0 -0
- /package/client/dist/assets/{commands-u-4eEHCN.js → commands-BEwbAjtD2.js} +0 -0
- /package/client/dist/assets/{commands-JWMfGDmr.js → commands-Bbxu8kLU.js} +0 -0
- /package/client/dist/assets/{commands-C4Y3C-PF2.js → commands-CDU3qv68.js} +0 -0
- /package/client/dist/assets/{commands-xHDDGfcP2.js → commands-CzezgtQj.js} +0 -0
- /package/client/dist/assets/{commands-CSDs9q_2.js → commands-DTQBF_q52.js} +0 -0
- /package/client/dist/assets/{commands-RHOchN4n2.js → commands-hOtKuOXc.js} +0 -0
- /package/client/dist/assets/{cpp-DEE5r4Pw.js → cpp-C7h46wYY.js} +0 -0
- /package/client/dist/assets/{csharp-BVXJUvbK.js → csharp-BKxtCVv1.js} +0 -0
- /package/client/dist/assets/{csp-cXOF0JoV.js → csp-bTuwJoIa.js} +0 -0
- /package/client/dist/assets/{css-C_zQuAoy.js → css-DIMkf-bt.js} +0 -0
- /package/client/dist/assets/{cypher-t95m_Q-O.js → cypher-CVaqCwHa.js} +0 -0
- /package/client/dist/assets/{dart-B4r1Tg-e.js → dart-onAF5SnQ.js} +0 -0
- /package/client/dist/assets/{dockerfile-6mt7zHQw.js → dockerfile-DZFCIeNp.js} +0 -0
- /package/client/dist/assets/{ecl-DEY_Fz_Q.js → ecl-D05T4iGw.js} +0 -0
- /package/client/dist/assets/{elixir-R6-q1c5t.js → elixir-6RTg0lbw.js} +0 -0
- /package/client/dist/assets/{explore-B7fblXBb2.js → explore-BG99VGpL.js} +0 -0
- /package/client/dist/assets/{explore-CNBzrEPS.js → explore-C0TjprJW2.js} +0 -0
- /package/client/dist/assets/{explore-C0k8HrkN.js → explore-C2dgEo7q.js} +0 -0
- /package/client/dist/assets/{explore-BHtEpoNN2.js → explore-C8NDHbob.js} +0 -0
- /package/client/dist/assets/{explore-Dahc1lOx.js → explore-CWWgzQGR.js} +0 -0
- /package/client/dist/assets/{explore-D_mWBYCS2.js → explore-CcQXpdtS.js} +0 -0
- /package/client/dist/assets/{explore-UvW1jEMa.js → explore-DsXAgnmJ2.js} +0 -0
- /package/client/dist/assets/{flow9-CNQvHBOt.js → flow9-C5_-GSwl.js} +0 -0
- /package/client/dist/assets/{format-command-CuWuRvka.js → format-command-Dfa1o2d-.js} +0 -0
- /package/client/dist/assets/{fsharp-vPZkFXwv.js → fsharp-C8Ef5oNN.js} +0 -0
- /package/client/dist/assets/{go-KUzBMYJ_.js → go-C-y9NEjX.js} +0 -0
- /package/client/dist/assets/{graphql-C3W0rCsD.js → graphql-fmXr3nnJ.js} +0 -0
- /package/client/dist/assets/{hcl-BOOMFSNX.js → hcl-CpzslTdj.js} +0 -0
- /package/client/dist/assets/{ini-CFat1WJr.js → ini-sBoK_t0W.js} +0 -0
- /package/client/dist/assets/{integrations-TAcYNh0b.js → integrations-CH0zy1Mw2.js} +0 -0
- /package/client/dist/assets/{integrations-C1ThkTC52.js → integrations-CIAjhd7L.js} +0 -0
- /package/client/dist/assets/{integrations-2YcNyAl3.js → integrations-CZdwOe8A.js} +0 -0
- /package/client/dist/assets/{integrations-BXCvXUlG2.js → integrations-Ct7omMld.js} +0 -0
- /package/client/dist/assets/{integrations-Crk2rFhL2.js → integrations-D6MSxy3-.js} +0 -0
- /package/client/dist/assets/{integrations-Dn4JiGtW.js → integrations-DbZa-Zyc.js} +0 -0
- /package/client/dist/assets/{integrations-D9YrJ_Ep.js → integrations-b8pH-vfl2.js} +0 -0
- /package/client/dist/assets/{java-Dee-CNAM.js → java-BEtHBSE6.js} +0 -0
- /package/client/dist/assets/{jira-D5efgwp_.js → jira-BySfUuQZ.js} +0 -0
- /package/client/dist/assets/{jira-bDs7Im2C.js → jira-Byw2C0F8.js} +0 -0
- /package/client/dist/assets/{jira-BHAKtc4B.js → jira-CNeYi06w2.js} +0 -0
- /package/client/dist/assets/{jira-Be369RIR2.js → jira-D11gPhxz.js} +0 -0
- /package/client/dist/assets/{jira-CPpgA-5z2.js → jira-D38Gj7AT.js} +0 -0
- /package/client/dist/assets/{jira-uNH1gETL2.js → jira-gAvOyije.js} +0 -0
- /package/client/dist/assets/{jira-DS7ownDy.js → jira-pRaL7JQo2.js} +0 -0
- /package/client/dist/assets/{julia-CGNlLYuU.js → julia-Bri6UV-V.js} +0 -0
- /package/client/dist/assets/{kotlin-CY7lhknJ.js → kotlin-BOotOW0E.js} +0 -0
- /package/client/dist/assets/{less-D0KN7hfJ.js → less-B9JPFI3C.js} +0 -0
- /package/client/dist/assets/{lexon-CuRJufPs.js → lexon-CfSJPG6W.js} +0 -0
- /package/client/dist/assets/{loops-LIgO_-eM.js → loops-CPpgMapU.js} +0 -0
- /package/client/dist/assets/{loops-DJNhp17p2.js → loops-CWWbKuVL.js} +0 -0
- /package/client/dist/assets/{loops-D6D3XHjj.js → loops-Crc9It8o2.js} +0 -0
- /package/client/dist/assets/{loops-CvOWsi5r.js → loops-DH2hZcbK2.js} +0 -0
- /package/client/dist/assets/{loops-vhJdbcz92.js → loops-DS5TmvIU2.js} +0 -0
- /package/client/dist/assets/{loops-K5_HXfJa.js → loops-P2f0cN8-.js} +0 -0
- /package/client/dist/assets/{loops-BvqQ-bHR2.js → loops-fJV-9hH7.js} +0 -0
- /package/client/dist/assets/{lua-DHvH62Zf.js → lua-CsQS60Ue.js} +0 -0
- /package/client/dist/assets/{m3-tlthQ8Fo.js → m3-D-oSqn_W.js} +0 -0
- /package/client/dist/assets/{markdown-Dbx1LgUZ.js → markdown-Cimd5fb3.js} +0 -0
- /package/client/dist/assets/{mcp-Dcl-XxkR.js → mcp-Czd_iyp02.js} +0 -0
- /package/client/dist/assets/{mcp-XJNRfxVp2.js → mcp-D2pc5GGx.js} +0 -0
- /package/client/dist/assets/{mcp-sRmWE8WJ.js → mcp-D4ZjtIx32.js} +0 -0
- /package/client/dist/assets/{mcp-DtbxuH3V2.js → mcp-DIfBUv2D2.js} +0 -0
- /package/client/dist/assets/{mcp-H-gnQUdN.js → mcp-DsTwmjST.js} +0 -0
- /package/client/dist/assets/{mcp-N1nzp8oL.js → mcp-SMkn8boG.js} +0 -0
- /package/client/dist/assets/{mcp-CjVKXAhD2.js → mcp-fSfiVYAc.js} +0 -0
- /package/client/dist/assets/{mips-D_O3IUz_.js → mips-CIPQ_RoX.js} +0 -0
- /package/client/dist/assets/{msdax-C_ZmCnRt.js → msdax-DauUninz.js} +0 -0
- /package/client/dist/assets/{mysql-C-dCEYSX.js → mysql-SOo6toE5.js} +0 -0
- /package/client/dist/assets/{nav-BElxljIF2.js → nav-BRJBxaGt2.js} +0 -0
- /package/client/dist/assets/{nav-COu2E_-L.js → nav-CAGKv3_F.js} +0 -0
- /package/client/dist/assets/{nav-BXO7PJJG2.js → nav-CNskRJKQ2.js} +0 -0
- /package/client/dist/assets/{nav-CW9pxWfC2.js → nav-DY93irBL.js} +0 -0
- /package/client/dist/assets/{nav-CXHUA4uf.js → nav-DhjvYgqt.js} +0 -0
- /package/client/dist/assets/{nav-DdHF5VWJ.js → nav-Gb-r4wop.js} +0 -0
- /package/client/dist/assets/{nav-C8kOuGh8.js → nav-TvumAFD22.js} +0 -0
- /package/client/dist/assets/{objective-c-DZY9Aqxd.js → objective-c-FvmIjYaQ.js} +0 -0
- /package/client/dist/assets/{pascal-BVHLXoor.js → pascal-DrH0SRf2.js} +0 -0
- /package/client/dist/assets/{pascaligo-XdG_6u3k.js → pascaligo-D-ptJ9y-.js} +0 -0
- /package/client/dist/assets/{perl-b9QV0BcD.js → perl-oz_6vUea.js} +0 -0
- /package/client/dist/assets/{pgsql-Du5FDOgT.js → pgsql-DTj74zXo.js} +0 -0
- /package/client/dist/assets/{php-WJD0z2Z_.js → php-nr791fC2.js} +0 -0
- /package/client/dist/assets/{pla-CbciTf2w.js → pla-CopQ2nXW.js} +0 -0
- /package/client/dist/assets/{postiats-C1QxmvVq.js → postiats-43DmfD33.js} +0 -0
- /package/client/dist/assets/{powerquery-BEYDhPLZ.js → powerquery-D3hlyOfw.js} +0 -0
- /package/client/dist/assets/{powershell-CfaYw4XL.js → powershell-DmHpPYUd.js} +0 -0
- /package/client/dist/assets/{protobuf-pwZEDOYa.js → protobuf-C531GsRP.js} +0 -0
- /package/client/dist/assets/{pug-5ftqSPVe.js → pug-Z5eAx3Zn.js} +0 -0
- /package/client/dist/assets/{qsharp-uI6qZMq4.js → qsharp-DkqhCAOL.js} +0 -0
- /package/client/dist/assets/{r-BK54P1EG.js → r-BwWrilGY.js} +0 -0
- /package/client/dist/assets/{redis-DI0yd7kN.js → redis-ClamHrr6.js} +0 -0
- /package/client/dist/assets/{redshift-Dov26eyI.js → redshift-DT7zqm-g.js} +0 -0
- /package/client/dist/assets/{restructuredtext-QqJ_1dC-.js → restructuredtext-BYgofb2h.js} +0 -0
- /package/client/dist/assets/{ruby-5WjveeVb.js → ruby-DezsRK8O.js} +0 -0
- /package/client/dist/assets/{rust-BzVSfqFH.js → rust-DdL9SqIa.js} +0 -0
- /package/client/dist/assets/{sb-DMIUfT-3.js → sb-CcwsVR0C.js} +0 -0
- /package/client/dist/assets/{scala-CSKA7lqt.js → scala-DHpiXF5c.js} +0 -0
- /package/client/dist/assets/{scheme-CojOP2Qc.js → scheme-BeGwcela.js} +0 -0
- /package/client/dist/assets/{scss-DoBZGJG6.js → scss-gp-XZpBa.js} +0 -0
- /package/client/dist/assets/{settings-1w1O5Og82.js → settings-B9ilOSYO.js} +0 -0
- /package/client/dist/assets/{settings-Jc46vUhd.js → settings-BqlWHRHA.js} +0 -0
- /package/client/dist/assets/{settings-BSihkr0e.js → settings-D8dlqt4d.js} +0 -0
- /package/client/dist/assets/{settings-BiDOB3hV2.js → settings-DAZqjX2a2.js} +0 -0
- /package/client/dist/assets/{settings-DNL68KTE.js → settings-DRh39v1S2.js} +0 -0
- /package/client/dist/assets/{settings-BoubJhDP2.js → settings-Mj1OJbfd2.js} +0 -0
- /package/client/dist/assets/{settings-CB-EZ_W8.js → settings-lRReaSYm.js} +0 -0
- /package/client/dist/assets/{setup-D84y3wx-.js → setup-CGZjy2IF2.js} +0 -0
- /package/client/dist/assets/{setup-BuQNKztt2.js → setup-CXa0Sx16.js} +0 -0
- /package/client/dist/assets/{setup-BwMovM9z2.js → setup-D2ktKKMF2.js} +0 -0
- /package/client/dist/assets/{setup-DU0ULX8q2.js → setup-DG2H7ha5.js} +0 -0
- /package/client/dist/assets/{setup-BXpw07r-.js → setup-DK5bHDUq2.js} +0 -0
- /package/client/dist/assets/{setup-7J8TjG4O.js → setup-DrWlIQTZ.js} +0 -0
- /package/client/dist/assets/{setup-BiduSX9d.js → setup-rzHUVgAu.js} +0 -0
- /package/client/dist/assets/{shell-YOaE4udl.js → shell-CC2rA5mh.js} +0 -0
- /package/client/dist/assets/{solidity-l3jSyVLu.js → solidity-BEEn4gHE.js} +0 -0
- /package/client/dist/assets/{sophia-BhSGTaQJ.js → sophia-CRfGWb83.js} +0 -0
- /package/client/dist/assets/{sparql-qhk6QD9w.js → sparql-D_Lu-MrJ.js} +0 -0
- /package/client/dist/assets/{specs-CWtKcVDC.js → specs-BcyxaCwf2.js} +0 -0
- /package/client/dist/assets/{specs-DTplt2XM.js → specs-C1q9geAi.js} +0 -0
- /package/client/dist/assets/{specs-PozUNhqb.js → specs-CLZKysq-2.js} +0 -0
- /package/client/dist/assets/{specs-C9Sd7BhH2.js → specs-DZMS9o54.js} +0 -0
- /package/client/dist/assets/{specs-D2clrt2c2.js → specs-Dm6zUI-R.js} +0 -0
- /package/client/dist/assets/{specs-CBDvEYKv.js → specs-V3TvhKLX.js} +0 -0
- /package/client/dist/assets/{specs-CIPr9reA2.js → specs-dV3Mq5Mu2.js} +0 -0
- /package/client/dist/assets/{sql-DoO3y21-.js → sql-NEE52Syq.js} +0 -0
- /package/client/dist/assets/{st-ChZAY8oG.js → st-DbInun42.js} +0 -0
- /package/client/dist/assets/{swift-D290Tr7_.js → swift-Bxkupp3x.js} +0 -0
- /package/client/dist/assets/{systemverilog-DsxzgJ-o.js → systemverilog-Bz4Y3fRF.js} +0 -0
- /package/client/dist/assets/{tcl-BKDUHAAR.js → tcl-DISqw1ZD.js} +0 -0
- /package/client/dist/assets/{terminal-De2Brd23.js → terminal-BZiIu3rf.js} +0 -0
- /package/client/dist/assets/{terminal-cqfd3EDV.js → terminal-C2NAd7BW2.js} +0 -0
- /package/client/dist/assets/{terminal-WSAvHXoU.js → terminal-IahE4LW92.js} +0 -0
- /package/client/dist/assets/{terminal-Z7KsDM_n.js → terminal-QpXZU2Bn2.js} +0 -0
- /package/client/dist/assets/{terminal-xGbCZJHg.js → terminal-ScjyXNxQ.js} +0 -0
- /package/client/dist/assets/{terminal-BRm03iFA2.js → terminal-d7GadXbN.js} +0 -0
- /package/client/dist/assets/{terminal-DxQWCqSD2.js → terminal-tITa81iz.js} +0 -0
- /package/client/dist/assets/{twig-UpZQaM8G.js → twig-De2hgUGE.js} +0 -0
- /package/client/dist/assets/{typespec-DzaKvN8i.js → typespec-B8J7ngcE.js} +0 -0
- /package/client/dist/assets/{vb-CZpbb7tk.js → vb-DV3o63ZY.js} +0 -0
- /package/client/dist/assets/{wgsl-CNt3OIvl.js → wgsl-DpFanUEy.js} +0 -0
|
@@ -27,7 +27,9 @@ const rail_worktree_release_1 = require("./rail-worktree-release");
|
|
|
27
27
|
const project_git_1 = require("./project-git");
|
|
28
28
|
const pr_publisher_1 = require("./pr-publisher");
|
|
29
29
|
const ids_1 = require("./ids");
|
|
30
|
+
const repo_lock_1 = require("./repo-lock");
|
|
30
31
|
const agent_chat_registry_1 = require("./agent-chat-registry");
|
|
32
|
+
const process_admission_1 = require("./process-admission");
|
|
31
33
|
const VALID_MODES = new Set(['implement', 'batch-implement', 'freestyle', 'loop']);
|
|
32
34
|
// Models the freestyle picker exposes (Claude aliases). Mirrors the client
|
|
33
35
|
// RailModelSelector options and the project-router orchestrator-model allow-list.
|
|
@@ -38,10 +40,20 @@ const VALID_REASONING_EFFORTS = new Set(['low', 'medium', 'high']);
|
|
|
38
40
|
function prDeliveryContinuesTickets(delivery, ticketIds) {
|
|
39
41
|
if (delivery.decision !== 'pr_draft' && delivery.decision !== 'pr_ready')
|
|
40
42
|
return false;
|
|
41
|
-
if (!delivery.prUrl || !delivery.branch || delivery.prState !== 'pr-created')
|
|
43
|
+
if (!delivery.prUrl || !delivery.branch || !delivery.deliverySha || delivery.prState !== 'pr-created')
|
|
42
44
|
return false;
|
|
43
45
|
const covered = new Set(delivery.ticketIds);
|
|
44
|
-
|
|
46
|
+
const requested = new Set(ticketIds);
|
|
47
|
+
return requested.size > 0 && requested.size === covered.size && [...requested].every((id) => covered.has(id));
|
|
48
|
+
}
|
|
49
|
+
function prDeliveryCheckoutBlock(delivery) {
|
|
50
|
+
if (delivery.deliveryOutcome === 'blocked') {
|
|
51
|
+
return 'delivery is blocked and has no safely checkoutable result';
|
|
52
|
+
}
|
|
53
|
+
if (!delivery.deliverySha) {
|
|
54
|
+
return 'delivery has no verified commit available for checkout';
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
45
57
|
}
|
|
46
58
|
function emitPrDeliveryUpdate(c, prDeliveryId) {
|
|
47
59
|
const row = (0, rail_pr_store_1.getPrDelivery)(c.db, prDeliveryId);
|
|
@@ -53,11 +65,6 @@ function emitPrDeliveryUpdate(c, prDeliveryId) {
|
|
|
53
65
|
(0, agent_chat_registry_1.getAgentChatManager)()?.updatePrDecisionCard(row.origin_conversation_id, (0, rail_pr_store_1.toPrDecisionCardEnvelope)(c.project.id, snap));
|
|
54
66
|
}
|
|
55
67
|
}
|
|
56
|
-
function reconcileAndEmitFailedPrDeliveries(c) {
|
|
57
|
-
for (const row of (0, rail_pr_store_1.reconcileFailedBuildingPrDeliveries)(c.db)) {
|
|
58
|
-
emitPrDeliveryUpdate(c, row.id);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
68
|
function createRailsRouter() {
|
|
62
69
|
const router = (0, express_1.Router)({ mergeParams: true });
|
|
63
70
|
function ctx(req) {
|
|
@@ -121,7 +128,6 @@ function createRailsRouter() {
|
|
|
121
128
|
// (non-terminal) delivery per rail slot, so a refreshed client re-renders
|
|
122
129
|
// the decision surface without waiting for a broadcast. The store lists
|
|
123
130
|
// newest-first within each rail — keep the first per index.
|
|
124
|
-
reconcileAndEmitFailedPrDeliveries(c);
|
|
125
131
|
const prDeliveries = {};
|
|
126
132
|
for (const row of (0, rail_pr_store_1.listActivePrDeliveries)(c.db)) {
|
|
127
133
|
if (!(row.rail_index in prDeliveries))
|
|
@@ -166,10 +172,11 @@ function createRailsRouter() {
|
|
|
166
172
|
res.status(500).json({ error: 'Failed to create rail' });
|
|
167
173
|
}
|
|
168
174
|
});
|
|
169
|
-
// DELETE /rails/:railIndex — remove a rail slot
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
-
//
|
|
175
|
+
// DELETE /rails/:railIndex — remove a rail slot and release its ticket
|
|
176
|
+
// assignments as one transaction. All rejection guards run before the
|
|
177
|
+
// delete, so a failed last/active/pending-PR deletion cannot strand tickets
|
|
178
|
+
// in an unassigned intermediate state. Indices are identity — deleting a
|
|
179
|
+
// middle rail leaves a gap (never re-numbered).
|
|
173
180
|
router.delete('/:railIndex', (req, res) => {
|
|
174
181
|
const railIndex = parseInt(req.params.railIndex, 10);
|
|
175
182
|
if (isNaN(railIndex) || railIndex < 0 || railIndex >= rails_store_1.MAX_RAILS) {
|
|
@@ -192,10 +199,6 @@ function createRailsRouter() {
|
|
|
192
199
|
res.status(409).json({ error: 'rail_active' });
|
|
193
200
|
return;
|
|
194
201
|
}
|
|
195
|
-
if ((0, rails_store_1.getRail)(c.db, railIndex).ticketIds.length > 0) {
|
|
196
|
-
res.status(409).json({ error: 'rail_not_empty' });
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
202
|
const pending = (0, rail_pr_store_1.getActivePrDeliveryByRail)(c.db, railIndex);
|
|
200
203
|
if (pending) {
|
|
201
204
|
res.status(409).json({ error: 'pr_decision_pending', prDeliveryId: pending.id });
|
|
@@ -405,6 +408,16 @@ function createRailsRouter() {
|
|
|
405
408
|
// capability) decides, so the launch no longer passes an explicit flag. A
|
|
406
409
|
// legacy `interactive` body param is accepted and ignored (wire compat).
|
|
407
410
|
const c = ctx(req);
|
|
411
|
+
try {
|
|
412
|
+
(0, process_admission_1.assertProcessAdmission)(c.project.id);
|
|
413
|
+
}
|
|
414
|
+
catch (err) {
|
|
415
|
+
if (err instanceof process_admission_1.ProcessAdmissionClosedError) {
|
|
416
|
+
res.status(409).json({ error: 'project_recovery_in_progress' });
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
throw err;
|
|
420
|
+
}
|
|
408
421
|
const rail = (0, rails_store_1.getRail)(c.db, railIndex);
|
|
409
422
|
if (rail.ticketIds.length === 0) {
|
|
410
423
|
res.status(400).json({ error: 'Rail has no tickets assigned' });
|
|
@@ -543,31 +556,47 @@ function createRailsRouter() {
|
|
|
543
556
|
// client so a silent fallback (no delivery row → no implementation
|
|
544
557
|
// cards) is diagnosable from the UI, not just the server log.
|
|
545
558
|
let isolationUnavailableDetail;
|
|
546
|
-
let
|
|
547
|
-
let fallbackPrDeliveryId = null;
|
|
559
|
+
let continuablePrDelivery = null;
|
|
548
560
|
// Read-only vs mutating is DERIVED from the loop's nodes (see loop-effect),
|
|
549
561
|
// not a user flag — a content-read-only loop (no ai-step/shell) never writes,
|
|
550
562
|
// so it is not isolated; anything that can write is.
|
|
551
563
|
const loopReadOnly = (0, loop_effect_1.classifyLoopEffect)(loopGraph) === 'read-only';
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
if ((
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
if (pendingSnapshot && !prDeliveryContinuesTickets(pendingSnapshot, rail.ticketIds)) {
|
|
562
|
-
res.status(409).json({ error: 'pr_decision_pending', prDeliveryId: pendingSnapshot.id });
|
|
563
|
-
return;
|
|
564
|
-
}
|
|
565
|
-
continuablePrDeliveryForFallback = pendingSnapshot;
|
|
564
|
+
// Relaunch collision (ask-first PR delivery): this guard must run even
|
|
565
|
+
// when the worktree kill-switch is off. Otherwise a published PR follow-
|
|
566
|
+
// up silently drops to shared cwd and can commit on the ambient branch.
|
|
567
|
+
if ((0, rail_isolation_1.isRailPrDeliveryEnabled)()) {
|
|
568
|
+
const pending = (0, rail_pr_store_1.getActivePrDeliveryByRail)(c.db, railIndex);
|
|
569
|
+
const pendingSnapshot = pending ? (0, rail_pr_store_1.toPrDeliverySnapshot)(pending) : null;
|
|
570
|
+
if (pendingSnapshot && !prDeliveryContinuesTickets(pendingSnapshot, rail.ticketIds)) {
|
|
571
|
+
res.status(409).json({ error: 'pr_decision_pending', prDeliveryId: pendingSnapshot.id });
|
|
572
|
+
return;
|
|
566
573
|
}
|
|
574
|
+
continuablePrDelivery = pendingSnapshot;
|
|
575
|
+
}
|
|
576
|
+
const useIsolation = (0, rail_isolation_1.isolationApplies)({
|
|
577
|
+
loopsEnabled: (0, feature_flags_1.isLoopsEnabled)(), scope, ticketCount: rail.ticketIds.length, readOnly: loopReadOnly,
|
|
578
|
+
});
|
|
579
|
+
if (continuablePrDelivery && !loopReadOnly && !useIsolation) {
|
|
580
|
+
res.status(409).json({
|
|
581
|
+
error: 'pr_continuation_isolation_required',
|
|
582
|
+
detail: `Cannot continue PR branch ${continuablePrDelivery.branch} while worktree isolation is disabled.`,
|
|
583
|
+
action: 'Enable rail worktrees and retry; PR continuations never run in the shared project checkout.',
|
|
584
|
+
});
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
if (useIsolation) {
|
|
567
588
|
// Worktree isolation needs a git repo WITH at least one commit (an
|
|
568
589
|
// unborn HEAD can't be branched). Fall back (with a message) otherwise.
|
|
569
590
|
const status = await (0, worktree_manager_1.repoIsolationStatus)(worktree_manager_1.defaultGitRunner, c.project.path);
|
|
570
591
|
if (status !== 'ok') {
|
|
592
|
+
if (continuablePrDelivery) {
|
|
593
|
+
res.status(409).json({
|
|
594
|
+
error: 'pr_continuation_isolation_required',
|
|
595
|
+
detail: `Cannot continue PR branch ${continuablePrDelivery.branch} because worktree isolation is unavailable (${status}).`,
|
|
596
|
+
action: 'Restore a git repository with a committed HEAD, ensure the PR branch is free for a dedicated worktree, then retry.',
|
|
597
|
+
});
|
|
598
|
+
return;
|
|
599
|
+
}
|
|
571
600
|
isolationUnavailable = status; // 'no-git' | 'no-commits'
|
|
572
601
|
console.warn(`[rails-router] worktree isolation unavailable (${status}); running shared cwd`);
|
|
573
602
|
}
|
|
@@ -578,13 +607,38 @@ function createRailsRouter() {
|
|
|
578
607
|
provider: loopProvider, model: loopModel, effort, scope,
|
|
579
608
|
originSurface: originSurface ?? 'dashboard',
|
|
580
609
|
originConversationId: originConversationId ?? null,
|
|
581
|
-
|
|
582
|
-
|
|
610
|
+
...(continuablePrDelivery ? {
|
|
611
|
+
requiredPrContinuation: {
|
|
612
|
+
deliveryId: continuablePrDelivery.id,
|
|
613
|
+
decision: continuablePrDelivery.decision,
|
|
614
|
+
branch: continuablePrDelivery.branch,
|
|
615
|
+
baseBranch: continuablePrDelivery.baseBranch,
|
|
616
|
+
prUrl: continuablePrDelivery.prUrl,
|
|
617
|
+
prNumber: continuablePrDelivery.prNumber,
|
|
618
|
+
deliverySha: continuablePrDelivery.deliverySha,
|
|
619
|
+
},
|
|
620
|
+
} : {}),
|
|
583
621
|
});
|
|
584
622
|
res.status(202).json({ loopRunIds: ids, railIndex, mode, isolated: true });
|
|
585
623
|
return;
|
|
586
624
|
}
|
|
587
625
|
catch (err) {
|
|
626
|
+
if (err instanceof rail_pr_store_1.PrDeliveryGenerationConflict) {
|
|
627
|
+
res.status(409).json({
|
|
628
|
+
error: 'pr_delivery_generation_conflict',
|
|
629
|
+
prDeliveryId: err.currentId,
|
|
630
|
+
});
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
if (continuablePrDelivery || err instanceof rail_isolated_launch_1.PrContinuationIsolationError) {
|
|
634
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
635
|
+
res.status(409).json({
|
|
636
|
+
error: 'pr_continuation_isolation_required',
|
|
637
|
+
detail,
|
|
638
|
+
action: 'Ensure the PR branch is available for a dedicated git worktree, then retry.',
|
|
639
|
+
});
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
588
642
|
console.error('[rails-router] isolated launch failed; falling back to shared cwd:', err);
|
|
589
643
|
isolationUnavailable = 'error';
|
|
590
644
|
isolationUnavailableDetail = err instanceof Error ? err.message : String(err);
|
|
@@ -596,9 +650,9 @@ function createRailsRouter() {
|
|
|
596
650
|
// via SPECRAILS_REPO_DIR + `--add-dir` exactly like QueueManager.
|
|
597
651
|
const loopExec = (0, workspace_resolution_1.resolveProjectExecution)({ slug: c.project.slug, path: c.project.path });
|
|
598
652
|
const loopRunIds = [];
|
|
599
|
-
const
|
|
653
|
+
const loopTicketCompletionStatus = (0, rail_isolation_1.isRailPrDeliveryEnabled)() ? 'on_review' : 'done';
|
|
600
654
|
const launchLoopRun = (runId, ticketIds, spec) => {
|
|
601
|
-
c.railLoopRuns.set(runId, { railIndex, ticketIds });
|
|
655
|
+
c.railLoopRuns.set(runId, { railIndex, ticketIds, requiresTerminalIntent: true });
|
|
602
656
|
// Code-Explorer provenance for shared-cwd loop runs (isolated runs
|
|
603
657
|
// record inside rail-isolated-launch): snapshot the REPO before the
|
|
604
658
|
// run, diff + record at settle. Loop runs settle outside QueueManager,
|
|
@@ -641,6 +695,7 @@ function createRailsRouter() {
|
|
|
641
695
|
railIndex,
|
|
642
696
|
ticketId: ticketIds[0],
|
|
643
697
|
spec: spec ? { ...spec, ticketIds } : { ticketIds },
|
|
698
|
+
ticketCompletionStatus: loopTicketCompletionStatus,
|
|
644
699
|
constants: (0, loop_constants_1.loadConstantMap)(c.desktopDb),
|
|
645
700
|
provider: loopProvider,
|
|
646
701
|
model: loopModel,
|
|
@@ -657,7 +712,7 @@ function createRailsRouter() {
|
|
|
657
712
|
c.onLoopRunFinished(runId, 'failed');
|
|
658
713
|
return false;
|
|
659
714
|
});
|
|
660
|
-
|
|
715
|
+
void runPromise;
|
|
661
716
|
loopRunIds.push(runId);
|
|
662
717
|
try {
|
|
663
718
|
c.jiraSyncManager.onRailLaunch(ticketIds, runId);
|
|
@@ -675,60 +730,6 @@ function createRailsRouter() {
|
|
|
675
730
|
launchLoopRun((0, ids_1.newId)(), [ticketId], c.getTicketSpec(ticketId));
|
|
676
731
|
}
|
|
677
732
|
}
|
|
678
|
-
if (fallbackPrDeliveryId) {
|
|
679
|
-
const row = (0, rail_pr_store_1.getPrDelivery)(c.db, fallbackPrDeliveryId);
|
|
680
|
-
const isExistingPrIteration = row?.decision === 'building' && row.pr_state === 'pr-created' && Boolean(row.pr_url && row.branch);
|
|
681
|
-
if (isExistingPrIteration) {
|
|
682
|
-
if ((0, rail_pr_store_1.transitionDecision)(c.db, fallbackPrDeliveryId, 'building', 'building', { runIds: loopRunIds })) {
|
|
683
|
-
emitPrDeliveryUpdate(c, fallbackPrDeliveryId);
|
|
684
|
-
}
|
|
685
|
-
void Promise.allSettled(sharedRunSettles).then((settled) => {
|
|
686
|
-
void (async () => {
|
|
687
|
-
const current = (0, rail_pr_store_1.getPrDelivery)(c.db, fallbackPrDeliveryId);
|
|
688
|
-
if (current?.decision !== 'building')
|
|
689
|
-
return;
|
|
690
|
-
if (current.pr_state === 'pr-created' && current.pr_url && current.branch) {
|
|
691
|
-
const succeeded = settled.every((s) => s.status === 'fulfilled' && s.value === true);
|
|
692
|
-
if (!succeeded) {
|
|
693
|
-
if ((0, rail_pr_store_1.transitionDecision)(c.db, fallbackPrDeliveryId, 'building', 'implementation_failed')) {
|
|
694
|
-
emitPrDeliveryUpdate(c, fallbackPrDeliveryId);
|
|
695
|
-
}
|
|
696
|
-
return;
|
|
697
|
-
}
|
|
698
|
-
const commit = await (0, worktree_manager_1.commitWorktreeAndVerify)(worktree_manager_1.defaultGitRunner, c.project.path, `specrails: PR follow-up (${loopRunIds.join(', ')})`);
|
|
699
|
-
if (!commit.clean) {
|
|
700
|
-
console.error(`[rails-router] existing PR fallback commit verification failed: ${commit.error ?? 'dirty worktree'}${commit.dirty.length > 0 ? `; dirty=${commit.dirty.slice(0, 8).join(', ')}` : ''}`);
|
|
701
|
-
if ((0, rail_pr_store_1.transitionDecision)(c.db, fallbackPrDeliveryId, 'building', 'implementation_failed')) {
|
|
702
|
-
emitPrDeliveryUpdate(c, fallbackPrDeliveryId);
|
|
703
|
-
}
|
|
704
|
-
return;
|
|
705
|
-
}
|
|
706
|
-
const pushed = await (0, pr_publisher_1.pushBranch)(pr_publisher_1.defaultExec, {
|
|
707
|
-
repoDir: c.project.path,
|
|
708
|
-
branch: current.branch,
|
|
709
|
-
baseBranch: current.base_branch,
|
|
710
|
-
});
|
|
711
|
-
if (pushed.state === 'local-only') {
|
|
712
|
-
if ((0, rail_pr_store_1.transitionDecision)(c.db, fallbackPrDeliveryId, 'building', 'pr_failed', { prState: 'local-only' })) {
|
|
713
|
-
emitPrDeliveryUpdate(c, fallbackPrDeliveryId);
|
|
714
|
-
}
|
|
715
|
-
return;
|
|
716
|
-
}
|
|
717
|
-
if ((0, rail_pr_store_1.transitionDecision)(c.db, fallbackPrDeliveryId, 'building', 'pr_ready', { prState: 'pr-created' })) {
|
|
718
|
-
emitPrDeliveryUpdate(c, fallbackPrDeliveryId);
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
})().catch((err) => {
|
|
722
|
-
console.error('[rails-router] existing PR fallback push failed:', err);
|
|
723
|
-
if (fallbackPrDeliveryId) {
|
|
724
|
-
if ((0, rail_pr_store_1.transitionDecision)(c.db, fallbackPrDeliveryId, 'building', 'pr_failed', { prState: 'local-only' })) {
|
|
725
|
-
emitPrDeliveryUpdate(c, fallbackPrDeliveryId);
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
});
|
|
729
|
-
});
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
733
|
res.status(202).json({
|
|
733
734
|
loopRunIds, railIndex, mode,
|
|
734
735
|
...(isolationUnavailable ? { isolationUnavailable } : {}),
|
|
@@ -890,7 +891,8 @@ function createRailsRouter() {
|
|
|
890
891
|
});
|
|
891
892
|
// POST /rails/pr-decision — the ONE decision action (safe-pr-review-flow) both
|
|
892
893
|
// surfaces (dashboard rail row + agent-chat card) call on a rail_pr_deliveries
|
|
893
|
-
// row: create-pr | publish | discard | poll
|
|
894
|
+
// row: create-pr | publish | discard/dismiss | poll/reopen | merge-local |
|
|
895
|
+
// acknowledge-no-changes | recover-and-retry, compare-and-set-guarded by
|
|
894
896
|
// expectedDecision (a raced concurrent answer loses with 409 stale_decision).
|
|
895
897
|
// Replaces the stateless v1 POST /rails/pr-review passthrough. The route only
|
|
896
898
|
// validates and delegates — the action logic lives in rail-pr-decision.ts.
|
|
@@ -903,7 +905,7 @@ function createRailsRouter() {
|
|
|
903
905
|
return;
|
|
904
906
|
}
|
|
905
907
|
if (!(0, rail_pr_decision_1.isPrDecisionAction)(action)) {
|
|
906
|
-
res.status(400).json({ error:
|
|
908
|
+
res.status(400).json({ error: `action must be one of: ${rail_pr_decision_1.PR_DECISION_ACTIONS.join(', ')}` });
|
|
907
909
|
return;
|
|
908
910
|
}
|
|
909
911
|
if (typeof expectedDecision !== 'string' || !expectedDecision) {
|
|
@@ -911,17 +913,40 @@ function createRailsRouter() {
|
|
|
911
913
|
return;
|
|
912
914
|
}
|
|
913
915
|
try {
|
|
914
|
-
const
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
916
|
+
const admission = (0, process_admission_1.captureProcessAdmission)(c.project.id);
|
|
917
|
+
const execute = () => {
|
|
918
|
+
admission.assertCurrent();
|
|
919
|
+
return (0, rail_pr_decision_1.executePrDecision)({
|
|
920
|
+
db: c.db,
|
|
921
|
+
project: { id: c.project.id, slug: c.project.slug, path: c.project.path },
|
|
922
|
+
git: worktree_manager_1.defaultGitRunner,
|
|
923
|
+
exec: pr_publisher_1.defaultExec,
|
|
924
|
+
broadcast: c.broadcast,
|
|
925
|
+
jiraSyncManager: c.jiraSyncManager,
|
|
926
|
+
assertAdmission: () => admission.assertCurrent(),
|
|
927
|
+
}, { prDeliveryId, action, expectedDecision });
|
|
928
|
+
};
|
|
929
|
+
// Every decision that can touch refs/worktrees shares the same project
|
|
930
|
+
// mutex as startup reconciliation, launch allocation and checkout. Local
|
|
931
|
+
// merge already acquires it internally to keep its guarded read/advance
|
|
932
|
+
// sequence atomic, so avoid nesting that non-reentrant lock.
|
|
933
|
+
const result = action === 'merge-local'
|
|
934
|
+
? await execute()
|
|
935
|
+
: await (0, repo_lock_1.withRepoLock)(c.project.path, execute);
|
|
936
|
+
// The durable row is authoritative. Return its post-action snapshot even
|
|
937
|
+
// when the WebSocket broadcast is dropped or another surface won the
|
|
938
|
+
// race; clients can converge immediately without optimistic inference.
|
|
939
|
+
const current = (0, rail_pr_store_1.getPrDelivery)(c.db, prDeliveryId);
|
|
940
|
+
res.status(result.status).json({
|
|
941
|
+
...result.body,
|
|
942
|
+
...(current ? { snapshot: (0, rail_pr_store_1.toPrDeliverySnapshot)(current) } : {}),
|
|
943
|
+
});
|
|
923
944
|
}
|
|
924
945
|
catch (err) {
|
|
946
|
+
if (err instanceof process_admission_1.ProcessAdmissionClosedError) {
|
|
947
|
+
res.status(409).json({ error: 'project_recovery_in_progress' });
|
|
948
|
+
return;
|
|
949
|
+
}
|
|
925
950
|
console.error('[rails-router] pr-decision error:', err);
|
|
926
951
|
res.status(500).json({ error: 'pr-decision failed', detail: err.message });
|
|
927
952
|
}
|
|
@@ -938,38 +963,131 @@ function createRailsRouter() {
|
|
|
938
963
|
res.status(400).json({ error: 'prDeliveryId is required' });
|
|
939
964
|
return;
|
|
940
965
|
}
|
|
966
|
+
let admission;
|
|
967
|
+
try {
|
|
968
|
+
admission = (0, process_admission_1.captureProcessAdmission)(c.project.id);
|
|
969
|
+
}
|
|
970
|
+
catch (err) {
|
|
971
|
+
if (err instanceof process_admission_1.ProcessAdmissionClosedError) {
|
|
972
|
+
res.status(409).json({ error: 'project_recovery_in_progress' });
|
|
973
|
+
return;
|
|
974
|
+
}
|
|
975
|
+
throw err;
|
|
976
|
+
}
|
|
941
977
|
const row = (0, rail_pr_store_1.getPrDelivery)(c.db, prDeliveryId);
|
|
942
978
|
if (!row) {
|
|
943
979
|
res.status(404).json({ error: 'Unknown prDeliveryId' });
|
|
944
980
|
return;
|
|
945
981
|
}
|
|
982
|
+
const active = (0, rail_pr_store_1.getActivePrDeliveryByRail)(c.db, row.rail_index);
|
|
983
|
+
if (!active || active.id !== row.id) {
|
|
984
|
+
res.status(409).json({
|
|
985
|
+
error: 'stale_decision',
|
|
986
|
+
current: active?.decision ?? null,
|
|
987
|
+
currentPrDeliveryId: active?.id ?? null,
|
|
988
|
+
});
|
|
989
|
+
return;
|
|
990
|
+
}
|
|
946
991
|
const snap = (0, rail_pr_store_1.toPrDeliverySnapshot)(row);
|
|
992
|
+
const checkoutBlock = prDeliveryCheckoutBlock(snap);
|
|
993
|
+
if (checkoutBlock) {
|
|
994
|
+
res.status(409).json({ error: 'checkout_not_deliverable', detail: checkoutBlock });
|
|
995
|
+
return;
|
|
996
|
+
}
|
|
947
997
|
if (!snap.branch || !snap.prUrl) {
|
|
948
998
|
res.status(409).json({ error: 'checkout_unavailable', detail: 'delivery has no PR branch' });
|
|
949
999
|
return;
|
|
950
1000
|
}
|
|
951
1001
|
try {
|
|
952
|
-
const
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
1002
|
+
const outcome = await (0, repo_lock_1.withRepoLock)(c.project.path, async () => {
|
|
1003
|
+
admission.assertCurrent();
|
|
1004
|
+
const current = (0, rail_pr_store_1.getActivePrDeliveryByRail)(c.db, row.rail_index);
|
|
1005
|
+
if (!current || current.id !== row.id) {
|
|
1006
|
+
return {
|
|
1007
|
+
ok: false,
|
|
1008
|
+
status: 409,
|
|
1009
|
+
error: 'stale_decision',
|
|
1010
|
+
detail: 'The delivery generation changed before checkout.',
|
|
1011
|
+
};
|
|
1012
|
+
}
|
|
1013
|
+
const currentSnap = (0, rail_pr_store_1.toPrDeliverySnapshot)(current);
|
|
1014
|
+
const currentCheckoutBlock = prDeliveryCheckoutBlock(currentSnap);
|
|
1015
|
+
if (currentCheckoutBlock) {
|
|
1016
|
+
return {
|
|
1017
|
+
ok: false,
|
|
1018
|
+
status: 409,
|
|
1019
|
+
error: 'checkout_not_deliverable',
|
|
1020
|
+
detail: currentCheckoutBlock,
|
|
1021
|
+
};
|
|
1022
|
+
}
|
|
1023
|
+
if (!currentSnap.branch || !currentSnap.prUrl) {
|
|
1024
|
+
return {
|
|
1025
|
+
ok: false,
|
|
1026
|
+
status: 409,
|
|
1027
|
+
error: 'checkout_not_deliverable',
|
|
1028
|
+
detail: 'The current delivery no longer has an attached PR branch.',
|
|
1029
|
+
};
|
|
1030
|
+
}
|
|
1031
|
+
const cleanliness = await (0, project_git_1.inspectProjectCheckoutCleanliness)(c.project.path);
|
|
1032
|
+
if (!cleanliness.ok) {
|
|
1033
|
+
return {
|
|
1034
|
+
ok: false,
|
|
1035
|
+
status: 409,
|
|
1036
|
+
error: 'checkout_safety_unknown',
|
|
1037
|
+
detail: cleanliness.detail,
|
|
1038
|
+
};
|
|
1039
|
+
}
|
|
1040
|
+
if (!cleanliness.clean) {
|
|
1041
|
+
return { ok: false, status: 409, error: 'checkout_dirty', detail: 'Working tree has uncommitted changes. Commit or stash them before checkout.' };
|
|
1042
|
+
}
|
|
1043
|
+
const info = await (0, project_git_1.getProjectGitInfo)(c.project.path);
|
|
1044
|
+
if (!info.git) {
|
|
1045
|
+
return { ok: false, status: 409, error: 'checkout_unavailable', detail: 'project is not a git repository' };
|
|
1046
|
+
}
|
|
1047
|
+
let archived = false;
|
|
1048
|
+
const cleanupWarnings = await (0, rail_worktree_release_1.releaseRailWorktrees)({
|
|
1049
|
+
db: c.db,
|
|
1050
|
+
git: worktree_manager_1.defaultGitRunner,
|
|
1051
|
+
repoDir: c.project.path,
|
|
1052
|
+
worktreeIds: currentSnap.worktreeIds,
|
|
1053
|
+
expectedHeadByBranch: (0, rail_worktree_release_1.durableBranchHeads)(currentSnap.branches),
|
|
1054
|
+
overlayEvidenceByBranch: (0, rail_worktree_release_1.durableOverlayCleanupEvidence)(currentSnap.branches),
|
|
1055
|
+
onSafetyArchive: (archive) => {
|
|
1056
|
+
archived = true;
|
|
1057
|
+
if (!(0, rail_pr_store_1.appendPrDeliverySafetyArchive)(c.db, row.id, archive)) {
|
|
1058
|
+
throw new Error(`delivery ${row.id} disappeared while recording safety archive ${archive}`);
|
|
1059
|
+
}
|
|
1060
|
+
},
|
|
1061
|
+
});
|
|
1062
|
+
if (archived) {
|
|
1063
|
+
const archivedRow = (0, rail_pr_store_1.getPrDelivery)(c.db, row.id);
|
|
1064
|
+
if (archivedRow) {
|
|
1065
|
+
const archivedSnap = (0, rail_pr_store_1.toPrDeliverySnapshot)(archivedRow);
|
|
1066
|
+
c.broadcast((0, rail_pr_store_1.toRailPrStateMessage)(c.project.id, archivedSnap));
|
|
1067
|
+
if (archivedRow.origin_conversation_id) {
|
|
1068
|
+
(0, agent_chat_registry_1.getAgentChatManager)()?.updatePrDecisionCard(archivedRow.origin_conversation_id, (0, rail_pr_store_1.toPrDecisionCardEnvelope)(c.project.id, archivedSnap));
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
if (cleanupWarnings.length > 0) {
|
|
1073
|
+
return {
|
|
1074
|
+
ok: false,
|
|
1075
|
+
status: 409,
|
|
1076
|
+
error: 'checkout_unavailable',
|
|
1077
|
+
detail: cleanupWarnings[0],
|
|
1078
|
+
};
|
|
1079
|
+
}
|
|
1080
|
+
const checkedOut = await (0, project_git_1.checkoutProjectReviewBranch)(c.project.path, currentSnap.branch, currentSnap.deliverySha);
|
|
1081
|
+
if (!checkedOut.ok) {
|
|
1082
|
+
return { ok: false, status: 409, error: 'checkout_failed', detail: checkedOut.error };
|
|
1083
|
+
}
|
|
1084
|
+
return { ok: true, git: await (0, project_git_1.getProjectGitInfo)(c.project.path) };
|
|
966
1085
|
});
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
res.status(409).json({ error: 'checkout_failed', detail: result.error });
|
|
1086
|
+
if (!outcome.ok) {
|
|
1087
|
+
res.status(outcome.status).json({ error: outcome.error, detail: outcome.detail });
|
|
970
1088
|
return;
|
|
971
1089
|
}
|
|
972
|
-
res.json(
|
|
1090
|
+
res.json(outcome);
|
|
973
1091
|
}
|
|
974
1092
|
catch (err) {
|
|
975
1093
|
console.error('[rails-router] pr-checkout error:', err);
|
|
@@ -8,6 +8,10 @@ exports.railExists = railExists;
|
|
|
8
8
|
exports.getRails = getRails;
|
|
9
9
|
exports.getRail = getRail;
|
|
10
10
|
exports.setRailTickets = setRailTickets;
|
|
11
|
+
exports.claimRailTickets = claimRailTickets;
|
|
12
|
+
exports.claimTicketOutcomeOwners = claimTicketOutcomeOwners;
|
|
13
|
+
exports.ticketOutcomeOwner = ticketOutcomeOwner;
|
|
14
|
+
exports.releaseRailTicketsOwnedBy = releaseRailTicketsOwnedBy;
|
|
11
15
|
exports.setRailProfile = setRailProfile;
|
|
12
16
|
exports.setRailEngine = setRailEngine;
|
|
13
17
|
exports.createRail = createRail;
|
|
@@ -116,9 +120,107 @@ function setRailTickets(db, railIndex, ticketIds, mode, profileName, aiEngine) {
|
|
|
116
120
|
for (let i = 0; i < ticketIds.length; i++) {
|
|
117
121
|
insertStmt.run(railIndex, ticketIds[i], i, resolvedMode, resolvedProfile, resolvedEngine);
|
|
118
122
|
}
|
|
123
|
+
if (ticketIds.length === 0) {
|
|
124
|
+
db.prepare('DELETE FROM rail_ticket_ownership WHERE rail_index = ?').run(railIndex);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const placeholders = ticketIds.map(() => '?').join(', ');
|
|
128
|
+
db.prepare(`DELETE FROM rail_ticket_ownership
|
|
129
|
+
WHERE rail_index = ? AND ticket_id NOT IN (${placeholders})`).run(railIndex, ...ticketIds);
|
|
130
|
+
}
|
|
119
131
|
})();
|
|
120
132
|
return { railIndex, ticketIds, mode: resolvedMode, profileName: resolvedProfile, aiEngine: resolvedEngine };
|
|
121
133
|
}
|
|
134
|
+
/** Claim the exact rail assignments for a concrete launch. Relaunching the
|
|
135
|
+
* same ticket advances its generation and replaces owner_id, so a delayed
|
|
136
|
+
* terminal replay from an older job/run cannot remove the new assignment. */
|
|
137
|
+
function claimRailTickets(db, railIndex, ticketIds, ownerId) {
|
|
138
|
+
const claim = db.prepare(`
|
|
139
|
+
INSERT INTO rail_ticket_ownership (
|
|
140
|
+
rail_index, ticket_id, owner_id, generation, claimed_at
|
|
141
|
+
) VALUES (?, ?, ?, 1, datetime('now'))
|
|
142
|
+
ON CONFLICT(rail_index, ticket_id) DO UPDATE SET
|
|
143
|
+
owner_id = excluded.owner_id,
|
|
144
|
+
generation = rail_ticket_ownership.generation + 1,
|
|
145
|
+
claimed_at = excluded.claimed_at
|
|
146
|
+
`);
|
|
147
|
+
db.transaction(() => {
|
|
148
|
+
for (const ticketId of [...new Set(ticketIds)]) {
|
|
149
|
+
claim.run(railIndex, ticketId, ownerId);
|
|
150
|
+
}
|
|
151
|
+
})();
|
|
152
|
+
}
|
|
153
|
+
/** Project-wide causal owner for ticket terminal effects. Unlike the JSON
|
|
154
|
+
* applied-effect marker, this claim participates in the same SQLite commit as
|
|
155
|
+
* queue/loop admission, so a hard crash cannot create a ghost filesystem owner
|
|
156
|
+
* or admit work without ownership. */
|
|
157
|
+
function claimTicketOutcomeOwners(db, ticketIds, ownerId) {
|
|
158
|
+
const claim = db.prepare(`
|
|
159
|
+
INSERT INTO ticket_outcome_ownership (
|
|
160
|
+
ticket_id, owner_id, generation, claimed_at
|
|
161
|
+
) VALUES (?, ?, 1, datetime('now'))
|
|
162
|
+
ON CONFLICT(ticket_id) DO UPDATE SET
|
|
163
|
+
owner_id = excluded.owner_id,
|
|
164
|
+
generation = ticket_outcome_ownership.generation + 1,
|
|
165
|
+
claimed_at = excluded.claimed_at
|
|
166
|
+
`);
|
|
167
|
+
for (const ticketId of [...new Set(ticketIds)])
|
|
168
|
+
claim.run(ticketId, ownerId);
|
|
169
|
+
}
|
|
170
|
+
function ticketOutcomeOwner(db, ticketId) {
|
|
171
|
+
try {
|
|
172
|
+
const row = db.prepare(`
|
|
173
|
+
SELECT owner_id FROM ticket_outcome_ownership WHERE ticket_id = ?
|
|
174
|
+
`).get(ticketId);
|
|
175
|
+
return row?.owner_id ?? null;
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
// Compatibility only for isolated pre-migration schemas. Every other DB
|
|
179
|
+
// error must fail closed; treating corruption/closed handles as "legacy"
|
|
180
|
+
// would authorize a stale callback.
|
|
181
|
+
if (String(err?.message ?? err).includes('no such table: ticket_outcome_ownership')) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
throw err;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** Release only assignments still owned by `ownerId`. `allowUnowned` exists
|
|
188
|
+
* solely for pre-migration live/recovery rows; new launches always claim and
|
|
189
|
+
* therefore fail closed when another generation has taken ownership. */
|
|
190
|
+
function releaseRailTicketsOwnedBy(db, ownerId, ticketIds, opts) {
|
|
191
|
+
const wanted = new Set(ticketIds);
|
|
192
|
+
if (wanted.size === 0)
|
|
193
|
+
return [];
|
|
194
|
+
const rails = opts?.railIndex == null ? getRails(db) : [getRail(db, opts.railIndex)];
|
|
195
|
+
const released = [];
|
|
196
|
+
db.transaction(() => {
|
|
197
|
+
for (const rail of rails) {
|
|
198
|
+
const removed = [];
|
|
199
|
+
for (const ticketId of rail.ticketIds) {
|
|
200
|
+
if (!wanted.has(ticketId))
|
|
201
|
+
continue;
|
|
202
|
+
const claim = db.prepare(`
|
|
203
|
+
SELECT owner_id FROM rail_ticket_ownership
|
|
204
|
+
WHERE rail_index = ? AND ticket_id = ?
|
|
205
|
+
`).get(rail.railIndex, ticketId);
|
|
206
|
+
if (claim?.owner_id === ownerId || (!claim && opts?.allowUnowned === true)) {
|
|
207
|
+
removed.push(ticketId);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (removed.length === 0)
|
|
211
|
+
continue;
|
|
212
|
+
const remaining = rail.ticketIds.filter((id) => !removed.includes(id));
|
|
213
|
+
const next = setRailTickets(db, rail.railIndex, remaining, rail.mode, rail.profileName, rail.aiEngine);
|
|
214
|
+
db.prepare(`
|
|
215
|
+
DELETE FROM rail_ticket_ownership
|
|
216
|
+
WHERE rail_index = ? AND owner_id = ?
|
|
217
|
+
AND ticket_id IN (${removed.map(() => '?').join(', ')})
|
|
218
|
+
`).run(rail.railIndex, ownerId, ...removed);
|
|
219
|
+
released.push({ rail: { ...next, name: rail.name }, releasedTicketIds: removed });
|
|
220
|
+
}
|
|
221
|
+
})();
|
|
222
|
+
return released;
|
|
223
|
+
}
|
|
122
224
|
/**
|
|
123
225
|
* Update only the profile for a rail, preserving tickets and mode.
|
|
124
226
|
* No-op (returns current state) when the rail has no tickets yet — the
|
|
@@ -167,14 +269,15 @@ function createRail(db, name) {
|
|
|
167
269
|
return { railIndex, ticketIds: [], mode: 'implement', profileName: null, aiEngine: null, name: value };
|
|
168
270
|
}
|
|
169
271
|
/**
|
|
170
|
-
* Delete a rail's identity + ticket
|
|
171
|
-
* the guards (rail exists,
|
|
172
|
-
* rail). Deleting a middle rail leaves a sparse index gap on purpose: indices
|
|
272
|
+
* Delete a rail's identity + ticket assignments atomically. Pure mechanism —
|
|
273
|
+
* the router enforces the guards (rail exists, idle, no pending PR decision,
|
|
274
|
+
* not the last rail) before calling it. Deleting a middle rail leaves a sparse index gap on purpose: indices
|
|
173
275
|
* are IDENTITY (metrics / pr-deliveries / worktree maps key by railIndex), so
|
|
174
276
|
* they are never compacted/re-numbered.
|
|
175
277
|
*/
|
|
176
278
|
function deleteRail(db, railIndex) {
|
|
177
279
|
db.transaction(() => {
|
|
280
|
+
db.prepare('DELETE FROM rail_ticket_ownership WHERE rail_index = ?').run(railIndex);
|
|
178
281
|
db.prepare('DELETE FROM rail_meta WHERE rail_index = ?').run(railIndex);
|
|
179
282
|
db.prepare('DELETE FROM rails WHERE rail_index = ?').run(railIndex);
|
|
180
283
|
})();
|