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.
Files changed (548) hide show
  1. package/client/dist/assets/ActivityFeedPage-CFB4UBhT.js +1 -0
  2. package/client/dist/assets/AgentBrowserCapture-C-T0r16B.js +1 -0
  3. package/client/dist/assets/AgentModeCodePane-IljV5FOQ.js +2 -0
  4. package/client/dist/assets/AgentModeJobsPane-B5miH10_.js +1 -0
  5. package/client/dist/assets/AgentsPage-BgYQrAcH.js +86 -0
  6. package/client/dist/assets/AnalyticsPage-BtVCuNjL.js +1 -0
  7. package/client/dist/assets/BarChart-nBOMNfiy.js +33 -0
  8. package/client/dist/assets/CodePage-Cb_jAjSV.js +2 -0
  9. package/client/dist/assets/DesktopAnalyticsPage-s_Cc_JL1.js +1 -0
  10. package/client/dist/assets/DocsDialog-Cr47QI9L.js +11 -0
  11. package/client/dist/assets/DocsPage-C_WPRuG_.js +11 -0
  12. package/client/dist/assets/ExportDropdown-BrtfWzEG.js +1 -0
  13. package/client/dist/assets/IntegrationsPage-Bs00_tl4.js +1 -0
  14. package/client/dist/assets/InteractiveJobComposer-NfFOciRB.js +19 -0
  15. package/client/dist/assets/JobDetailModal-DqEW7Z7K.js +1 -0
  16. package/client/dist/assets/JobDetailPage-D4ppEpDE.js +1 -0
  17. package/client/dist/assets/JobsPage-DStSoMyq.js +1 -0
  18. package/client/dist/assets/LoopBuilderPage-DltCwS4P.js +7 -0
  19. package/client/dist/assets/LoopPreviewModal-BWaiAbUq.js +1 -0
  20. package/client/dist/assets/LoopsPage-BqjbXuBZ.js +1 -0
  21. package/client/dist/assets/MinimizedChatsContext--o3JAM9F.js +1 -0
  22. package/client/dist/assets/PluginsPage-B-UOmzXw.js +2 -0
  23. package/client/dist/assets/ProjectSettingsDialog-DkGajIxE.js +1 -0
  24. package/client/dist/assets/TemplatePreviewModal-5CUXlkw7.js +1 -0
  25. package/client/dist/assets/TicketDetailModal-B_igqmti.js +14 -0
  26. package/client/dist/assets/Trans-DDMIBBUd.js +1 -0
  27. package/client/dist/assets/activity-DiyjsgQV.js +1 -0
  28. package/client/dist/assets/addon-image-BRmmRHgQ.js +1 -0
  29. package/client/dist/assets/addon-ligatures-qIZUPvRV.js +2 -0
  30. package/client/dist/assets/{addon-webgl-DMbGeI_u.js → addon-webgl-C2d7lriQ.js} +3 -3
  31. package/client/dist/assets/addspec-Rw8uVBC1.js +1 -0
  32. package/client/dist/assets/agent-BXc59ARK2.js +1 -0
  33. package/client/dist/assets/agent-BbIFXdDq.js +1 -0
  34. package/client/dist/assets/agent-BqEfA5u5.js +1 -0
  35. package/client/dist/assets/agent-BtGzgTC4.js +1 -0
  36. package/client/dist/assets/agent-CIhys_5d.js +1 -0
  37. package/client/dist/assets/agent-CJPaqsVR.js +1 -0
  38. package/client/dist/assets/agent-n-hY4GuL.js +1 -0
  39. package/client/dist/assets/agent-tJ-efa3_2.js +1 -0
  40. package/client/dist/assets/agents-DhG7mg6-.js +1 -0
  41. package/client/dist/assets/agentstudio-BIUe1Im2.js +1 -0
  42. package/client/dist/assets/aiedit-iIjz2_Qk.js +1 -0
  43. package/client/dist/assets/analytics-DZ8Aoq3I.js +1 -0
  44. package/client/dist/assets/api-B2M7CtDw.js +1 -0
  45. package/client/dist/assets/arrow-left-CpIR4j7G.js +1 -0
  46. package/client/dist/assets/arrow-up-right-9DoMn7fD.js +1 -0
  47. package/client/dist/assets/attachments-B53PG733.js +1 -0
  48. package/client/dist/assets/brain-DI9lHkKY.js +1 -0
  49. package/client/dist/assets/browser-CXUcnTMI.js +1 -0
  50. package/client/dist/assets/button-BUIIBQPT.js +1 -0
  51. package/client/dist/assets/chat-BGD7MXAy.js +1 -0
  52. package/client/dist/assets/chevron-right-CViMxucY.js +1 -0
  53. package/client/dist/assets/chunk-KS7C4IRE-Cx5sqopX.js +3 -0
  54. package/client/dist/assets/circle-x-CMYsN4ZH.js +1 -0
  55. package/client/dist/assets/code-BDXEM4ml.js +1 -0
  56. package/client/dist/assets/commands-DyUZQ1FI.js +1 -0
  57. package/client/dist/assets/common-6MLbD-jM.js +1 -0
  58. package/client/dist/assets/common-BKGEu4rm.js +1 -0
  59. package/client/dist/assets/common-BNbnv8cE2.js +1 -0
  60. package/client/dist/assets/common-BqGWtDbt.js +1 -0
  61. package/client/dist/assets/common-DBtTzeYm2.js +1 -0
  62. package/client/dist/assets/common-DEW3Nr8n.js +1 -0
  63. package/client/dist/assets/common-DHsv9N5d.js +1 -0
  64. package/client/dist/assets/common-mkrEcW-Y.js +1 -0
  65. package/client/dist/assets/createLucideIcon-Bjbbp_KS.js +1 -0
  66. package/client/dist/assets/{css.worker-Wv5dxAWO.js → css.worker-yKcq13f2.js} +13 -13
  67. package/client/dist/assets/{cssMode-DBHbkBvI.js → cssMode-BM4z9OX0.js} +1 -1
  68. package/client/dist/assets/dashboard-BYzxom0L.js +1 -0
  69. package/client/dist/assets/dashboard-BmDZmHyY.js +1 -0
  70. package/client/dist/assets/dashboard-CnNtJBQ5.js +1 -0
  71. package/client/dist/assets/dashboard-D4Uj-XWc2.js +1 -0
  72. package/client/dist/assets/dashboard-D57uRaGw2.js +1 -0
  73. package/client/dist/assets/dashboard-DAr6F9et.js +1 -0
  74. package/client/dist/assets/dashboard-vAcsn0L3.js +1 -0
  75. package/client/dist/assets/dashboard-vrjZvxWy.js +1 -0
  76. package/client/dist/assets/dialog-CzIekCw0.js +45 -0
  77. package/client/dist/assets/dist-Cez5CRkX.js +1 -0
  78. package/client/dist/assets/dist-bVqfYmby.js +1 -0
  79. package/client/dist/assets/{dist-js-CgpP6tKI.js → dist-js-BCUhGUXS.js} +1 -1
  80. package/client/dist/assets/{dist-js-DHiN-A_E.js → dist-js-DcoXTnEI.js} +1 -1
  81. package/client/dist/assets/download-CFHyyHcw.js +1 -0
  82. package/client/dist/assets/editor.api2-4ndOupAA.js +872 -0
  83. package/client/dist/assets/{editor.main-C9J2ikJK.js → editor.main-DxrmGfoq.js} +2 -2
  84. package/client/dist/assets/editor.worker-tytyn86m.js +26 -0
  85. package/client/dist/assets/explore-DgBACn39.js +1 -0
  86. package/client/dist/assets/external-link-BcU5EWZp.js +1 -0
  87. package/client/dist/assets/file-text-CFT-xXKN.js +1 -0
  88. package/client/dist/assets/formatDistanceToNow-DP3Ab6fX.js +1 -0
  89. package/client/dist/assets/{freemarker2-J5iIIIK-.js → freemarker2-CELlTDJ2.js} +1 -1
  90. package/client/dist/assets/getTimezoneOffsetInMilliseconds-DdKKL8Fx.js +1 -0
  91. package/client/dist/assets/git-branch-BRM0F5GN.js +1 -0
  92. package/client/dist/assets/{handlebars-DSw1l_tw.js → handlebars-NEjHJ7o_.js} +1 -1
  93. package/client/dist/assets/{html-h2-wE1Lj.js → html-CA10zN5A.js} +1 -1
  94. package/client/dist/assets/{html.worker-CQP8QQsS.js → html.worker-DSJ9zmd7.js} +12 -12
  95. package/client/dist/assets/{htmlMode-Cc_ij7lW.js → htmlMode-89rPYiyq.js} +1 -1
  96. package/client/dist/assets/i18n-DREQCE2F.js +2 -0
  97. package/client/dist/assets/index-B784m8RT.js +76 -0
  98. package/client/dist/assets/index-CQBIemiz.css +2 -0
  99. package/client/dist/assets/integrations-mB-7zoyT.js +1 -0
  100. package/client/dist/assets/{javascript-C1q3xv6N.js → javascript-B1gDmwzS.js} +1 -1
  101. package/client/dist/assets/jira-CmKWERE0.js +1 -0
  102. package/client/dist/assets/jira-api-BgFIr8eD.js +1 -0
  103. package/client/dist/assets/job-time-BCL7wee9.js +1 -0
  104. package/client/dist/assets/jobs-B-sDHEay2.js +1 -0
  105. package/client/dist/assets/jobs-BCtGfgUA.js +1 -0
  106. package/client/dist/assets/jobs-BHR_EnDI.js +1 -0
  107. package/client/dist/assets/jobs-BMbZJjJJ.js +1 -0
  108. package/client/dist/assets/jobs-CVFD8rar.js +1 -0
  109. package/client/dist/assets/jobs-DoSaFzAa.js +1 -0
  110. package/client/dist/assets/jobs-DzSIR8V62.js +1 -0
  111. package/client/dist/assets/jobs-lk1_Dq1U.js +1 -0
  112. package/client/dist/assets/json.worker-Oa9UrkKE.js +58 -0
  113. package/client/dist/assets/{jsonMode-CeaCdEhr.js → jsonMode-xHLMfzhF.js} +1 -1
  114. package/client/dist/assets/jsx-runtime-zu2_FqZY.js +1 -0
  115. package/client/dist/assets/lib-C7Mhm-gT.js +7 -0
  116. package/client/dist/assets/lib-CGdyxIWg.js +29 -0
  117. package/client/dist/assets/{liquid-eFsVK0V-.js → liquid-BY6hCUXG.js} +1 -1
  118. package/client/dist/assets/loader-circle-DcygOQpC.js +1 -0
  119. package/client/dist/assets/loops-BzfXWEwO.js +1 -0
  120. package/client/dist/assets/{lspLanguageFeatures-DT3-bbhn.js → lspLanguageFeatures-ira2aEJh.js} +1 -1
  121. package/client/dist/assets/mcp-uDkXYu4L.js +1 -0
  122. package/client/dist/assets/{mdx-Fuwnh1cX.js → mdx-BNx0xr3N.js} +1 -1
  123. package/client/dist/assets/monaco.contribution-Bt92R3Vw.js +2 -0
  124. package/client/dist/assets/nav-myFaXRHD.js +1 -0
  125. package/client/dist/assets/pencil-C9RkrIPZ.js +1 -0
  126. package/client/dist/assets/play-DNlrawbS.js +1 -0
  127. package/client/dist/assets/plus-CsnjfkmX.js +1 -0
  128. package/client/dist/assets/preload-helper-Czpn1I53.js +1 -0
  129. package/client/dist/assets/{python-BgoEs6Cj.js → python-DLdbtmNw.js} +1 -1
  130. package/client/dist/assets/{razor-CM1sPMMq.js → razor-B9gdhAbR.js} +1 -1
  131. package/client/dist/assets/react-dom-DiWzBDP9.js +1 -0
  132. package/client/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
  133. package/client/dist/assets/save-28sIlCdr.js +1 -0
  134. package/client/dist/assets/search-Cq_gE3Ik.js +1 -0
  135. package/client/dist/assets/settings-B0ypw9uw.js +1 -0
  136. package/client/dist/assets/setup-CmK87LuS.js +1 -0
  137. package/client/dist/assets/sparkles-DrY8hb0X.js +1 -0
  138. package/client/dist/assets/specs-DII0C8gw.js +1 -0
  139. package/client/dist/assets/spending-CtY7yYes.js +1 -0
  140. package/client/dist/assets/terminal-BFRZnMPP.js +1 -0
  141. package/client/dist/assets/tickets-B8BuAaj5.js +1 -0
  142. package/client/dist/assets/tickets-B_yh4qQk.js +1 -0
  143. package/client/dist/assets/tickets-Bs37scwY2.js +1 -0
  144. package/client/dist/assets/tickets-CFk2n2Or.js +1 -0
  145. package/client/dist/assets/tickets-DQp7JS2R2.js +1 -0
  146. package/client/dist/assets/tickets-D_yDquEw.js +1 -0
  147. package/client/dist/assets/tickets-DpmdE8tv2.js +1 -0
  148. package/client/dist/assets/tickets-pAUJkDTu.js +1 -0
  149. package/client/dist/assets/trash-2-BOU3WdZZ.js +1 -0
  150. package/client/dist/assets/triangle-alert-H9T4jAmh.js +1 -0
  151. package/client/dist/assets/{ts.worker-METxwbDZ.js → ts.worker-BtjBFNHX.js} +48 -33
  152. package/client/dist/assets/{tsMode-BmT8WogI.js → tsMode-DEjSThU9.js} +1 -1
  153. package/client/dist/assets/{typescript-CQrQPsoW.js → typescript-CRRnD2Ts.js} +1 -1
  154. package/client/dist/assets/upload-DYMjAQ6M.js +1 -0
  155. package/client/dist/assets/useBrowserCaptureSession-BFBdW59q.js +1 -0
  156. package/client/dist/assets/useDesktop-uWVZ8eia.js +1 -0
  157. package/client/dist/assets/useSharedWebSocket-DaPh7QBL.js +1 -0
  158. package/client/dist/assets/utils-BC4DHlz2.js +1 -0
  159. package/client/dist/assets/value-s-gzBeyF.js +1 -0
  160. package/client/dist/assets/{workers-U0UXyLUf.js → workers-uOo7WLaa.js} +1 -1
  161. package/client/dist/assets/x-CBMI9ejn.js +1 -0
  162. package/client/dist/assets/{xml-WRxJs8_I.js → xml-EDREH2X7.js} +1 -1
  163. package/client/dist/assets/{yaml-CjpSTjJU.js → yaml-BjaDVX1E.js} +1 -1
  164. package/client/dist/assets/zap-CHo3aCD1.js +1 -0
  165. package/client/dist/index.html +73 -32
  166. package/docs/guide/en/integrations/5-mcp-server.md +2 -2
  167. package/docs/internals/safe-pr-review-flow.md +382 -141
  168. package/docs/mcp.md +15 -5
  169. package/package.json +11 -7
  170. package/server/dist/active-pr-continuation.js +250 -50
  171. package/server/dist/agent-chat-manager.js +387 -191
  172. package/server/dist/agent-cwd-manager.js +52 -8
  173. package/server/dist/agent-generator.js +90 -48
  174. package/server/dist/agent-mcp-config.js +69 -36
  175. package/server/dist/agent-operator-prompt.js +3 -2
  176. package/server/dist/agent-refine-manager.js +47 -6
  177. package/server/dist/agent-store.js +19 -4
  178. package/server/dist/agent-tier.js +13 -11
  179. package/server/dist/artifact-registry.js +33 -2
  180. package/server/dist/auth.js +5 -4
  181. package/server/dist/browser-capture-manager.js +92 -29
  182. package/server/dist/chat-manager.js +302 -46
  183. package/server/dist/contract-refine-runner.js +19 -6
  184. package/server/dist/db.js +686 -8
  185. package/server/dist/desktop-router.js +1 -2
  186. package/server/dist/headroom-manager.js +1310 -121
  187. package/server/dist/headroom-routing.js +120 -2
  188. package/server/dist/index.js +48 -13
  189. package/server/dist/interactive-job-session.js +237 -82
  190. package/server/dist/jira/jira-adf.js +10 -0
  191. package/server/dist/jira/jira-db.js +15 -3
  192. package/server/dist/jira/jira-sync-manager.js +182 -13
  193. package/server/dist/job-listing.js +140 -0
  194. package/server/dist/job-spawn-idempotency.js +67 -0
  195. package/server/dist/loop-run-manager.js +508 -98
  196. package/server/dist/loop-runs-store.js +266 -13
  197. package/server/dist/mcp/agent-capability.js +71 -0
  198. package/server/dist/mcp/guide.js +5 -2
  199. package/server/dist/mcp/mcp-server.js +5 -10
  200. package/server/dist/mcp/mcp-token.js +5 -5
  201. package/server/dist/mcp/tools/jobs.js +20 -13
  202. package/server/dist/mcp/tools/types.js +20 -42
  203. package/server/dist/mobile/mobile-router.js +1 -1
  204. package/server/dist/pr-lifecycle.js +169 -0
  205. package/server/dist/pr-publisher.js +94 -27
  206. package/server/dist/process-admission.js +82 -0
  207. package/server/dist/project-git.js +62 -2
  208. package/server/dist/project-registry.js +572 -174
  209. package/server/dist/project-router-git.js +13 -2
  210. package/server/dist/project-router-jobs.js +111 -55
  211. package/server/dist/project-router-tickets.js +32 -2
  212. package/server/dist/providers/claude-adapter.js +21 -13
  213. package/server/dist/queue-manager.js +2332 -623
  214. package/server/dist/rail-isolated-launch.js +1679 -296
  215. package/server/dist/rail-isolation.js +4 -2
  216. package/server/dist/rail-pr-decision.js +1665 -307
  217. package/server/dist/rail-pr-delivery.js +2 -1
  218. package/server/dist/rail-pr-recovery-git.js +235 -0
  219. package/server/dist/rail-pr-store.js +429 -19
  220. package/server/dist/rail-pr-ticket-effects.js +328 -0
  221. package/server/dist/rail-worktree-release.js +305 -3
  222. package/server/dist/rails-router.js +238 -120
  223. package/server/dist/rails-store.js +106 -3
  224. package/server/dist/ticket-store.js +23 -1
  225. package/server/dist/transient-children.js +13 -0
  226. package/server/dist/util/cli-prompt.js +42 -8
  227. package/server/dist/util/secure-token-file.js +84 -0
  228. package/server/dist/worktree-manager.js +126 -21
  229. package/server/dist/worktree-overlay.js +166 -4
  230. package/client/dist/assets/ActivityFeedPage-D8RKRRoM.js +0 -1
  231. package/client/dist/assets/AgentBrowserCapture-BUHPHNSN.js +0 -1
  232. package/client/dist/assets/AgentModeCodePane-GZc8bNGT.js +0 -2
  233. package/client/dist/assets/AgentModeJobsPane-DWtQqj3k.js +0 -1
  234. package/client/dist/assets/AgentsPage-CKPtHkRP.js +0 -86
  235. package/client/dist/assets/AnalyticsPage-CZW8c77k.js +0 -1
  236. package/client/dist/assets/BarChart-DugEoe2q.js +0 -33
  237. package/client/dist/assets/CodePage-CQ-uKETG.js +0 -2
  238. package/client/dist/assets/DesktopAnalyticsPage-Bgo4SyCH.js +0 -1
  239. package/client/dist/assets/DocsDialog-DxpWw_La.js +0 -11
  240. package/client/dist/assets/DocsPage-CmcOkK19.js +0 -11
  241. package/client/dist/assets/ExportDropdown-DvTS2wc7.js +0 -1
  242. package/client/dist/assets/IntegrationsPage-B72WxJ3Z.js +0 -1
  243. package/client/dist/assets/InteractiveJobComposer-B5gh4Qoy.js +0 -19
  244. package/client/dist/assets/JobDetailModal-D-BeqsJ6.js +0 -1
  245. package/client/dist/assets/JobDetailPage-DwdozwLO.js +0 -1
  246. package/client/dist/assets/JobsPage-BDkinklt.js +0 -1
  247. package/client/dist/assets/LoopBuilderPage-CclJ3VZA.js +0 -7
  248. package/client/dist/assets/LoopPreviewModal-Dw4UgoLu.js +0 -1
  249. package/client/dist/assets/LoopsPage-D7ac4M24.js +0 -1
  250. package/client/dist/assets/PluginsPage-wdC-qa40.js +0 -2
  251. package/client/dist/assets/ProjectSettingsDialog-BlTlRtGI.js +0 -1
  252. package/client/dist/assets/TemplatePreviewModal-CeMx2Red.js +0 -1
  253. package/client/dist/assets/activity-Dbl71S-E.js +0 -1
  254. package/client/dist/assets/addon-image-CwoZj17F.js +0 -1
  255. package/client/dist/assets/addon-ligatures-CWDrED80.js +0 -2
  256. package/client/dist/assets/addspec-DrXqP8ip.js +0 -1
  257. package/client/dist/assets/agent-B8BXmlUQ2.js +0 -1
  258. package/client/dist/assets/agent-BEXYxDbs.js +0 -1
  259. package/client/dist/assets/agent-BYc3-6Ln2.js +0 -1
  260. package/client/dist/assets/agent-BbJorPdT.js +0 -1
  261. package/client/dist/assets/agent-CewFImgL.js +0 -1
  262. package/client/dist/assets/agent-DfhYoUmp.js +0 -1
  263. package/client/dist/assets/agent-TK_rrK4d.js +0 -1
  264. package/client/dist/assets/agent-bHjA9R_j2.js +0 -1
  265. package/client/dist/assets/agents-CGDn_3kB.js +0 -1
  266. package/client/dist/assets/agentstudio-Dxe_94PK.js +0 -1
  267. package/client/dist/assets/aiedit-DrfHQnlz.js +0 -1
  268. package/client/dist/assets/analytics-CxDYcBl9.js +0 -1
  269. package/client/dist/assets/attachments-DvxQbBTC.js +0 -1
  270. package/client/dist/assets/brain-C92rjjYP.js +0 -1
  271. package/client/dist/assets/browser-DM8G151q.js +0 -1
  272. package/client/dist/assets/chat-0dg5hOo_.js +0 -1
  273. package/client/dist/assets/chunk-BNv3lrIs.js +0 -1
  274. package/client/dist/assets/code-B62fClk-.js +0 -1
  275. package/client/dist/assets/commands-DCJ-R9E4.js +0 -1
  276. package/client/dist/assets/common-BM3LFLCE2.js +0 -1
  277. package/client/dist/assets/common-Bwafujnc2.js +0 -1
  278. package/client/dist/assets/common-C-vU-j-I.js +0 -1
  279. package/client/dist/assets/common-C5HKSbbz.js +0 -1
  280. package/client/dist/assets/common-DXrmj6WD.js +0 -1
  281. package/client/dist/assets/common-DhWTkocg.js +0 -1
  282. package/client/dist/assets/common-DiPTT7V_2.js +0 -1
  283. package/client/dist/assets/common-DmqBPwZG.js +0 -1
  284. package/client/dist/assets/dashboard-B5ang-ZS.js +0 -1
  285. package/client/dist/assets/dashboard-CHHcOWVL2.js +0 -1
  286. package/client/dist/assets/dashboard-DBD4wPGY2.js +0 -1
  287. package/client/dist/assets/dashboard-DBuLfWo9.js +0 -1
  288. package/client/dist/assets/dashboard-DSnztwWH.js +0 -1
  289. package/client/dist/assets/dashboard-D_aP_InU.js +0 -1
  290. package/client/dist/assets/dashboard-DmBcdl1B.js +0 -1
  291. package/client/dist/assets/dashboard-RIcUKY1Y2.js +0 -1
  292. package/client/dist/assets/editor.api2-C3B0tp2x.js +0 -872
  293. package/client/dist/assets/editor.worker-Bd9IXS8d.js +0 -26
  294. package/client/dist/assets/explore-_XyU5e7R.js +0 -1
  295. package/client/dist/assets/index-BVbgKXUu.css +0 -2
  296. package/client/dist/assets/index-DyY1QyIn.js +0 -158
  297. package/client/dist/assets/integrations-By80EBkf.js +0 -1
  298. package/client/dist/assets/jira-DeIjwCK3.js +0 -1
  299. package/client/dist/assets/jobs-1GV2-4zd2.js +0 -1
  300. package/client/dist/assets/jobs-26F9gGcE.js +0 -1
  301. package/client/dist/assets/jobs-BgQzB0Sx2.js +0 -1
  302. package/client/dist/assets/jobs-BqWui9_f.js +0 -1
  303. package/client/dist/assets/jobs-CE8qeIYj.js +0 -1
  304. package/client/dist/assets/jobs-DrYmsKy5.js +0 -1
  305. package/client/dist/assets/jobs-DzeuASRf.js +0 -1
  306. package/client/dist/assets/jobs-Wh7dn28q2.js +0 -1
  307. package/client/dist/assets/json.worker-DzV-CpCQ.js +0 -58
  308. package/client/dist/assets/lib-0PFDyMxJ.js +0 -7
  309. package/client/dist/assets/loops-CO6q75W8.js +0 -1
  310. package/client/dist/assets/mcp-HwBbQDk0.js +0 -1
  311. package/client/dist/assets/monaco.contribution-Desq7oq4.js +0 -2
  312. package/client/dist/assets/nav-BTg8s-cD.js +0 -1
  313. package/client/dist/assets/preload-helper-DSXbuxSR.js +0 -1
  314. package/client/dist/assets/settings-cJNynGIZ.js +0 -1
  315. package/client/dist/assets/setup-D2CmgAro.js +0 -1
  316. package/client/dist/assets/specs-PGIOzMtc.js +0 -1
  317. package/client/dist/assets/terminal-CFt56A5f.js +0 -1
  318. package/client/dist/assets/tickets-B7zT4IRf.js +0 -1
  319. package/client/dist/assets/tickets-BHv3ewvq.js +0 -1
  320. package/client/dist/assets/tickets-BoXom7l8.js +0 -1
  321. package/client/dist/assets/tickets-C3b8cHhd2.js +0 -1
  322. package/client/dist/assets/tickets-CFXnJsYF.js +0 -1
  323. package/client/dist/assets/tickets-CWYFvx1W2.js +0 -1
  324. package/client/dist/assets/tickets-DTHo9c3C.js +0 -1
  325. package/client/dist/assets/tickets-SuX_HkK4.js +0 -1
  326. package/client/dist/assets/upload-CmR4h9H1.js +0 -1
  327. package/client/dist/assets/value-JA3bf47v.js +0 -1
  328. /package/client/dist/assets/{abap-D0E4FfVW.js → abap-08VXUWAP.js} +0 -0
  329. /package/client/dist/assets/{activity--iN4Ad2R2.js → activity-B-rp4h_v.js} +0 -0
  330. /package/client/dist/assets/{activity-6hM_ZSg9.js → activity-C6kJpm9q2.js} +0 -0
  331. /package/client/dist/assets/{activity-CIOLxGvh.js → activity-CGx4kb_j.js} +0 -0
  332. /package/client/dist/assets/{activity-BZNfOdiS.js → activity-CnoX2bH7.js} +0 -0
  333. /package/client/dist/assets/{activity-BuVo5sPB.js → activity-DAyekdlt2.js} +0 -0
  334. /package/client/dist/assets/{activity-D2r2h3SE2.js → activity-DCxtpT7j.js} +0 -0
  335. /package/client/dist/assets/{activity-DtxrAUMo2.js → activity-JzwRaWPD.js} +0 -0
  336. /package/client/dist/assets/{addspec-BMtLZLW62.js → addspec-BXjvkh5q.js} +0 -0
  337. /package/client/dist/assets/{addspec-CRuvWn8d.js → addspec-C4bwrmpi.js} +0 -0
  338. /package/client/dist/assets/{addspec-D-JLDsUV.js → addspec-CArHXUDM.js} +0 -0
  339. /package/client/dist/assets/{addspec-mgPOt5q02.js → addspec-DTKJcXiR.js} +0 -0
  340. /package/client/dist/assets/{addspec-DfhDbg5c.js → addspec-DbNBbrha2.js} +0 -0
  341. /package/client/dist/assets/{addspec-CP0HRuxY.js → addspec-htHGZHOe2.js} +0 -0
  342. /package/client/dist/assets/{addspec-bsNDdqRm2.js → addspec-lr_LP6jk.js} +0 -0
  343. /package/client/dist/assets/{agents-78bTZGZh.js → agents-6ZOJXWVk2.js} +0 -0
  344. /package/client/dist/assets/{agents-DDtCJ5M02.js → agents-BZ0XQKjg.js} +0 -0
  345. /package/client/dist/assets/{agents-CWo-KyAB.js → agents-BqWklnHR.js} +0 -0
  346. /package/client/dist/assets/{agents-BUdEi3-N.js → agents-Bz-thHkB2.js} +0 -0
  347. /package/client/dist/assets/{agents-bvyRLczL.js → agents-CJclElx6.js} +0 -0
  348. /package/client/dist/assets/{agents-BpoUaoW92.js → agents-D_l9L0VA.js} +0 -0
  349. /package/client/dist/assets/{agents-BLhWCmDS2.js → agents-u_C0jPB5.js} +0 -0
  350. /package/client/dist/assets/{agentstudio-BMQxc_bz.js → agentstudio-BF19hbXj.js} +0 -0
  351. /package/client/dist/assets/{agentstudio-C_Jq8Tl4.js → agentstudio-BLGvxWBx2.js} +0 -0
  352. /package/client/dist/assets/{agentstudio-Dtq3dGYk.js → agentstudio-D9UKiWTj2.js} +0 -0
  353. /package/client/dist/assets/{agentstudio-CWgXG5W52.js → agentstudio-Drs37nIM.js} +0 -0
  354. /package/client/dist/assets/{agentstudio-sI27TpBu2.js → agentstudio-nEnKkcXM.js} +0 -0
  355. /package/client/dist/assets/{agentstudio-jKMTdT70.js → agentstudio-pyFcSBKy.js} +0 -0
  356. /package/client/dist/assets/{agentstudio-COZriimI2.js → agentstudio-zfTzQh3U.js} +0 -0
  357. /package/client/dist/assets/{aiedit-hknZlly82.js → aiedit-B0KUbpB6.js} +0 -0
  358. /package/client/dist/assets/{aiedit-eMN4eQPF.js → aiedit-BoG24nlg2.js} +0 -0
  359. /package/client/dist/assets/{aiedit-pc5JDUq1.js → aiedit-CjlSRQVP.js} +0 -0
  360. /package/client/dist/assets/{aiedit-B03pD_Na.js → aiedit-DCjA7jLJ.js} +0 -0
  361. /package/client/dist/assets/{aiedit-6CHdb_iv2.js → aiedit-DNXxq_Dr.js} +0 -0
  362. /package/client/dist/assets/{aiedit-igmw-ZoZ2.js → aiedit-DQ-0_pvE.js} +0 -0
  363. /package/client/dist/assets/{aiedit-BtRqRxML.js → aiedit-olnv3QSt2.js} +0 -0
  364. /package/client/dist/assets/{analytics-CCprAqk3.js → analytics-BC7mwR4s.js} +0 -0
  365. /package/client/dist/assets/{analytics-CR1TJqUi2.js → analytics-BiNg8edP.js} +0 -0
  366. /package/client/dist/assets/{analytics-Bj-SmKHa.js → analytics-C0s_T2GN.js} +0 -0
  367. /package/client/dist/assets/{analytics-C5dpiS0o.js → analytics-CdsAPAwZ2.js} +0 -0
  368. /package/client/dist/assets/{analytics-BWMUZ2Pq2.js → analytics-Cr1_q-lC.js} +0 -0
  369. /package/client/dist/assets/{analytics-DfNdXR0y2.js → analytics-IEsKZvpW2.js} +0 -0
  370. /package/client/dist/assets/{analytics-rmHuJv0V.js → analytics-SRPf84OT.js} +0 -0
  371. /package/client/dist/assets/{apex-D_X_8J4d.js → apex-BWPQTe0t.js} +0 -0
  372. /package/client/dist/assets/{atom-one-dark-BMDPFwRZ.js → atom-one-dark-qiGhVQxg.js} +0 -0
  373. /package/client/dist/assets/{attachments-BgBNSqQd.js → attachments-D0wXXt9T2.js} +0 -0
  374. /package/client/dist/assets/{attachments-C9GTTJsx2.js → attachments-DenIjuVI.js} +0 -0
  375. /package/client/dist/assets/{attachments-BjyMmrwE.js → attachments-DhO7LPfy.js} +0 -0
  376. /package/client/dist/assets/{attachments-DPCmkFZu2.js → attachments-DoH5w0x4.js} +0 -0
  377. /package/client/dist/assets/{attachments-DCZOL1RU.js → attachments-Q9yNtiEM.js} +0 -0
  378. /package/client/dist/assets/{attachments-rNn1ekRy2.js → attachments-V_WZAYXx2.js} +0 -0
  379. /package/client/dist/assets/{attachments-DL-bPy9E.js → attachments-eaeScpjM.js} +0 -0
  380. /package/client/dist/assets/{auth-DpZq5p1e.js → auth-D_5bQv5W.js} +0 -0
  381. /package/client/dist/assets/{azcli-PZLnZ3jH.js → azcli-Bc_sGQ0U.js} +0 -0
  382. /package/client/dist/assets/{bat-KlBOxpO4.js → bat-i0X4ZdIN.js} +0 -0
  383. /package/client/dist/assets/{bicep-CgG9oF3V.js → bicep-B5-_aFwp.js} +0 -0
  384. /package/client/dist/assets/{browser-BPkhILSJ.js → browser-C25DkQiO.js} +0 -0
  385. /package/client/dist/assets/{browser-BqLqJVVT.js → browser-CiJ7-L32.js} +0 -0
  386. /package/client/dist/assets/{browser-rWKj-RR_2.js → browser-CvgDySd9.js} +0 -0
  387. /package/client/dist/assets/{browser-Cvg-QHvd2.js → browser-CyR1Kp3m2.js} +0 -0
  388. /package/client/dist/assets/{browser-FRv8P02E.js → browser-DwZljcRh2.js} +0 -0
  389. /package/client/dist/assets/{browser-Cc0iDqUi.js → browser-DxP-alBK.js} +0 -0
  390. /package/client/dist/assets/{browser-BijVYG0Y2.js → browser-rRCwi7Y7.js} +0 -0
  391. /package/client/dist/assets/{cameligo-6R45j6Ph.js → cameligo-DMUM7wLl.js} +0 -0
  392. /package/client/dist/assets/{chat-Bom6bqK3.js → chat-2rIB8HhT.js} +0 -0
  393. /package/client/dist/assets/{chat-vylxqR0P2.js → chat-BR8oe53x2.js} +0 -0
  394. /package/client/dist/assets/{chat-Dnwg-NpQ.js → chat-Bua03tty.js} +0 -0
  395. /package/client/dist/assets/{chat-BgL3zv6x2.js → chat-CZpAQan1.js} +0 -0
  396. /package/client/dist/assets/{chat-DsbwJhus.js → chat-CdY5SGvS.js} +0 -0
  397. /package/client/dist/assets/{chat-Bh3NdgJs.js → chat-DZyu3ImY2.js} +0 -0
  398. /package/client/dist/assets/{chat-DdwZjT8K2.js → chat-D_I7nU5K.js} +0 -0
  399. /package/client/dist/assets/{clojure-CLAAMO7J.js → clojure-Cm7r79vr.js} +0 -0
  400. /package/client/dist/assets/{clsx-CNmW0Nip.js → clsx-CjueKrWZ.js} +0 -0
  401. /package/client/dist/assets/{code-UPVvmAKM2.js → code-76gS0IdL.js} +0 -0
  402. /package/client/dist/assets/{code-BRcDlze52.js → code-C1VwxlML.js} +0 -0
  403. /package/client/dist/assets/{code-CeQ0FZpC.js → code-CnMZyJpr.js} +0 -0
  404. /package/client/dist/assets/{code-DgeHz9CB.js → code-D20ef9Cf2.js} +0 -0
  405. /package/client/dist/assets/{code-DzC1rMk12.js → code-DdOXaWRY.js} +0 -0
  406. /package/client/dist/assets/{code-CwnBPPyA.js → code-Duohuf9l.js} +0 -0
  407. /package/client/dist/assets/{code-BdMy3Ffq.js → code-geHmknB92.js} +0 -0
  408. /package/client/dist/assets/{coffee-AruSygo-.js → coffee-Ba7i2nA0.js} +0 -0
  409. /package/client/dist/assets/{commands-DkU0qliq.js → commands-B9RZO4qS.js} +0 -0
  410. /package/client/dist/assets/{commands-u-4eEHCN.js → commands-BEwbAjtD2.js} +0 -0
  411. /package/client/dist/assets/{commands-JWMfGDmr.js → commands-Bbxu8kLU.js} +0 -0
  412. /package/client/dist/assets/{commands-C4Y3C-PF2.js → commands-CDU3qv68.js} +0 -0
  413. /package/client/dist/assets/{commands-xHDDGfcP2.js → commands-CzezgtQj.js} +0 -0
  414. /package/client/dist/assets/{commands-CSDs9q_2.js → commands-DTQBF_q52.js} +0 -0
  415. /package/client/dist/assets/{commands-RHOchN4n2.js → commands-hOtKuOXc.js} +0 -0
  416. /package/client/dist/assets/{cpp-DEE5r4Pw.js → cpp-C7h46wYY.js} +0 -0
  417. /package/client/dist/assets/{csharp-BVXJUvbK.js → csharp-BKxtCVv1.js} +0 -0
  418. /package/client/dist/assets/{csp-cXOF0JoV.js → csp-bTuwJoIa.js} +0 -0
  419. /package/client/dist/assets/{css-C_zQuAoy.js → css-DIMkf-bt.js} +0 -0
  420. /package/client/dist/assets/{cypher-t95m_Q-O.js → cypher-CVaqCwHa.js} +0 -0
  421. /package/client/dist/assets/{dart-B4r1Tg-e.js → dart-onAF5SnQ.js} +0 -0
  422. /package/client/dist/assets/{dockerfile-6mt7zHQw.js → dockerfile-DZFCIeNp.js} +0 -0
  423. /package/client/dist/assets/{ecl-DEY_Fz_Q.js → ecl-D05T4iGw.js} +0 -0
  424. /package/client/dist/assets/{elixir-R6-q1c5t.js → elixir-6RTg0lbw.js} +0 -0
  425. /package/client/dist/assets/{explore-B7fblXBb2.js → explore-BG99VGpL.js} +0 -0
  426. /package/client/dist/assets/{explore-CNBzrEPS.js → explore-C0TjprJW2.js} +0 -0
  427. /package/client/dist/assets/{explore-C0k8HrkN.js → explore-C2dgEo7q.js} +0 -0
  428. /package/client/dist/assets/{explore-BHtEpoNN2.js → explore-C8NDHbob.js} +0 -0
  429. /package/client/dist/assets/{explore-Dahc1lOx.js → explore-CWWgzQGR.js} +0 -0
  430. /package/client/dist/assets/{explore-D_mWBYCS2.js → explore-CcQXpdtS.js} +0 -0
  431. /package/client/dist/assets/{explore-UvW1jEMa.js → explore-DsXAgnmJ2.js} +0 -0
  432. /package/client/dist/assets/{flow9-CNQvHBOt.js → flow9-C5_-GSwl.js} +0 -0
  433. /package/client/dist/assets/{format-command-CuWuRvka.js → format-command-Dfa1o2d-.js} +0 -0
  434. /package/client/dist/assets/{fsharp-vPZkFXwv.js → fsharp-C8Ef5oNN.js} +0 -0
  435. /package/client/dist/assets/{go-KUzBMYJ_.js → go-C-y9NEjX.js} +0 -0
  436. /package/client/dist/assets/{graphql-C3W0rCsD.js → graphql-fmXr3nnJ.js} +0 -0
  437. /package/client/dist/assets/{hcl-BOOMFSNX.js → hcl-CpzslTdj.js} +0 -0
  438. /package/client/dist/assets/{ini-CFat1WJr.js → ini-sBoK_t0W.js} +0 -0
  439. /package/client/dist/assets/{integrations-TAcYNh0b.js → integrations-CH0zy1Mw2.js} +0 -0
  440. /package/client/dist/assets/{integrations-C1ThkTC52.js → integrations-CIAjhd7L.js} +0 -0
  441. /package/client/dist/assets/{integrations-2YcNyAl3.js → integrations-CZdwOe8A.js} +0 -0
  442. /package/client/dist/assets/{integrations-BXCvXUlG2.js → integrations-Ct7omMld.js} +0 -0
  443. /package/client/dist/assets/{integrations-Crk2rFhL2.js → integrations-D6MSxy3-.js} +0 -0
  444. /package/client/dist/assets/{integrations-Dn4JiGtW.js → integrations-DbZa-Zyc.js} +0 -0
  445. /package/client/dist/assets/{integrations-D9YrJ_Ep.js → integrations-b8pH-vfl2.js} +0 -0
  446. /package/client/dist/assets/{java-Dee-CNAM.js → java-BEtHBSE6.js} +0 -0
  447. /package/client/dist/assets/{jira-D5efgwp_.js → jira-BySfUuQZ.js} +0 -0
  448. /package/client/dist/assets/{jira-bDs7Im2C.js → jira-Byw2C0F8.js} +0 -0
  449. /package/client/dist/assets/{jira-BHAKtc4B.js → jira-CNeYi06w2.js} +0 -0
  450. /package/client/dist/assets/{jira-Be369RIR2.js → jira-D11gPhxz.js} +0 -0
  451. /package/client/dist/assets/{jira-CPpgA-5z2.js → jira-D38Gj7AT.js} +0 -0
  452. /package/client/dist/assets/{jira-uNH1gETL2.js → jira-gAvOyije.js} +0 -0
  453. /package/client/dist/assets/{jira-DS7ownDy.js → jira-pRaL7JQo2.js} +0 -0
  454. /package/client/dist/assets/{julia-CGNlLYuU.js → julia-Bri6UV-V.js} +0 -0
  455. /package/client/dist/assets/{kotlin-CY7lhknJ.js → kotlin-BOotOW0E.js} +0 -0
  456. /package/client/dist/assets/{less-D0KN7hfJ.js → less-B9JPFI3C.js} +0 -0
  457. /package/client/dist/assets/{lexon-CuRJufPs.js → lexon-CfSJPG6W.js} +0 -0
  458. /package/client/dist/assets/{loops-LIgO_-eM.js → loops-CPpgMapU.js} +0 -0
  459. /package/client/dist/assets/{loops-DJNhp17p2.js → loops-CWWbKuVL.js} +0 -0
  460. /package/client/dist/assets/{loops-D6D3XHjj.js → loops-Crc9It8o2.js} +0 -0
  461. /package/client/dist/assets/{loops-CvOWsi5r.js → loops-DH2hZcbK2.js} +0 -0
  462. /package/client/dist/assets/{loops-vhJdbcz92.js → loops-DS5TmvIU2.js} +0 -0
  463. /package/client/dist/assets/{loops-K5_HXfJa.js → loops-P2f0cN8-.js} +0 -0
  464. /package/client/dist/assets/{loops-BvqQ-bHR2.js → loops-fJV-9hH7.js} +0 -0
  465. /package/client/dist/assets/{lua-DHvH62Zf.js → lua-CsQS60Ue.js} +0 -0
  466. /package/client/dist/assets/{m3-tlthQ8Fo.js → m3-D-oSqn_W.js} +0 -0
  467. /package/client/dist/assets/{markdown-Dbx1LgUZ.js → markdown-Cimd5fb3.js} +0 -0
  468. /package/client/dist/assets/{mcp-Dcl-XxkR.js → mcp-Czd_iyp02.js} +0 -0
  469. /package/client/dist/assets/{mcp-XJNRfxVp2.js → mcp-D2pc5GGx.js} +0 -0
  470. /package/client/dist/assets/{mcp-sRmWE8WJ.js → mcp-D4ZjtIx32.js} +0 -0
  471. /package/client/dist/assets/{mcp-DtbxuH3V2.js → mcp-DIfBUv2D2.js} +0 -0
  472. /package/client/dist/assets/{mcp-H-gnQUdN.js → mcp-DsTwmjST.js} +0 -0
  473. /package/client/dist/assets/{mcp-N1nzp8oL.js → mcp-SMkn8boG.js} +0 -0
  474. /package/client/dist/assets/{mcp-CjVKXAhD2.js → mcp-fSfiVYAc.js} +0 -0
  475. /package/client/dist/assets/{mips-D_O3IUz_.js → mips-CIPQ_RoX.js} +0 -0
  476. /package/client/dist/assets/{msdax-C_ZmCnRt.js → msdax-DauUninz.js} +0 -0
  477. /package/client/dist/assets/{mysql-C-dCEYSX.js → mysql-SOo6toE5.js} +0 -0
  478. /package/client/dist/assets/{nav-BElxljIF2.js → nav-BRJBxaGt2.js} +0 -0
  479. /package/client/dist/assets/{nav-COu2E_-L.js → nav-CAGKv3_F.js} +0 -0
  480. /package/client/dist/assets/{nav-BXO7PJJG2.js → nav-CNskRJKQ2.js} +0 -0
  481. /package/client/dist/assets/{nav-CW9pxWfC2.js → nav-DY93irBL.js} +0 -0
  482. /package/client/dist/assets/{nav-CXHUA4uf.js → nav-DhjvYgqt.js} +0 -0
  483. /package/client/dist/assets/{nav-DdHF5VWJ.js → nav-Gb-r4wop.js} +0 -0
  484. /package/client/dist/assets/{nav-C8kOuGh8.js → nav-TvumAFD22.js} +0 -0
  485. /package/client/dist/assets/{objective-c-DZY9Aqxd.js → objective-c-FvmIjYaQ.js} +0 -0
  486. /package/client/dist/assets/{pascal-BVHLXoor.js → pascal-DrH0SRf2.js} +0 -0
  487. /package/client/dist/assets/{pascaligo-XdG_6u3k.js → pascaligo-D-ptJ9y-.js} +0 -0
  488. /package/client/dist/assets/{perl-b9QV0BcD.js → perl-oz_6vUea.js} +0 -0
  489. /package/client/dist/assets/{pgsql-Du5FDOgT.js → pgsql-DTj74zXo.js} +0 -0
  490. /package/client/dist/assets/{php-WJD0z2Z_.js → php-nr791fC2.js} +0 -0
  491. /package/client/dist/assets/{pla-CbciTf2w.js → pla-CopQ2nXW.js} +0 -0
  492. /package/client/dist/assets/{postiats-C1QxmvVq.js → postiats-43DmfD33.js} +0 -0
  493. /package/client/dist/assets/{powerquery-BEYDhPLZ.js → powerquery-D3hlyOfw.js} +0 -0
  494. /package/client/dist/assets/{powershell-CfaYw4XL.js → powershell-DmHpPYUd.js} +0 -0
  495. /package/client/dist/assets/{protobuf-pwZEDOYa.js → protobuf-C531GsRP.js} +0 -0
  496. /package/client/dist/assets/{pug-5ftqSPVe.js → pug-Z5eAx3Zn.js} +0 -0
  497. /package/client/dist/assets/{qsharp-uI6qZMq4.js → qsharp-DkqhCAOL.js} +0 -0
  498. /package/client/dist/assets/{r-BK54P1EG.js → r-BwWrilGY.js} +0 -0
  499. /package/client/dist/assets/{redis-DI0yd7kN.js → redis-ClamHrr6.js} +0 -0
  500. /package/client/dist/assets/{redshift-Dov26eyI.js → redshift-DT7zqm-g.js} +0 -0
  501. /package/client/dist/assets/{restructuredtext-QqJ_1dC-.js → restructuredtext-BYgofb2h.js} +0 -0
  502. /package/client/dist/assets/{ruby-5WjveeVb.js → ruby-DezsRK8O.js} +0 -0
  503. /package/client/dist/assets/{rust-BzVSfqFH.js → rust-DdL9SqIa.js} +0 -0
  504. /package/client/dist/assets/{sb-DMIUfT-3.js → sb-CcwsVR0C.js} +0 -0
  505. /package/client/dist/assets/{scala-CSKA7lqt.js → scala-DHpiXF5c.js} +0 -0
  506. /package/client/dist/assets/{scheme-CojOP2Qc.js → scheme-BeGwcela.js} +0 -0
  507. /package/client/dist/assets/{scss-DoBZGJG6.js → scss-gp-XZpBa.js} +0 -0
  508. /package/client/dist/assets/{settings-1w1O5Og82.js → settings-B9ilOSYO.js} +0 -0
  509. /package/client/dist/assets/{settings-Jc46vUhd.js → settings-BqlWHRHA.js} +0 -0
  510. /package/client/dist/assets/{settings-BSihkr0e.js → settings-D8dlqt4d.js} +0 -0
  511. /package/client/dist/assets/{settings-BiDOB3hV2.js → settings-DAZqjX2a2.js} +0 -0
  512. /package/client/dist/assets/{settings-DNL68KTE.js → settings-DRh39v1S2.js} +0 -0
  513. /package/client/dist/assets/{settings-BoubJhDP2.js → settings-Mj1OJbfd2.js} +0 -0
  514. /package/client/dist/assets/{settings-CB-EZ_W8.js → settings-lRReaSYm.js} +0 -0
  515. /package/client/dist/assets/{setup-D84y3wx-.js → setup-CGZjy2IF2.js} +0 -0
  516. /package/client/dist/assets/{setup-BuQNKztt2.js → setup-CXa0Sx16.js} +0 -0
  517. /package/client/dist/assets/{setup-BwMovM9z2.js → setup-D2ktKKMF2.js} +0 -0
  518. /package/client/dist/assets/{setup-DU0ULX8q2.js → setup-DG2H7ha5.js} +0 -0
  519. /package/client/dist/assets/{setup-BXpw07r-.js → setup-DK5bHDUq2.js} +0 -0
  520. /package/client/dist/assets/{setup-7J8TjG4O.js → setup-DrWlIQTZ.js} +0 -0
  521. /package/client/dist/assets/{setup-BiduSX9d.js → setup-rzHUVgAu.js} +0 -0
  522. /package/client/dist/assets/{shell-YOaE4udl.js → shell-CC2rA5mh.js} +0 -0
  523. /package/client/dist/assets/{solidity-l3jSyVLu.js → solidity-BEEn4gHE.js} +0 -0
  524. /package/client/dist/assets/{sophia-BhSGTaQJ.js → sophia-CRfGWb83.js} +0 -0
  525. /package/client/dist/assets/{sparql-qhk6QD9w.js → sparql-D_Lu-MrJ.js} +0 -0
  526. /package/client/dist/assets/{specs-CWtKcVDC.js → specs-BcyxaCwf2.js} +0 -0
  527. /package/client/dist/assets/{specs-DTplt2XM.js → specs-C1q9geAi.js} +0 -0
  528. /package/client/dist/assets/{specs-PozUNhqb.js → specs-CLZKysq-2.js} +0 -0
  529. /package/client/dist/assets/{specs-C9Sd7BhH2.js → specs-DZMS9o54.js} +0 -0
  530. /package/client/dist/assets/{specs-D2clrt2c2.js → specs-Dm6zUI-R.js} +0 -0
  531. /package/client/dist/assets/{specs-CBDvEYKv.js → specs-V3TvhKLX.js} +0 -0
  532. /package/client/dist/assets/{specs-CIPr9reA2.js → specs-dV3Mq5Mu2.js} +0 -0
  533. /package/client/dist/assets/{sql-DoO3y21-.js → sql-NEE52Syq.js} +0 -0
  534. /package/client/dist/assets/{st-ChZAY8oG.js → st-DbInun42.js} +0 -0
  535. /package/client/dist/assets/{swift-D290Tr7_.js → swift-Bxkupp3x.js} +0 -0
  536. /package/client/dist/assets/{systemverilog-DsxzgJ-o.js → systemverilog-Bz4Y3fRF.js} +0 -0
  537. /package/client/dist/assets/{tcl-BKDUHAAR.js → tcl-DISqw1ZD.js} +0 -0
  538. /package/client/dist/assets/{terminal-De2Brd23.js → terminal-BZiIu3rf.js} +0 -0
  539. /package/client/dist/assets/{terminal-cqfd3EDV.js → terminal-C2NAd7BW2.js} +0 -0
  540. /package/client/dist/assets/{terminal-WSAvHXoU.js → terminal-IahE4LW92.js} +0 -0
  541. /package/client/dist/assets/{terminal-Z7KsDM_n.js → terminal-QpXZU2Bn2.js} +0 -0
  542. /package/client/dist/assets/{terminal-xGbCZJHg.js → terminal-ScjyXNxQ.js} +0 -0
  543. /package/client/dist/assets/{terminal-BRm03iFA2.js → terminal-d7GadXbN.js} +0 -0
  544. /package/client/dist/assets/{terminal-DxQWCqSD2.js → terminal-tITa81iz.js} +0 -0
  545. /package/client/dist/assets/{twig-UpZQaM8G.js → twig-De2hgUGE.js} +0 -0
  546. /package/client/dist/assets/{typespec-DzaKvN8i.js → typespec-B8J7ngcE.js} +0 -0
  547. /package/client/dist/assets/{vb-CZpbb7tk.js → vb-DV3o63ZY.js} +0 -0
  548. /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
- return ticketIds.length > 0 && ticketIds.every((id) => covered.has(id));
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. Guarded: the rail must
170
- // exist, hold no tickets, have no active job/loop run, no undecided PR
171
- // delivery, and must not be the last remaining rail. Indices are identity —
172
- // deleting a middle rail leaves a gap (never re-numbered).
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 continuablePrDeliveryForFallback = null;
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
- if ((0, rail_isolation_1.isolationApplies)({ loopsEnabled: (0, feature_flags_1.isLoopsEnabled)(), scope, ticketCount: rail.ticketIds.length, readOnly: loopReadOnly })) {
553
- // Relaunch collision (ask-first PR delivery): a delivery that has not
554
- // produced a real PR yet still needs a user decision before more work
555
- // can safely append to its branches. Once a draft/published PR exists
556
- // and covers this rail's tickets, relaunch is intentional continuation
557
- // of that PR head branch (resolved inside launchIsolatedRail).
558
- if ((0, rail_isolation_1.isRailPrDeliveryEnabled)()) {
559
- const pending = (0, rail_pr_store_1.getActivePrDeliveryByRail)(c.db, railIndex);
560
- const pendingSnapshot = pending ? (0, rail_pr_store_1.toPrDeliverySnapshot)(pending) : null;
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
- preservePrDeliveryOnAllocationFailure: Boolean(continuablePrDeliveryForFallback),
582
- onPrDeliveryCreated: (id) => { fallbackPrDeliveryId = id; },
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 sharedRunSettles = [];
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
- sharedRunSettles.push(runPromise);
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-merge, compare-and-set-guarded by
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: "action must be 'create-pr', 'publish', 'discard' or 'poll-merge'" });
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 result = await (0, rail_pr_decision_1.executePrDecision)({
915
- db: c.db,
916
- project: { id: c.project.id, slug: c.project.slug, path: c.project.path },
917
- git: worktree_manager_1.defaultGitRunner,
918
- exec: pr_publisher_1.defaultExec,
919
- broadcast: c.broadcast,
920
- jiraSyncManager: c.jiraSyncManager,
921
- }, { prDeliveryId, action, expectedDecision });
922
- res.status(result.status).json(result.body);
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 info = await (0, project_git_1.getProjectGitInfo)(c.project.path);
953
- if (!info.git) {
954
- res.status(409).json({ error: 'checkout_unavailable', detail: 'project is not a git repository' });
955
- return;
956
- }
957
- if (info.dirty) {
958
- res.status(409).json({ error: 'checkout_dirty', detail: 'Working tree has uncommitted changes. Commit or stash them before checkout.' });
959
- return;
960
- }
961
- await (0, rail_worktree_release_1.releaseRailWorktrees)({
962
- db: c.db,
963
- git: worktree_manager_1.defaultGitRunner,
964
- repoDir: c.project.path,
965
- worktreeIds: snap.worktreeIds,
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
- const result = await (0, project_git_1.checkoutProjectReviewBranch)(c.project.path, snap.branch);
968
- if (!result.ok) {
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({ ok: true, git: await (0, project_git_1.getProjectGitInfo)(c.project.path) });
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 rows. Pure mechanism — the router enforces
171
- * the guards (rail exists, empty, idle, no pending PR decision, not the last
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
  })();