specrails-desktop 2.20.1 → 2.22.0

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 (540) hide show
  1. package/README.md +3 -2
  2. package/client/dist/assets/{ActivityFeedPage-3WSqRYVx.js → ActivityFeedPage-roDyKGuv.js} +1 -1
  3. package/client/dist/assets/AgentBrowserCapture-BsXnWa4j.js +1 -0
  4. package/client/dist/assets/{AgentModeCodePane-Cnsea6eZ.js → AgentModeCodePane-o97EJvbJ.js} +2 -2
  5. package/client/dist/assets/AgentModeJobsPane-CLtpPxPM.js +1 -0
  6. package/client/dist/assets/AgentsPage-eNSo_ZcC.js +86 -0
  7. package/client/dist/assets/AnalyticsPage-cAJ60_Ex.js +1 -0
  8. package/client/dist/assets/{BarChart-C6If656N.js → BarChart-NLtK7xAY.js} +1 -1
  9. package/client/dist/assets/CodePage-B5rum8ZB.js +2 -0
  10. package/client/dist/assets/DesktopAnalyticsPage-DSuvG6Tq.js +1 -0
  11. package/client/dist/assets/DocsDialog-Bo38G3Yc.js +11 -0
  12. package/client/dist/assets/DocsPage-BNkiBBrC.js +11 -0
  13. package/client/dist/assets/{ExportDropdown-CezTK0EX.js → ExportDropdown-DCV8PN4-.js} +1 -1
  14. package/client/dist/assets/IntegrationsPage-BMJOzpPz.js +3 -0
  15. package/client/dist/assets/InteractiveJobComposer-aLduNs5R.js +19 -0
  16. package/client/dist/assets/JobDetailModal-kpkUWJIS.js +1 -0
  17. package/client/dist/assets/JobDetailPage-CFeqlrPU.js +1 -0
  18. package/client/dist/assets/JobsPage-fuwhXy2I.js +1 -0
  19. package/client/dist/assets/LoopBuilderPage-DP66322C.js +7 -0
  20. package/client/dist/assets/LoopPreviewModal-CpmBhE31.js +1 -0
  21. package/client/dist/assets/LoopsPage-CvQ18VUx.js +1 -0
  22. package/client/dist/assets/ProjectSettingsDialog-Deq4pwvq.js +1 -0
  23. package/client/dist/assets/TemplatePreviewModal-DziOj2Ct.js +1 -0
  24. package/client/dist/assets/agent-Csh4kP2S.js +1 -0
  25. package/client/dist/assets/agent-Cz_jgQX32.js +1 -0
  26. package/client/dist/assets/agent-D3vcIvaz2.js +1 -0
  27. package/client/dist/assets/agent-Dnbt0V4e.js +1 -0
  28. package/client/dist/assets/agent-HolR7QrZ.js +1 -0
  29. package/client/dist/assets/agent-Ka0rRWJy.js +1 -0
  30. package/client/dist/assets/agent-Te3yysMd.js +1 -0
  31. package/client/dist/assets/agent-vM4_iLDk2.js +1 -0
  32. package/client/dist/assets/{upload-CRtTj4Co.js → brain-kFJuEDNH.js} +1 -1
  33. package/client/dist/assets/{browser-DEEO-OSi.js → browser-BPkhILSJ.js} +1 -1
  34. package/client/dist/assets/{browser-BTivfZKE2.js → browser-BijVYG0Y2.js} +1 -1
  35. package/client/dist/assets/{browser-bpO3onlS.js → browser-BqLqJVVT.js} +1 -1
  36. package/client/dist/assets/{browser-DlSXtfu5.js → browser-Cc0iDqUi.js} +1 -1
  37. package/client/dist/assets/browser-CdS6O1Qb.js +1 -0
  38. package/client/dist/assets/{browser-BKP6hqQC2.js → browser-Cvg-QHvd2.js} +1 -1
  39. package/client/dist/assets/{browser-INCUyduh.js → browser-FRv8P02E.js} +1 -1
  40. package/client/dist/assets/{browser-DlKLfT612.js → browser-rWKj-RR_2.js} +1 -1
  41. package/client/dist/assets/code-BRcDlze52.js +1 -0
  42. package/client/dist/assets/code-BdMy3Ffq.js +1 -0
  43. package/client/dist/assets/code-CeQ0FZpC.js +1 -0
  44. package/client/dist/assets/code-CqCcRThR.js +1 -0
  45. package/client/dist/assets/code-DgeHz9CB.js +1 -0
  46. package/client/dist/assets/code-DzC1rMk12.js +1 -0
  47. package/client/dist/assets/code-UPVvmAKM2.js +1 -0
  48. package/client/dist/assets/code-thSEptMx.js +1 -0
  49. package/client/dist/assets/{common-QjVnq9XP2.js → common-BM3LFLCE2.js} +1 -1
  50. package/client/dist/assets/{common-CeQUwuHt2.js → common-Bwafujnc2.js} +1 -1
  51. package/client/dist/assets/{common-Bb64s3Bm.js → common-C-vU-j-I.js} +1 -1
  52. package/client/dist/assets/{common-KbQuTSGg.js → common-C5HKSbbz.js} +1 -1
  53. package/client/dist/assets/{common-BPQQkgJZ.js → common-CYaT2yHp.js} +1 -1
  54. package/client/dist/assets/{common-DPxotRK9.js → common-DhWTkocg.js} +1 -1
  55. package/client/dist/assets/{common-k5MTOHpn.js → common-DiPTT7V_2.js} +1 -1
  56. package/client/dist/assets/{common-C8ZD5upH2.js → common-DmqBPwZG.js} +1 -1
  57. package/client/dist/assets/{cssMode-DsArsSCT.js → cssMode-DBHbkBvI.js} +1 -1
  58. package/client/dist/assets/dashboard-BaStj_a_.js +1 -0
  59. package/client/dist/assets/dashboard-Bi6ugu5Q.js +1 -0
  60. package/client/dist/assets/dashboard-BmqTn3L02.js +1 -0
  61. package/client/dist/assets/dashboard-CvT8lOCT.js +1 -0
  62. package/client/dist/assets/dashboard-D7Pmeavq2.js +1 -0
  63. package/client/dist/assets/dashboard-DAnWdAac2.js +1 -0
  64. package/client/dist/assets/dashboard-JnYy2WLg.js +1 -0
  65. package/client/dist/assets/dashboard-L47YsFS_.js +1 -0
  66. package/client/dist/assets/{dist-js-BQn4yxaw.js → dist-js-BZSiJDbG.js} +1 -1
  67. package/client/dist/assets/{dist-js-BAWSqVtr.js → dist-js-DKpmIJlQ.js} +1 -1
  68. package/client/dist/assets/{editor.main-G3Sl9C67.js → editor.main-C9J2ikJK.js} +2 -2
  69. package/client/dist/assets/{freemarker2-pBzQNgFi.js → freemarker2-J5iIIIK-.js} +1 -1
  70. package/client/dist/assets/{handlebars-CtBTCnBI.js → handlebars-DSw1l_tw.js} +1 -1
  71. package/client/dist/assets/{html-Dx3DYBzY.js → html-h2-wE1Lj.js} +1 -1
  72. package/client/dist/assets/{htmlMode-In7frFOo.js → htmlMode-Cc_ij7lW.js} +1 -1
  73. package/client/dist/assets/index-DM6heiGa.js +155 -0
  74. package/client/dist/assets/index-DPX6_xIC.css +2 -0
  75. package/client/dist/assets/{javascript-BKcn-YkN.js → javascript-C1q3xv6N.js} +1 -1
  76. package/client/dist/assets/jira-B3613-gj.js +1 -0
  77. package/client/dist/assets/jira-BHAKtc4B.js +1 -0
  78. package/client/dist/assets/jira-Be369RIR2.js +1 -0
  79. package/client/dist/assets/jira-CPpgA-5z2.js +1 -0
  80. package/client/dist/assets/jira-D5efgwp_.js +1 -0
  81. package/client/dist/assets/jira-DS7ownDy.js +1 -0
  82. package/client/dist/assets/jira-bDs7Im2C.js +1 -0
  83. package/client/dist/assets/jira-uNH1gETL2.js +1 -0
  84. package/client/dist/assets/jobs-1GV2-4zd2.js +1 -0
  85. package/client/dist/assets/jobs-26F9gGcE.js +1 -0
  86. package/client/dist/assets/jobs-BgQzB0Sx2.js +1 -0
  87. package/client/dist/assets/jobs-BqWui9_f.js +1 -0
  88. package/client/dist/assets/jobs-CE8qeIYj.js +1 -0
  89. package/client/dist/assets/jobs-D5sZzgLs.js +1 -0
  90. package/client/dist/assets/jobs-DzeuASRf.js +1 -0
  91. package/client/dist/assets/jobs-Wh7dn28q2.js +1 -0
  92. package/client/dist/assets/{jsonMode-jNREoQ3C.js → jsonMode-CeaCdEhr.js} +1 -1
  93. package/client/dist/assets/{lib-C-g8QbZl.js → lib-B2nCKzmA.js} +1 -1
  94. package/client/dist/assets/{liquid-CtRkGqBu.js → liquid-eFsVK0V-.js} +1 -1
  95. package/client/dist/assets/loops-BvEenWBy.js +1 -0
  96. package/client/dist/assets/loops-CBiWd9Hf.js +1 -0
  97. package/client/dist/assets/loops-DNGiYKll2.js +1 -0
  98. package/client/dist/assets/{loops-Y3FQsUCh.js → loops-DjOtVXRo.js} +1 -1
  99. package/client/dist/assets/loops-HTHf-xu32.js +1 -0
  100. package/client/dist/assets/loops-YYV2bwjd.js +1 -0
  101. package/client/dist/assets/loops-hXgncEpF2.js +1 -0
  102. package/client/dist/assets/loops-kYbydDyN.js +1 -0
  103. package/client/dist/assets/{lspLanguageFeatures-Cl3gvD_W.js → lspLanguageFeatures-DT3-bbhn.js} +1 -1
  104. package/client/dist/assets/{mdx-B_nJldHz.js → mdx-Fuwnh1cX.js} +1 -1
  105. package/client/dist/assets/{monaco.contribution-PUeaZk8T.js → monaco.contribution-Desq7oq4.js} +2 -2
  106. package/client/dist/assets/{python-DS1Ce-A6.js → python-BgoEs6Cj.js} +1 -1
  107. package/client/dist/assets/{razor-L41Qg9OK.js → razor-CM1sPMMq.js} +1 -1
  108. package/client/dist/assets/{settings-BPq9nCJm.js → settings-BOHOmHkb.js} +1 -1
  109. package/client/dist/assets/{settings-r8Qq2Gzp2.js → settings-BlEA_7h02.js} +1 -1
  110. package/client/dist/assets/{settings-C-m3yEZ2.js → settings-BsJMsWGc.js} +1 -1
  111. package/client/dist/assets/{settings-zZr7NzuB.js → settings-D6qY9_UI.js} +1 -1
  112. package/client/dist/assets/{settings-VgCsjaYf.js → settings-DZJeXoRV.js} +1 -1
  113. package/client/dist/assets/settings-Mr7MnJbf.js +1 -0
  114. package/client/dist/assets/{settings-BWHGtmU12.js → settings-TNga5gIF2.js} +1 -1
  115. package/client/dist/assets/{settings-DZj7Uqy32.js → settings-lFoaYT-s2.js} +1 -1
  116. package/client/dist/assets/setup-B590KsTX.js +1 -0
  117. package/client/dist/assets/setup-BkyGoby6.js +1 -0
  118. package/client/dist/assets/setup-CEj6uY3-2.js +1 -0
  119. package/client/dist/assets/setup-CbIerFGf2.js +1 -0
  120. package/client/dist/assets/setup-CmU6bTCV2.js +1 -0
  121. package/client/dist/assets/setup-D674kWQH.js +1 -0
  122. package/client/dist/assets/setup-VNqXyB6Y.js +1 -0
  123. package/client/dist/assets/setup-iY8vH8pB.js +1 -0
  124. package/client/dist/assets/specs-C9Sd7BhH2.js +1 -0
  125. package/client/dist/assets/specs-CBDvEYKv.js +1 -0
  126. package/client/dist/assets/specs-CIPr9reA2.js +1 -0
  127. package/client/dist/assets/specs-CWtKcVDC.js +1 -0
  128. package/client/dist/assets/specs-CmEZY57v.js +1 -0
  129. package/client/dist/assets/specs-D2clrt2c2.js +1 -0
  130. package/client/dist/assets/specs-DTplt2XM.js +1 -0
  131. package/client/dist/assets/specs-PozUNhqb.js +1 -0
  132. package/client/dist/assets/{tsMode-BC1g186U.js → tsMode-BmT8WogI.js} +1 -1
  133. package/client/dist/assets/{typescript-BGlRGvJW.js → typescript-CQrQPsoW.js} +1 -1
  134. package/client/dist/assets/upload-CLAzW1mS.js +1 -0
  135. package/client/dist/assets/{value-D9aLbxw-.js → value-DSwzyyWR.js} +1 -1
  136. package/client/dist/assets/{workers-CXcXtO3b.js → workers-U0UXyLUf.js} +1 -1
  137. package/client/dist/assets/{xml-JdZZaIhJ.js → xml-WRxJs8_I.js} +1 -1
  138. package/client/dist/assets/{yaml-Cm82BVBt.js → yaml-CjpSTjJU.js} +1 -1
  139. package/client/dist/index.html +14 -14
  140. package/docs/customizing.md +2 -2
  141. package/docs/gemini.md +15 -4
  142. package/docs/guide/de/insights/3-code-explorer.md +6 -0
  143. package/docs/guide/de/integrations/3-jira-integration.md +1 -1
  144. package/docs/guide/de/integrations/6-agent-chat.md +5 -0
  145. package/docs/guide/de/pipeline/1-rails-and-jobs.md +6 -6
  146. package/docs/guide/de/pipeline/2-the-job-detail-view.md +27 -2
  147. package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +9 -5
  148. package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
  149. package/docs/guide/de/specs/1-specs-and-the-backlog.md +3 -2
  150. package/docs/guide/en/insights/3-code-explorer.md +6 -0
  151. package/docs/guide/en/integrations/3-jira-integration.md +1 -1
  152. package/docs/guide/en/integrations/6-agent-chat.md +5 -0
  153. package/docs/guide/en/pipeline/1-rails-and-jobs.md +6 -6
  154. package/docs/guide/en/pipeline/2-the-job-detail-view.md +27 -2
  155. package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +10 -4
  156. package/docs/guide/en/pipeline/5-the-loop-builder.md +1 -1
  157. package/docs/guide/en/specs/1-specs-and-the-backlog.md +3 -2
  158. package/docs/guide/es/insights/3-code-explorer.md +6 -0
  159. package/docs/guide/es/integrations/3-jira-integration.md +1 -1
  160. package/docs/guide/es/integrations/6-agent-chat.md +5 -0
  161. package/docs/guide/es/pipeline/1-rails-and-jobs.md +6 -6
  162. package/docs/guide/es/pipeline/2-the-job-detail-view.md +27 -2
  163. package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +9 -5
  164. package/docs/guide/es/pipeline/5-the-loop-builder.md +1 -1
  165. package/docs/guide/es/specs/1-specs-and-the-backlog.md +3 -2
  166. package/docs/guide/fr/insights/3-code-explorer.md +6 -0
  167. package/docs/guide/fr/integrations/3-jira-integration.md +1 -1
  168. package/docs/guide/fr/integrations/6-agent-chat.md +5 -0
  169. package/docs/guide/fr/pipeline/1-rails-and-jobs.md +6 -6
  170. package/docs/guide/fr/pipeline/2-the-job-detail-view.md +27 -2
  171. package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +9 -5
  172. package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
  173. package/docs/guide/fr/specs/1-specs-and-the-backlog.md +3 -2
  174. package/docs/guide/it/insights/3-code-explorer.md +6 -0
  175. package/docs/guide/it/integrations/3-jira-integration.md +1 -1
  176. package/docs/guide/it/integrations/6-agent-chat.md +5 -0
  177. package/docs/guide/it/pipeline/1-rails-and-jobs.md +6 -6
  178. package/docs/guide/it/pipeline/2-the-job-detail-view.md +27 -2
  179. package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +10 -6
  180. package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
  181. package/docs/guide/it/specs/1-specs-and-the-backlog.md +3 -2
  182. package/docs/guide/ja/insights/3-code-explorer.md +6 -0
  183. package/docs/guide/ja/integrations/3-jira-integration.md +1 -1
  184. package/docs/guide/ja/integrations/6-agent-chat.md +5 -0
  185. package/docs/guide/ja/pipeline/1-rails-and-jobs.md +6 -6
  186. package/docs/guide/ja/pipeline/2-the-job-detail-view.md +27 -2
  187. package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +9 -5
  188. package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
  189. package/docs/guide/ja/specs/1-specs-and-the-backlog.md +3 -2
  190. package/docs/guide/pt/insights/3-code-explorer.md +6 -0
  191. package/docs/guide/pt/integrations/3-jira-integration.md +1 -1
  192. package/docs/guide/pt/integrations/6-agent-chat.md +5 -0
  193. package/docs/guide/pt/pipeline/1-rails-and-jobs.md +6 -6
  194. package/docs/guide/pt/pipeline/2-the-job-detail-view.md +27 -2
  195. package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +9 -5
  196. package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
  197. package/docs/guide/pt/specs/1-specs-and-the-backlog.md +3 -2
  198. package/docs/guide/zh/insights/3-code-explorer.md +6 -0
  199. package/docs/guide/zh/integrations/3-jira-integration.md +1 -1
  200. package/docs/guide/zh/integrations/6-agent-chat.md +5 -0
  201. package/docs/guide/zh/pipeline/1-rails-and-jobs.md +6 -6
  202. package/docs/guide/zh/pipeline/2-the-job-detail-view.md +27 -2
  203. package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +10 -6
  204. package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
  205. package/docs/guide/zh/specs/1-specs-and-the-backlog.md +3 -2
  206. package/docs/internals/README.md +5 -0
  207. package/docs/internals/adding-a-provider.md +15 -3
  208. package/docs/internals/api-reference.md +6 -5
  209. package/docs/internals/browser-capture-performance.md +93 -0
  210. package/docs/internals/code-explorer-story.md +135 -0
  211. package/docs/internals/gemini-mcp-registration.md +53 -0
  212. package/docs/internals/interactive-jobs.md +212 -0
  213. package/docs/internals/loop-step-log-explorer.md +146 -0
  214. package/docs/internals/safe-pr-review-flow.md +367 -0
  215. package/docs/mcp.md +1 -1
  216. package/docs/running-pipelines.md +6 -2
  217. package/package.json +1 -1
  218. package/server/dist/agent-chat-manager.js +211 -0
  219. package/server/dist/agent-chat-registry.js +20 -0
  220. package/server/dist/agent-chat-router.js +22 -0
  221. package/server/dist/agent-mcp-config.js +45 -4
  222. package/server/dist/agent-operator-prompt.js +149 -56
  223. package/server/dist/agent-store.js +25 -0
  224. package/server/dist/agent-tier.js +6 -1
  225. package/server/dist/browser-capture-manager.js +184 -34
  226. package/server/dist/browser-playwright.js +98 -13
  227. package/server/dist/code-explorer-router.js +92 -0
  228. package/server/dist/db.js +102 -0
  229. package/server/dist/file-provenance.js +54 -1
  230. package/server/dist/file-story-manager.js +170 -0
  231. package/server/dist/file-story.js +148 -0
  232. package/server/dist/file-summary-generator.js +5 -4
  233. package/server/dist/git-guardrails.js +62 -0
  234. package/server/dist/index.js +5 -0
  235. package/server/dist/integration-branch.js +63 -0
  236. package/server/dist/interactive-job-session.js +226 -18
  237. package/server/dist/jira/jira-adf.js +9 -0
  238. package/server/dist/jira/jira-materializer.js +27 -4
  239. package/server/dist/jira/jira-status-resolver.js +12 -4
  240. package/server/dist/jira/jira-sync-manager.js +130 -2
  241. package/server/dist/jira-router.js +1 -1
  242. package/server/dist/loop-effect.js +12 -0
  243. package/server/dist/loop-executors.js +92 -22
  244. package/server/dist/loop-run-manager.js +354 -28
  245. package/server/dist/mcp/guide.js +18 -7
  246. package/server/dist/mcp/tools/jira.js +1 -1
  247. package/server/dist/mcp/tools/jobs.js +14 -5
  248. package/server/dist/mcp/tools/rails.js +137 -12
  249. package/server/dist/mcp/tools/specs.js +35 -9
  250. package/server/dist/mcp/tools/types.js +49 -0
  251. package/server/dist/mobile/mobile-ws.js +4 -0
  252. package/server/dist/path-resolver.js +46 -0
  253. package/server/dist/pr-body.js +240 -0
  254. package/server/dist/pr-naming.js +210 -0
  255. package/server/dist/pr-publisher.js +68 -0
  256. package/server/dist/project-registry.js +77 -17
  257. package/server/dist/project-router-jobs.js +53 -13
  258. package/server/dist/project-router-settings.js +33 -0
  259. package/server/dist/project-router-terminals.js +16 -0
  260. package/server/dist/project-router-tickets.js +57 -3
  261. package/server/dist/project-router.js +52 -13
  262. package/server/dist/queue-manager.js +268 -83
  263. package/server/dist/rail-isolated-launch.js +324 -34
  264. package/server/dist/rail-isolation.js +32 -5
  265. package/server/dist/rail-pr-decision.js +519 -0
  266. package/server/dist/rail-pr-delivery.js +75 -0
  267. package/server/dist/rail-pr-store.js +175 -0
  268. package/server/dist/rail-worktrees-store.js +18 -0
  269. package/server/dist/rails-router.js +241 -17
  270. package/server/dist/rails-store.js +78 -1
  271. package/server/dist/setup-prerequisites.js +105 -0
  272. package/server/dist/smash-runner.js +3 -1
  273. package/server/dist/ticket-store.js +7 -3
  274. package/server/dist/workspace-resolution.js +27 -0
  275. package/server/dist/worktree-manager.js +42 -7
  276. package/server/dist/worktree-overlay.js +261 -0
  277. package/client/dist/assets/AgentBrowserCapture-BlGDZahz.js +0 -1
  278. package/client/dist/assets/AgentModeJobsPane-CyNR-9BO.js +0 -1
  279. package/client/dist/assets/AgentsPage-dNsEsY_x.js +0 -86
  280. package/client/dist/assets/AnalyticsPage-BAxmR0HQ.js +0 -1
  281. package/client/dist/assets/CodePage-Crc4BBQN.js +0 -2
  282. package/client/dist/assets/DesktopAnalyticsPage-IXSnbCce.js +0 -1
  283. package/client/dist/assets/DocsDialog-Bc4hx7oW.js +0 -11
  284. package/client/dist/assets/DocsPage-bEU4t9c6.js +0 -11
  285. package/client/dist/assets/IntegrationsPage-wq2CezEL.js +0 -3
  286. package/client/dist/assets/JobDetailPage-BBcPk3j8.js +0 -1
  287. package/client/dist/assets/JobsPage-DXrSPlwa.js +0 -1
  288. package/client/dist/assets/LogViewer-BoYbwvbU.js +0 -16
  289. package/client/dist/assets/LoopBuilderPage-CiUMAuWz.js +0 -7
  290. package/client/dist/assets/LoopsPage-Xrp6W5XW.js +0 -1
  291. package/client/dist/assets/ProjectSettingsDialog-BU98L5JD.js +0 -1
  292. package/client/dist/assets/agent-B7GdHP3Z.js +0 -1
  293. package/client/dist/assets/agent-BHmcgoJf.js +0 -1
  294. package/client/dist/assets/agent-BdY_fii4.js +0 -1
  295. package/client/dist/assets/agent-C32FOi9v.js +0 -1
  296. package/client/dist/assets/agent-CiFQxoaZ2.js +0 -1
  297. package/client/dist/assets/agent-CtAag7V6.js +0 -1
  298. package/client/dist/assets/agent-DE4Mp1fY2.js +0 -1
  299. package/client/dist/assets/agent-DK8qovyG2.js +0 -1
  300. package/client/dist/assets/browser-ZB1afzjZ.js +0 -1
  301. package/client/dist/assets/code-BFxE1Yt62.js +0 -1
  302. package/client/dist/assets/code-BefYOm5Q.js +0 -1
  303. package/client/dist/assets/code-BkXpJt99.js +0 -1
  304. package/client/dist/assets/code-C6Sq7_t8.js +0 -1
  305. package/client/dist/assets/code-CGj3w-2N.js +0 -1
  306. package/client/dist/assets/code-Dfsxc9o82.js +0 -1
  307. package/client/dist/assets/code-Y5urks5s2.js +0 -1
  308. package/client/dist/assets/code-wtcs0ivb.js +0 -1
  309. package/client/dist/assets/dashboard-B8032psZ.js +0 -1
  310. package/client/dist/assets/dashboard-BHGKtxty2.js +0 -1
  311. package/client/dist/assets/dashboard-CXnoUgN22.js +0 -1
  312. package/client/dist/assets/dashboard-Ccyxqy7d.js +0 -1
  313. package/client/dist/assets/dashboard-CoED_41r.js +0 -1
  314. package/client/dist/assets/dashboard-Dc5ZAgMN.js +0 -1
  315. package/client/dist/assets/dashboard-JMY8ueD3.js +0 -1
  316. package/client/dist/assets/dashboard-tkWr1aHD2.js +0 -1
  317. package/client/dist/assets/index-BHPbzyg6.css +0 -2
  318. package/client/dist/assets/index-n2PmJGF6.js +0 -152
  319. package/client/dist/assets/jira-BcZzX9122.js +0 -1
  320. package/client/dist/assets/jira-CTYs7LA12.js +0 -1
  321. package/client/dist/assets/jira-D2nN39e92.js +0 -1
  322. package/client/dist/assets/jira-DJxmIkyr.js +0 -1
  323. package/client/dist/assets/jira-DXMoAKWD.js +0 -1
  324. package/client/dist/assets/jira-IhC1ROIc.js +0 -1
  325. package/client/dist/assets/jira-Iw575fN8.js +0 -1
  326. package/client/dist/assets/jira-kbWZY7jH.js +0 -1
  327. package/client/dist/assets/jobs-BqF79kHz2.js +0 -1
  328. package/client/dist/assets/jobs-C1XM5urS.js +0 -1
  329. package/client/dist/assets/jobs-C5UjG0262.js +0 -1
  330. package/client/dist/assets/jobs-DBfaHTxC.js +0 -1
  331. package/client/dist/assets/jobs-DM4BDPdg.js +0 -1
  332. package/client/dist/assets/jobs-Da5OkZmf2.js +0 -1
  333. package/client/dist/assets/jobs-JJdnuQ03.js +0 -1
  334. package/client/dist/assets/jobs-SI34ML8I.js +0 -1
  335. package/client/dist/assets/loops-BR4FmOv12.js +0 -1
  336. package/client/dist/assets/loops-BgX_uudn.js +0 -1
  337. package/client/dist/assets/loops-Bpl2j2LP.js +0 -1
  338. package/client/dist/assets/loops-CQuuMlyZ.js +0 -1
  339. package/client/dist/assets/loops-DW8hSMdS2.js +0 -1
  340. package/client/dist/assets/loops-Q2muu8hW2.js +0 -1
  341. package/client/dist/assets/loops-q7CNDvfK.js +0 -1
  342. package/client/dist/assets/settings-CY8udi0e.js +0 -1
  343. package/client/dist/assets/setup-CNMdCHHt2.js +0 -1
  344. package/client/dist/assets/setup-Cag4XrbL2.js +0 -1
  345. package/client/dist/assets/setup-D9IHGoWU.js +0 -1
  346. package/client/dist/assets/setup-Dg6Ba3JT.js +0 -1
  347. package/client/dist/assets/setup-DyK36RIW.js +0 -1
  348. package/client/dist/assets/setup-G4ZvDKxX.js +0 -1
  349. package/client/dist/assets/setup-aTlGxuwi2.js +0 -1
  350. package/client/dist/assets/setup-kWsoAeHQ.js +0 -1
  351. package/client/dist/assets/specs-BFSUPa122.js +0 -1
  352. package/client/dist/assets/specs-BMzip1WY2.js +0 -1
  353. package/client/dist/assets/specs-BYeAbIEy.js +0 -1
  354. package/client/dist/assets/specs-C-mtLcXw.js +0 -1
  355. package/client/dist/assets/specs-CAzpvADd2.js +0 -1
  356. package/client/dist/assets/specs-CyRIw_IR.js +0 -1
  357. package/client/dist/assets/specs-DMm7gB_l.js +0 -1
  358. package/client/dist/assets/specs-DuottM0Z.js +0 -1
  359. /package/client/dist/assets/{abap-CpHUwCVK.js → abap-D0E4FfVW.js} +0 -0
  360. /package/client/dist/assets/{activity-DemHQS7l.js → activity--iN4Ad2R2.js} +0 -0
  361. /package/client/dist/assets/{activity-B_71BWg3.js → activity-6hM_ZSg9.js} +0 -0
  362. /package/client/dist/assets/{activity-DHv2V5Oi.js → activity-BZNfOdiS.js} +0 -0
  363. /package/client/dist/assets/{activity-D0rfjQzT2.js → activity-BuVo5sPB.js} +0 -0
  364. /package/client/dist/assets/{activity-BpTTj_PH.js → activity-CIOLxGvh.js} +0 -0
  365. /package/client/dist/assets/{activity-D2e62vbV2.js → activity-D2r2h3SE2.js} +0 -0
  366. /package/client/dist/assets/{activity-Ch-wbr0C2.js → activity-DtxrAUMo2.js} +0 -0
  367. /package/client/dist/assets/{addon-image-Ba-TY3wr.js → addon-image-CwoZj17F.js} +0 -0
  368. /package/client/dist/assets/{addon-ligatures-T4ARLiuu.js → addon-ligatures-CWDrED80.js} +0 -0
  369. /package/client/dist/assets/{addon-webgl-Cd73n8eh.js → addon-webgl-DMbGeI_u.js} +0 -0
  370. /package/client/dist/assets/{addspec-xwRX_Pnf.js → addspec-BMtLZLW62.js} +0 -0
  371. /package/client/dist/assets/{addspec-l_zU5gla.js → addspec-CP0HRuxY.js} +0 -0
  372. /package/client/dist/assets/{addspec-Dio-H5z0.js → addspec-CRuvWn8d.js} +0 -0
  373. /package/client/dist/assets/{addspec-D6L4ZteP.js → addspec-D-JLDsUV.js} +0 -0
  374. /package/client/dist/assets/{addspec-CrEm6Fzr2.js → addspec-DfhDbg5c.js} +0 -0
  375. /package/client/dist/assets/{addspec-B6Ns8KU02.js → addspec-bsNDdqRm2.js} +0 -0
  376. /package/client/dist/assets/{addspec-qGyH7MHy2.js → addspec-mgPOt5q02.js} +0 -0
  377. /package/client/dist/assets/{agents-OzxCLVW1.js → agents-78bTZGZh.js} +0 -0
  378. /package/client/dist/assets/{agents-hv3sqmPm2.js → agents-BLhWCmDS2.js} +0 -0
  379. /package/client/dist/assets/{agents-CHgCudUV.js → agents-BUdEi3-N.js} +0 -0
  380. /package/client/dist/assets/{agents-Dumx4JiM2.js → agents-BpoUaoW92.js} +0 -0
  381. /package/client/dist/assets/{agents-CnaPeSyw.js → agents-CWo-KyAB.js} +0 -0
  382. /package/client/dist/assets/{agents-Xh-zYHUx2.js → agents-DDtCJ5M02.js} +0 -0
  383. /package/client/dist/assets/{agents-DuhLEaQ_.js → agents-bvyRLczL.js} +0 -0
  384. /package/client/dist/assets/{agentstudio-CCthUdzR.js → agentstudio-BMQxc_bz.js} +0 -0
  385. /package/client/dist/assets/{agentstudio-CcH8Ckql2.js → agentstudio-COZriimI2.js} +0 -0
  386. /package/client/dist/assets/{agentstudio-Bo91kfUd2.js → agentstudio-CWgXG5W52.js} +0 -0
  387. /package/client/dist/assets/{agentstudio-VJOa_NVO.js → agentstudio-C_Jq8Tl4.js} +0 -0
  388. /package/client/dist/assets/{agentstudio-BIxikDf_.js → agentstudio-Dtq3dGYk.js} +0 -0
  389. /package/client/dist/assets/{agentstudio-Bz8cP8_c.js → agentstudio-jKMTdT70.js} +0 -0
  390. /package/client/dist/assets/{agentstudio-DARgYg5Z2.js → agentstudio-sI27TpBu2.js} +0 -0
  391. /package/client/dist/assets/{aiedit-5ZXN4cep2.js → aiedit-6CHdb_iv2.js} +0 -0
  392. /package/client/dist/assets/{aiedit-B7gAJZVC.js → aiedit-B03pD_Na.js} +0 -0
  393. /package/client/dist/assets/{aiedit-D92V-kUW.js → aiedit-BtRqRxML.js} +0 -0
  394. /package/client/dist/assets/{aiedit-D9ualLVJ.js → aiedit-eMN4eQPF.js} +0 -0
  395. /package/client/dist/assets/{aiedit-h48tJU0V2.js → aiedit-hknZlly82.js} +0 -0
  396. /package/client/dist/assets/{aiedit-xkA_mR2a2.js → aiedit-igmw-ZoZ2.js} +0 -0
  397. /package/client/dist/assets/{aiedit-7B2dvCv-.js → aiedit-pc5JDUq1.js} +0 -0
  398. /package/client/dist/assets/{analytics-slx4X1mu2.js → analytics-BWMUZ2Pq2.js} +0 -0
  399. /package/client/dist/assets/{analytics-uRNP6yAJ.js → analytics-Bj-SmKHa.js} +0 -0
  400. /package/client/dist/assets/{analytics-WF1I49ln.js → analytics-C5dpiS0o.js} +0 -0
  401. /package/client/dist/assets/{analytics-CBvaxOId.js → analytics-CCprAqk3.js} +0 -0
  402. /package/client/dist/assets/{analytics-BakymH7Z2.js → analytics-CR1TJqUi2.js} +0 -0
  403. /package/client/dist/assets/{analytics-B7bPj6u_2.js → analytics-DfNdXR0y2.js} +0 -0
  404. /package/client/dist/assets/{analytics-DZ74aQ54.js → analytics-rmHuJv0V.js} +0 -0
  405. /package/client/dist/assets/{apex-DlD7oJX6.js → apex-D_X_8J4d.js} +0 -0
  406. /package/client/dist/assets/{atom-one-dark-BrRN8wBy.js → atom-one-dark-BMDPFwRZ.js} +0 -0
  407. /package/client/dist/assets/{attachments-C11tOKZ_.js → attachments-BgBNSqQd.js} +0 -0
  408. /package/client/dist/assets/{attachments-Bnbyj2PN.js → attachments-BjyMmrwE.js} +0 -0
  409. /package/client/dist/assets/{attachments-CIeLa8l12.js → attachments-C9GTTJsx2.js} +0 -0
  410. /package/client/dist/assets/{attachments-DslHfa-L.js → attachments-DCZOL1RU.js} +0 -0
  411. /package/client/dist/assets/{attachments-C-gyrCOb.js → attachments-DL-bPy9E.js} +0 -0
  412. /package/client/dist/assets/{attachments-Cxrs0pyL2.js → attachments-DPCmkFZu2.js} +0 -0
  413. /package/client/dist/assets/{attachments-TTPsc0a52.js → attachments-rNn1ekRy2.js} +0 -0
  414. /package/client/dist/assets/{azcli-CmXFAbc-.js → azcli-PZLnZ3jH.js} +0 -0
  415. /package/client/dist/assets/{bat-DdNJq4hH.js → bat-KlBOxpO4.js} +0 -0
  416. /package/client/dist/assets/{bicep-Bppz7WOA.js → bicep-CgG9oF3V.js} +0 -0
  417. /package/client/dist/assets/{cameligo-0MRMdSmg.js → cameligo-6R45j6Ph.js} +0 -0
  418. /package/client/dist/assets/{chat-BvHrebKC2.js → chat-BgL3zv6x2.js} +0 -0
  419. /package/client/dist/assets/{chat-CZyiLJvQ.js → chat-Bh3NdgJs.js} +0 -0
  420. /package/client/dist/assets/{chat-DKYP7NnC.js → chat-Bom6bqK3.js} +0 -0
  421. /package/client/dist/assets/{chat-5mdg_YIc2.js → chat-DdwZjT8K2.js} +0 -0
  422. /package/client/dist/assets/{chat-wkTIy9rX.js → chat-Dnwg-NpQ.js} +0 -0
  423. /package/client/dist/assets/{chat-BpYxnkr4.js → chat-DsbwJhus.js} +0 -0
  424. /package/client/dist/assets/{chat-BGax2nV62.js → chat-vylxqR0P2.js} +0 -0
  425. /package/client/dist/assets/{clojure-B5dKj863.js → clojure-CLAAMO7J.js} +0 -0
  426. /package/client/dist/assets/{clsx-1dnHRn8W.js → clsx-CNmW0Nip.js} +0 -0
  427. /package/client/dist/assets/{coffee-DSbWjzk7.js → coffee-AruSygo-.js} +0 -0
  428. /package/client/dist/assets/{commands-uz_uKT242.js → commands-C4Y3C-PF2.js} +0 -0
  429. /package/client/dist/assets/{commands-Bb7MnPqn2.js → commands-CSDs9q_2.js} +0 -0
  430. /package/client/dist/assets/{commands-C_7zZwJf.js → commands-DkU0qliq.js} +0 -0
  431. /package/client/dist/assets/{commands-D_6B8lfU.js → commands-JWMfGDmr.js} +0 -0
  432. /package/client/dist/assets/{commands-DBc5llLi2.js → commands-RHOchN4n2.js} +0 -0
  433. /package/client/dist/assets/{commands-CQkdthjF.js → commands-u-4eEHCN.js} +0 -0
  434. /package/client/dist/assets/{commands-DhZNhSbl.js → commands-xHDDGfcP2.js} +0 -0
  435. /package/client/dist/assets/{cpp-SBF8SAh9.js → cpp-DEE5r4Pw.js} +0 -0
  436. /package/client/dist/assets/{csharp-Lzuq_1t-.js → csharp-BVXJUvbK.js} +0 -0
  437. /package/client/dist/assets/{csp-BEzxZqi1.js → csp-cXOF0JoV.js} +0 -0
  438. /package/client/dist/assets/{css-C3D3PKln.js → css-C_zQuAoy.js} +0 -0
  439. /package/client/dist/assets/{cypher-CQ3dEPmv.js → cypher-t95m_Q-O.js} +0 -0
  440. /package/client/dist/assets/{dart-DCPmxolI.js → dart-B4r1Tg-e.js} +0 -0
  441. /package/client/dist/assets/{dockerfile-B_2_aaTO.js → dockerfile-6mt7zHQw.js} +0 -0
  442. /package/client/dist/assets/{ecl-rADUeXsV.js → ecl-DEY_Fz_Q.js} +0 -0
  443. /package/client/dist/assets/{editor.api2-T7u8kQWG.js → editor.api2-C3B0tp2x.js} +0 -0
  444. /package/client/dist/assets/{elixir-DOd-TuJO.js → elixir-R6-q1c5t.js} +0 -0
  445. /package/client/dist/assets/{explore-BHEhNekP2.js → explore-B7fblXBb2.js} +0 -0
  446. /package/client/dist/assets/{explore-DAsroA482.js → explore-BHtEpoNN2.js} +0 -0
  447. /package/client/dist/assets/{explore-UwHHj2ux.js → explore-C0k8HrkN.js} +0 -0
  448. /package/client/dist/assets/{explore-DaXiW9-6.js → explore-CNBzrEPS.js} +0 -0
  449. /package/client/dist/assets/{explore-CWlAXx0f2.js → explore-D_mWBYCS2.js} +0 -0
  450. /package/client/dist/assets/{explore-DG1CtYqT.js → explore-Dahc1lOx.js} +0 -0
  451. /package/client/dist/assets/{explore-DMSGAnhK.js → explore-UvW1jEMa.js} +0 -0
  452. /package/client/dist/assets/{flow9-Bf7zg_j0.js → flow9-CNQvHBOt.js} +0 -0
  453. /package/client/dist/assets/{format-command-BHymDa4r.js → format-command-CuWuRvka.js} +0 -0
  454. /package/client/dist/assets/{fsharp-BqROZjbA.js → fsharp-vPZkFXwv.js} +0 -0
  455. /package/client/dist/assets/{go-oQTP5uLe.js → go-KUzBMYJ_.js} +0 -0
  456. /package/client/dist/assets/{graphql-CSHfTU3q.js → graphql-C3W0rCsD.js} +0 -0
  457. /package/client/dist/assets/{hcl-CeG-RoFJ.js → hcl-BOOMFSNX.js} +0 -0
  458. /package/client/dist/assets/{ini-B2Dv4ohc.js → ini-CFat1WJr.js} +0 -0
  459. /package/client/dist/assets/{integrations-CAF21FbQ.js → integrations-4KZnYECp.js} +0 -0
  460. /package/client/dist/assets/{integrations-CHCgning2.js → integrations-7W266oqF2.js} +0 -0
  461. /package/client/dist/assets/{integrations-B-JVE1_D.js → integrations-BNuauK3o.js} +0 -0
  462. /package/client/dist/assets/{integrations-BAujIDoE.js → integrations-CHy8tnpV.js} +0 -0
  463. /package/client/dist/assets/{integrations-DS5FFMes.js → integrations-Cl_wD5AI.js} +0 -0
  464. /package/client/dist/assets/{integrations-axZN4--n2.js → integrations-Cy8nZ_dv2.js} +0 -0
  465. /package/client/dist/assets/{integrations-CtsOpq2D2.js → integrations-zMqY4VU12.js} +0 -0
  466. /package/client/dist/assets/{java-aUDDeufb.js → java-Dee-CNAM.js} +0 -0
  467. /package/client/dist/assets/{julia-C5LbruO5.js → julia-CGNlLYuU.js} +0 -0
  468. /package/client/dist/assets/{kotlin-C6mOuSKk.js → kotlin-CY7lhknJ.js} +0 -0
  469. /package/client/dist/assets/{less-D5qC3caW.js → less-D0KN7hfJ.js} +0 -0
  470. /package/client/dist/assets/{lexon-Dr2La-fj.js → lexon-CuRJufPs.js} +0 -0
  471. /package/client/dist/assets/{lua-Zy6u5z6Z.js → lua-DHvH62Zf.js} +0 -0
  472. /package/client/dist/assets/{m3-C7XHeDz_.js → m3-tlthQ8Fo.js} +0 -0
  473. /package/client/dist/assets/{markdown-PiF7r-2h.js → markdown-Dbx1LgUZ.js} +0 -0
  474. /package/client/dist/assets/{mcp-B_nWlxZa2.js → mcp-CjVKXAhD2.js} +0 -0
  475. /package/client/dist/assets/{mcp-B8omp_Cd.js → mcp-Dcl-XxkR.js} +0 -0
  476. /package/client/dist/assets/{mcp-DTCCrYHz2.js → mcp-DtbxuH3V2.js} +0 -0
  477. /package/client/dist/assets/{mcp-DytBbASZ.js → mcp-H-gnQUdN.js} +0 -0
  478. /package/client/dist/assets/{mcp-D_oPS6Zc.js → mcp-N1nzp8oL.js} +0 -0
  479. /package/client/dist/assets/{mcp-Cb2jtHP72.js → mcp-XJNRfxVp2.js} +0 -0
  480. /package/client/dist/assets/{mcp-DPqm2C8-.js → mcp-sRmWE8WJ.js} +0 -0
  481. /package/client/dist/assets/{mips-nn07GiyE.js → mips-D_O3IUz_.js} +0 -0
  482. /package/client/dist/assets/{msdax-DaKFVMST.js → msdax-C_ZmCnRt.js} +0 -0
  483. /package/client/dist/assets/{mysql-C6d6xrbU.js → mysql-C-dCEYSX.js} +0 -0
  484. /package/client/dist/assets/{nav-Cibp2KWF.js → nav-40HzpIFb.js} +0 -0
  485. /package/client/dist/assets/{nav-DtTnF9xd.js → nav-8yPhBn00.js} +0 -0
  486. /package/client/dist/assets/{nav-Danf5sRf2.js → nav-B6PkGfTk2.js} +0 -0
  487. /package/client/dist/assets/{nav-Bqhyfbcj2.js → nav-BHqMLrS72.js} +0 -0
  488. /package/client/dist/assets/{nav-CQb9y1km.js → nav-CGy4yx3C.js} +0 -0
  489. /package/client/dist/assets/{nav-BAsYcqdw2.js → nav-CXEDcRdv2.js} +0 -0
  490. /package/client/dist/assets/{nav-BRrNlZkr.js → nav-EI_OhEAo.js} +0 -0
  491. /package/client/dist/assets/{objective-c-B6KMtI-k.js → objective-c-DZY9Aqxd.js} +0 -0
  492. /package/client/dist/assets/{pascal-DYr8MPE7.js → pascal-BVHLXoor.js} +0 -0
  493. /package/client/dist/assets/{pascaligo-B3pd-jJ_.js → pascaligo-XdG_6u3k.js} +0 -0
  494. /package/client/dist/assets/{perl-z2xUzoaL.js → perl-b9QV0BcD.js} +0 -0
  495. /package/client/dist/assets/{pgsql-DUvT-09-.js → pgsql-Du5FDOgT.js} +0 -0
  496. /package/client/dist/assets/{php-CGyOmJfy.js → php-WJD0z2Z_.js} +0 -0
  497. /package/client/dist/assets/{pla-CMqgvyD0.js → pla-CbciTf2w.js} +0 -0
  498. /package/client/dist/assets/{postiats-Dx5LUn4Z.js → postiats-C1QxmvVq.js} +0 -0
  499. /package/client/dist/assets/{powerquery-DazYxvJ6.js → powerquery-BEYDhPLZ.js} +0 -0
  500. /package/client/dist/assets/{powershell-B3nwlDka.js → powershell-CfaYw4XL.js} +0 -0
  501. /package/client/dist/assets/{protobuf-BGuu2u2s.js → protobuf-pwZEDOYa.js} +0 -0
  502. /package/client/dist/assets/{pug-Dbte1MXA.js → pug-5ftqSPVe.js} +0 -0
  503. /package/client/dist/assets/{qsharp-DJLwBOvG.js → qsharp-uI6qZMq4.js} +0 -0
  504. /package/client/dist/assets/{r-DmGBRSHj.js → r-BK54P1EG.js} +0 -0
  505. /package/client/dist/assets/{redis-VvUYn0a4.js → redis-DI0yd7kN.js} +0 -0
  506. /package/client/dist/assets/{redshift-6GdDrxg3.js → redshift-Dov26eyI.js} +0 -0
  507. /package/client/dist/assets/{restructuredtext-CfAB8aRU.js → restructuredtext-QqJ_1dC-.js} +0 -0
  508. /package/client/dist/assets/{ruby-CIYK6MXY.js → ruby-5WjveeVb.js} +0 -0
  509. /package/client/dist/assets/{rust-CTHZfjj9.js → rust-BzVSfqFH.js} +0 -0
  510. /package/client/dist/assets/{sb-CkKTdkz_.js → sb-DMIUfT-3.js} +0 -0
  511. /package/client/dist/assets/{scala-Bx-Wr9TM.js → scala-CSKA7lqt.js} +0 -0
  512. /package/client/dist/assets/{scheme-Dcfi6f83.js → scheme-CojOP2Qc.js} +0 -0
  513. /package/client/dist/assets/{scss-ByL-7PFQ.js → scss-DoBZGJG6.js} +0 -0
  514. /package/client/dist/assets/{shell-Csnb9Yqd.js → shell-YOaE4udl.js} +0 -0
  515. /package/client/dist/assets/{solidity-Dbw5-0QP.js → solidity-l3jSyVLu.js} +0 -0
  516. /package/client/dist/assets/{sophia-ZQ3saZQx.js → sophia-BhSGTaQJ.js} +0 -0
  517. /package/client/dist/assets/{sparql-BEtOel8u.js → sparql-qhk6QD9w.js} +0 -0
  518. /package/client/dist/assets/{sql-DGPDbzB7.js → sql-DoO3y21-.js} +0 -0
  519. /package/client/dist/assets/{st-GeW2MOgh.js → st-ChZAY8oG.js} +0 -0
  520. /package/client/dist/assets/{swift-BVYTN8jq.js → swift-D290Tr7_.js} +0 -0
  521. /package/client/dist/assets/{systemverilog-Deg2a8Lr.js → systemverilog-DsxzgJ-o.js} +0 -0
  522. /package/client/dist/assets/{tcl-6DnLmROF.js → tcl-BKDUHAAR.js} +0 -0
  523. /package/client/dist/assets/{terminal-CDiOAmBd2.js → terminal-BRm03iFA2.js} +0 -0
  524. /package/client/dist/assets/{terminal-CJN-mQMc.js → terminal-De2Brd23.js} +0 -0
  525. /package/client/dist/assets/{terminal-CYB4TiAd.js → terminal-DxQWCqSD2.js} +0 -0
  526. /package/client/dist/assets/{terminal-DsaDTq5N2.js → terminal-WSAvHXoU.js} +0 -0
  527. /package/client/dist/assets/{terminal-DTQ_dPqi2.js → terminal-Z7KsDM_n.js} +0 -0
  528. /package/client/dist/assets/{terminal-58ReNaya.js → terminal-cqfd3EDV.js} +0 -0
  529. /package/client/dist/assets/{terminal-DawP8xNL.js → terminal-xGbCZJHg.js} +0 -0
  530. /package/client/dist/assets/{tickets-DoRTUYRT.js → tickets-B7zT4IRf.js} +0 -0
  531. /package/client/dist/assets/{tickets-DBfFePwk2.js → tickets-BoXom7l8.js} +0 -0
  532. /package/client/dist/assets/{tickets-DvohTziT2.js → tickets-C3b8cHhd2.js} +0 -0
  533. /package/client/dist/assets/{tickets-Da15iaRw.js → tickets-CFXnJsYF.js} +0 -0
  534. /package/client/dist/assets/{tickets-CujsZvkf.js → tickets-CWYFvx1W2.js} +0 -0
  535. /package/client/dist/assets/{tickets-Df6pee-O2.js → tickets-DTHo9c3C.js} +0 -0
  536. /package/client/dist/assets/{tickets-CNvIilmP.js → tickets-SuX_HkK4.js} +0 -0
  537. /package/client/dist/assets/{twig-XbbXW9Yz.js → twig-UpZQaM8G.js} +0 -0
  538. /package/client/dist/assets/{typespec-CRlV8GhI.js → typespec-DzaKvN8i.js} +0 -0
  539. /package/client/dist/assets/{vb-BHE2izPH.js → vb-CZpbb7tk.js} +0 -0
  540. /package/client/dist/assets/{wgsl-Bf5vkfmY.js → wgsl-CNt3OIvl.js} +0 -0
@@ -0,0 +1,519 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PR_DECISION_ACTIONS = void 0;
37
+ exports.isPrDecisionAction = isPrDecisionAction;
38
+ exports.executePrDecision = executePrDecision;
39
+ /**
40
+ * Execute a user's ask-first PR decision (safe-pr-review-flow) against its
41
+ * authoritative `rail_pr_deliveries` row: the FOUR actions both decision
42
+ * surfaces (the dashboard rail row and the launching agent-chat card) POST to
43
+ * `/rails/pr-decision`.
44
+ *
45
+ * create-pr → deferred deliverRailAsPr, reconstructed from the row's durable
46
+ * columns (nothing survives in memory after build-settle). The
47
+ * PR title/body are composed HERE (canonical OSS style — see
48
+ * pr-naming/pr-body) from the ticket store + jira_links + the
49
+ * branch diffs, all failure-tolerant.
50
+ * publish → `gh pr ready` opens the draft for team review.
51
+ * discard → close the PR, sweep the launch's worktrees + branches, revert
52
+ * the on_review tickets to todo.
53
+ * poll-merge → `gh pr view` — MERGED promotes the tickets to done.
54
+ *
55
+ * Every mutation rides the compare-and-set `transitionDecision` (a raced
56
+ * concurrent decision loses with a 409) and re-broadcasts the durable
57
+ * `rail.pr_state` snapshot so both surfaces converge; agent-chat-originated
58
+ * rows also update their inline decision card in place. Deps are injected
59
+ * (db/git/exec/broadcast/jira/agent-chat) so the whole matrix is unit-testable
60
+ * without git/gh/net — the route in rails-router validates and delegates here.
61
+ */
62
+ const path = __importStar(require("path"));
63
+ const artifact_registry_1 = require("./artifact-registry");
64
+ const worktree_manager_1 = require("./worktree-manager");
65
+ const rail_pr_delivery_1 = require("./rail-pr-delivery");
66
+ const pr_naming_1 = require("./pr-naming");
67
+ const pr_body_1 = require("./pr-body");
68
+ const jira_db_1 = require("./jira/jira-db");
69
+ const rail_pr_store_1 = require("./rail-pr-store");
70
+ const rail_worktrees_store_1 = require("./rail-worktrees-store");
71
+ const ticket_store_1 = require("./ticket-store");
72
+ const workspace_resolution_1 = require("./workspace-resolution");
73
+ const agent_chat_registry_1 = require("./agent-chat-registry");
74
+ exports.PR_DECISION_ACTIONS = ['create-pr', 'publish', 'discard', 'poll-merge'];
75
+ function isPrDecisionAction(v) {
76
+ return typeof v === 'string' && exports.PR_DECISION_ACTIONS.includes(v);
77
+ }
78
+ function staleDecision(current) {
79
+ return { status: 409, body: { error: 'stale_decision', current } };
80
+ }
81
+ function illegalAction(current) {
82
+ return { status: 409, body: { error: 'stale_decision', current, reason: 'illegal_action' } };
83
+ }
84
+ function ghFailed(r) {
85
+ const detail = (r.stderr.trim() || r.stdout.trim()).split('\n')[0] || `exit ${r.code}`;
86
+ return { status: 502, body: { error: 'gh_failed', detail } };
87
+ }
88
+ /**
89
+ * The D3 state machine's action legality. `create-pr` is also the RETRY path:
90
+ * from a retryable pr_failed, or from a pr_draft whose delivery degraded before
91
+ * a PR existed (pushed/local-only → pr_url null). Publish/poll require a real
92
+ * PR URL — a degraded draft only offers retry or discard.
93
+ */
94
+ function actionAllowed(action, row) {
95
+ switch (action) {
96
+ case 'create-pr':
97
+ return row.decision === 'on_review' || row.decision === 'pr_failed' ||
98
+ (row.decision === 'pr_draft' && row.pr_url === null);
99
+ case 'publish':
100
+ return row.decision === 'pr_draft' && row.pr_url !== null;
101
+ case 'discard':
102
+ return row.decision === 'on_review' || row.decision === 'pr_draft' ||
103
+ row.decision === 'pr_ready' || row.decision === 'pr_failed';
104
+ case 'poll-merge':
105
+ return (row.decision === 'pr_draft' || row.decision === 'pr_ready') && row.pr_url !== null;
106
+ }
107
+ }
108
+ async function executePrDecision(deps, input) {
109
+ const row = (0, rail_pr_store_1.getPrDelivery)(deps.db, input.prDeliveryId);
110
+ if (!row)
111
+ return { status: 404, body: { error: 'Unknown prDeliveryId' } };
112
+ // Compare-and-set pre-check: the caller decided against a snapshot — if the
113
+ // row moved on (the other surface answered first), it must reconcile, not act.
114
+ if (row.decision !== input.expectedDecision)
115
+ return staleDecision(row.decision);
116
+ if (!actionAllowed(input.action, row))
117
+ return illegalAction(row.decision);
118
+ switch (input.action) {
119
+ case 'create-pr': return runCreatePr(deps, row);
120
+ case 'publish': return runPublish(deps, row);
121
+ case 'discard': return runDiscard(deps, row);
122
+ case 'poll-merge': return runPollMerge(deps, row);
123
+ }
124
+ }
125
+ /**
126
+ * Atomic CAS transition; a `false` return means a concurrent mutation raced us
127
+ * between the pre-check and here — surface the same 409 with the fresh state.
128
+ */
129
+ function casTransition(deps, row, next, patch = {}) {
130
+ if ((0, rail_pr_store_1.transitionDecision)(deps.db, row.id, row.decision, next, patch))
131
+ return null;
132
+ const current = (0, rail_pr_store_1.getPrDelivery)(deps.db, row.id);
133
+ return staleDecision(current?.decision ?? row.decision);
134
+ }
135
+ /**
136
+ * Post-transition fan-out: re-broadcast the durable rail.pr_state snapshot
137
+ * (both surfaces converge on it) and, for agent-chat-originated launches,
138
+ * update the persisted inline card in place.
139
+ */
140
+ function finalizeTransition(deps, id) {
141
+ const row = (0, rail_pr_store_1.getPrDelivery)(deps.db, id);
142
+ if (!row)
143
+ return undefined;
144
+ const snap = (0, rail_pr_store_1.toPrDeliverySnapshot)(row);
145
+ deps.broadcast((0, rail_pr_store_1.toRailPrStateMessage)(deps.project.id, snap));
146
+ if (row.origin_conversation_id) {
147
+ const agent = (deps.agentChat ?? agent_chat_registry_1.getAgentChatManager)();
148
+ // Shared mapper (rail-pr-store.toPrDecisionCardEnvelope) — the SAME shape
149
+ // rail-isolated-launch's origin-card sync posts, so the two card-writing
150
+ // sites (incl. the runIds chip data) can never drift.
151
+ agent?.updatePrDecisionCard(row.origin_conversation_id, (0, rail_pr_store_1.toPrDecisionCardEnvelope)(deps.project.id, snap));
152
+ }
153
+ return snap;
154
+ }
155
+ function parsePrNumber(prUrl) {
156
+ const m = /\/pull\/(\d+)/.exec(prUrl);
157
+ return m ? parseInt(m[1], 10) : null;
158
+ }
159
+ function batchWorktreeRoot(slug) {
160
+ // Mirrors rail-isolated-launch's worktreesRoot — derivable, never stored.
161
+ return path.join((0, artifact_registry_1.resolveHome)(), '.specrails', 'projects', slug, 'worktrees');
162
+ }
163
+ /**
164
+ * Load the PR's ticket data (title/labels/description) from the ticket store,
165
+ * with the Jira key resolved PER TICKET: the authoritative `jira_links` row
166
+ * prevails over the ticket's `jira_key` field (JIRA ALWAYS PREVAILS), no HTTP.
167
+ * Tolerant of a missing/corrupt store or link table — degrades to bare local
168
+ * ids, never throws, never blocks PR creation.
169
+ */
170
+ function loadPrTicketData(deps, ticketIds) {
171
+ let tickets = {};
172
+ try {
173
+ tickets = (0, ticket_store_1.readStore)(resolveTicketFile(deps)).tickets;
174
+ }
175
+ catch {
176
+ /* tolerated — the PR falls back to bare ticket refs */
177
+ }
178
+ return ticketIds.map((id) => {
179
+ const t = tickets[String(id)];
180
+ let jiraKey = t?.jira_key ?? null;
181
+ try {
182
+ const link = (0, jira_db_1.getLinkByLocalId)(deps.db, id);
183
+ if (link && !link.tombstoned && link.jiraKey)
184
+ jiraKey = link.jiraKey;
185
+ }
186
+ catch {
187
+ /* tolerated — fall back to the ticket field */
188
+ }
189
+ return {
190
+ ticketId: id,
191
+ title: t?.title ?? null,
192
+ labels: t?.labels ?? null,
193
+ description: t?.description ?? null,
194
+ jiraKey,
195
+ };
196
+ });
197
+ }
198
+ /** True when the branch exists as a local ref in the base repo. */
199
+ async function branchExists(deps, branch) {
200
+ const r = await deps.git.run(['rev-parse', '--verify', '--quiet', `refs/heads/${branch}`], deps.project.path);
201
+ return r.code === 0;
202
+ }
203
+ /**
204
+ * Recovery for a recorded unit branch that no longer exists (the wedged
205
+ * local-only retry: the settled record drifted from the branch that really
206
+ * carries the commits, or the branch was deleted externally). Scan the ticket's
207
+ * rail_worktrees ledger (newest first) for ANY other branch a rail allocated
208
+ * for the same ticket that still exists AND has commits ahead of the base —
209
+ * that branch is the real carrier of the work. Null when nothing recoverable.
210
+ */
211
+ async function findRecoverableBranch(deps, unit, baseBranch) {
212
+ let candidates = [];
213
+ try {
214
+ candidates = (0, rail_worktrees_store_1.listRailWorktreesForTicket)(deps.db, unit.ticketId);
215
+ }
216
+ catch {
217
+ return null;
218
+ }
219
+ for (const wt of candidates) {
220
+ if (!wt.branch || wt.branch === unit.branch || wt.branch === baseBranch)
221
+ continue;
222
+ if (!(await branchExists(deps, wt.branch)))
223
+ continue;
224
+ const ahead = await deps.git.run(['rev-list', '--count', `${baseBranch}..${wt.branch}`], deps.project.path);
225
+ const n = ahead.code === 0 ? parseInt(ahead.stdout.trim(), 10) : NaN;
226
+ if (Number.isFinite(n) && n > 0)
227
+ return wt.branch;
228
+ }
229
+ return null;
230
+ }
231
+ async function runCreatePr(deps, row) {
232
+ const snap = (0, rail_pr_store_1.toPrDeliverySnapshot)(row);
233
+ // Pre-flight: every succeeded unit branch must actually exist before we push
234
+ // it — a missing ref can only degrade to local-only again, so a retry on a
235
+ // wedged row would loop forever. When a recorded branch is gone, recover the
236
+ // REAL branch from the ticket's worktree ledger (see findRecoverableBranch)
237
+ // and persist the substitution on the row; unrecoverable → honest pr_failed.
238
+ let effectiveBranches = snap.branches;
239
+ let branchesRecovered = false;
240
+ for (const unit of snap.branches) {
241
+ if (!unit.succeeded)
242
+ continue;
243
+ if (await branchExists(deps, unit.branch))
244
+ continue;
245
+ const real = await findRecoverableBranch(deps, unit, row.base_branch);
246
+ if (!real) {
247
+ const detail = `branch '${unit.branch}' (ticket #${unit.ticketId}) no longer exists locally and no other rail branch for the ticket holds commits — nothing to deliver`;
248
+ const conflict = casTransition(deps, row, 'pr_failed');
249
+ if (conflict)
250
+ return conflict;
251
+ finalizeTransition(deps, row.id);
252
+ return { status: 200, body: { ok: true, decision: 'pr_failed', detail } };
253
+ }
254
+ console.warn(`[rail-pr-decision] recorded branch '${unit.branch}' missing — recovered '${real}' from the ticket ${unit.ticketId} worktree ledger`);
255
+ effectiveBranches = effectiveBranches.map((b) => (b === unit ? { ...b, branch: real } : b));
256
+ branchesRecovered = true;
257
+ }
258
+ // Succeeded COVERED tickets for the PR title/body: a single unit covers every
259
+ // launch ticket (scope='all'), per-ticket units cover exactly their own.
260
+ const succeededUnits = effectiveBranches.filter((b) => b.succeeded);
261
+ const succeededTicketIds = effectiveBranches.length === 1 && succeededUnits.length === 1
262
+ ? snap.ticketIds
263
+ : succeededUnits.map((b) => b.ticketId);
264
+ const ticketData = loadPrTicketData(deps, succeededTicketIds);
265
+ // The batch name is derived ONLY for multi-unit deliveries — the single-ticket
266
+ // path delivers straight from its unit branch and must never even compute one.
267
+ const batchPreferred = succeededUnits.length > 1 ? (0, pr_naming_1.batchBranchNameFor)(ticketData) : null;
268
+ // Retry hazard: deliverRailAsPr assembles with `worktree add -b` (no -B) and a
269
+ // prior degraded delivery KEEPS the batch branch — so a retry would die on
270
+ // "branch already exists". Defensively drop the stale batch branch first
271
+ // (batch deliveries only). HARD GUARDS: NEVER a branch present in the row's
272
+ // unit records (deleting one would destroy the commits about to be delivered)
273
+ // and NEVER the integration branch; a missing branch is tolerated.
274
+ const unitBranches = new Set(effectiveBranches.map((b) => b.branch));
275
+ if (batchPreferred && batchPreferred !== row.base_branch && !unitBranches.has(batchPreferred)) {
276
+ await deps.git.run(['branch', '-D', batchPreferred], deps.project.path).catch(() => { });
277
+ }
278
+ // Per-ticket covering branch for the body's honest Tests digest: per-ticket
279
+ // units map 1:1; a single 'all'-scope unit covers every launch ticket.
280
+ const branchFor = (ticketId) => {
281
+ const unit = succeededUnits.find((b) => b.ticketId === ticketId);
282
+ if (unit)
283
+ return unit.branch;
284
+ return succeededUnits.length === 1 ? succeededUnits[0].branch : null;
285
+ };
286
+ // Diffstats are best-effort: a git failure degrades the body (section
287
+ // omitted / "diff unavailable" note), never blocks the PR.
288
+ let changes = null;
289
+ try {
290
+ changes = await (0, pr_body_1.collectBranchChanges)(deps.git, deps.project.path, row.base_branch, succeededUnits.map((b) => b.branch));
291
+ }
292
+ catch {
293
+ changes = null;
294
+ }
295
+ const title = (0, pr_naming_1.buildPrTitle)(ticketData, { loopName: row.loop_name });
296
+ const body = (0, pr_body_1.buildCanonicalPrBody)({
297
+ loopName: row.loop_name,
298
+ baseBranch: row.base_branch,
299
+ tickets: ticketData.map((t) => ({ ...t, branch: branchFor(t.ticketId) })),
300
+ changes,
301
+ });
302
+ let next;
303
+ // Underlying git/gh failure detail for a degraded or failed delivery —
304
+ // relayed on the response body so the decision surfaces can say WHY instead
305
+ // of a bare "retry". Never persisted (the durable columns stay state-only).
306
+ let detail = null;
307
+ const patch = {};
308
+ // Persist any pre-flight substitution so the row records the branch that
309
+ // actually carries the commits — the next retry/discard works from reality.
310
+ if (branchesRecovered)
311
+ patch.branches = effectiveBranches;
312
+ try {
313
+ const result = await (0, rail_pr_delivery_1.deliverRailAsPr)(deps.git, deps.exec, {
314
+ baseRepo: deps.project.path,
315
+ integrationBranch: row.base_branch,
316
+ railKey: row.rail_key,
317
+ batchBranch: batchPreferred ?? undefined,
318
+ batchWorktreeRoot: batchWorktreeRoot(deps.project.slug),
319
+ branches: effectiveBranches,
320
+ title,
321
+ body,
322
+ });
323
+ if (result.state === 'delivered') {
324
+ next = 'pr_draft';
325
+ patch.branch = result.branch;
326
+ patch.prState = result.pr.state;
327
+ if (result.pr.state === 'pr-created' && result.pr.prUrl) {
328
+ patch.prUrl = result.pr.prUrl;
329
+ patch.prNumber = parsePrNumber(result.pr.prUrl);
330
+ }
331
+ else {
332
+ // Degraded (pushed / local-only): no PR exists — only retry or discard.
333
+ patch.prUrl = null;
334
+ patch.prNumber = null;
335
+ detail = result.pr.reason ?? null;
336
+ }
337
+ }
338
+ else {
339
+ // 'assembly-failed' (or an unexpected 'no-op' — settle guarantees ≥1
340
+ // succeeded unit, but a wedged row must not 500) → retryable failure.
341
+ next = 'pr_failed';
342
+ detail = result.reason;
343
+ }
344
+ }
345
+ catch (err) {
346
+ // publishDraftPr can propagate GitGuardrailError — a guardrail violation is
347
+ // a retryable delivery failure, never a crash.
348
+ console.error('[rail-pr-decision] create-pr delivery failed:', err);
349
+ next = 'pr_failed';
350
+ detail = err instanceof Error ? err.message : String(err);
351
+ }
352
+ const conflict = casTransition(deps, row, next, patch);
353
+ if (conflict)
354
+ return conflict;
355
+ const after = finalizeTransition(deps, row.id);
356
+ // Tickets stay on_review — a draft PR is still awaiting the engineer's merge.
357
+ return {
358
+ status: 200,
359
+ body: {
360
+ ok: true,
361
+ decision: next,
362
+ prUrl: after?.prUrl ?? null,
363
+ prState: after?.prState ?? row.pr_state,
364
+ ...(detail ? { detail } : {}),
365
+ },
366
+ };
367
+ }
368
+ async function runPublish(deps, row) {
369
+ const r = await deps.exec.run('gh', ['pr', 'ready', row.pr_url], deps.project.path);
370
+ if (r.code !== 0)
371
+ return ghFailed(r); // no transition — the draft is still a draft
372
+ const conflict = casTransition(deps, row, 'pr_ready');
373
+ if (conflict)
374
+ return conflict;
375
+ finalizeTransition(deps, row.id);
376
+ return { status: 200, body: { ok: true, decision: 'pr_ready', prUrl: row.pr_url } };
377
+ }
378
+ async function runDiscard(deps, row) {
379
+ const snap = (0, rail_pr_store_1.toPrDeliverySnapshot)(row);
380
+ // 1. Close the PR (drops its head branch) when one exists. Best-effort — a
381
+ // gh failure must never leave the discard half-done.
382
+ if (row.pr_url) {
383
+ try {
384
+ const r = await deps.exec.run('gh', ['pr', 'close', row.pr_url, '--delete-branch'], deps.project.path);
385
+ if (r.code !== 0) {
386
+ console.warn(`[rail-pr-decision] gh pr close failed (continuing discard): ${(r.stderr.trim() || r.stdout.trim()).split('\n')[0]}`);
387
+ }
388
+ }
389
+ catch (err) {
390
+ console.warn('[rail-pr-decision] gh pr close threw (continuing discard):', err);
391
+ }
392
+ }
393
+ // 2. Remove the launch's worktrees (still on disk unless a restart already
394
+ // swept them) and close their ledger rows — the reconcile-style removal,
395
+ // branch deletion deferred to step 3 (a checked-out branch can't be -D'd).
396
+ const branchSet = new Set(snap.branches.map((b) => b.branch));
397
+ for (const wtId of snap.worktreeIds) {
398
+ const wt = (0, rail_worktrees_store_1.getRailWorktree)(deps.db, wtId);
399
+ if (!wt)
400
+ continue;
401
+ branchSet.add(wt.branch);
402
+ await (0, worktree_manager_1.removeWorktree)(deps.git, {
403
+ repoDir: deps.project.path, worktreePath: wt.worktree_path, branch: wt.branch, deleteBranch: false,
404
+ }).catch(() => { });
405
+ if (!(0, rail_worktrees_store_1.isTerminalMergeState)(wt.merge_state))
406
+ (0, rail_worktrees_store_1.updateRailWorktreeState)(deps.db, wt.id, 'failed');
407
+ }
408
+ // 3. Delete every branch the delivery references: per-unit source branches,
409
+ // the assembled head and the (possibly stale) batch branch — recomputed
410
+ // best-effort from the same ticket data the create-pr path names it from
411
+ // (the delivered head is already covered by row.branch). Missing branches
412
+ // are tolerated; the integration branch is NEVER deleted.
413
+ if (row.branch)
414
+ branchSet.add(row.branch);
415
+ const succeededUnits = snap.branches.filter((b) => b.succeeded);
416
+ if (succeededUnits.length > 1) {
417
+ try {
418
+ branchSet.add((0, pr_naming_1.batchBranchNameFor)(loadPrTicketData(deps, succeededUnits.map((b) => b.ticketId))));
419
+ }
420
+ catch {
421
+ /* best-effort defense-in-depth only */
422
+ }
423
+ }
424
+ for (const branch of branchSet) {
425
+ if (!branch || branch === row.base_branch)
426
+ continue;
427
+ await deps.git.run(['branch', '-D', branch], deps.project.path).catch(() => { });
428
+ }
429
+ const conflict = casTransition(deps, row, 'discarded');
430
+ if (conflict)
431
+ return conflict;
432
+ finalizeTransition(deps, row.id);
433
+ // 4. Revert the parked tickets to the backlog + mirror to Jira (outbox-only;
434
+ // the local write above is ours).
435
+ const changed = applyTicketTransition(deps, snap.ticketIds, 'todo');
436
+ try {
437
+ deps.jiraSyncManager?.onRailDiscard(changed, row.id);
438
+ }
439
+ catch (err) {
440
+ console.error('[rail-pr-decision] jira onRailDiscard failed:', err);
441
+ }
442
+ return { status: 200, body: { ok: true, decision: 'discarded' } };
443
+ }
444
+ async function runPollMerge(deps, row) {
445
+ const r = await deps.exec.run('gh', ['pr', 'view', row.pr_url, '--json', 'state,mergedAt'], deps.project.path);
446
+ if (r.code !== 0)
447
+ return ghFailed(r); // no transition
448
+ let state;
449
+ try {
450
+ state = JSON.parse(r.stdout).state;
451
+ }
452
+ catch {
453
+ return { status: 502, body: { error: 'gh_failed', detail: 'unparseable gh pr view output' } };
454
+ }
455
+ if (state !== 'MERGED') {
456
+ // Not merged (OPEN/CLOSED/unknown) → observation only, nothing changes.
457
+ return { status: 200, body: { ok: true, decision: row.decision, merged: false } };
458
+ }
459
+ const conflict = casTransition(deps, row, 'merged');
460
+ if (conflict)
461
+ return conflict;
462
+ finalizeTransition(deps, row.id);
463
+ const snap = (0, rail_pr_store_1.toPrDeliverySnapshot)(row);
464
+ const changed = applyTicketTransition(deps, snap.ticketIds, 'done');
465
+ try {
466
+ deps.jiraSyncManager?.onRailMerged(changed, row.id, row.pr_url);
467
+ }
468
+ catch (err) {
469
+ console.error('[rail-pr-decision] jira onRailMerged failed:', err);
470
+ }
471
+ return { status: 200, body: { ok: true, decision: 'merged', merged: true, prUrl: row.pr_url } };
472
+ }
473
+ function resolveTicketFile(deps) {
474
+ if (deps.ticketFile)
475
+ return deps.ticketFile;
476
+ const exec = (0, workspace_resolution_1.resolveProjectExecution)({ slug: deps.project.slug, path: deps.project.path });
477
+ return exec.relocated ? exec.ticketsPath : (0, ticket_store_1.resolveTicketStoragePath)(deps.project.path);
478
+ }
479
+ /**
480
+ * Move the launch's on_review tickets to `todo` (discard) or `done` (merged),
481
+ * broadcasting ticket_updated per changed spec — mirroring onLoopRunFinished's
482
+ * revert style in project-registry. ONLY tickets still parked at on_review move
483
+ * (a manually re-triaged spec is respected). Best-effort: a ticket-store
484
+ * failure is logged, never fatal (the decision row already transitioned).
485
+ */
486
+ function applyTicketTransition(deps, ticketIds, to) {
487
+ const changed = [];
488
+ if (ticketIds.length === 0)
489
+ return changed;
490
+ try {
491
+ const ticketFile = resolveTicketFile(deps);
492
+ const now = new Date().toISOString();
493
+ const store = (0, ticket_store_1.mutateStore)(ticketFile, (s) => {
494
+ for (const tid of ticketIds) {
495
+ const ticket = s.tickets[String(tid)];
496
+ if (!ticket || ticket.status !== 'on_review')
497
+ continue;
498
+ ticket.status = to;
499
+ ticket.updated_at = now;
500
+ changed.push(tid);
501
+ }
502
+ });
503
+ for (const tid of changed) {
504
+ const ticket = store.tickets[String(tid)];
505
+ if (!ticket)
506
+ continue;
507
+ deps.broadcast({
508
+ type: 'ticket_updated',
509
+ ticket: ticket,
510
+ projectId: deps.project.id,
511
+ timestamp: ticket.updated_at,
512
+ });
513
+ }
514
+ }
515
+ catch (err) {
516
+ console.error('[rail-pr-decision] failed to apply ticket transition:', err);
517
+ }
518
+ return changed;
519
+ }
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deliverRailAsPr = deliverRailAsPr;
4
+ const worktree_manager_1 = require("./worktree-manager");
5
+ const pr_naming_1 = require("./pr-naming");
6
+ const pr_publisher_1 = require("./pr-publisher");
7
+ async function deliverRailAsPr(git, exec, input) {
8
+ const succeeded = input.branches.filter((b) => b.succeeded);
9
+ if (succeeded.length === 0)
10
+ return { state: 'no-op', reason: 'no-succeeded-branches' };
11
+ // Single ticket → PR straight from its branch; no batch assembly needed.
12
+ if (succeeded.length === 1) {
13
+ const b = succeeded[0];
14
+ const pr = await (0, pr_publisher_1.publishDraftPr)(exec, {
15
+ repoDir: input.baseRepo,
16
+ branch: b.branch,
17
+ baseBranch: input.integrationBranch,
18
+ title: input.title,
19
+ body: input.body,
20
+ });
21
+ return { state: 'delivered', branch: b.branch, pr, ticketIds: [b.ticketId] };
22
+ }
23
+ // Multiple tickets → assemble onto ONE batch branch off the integration base.
24
+ // Bounded collision resolution against the live branch listing; a pre-existing
25
+ // user branch never gets clobbered, the integration branch is never used and —
26
+ // hard guard — the batch head can never land ON a unit branch (its later
27
+ // teardown `branch -D` would then destroy the commits being delivered).
28
+ const ticketIds = succeeded.map((b) => b.ticketId);
29
+ if (!input.batchBranch) {
30
+ // Defensive: callers derive the batch name from the same branch records this
31
+ // function filters, so the counts always agree — but a wedged/foreign caller
32
+ // must fail safely, never assemble onto an empty ref.
33
+ return { state: 'assembly-failed', reason: 'missing-batch-branch', ticketIds };
34
+ }
35
+ const taken = await (0, worktree_manager_1.listLocalBranches)(git, input.baseRepo);
36
+ const batch = (0, pr_naming_1.resolveCollisionFreeName)(input.batchBranch, {
37
+ taken: (name) => taken.has(name),
38
+ reserved: [input.integrationBranch, ...succeeded.map((b) => b.branch)],
39
+ });
40
+ if (!batch) {
41
+ return { state: 'assembly-failed', reason: `batch-branch-collision:${input.batchBranch}`, ticketIds };
42
+ }
43
+ const wt = `${input.batchWorktreeRoot.replace(/\/$/, '')}/batch-${input.railKey}`;
44
+ const add = await git.run(['worktree', 'add', '-b', batch, wt, input.integrationBranch], input.baseRepo);
45
+ if (add.code !== 0) {
46
+ return { state: 'assembly-failed', reason: firstLine(add) || 'worktree-add-failed', ticketIds };
47
+ }
48
+ for (const b of succeeded) {
49
+ const merge = await git.run(['merge', '--no-ff', '--no-edit', b.branch], wt);
50
+ if (merge.code !== 0) {
51
+ // Conflict/failure → abort and tear the batch down cleanly. Ticket branches
52
+ // stay intact for a human. Never leave a half-merged batch.
53
+ await git.run(['merge', '--abort'], wt).catch(() => { });
54
+ await teardownBatch(git, input.baseRepo, wt, batch);
55
+ return { state: 'assembly-failed', reason: `merge-conflict:${b.branch}`, ticketIds };
56
+ }
57
+ }
58
+ const pr = await (0, pr_publisher_1.publishDraftPr)(exec, {
59
+ repoDir: wt,
60
+ branch: batch,
61
+ baseBranch: input.integrationBranch,
62
+ title: input.title,
63
+ body: input.body,
64
+ });
65
+ // Remove the transient worktree but KEEP the batch branch (the PR references it).
66
+ await git.run(['worktree', 'remove', '--force', wt], input.baseRepo).catch(() => { });
67
+ return { state: 'delivered', branch: batch, pr, ticketIds };
68
+ }
69
+ async function teardownBatch(git, baseRepo, wt, batch) {
70
+ await git.run(['worktree', 'remove', '--force', wt], baseRepo).catch(() => { });
71
+ await git.run(['branch', '-D', batch], baseRepo).catch(() => { });
72
+ }
73
+ function firstLine(r) {
74
+ return (r.stderr.trim() || r.stdout.trim()).split('\n')[0];
75
+ }