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.
Files changed (545) hide show
  1. package/client/dist/assets/ActivityFeedPage-ClpD5CFj.js +1 -0
  2. package/client/dist/assets/AgentBrowserCapture-CSPs9Ofc.js +1 -0
  3. package/client/dist/assets/AgentModeCodePane-DwcyklA5.js +2 -0
  4. package/client/dist/assets/AgentModeJobsPane-C69bqlMa.js +1 -0
  5. package/client/dist/assets/AgentsPage-pRiRr9-W.js +86 -0
  6. package/client/dist/assets/AnalyticsPage-C14exKsC.js +1 -0
  7. package/client/dist/assets/BarChart-nBOMNfiy.js +33 -0
  8. package/client/dist/assets/CodePage-CK76JKm9.js +2 -0
  9. package/client/dist/assets/DesktopAnalyticsPage-Cnv0f3XQ.js +1 -0
  10. package/client/dist/assets/DocsDialog-CHUm_Ym0.js +11 -0
  11. package/client/dist/assets/DocsPage-COI-oDok.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-CypM7R1F.js +19 -0
  15. package/client/dist/assets/JobDetailModal-B_W0H9dw.js +1 -0
  16. package/client/dist/assets/JobDetailPage-CeeXOoKS.js +1 -0
  17. package/client/dist/assets/JobsPage-CwhJG9jw.js +1 -0
  18. package/client/dist/assets/LoopBuilderPage-C51t1WOM.js +7 -0
  19. package/client/dist/assets/LoopPreviewModal-Y2HgtIJu.js +1 -0
  20. package/client/dist/assets/LoopsPage-Bvn1Kw5V.js +1 -0
  21. package/client/dist/assets/MinimizedChatsContext-DiFvZDPW.js +1 -0
  22. package/client/dist/assets/PluginsPage-BGPRJpdf.js +2 -0
  23. package/client/dist/assets/ProjectSettingsDialog-D_GTyGLc.js +1 -0
  24. package/client/dist/assets/TemplatePreviewModal-szwBhd7h.js +1 -0
  25. package/client/dist/assets/TicketDetailModal-9UEyK974.js +14 -0
  26. package/client/dist/assets/Trans-B_vKZ-Hb.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-4rmXoo_p.js +1 -0
  33. package/client/dist/assets/agent-BxZuNGih.js +1 -0
  34. package/client/dist/assets/agent-C3uXOYv_.js +1 -0
  35. package/client/dist/assets/agent-CA8Y4wbw.js +1 -0
  36. package/client/dist/assets/agent-CASKrhG12.js +1 -0
  37. package/client/dist/assets/agent-Cv-jud5n2.js +1 -0
  38. package/client/dist/assets/agent-DitUxYh2.js +1 -0
  39. package/client/dist/assets/agent-Doow4X7o.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-CD1QHriA2.js +1 -0
  58. package/client/dist/assets/common-CwwPaRxx.js +1 -0
  59. package/client/dist/assets/common-DVQuhs-m.js +1 -0
  60. package/client/dist/assets/common-Dg2jaX7d.js +1 -0
  61. package/client/dist/assets/common-DuBwj6tK.js +1 -0
  62. package/client/dist/assets/common-MRj9MHcc.js +1 -0
  63. package/client/dist/assets/common-O4ZpnMLp.js +1 -0
  64. package/client/dist/assets/common-fyeF0v7C2.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-B_NkSHYm.js +1 -0
  69. package/client/dist/assets/dashboard-ClBb_3pq.js +1 -0
  70. package/client/dist/assets/dashboard-CpCmJvMB.js +1 -0
  71. package/client/dist/assets/dashboard-Czohu35O2.js +1 -0
  72. package/client/dist/assets/dashboard-DcjbD0UK.js +1 -0
  73. package/client/dist/assets/dashboard-Dvx5F3we.js +1 -0
  74. package/client/dist/assets/dashboard-R1bOPjBh2.js +1 -0
  75. package/client/dist/assets/dashboard-owcDucDi.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-UjXbEWhN.js → dist-js-CcBCbb32.js} +1 -1
  80. package/client/dist/assets/{dist-js-BTAcxhPb.js → dist-js-VwztRkGj.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-ByHIauTQ.js +1 -0
  89. package/client/dist/assets/{freemarker2-J5iIIIK-.js → freemarker2-CELlTDJ2.js} +1 -1
  90. package/client/dist/assets/getTimezoneOffsetInMilliseconds-BxHAksaU.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-CgaRxpII.js +2 -0
  97. package/client/dist/assets/index-BflYQpWm.css +2 -0
  98. package/client/dist/assets/index-C1_-BTXy.js +72 -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/{settings-Bp24JHlv2.js → settings-B9ilOSYO.js} +1 -1
  137. package/client/dist/assets/{settings-Bx2ObkTR2.js → settings-BqlWHRHA.js} +1 -1
  138. package/client/dist/assets/{settings-C_T0-j9d.js → settings-D8dlqt4d.js} +1 -1
  139. package/client/dist/assets/{settings-DhaFKpcw2.js → settings-DAZqjX2a2.js} +1 -1
  140. package/client/dist/assets/{settings-B_v3zgJf.js → settings-DRh39v1S2.js} +1 -1
  141. package/client/dist/assets/{settings-BemR_e3F.js → settings-Mj1OJbfd2.js} +1 -1
  142. package/client/dist/assets/{settings-BvIwQ3A1.js → settings-lRReaSYm.js} +1 -1
  143. package/client/dist/assets/setup-CmK87LuS.js +1 -0
  144. package/client/dist/assets/sparkles-DrY8hb0X.js +1 -0
  145. package/client/dist/assets/specs-DII0C8gw.js +1 -0
  146. package/client/dist/assets/spending-C4p06nen.js +1 -0
  147. package/client/dist/assets/terminal-BFRZnMPP.js +1 -0
  148. package/client/dist/assets/tickets-B8BuAaj5.js +1 -0
  149. package/client/dist/assets/tickets-B_yh4qQk.js +1 -0
  150. package/client/dist/assets/tickets-Bs37scwY2.js +1 -0
  151. package/client/dist/assets/tickets-CFk2n2Or.js +1 -0
  152. package/client/dist/assets/tickets-DQp7JS2R2.js +1 -0
  153. package/client/dist/assets/tickets-D_yDquEw.js +1 -0
  154. package/client/dist/assets/tickets-DpmdE8tv2.js +1 -0
  155. package/client/dist/assets/tickets-pAUJkDTu.js +1 -0
  156. package/client/dist/assets/trash-2-BOU3WdZZ.js +1 -0
  157. package/client/dist/assets/triangle-alert-H9T4jAmh.js +1 -0
  158. package/client/dist/assets/{ts.worker-METxwbDZ.js → ts.worker-BtjBFNHX.js} +48 -33
  159. package/client/dist/assets/{tsMode-BmT8WogI.js → tsMode-DEjSThU9.js} +1 -1
  160. package/client/dist/assets/{typescript-CQrQPsoW.js → typescript-CRRnD2Ts.js} +1 -1
  161. package/client/dist/assets/upload-DYMjAQ6M.js +1 -0
  162. package/client/dist/assets/useBrowserCaptureSession-2OqX0vap.js +1 -0
  163. package/client/dist/assets/useDesktop-X8YB9xzv.js +1 -0
  164. package/client/dist/assets/useSharedWebSocket-DaPh7QBL.js +1 -0
  165. package/client/dist/assets/utils-BC4DHlz2.js +1 -0
  166. package/client/dist/assets/value-s-gzBeyF.js +1 -0
  167. package/client/dist/assets/{workers-U0UXyLUf.js → workers-uOo7WLaa.js} +1 -1
  168. package/client/dist/assets/x-CBMI9ejn.js +1 -0
  169. package/client/dist/assets/{xml-WRxJs8_I.js → xml-EDREH2X7.js} +1 -1
  170. package/client/dist/assets/{yaml-CjpSTjJU.js → yaml-BjaDVX1E.js} +1 -1
  171. package/client/dist/assets/zap-CHo3aCD1.js +1 -0
  172. package/client/dist/index.html +73 -32
  173. package/docs/guide/en/integrations/5-mcp-server.md +2 -2
  174. package/docs/internals/safe-pr-review-flow.md +190 -132
  175. package/docs/mcp.md +15 -5
  176. package/package.json +11 -7
  177. package/server/dist/active-pr-continuation.js +16 -1
  178. package/server/dist/agent-chat-manager.js +360 -181
  179. package/server/dist/agent-cwd-manager.js +52 -8
  180. package/server/dist/agent-generator.js +90 -48
  181. package/server/dist/agent-mcp-config.js +69 -36
  182. package/server/dist/agent-operator-prompt.js +3 -2
  183. package/server/dist/agent-refine-manager.js +47 -6
  184. package/server/dist/agent-tier.js +13 -11
  185. package/server/dist/artifact-registry.js +33 -2
  186. package/server/dist/auth.js +5 -4
  187. package/server/dist/browser-capture-manager.js +92 -29
  188. package/server/dist/chat-manager.js +302 -46
  189. package/server/dist/contract-refine-runner.js +19 -6
  190. package/server/dist/db.js +665 -8
  191. package/server/dist/desktop-router.js +1 -2
  192. package/server/dist/headroom-manager.js +1310 -121
  193. package/server/dist/headroom-routing.js +120 -2
  194. package/server/dist/index.js +48 -13
  195. package/server/dist/interactive-job-session.js +237 -82
  196. package/server/dist/jira/jira-adf.js +10 -0
  197. package/server/dist/jira/jira-db.js +15 -3
  198. package/server/dist/jira/jira-sync-manager.js +182 -13
  199. package/server/dist/job-listing.js +140 -0
  200. package/server/dist/job-spawn-idempotency.js +67 -0
  201. package/server/dist/loop-run-manager.js +508 -98
  202. package/server/dist/loop-runs-store.js +266 -13
  203. package/server/dist/mcp/agent-capability.js +71 -0
  204. package/server/dist/mcp/guide.js +5 -2
  205. package/server/dist/mcp/mcp-server.js +5 -10
  206. package/server/dist/mcp/mcp-token.js +5 -5
  207. package/server/dist/mcp/tools/jobs.js +20 -13
  208. package/server/dist/mcp/tools/types.js +20 -42
  209. package/server/dist/mobile/mobile-router.js +1 -1
  210. package/server/dist/pr-lifecycle.js +77 -0
  211. package/server/dist/pr-publisher.js +94 -27
  212. package/server/dist/process-admission.js +82 -0
  213. package/server/dist/project-registry.js +572 -174
  214. package/server/dist/project-router-git.js +13 -2
  215. package/server/dist/project-router-jobs.js +111 -55
  216. package/server/dist/project-router-tickets.js +32 -2
  217. package/server/dist/providers/claude-adapter.js +21 -13
  218. package/server/dist/queue-manager.js +2332 -623
  219. package/server/dist/rail-isolated-launch.js +1141 -280
  220. package/server/dist/rail-isolation.js +4 -2
  221. package/server/dist/rail-pr-decision.js +756 -270
  222. package/server/dist/rail-pr-delivery.js +2 -1
  223. package/server/dist/rail-pr-store.js +317 -18
  224. package/server/dist/rail-pr-ticket-effects.js +328 -0
  225. package/server/dist/rail-worktree-release.js +28 -6
  226. package/server/dist/rails-router.js +149 -112
  227. package/server/dist/rails-store.js +106 -3
  228. package/server/dist/ticket-store.js +23 -1
  229. package/server/dist/transient-children.js +13 -0
  230. package/server/dist/util/cli-prompt.js +42 -8
  231. package/server/dist/util/secure-token-file.js +84 -0
  232. package/server/dist/worktree-manager.js +70 -21
  233. package/client/dist/assets/ActivityFeedPage-Be-6L0Ld.js +0 -1
  234. package/client/dist/assets/AgentBrowserCapture-CpZ-dd8O.js +0 -1
  235. package/client/dist/assets/AgentIntegrationsModal-DO1pN_Ez.js +0 -1
  236. package/client/dist/assets/AgentModeCodePane-DLltTOqp.js +0 -2
  237. package/client/dist/assets/AgentModeJobsPane-Dp5YvmW0.js +0 -1
  238. package/client/dist/assets/AgentsPage-ehHuVUds.js +0 -86
  239. package/client/dist/assets/AnalyticsPage-C4Ik95FX.js +0 -1
  240. package/client/dist/assets/BarChart-DVZgrhJd.js +0 -33
  241. package/client/dist/assets/CodePage-D4OCMfxL.js +0 -2
  242. package/client/dist/assets/DesktopAnalyticsPage-2Xf-52x2.js +0 -1
  243. package/client/dist/assets/DocsDialog-CHihLjWd.js +0 -11
  244. package/client/dist/assets/DocsPage-1vEk7XbH.js +0 -11
  245. package/client/dist/assets/ExportDropdown-DLHFQxVn.js +0 -1
  246. package/client/dist/assets/IntegrationsPage-CCb2YuyJ.js +0 -1
  247. package/client/dist/assets/InteractiveJobComposer-CxJJEnjw.js +0 -19
  248. package/client/dist/assets/JobDetailModal-CJI7qRkm.js +0 -1
  249. package/client/dist/assets/JobDetailPage-DwA9bbwx.js +0 -1
  250. package/client/dist/assets/JobsPage-BDIyFfd5.js +0 -1
  251. package/client/dist/assets/LoopBuilderPage-CpBaW59t.js +0 -7
  252. package/client/dist/assets/LoopPreviewModal-CwpKcv0Y.js +0 -1
  253. package/client/dist/assets/LoopsPage-BO0Pa8oz.js +0 -1
  254. package/client/dist/assets/PluginsPage-BBGTBpGh.js +0 -2
  255. package/client/dist/assets/ProjectSettingsDialog-M9zGQo0l.js +0 -1
  256. package/client/dist/assets/TemplatePreviewModal-eBI0zL5P.js +0 -1
  257. package/client/dist/assets/activity-Dbl71S-E.js +0 -1
  258. package/client/dist/assets/addon-image-CwoZj17F.js +0 -1
  259. package/client/dist/assets/addon-ligatures-CWDrED80.js +0 -2
  260. package/client/dist/assets/addspec-DrXqP8ip.js +0 -1
  261. package/client/dist/assets/agent-BEXYxDbs.js +0 -1
  262. package/client/dist/assets/agent-BoXSzaBk2.js +0 -1
  263. package/client/dist/assets/agent-C2-rROL52.js +0 -1
  264. package/client/dist/assets/agent-CeRTdGT12.js +0 -1
  265. package/client/dist/assets/agent-DZ8zTrQT.js +0 -1
  266. package/client/dist/assets/agent-DqyzT33X.js +0 -1
  267. package/client/dist/assets/agent-fQI_6tsA.js +0 -1
  268. package/client/dist/assets/agent-tJdAobaM.js +0 -1
  269. package/client/dist/assets/agents-CGDn_3kB.js +0 -1
  270. package/client/dist/assets/agentstudio-Dxe_94PK.js +0 -1
  271. package/client/dist/assets/aiedit-DrfHQnlz.js +0 -1
  272. package/client/dist/assets/analytics-CxDYcBl9.js +0 -1
  273. package/client/dist/assets/attachments-DvxQbBTC.js +0 -1
  274. package/client/dist/assets/brain-DecvjjPU.js +0 -1
  275. package/client/dist/assets/browser-DM8G151q.js +0 -1
  276. package/client/dist/assets/chat-0dg5hOo_.js +0 -1
  277. package/client/dist/assets/chunk-BNv3lrIs.js +0 -1
  278. package/client/dist/assets/code-B62fClk-.js +0 -1
  279. package/client/dist/assets/commands-DCJ-R9E4.js +0 -1
  280. package/client/dist/assets/common-BfQD173j.js +0 -1
  281. package/client/dist/assets/common-CF8iGXrG.js +0 -1
  282. package/client/dist/assets/common-Cfmwcrl52.js +0 -1
  283. package/client/dist/assets/common-D2cimsul.js +0 -1
  284. package/client/dist/assets/common-DH7fjyL1.js +0 -1
  285. package/client/dist/assets/common-DXrmj6WD.js +0 -1
  286. package/client/dist/assets/common-DZbXlmq72.js +0 -1
  287. package/client/dist/assets/common-DtXmzX2o2.js +0 -1
  288. package/client/dist/assets/dashboard-5C2FOZQX.js +0 -1
  289. package/client/dist/assets/dashboard-B6iQ-IL_.js +0 -1
  290. package/client/dist/assets/dashboard-BFfnCtq52.js +0 -1
  291. package/client/dist/assets/dashboard-BIC8KtRf2.js +0 -1
  292. package/client/dist/assets/dashboard-CEgg9NAr.js +0 -1
  293. package/client/dist/assets/dashboard-CiOyDh9L.js +0 -1
  294. package/client/dist/assets/dashboard-D6x5OnNj2.js +0 -1
  295. package/client/dist/assets/dashboard-DBuLfWo9.js +0 -1
  296. package/client/dist/assets/editor.api2-C3B0tp2x.js +0 -872
  297. package/client/dist/assets/editor.worker-Bd9IXS8d.js +0 -26
  298. package/client/dist/assets/explore-_XyU5e7R.js +0 -1
  299. package/client/dist/assets/index-BVbgKXUu.css +0 -2
  300. package/client/dist/assets/index-OBDI7bHm.js +0 -158
  301. package/client/dist/assets/integrations-By80EBkf.js +0 -1
  302. package/client/dist/assets/jira-DeIjwCK3.js +0 -1
  303. package/client/dist/assets/jobs-BFIdeDTw.js +0 -1
  304. package/client/dist/assets/jobs-BJ-Gcao22.js +0 -1
  305. package/client/dist/assets/jobs-DAGiPVIS2.js +0 -1
  306. package/client/dist/assets/jobs-DAU8C_tZ.js +0 -1
  307. package/client/dist/assets/jobs-Da0GaaSc.js +0 -1
  308. package/client/dist/assets/jobs-DrYmsKy5.js +0 -1
  309. package/client/dist/assets/jobs-P3unxtxo2.js +0 -1
  310. package/client/dist/assets/jobs-p360zdf1.js +0 -1
  311. package/client/dist/assets/json.worker-DzV-CpCQ.js +0 -58
  312. package/client/dist/assets/lib-C5ZxrPSR.js +0 -7
  313. package/client/dist/assets/loops-CO6q75W8.js +0 -1
  314. package/client/dist/assets/mcp-HwBbQDk0.js +0 -1
  315. package/client/dist/assets/monaco.contribution-Desq7oq4.js +0 -2
  316. package/client/dist/assets/nav-BTg8s-cD.js +0 -1
  317. package/client/dist/assets/preload-helper-DSXbuxSR.js +0 -1
  318. package/client/dist/assets/settings-BYCMtxOz.js +0 -1
  319. package/client/dist/assets/setup-D2CmgAro.js +0 -1
  320. package/client/dist/assets/specs-PGIOzMtc.js +0 -1
  321. package/client/dist/assets/terminal-CFt56A5f.js +0 -1
  322. package/client/dist/assets/tickets-BHv3ewvq.js +0 -1
  323. package/client/dist/assets/tickets-BIxU86j12.js +0 -1
  324. package/client/dist/assets/tickets-C2BhwzwR.js +0 -1
  325. package/client/dist/assets/tickets-D1IeX2EW.js +0 -1
  326. package/client/dist/assets/tickets-DZut8Ryt.js +0 -1
  327. package/client/dist/assets/tickets-LfK6LzKl2.js +0 -1
  328. package/client/dist/assets/tickets-dQfsc7Ph.js +0 -1
  329. package/client/dist/assets/tickets-sVun0I6v.js +0 -1
  330. package/client/dist/assets/upload-lgjKJgrl.js +0 -1
  331. package/client/dist/assets/value-Bc0_jlJA.js +0 -1
  332. /package/client/dist/assets/{abap-D0E4FfVW.js → abap-08VXUWAP.js} +0 -0
  333. /package/client/dist/assets/{activity-BbWiDfn-2.js → activity-B-rp4h_v.js} +0 -0
  334. /package/client/dist/assets/{activity-DvECTYGt.js → activity-C6kJpm9q2.js} +0 -0
  335. /package/client/dist/assets/{activity-D3Ic-HTS.js → activity-CGx4kb_j.js} +0 -0
  336. /package/client/dist/assets/{activity-BZZlEG3a.js → activity-CnoX2bH7.js} +0 -0
  337. /package/client/dist/assets/{activity-DtzRy92x.js → activity-DAyekdlt2.js} +0 -0
  338. /package/client/dist/assets/{activity-FleOlK0l2.js → activity-DCxtpT7j.js} +0 -0
  339. /package/client/dist/assets/{activity-DFbvNqhE2.js → activity-JzwRaWPD.js} +0 -0
  340. /package/client/dist/assets/{addspec-CFxGvmJR2.js → addspec-BXjvkh5q.js} +0 -0
  341. /package/client/dist/assets/{addspec-NBbcTbLc.js → addspec-C4bwrmpi.js} +0 -0
  342. /package/client/dist/assets/{addspec-BKrH2Ucz.js → addspec-CArHXUDM.js} +0 -0
  343. /package/client/dist/assets/{addspec-CR8MB5Fr2.js → addspec-DTKJcXiR.js} +0 -0
  344. /package/client/dist/assets/{addspec-B_LQMHW3.js → addspec-DbNBbrha2.js} +0 -0
  345. /package/client/dist/assets/{addspec-DaA-CbTt.js → addspec-htHGZHOe2.js} +0 -0
  346. /package/client/dist/assets/{addspec-Bw_YQwo62.js → addspec-lr_LP6jk.js} +0 -0
  347. /package/client/dist/assets/{agents-BHgn--3j.js → agents-6ZOJXWVk2.js} +0 -0
  348. /package/client/dist/assets/{agents-VsyFhGOS2.js → agents-BZ0XQKjg.js} +0 -0
  349. /package/client/dist/assets/{agents-HFCqQH0Z.js → agents-BqWklnHR.js} +0 -0
  350. /package/client/dist/assets/{agents-B_qGaB0F.js → agents-Bz-thHkB2.js} +0 -0
  351. /package/client/dist/assets/{agents-CP8_ezYG.js → agents-CJclElx6.js} +0 -0
  352. /package/client/dist/assets/{agents-B9pFSJQI2.js → agents-D_l9L0VA.js} +0 -0
  353. /package/client/dist/assets/{agents-CV-_xBvX2.js → agents-u_C0jPB5.js} +0 -0
  354. /package/client/dist/assets/{agentstudio-BEp7Sb46.js → agentstudio-BF19hbXj.js} +0 -0
  355. /package/client/dist/assets/{agentstudio-Br3WD7Xs.js → agentstudio-BLGvxWBx2.js} +0 -0
  356. /package/client/dist/assets/{agentstudio-BOjG6tgJ.js → agentstudio-D9UKiWTj2.js} +0 -0
  357. /package/client/dist/assets/{agentstudio-D2A5peWV2.js → agentstudio-Drs37nIM.js} +0 -0
  358. /package/client/dist/assets/{agentstudio-CuTt3ZGe2.js → agentstudio-nEnKkcXM.js} +0 -0
  359. /package/client/dist/assets/{agentstudio-RsxnZtUA.js → agentstudio-pyFcSBKy.js} +0 -0
  360. /package/client/dist/assets/{agentstudio-RfZavULt2.js → agentstudio-zfTzQh3U.js} +0 -0
  361. /package/client/dist/assets/{aiedit-DnBzjlVz2.js → aiedit-B0KUbpB6.js} +0 -0
  362. /package/client/dist/assets/{aiedit-D0Syl-mC.js → aiedit-BoG24nlg2.js} +0 -0
  363. /package/client/dist/assets/{aiedit-CcugGPbS.js → aiedit-CjlSRQVP.js} +0 -0
  364. /package/client/dist/assets/{aiedit-DrIjSojo.js → aiedit-DCjA7jLJ.js} +0 -0
  365. /package/client/dist/assets/{aiedit-CV520D4W2.js → aiedit-DNXxq_Dr.js} +0 -0
  366. /package/client/dist/assets/{aiedit-26p5A_HY2.js → aiedit-DQ-0_pvE.js} +0 -0
  367. /package/client/dist/assets/{aiedit-a-Z-g5iC.js → aiedit-olnv3QSt2.js} +0 -0
  368. /package/client/dist/assets/{analytics-DEe5BMz8.js → analytics-BC7mwR4s.js} +0 -0
  369. /package/client/dist/assets/{analytics-4HvXb0Vn2.js → analytics-BiNg8edP.js} +0 -0
  370. /package/client/dist/assets/{analytics-CpSTNfui.js → analytics-C0s_T2GN.js} +0 -0
  371. /package/client/dist/assets/{analytics-4-eskbtX.js → analytics-CdsAPAwZ2.js} +0 -0
  372. /package/client/dist/assets/{analytics-Bpe41fnX2.js → analytics-Cr1_q-lC.js} +0 -0
  373. /package/client/dist/assets/{analytics-DcOITHla2.js → analytics-IEsKZvpW2.js} +0 -0
  374. /package/client/dist/assets/{analytics-Bd9rHGjV.js → analytics-SRPf84OT.js} +0 -0
  375. /package/client/dist/assets/{apex-D_X_8J4d.js → apex-BWPQTe0t.js} +0 -0
  376. /package/client/dist/assets/{atom-one-dark-BMDPFwRZ.js → atom-one-dark-qiGhVQxg.js} +0 -0
  377. /package/client/dist/assets/{attachments-CgOQ9K-6.js → attachments-D0wXXt9T2.js} +0 -0
  378. /package/client/dist/assets/{attachments-DlEQu56g2.js → attachments-DenIjuVI.js} +0 -0
  379. /package/client/dist/assets/{attachments-CA2f3qL3.js → attachments-DhO7LPfy.js} +0 -0
  380. /package/client/dist/assets/{attachments-D2jwJXQ42.js → attachments-DoH5w0x4.js} +0 -0
  381. /package/client/dist/assets/{attachments-CHDbhKeH.js → attachments-Q9yNtiEM.js} +0 -0
  382. /package/client/dist/assets/{attachments-CKAY5aYG2.js → attachments-V_WZAYXx2.js} +0 -0
  383. /package/client/dist/assets/{attachments-jVdKzAXn.js → attachments-eaeScpjM.js} +0 -0
  384. /package/client/dist/assets/{auth-DpZq5p1e.js → auth-D_5bQv5W.js} +0 -0
  385. /package/client/dist/assets/{azcli-PZLnZ3jH.js → azcli-Bc_sGQ0U.js} +0 -0
  386. /package/client/dist/assets/{bat-KlBOxpO4.js → bat-i0X4ZdIN.js} +0 -0
  387. /package/client/dist/assets/{bicep-CgG9oF3V.js → bicep-B5-_aFwp.js} +0 -0
  388. /package/client/dist/assets/{browser-Cl-FwPXs.js → browser-C25DkQiO.js} +0 -0
  389. /package/client/dist/assets/{browser-JsiohNmW.js → browser-CiJ7-L32.js} +0 -0
  390. /package/client/dist/assets/{browser-BbJ_q_OT2.js → browser-CvgDySd9.js} +0 -0
  391. /package/client/dist/assets/{browser-BQFDxrRq.js → browser-CyR1Kp3m2.js} +0 -0
  392. /package/client/dist/assets/{browser-Do2jf8_N.js → browser-DwZljcRh2.js} +0 -0
  393. /package/client/dist/assets/{browser-C4VJ5CW12.js → browser-DxP-alBK.js} +0 -0
  394. /package/client/dist/assets/{browser-kA31eYhu2.js → browser-rRCwi7Y7.js} +0 -0
  395. /package/client/dist/assets/{cameligo-6R45j6Ph.js → cameligo-DMUM7wLl.js} +0 -0
  396. /package/client/dist/assets/{chat-BalviUAD.js → chat-2rIB8HhT.js} +0 -0
  397. /package/client/dist/assets/{chat-Ds8GvCnv.js → chat-BR8oe53x2.js} +0 -0
  398. /package/client/dist/assets/{chat-D5xEtsf3.js → chat-Bua03tty.js} +0 -0
  399. /package/client/dist/assets/{chat-SaG-ng1x2.js → chat-CZpAQan1.js} +0 -0
  400. /package/client/dist/assets/{chat-CJddjN3D2.js → chat-CdY5SGvS.js} +0 -0
  401. /package/client/dist/assets/{chat-n43nZGvn.js → chat-DZyu3ImY2.js} +0 -0
  402. /package/client/dist/assets/{chat-BMWD_Rx12.js → chat-D_I7nU5K.js} +0 -0
  403. /package/client/dist/assets/{clojure-CLAAMO7J.js → clojure-Cm7r79vr.js} +0 -0
  404. /package/client/dist/assets/{clsx-CNmW0Nip.js → clsx-CjueKrWZ.js} +0 -0
  405. /package/client/dist/assets/{code-C9U6M5-e2.js → code-76gS0IdL.js} +0 -0
  406. /package/client/dist/assets/{code-BotxM43N2.js → code-C1VwxlML.js} +0 -0
  407. /package/client/dist/assets/{code-HDK4P6Rx.js → code-CnMZyJpr.js} +0 -0
  408. /package/client/dist/assets/{code-DUe1Bouz.js → code-D20ef9Cf2.js} +0 -0
  409. /package/client/dist/assets/{code-Bit_z2Xd2.js → code-DdOXaWRY.js} +0 -0
  410. /package/client/dist/assets/{code-F_KjccGf.js → code-Duohuf9l.js} +0 -0
  411. /package/client/dist/assets/{code-CIPmDEd0.js → code-geHmknB92.js} +0 -0
  412. /package/client/dist/assets/{coffee-AruSygo-.js → coffee-Ba7i2nA0.js} +0 -0
  413. /package/client/dist/assets/{commands-BFQZc9AG.js → commands-B9RZO4qS.js} +0 -0
  414. /package/client/dist/assets/{commands-BMkC5-ki.js → commands-BEwbAjtD2.js} +0 -0
  415. /package/client/dist/assets/{commands-KBbhsnw8.js → commands-Bbxu8kLU.js} +0 -0
  416. /package/client/dist/assets/{commands-CzFSoIiq2.js → commands-CDU3qv68.js} +0 -0
  417. /package/client/dist/assets/{commands-CWX9WmDX2.js → commands-CzezgtQj.js} +0 -0
  418. /package/client/dist/assets/{commands-BllkJauO.js → commands-DTQBF_q52.js} +0 -0
  419. /package/client/dist/assets/{commands-cKTaLwwV2.js → commands-hOtKuOXc.js} +0 -0
  420. /package/client/dist/assets/{cpp-DEE5r4Pw.js → cpp-C7h46wYY.js} +0 -0
  421. /package/client/dist/assets/{csharp-BVXJUvbK.js → csharp-BKxtCVv1.js} +0 -0
  422. /package/client/dist/assets/{csp-cXOF0JoV.js → csp-bTuwJoIa.js} +0 -0
  423. /package/client/dist/assets/{css-C_zQuAoy.js → css-DIMkf-bt.js} +0 -0
  424. /package/client/dist/assets/{cypher-t95m_Q-O.js → cypher-CVaqCwHa.js} +0 -0
  425. /package/client/dist/assets/{dart-B4r1Tg-e.js → dart-onAF5SnQ.js} +0 -0
  426. /package/client/dist/assets/{dockerfile-6mt7zHQw.js → dockerfile-DZFCIeNp.js} +0 -0
  427. /package/client/dist/assets/{ecl-DEY_Fz_Q.js → ecl-D05T4iGw.js} +0 -0
  428. /package/client/dist/assets/{elixir-R6-q1c5t.js → elixir-6RTg0lbw.js} +0 -0
  429. /package/client/dist/assets/{explore-CAc8Qzu32.js → explore-BG99VGpL.js} +0 -0
  430. /package/client/dist/assets/{explore-BO_OinBD.js → explore-C0TjprJW2.js} +0 -0
  431. /package/client/dist/assets/{explore-Bhy7WWXv.js → explore-C2dgEo7q.js} +0 -0
  432. /package/client/dist/assets/{explore-ELbrSZyQ2.js → explore-C8NDHbob.js} +0 -0
  433. /package/client/dist/assets/{explore-DW_YTkQh.js → explore-CWWgzQGR.js} +0 -0
  434. /package/client/dist/assets/{explore-DCZL9gRN2.js → explore-CcQXpdtS.js} +0 -0
  435. /package/client/dist/assets/{explore-BEpIs343.js → explore-DsXAgnmJ2.js} +0 -0
  436. /package/client/dist/assets/{flow9-CNQvHBOt.js → flow9-C5_-GSwl.js} +0 -0
  437. /package/client/dist/assets/{format-command-Db1viey1.js → format-command-Dfa1o2d-.js} +0 -0
  438. /package/client/dist/assets/{fsharp-vPZkFXwv.js → fsharp-C8Ef5oNN.js} +0 -0
  439. /package/client/dist/assets/{go-KUzBMYJ_.js → go-C-y9NEjX.js} +0 -0
  440. /package/client/dist/assets/{graphql-C3W0rCsD.js → graphql-fmXr3nnJ.js} +0 -0
  441. /package/client/dist/assets/{hcl-BOOMFSNX.js → hcl-CpzslTdj.js} +0 -0
  442. /package/client/dist/assets/{ini-CFat1WJr.js → ini-sBoK_t0W.js} +0 -0
  443. /package/client/dist/assets/{integrations-CG2dp3Kd.js → integrations-CH0zy1Mw2.js} +0 -0
  444. /package/client/dist/assets/{integrations-CUNe3t9l2.js → integrations-CIAjhd7L.js} +0 -0
  445. /package/client/dist/assets/{integrations-CWjh5VRk.js → integrations-CZdwOe8A.js} +0 -0
  446. /package/client/dist/assets/{integrations-RJfzXkPx2.js → integrations-Ct7omMld.js} +0 -0
  447. /package/client/dist/assets/{integrations-CAjq5tdW2.js → integrations-D6MSxy3-.js} +0 -0
  448. /package/client/dist/assets/{integrations-JOHSCvB3.js → integrations-DbZa-Zyc.js} +0 -0
  449. /package/client/dist/assets/{integrations-CP_aiV_8.js → integrations-b8pH-vfl2.js} +0 -0
  450. /package/client/dist/assets/{java-Dee-CNAM.js → java-BEtHBSE6.js} +0 -0
  451. /package/client/dist/assets/{jira-CQ7mrZde.js → jira-BySfUuQZ.js} +0 -0
  452. /package/client/dist/assets/{jira-DIRkZk9U.js → jira-Byw2C0F8.js} +0 -0
  453. /package/client/dist/assets/{jira-C5UjxHE4.js → jira-CNeYi06w2.js} +0 -0
  454. /package/client/dist/assets/{jira-ZdKb-50F2.js → jira-D11gPhxz.js} +0 -0
  455. /package/client/dist/assets/{jira-DTYu3hJi2.js → jira-D38Gj7AT.js} +0 -0
  456. /package/client/dist/assets/{jira-B5wszJ1-2.js → jira-gAvOyije.js} +0 -0
  457. /package/client/dist/assets/{jira-DtZpokjJ.js → jira-pRaL7JQo2.js} +0 -0
  458. /package/client/dist/assets/{julia-CGNlLYuU.js → julia-Bri6UV-V.js} +0 -0
  459. /package/client/dist/assets/{kotlin-CY7lhknJ.js → kotlin-BOotOW0E.js} +0 -0
  460. /package/client/dist/assets/{less-D0KN7hfJ.js → less-B9JPFI3C.js} +0 -0
  461. /package/client/dist/assets/{lexon-CuRJufPs.js → lexon-CfSJPG6W.js} +0 -0
  462. /package/client/dist/assets/{loops-DKzYFcq6.js → loops-CPpgMapU.js} +0 -0
  463. /package/client/dist/assets/{loops-Du-bNVpc2.js → loops-CWWbKuVL.js} +0 -0
  464. /package/client/dist/assets/{loops-DDs4KPu_.js → loops-Crc9It8o2.js} +0 -0
  465. /package/client/dist/assets/{loops-Bi4ywYGn.js → loops-DH2hZcbK2.js} +0 -0
  466. /package/client/dist/assets/{loops-DvGbSfxw2.js → loops-DS5TmvIU2.js} +0 -0
  467. /package/client/dist/assets/{loops-D3wdUkZV.js → loops-P2f0cN8-.js} +0 -0
  468. /package/client/dist/assets/{loops-BjK8lmoZ2.js → loops-fJV-9hH7.js} +0 -0
  469. /package/client/dist/assets/{lua-DHvH62Zf.js → lua-CsQS60Ue.js} +0 -0
  470. /package/client/dist/assets/{m3-tlthQ8Fo.js → m3-D-oSqn_W.js} +0 -0
  471. /package/client/dist/assets/{markdown-Dbx1LgUZ.js → markdown-Cimd5fb3.js} +0 -0
  472. /package/client/dist/assets/{mcp-DfmzoT5t.js → mcp-Czd_iyp02.js} +0 -0
  473. /package/client/dist/assets/{mcp-BG-OCJca2.js → mcp-D2pc5GGx.js} +0 -0
  474. /package/client/dist/assets/{mcp-CrWdq5db.js → mcp-D4ZjtIx32.js} +0 -0
  475. /package/client/dist/assets/{mcp-CbJ04oFS2.js → mcp-DIfBUv2D2.js} +0 -0
  476. /package/client/dist/assets/{mcp-Dd844F5_.js → mcp-DsTwmjST.js} +0 -0
  477. /package/client/dist/assets/{mcp-zSJ2TsJj.js → mcp-SMkn8boG.js} +0 -0
  478. /package/client/dist/assets/{mcp-DyULurYS2.js → mcp-fSfiVYAc.js} +0 -0
  479. /package/client/dist/assets/{mips-D_O3IUz_.js → mips-CIPQ_RoX.js} +0 -0
  480. /package/client/dist/assets/{msdax-C_ZmCnRt.js → msdax-DauUninz.js} +0 -0
  481. /package/client/dist/assets/{mysql-C-dCEYSX.js → mysql-SOo6toE5.js} +0 -0
  482. /package/client/dist/assets/{nav-DUuw9VIU2.js → nav-BRJBxaGt2.js} +0 -0
  483. /package/client/dist/assets/{nav-D0Erv9ZJ2.js → nav-CAGKv3_F.js} +0 -0
  484. /package/client/dist/assets/{nav-BY_4EWRv.js → nav-CNskRJKQ2.js} +0 -0
  485. /package/client/dist/assets/{nav-CVXtv0wX2.js → nav-DY93irBL.js} +0 -0
  486. /package/client/dist/assets/{nav-B2_ToNqS.js → nav-DhjvYgqt.js} +0 -0
  487. /package/client/dist/assets/{nav-S4HM94vW.js → nav-Gb-r4wop.js} +0 -0
  488. /package/client/dist/assets/{nav-BAMkVEId.js → nav-TvumAFD22.js} +0 -0
  489. /package/client/dist/assets/{objective-c-DZY9Aqxd.js → objective-c-FvmIjYaQ.js} +0 -0
  490. /package/client/dist/assets/{pascal-BVHLXoor.js → pascal-DrH0SRf2.js} +0 -0
  491. /package/client/dist/assets/{pascaligo-XdG_6u3k.js → pascaligo-D-ptJ9y-.js} +0 -0
  492. /package/client/dist/assets/{perl-b9QV0BcD.js → perl-oz_6vUea.js} +0 -0
  493. /package/client/dist/assets/{pgsql-Du5FDOgT.js → pgsql-DTj74zXo.js} +0 -0
  494. /package/client/dist/assets/{php-WJD0z2Z_.js → php-nr791fC2.js} +0 -0
  495. /package/client/dist/assets/{pla-CbciTf2w.js → pla-CopQ2nXW.js} +0 -0
  496. /package/client/dist/assets/{postiats-C1QxmvVq.js → postiats-43DmfD33.js} +0 -0
  497. /package/client/dist/assets/{powerquery-BEYDhPLZ.js → powerquery-D3hlyOfw.js} +0 -0
  498. /package/client/dist/assets/{powershell-CfaYw4XL.js → powershell-DmHpPYUd.js} +0 -0
  499. /package/client/dist/assets/{protobuf-pwZEDOYa.js → protobuf-C531GsRP.js} +0 -0
  500. /package/client/dist/assets/{pug-5ftqSPVe.js → pug-Z5eAx3Zn.js} +0 -0
  501. /package/client/dist/assets/{qsharp-uI6qZMq4.js → qsharp-DkqhCAOL.js} +0 -0
  502. /package/client/dist/assets/{r-BK54P1EG.js → r-BwWrilGY.js} +0 -0
  503. /package/client/dist/assets/{redis-DI0yd7kN.js → redis-ClamHrr6.js} +0 -0
  504. /package/client/dist/assets/{redshift-Dov26eyI.js → redshift-DT7zqm-g.js} +0 -0
  505. /package/client/dist/assets/{restructuredtext-QqJ_1dC-.js → restructuredtext-BYgofb2h.js} +0 -0
  506. /package/client/dist/assets/{ruby-5WjveeVb.js → ruby-DezsRK8O.js} +0 -0
  507. /package/client/dist/assets/{rust-BzVSfqFH.js → rust-DdL9SqIa.js} +0 -0
  508. /package/client/dist/assets/{sb-DMIUfT-3.js → sb-CcwsVR0C.js} +0 -0
  509. /package/client/dist/assets/{scala-CSKA7lqt.js → scala-DHpiXF5c.js} +0 -0
  510. /package/client/dist/assets/{scheme-CojOP2Qc.js → scheme-BeGwcela.js} +0 -0
  511. /package/client/dist/assets/{scss-DoBZGJG6.js → scss-gp-XZpBa.js} +0 -0
  512. /package/client/dist/assets/{setup-JeBwoXoM.js → setup-CGZjy2IF2.js} +0 -0
  513. /package/client/dist/assets/{setup-1vN48B-m2.js → setup-CXa0Sx16.js} +0 -0
  514. /package/client/dist/assets/{setup-BmJ0Kx16.js → setup-D2ktKKMF2.js} +0 -0
  515. /package/client/dist/assets/{setup-T_ApeQDV2.js → setup-DG2H7ha5.js} +0 -0
  516. /package/client/dist/assets/{setup-DQWsu2TR.js → setup-DK5bHDUq2.js} +0 -0
  517. /package/client/dist/assets/{setup-q0wRHUp1.js → setup-DrWlIQTZ.js} +0 -0
  518. /package/client/dist/assets/{setup-mXnzww4f.js → setup-rzHUVgAu.js} +0 -0
  519. /package/client/dist/assets/{shell-YOaE4udl.js → shell-CC2rA5mh.js} +0 -0
  520. /package/client/dist/assets/{solidity-l3jSyVLu.js → solidity-BEEn4gHE.js} +0 -0
  521. /package/client/dist/assets/{sophia-BhSGTaQJ.js → sophia-CRfGWb83.js} +0 -0
  522. /package/client/dist/assets/{sparql-qhk6QD9w.js → sparql-D_Lu-MrJ.js} +0 -0
  523. /package/client/dist/assets/{specs-BGRKhM8t.js → specs-BcyxaCwf2.js} +0 -0
  524. /package/client/dist/assets/{specs-GkiL-snY.js → specs-C1q9geAi.js} +0 -0
  525. /package/client/dist/assets/{specs-DbtIzV8a.js → specs-CLZKysq-2.js} +0 -0
  526. /package/client/dist/assets/{specs-Ce5y2iFc2.js → specs-DZMS9o54.js} +0 -0
  527. /package/client/dist/assets/{specs-CT8exGOy2.js → specs-Dm6zUI-R.js} +0 -0
  528. /package/client/dist/assets/{specs-C6J2zrLM.js → specs-V3TvhKLX.js} +0 -0
  529. /package/client/dist/assets/{specs-DZDoZsDq.js → specs-dV3Mq5Mu2.js} +0 -0
  530. /package/client/dist/assets/{sql-DoO3y21-.js → sql-NEE52Syq.js} +0 -0
  531. /package/client/dist/assets/{st-ChZAY8oG.js → st-DbInun42.js} +0 -0
  532. /package/client/dist/assets/{swift-D290Tr7_.js → swift-Bxkupp3x.js} +0 -0
  533. /package/client/dist/assets/{systemverilog-DsxzgJ-o.js → systemverilog-Bz4Y3fRF.js} +0 -0
  534. /package/client/dist/assets/{tcl-BKDUHAAR.js → tcl-DISqw1ZD.js} +0 -0
  535. /package/client/dist/assets/{terminal-BTpE7iki.js → terminal-BZiIu3rf.js} +0 -0
  536. /package/client/dist/assets/{terminal-DEyt0prF.js → terminal-C2NAd7BW2.js} +0 -0
  537. /package/client/dist/assets/{terminal-a6Uq8B0p.js → terminal-IahE4LW92.js} +0 -0
  538. /package/client/dist/assets/{terminal-DDk_bTw0.js → terminal-QpXZU2Bn2.js} +0 -0
  539. /package/client/dist/assets/{terminal-BNSg2lR7.js → terminal-ScjyXNxQ.js} +0 -0
  540. /package/client/dist/assets/{terminal-Cvabyzm42.js → terminal-d7GadXbN.js} +0 -0
  541. /package/client/dist/assets/{terminal-D0z12_sJ2.js → terminal-tITa81iz.js} +0 -0
  542. /package/client/dist/assets/{twig-UpZQaM8G.js → twig-De2hgUGE.js} +0 -0
  543. /package/client/dist/assets/{typespec-DzaKvN8i.js → typespec-B8J7ngcE.js} +0 -0
  544. /package/client/dist/assets/{vb-CZpbb7tk.js → vb-DV3o63ZY.js} +0 -0
  545. /package/client/dist/assets/{wgsl-CNt3OIvl.js → wgsl-DpFanUEy.js} +0 -0
@@ -9,84 +9,93 @@
9
9
 
10
10
  ## The single source of truth
11
11
 
12
- One durable row per rail **launch** in `rail_pr_deliveries` (per-project `jobs.sqlite`,
13
- migration 36; CRUD in `server/rail-pr-store.ts`). Grain is the launch, not the ticket: a delivery
14
- is one PR for the whole launch, keyed internally by `rail_key = ${railIndex}-${loopId}`; the row
15
- is keyed by uuid because a rail slot can be relaunched.
16
-
17
- Columns beyond the obvious: `ticket_ids` (JSON `number[]`), `base_branch` (the resolved
18
- integration branch — the "against `<base>`" in the question), `branches` (JSON
19
- `DeliverBranchRecord[]` — per-unit `{ticketId, branch, succeeded}` captured at build-settle),
20
- `worktree_ids` (JSON `string[]` of `rail_worktrees` ledger ids), `loop_name` (PR title/body),
21
- `pr_url`/`pr_number`, `pr_state` (`none | local-only | pushed | pr-created` — the pr-publisher
22
- degradation ladder, independent of `decision`), `origin_surface` (`dashboard | agent-chat`),
23
- `origin_conversation_id` (soft cross-DB reference to `agent_conversations.id` in
24
- `desktop.sqlite`; no FK is possible across SQLite files).
25
-
26
- The `branches` + `worktree_ids` columns exist because PR creation is **deferred**: nothing about
27
- the settle survives in memory by the time the user clicks, so `create-pr` and `discard`
28
- reconstruct all their inputs from the row.
29
-
30
- ## State machine (`decision`)
12
+ `rail_pr_deliveries` (per-project `jobs.sqlite`, migrations 36/38/48–50; CRUD in
13
+ `server/rail-pr-store.ts`) stores one durable **generation** per implementation launch. A partial
14
+ unique index enforces one non-terminal generation per rail. Reimplementing an attached PR creates
15
+ generation B and atomically moves generation A to terminal `superseded`; A can never reappear after
16
+ B closes. `supersedes_delivery_id` preserves that lineage and `is_continuation` records that the
17
+ PR/head branch is borrowed review state rather than a resource this generation owns.
18
+
19
+ The important rule is that no single enum carries all truth. The row has orthogonal axes:
20
+
21
+ - `implementation_outcome`: `running | succeeded | partially_succeeded | failed | unknown` —
22
+ derived **only** from loop terminal outcomes.
23
+ - `delivery_outcome`: `pending | ready | delivered | partial | no_changes |
24
+ retryable_failure | blocked | not_started | unknown` — commit/ref/push readiness.
25
+ - `decision`: the user/action lifecycle (`building`, `on_review`, `no_changes`, `pr_draft`,
26
+ `pr_ready`, `pr_closed`, `pr_failed`, `implementation_failed`, plus terminal `completed`,
27
+ `merged`, `discarded`, `superseded`).
28
+ - `status_code` + bounded `status_detail`: localized stage/reason and secondary diagnostics.
29
+ - `delivery_sha`: the exact verified object used by an existing-PR push or retry.
30
+ - `pr_state`: `none | local-only | pushed | pr-created`, independent of all three axes.
31
+
32
+ `branches` is the durable per-unit record: ticket/run, branch, actual implementation result,
33
+ delivery eligibility, initial/final SHA, changed/no-change evidence, and failure code. Together
34
+ with `worktree_ids` it lets deferred decisions and both cards reconstruct full/partial outcomes
35
+ after refresh. `cleanup_warnings` reports best-effort cleanup honestly. `operation*` columns form
36
+ a leased single-winner claim around decision-side Git/GitHub effects.
37
+
38
+ ## Outcome and decision matrix
31
39
 
32
40
  ```
33
- building ──(settle, ≥1 succeeded unit)──▶ on_review [patch branches/worktree_ids]
34
- building ──(settle, 0 succeeded)────────▶ discarded (terminal auto-close; per-run settle already reverted tickets)
35
- on_review | pr_failed ──[Create PR]────▶ pr_draft (delivered) | pr_failed (assembly-failed / throw)
36
- pr_draft (pr_url != null) ──[Publish]──▶ pr_ready (gh pr ready — opens the draft for team review)
37
- pr_draft | pr_ready ──[Check merge]────▶ merged (gh pr view reports MERGED; else 200 no-op)
38
- on_review | pr_draft | pr_ready | pr_failed ──[Discard]─▶ discarded
39
- on_review | pr_failed | pr_draft (pr_url = null) ──[Integrate locally]─▶ merged (remote-less acceptance)
41
+ engine failed (all units) → implementation_failed / not_started
42
+ engine succeeded + clean verified diff→ on_review (fresh) or pr_draft|pr_ready (continuation)
43
+ engine succeeded + no branch delta → no_changes
44
+ mixed clean units → on_review / partial (explicit subset)
45
+ engine succeeded + commit/ref unsafe → pr_failed / blocked (worktree preserved)
46
+ verified existing-PR push failed → pr_failed / retryable_failure (exact SHA retained)
47
+ GitHub reports CLOSED, not merged → pr_closed
48
+ new generation replaces prior one → prior generation superseded (terminal)
49
+ fresh no-change accepted → completed (terminal; no merge claimed)
40
50
  ```
41
51
 
42
- `merged` / `discarded` are terminal. A **degraded** draft (`pr_state` `pushed`/`local-only`,
43
- `pr_url = null`) offers no Publish — retry (`create-pr` is legal from a `pr_draft` whose
44
- `pr_url` is null), **Integrate locally**, or Discard.
45
-
46
- **`merge-local` (remote-less acceptance).** A repo with no GitHub remote can never leave
47
- `local-only` — retry loops forever and Discard destroys the work, so `merge-local` is the way to
48
- say *yes* without GitHub. Legal ONLY while `pr_url` is null (once a real PR exists, GitHub is the
49
- merge authority). It merges directly into the USER'S CHECKOUT, so it is triple-guarded: the
50
- checkout must have the integration branch checked out (a branch can only be checked out in one
51
- worktree, so a temp-worktree merge is impossible while the user holds it) and the working tree
52
- must be clean — violations return **409 `merge_local_blocked`** (`reason: 'wrong_branch' | 'dirty'`,
53
- user-fixable, no transition). Merge = the assembled head (`row.branch`) when it exists, else each
54
- succeeded unit branch sequentially, `--no-ff --no-edit`; any conflict → `merge --abort` +
55
- **502 `merge_failed`** (no transition — retry after manual resolution, or discard). Success sweeps
56
- worktrees + branches (ledger rows → `merged`), transitions to `merged` with `pr_url` still null,
57
- promotes tickets to `done` and fires Jira `onRailMerged(ticketIds, refId, null)`. Both surfaces
58
- offer it wherever no PR exists yet (on_review / degraded draft / pr_failed) behind a confirm. Every transition is the compare-and-set
59
- `transitionDecision(db, id, expected, next, patch)` — one atomic
60
- `UPDATE … WHERE id = ? AND decision = ?` — so two surfaces racing on the same delivery cannot
61
- both win; the loser's `false` return maps to **409 `stale_decision`**.
62
-
63
- ## Launch wiring (`server/rail-isolated-launch.ts`)
64
-
65
- - `prMode = isRailPrDeliveryEnabled()` is captured **once at launch entry** — a mid-flight env
66
- flip can never split one launch across the two delivery paths.
67
- - In PR mode the row is INSERTed **up front** (`decision='building'`) so the origin link is
68
- persisted before any await can drop it and late-joining clients hydrate mid-build via
69
- `GET /rails`. Worktree-allocation failure transitions the row to `discarded` (kept for audit,
70
- never deleted) so a wedged `building` row can never block the slot.
71
- - Isolation units: `scope='per-ticket'` → one worktree/run per ticket; `scope='all'`
72
- (implement/batch — one pipeline invocation covers all tickets) → **one** worktree/run covering
73
- every ticket. `isolationApplies` (`server/rail-isolation.ts`) isolates per-ticket rails always
74
- and `all`-scoped rails **only when PR delivery is on** (kill-switch off ⇒ byte-identical
75
- legacy shared-cwd).
76
- - Per-run settle: `ctx.onLoopRunFinished(runId, outcome, { ticketCompletionStatus })` —
77
- `'on_review'` in PR mode, `'done'` otherwise (`applyJobOutcomeToTickets` gains the analogous
78
- `{ completedStatus }` option; explicit `'done'` / kill-switch off is byte-identical legacy).
79
- When the caller passes NO opts (shared-cwd rail runs, standalone loop runs,
80
- isolation-unavailable fallbacks) the default now derives from `isRailPrDeliveryEnabled()` —
81
- read once per settle and reused for the Jira split, so one settle can never split across the
82
- two paths (universal ask-first; the explicit isolated-rail opts are idempotent with it).
83
- Failures ignore the field (revert `in_progress → todo` as always). In PR mode the completed
84
- path calls `jiraSyncManager.onRailReview` instead of the done-flavoured `onJobOutcome`.
85
- - All-settle in PR mode: patch `branches` + `worktree_ids`, transition `building →`
86
- `on_review` (≥1 succeeded) or `discarded` (0 succeeded), broadcast, and — when
87
- `origin_conversation_id` is set — post the inline decision card into the conversation.
88
- The legacy merge-back **never runs** in PR mode. Kill-switch off: no row, no `on_review`,
89
- legacy local merge-back exactly as before.
52
+ Only a real engine failure uses `implementation_failed`. A successful log can therefore coexist
53
+ truthfully with “delivery needs attention”. A fresh no-op never offers Create PR. A continuation
54
+ no-op leaves the existing PR untouched. Partial cards name the included and failed units before
55
+ delivery.
56
+
57
+ Continuation cleanup is ownership-aware: **Dismiss** clears the follow-up card/worktree but never
58
+ closes the pre-existing PR, deletes its head branch, or returns its tickets from review. A blocked
59
+ dirty follow-up requires an explicit destructive “Discard local result” confirmation, while still
60
+ preserving the external PR/branch. Fresh deliveries keep the full discard semantics.
61
+
62
+ Fresh no-change cards offer explicit **Mark done** and **Refine** outcomes. Mark done uses terminal
63
+ `completed` and moves review tickets to Done without claiming a merge; Refine explicitly returns
64
+ them to the backlog. Existing-PR no-change cards only dismiss their borrowed follow-up state.
65
+
66
+ **`merge-local` (remote-less acceptance).** Legal only without a real PR. Both surfaces confirm
67
+ because it changes the user's checkout. Source branches are first assembled away from the user's
68
+ checkout; only a complete conflict-free result may advance a still-clean, still-at-the-original-
69
+ HEAD integration branch. A conflict leaves the user's checkout byte-identical and the delivery
70
+ actionable.
71
+
72
+ ## Launch and recovery wiring (`server/rail-isolated-launch.ts`)
73
+
74
+ - `prMode` is captured once. Admission is rechecked inside the per-repository allocation lock;
75
+ two requests cannot both create a generation or reuse the ticket-keyed worktree.
76
+ - A continuation supersedes its prior generation and creates the new `building` row in one DB
77
+ transaction. Allocation failure closes the new row and restores the prior generation atomically.
78
+ - Isolation units remain `per-ticket` or one `all`-scope batch unit. Initial/final SHAs plus commit
79
+ verification distinguish changed, resumed, and no-change results.
80
+ - Per-unit settlement returns structured execution + delivery results. `onLoopRunFinished` receives
81
+ the engine outcome only; commit/status/ref/provenance/push failures cannot rewrite it.
82
+ - Clean, committed worktrees may be released. Dirty, unknown, or ref-mismatched worktrees become
83
+ `needs-review` and are never force-removed automatically. Push failure retains the exact SHA.
84
+ - Project admission remains closed while startup reconciliation runs under the repo lock. Every
85
+ stale `building` shape becomes actionable; successful interrupted work is preserved and labelled
86
+ `settlement_interrupted`, while only all-failed runs become `implementation_failed`.
87
+ - Operation leases are process capabilities. Startup clears every prior-process lease before card
88
+ projection, marks the still-active delivery `operation_interrupted`, and leaves its durable SHA,
89
+ PR and unit evidence intact so the user can safely retry.
90
+ - `GET /rails` is hydration-only and never invokes crash recovery. This avoids misclassifying the
91
+ normal live window between durable loop completion and commit/ref/push settlement.
92
+ - Startup retries pending terminal ticket effects in-process and re-projects active and terminal
93
+ origin-linked rows into Agent Chat before admission opens, repairing cards left stale by a crash
94
+ or migration. Admission remains closed and cards show `cleanup_incomplete` until every JSON/Jira
95
+ phase is durably settled.
96
+ An already-identical card is neither rewritten nor broadcast, so old terminal history does not
97
+ create fake unread activity on every launch.
98
+ - PR mode never invokes legacy merge-back. Kill-switch-off behavior remains the legacy path.
90
99
 
91
100
  ## Per-run worktree overlay (`server/worktree-overlay.ts`)
92
101
 
@@ -133,29 +142,59 @@ v1 `POST /rails/pr-review`). The route validates and delegates to
133
142
  `server/rail-pr-decision.ts` `executePrDecision` (deps injected — db/git/exec/broadcast/jira/
134
143
  agent-chat — so the whole matrix unit-tests without git/gh/network).
135
144
 
145
+ Before any Git, GitHub, cleanup or ticket effect, the endpoint atomically claims the row's leased
146
+ `operation_token`. A second window loses **before** it can perform an effect. The token is cleared
147
+ before the new snapshot is persisted to the agent card/broadcast; a dead-process lease is bounded
148
+ and reclaimable, and the final CAS verifies that the caller still owns it. Every response also
149
+ contains the authoritative post-action snapshot, so losing a WebSocket frame cannot leave the
150
+ initiating card stale. While startup recovery owns the project, decision and checkout endpoints
151
+ return a specific retry-later conflict. Every decision that can mutate refs/worktrees shares the
152
+ same repository lock as recovery, launch allocation and checkout, revalidates its admission epoch
153
+ after waiting for that lock, and uses bounded Git/GitHub command timeouts so a wedged child cannot
154
+ block the repository forever.
155
+
136
156
  - **create-pr** — deferred `deliverRailAsPr` (`server/rail-pr-delivery.ts`: 1 unit → its
137
157
  branch; N → assembled onto the conventional batch branch off the integration branch, one PR
138
158
  covering every ticket). The PR **title and canonical body are composed here** (see "Branch
139
159
  naming & PR content" below) from the ticket store + `jira_links` + the branch diffs — all
140
- failure-tolerant. Retry hazard handled first: a prior degraded delivery leaves the batch
141
- branch behind and `deliverRailAsPr` assembles with `worktree add -b`, so the stale batch branch
142
- is defensively `-D`'d (never the integration branch); inside `deliverRailAsPr` the batch name
143
- additionally collide-suffixes `-2`… against the live branch listing. Delivered → `pr_draft`
144
- (+`pr_url`/`pr_number` when `pr-created`; null when degraded); assembly-failed or a thrown
145
- guardrail → `pr_failed` (retryable). Tickets stay `on_review` — a draft PR still awaits the
146
- merge.
160
+ failure-tolerant. Each unit is pushed/merged from its immutable settled `finalSha`, never from a
161
+ later mutable or historical ticket branch. A degraded multi-unit retry reuses its owned assembled
162
+ head, preserving exact head/base PR identity; unrelated name collisions suffix `-2`… and are never
163
+ pre-deleted. Delivered → `pr_draft`
164
+ (+`pr_url`/`pr_number` when `pr-created`; null when degraded). `publishDraftPr` adopts an exact
165
+ existing head/base PR when `gh pr create` returns no URL, says it already exists, or a retry
166
+ follows an ambiguous interruption. Assembly/ref failures are blocked; only safe stages are
167
+ labelled retryable. Tickets stay `on_review`.
147
168
  - **publish** — `gh pr ready <url>` → `pr_ready` (the draft opens for the team's normal review).
148
169
  Requires a real `pr_url`.
149
- - **discard** — best-effort `gh pr close <url> --delete-branch`; remove the launch's worktrees
150
- (ledger rows closed as `failed`); delete every referenced branch (per-unit sources, assembled
151
- head, and the possibly-stale batch branch recomputed from the same ticket data create-pr names
152
- it from — the integration branch is NEVER deleted); → `discarded`; revert
170
+ - **discard** — for a fresh delivery, best-effort `gh pr close <url> --delete-branch`; remove the launch's worktrees
171
+ (ledger rows closed as `failed`); delete only branches durably recorded as created by this
172
+ delivery (owned per-unit sources plus its exact assembled head; preferred names are never
173
+ recomputed, and the integration branch is NEVER deleted); → `discarded`; revert
153
174
  still-`on_review` tickets → `todo` (a manually re-triaged spec is respected) + Jira
154
- `onRailDiscard`.
155
- - **poll-merge** — on-demand `gh pr view <url> --json state,mergedAt`; `MERGED` → `merged` +
156
- tickets → `done` + Jira `onRailMerged` (with a "PR merged: `<url>`" comment); anything else is
157
- an observation-only 200. There is no background poller (loopback server, no webhooks) —
158
- detection is click-driven.
175
+ `onRailDiscard`. Failures are retained in `cleanup_warnings` and disclosed. For a continuation,
176
+ discard can remove only the explicitly confirmed blocked local iteration: it preserves the
177
+ borrowed PR/head and review ticket state.
178
+ - **dismiss** — continuation acknowledgement. Clears the generation and owned clean
179
+ worktree while preserving the existing PR, head branch and `on_review` tickets.
180
+ - **acknowledge-no-changes** — fresh no-change acceptance → terminal `completed`, tickets Done,
181
+ with no PR/merge claim. Jira receives its own no-PR completion comment. Refine remains the
182
+ explicitly backlog-returning path and always uses Jira `todo`; it never inherits the configured
183
+ discard/cancellation status.
184
+ - **poll-merge** — observes state, exact head/base/head OID, merge commit and PR commit set;
185
+ `MERGED` becomes `merged` only when that immutable evidence contains `delivery_sha`, then tickets
186
+ → `done` + Jira `onRailMerged`. `OPEN` is observation-only; `CLOSED` without merge → `pr_closed`.
187
+ - **reopen** — `gh pr reopen` from `pr_closed`, returning to draft or ready according to GitHub.
188
+ - **merge-local** — builds the complete merge in an isolated temporary checkout and advances the
189
+ user's revalidated clean base only after all branches succeed.
190
+
191
+ Terminal discard/merge/completion inserts `rail_pr_ticket_effects` in the same SQLite transaction
192
+ as its decision and snapshots each ticket's non-null outcome owner. Before crossing into ticket JSON
193
+ the worker durably freezes only IDs still `on_review` whose owner still matches that snapshot, then
194
+ checkpoints the JSON phase and Jira-outbox handoff separately. An old terminal row therefore cannot
195
+ change or enqueue Jira work for a newer iteration. Jira's idempotency keys make a crash after enqueue
196
+ safe to repeat; the effect becomes complete only after that durable handoff. Startup retries every
197
+ unfinished phase, including causally provable migrated terminal rows, before admission opens.
159
198
 
160
199
  `gh` failures return 502 `gh_failed` with **no transition**. Illegal action for the current
161
200
  state → 409 (`stale_decision` + `reason: 'illegal_action'`).
@@ -204,8 +243,8 @@ diff collection), fully unit-tested.
204
243
 
205
244
  ## The sync contract (two surfaces, zero desync)
206
245
 
207
- Neither surface holds authoritative state; both render the last snapshot they received and POST
208
- the same endpoint with the `expectedDecision` they rendered.
246
+ SQLite remains authoritative. Both surfaces render a full snapshot and POST the same endpoint with
247
+ the `expectedDecision` they rendered.
209
248
 
210
249
  - **Durable WS event `rail.pr_state`** (project-scoped, full snapshot — replaces the retired
211
250
  one-shot `rail.pr_delivered`): broadcast at row INSERT (`building`), build-settle, and every
@@ -214,8 +253,9 @@ the same endpoint with the `expectedDecision` they rendered.
214
253
  - **Option A — dashboard.** `client/src/context/RailPrDecisionContext.tsx` (registerHandler on
215
254
  the shared socket + `GET /rails` seed) feeds `RailPrDecisionStrip` on `RailRow` (both density
216
255
  branches): on_review → Create PR / Discard; pr_draft → Open PR + Publish / Discard (degraded →
217
- retry); pr_ready → Check merge / Discard; pr_failed → Retry / Discard. Buttons disable in
218
- flight and reconcile to the next broadcast; Discard confirms first.
256
+ retry); pr_ready → Check merge; no_changes → Done/refine; pr_closed → Reopen; pr_failed derives
257
+ retry-vs-blocked actions from `delivery_outcome`. Logs remain available after settle. Buttons
258
+ disable in flight and apply the authoritative HTTP snapshot immediately.
219
259
  - **Option B — agent chat.** When the row carries `origin_conversation_id`, settle posts a
220
260
  **persisted inline card**: a `'system'`-role `agent_messages` row (role is unconstrained TEXT —
221
261
  no migration; TS unions widened) whose content is the `PrDecisionCardEnvelope` JSON.
@@ -224,15 +264,18 @@ the same endpoint with the `expectedDecision` they rendered.
224
264
  process-wide `server/agent-chat-registry.ts` singleton (null-safe: tests/disabled builds).
225
265
  Live updates ride the app-global `agent_pr_decision` WS event; the client renders
226
266
  `AgentPrDecisionCard` and POSTs the same project-scoped `/rails/pr-decision`.
227
- - **Race:** the second answer arrives with a stale `expectedDecision` → 409; the client shows a
228
- neutral "already resolved" toast and reconciles to the broadcast.
267
+ - **Race:** a stale generation or occupied operation lease returns 409 before effects. Clients
268
+ distinguish `operation_in_progress` from a stale decision, show the active operation, disable
269
+ actions, apply the response snapshot, ignore terminal events for an older delivery id, and
270
+ hydrate again on focus/reconnect.
229
271
 
230
272
  ## Relaunch guard
231
273
 
232
- `POST /rails/:i/launch` returns **409 `{ error: 'pr_decision_pending', prDeliveryId }`** when an
233
- active (non-terminal) delivery exists for the slot AND the launch would take the isolated PR
234
- path — a relaunch would append new commits to the undecided branches (worktree creation resumes
235
- existing branches). Legacy / non-isolated launches are unaffected.
274
+ `POST /rails/:i/launch` returns **409 `{ error: 'pr_decision_pending', prDeliveryId }`** for an
275
+ unresolved fresh delivery. An active `pr_draft`/`pr_ready` generation covering the same tickets is
276
+ a verified continuation contract instead: launch revalidates it again under the repo lock,
277
+ supersedes it atomically and runs only on that PR head. A stale concurrent request receives 409
278
+ before it can allocate or claim anything. Legacy / non-isolated launches are unaffected.
236
279
 
237
280
  ## Ticket lifecycle — `on_review`
238
281
 
@@ -297,33 +340,30 @@ the launch INSERT. As-built:
297
340
  - `POST /rails/:i/launch` accepts `originConversationId` (validated `/^[A-Za-z0-9-]{1,64}$/`) and
298
341
  `originSurface` (`'dashboard' | 'agent-chat'`), threaded into `launchIsolatedRail`.
299
342
  Dashboard launches default to `origin_surface='dashboard'`, `origin_conversation_id=NULL`.
300
- - **The MCP auto-attach chain (shipped)** — four hops, so an agent-launched rail tags itself
301
- end-to-end with no manager change (`AgentChatManager` already passes `conversationId` into
302
- `prepareAgentMcp`):
303
- 1. `agent-mcp-config.ts` `buildSpecrailsMcpEntry` gained `conversationId` in its opts
304
- (validated against the same launch regex; malformed ⇒ silently omitted) and sets
305
- `SPECRAILS_AGENT_CONVERSATION` in `entry.env` — threaded at both internal call sites
306
- (`prepareAgentMcp` and `buildAgentMcpArgs`), so the claude `--mcp-config` file, the codex
307
- inline `-c mcp_servers.specrails.env.*` overrides and the gemini cwd `.mcp.json` all carry
308
- it automatically. `mergeSpecrailsIntoWorkspaceMcp` (Part A workspace wiring) deliberately
309
- stays conversation-less.
310
- 2. `mcp-bridge` forwards the env as the `x-specrails-agent-conversation` header
311
- (`agentForwardHeaders` in `bridge.ts`, alongside the tier/project forwards). The staged
312
- bundle `src-tauri/binaries/specrails-mcp.js` must be regenerated via
313
- `npm run build:mcp-bridge` whenever the bridge source changes — a stale bundle silently
314
- drops the header (origin degrades to NULL with no error).
315
- 3. `registerTieredTool` (`server/mcp/tools/types.ts`) reads the header into the per-call
316
- `ctx.originConversationId` next to the project pin (same per-call ctx-copy discipline;
317
- malformed ⇒ `null`, never throws — the launch degrades to untagged).
318
- 4. `specrails_rails(launch)` (`server/mcp/tools/rails.ts`) adds
343
+ - **The authenticated MCP auto-attach chain (shipped)** — an agent-launched rail tags itself
344
+ end-to-end without trusting caller-controlled context headers:
345
+ 1. `AgentChatManager` mints an unguessable, turn-scoped capability. The server stores only
346
+ its hash and binds it to the actual conversation, pinned project and permission level.
347
+ 2. `prepareAgentMcp` writes the bearer to an app-owned `0600` capability file. Claude,
348
+ Codex and Gemini MCP configs carry only `SPECRAILS_AGENT_CAPABILITY_FILE`, so the raw
349
+ bearer never appears in command-line arguments. Workspace MCP wiring deliberately carries
350
+ no capability.
351
+ 3. `mcp-bridge` reads that file and forwards the bearer as
352
+ `x-specrails-agent-capability`. Legacy tier/project/conversation env vars and headers are
353
+ ignored. The staged bundle `src-tauri/binaries/specrails-mcp.js` must be regenerated via
354
+ `npm run build:mcp-bridge` whenever the bridge source changes.
355
+ 4. `registerTieredTool` (`server/mcp/tools/types.ts`) verifies the bearer and derives the
356
+ per-call tier, project and `ctx.originConversationId` from its server-side binding. The
357
+ manager revokes the capability and removes its file when the turn settles.
358
+ 5. `specrails_rails(launch)` (`server/mcp/tools/rails.ts`) adds
319
359
  `originConversationId` + `originSurface:'agent-chat'` to the POST body when the ctx
320
360
  carries an id (`apiCall` forwards no custom headers, so the id rides the JSON body).
321
- External MCP clients (Claude Desktop, Cursor, …) spawn the bridge without any
322
- `SPECRAILS_AGENT_*` env → no header → untagged launches, by design. Covered end-to-end by
323
- `server/mcp/tools/rails-origin.test.ts` (header → ctx → body → route → persisted row →
361
+ External MCP clients (Claude Desktop, Cursor, …) have no capability, so launches remain
362
+ untagged and Settings tiers govern them. Covered end-to-end by
363
+ `server/mcp/tools/rails-origin.test.ts` (capability → ctx → body → route → persisted row →
324
364
  settle fires `postPrDecisionCard` for that conversation).
325
365
 
326
- ## Decisions (D1–D11, condensed)
366
+ ## Decisions (D1–D17, condensed)
327
367
 
328
368
  - **D1 — three extra columns** (`branches`, `loop_name`, `worktree_ids`) on migration 36:
329
369
  deferred create-pr/discard must be reconstructible from the row; nothing survives in memory
@@ -336,13 +376,14 @@ the launch INSERT. As-built:
336
376
  receives the spawn-captured flag from QueueManager — see "Ticket lifecycle" above. The opt-in
337
377
  option shape survives unchanged; only its defaults moved from hardcoded `'done'` to
338
378
  flag-derived.
339
- - **D3 — state machine**: 0-succeeded settles auto-close to `discarded`; degraded drafts
340
- (`pr_url` null) have no Publish, only retry/discard; `pr_state` records delivery degradation
341
- independent of `decision`.
342
- - **D4 — create-pr reconstructs deliverRailAsPr inputs from the row** and defensively deletes a
343
- stale batch branch first (retry after a degraded delivery would die on "branch already
344
- exists"); never the integration branch.
345
- - **D5 — relaunch collision** = 409 `pr_decision_pending` only on the isolated PR path.
379
+ - **D3 — orthogonal outcomes**: only loop outcomes determine implementation success; delivery,
380
+ decision and PR lifecycle are independent. Zero actual successes becomes
381
+ `implementation_failed`; successful blocked/no-change runs retain their truth.
382
+ - **D4 — create-pr reconstructs deliverRailAsPr inputs from the row** using each unit's exact
383
+ settled object. It reuses an owned degraded batch head and never deletes a merely name-matching
384
+ branch.
385
+ - **D5 — relaunch admission**: unresolved fresh work returns 409; a matching open-PR generation
386
+ is superseded atomically and continued on its exact verified head.
346
387
  - **D6 — `rail.pr_delivered` retired**, replaced by the durable `rail.pr_state` + the
347
388
  `GET /rails` `prDeliveries` hydration; `Map<railIndex, …>` on the client keyed to the newest
348
389
  active row.
@@ -356,9 +397,26 @@ the launch INSERT. As-built:
356
397
  inbound preservation and the three outbox hooks.
357
398
  - **D10 — on_review everywhere**: server union + every client `Record<TicketStatus, …>` map,
358
399
  board bucketing (ToDo tab), drag/launch guards, context-menu out-only, pill, i18n ×8.
359
- - **D11 — premium decision UI**: disable-on-click reconciled to the broadcast, tooltips (base
360
- branch, PR url), designed degraded/failed states, 409 → neutral "already resolved" toast;
400
+ - **D11 — premium decision UI**: disable-on-click reconciled to authoritative snapshots, tooltips
401
+ (base branch, PR url), designed degraded/failed states, distinct stale-vs-operation-busy 409 UX;
361
402
  English source strings, all 8 locales, locale-parity green.
403
+ - **D12 — no automatic data loss**: dirty, unknown and ref-mismatched worktrees are
404
+ `needs-review`; only explicit consequence-specific cleanup may force-remove them.
405
+ - **D13 — one active generation**: migration 48 supersedes historical duplicates and a partial
406
+ unique index enforces one active row per rail.
407
+ - **D14 — operation lease before effects**: a decision claims before Git/GitHub/ticket work;
408
+ the loser has no external side effects and HTTP returns the authoritative snapshot.
409
+ - **D15 — exact/idempotent delivery**: continuation retry pushes `delivery_sha`; ambiguous PR
410
+ creation resolves exact open head/base identity; CLOSED is distinct and reopenable.
411
+ - **D16 — crash recovery before admission**: startup preserves successful interrupted work and
412
+ makes every stale `building` generation actionable before another launch can reuse its path.
413
+ - **D17 — ownership-aware continuation cleanup**: dismiss/discard never closes or deletes the
414
+ pre-existing PR/head and never reverts its review tickets.
415
+ - **D18 — terminal ticket outbox**: terminal decision + ticket intent commit atomically; startup
416
+ replay closes the SQLite/JSON crash window, exact causal ownership prevents old generations from
417
+ mutating newer work, and terminal Agent cards are re-projected.
418
+ - **D19 — truthful no-change completion**: fresh no-change has Mark done (`completed`) and Refine;
419
+ a continuation only dismisses its borrowed follow-up.
362
420
 
363
421
  ## Kill-switch
364
422
 
package/docs/mcp.md CHANGED
@@ -207,6 +207,12 @@ codex mcp add specrails -- <bridge command from Settings ▸ MCP>
207
207
  network ingress; an MCP client must run on the same machine.
208
208
  - **Tiers, not blanket access.** Even with a valid token, an agent can only do
209
209
  what the enabled tiers allow (read by default). High-risk actions stay opt-in.
210
+ - **Loopback is not identity.** The scoped MCP token identifies an external local
211
+ client; it cannot impersonate the embedded Agent Mode by adding tier, project,
212
+ or conversation headers. For each Agent Mode turn, Specrails mints a private,
213
+ short-lived capability bound server-side to that conversation, pinned project,
214
+ and permission level, transports it through an app-owned `0600` file, and
215
+ revokes it when the turn ends.
210
216
  - **The app must be running.** The MCP server is embedded in the desktop app's
211
217
  process — there is no standalone daemon. The Tauri shell keeps it alive even
212
218
  when you close the main window: closing the window **minimizes to the system
@@ -217,12 +223,16 @@ codex mcp add specrails -- <bridge command from Settings ▸ MCP>
217
223
 
218
224
  ## v1 limitations — what is *not* exposed
219
225
 
220
- The tool catalog deliberately leaves the highest-risk execution vectors out of
221
- v1. None of these are reachable over MCP:
226
+ The public tool catalog deliberately leaves the highest-risk execution vectors
227
+ out of v1. None of these are reachable by an external MCP client authenticated
228
+ only with the scoped MCP token:
222
229
 
223
- - **Terminal shell execution.** The built-in terminal panel runs arbitrary
224
- shell commands; the MCP surface does **not** expose it. An agent cannot run
225
- shell on your machine through Specrails.
230
+ - **Raw terminal shell execution.** The built-in terminal panel is not exposed
231
+ to external MCP clients. `background_start` and `background_kill` are a
232
+ private Agent Mode path: they require a live server-minted capability,
233
+ Autonomous permission, and explicit confirmation for the exact command.
234
+ Supplying legacy context headers or enabling the external Destructive tier
235
+ does not grant access to that path.
226
236
  - **Browser capture.** No browser navigation / screenshot / capture tool.
227
237
  - **In-app file write.** The code explorer is **read-only** over MCP — there is
228
238
  no source-file overwrite tool (`code_write_file`). An agent can read files and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specrails-desktop",
3
- "version": "2.29.0",
3
+ "version": "2.29.2",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -51,7 +51,7 @@
51
51
  "cross-spawn": "^7.0.6",
52
52
  "diff": "^9.0.0",
53
53
  "express": "^5.2.1",
54
- "multer": "^2.1.1",
54
+ "multer": "^2.2.0",
55
55
  "node-pty": "^1.0.0",
56
56
  "pdf-parse": "^2.4.5",
57
57
  "playwright": "^1.60.0",
@@ -59,7 +59,7 @@
59
59
  "selfsigned": "^5.5.0",
60
60
  "tree-kill": "^1.2.2",
61
61
  "werift": "^0.23.0",
62
- "ws": "^8.16.0",
62
+ "ws": "^8.21.0",
63
63
  "zod": "^3.25.76"
64
64
  },
65
65
  "devDependencies": {
@@ -74,12 +74,16 @@
74
74
  "@types/pdf-parse": "^1.1.5",
75
75
  "@types/supertest": "^7.2.0",
76
76
  "@types/ws": "^8.5.0",
77
- "@vitest/coverage-v8": "^4.1.0",
77
+ "@vitest/coverage-v8": "^4.1.10",
78
78
  "concurrently": "^9.2.1",
79
- "esbuild": "^0.28.0",
79
+ "esbuild": "^0.28.1",
80
80
  "supertest": "^7.2.2",
81
- "tsx": "^4.7.0",
81
+ "tsx": "^4.23.0",
82
82
  "typescript": "^5.4.0",
83
- "vitest": "^4.1.0"
83
+ "vitest": "^4.1.10"
84
+ },
85
+ "overrides": {
86
+ "ip": "npm:@eggjs/ip@2.1.0",
87
+ "shell-quote": "1.9.0"
84
88
  }
85
89
  }
@@ -4,6 +4,7 @@ exports.resolveActivePrContinuationTargets = resolveActivePrContinuationTargets;
4
4
  const jira_db_1 = require("./jira/jira-db");
5
5
  const rail_pr_store_1 = require("./rail-pr-store");
6
6
  const integration_branch_1 = require("./integration-branch");
7
+ const pr_lifecycle_1 = require("./pr-lifecycle");
7
8
  const PR_MATCH_RANK = {
8
9
  'title-similarity': 1,
9
10
  'ticket-ref': 2,
@@ -203,8 +204,22 @@ function mergeOpenPrs(prs) {
203
204
  async function resolveActivePrContinuationTargets(input) {
204
205
  const out = new Map();
205
206
  const internal = internalDeliveryTargets(input.db, input.ticketIds);
207
+ const lifecycleByUrl = new Map();
206
208
  for (const [ticketId, target] of internal) {
207
- const materialized = await materializeTarget(input.git, input.repoDir, input.fetchOk, ticketId, target.branch, target.baseBranch, target.prUrl, target.prNumber, target.isDraft, 'rail-pr-delivery');
209
+ if (!target.prUrl)
210
+ continue;
211
+ let lifecycle = lifecycleByUrl.get(target.prUrl);
212
+ if (!lifecycle) {
213
+ lifecycle = (0, pr_lifecycle_1.observePrLifecycle)(input.exec, input.repoDir, target.prUrl);
214
+ lifecycleByUrl.set(target.prUrl, lifecycle);
215
+ }
216
+ const observed = await lifecycle;
217
+ // A ledger row is only a hint. GitHub remains lifecycle authority: a stale
218
+ // draft/ready row for a CLOSED/MERGED or different head/base PR must not be
219
+ // superseded and must not lend its branch to another implementation run.
220
+ if (!observed.ok || !(0, pr_lifecycle_1.isExactOpenPr)(observed, target.branch, target.baseBranch))
221
+ continue;
222
+ const materialized = await materializeTarget(input.git, input.repoDir, input.fetchOk, ticketId, target.branch, target.baseBranch, target.prUrl, target.prNumber, observed.isDraft, 'rail-pr-delivery');
208
223
  if (materialized)
209
224
  out.set(ticketId, materialized);
210
225
  }