specrails-desktop 2.29.0 → 2.29.2
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-ClpD5CFj.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-CSPs9Ofc.js +1 -0
- package/client/dist/assets/AgentModeCodePane-DwcyklA5.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-C69bqlMa.js +1 -0
- package/client/dist/assets/AgentsPage-pRiRr9-W.js +86 -0
- package/client/dist/assets/AnalyticsPage-C14exKsC.js +1 -0
- package/client/dist/assets/BarChart-nBOMNfiy.js +33 -0
- package/client/dist/assets/CodePage-CK76JKm9.js +2 -0
- package/client/dist/assets/DesktopAnalyticsPage-Cnv0f3XQ.js +1 -0
- package/client/dist/assets/DocsDialog-CHUm_Ym0.js +11 -0
- package/client/dist/assets/DocsPage-COI-oDok.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-CypM7R1F.js +19 -0
- package/client/dist/assets/JobDetailModal-B_W0H9dw.js +1 -0
- package/client/dist/assets/JobDetailPage-CeeXOoKS.js +1 -0
- package/client/dist/assets/JobsPage-CwhJG9jw.js +1 -0
- package/client/dist/assets/LoopBuilderPage-C51t1WOM.js +7 -0
- package/client/dist/assets/LoopPreviewModal-Y2HgtIJu.js +1 -0
- package/client/dist/assets/LoopsPage-Bvn1Kw5V.js +1 -0
- package/client/dist/assets/MinimizedChatsContext-DiFvZDPW.js +1 -0
- package/client/dist/assets/PluginsPage-BGPRJpdf.js +2 -0
- package/client/dist/assets/ProjectSettingsDialog-D_GTyGLc.js +1 -0
- package/client/dist/assets/TemplatePreviewModal-szwBhd7h.js +1 -0
- package/client/dist/assets/TicketDetailModal-9UEyK974.js +14 -0
- package/client/dist/assets/Trans-B_vKZ-Hb.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-4rmXoo_p.js +1 -0
- package/client/dist/assets/agent-BxZuNGih.js +1 -0
- package/client/dist/assets/agent-C3uXOYv_.js +1 -0
- package/client/dist/assets/agent-CA8Y4wbw.js +1 -0
- package/client/dist/assets/agent-CASKrhG12.js +1 -0
- package/client/dist/assets/agent-Cv-jud5n2.js +1 -0
- package/client/dist/assets/agent-DitUxYh2.js +1 -0
- package/client/dist/assets/agent-Doow4X7o.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-CD1QHriA2.js +1 -0
- package/client/dist/assets/common-CwwPaRxx.js +1 -0
- package/client/dist/assets/common-DVQuhs-m.js +1 -0
- package/client/dist/assets/common-Dg2jaX7d.js +1 -0
- package/client/dist/assets/common-DuBwj6tK.js +1 -0
- package/client/dist/assets/common-MRj9MHcc.js +1 -0
- package/client/dist/assets/common-O4ZpnMLp.js +1 -0
- package/client/dist/assets/common-fyeF0v7C2.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-B_NkSHYm.js +1 -0
- package/client/dist/assets/dashboard-ClBb_3pq.js +1 -0
- package/client/dist/assets/dashboard-CpCmJvMB.js +1 -0
- package/client/dist/assets/dashboard-Czohu35O2.js +1 -0
- package/client/dist/assets/dashboard-DcjbD0UK.js +1 -0
- package/client/dist/assets/dashboard-Dvx5F3we.js +1 -0
- package/client/dist/assets/dashboard-R1bOPjBh2.js +1 -0
- package/client/dist/assets/dashboard-owcDucDi.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-UjXbEWhN.js → dist-js-CcBCbb32.js} +1 -1
- package/client/dist/assets/{dist-js-BTAcxhPb.js → dist-js-VwztRkGj.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-ByHIauTQ.js +1 -0
- package/client/dist/assets/{freemarker2-J5iIIIK-.js → freemarker2-CELlTDJ2.js} +1 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-BxHAksaU.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-CgaRxpII.js +2 -0
- package/client/dist/assets/index-BflYQpWm.css +2 -0
- package/client/dist/assets/index-C1_-BTXy.js +72 -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/{settings-Bp24JHlv2.js → settings-B9ilOSYO.js} +1 -1
- package/client/dist/assets/{settings-Bx2ObkTR2.js → settings-BqlWHRHA.js} +1 -1
- package/client/dist/assets/{settings-C_T0-j9d.js → settings-D8dlqt4d.js} +1 -1
- package/client/dist/assets/{settings-DhaFKpcw2.js → settings-DAZqjX2a2.js} +1 -1
- package/client/dist/assets/{settings-B_v3zgJf.js → settings-DRh39v1S2.js} +1 -1
- package/client/dist/assets/{settings-BemR_e3F.js → settings-Mj1OJbfd2.js} +1 -1
- package/client/dist/assets/{settings-BvIwQ3A1.js → settings-lRReaSYm.js} +1 -1
- 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-C4p06nen.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-2OqX0vap.js +1 -0
- package/client/dist/assets/useDesktop-X8YB9xzv.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 +190 -132
- package/docs/mcp.md +15 -5
- package/package.json +11 -7
- package/server/dist/active-pr-continuation.js +16 -1
- package/server/dist/agent-chat-manager.js +360 -181
- 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-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 +665 -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 +77 -0
- package/server/dist/pr-publisher.js +94 -27
- package/server/dist/process-admission.js +82 -0
- 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 +1141 -280
- package/server/dist/rail-isolation.js +4 -2
- package/server/dist/rail-pr-decision.js +756 -270
- package/server/dist/rail-pr-delivery.js +2 -1
- package/server/dist/rail-pr-store.js +317 -18
- package/server/dist/rail-pr-ticket-effects.js +328 -0
- package/server/dist/rail-worktree-release.js +28 -6
- package/server/dist/rails-router.js +149 -112
- 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 +70 -21
- package/client/dist/assets/ActivityFeedPage-Be-6L0Ld.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-CpZ-dd8O.js +0 -1
- package/client/dist/assets/AgentIntegrationsModal-DO1pN_Ez.js +0 -1
- package/client/dist/assets/AgentModeCodePane-DLltTOqp.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-Dp5YvmW0.js +0 -1
- package/client/dist/assets/AgentsPage-ehHuVUds.js +0 -86
- package/client/dist/assets/AnalyticsPage-C4Ik95FX.js +0 -1
- package/client/dist/assets/BarChart-DVZgrhJd.js +0 -33
- package/client/dist/assets/CodePage-D4OCMfxL.js +0 -2
- package/client/dist/assets/DesktopAnalyticsPage-2Xf-52x2.js +0 -1
- package/client/dist/assets/DocsDialog-CHihLjWd.js +0 -11
- package/client/dist/assets/DocsPage-1vEk7XbH.js +0 -11
- package/client/dist/assets/ExportDropdown-DLHFQxVn.js +0 -1
- package/client/dist/assets/IntegrationsPage-CCb2YuyJ.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-CxJJEnjw.js +0 -19
- package/client/dist/assets/JobDetailModal-CJI7qRkm.js +0 -1
- package/client/dist/assets/JobDetailPage-DwA9bbwx.js +0 -1
- package/client/dist/assets/JobsPage-BDIyFfd5.js +0 -1
- package/client/dist/assets/LoopBuilderPage-CpBaW59t.js +0 -7
- package/client/dist/assets/LoopPreviewModal-CwpKcv0Y.js +0 -1
- package/client/dist/assets/LoopsPage-BO0Pa8oz.js +0 -1
- package/client/dist/assets/PluginsPage-BBGTBpGh.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-M9zGQo0l.js +0 -1
- package/client/dist/assets/TemplatePreviewModal-eBI0zL5P.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-BEXYxDbs.js +0 -1
- package/client/dist/assets/agent-BoXSzaBk2.js +0 -1
- package/client/dist/assets/agent-C2-rROL52.js +0 -1
- package/client/dist/assets/agent-CeRTdGT12.js +0 -1
- package/client/dist/assets/agent-DZ8zTrQT.js +0 -1
- package/client/dist/assets/agent-DqyzT33X.js +0 -1
- package/client/dist/assets/agent-fQI_6tsA.js +0 -1
- package/client/dist/assets/agent-tJdAobaM.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-DecvjjPU.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-BfQD173j.js +0 -1
- package/client/dist/assets/common-CF8iGXrG.js +0 -1
- package/client/dist/assets/common-Cfmwcrl52.js +0 -1
- package/client/dist/assets/common-D2cimsul.js +0 -1
- package/client/dist/assets/common-DH7fjyL1.js +0 -1
- package/client/dist/assets/common-DXrmj6WD.js +0 -1
- package/client/dist/assets/common-DZbXlmq72.js +0 -1
- package/client/dist/assets/common-DtXmzX2o2.js +0 -1
- package/client/dist/assets/dashboard-5C2FOZQX.js +0 -1
- package/client/dist/assets/dashboard-B6iQ-IL_.js +0 -1
- package/client/dist/assets/dashboard-BFfnCtq52.js +0 -1
- package/client/dist/assets/dashboard-BIC8KtRf2.js +0 -1
- package/client/dist/assets/dashboard-CEgg9NAr.js +0 -1
- package/client/dist/assets/dashboard-CiOyDh9L.js +0 -1
- package/client/dist/assets/dashboard-D6x5OnNj2.js +0 -1
- package/client/dist/assets/dashboard-DBuLfWo9.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-OBDI7bHm.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-BFIdeDTw.js +0 -1
- package/client/dist/assets/jobs-BJ-Gcao22.js +0 -1
- package/client/dist/assets/jobs-DAGiPVIS2.js +0 -1
- package/client/dist/assets/jobs-DAU8C_tZ.js +0 -1
- package/client/dist/assets/jobs-Da0GaaSc.js +0 -1
- package/client/dist/assets/jobs-DrYmsKy5.js +0 -1
- package/client/dist/assets/jobs-P3unxtxo2.js +0 -1
- package/client/dist/assets/jobs-p360zdf1.js +0 -1
- package/client/dist/assets/json.worker-DzV-CpCQ.js +0 -58
- package/client/dist/assets/lib-C5ZxrPSR.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-BYCMtxOz.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-BHv3ewvq.js +0 -1
- package/client/dist/assets/tickets-BIxU86j12.js +0 -1
- package/client/dist/assets/tickets-C2BhwzwR.js +0 -1
- package/client/dist/assets/tickets-D1IeX2EW.js +0 -1
- package/client/dist/assets/tickets-DZut8Ryt.js +0 -1
- package/client/dist/assets/tickets-LfK6LzKl2.js +0 -1
- package/client/dist/assets/tickets-dQfsc7Ph.js +0 -1
- package/client/dist/assets/tickets-sVun0I6v.js +0 -1
- package/client/dist/assets/upload-lgjKJgrl.js +0 -1
- package/client/dist/assets/value-Bc0_jlJA.js +0 -1
- /package/client/dist/assets/{abap-D0E4FfVW.js → abap-08VXUWAP.js} +0 -0
- /package/client/dist/assets/{activity-BbWiDfn-2.js → activity-B-rp4h_v.js} +0 -0
- /package/client/dist/assets/{activity-DvECTYGt.js → activity-C6kJpm9q2.js} +0 -0
- /package/client/dist/assets/{activity-D3Ic-HTS.js → activity-CGx4kb_j.js} +0 -0
- /package/client/dist/assets/{activity-BZZlEG3a.js → activity-CnoX2bH7.js} +0 -0
- /package/client/dist/assets/{activity-DtzRy92x.js → activity-DAyekdlt2.js} +0 -0
- /package/client/dist/assets/{activity-FleOlK0l2.js → activity-DCxtpT7j.js} +0 -0
- /package/client/dist/assets/{activity-DFbvNqhE2.js → activity-JzwRaWPD.js} +0 -0
- /package/client/dist/assets/{addspec-CFxGvmJR2.js → addspec-BXjvkh5q.js} +0 -0
- /package/client/dist/assets/{addspec-NBbcTbLc.js → addspec-C4bwrmpi.js} +0 -0
- /package/client/dist/assets/{addspec-BKrH2Ucz.js → addspec-CArHXUDM.js} +0 -0
- /package/client/dist/assets/{addspec-CR8MB5Fr2.js → addspec-DTKJcXiR.js} +0 -0
- /package/client/dist/assets/{addspec-B_LQMHW3.js → addspec-DbNBbrha2.js} +0 -0
- /package/client/dist/assets/{addspec-DaA-CbTt.js → addspec-htHGZHOe2.js} +0 -0
- /package/client/dist/assets/{addspec-Bw_YQwo62.js → addspec-lr_LP6jk.js} +0 -0
- /package/client/dist/assets/{agents-BHgn--3j.js → agents-6ZOJXWVk2.js} +0 -0
- /package/client/dist/assets/{agents-VsyFhGOS2.js → agents-BZ0XQKjg.js} +0 -0
- /package/client/dist/assets/{agents-HFCqQH0Z.js → agents-BqWklnHR.js} +0 -0
- /package/client/dist/assets/{agents-B_qGaB0F.js → agents-Bz-thHkB2.js} +0 -0
- /package/client/dist/assets/{agents-CP8_ezYG.js → agents-CJclElx6.js} +0 -0
- /package/client/dist/assets/{agents-B9pFSJQI2.js → agents-D_l9L0VA.js} +0 -0
- /package/client/dist/assets/{agents-CV-_xBvX2.js → agents-u_C0jPB5.js} +0 -0
- /package/client/dist/assets/{agentstudio-BEp7Sb46.js → agentstudio-BF19hbXj.js} +0 -0
- /package/client/dist/assets/{agentstudio-Br3WD7Xs.js → agentstudio-BLGvxWBx2.js} +0 -0
- /package/client/dist/assets/{agentstudio-BOjG6tgJ.js → agentstudio-D9UKiWTj2.js} +0 -0
- /package/client/dist/assets/{agentstudio-D2A5peWV2.js → agentstudio-Drs37nIM.js} +0 -0
- /package/client/dist/assets/{agentstudio-CuTt3ZGe2.js → agentstudio-nEnKkcXM.js} +0 -0
- /package/client/dist/assets/{agentstudio-RsxnZtUA.js → agentstudio-pyFcSBKy.js} +0 -0
- /package/client/dist/assets/{agentstudio-RfZavULt2.js → agentstudio-zfTzQh3U.js} +0 -0
- /package/client/dist/assets/{aiedit-DnBzjlVz2.js → aiedit-B0KUbpB6.js} +0 -0
- /package/client/dist/assets/{aiedit-D0Syl-mC.js → aiedit-BoG24nlg2.js} +0 -0
- /package/client/dist/assets/{aiedit-CcugGPbS.js → aiedit-CjlSRQVP.js} +0 -0
- /package/client/dist/assets/{aiedit-DrIjSojo.js → aiedit-DCjA7jLJ.js} +0 -0
- /package/client/dist/assets/{aiedit-CV520D4W2.js → aiedit-DNXxq_Dr.js} +0 -0
- /package/client/dist/assets/{aiedit-26p5A_HY2.js → aiedit-DQ-0_pvE.js} +0 -0
- /package/client/dist/assets/{aiedit-a-Z-g5iC.js → aiedit-olnv3QSt2.js} +0 -0
- /package/client/dist/assets/{analytics-DEe5BMz8.js → analytics-BC7mwR4s.js} +0 -0
- /package/client/dist/assets/{analytics-4HvXb0Vn2.js → analytics-BiNg8edP.js} +0 -0
- /package/client/dist/assets/{analytics-CpSTNfui.js → analytics-C0s_T2GN.js} +0 -0
- /package/client/dist/assets/{analytics-4-eskbtX.js → analytics-CdsAPAwZ2.js} +0 -0
- /package/client/dist/assets/{analytics-Bpe41fnX2.js → analytics-Cr1_q-lC.js} +0 -0
- /package/client/dist/assets/{analytics-DcOITHla2.js → analytics-IEsKZvpW2.js} +0 -0
- /package/client/dist/assets/{analytics-Bd9rHGjV.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-CgOQ9K-6.js → attachments-D0wXXt9T2.js} +0 -0
- /package/client/dist/assets/{attachments-DlEQu56g2.js → attachments-DenIjuVI.js} +0 -0
- /package/client/dist/assets/{attachments-CA2f3qL3.js → attachments-DhO7LPfy.js} +0 -0
- /package/client/dist/assets/{attachments-D2jwJXQ42.js → attachments-DoH5w0x4.js} +0 -0
- /package/client/dist/assets/{attachments-CHDbhKeH.js → attachments-Q9yNtiEM.js} +0 -0
- /package/client/dist/assets/{attachments-CKAY5aYG2.js → attachments-V_WZAYXx2.js} +0 -0
- /package/client/dist/assets/{attachments-jVdKzAXn.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-Cl-FwPXs.js → browser-C25DkQiO.js} +0 -0
- /package/client/dist/assets/{browser-JsiohNmW.js → browser-CiJ7-L32.js} +0 -0
- /package/client/dist/assets/{browser-BbJ_q_OT2.js → browser-CvgDySd9.js} +0 -0
- /package/client/dist/assets/{browser-BQFDxrRq.js → browser-CyR1Kp3m2.js} +0 -0
- /package/client/dist/assets/{browser-Do2jf8_N.js → browser-DwZljcRh2.js} +0 -0
- /package/client/dist/assets/{browser-C4VJ5CW12.js → browser-DxP-alBK.js} +0 -0
- /package/client/dist/assets/{browser-kA31eYhu2.js → browser-rRCwi7Y7.js} +0 -0
- /package/client/dist/assets/{cameligo-6R45j6Ph.js → cameligo-DMUM7wLl.js} +0 -0
- /package/client/dist/assets/{chat-BalviUAD.js → chat-2rIB8HhT.js} +0 -0
- /package/client/dist/assets/{chat-Ds8GvCnv.js → chat-BR8oe53x2.js} +0 -0
- /package/client/dist/assets/{chat-D5xEtsf3.js → chat-Bua03tty.js} +0 -0
- /package/client/dist/assets/{chat-SaG-ng1x2.js → chat-CZpAQan1.js} +0 -0
- /package/client/dist/assets/{chat-CJddjN3D2.js → chat-CdY5SGvS.js} +0 -0
- /package/client/dist/assets/{chat-n43nZGvn.js → chat-DZyu3ImY2.js} +0 -0
- /package/client/dist/assets/{chat-BMWD_Rx12.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-C9U6M5-e2.js → code-76gS0IdL.js} +0 -0
- /package/client/dist/assets/{code-BotxM43N2.js → code-C1VwxlML.js} +0 -0
- /package/client/dist/assets/{code-HDK4P6Rx.js → code-CnMZyJpr.js} +0 -0
- /package/client/dist/assets/{code-DUe1Bouz.js → code-D20ef9Cf2.js} +0 -0
- /package/client/dist/assets/{code-Bit_z2Xd2.js → code-DdOXaWRY.js} +0 -0
- /package/client/dist/assets/{code-F_KjccGf.js → code-Duohuf9l.js} +0 -0
- /package/client/dist/assets/{code-CIPmDEd0.js → code-geHmknB92.js} +0 -0
- /package/client/dist/assets/{coffee-AruSygo-.js → coffee-Ba7i2nA0.js} +0 -0
- /package/client/dist/assets/{commands-BFQZc9AG.js → commands-B9RZO4qS.js} +0 -0
- /package/client/dist/assets/{commands-BMkC5-ki.js → commands-BEwbAjtD2.js} +0 -0
- /package/client/dist/assets/{commands-KBbhsnw8.js → commands-Bbxu8kLU.js} +0 -0
- /package/client/dist/assets/{commands-CzFSoIiq2.js → commands-CDU3qv68.js} +0 -0
- /package/client/dist/assets/{commands-CWX9WmDX2.js → commands-CzezgtQj.js} +0 -0
- /package/client/dist/assets/{commands-BllkJauO.js → commands-DTQBF_q52.js} +0 -0
- /package/client/dist/assets/{commands-cKTaLwwV2.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-CAc8Qzu32.js → explore-BG99VGpL.js} +0 -0
- /package/client/dist/assets/{explore-BO_OinBD.js → explore-C0TjprJW2.js} +0 -0
- /package/client/dist/assets/{explore-Bhy7WWXv.js → explore-C2dgEo7q.js} +0 -0
- /package/client/dist/assets/{explore-ELbrSZyQ2.js → explore-C8NDHbob.js} +0 -0
- /package/client/dist/assets/{explore-DW_YTkQh.js → explore-CWWgzQGR.js} +0 -0
- /package/client/dist/assets/{explore-DCZL9gRN2.js → explore-CcQXpdtS.js} +0 -0
- /package/client/dist/assets/{explore-BEpIs343.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-Db1viey1.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-CG2dp3Kd.js → integrations-CH0zy1Mw2.js} +0 -0
- /package/client/dist/assets/{integrations-CUNe3t9l2.js → integrations-CIAjhd7L.js} +0 -0
- /package/client/dist/assets/{integrations-CWjh5VRk.js → integrations-CZdwOe8A.js} +0 -0
- /package/client/dist/assets/{integrations-RJfzXkPx2.js → integrations-Ct7omMld.js} +0 -0
- /package/client/dist/assets/{integrations-CAjq5tdW2.js → integrations-D6MSxy3-.js} +0 -0
- /package/client/dist/assets/{integrations-JOHSCvB3.js → integrations-DbZa-Zyc.js} +0 -0
- /package/client/dist/assets/{integrations-CP_aiV_8.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-CQ7mrZde.js → jira-BySfUuQZ.js} +0 -0
- /package/client/dist/assets/{jira-DIRkZk9U.js → jira-Byw2C0F8.js} +0 -0
- /package/client/dist/assets/{jira-C5UjxHE4.js → jira-CNeYi06w2.js} +0 -0
- /package/client/dist/assets/{jira-ZdKb-50F2.js → jira-D11gPhxz.js} +0 -0
- /package/client/dist/assets/{jira-DTYu3hJi2.js → jira-D38Gj7AT.js} +0 -0
- /package/client/dist/assets/{jira-B5wszJ1-2.js → jira-gAvOyije.js} +0 -0
- /package/client/dist/assets/{jira-DtZpokjJ.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-DKzYFcq6.js → loops-CPpgMapU.js} +0 -0
- /package/client/dist/assets/{loops-Du-bNVpc2.js → loops-CWWbKuVL.js} +0 -0
- /package/client/dist/assets/{loops-DDs4KPu_.js → loops-Crc9It8o2.js} +0 -0
- /package/client/dist/assets/{loops-Bi4ywYGn.js → loops-DH2hZcbK2.js} +0 -0
- /package/client/dist/assets/{loops-DvGbSfxw2.js → loops-DS5TmvIU2.js} +0 -0
- /package/client/dist/assets/{loops-D3wdUkZV.js → loops-P2f0cN8-.js} +0 -0
- /package/client/dist/assets/{loops-BjK8lmoZ2.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-DfmzoT5t.js → mcp-Czd_iyp02.js} +0 -0
- /package/client/dist/assets/{mcp-BG-OCJca2.js → mcp-D2pc5GGx.js} +0 -0
- /package/client/dist/assets/{mcp-CrWdq5db.js → mcp-D4ZjtIx32.js} +0 -0
- /package/client/dist/assets/{mcp-CbJ04oFS2.js → mcp-DIfBUv2D2.js} +0 -0
- /package/client/dist/assets/{mcp-Dd844F5_.js → mcp-DsTwmjST.js} +0 -0
- /package/client/dist/assets/{mcp-zSJ2TsJj.js → mcp-SMkn8boG.js} +0 -0
- /package/client/dist/assets/{mcp-DyULurYS2.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-DUuw9VIU2.js → nav-BRJBxaGt2.js} +0 -0
- /package/client/dist/assets/{nav-D0Erv9ZJ2.js → nav-CAGKv3_F.js} +0 -0
- /package/client/dist/assets/{nav-BY_4EWRv.js → nav-CNskRJKQ2.js} +0 -0
- /package/client/dist/assets/{nav-CVXtv0wX2.js → nav-DY93irBL.js} +0 -0
- /package/client/dist/assets/{nav-B2_ToNqS.js → nav-DhjvYgqt.js} +0 -0
- /package/client/dist/assets/{nav-S4HM94vW.js → nav-Gb-r4wop.js} +0 -0
- /package/client/dist/assets/{nav-BAMkVEId.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/{setup-JeBwoXoM.js → setup-CGZjy2IF2.js} +0 -0
- /package/client/dist/assets/{setup-1vN48B-m2.js → setup-CXa0Sx16.js} +0 -0
- /package/client/dist/assets/{setup-BmJ0Kx16.js → setup-D2ktKKMF2.js} +0 -0
- /package/client/dist/assets/{setup-T_ApeQDV2.js → setup-DG2H7ha5.js} +0 -0
- /package/client/dist/assets/{setup-DQWsu2TR.js → setup-DK5bHDUq2.js} +0 -0
- /package/client/dist/assets/{setup-q0wRHUp1.js → setup-DrWlIQTZ.js} +0 -0
- /package/client/dist/assets/{setup-mXnzww4f.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-BGRKhM8t.js → specs-BcyxaCwf2.js} +0 -0
- /package/client/dist/assets/{specs-GkiL-snY.js → specs-C1q9geAi.js} +0 -0
- /package/client/dist/assets/{specs-DbtIzV8a.js → specs-CLZKysq-2.js} +0 -0
- /package/client/dist/assets/{specs-Ce5y2iFc2.js → specs-DZMS9o54.js} +0 -0
- /package/client/dist/assets/{specs-CT8exGOy2.js → specs-Dm6zUI-R.js} +0 -0
- /package/client/dist/assets/{specs-C6J2zrLM.js → specs-V3TvhKLX.js} +0 -0
- /package/client/dist/assets/{specs-DZDoZsDq.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-BTpE7iki.js → terminal-BZiIu3rf.js} +0 -0
- /package/client/dist/assets/{terminal-DEyt0prF.js → terminal-C2NAd7BW2.js} +0 -0
- /package/client/dist/assets/{terminal-a6Uq8B0p.js → terminal-IahE4LW92.js} +0 -0
- /package/client/dist/assets/{terminal-DDk_bTw0.js → terminal-QpXZU2Bn2.js} +0 -0
- /package/client/dist/assets/{terminal-BNSg2lR7.js → terminal-ScjyXNxQ.js} +0 -0
- /package/client/dist/assets/{terminal-Cvabyzm42.js → terminal-d7GadXbN.js} +0 -0
- /package/client/dist/assets/{terminal-D0z12_sJ2.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
|
@@ -17,6 +17,7 @@ async function deliverRailAsPr(git, exec, input) {
|
|
|
17
17
|
baseBranch: input.integrationBranch,
|
|
18
18
|
title: input.title,
|
|
19
19
|
body: input.body,
|
|
20
|
+
sourceSha: b.sourceSha,
|
|
20
21
|
});
|
|
21
22
|
return { state: 'delivered', branch: b.branch, pr, ticketIds: [b.ticketId] };
|
|
22
23
|
}
|
|
@@ -46,7 +47,7 @@ async function deliverRailAsPr(git, exec, input) {
|
|
|
46
47
|
return { state: 'assembly-failed', reason: firstLine(add) || 'worktree-add-failed', ticketIds };
|
|
47
48
|
}
|
|
48
49
|
for (const b of succeeded) {
|
|
49
|
-
const merge = await git.run(['merge', '--no-ff', '--no-edit', b.branch], wt);
|
|
50
|
+
const merge = await git.run(['merge', '--no-ff', '--no-edit', b.sourceSha ?? b.branch], wt);
|
|
50
51
|
if (merge.code !== 0) {
|
|
51
52
|
// Conflict/failure → abort and tear the batch down cleanly. Ticket branches
|
|
52
53
|
// stay intact for a human. Never leave a half-merged batch.
|
|
@@ -1,25 +1,36 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ACTIVE_PR_DECISIONS = exports.TERMINAL_PR_DECISIONS = void 0;
|
|
3
|
+
exports.PrDeliveryGenerationConflict = exports.ACTIVE_PR_DECISIONS = exports.TERMINAL_PR_DECISIONS = void 0;
|
|
4
4
|
exports.isTerminalPrDecision = isTerminalPrDecision;
|
|
5
5
|
exports.createPrDelivery = createPrDelivery;
|
|
6
|
+
exports.createPrDeliveryGeneration = createPrDeliveryGeneration;
|
|
7
|
+
exports.failPrDeliveryAndRestoreSuperseded = failPrDeliveryAndRestoreSuperseded;
|
|
6
8
|
exports.getPrDelivery = getPrDelivery;
|
|
7
9
|
exports.getActivePrDeliveryByRail = getActivePrDeliveryByRail;
|
|
8
10
|
exports.listActivePrDeliveries = listActivePrDeliveries;
|
|
11
|
+
exports.listOriginLinkedPrDeliveries = listOriginLinkedPrDeliveries;
|
|
9
12
|
exports.reconcileFailedBuildingPrDeliveries = reconcileFailedBuildingPrDeliveries;
|
|
13
|
+
exports.boundPrDiagnostic = boundPrDiagnostic;
|
|
14
|
+
exports.boundCleanupWarnings = boundCleanupWarnings;
|
|
10
15
|
exports.transitionDecision = transitionDecision;
|
|
16
|
+
exports.transitionClaimedDecision = transitionClaimedDecision;
|
|
17
|
+
exports.claimPrDeliveryOperation = claimPrDeliveryOperation;
|
|
18
|
+
exports.releasePrDeliveryOperation = releasePrDeliveryOperation;
|
|
19
|
+
exports.clearOrphanedPrDeliveryOperations = clearOrphanedPrDeliveryOperations;
|
|
11
20
|
exports.toPrDeliverySnapshot = toPrDeliverySnapshot;
|
|
12
21
|
exports.toRailPrStateMessage = toRailPrStateMessage;
|
|
13
22
|
exports.toPrDecisionCardEnvelope = toPrDecisionCardEnvelope;
|
|
14
23
|
const ids_1 = require("./ids");
|
|
15
24
|
/** States after which the delivery is closed (no further decision possible). */
|
|
16
|
-
exports.TERMINAL_PR_DECISIONS = new Set(['merged', 'discarded']);
|
|
25
|
+
exports.TERMINAL_PR_DECISIONS = new Set(['completed', 'merged', 'discarded', 'superseded']);
|
|
17
26
|
/** States in which the delivery still awaits (or is executing) a user decision. */
|
|
18
27
|
exports.ACTIVE_PR_DECISIONS = new Set([
|
|
19
28
|
'building',
|
|
20
29
|
'on_review',
|
|
30
|
+
'no_changes',
|
|
21
31
|
'pr_draft',
|
|
22
32
|
'pr_ready',
|
|
33
|
+
'pr_closed',
|
|
23
34
|
'implementation_failed',
|
|
24
35
|
'pr_failed',
|
|
25
36
|
]);
|
|
@@ -35,10 +46,87 @@ function createPrDelivery(db, input) {
|
|
|
35
46
|
const id = input.id ?? (0, ids_1.newId)();
|
|
36
47
|
db.prepare(`INSERT INTO rail_pr_deliveries (
|
|
37
48
|
id, rail_index, loop_id, rail_key, ticket_ids, base_branch,
|
|
38
|
-
loop_name, origin_surface, origin_conversation_id
|
|
39
|
-
|
|
49
|
+
loop_name, origin_surface, origin_conversation_id,
|
|
50
|
+
implementation_outcome, delivery_outcome, status_code,
|
|
51
|
+
is_continuation, supersedes_delivery_id
|
|
52
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', 'pending',
|
|
53
|
+
'implementation_running', ?, ?)`).run(id, input.railIndex, input.loopId ?? null, input.railKey, JSON.stringify(input.ticketIds), input.baseBranch, input.loopName, input.originSurface, input.originConversationId ?? null, input.isContinuation ? 1 : 0, input.supersedesDeliveryId ?? null);
|
|
40
54
|
return getPrDelivery(db, id);
|
|
41
55
|
}
|
|
56
|
+
class PrDeliveryGenerationConflict extends Error {
|
|
57
|
+
currentId;
|
|
58
|
+
code = 'PR_DELIVERY_GENERATION_CONFLICT';
|
|
59
|
+
constructor(currentId) {
|
|
60
|
+
super(currentId
|
|
61
|
+
? `rail already has active PR delivery ${currentId}`
|
|
62
|
+
: 'expected active PR delivery is no longer current');
|
|
63
|
+
this.currentId = currentId;
|
|
64
|
+
this.name = 'PrDeliveryGenerationConflict';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.PrDeliveryGenerationConflict = PrDeliveryGenerationConflict;
|
|
68
|
+
/** Recheck admission and, for a continuation, replace the prior generation in
|
|
69
|
+
* one SQLite transaction. The partial unique index is therefore an invariant,
|
|
70
|
+
* not merely a router convention. Pass null for a genuinely fresh launch. */
|
|
71
|
+
function createPrDeliveryGeneration(db, input, expectedActive) {
|
|
72
|
+
return db.transaction(() => {
|
|
73
|
+
const current = getActivePrDeliveryByRail(db, input.railIndex);
|
|
74
|
+
if (expectedActive === null) {
|
|
75
|
+
if (current)
|
|
76
|
+
throw new PrDeliveryGenerationConflict(current.id);
|
|
77
|
+
return { delivery: createPrDelivery(db, input), superseded: null };
|
|
78
|
+
}
|
|
79
|
+
if (!current || current.id !== expectedActive.id || current.decision !== expectedActive.decision ||
|
|
80
|
+
current.operation_token !== null) {
|
|
81
|
+
throw new PrDeliveryGenerationConflict(current?.id ?? null);
|
|
82
|
+
}
|
|
83
|
+
const previous = {
|
|
84
|
+
id: current.id,
|
|
85
|
+
decision: current.decision,
|
|
86
|
+
statusCode: current.status_code,
|
|
87
|
+
};
|
|
88
|
+
const moved = db.prepare(`
|
|
89
|
+
UPDATE rail_pr_deliveries
|
|
90
|
+
SET decision = 'superseded', updated_at = datetime('now')
|
|
91
|
+
WHERE id = ? AND decision = ? AND operation_token IS NULL
|
|
92
|
+
`).run(current.id, current.decision);
|
|
93
|
+
if (moved.changes !== 1)
|
|
94
|
+
throw new PrDeliveryGenerationConflict(current.id);
|
|
95
|
+
const delivery = createPrDelivery(db, {
|
|
96
|
+
...input,
|
|
97
|
+
// An expected active generation can be replaced either by a verified
|
|
98
|
+
// continuation or by a fresh lineage after its recorded PR went stale.
|
|
99
|
+
// Persist the caller's ownership decision in this same transaction so a
|
|
100
|
+
// crash cannot expose a fresh branch as a borrowed continuation branch.
|
|
101
|
+
isContinuation: input.isContinuation ?? true,
|
|
102
|
+
supersedesDeliveryId: current.id,
|
|
103
|
+
});
|
|
104
|
+
return { delivery, superseded: previous };
|
|
105
|
+
})();
|
|
106
|
+
}
|
|
107
|
+
/** Allocation failed after a continuation generation replaced its predecessor:
|
|
108
|
+
* close the failed generation first (freeing the unique slot), then restore the
|
|
109
|
+
* exact prior decision/status. A stale/raced row leaves both untouched. */
|
|
110
|
+
function failPrDeliveryAndRestoreSuperseded(db, failedId, previous) {
|
|
111
|
+
return db.transaction(() => {
|
|
112
|
+
const failed = db.prepare(`
|
|
113
|
+
UPDATE rail_pr_deliveries
|
|
114
|
+
SET decision = 'discarded', status_code = 'delivery_failed',
|
|
115
|
+
delivery_outcome = 'blocked', updated_at = datetime('now')
|
|
116
|
+
WHERE id = ? AND decision = 'building'
|
|
117
|
+
`).run(failedId);
|
|
118
|
+
if (failed.changes !== 1)
|
|
119
|
+
return false;
|
|
120
|
+
const restored = db.prepare(`
|
|
121
|
+
UPDATE rail_pr_deliveries
|
|
122
|
+
SET decision = ?, status_code = ?, updated_at = datetime('now')
|
|
123
|
+
WHERE id = ? AND decision = 'superseded'
|
|
124
|
+
`).run(previous.decision, previous.statusCode, previous.id);
|
|
125
|
+
if (restored.changes !== 1)
|
|
126
|
+
throw new Error(`failed to restore superseded delivery ${previous.id}`);
|
|
127
|
+
return true;
|
|
128
|
+
})();
|
|
129
|
+
}
|
|
42
130
|
function getPrDelivery(db, id) {
|
|
43
131
|
return db.prepare('SELECT * FROM rail_pr_deliveries WHERE id = ?').get(id);
|
|
44
132
|
}
|
|
@@ -50,7 +138,7 @@ function getPrDelivery(db, id) {
|
|
|
50
138
|
function getActivePrDeliveryByRail(db, railIndex) {
|
|
51
139
|
return db
|
|
52
140
|
.prepare(`SELECT * FROM rail_pr_deliveries
|
|
53
|
-
WHERE rail_index = ? AND decision NOT IN ('merged','discarded')
|
|
141
|
+
WHERE rail_index = ? AND decision NOT IN ('completed','merged','discarded','superseded')
|
|
54
142
|
ORDER BY created_at DESC, rowid DESC LIMIT 1`)
|
|
55
143
|
.get(railIndex);
|
|
56
144
|
}
|
|
@@ -58,37 +146,125 @@ function getActivePrDeliveryByRail(db, railIndex) {
|
|
|
58
146
|
function listActivePrDeliveries(db) {
|
|
59
147
|
return db
|
|
60
148
|
.prepare(`SELECT * FROM rail_pr_deliveries
|
|
61
|
-
WHERE decision NOT IN ('merged','discarded')
|
|
149
|
+
WHERE decision NOT IN ('completed','merged','discarded','superseded')
|
|
62
150
|
ORDER BY rail_index, created_at DESC, rowid DESC`)
|
|
63
151
|
.all();
|
|
64
152
|
}
|
|
153
|
+
/** Startup projection source for persisted Agent cards. Terminal rows matter:
|
|
154
|
+
* a process may die after their SQLite transition but before the conversation
|
|
155
|
+
* envelope update, leaving an obsolete actionable card pinned forever. */
|
|
156
|
+
function listOriginLinkedPrDeliveries(db) {
|
|
157
|
+
return db.prepare(`
|
|
158
|
+
SELECT * FROM rail_pr_deliveries
|
|
159
|
+
WHERE origin_conversation_id IS NOT NULL
|
|
160
|
+
ORDER BY created_at ASC, rowid ASC
|
|
161
|
+
`).all();
|
|
162
|
+
}
|
|
65
163
|
/**
|
|
66
|
-
* Recover
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
164
|
+
* Recover cards stranded between engine completion and delivery settlement.
|
|
165
|
+
* Callers wait for every known run to finish; startup may additionally close
|
|
166
|
+
* impossible empty/incomplete generations from the prior process. Hydration
|
|
167
|
+
* never invokes this reconciler. Successful/uncertain work is NEVER called an
|
|
168
|
+
* implementation failure and this data-only pass never removes a worktree.
|
|
70
169
|
*/
|
|
71
|
-
function reconcileFailedBuildingPrDeliveries(db) {
|
|
170
|
+
function reconcileFailedBuildingPrDeliveries(db, opts = {}) {
|
|
72
171
|
const rows = db
|
|
73
172
|
.prepare(`SELECT * FROM rail_pr_deliveries WHERE decision = 'building' ORDER BY created_at ASC, rowid ASC`)
|
|
74
173
|
.all();
|
|
75
174
|
const reconciled = [];
|
|
76
175
|
for (const row of rows) {
|
|
77
176
|
const runIds = parseJsonArray(row.run_ids ?? '[]');
|
|
78
|
-
if (runIds.length === 0)
|
|
177
|
+
if (runIds.length === 0) {
|
|
178
|
+
if (!opts.startup)
|
|
179
|
+
continue;
|
|
180
|
+
if (transitionDecision(db, row.id, 'building', 'pr_failed', {
|
|
181
|
+
implementationOutcome: 'unknown',
|
|
182
|
+
deliveryOutcome: 'blocked',
|
|
183
|
+
statusCode: 'settlement_interrupted',
|
|
184
|
+
statusDetail: 'The prior process stopped before run allocation became durable.',
|
|
185
|
+
})) {
|
|
186
|
+
const updated = getPrDelivery(db, row.id);
|
|
187
|
+
if (updated)
|
|
188
|
+
reconciled.push(updated);
|
|
189
|
+
}
|
|
79
190
|
continue;
|
|
191
|
+
}
|
|
80
192
|
const uniqueRunIds = [...new Set(runIds)];
|
|
81
193
|
const placeholders = uniqueRunIds.map(() => '?').join(',');
|
|
82
194
|
const runs = db
|
|
83
195
|
.prepare(`SELECT id, status, final_outcome FROM loop_runs WHERE id IN (${placeholders})`)
|
|
84
196
|
.all(...uniqueRunIds);
|
|
85
|
-
if (runs.length !== uniqueRunIds.length)
|
|
86
|
-
|
|
87
|
-
|
|
197
|
+
if (runs.length !== uniqueRunIds.length || runs.some((run) => run.status !== 'completed')) {
|
|
198
|
+
if (!opts.startup)
|
|
199
|
+
continue;
|
|
200
|
+
if (transitionDecision(db, row.id, 'building', 'pr_failed', {
|
|
201
|
+
implementationOutcome: 'unknown',
|
|
202
|
+
deliveryOutcome: 'blocked',
|
|
203
|
+
statusCode: 'settlement_interrupted',
|
|
204
|
+
statusDetail: 'The prior process stopped before every implementation unit settled.',
|
|
205
|
+
})) {
|
|
206
|
+
const updated = getPrDelivery(db, row.id);
|
|
207
|
+
if (updated)
|
|
208
|
+
reconciled.push(updated);
|
|
209
|
+
}
|
|
88
210
|
continue;
|
|
89
|
-
|
|
211
|
+
}
|
|
212
|
+
const successfulRunIds = new Set(runs.filter((run) => run.final_outcome === 'success').map((run) => run.id));
|
|
213
|
+
if (successfulRunIds.size === 0) {
|
|
214
|
+
if (transitionDecision(db, row.id, 'building', 'implementation_failed', {
|
|
215
|
+
implementationOutcome: 'failed',
|
|
216
|
+
deliveryOutcome: 'not_started',
|
|
217
|
+
statusCode: 'implementation_failed',
|
|
218
|
+
})) {
|
|
219
|
+
const updated = getPrDelivery(db, row.id);
|
|
220
|
+
if (updated)
|
|
221
|
+
reconciled.push(updated);
|
|
222
|
+
}
|
|
90
223
|
continue;
|
|
91
|
-
|
|
224
|
+
}
|
|
225
|
+
const placeholdersForWorktrees = uniqueRunIds.map(() => '?').join(',');
|
|
226
|
+
const worktrees = db.prepare(`
|
|
227
|
+
SELECT id, ticket_id, run_id, branch, merge_state
|
|
228
|
+
FROM rail_worktrees
|
|
229
|
+
WHERE run_id IN (${placeholdersForWorktrees})
|
|
230
|
+
ORDER BY created_at ASC, rowid ASC
|
|
231
|
+
`).all(...uniqueRunIds);
|
|
232
|
+
const reconstructed = worktrees.map((worktree) => {
|
|
233
|
+
const implementationSucceeded = worktree.run_id != null && successfulRunIds.has(worktree.run_id);
|
|
234
|
+
const deliveryReady = implementationSucceeded && ['built', 'released'].includes(worktree.merge_state);
|
|
235
|
+
return {
|
|
236
|
+
ticketId: worktree.ticket_id,
|
|
237
|
+
branch: worktree.branch,
|
|
238
|
+
succeeded: deliveryReady,
|
|
239
|
+
...(worktree.run_id ? { runId: worktree.run_id } : {}),
|
|
240
|
+
implementationOutcome: implementationSucceeded ? 'succeeded' : 'failed',
|
|
241
|
+
deliveryOutcome: deliveryReady ? 'ready' : implementationSucceeded ? 'blocked' : 'not_started',
|
|
242
|
+
changed: deliveryReady,
|
|
243
|
+
...(!deliveryReady && implementationSucceeded ? { failureCode: 'settlement_interrupted' } : {}),
|
|
244
|
+
};
|
|
245
|
+
});
|
|
246
|
+
const readyCount = reconstructed.filter((unit) => unit.succeeded).length;
|
|
247
|
+
const implementationOutcome = successfulRunIds.size === runs.length
|
|
248
|
+
? 'succeeded'
|
|
249
|
+
: 'partially_succeeded';
|
|
250
|
+
const canResumeFreshReview = row.is_continuation !== 1 && readyCount > 0;
|
|
251
|
+
const next = canResumeFreshReview ? 'on_review' : 'pr_failed';
|
|
252
|
+
const deliveryOutcome = canResumeFreshReview
|
|
253
|
+
? (implementationOutcome === 'partially_succeeded' ? 'partial' : 'ready')
|
|
254
|
+
: 'blocked';
|
|
255
|
+
const statusCode = canResumeFreshReview
|
|
256
|
+
? (implementationOutcome === 'partially_succeeded' ? 'partial_success' : 'ready_for_review')
|
|
257
|
+
: 'settlement_interrupted';
|
|
258
|
+
if (transitionDecision(db, row.id, 'building', next, {
|
|
259
|
+
implementationOutcome,
|
|
260
|
+
deliveryOutcome,
|
|
261
|
+
statusCode,
|
|
262
|
+
statusDetail: canResumeFreshReview
|
|
263
|
+
? 'Recovered committed implementation branches after an interrupted settlement.'
|
|
264
|
+
: 'Implementation completed, but delivery settlement was interrupted before an exact deliverable could be proven.',
|
|
265
|
+
...(reconstructed.length > 0 ? { branches: reconstructed } : {}),
|
|
266
|
+
...(worktrees.length > 0 ? { worktreeIds: worktrees.map((worktree) => worktree.id) } : {}),
|
|
267
|
+
})) {
|
|
92
268
|
const updated = getPrDelivery(db, row.id);
|
|
93
269
|
if (updated)
|
|
94
270
|
reconciled.push(updated);
|
|
@@ -107,13 +283,40 @@ const PATCH_COLUMNS = {
|
|
|
107
283
|
branches: 'branches',
|
|
108
284
|
worktreeIds: 'worktree_ids',
|
|
109
285
|
runIds: 'run_ids',
|
|
286
|
+
implementationOutcome: 'implementation_outcome',
|
|
287
|
+
deliveryOutcome: 'delivery_outcome',
|
|
288
|
+
statusCode: 'status_code',
|
|
289
|
+
statusDetail: 'status_detail',
|
|
290
|
+
deliverySha: 'delivery_sha',
|
|
291
|
+
isContinuation: 'is_continuation',
|
|
292
|
+
supersedesDeliveryId: 'supersedes_delivery_id',
|
|
293
|
+
operation: 'operation',
|
|
294
|
+
operationToken: 'operation_token',
|
|
295
|
+
operationStartedAtMs: 'operation_started_at_ms',
|
|
296
|
+
cleanupWarnings: 'cleanup_warnings',
|
|
110
297
|
};
|
|
111
298
|
function patchValue(key, patch) {
|
|
112
299
|
const raw = patch[key];
|
|
113
300
|
if (key === 'branches' || key === 'worktreeIds' || key === 'runIds')
|
|
114
301
|
return JSON.stringify(raw);
|
|
302
|
+
if (key === 'cleanupWarnings')
|
|
303
|
+
return JSON.stringify(boundCleanupWarnings(raw));
|
|
304
|
+
if (key === 'statusDetail')
|
|
305
|
+
return raw == null ? null : boundPrDiagnostic(String(raw));
|
|
306
|
+
if (key === 'isContinuation')
|
|
307
|
+
return raw ? 1 : 0;
|
|
115
308
|
return raw;
|
|
116
309
|
}
|
|
310
|
+
/** Bounded, single-line diagnostics are safe to persist/broadcast as secondary
|
|
311
|
+
* detail. Primary UI copy always derives from status_code. */
|
|
312
|
+
function boundPrDiagnostic(value, maxLength = 512) {
|
|
313
|
+
return value.replace(/[\r\n\t\0]+/g, ' ').replace(/\s{2,}/g, ' ').trim().slice(0, maxLength);
|
|
314
|
+
}
|
|
315
|
+
/** Cleanup is best-effort; retain enough unique warnings to be honest without
|
|
316
|
+
* allowing unbounded command output to inflate every snapshot. */
|
|
317
|
+
function boundCleanupWarnings(values) {
|
|
318
|
+
return [...new Set(values.map((value) => boundPrDiagnostic(value)).filter(Boolean))].slice(0, 8);
|
|
319
|
+
}
|
|
117
320
|
/**
|
|
118
321
|
* COMPARE-AND-SET decision transition: one atomic
|
|
119
322
|
* `UPDATE … WHERE id = ? AND decision = ?` (no read-modify-write), so two
|
|
@@ -132,6 +335,71 @@ function transitionDecision(db, id, expected, next, patch = {}) {
|
|
|
132
335
|
WHERE id = ? AND decision = ?`)
|
|
133
336
|
.run(next, ...values, id, expected).changes > 0);
|
|
134
337
|
}
|
|
338
|
+
/** Complete a decision transition only while the caller still owns the lease it
|
|
339
|
+
* claimed before external effects. A reclaimed stale lease invalidates the old
|
|
340
|
+
* worker's final CAS, so it cannot overwrite the newer owner's authoritative
|
|
341
|
+
* state after eventually returning. */
|
|
342
|
+
function transitionClaimedDecision(db, id, expected, next, operationToken, patch = {}) {
|
|
343
|
+
if (!operationToken)
|
|
344
|
+
return false;
|
|
345
|
+
const keys = Object.keys(patch).filter((key) => patch[key] !== undefined);
|
|
346
|
+
const patchClause = keys.map((key) => `, ${PATCH_COLUMNS[key]} = ?`).join('');
|
|
347
|
+
const values = keys.map((key) => patchValue(key, patch));
|
|
348
|
+
return db.prepare(`
|
|
349
|
+
UPDATE rail_pr_deliveries
|
|
350
|
+
SET decision = ?, updated_at = datetime('now')${patchClause}
|
|
351
|
+
WHERE id = ? AND decision = ? AND operation_token = ?
|
|
352
|
+
`).run(next, ...values, id, expected, operationToken).changes > 0;
|
|
353
|
+
}
|
|
354
|
+
/** Decision-side Git/GitHub effects must be claimed BEFORE they start. The
|
|
355
|
+
* stale lease is reclaimable after a dead process; a live loser performs zero
|
|
356
|
+
* external work. `expected` remains the visible decision throughout the effect
|
|
357
|
+
* so the final decision transition keeps its existing CAS contract. */
|
|
358
|
+
function claimPrDeliveryOperation(db, id, expected, operation, token, nowMs = Date.now(), leaseMs = 30 * 60 * 1000) {
|
|
359
|
+
if (!token)
|
|
360
|
+
return false;
|
|
361
|
+
const staleBefore = nowMs - Math.max(1, leaseMs);
|
|
362
|
+
return db.prepare(`
|
|
363
|
+
UPDATE rail_pr_deliveries
|
|
364
|
+
SET operation = ?, operation_token = ?, operation_started_at_ms = ?,
|
|
365
|
+
updated_at = datetime('now')
|
|
366
|
+
WHERE id = ? AND decision = ?
|
|
367
|
+
AND (operation_token IS NULL OR operation_started_at_ms IS NULL OR operation_started_at_ms < ?)
|
|
368
|
+
`).run(operation, token, nowMs, id, expected, staleBefore).changes > 0;
|
|
369
|
+
}
|
|
370
|
+
/** Release only the caller's lease. Works after a successful decision change,
|
|
371
|
+
* too, so a handler can use one `finally` without racing a newer operation. */
|
|
372
|
+
function releasePrDeliveryOperation(db, id, token) {
|
|
373
|
+
return db.prepare(`
|
|
374
|
+
UPDATE rail_pr_deliveries
|
|
375
|
+
SET operation = NULL, operation_token = NULL, operation_started_at_ms = NULL,
|
|
376
|
+
updated_at = datetime('now')
|
|
377
|
+
WHERE id = ? AND operation_token = ?
|
|
378
|
+
`).run(id, token).changes > 0;
|
|
379
|
+
}
|
|
380
|
+
/** A process restart proves every persisted decision lease is orphaned: tokens
|
|
381
|
+
* are process-local capabilities and no prior worker can still complete inside
|
|
382
|
+
* this process. Clear them while startup admission is closed so reprojected
|
|
383
|
+
* cards never remain permanently disabled as "Publishing…"/"Discarding…". */
|
|
384
|
+
function clearOrphanedPrDeliveryOperations(db) {
|
|
385
|
+
return db.prepare(`
|
|
386
|
+
UPDATE rail_pr_deliveries
|
|
387
|
+
SET operation = NULL, operation_token = NULL, operation_started_at_ms = NULL,
|
|
388
|
+
status_code = CASE
|
|
389
|
+
WHEN decision NOT IN ('completed','merged','discarded','superseded')
|
|
390
|
+
THEN 'operation_interrupted'
|
|
391
|
+
ELSE status_code
|
|
392
|
+
END,
|
|
393
|
+
status_detail = CASE
|
|
394
|
+
WHEN decision NOT IN ('completed','merged','discarded','superseded')
|
|
395
|
+
AND (status_detail IS NULL OR status_detail = '')
|
|
396
|
+
THEN 'A previous delivery action was interrupted by restart. Its durable evidence was preserved; review the current state and retry.'
|
|
397
|
+
ELSE status_detail
|
|
398
|
+
END,
|
|
399
|
+
updated_at = datetime('now')
|
|
400
|
+
WHERE operation IS NOT NULL OR operation_token IS NOT NULL OR operation_started_at_ms IS NOT NULL
|
|
401
|
+
`).run().changes;
|
|
402
|
+
}
|
|
135
403
|
function parseJsonArray(raw) {
|
|
136
404
|
try {
|
|
137
405
|
const parsed = JSON.parse(raw);
|
|
@@ -142,6 +410,7 @@ function parseJsonArray(raw) {
|
|
|
142
410
|
}
|
|
143
411
|
}
|
|
144
412
|
function toPrDeliverySnapshot(row) {
|
|
413
|
+
const units = parseJsonArray(row.branches);
|
|
145
414
|
return {
|
|
146
415
|
id: row.id,
|
|
147
416
|
railIndex: row.rail_index,
|
|
@@ -154,7 +423,17 @@ function toPrDeliverySnapshot(row) {
|
|
|
154
423
|
prNumber: row.pr_number,
|
|
155
424
|
prState: row.pr_state,
|
|
156
425
|
decision: row.decision,
|
|
157
|
-
|
|
426
|
+
implementationOutcome: row.implementation_outcome ?? 'unknown',
|
|
427
|
+
deliveryOutcome: row.delivery_outcome ?? 'unknown',
|
|
428
|
+
statusCode: row.status_code ?? null,
|
|
429
|
+
statusDetail: row.status_detail ?? null,
|
|
430
|
+
deliverySha: row.delivery_sha ?? null,
|
|
431
|
+
isContinuation: row.is_continuation === 1,
|
|
432
|
+
supersedesDeliveryId: row.supersedes_delivery_id ?? null,
|
|
433
|
+
operation: row.operation ?? null,
|
|
434
|
+
cleanupWarnings: parseJsonArray(row.cleanup_warnings ?? '[]'),
|
|
435
|
+
branches: units,
|
|
436
|
+
units,
|
|
158
437
|
loopName: row.loop_name,
|
|
159
438
|
worktreeIds: parseJsonArray(row.worktree_ids),
|
|
160
439
|
runIds: parseJsonArray(row.run_ids ?? '[]'),
|
|
@@ -184,6 +463,16 @@ function toRailPrStateMessage(projectId, snap) {
|
|
|
184
463
|
prNumber: snap.prNumber,
|
|
185
464
|
prState: snap.prState,
|
|
186
465
|
decision: snap.decision,
|
|
466
|
+
implementationOutcome: snap.implementationOutcome,
|
|
467
|
+
deliveryOutcome: snap.deliveryOutcome,
|
|
468
|
+
statusCode: snap.statusCode,
|
|
469
|
+
statusDetail: snap.statusDetail,
|
|
470
|
+
deliverySha: snap.deliverySha,
|
|
471
|
+
isContinuation: snap.isContinuation,
|
|
472
|
+
supersedesDeliveryId: snap.supersedesDeliveryId,
|
|
473
|
+
operation: snap.operation,
|
|
474
|
+
cleanupWarnings: snap.cleanupWarnings,
|
|
475
|
+
units: snap.units,
|
|
187
476
|
runIds: snap.runIds,
|
|
188
477
|
originConversationId: snap.originConversationId,
|
|
189
478
|
};
|
|
@@ -203,6 +492,16 @@ function toPrDecisionCardEnvelope(projectId, snap) {
|
|
|
203
492
|
baseBranch: snap.baseBranch,
|
|
204
493
|
ticketIds: snap.ticketIds,
|
|
205
494
|
decision: snap.decision,
|
|
495
|
+
implementationOutcome: snap.implementationOutcome,
|
|
496
|
+
deliveryOutcome: snap.deliveryOutcome,
|
|
497
|
+
statusCode: snap.statusCode,
|
|
498
|
+
statusDetail: snap.statusDetail,
|
|
499
|
+
deliverySha: snap.deliverySha,
|
|
500
|
+
isContinuation: snap.isContinuation,
|
|
501
|
+
supersedesDeliveryId: snap.supersedesDeliveryId,
|
|
502
|
+
operation: snap.operation,
|
|
503
|
+
cleanupWarnings: snap.cleanupWarnings,
|
|
504
|
+
units: snap.units,
|
|
206
505
|
prUrl: snap.prUrl,
|
|
207
506
|
prNumber: snap.prNumber,
|
|
208
507
|
prState: snap.prState,
|