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
@@ -14,6 +14,7 @@ const ids_1 = require("./ids");
14
14
  const win_spawn_1 = require("./util/win-spawn");
15
15
  const types_1 = require("./types");
16
16
  const command_resolver_1 = require("./command-resolver");
17
+ const rail_isolation_1 = require("./rail-isolation");
17
18
  const cli_prompt_1 = require("./util/cli-prompt");
18
19
  const stream_display_1 = require("./util/stream-display");
19
20
  const hooks_1 = require("./hooks");
@@ -241,6 +242,16 @@ class QueueManager {
241
242
  /** Pending per-job interactive flag keyed by jobId — read at spawn time.
242
243
  * In-memory only (mirrors _jobModelSelection). */
243
244
  _jobInteractiveSelection;
245
+ /** Per-job PR-delivery mode (safe-pr-workflow), captured ONCE at spawn time by
246
+ * the SAME `isRailPrDeliveryEnabled()` read that injects
247
+ * SPECRAILS_GIT_AUTO=false — so a mid-flight env flip can never split one job
248
+ * between the ask-first on_review parking and the legacy done promotion.
249
+ * Restart-durable by construction (like the interactive gate): a queued job
250
+ * that survives a restart recomputes the flag at its own spawn. Consumed at
251
+ * settle (_onJobExit / _settleInteractiveJob) to thread
252
+ * `ticketCompletionStatus` into onJobFinished; cleared on every terminal
253
+ * path. In-memory only. */
254
+ _jobPrDelivery;
244
255
  /** Live interactive job sessions keyed by jobId (the resident persistent-stdin
245
256
  * child + per-turn accounting). Present only while an interactive job runs. */
246
257
  _interactiveSessions;
@@ -290,6 +301,7 @@ class QueueManager {
290
301
  this._snapshotRefs = new Map();
291
302
  this._jobExecution = new Map();
292
303
  this._jobInteractiveSelection = new Map();
304
+ this._jobPrDelivery = new Map();
293
305
  this._interactiveSessions = new Map();
294
306
  this._jobLiveAccounting = new Map();
295
307
  this._forceFailedRowJobs = new Set();
@@ -373,6 +385,7 @@ class QueueManager {
373
385
  this._snapshotRefs.clear();
374
386
  this._jobExecution.clear();
375
387
  this._jobResolvedProvider.clear();
388
+ this._jobPrDelivery.clear();
376
389
  this._jobLiveAccounting.clear();
377
390
  this._openspecShims.clear();
378
391
  // Drop the DB reference last so any in-flight 'close' callback sees null
@@ -540,10 +553,12 @@ class QueueManager {
540
553
  if (resolvedOpts?.model) {
541
554
  this._jobModelSelection.set(id, resolvedOpts.model);
542
555
  }
543
- // Record per-job interactive flag (ultracode + claude only — enforced at
544
- // spawn time against the resolved adapter's persistent-stdin capability).
545
- if (resolvedOpts?.interactive) {
546
- this._jobInteractiveSelection.set(id, true);
556
+ // Record per-job interactive OVERRIDE only when explicitly provided
557
+ // (tri-state — see EnqueueOptions.interactive). Absent ⇒ the spawn-time
558
+ // default decides, so a queued job that survives a restart (map lost)
559
+ // still spawns interactive.
560
+ if (typeof resolvedOpts?.interactive === 'boolean') {
561
+ this._jobInteractiveSelection.set(id, resolvedOpts.interactive);
547
562
  }
548
563
  // Insert at the correct position based on priority (higher priority first, FIFO within same level)
549
564
  const weight = types_1.PRIORITY_WEIGHT[priority];
@@ -689,10 +704,17 @@ class QueueManager {
689
704
  getLogBuffer() {
690
705
  return [...this._logBuffer];
691
706
  }
692
- /** True while an interactive ultracode session is resident for this job. */
707
+ /** True while an interactive session is resident for this job. */
693
708
  isInteractiveJob(jobId) {
694
709
  return this._interactiveSessions.has(jobId);
695
710
  }
711
+ /** Settle mode of the LIVE interactive session for this job ('finalize' for
712
+ * ultracode, 'auto' for everything else), or null when no session is
713
+ * resident (unknown / not interactive / already settled). Feeds the
714
+ * `interactiveSettleMode` field on GET /jobs/:id. */
715
+ getInteractiveSettleMode(jobId) {
716
+ return this._interactiveSessions.get(jobId)?.getSettleMode() ?? null;
717
+ }
696
718
  /** Feed one more user prompt to a running interactive job (queued behind the
697
719
  * active turn). Returns false when the job isn't an active interactive
698
720
  * session (unknown / already finalized / not interactive). */
@@ -1049,6 +1071,7 @@ class QueueManager {
1049
1071
  this._jobProviderSelection.delete(jobId);
1050
1072
  this._jobResolvedProvider.delete(jobId);
1051
1073
  this._jobInteractiveSelection.delete(jobId);
1074
+ this._jobPrDelivery.delete(jobId);
1052
1075
  this._jobLiveAccounting.delete(jobId);
1053
1076
  // A wedged job may have had its openspec shim materialised already (the
1054
1077
  // wedge can land after _startJob's shim setup). Mirror the settle path.
@@ -1170,14 +1193,17 @@ class QueueManager {
1170
1193
  return (0, ticket_store_1.resolveTicketStoragePath)(this._cwd ?? process.cwd());
1171
1194
  }
1172
1195
  /**
1173
- * Spawn an interactive ultracode session. The job row is created with the
1174
- * `interactive` flag set; the resident child runs the first turn (the
1175
- * ultracode prompt) and stays alive for follow-up turns until finalize/crash.
1176
- * No zombie timer is armed (the child idles between turns by design) and
1177
- * `_activeProcess` is left null — the session owns the child; the active SLOT
1178
- * (`_activeJobId`, reserved by _drainQueue) is held until settle.
1196
+ * Spawn an interactive session. The job row is created with the `interactive`
1197
+ * flag set; the resident child runs the first turn (the ultracode prompt, or
1198
+ * the slash command itself — spike-verified to expand over stream-json stdin)
1199
+ * and stays alive for follow-up turns until settle. `_activeProcess` is left
1200
+ * null — the session owns the child; the active SLOT (`_activeJobId`,
1201
+ * reserved by _drainQueue) is held until settle. QueueManager's own zombie
1202
+ * timer is never armed for interactive jobs; 'auto' sessions instead run
1203
+ * their OWN wedge detector on the same inactivity budget, while 'finalize'
1204
+ * sessions idle awaiting the human by design (no timer).
1179
1205
  */
1180
- _startInteractiveJob(jobId, job, adapter, spec, firstPrompt) {
1206
+ _startInteractiveJob(jobId, job, adapter, spec, firstPrompt, settleMode) {
1181
1207
  if (this._db) {
1182
1208
  try {
1183
1209
  (0, db_1.createJob)(this._db, {
@@ -1201,6 +1227,10 @@ class QueueManager {
1201
1227
  adapter,
1202
1228
  broadcast: this._broadcast,
1203
1229
  onSettle: (info) => this._settleInteractiveJob(jobId, info),
1230
+ settleMode,
1231
+ // Auto sessions arm a wedge detector on the SAME inactivity budget the
1232
+ // one-shot path uses; finalize sessions idle awaiting the human.
1233
+ zombieTimeoutMs: settleMode === 'auto' ? this._zombieTimeoutMs : undefined,
1204
1234
  });
1205
1235
  this._interactiveSessions.set(jobId, session);
1206
1236
  session.start(spec, firstPrompt);
@@ -1208,10 +1238,13 @@ class QueueManager {
1208
1238
  }
1209
1239
  /**
1210
1240
  * Terminal bookkeeping for an interactive job (called once by the session's
1211
- * onSettle). Releases the active slot, stamps the job's terminal status +
1212
- * finished_at (token/cost totals were already accumulated per turn), writes a
1213
- * single ai_invocations row with the summed usage, fires the rail/ticket
1214
- * completion callback, and drains the queue.
1241
+ * onSettle — human finalize, auto-quiescence, wedge, or crash). Releases the
1242
+ * active slot, stamps the job's terminal status + finished_at (token/cost
1243
+ * totals were already accumulated per turn), writes a single ai_invocations
1244
+ * row with the summed usage, records Code-Explorer provenance against the
1245
+ * pre-spawn snapshot, enforces cost alerts + daily budgets, fires the
1246
+ * rail/ticket completion callback + dependent/pipeline bookkeeping, and
1247
+ * drains the queue.
1215
1248
  */
1216
1249
  _settleInteractiveJob(jobId, info) {
1217
1250
  this._interactiveSessions.delete(jobId);
@@ -1219,10 +1252,20 @@ class QueueManager {
1219
1252
  this._activeProcess = null;
1220
1253
  this._activeJobId = null;
1221
1254
  }
1222
- // Interactive jobs skip provenance, but a defensive delete keeps the map
1223
- // clean if a snapshot was ever recorded for this id.
1255
+ // Consume the pre-spawn provenance snapshot + the resolved execution
1256
+ // context BEFORE any early return (mirrors _onJobExit) so a disposed/
1257
+ // unknown-job settle can never leak the map entries.
1258
+ const snapshot = this._snapshotRefs.get(jobId);
1224
1259
  this._snapshotRefs.delete(jobId);
1260
+ const jobExecution = this._jobExecution.get(jobId);
1261
+ this._jobExecution.delete(jobId);
1262
+ const provenanceRepoDir = jobExecution?.repoDir ?? this._cwd;
1225
1263
  this._jobResolvedProvider.delete(jobId);
1264
+ // Consume the spawn-captured PR-delivery mode (before any early return so a
1265
+ // disposed/unknown-job settle can never leak the entry). Decides whether a
1266
+ // COMPLETED job's tickets park at on_review (ask-first) or done (legacy).
1267
+ const prDelivery = this._jobPrDelivery.get(jobId) ?? false;
1268
+ this._jobPrDelivery.delete(jobId);
1226
1269
  // Clean up the per-job openspec PATH shim (relocated claude rails only).
1227
1270
  this._cleanupOpenspecShim(jobId);
1228
1271
  if (this._disposed)
@@ -1234,14 +1277,26 @@ class QueueManager {
1234
1277
  }
1235
1278
  const wasCanceling = this._cancelingJobs.has(jobId);
1236
1279
  this._cancelingJobs.delete(jobId);
1280
+ // Zero-work strictness: a session whose WHOLE life consumed no model work
1281
+ // (the claude CLI's synthetic `Unknown command:` result frame — num_turns
1282
+ // 0, no assistant events, zero usage tokens) settles FAILED even on a
1283
+ // clean finalize (either settle mode): the job's command never actually
1284
+ // ran. A multi-turn session where only the LAST turn was synthetic
1285
+ // accumulated real work and still completes (the predicate is
1286
+ // whole-session — see isZeroWorkSettle in interactive-job-session.ts).
1237
1287
  const finalStatus = wasCanceling
1238
1288
  ? 'canceled'
1239
- : info.reason === 'finalized'
1289
+ : info.reason === 'finalized' && !info.zeroWork
1240
1290
  ? 'completed'
1241
1291
  : 'failed';
1242
1292
  job.status = finalStatus;
1243
1293
  job.finishedAt = new Date().toISOString();
1244
- job.exitCode = info.reason === 'finalized' ? 0 : 1;
1294
+ job.exitCode = info.reason === 'finalized' && finalStatus !== 'failed' ? 0 : 1;
1295
+ // Result text for output chaining between dependent pipeline steps — the
1296
+ // same field the one-shot path captures from its last `result` event.
1297
+ if (info.resultText != null) {
1298
+ job.resultText = info.resultText;
1299
+ }
1245
1300
  const totals = info.totals;
1246
1301
  if (this._db) {
1247
1302
  try {
@@ -1287,6 +1342,18 @@ class QueueManager {
1287
1342
  console.error('[queue-manager] recordInvocation (interactive) failed:', err);
1288
1343
  }
1289
1344
  }
1345
+ // Code-Explorer post-settle provenance hook — the interactive lifecycle
1346
+ // equivalent of _onJobExit's post-exit diff (pre-spawn snapshot taken in
1347
+ // _startJob's interactive branch, against the REPO dir, never the
1348
+ // workspace).
1349
+ this._recordProvenance(jobId, job.command, provenanceRepoDir, snapshot);
1350
+ // Cost alerts + daily-budget enforcement. Interactive is the DEFAULT
1351
+ // spawn path for claude jobs now, so its settle must trip the same
1352
+ // thresholds and caps the one-shot exit path does.
1353
+ if (totals.total_cost_usd > 0 && finalStatus === 'completed') {
1354
+ this._emitCostAlerts(jobId, totals.total_cost_usd);
1355
+ }
1356
+ this._enforceDailyBudget();
1290
1357
  }
1291
1358
  this._persistJob(job);
1292
1359
  this._broadcast({
@@ -1300,12 +1367,31 @@ class QueueManager {
1300
1367
  this._broadcastQueueState();
1301
1368
  if (this._onJobFinished) {
1302
1369
  try {
1303
- this._onJobFinished(jobId, finalStatus, totals.total_cost_usd);
1370
+ if (finalStatus === 'completed') {
1371
+ // Thread the spawn-captured PR-delivery mode: under the ask-first
1372
+ // methodology a completed job's tickets park at on_review, never done.
1373
+ // Failure statuses keep the legacy 3-arg call shape (the field is
1374
+ // completion-only).
1375
+ this._onJobFinished(jobId, finalStatus, totals.total_cost_usd, {
1376
+ ticketCompletionStatus: prDelivery ? 'on_review' : 'done',
1377
+ });
1378
+ }
1379
+ else {
1380
+ this._onJobFinished(jobId, finalStatus, totals.total_cost_usd);
1381
+ }
1304
1382
  }
1305
1383
  catch (err) {
1306
1384
  console.error(`[QueueManager] onJobFinished failed for ${jobId}: ${err.message}`);
1307
1385
  }
1308
1386
  }
1387
+ // Dependent-job + pipeline bookkeeping (mirrors _onJobExit) — chained /
1388
+ // template jobs flow through the interactive settle path by default now.
1389
+ if (finalStatus !== 'completed') {
1390
+ this._skipDependents(jobId, `Parent job ${jobId} ${finalStatus}`);
1391
+ }
1392
+ if (job.pipelineId) {
1393
+ this._checkPipelineStatus(job.pipelineId);
1394
+ }
1309
1395
  this._drainQueue();
1310
1396
  }
1311
1397
  async _startJob(jobId) {
@@ -1360,6 +1446,28 @@ class QueueManager {
1360
1446
  (0, hooks_1.resetPhases)(phaseScopeId, this._broadcast);
1361
1447
  }
1362
1448
  const commandToRun = job.command.trim();
1449
+ // ─── Interactive-by-default gate (spawn-time, restart-durable) ──────────
1450
+ // Spike-verified (2026-07-03, claude 2.1.198): the claude CLI expands slash
1451
+ // commands arriving as stream-json stdin user frames exactly like the argv
1452
+ // `-p "/cmd"` path, so EVERY claude job (implement/batch/custom commands,
1453
+ // not just ultracode prose) is prompt-compatible with the persistent-stdin
1454
+ // transport. The default is therefore interactive whenever the kill-switch
1455
+ // is on and the resolved adapter supports persistent stdin (claude only
1456
+ // today); codex/gemini always take the legacy one-shot spawn below.
1457
+ // EnqueueOptions.interactive is a per-job OVERRIDE: false forces legacy,
1458
+ // true forces interactive where capable, undefined = default ON. Derived
1459
+ // HERE (spawn time), not at enqueue, so a queued job that survives a server
1460
+ // restart (selection map lost) still spawns interactive.
1461
+ const isUltracode = adapter.id === 'claude' && exports.ULTRACODE_COMMAND_RE.test(commandToRun);
1462
+ const interactiveOverride = this._jobInteractiveSelection.get(jobId);
1463
+ this._jobInteractiveSelection.delete(jobId);
1464
+ const spawnInteractive = (0, feature_flags_1.isInteractiveJobsEnabled)() &&
1465
+ adapter.capabilities.persistentStdin &&
1466
+ (interactiveOverride ?? true);
1467
+ // Ultracode sessions idle awaiting the human (settle only on explicit
1468
+ // Finalize — the pre-flip behaviour); every other command auto-settles the
1469
+ // moment a turn result lands with nothing queued behind it.
1470
+ const interactiveSettleMode = isUltracode ? 'finalize' : 'auto';
1363
1471
  // Build supplementary context (output chaining + headless mode) that goes
1364
1472
  // into --append-system-prompt, keeping the user prompt clean.
1365
1473
  let systemAppend = '';
@@ -1401,18 +1509,28 @@ class QueueManager {
1401
1509
  systemAppend += `Previous step output:\n\n${truncated}\n\n---\n\nNow execute the following command.\n\n`;
1402
1510
  }
1403
1511
  }
1404
- // Headless mode: when --yes is in the command, instruct Claude to auto-proceed
1405
- // (stdin is ignored in spawned processes, so no user confirmation is possible)
1512
+ // Headless mode: when --yes is in the command, instruct Claude to auto-proceed.
1513
+ // For a LEGACY one-shot spawn stdin is genuinely disconnected; for an
1514
+ // INTERACTIVE session stdin IS connected (a human may inject guidance), so
1515
+ // the wording softens — autonomous by default, steering welcome — without
1516
+ // re-opening approval prompts.
1406
1517
  if (job.command.includes('--yes')) {
1407
- systemAppend += '\n\nCRITICAL — FULLY AUTONOMOUS MODE (--yes flag):\n' +
1408
- 'This pipeline is running headless with NO human operator. stdin is disconnected — nobody can reply.\n' +
1409
- '- NEVER ask for approval, confirmation, review, or feedback. There is nobody to answer.\n' +
1410
- '- NEVER output prompts like "Reply with approved", "Do you want to proceed?", "Please confirm", or "Ready for review".\n' +
1411
- '- NEVER stop between pipeline phases to wait for input. Run ALL phases end-to-end without pausing.\n' +
1412
- '- When there are multiple options or decisions, always choose the RECOMMENDED option and proceed.\n' +
1413
- '- Auto-approve all proposals, designs, and artifacts. Treat everything as "approved" by default.\n' +
1414
- '- Skip any instructions that say "wait for user", "present for review", or "ask the user".\n' +
1415
- '- The pipeline must complete fully from start to finish in a single uninterrupted run.';
1518
+ systemAppend += spawnInteractive
1519
+ ? '\n\nCRITICAL — AUTONOMOUS MODE WITH LIVE GUIDANCE (--yes flag):\n' +
1520
+ 'This pipeline runs autonomously end-to-end, but a human operator MAY inject guidance messages while it runs (stdin IS connected).\n' +
1521
+ '- NEVER stop to ask for approval, confirmation, review, or feedback. When options exist, choose the RECOMMENDED one and proceed.\n' +
1522
+ '- Auto-approve all proposals, designs, and artifacts; skip instructions that say "wait for user" or "present for review".\n' +
1523
+ '- If a human message arrives mid-run, treat it as steering: incorporate the guidance and continue the plan without pausing.\n' +
1524
+ '- Answer direct questions from the human concisely, then resume the remaining work until the plan is complete.'
1525
+ : '\n\nCRITICAL — FULLY AUTONOMOUS MODE (--yes flag):\n' +
1526
+ 'This pipeline is running headless with NO human operator. stdin is disconnected — nobody can reply.\n' +
1527
+ '- NEVER ask for approval, confirmation, review, or feedback. There is nobody to answer.\n' +
1528
+ '- NEVER output prompts like "Reply with approved", "Do you want to proceed?", "Please confirm", or "Ready for review".\n' +
1529
+ '- NEVER stop between pipeline phases to wait for input. Run ALL phases end-to-end without pausing.\n' +
1530
+ '- When there are multiple options or decisions, always choose the RECOMMENDED option and proceed.\n' +
1531
+ '- Auto-approve all proposals, designs, and artifacts. Treat everything as "approved" by default.\n' +
1532
+ '- Skip any instructions that say "wait for user", "present for review", or "ask the user".\n' +
1533
+ '- The pipeline must complete fully from start to finish in a single uninterrupted run.';
1416
1534
  }
1417
1535
  // Local ticket store: implement/batch-implement jobs must read specs from
1418
1536
  // .specrails/local-tickets.json — never from external trackers like Jira/Linear.
@@ -1449,7 +1567,7 @@ class QueueManager {
1449
1567
  // pre-prompt + spec text directly as the prompt. The server route guards
1450
1568
  // that ultracode never reaches a non-claude adapter; defensively, a codex
1451
1569
  // adapter still falls through to its skill-translation path below.
1452
- const isUltracode = adapter.id === 'claude' && exports.ULTRACODE_COMMAND_RE.test(commandToRun);
1570
+ // (`isUltracode` itself is resolved above, before the systemAppend build.)
1453
1571
  const railPrompt = isUltracode
1454
1572
  ? this._buildUltracodePrompt(commandToRun)
1455
1573
  : adapter.id === 'codex'
@@ -1655,24 +1773,54 @@ class QueueManager {
1655
1773
  }
1656
1774
  }
1657
1775
  }
1658
- // ─── Interactive ultracode branch ──────────────────────────────────────
1659
- // When the launch requested interactive mode AND the command is ultracode
1660
- // AND the adapter supports persistent stdin (claude), hand off to a resident
1661
- // session instead of the one-shot spawn below. The session keeps the child
1662
- // alive across turns and settles only on finalize/crash. Code-Explorer
1663
- // provenance is intentionally skipped for interactive jobs (v1 — deferred).
1664
- const wantsInteractive = this._jobInteractiveSelection.get(jobId) === true;
1665
- this._jobInteractiveSelection.delete(jobId);
1666
- if (wantsInteractive && isUltracode && adapter.capabilities.persistentStdin) {
1776
+ // Safe-PR flow: when active (SPECRAILS_RAIL_DELIVER_PR on), desktop owns version
1777
+ // control — tell specrails-core's implement to be git-agnostic (skip its Ship
1778
+ // phase) via SPECRAILS_GIT_AUTO=false so it never opens an uncoordinated PR
1779
+ // alongside the app's own draft-PR delivery. Default ON (flag=0/false/off disables).
1780
+ // The flag is read ONCE per job, HERE (spawn time — mirroring
1781
+ // launchIsolatedRail's prMode capture), and recorded so the settle paths park
1782
+ // this job's tickets under the SAME value that shaped the spawn env: a
1783
+ // completed job promotes its tickets to on_review (ask-first) instead of
1784
+ // done. A mid-flight env flip can never split one job across the two
1785
+ // methodologies.
1786
+ const prDelivery = (0, rail_isolation_1.isRailPrDeliveryEnabled)();
1787
+ this._jobPrDelivery.set(jobId, prDelivery);
1788
+ if (prDelivery) {
1789
+ spawnEnv = { ...spawnEnv, SPECRAILS_GIT_AUTO: 'false' };
1790
+ }
1791
+ // ─── Interactive branch (default for persistent-stdin providers) ───────
1792
+ // Hand off to a resident persistent-stdin session instead of the one-shot
1793
+ // spawn below. Ultracode keeps 'finalize' settle-mode (idles until the
1794
+ // human Finalizes); every other command runs 'auto' (the session settles
1795
+ // itself the moment a turn result lands with nothing queued). Code-Explorer
1796
+ // provenance is captured around the SESSION lifecycle exactly like the
1797
+ // one-shot path: pre-spawn snapshot here, diff at settle.
1798
+ if (spawnInteractive) {
1799
+ if ((0, feature_flags_1.isCodeExplorerEnabled)()) {
1800
+ try {
1801
+ const snap = (0, file_provenance_1.snapshotWorkingTree)(execution.repoDir);
1802
+ this._snapshotRefs.set(jobId, snap);
1803
+ }
1804
+ catch (err) {
1805
+ console.warn(`[queue-manager] provenance snapshot failed: ${err.message}`);
1806
+ }
1807
+ }
1667
1808
  const interactiveArgs = adapter.buildArgs('chat-stream', {
1668
1809
  // chat-stream feeds the prompt over stdin per-turn, so the argv `prompt`
1669
1810
  // is unused — pass empty to satisfy the shared SpawnOptions shape.
1670
1811
  prompt: '',
1671
- systemPrompt: systemAppend || undefined,
1812
+ // Ultracode's prose prompt brings no system prompt of its own, so the
1813
+ // supplementary context rides `--system-prompt` (byte-identical to the
1814
+ // pre-flip interactive-ultracode spawn). A slash-command job's EXPANDED
1815
+ // command brings its own system prompt — mirror the legacy rail-job
1816
+ // spawn and APPEND on top of the CLI default instead of replacing it.
1817
+ systemPrompt: isUltracode ? (systemAppend || undefined) : undefined,
1672
1818
  model: railModel,
1673
- extraArgs: railExtraArgs,
1819
+ extraArgs: !isUltracode && systemAppend
1820
+ ? ['--append-system-prompt', systemAppend, ...(railExtraArgs ?? [])]
1821
+ : railExtraArgs,
1674
1822
  });
1675
- this._startInteractiveJob(jobId, job, adapter, { binary, args: interactiveArgs, cwd: spawnCwd, env: spawnEnv }, railPrompt);
1823
+ this._startInteractiveJob(jobId, job, adapter, { binary, args: interactiveArgs, cwd: spawnCwd, env: spawnEnv }, railPrompt, interactiveSettleMode);
1676
1824
  return;
1677
1825
  }
1678
1826
  // Code-Explorer pre-spawn snapshot. Captures the working-tree state via
@@ -1906,6 +2054,11 @@ class QueueManager {
1906
2054
  // Reclaim the live-accounting handle unconditionally (shutdown flush no longer
1907
2055
  // needs it once the child has exited).
1908
2056
  this._jobLiveAccounting.delete(jobId);
2057
+ // Consume the spawn-captured PR-delivery mode (before any early return so a
2058
+ // disposed/unknown-job exit can never leak the entry). Decides whether a
2059
+ // COMPLETED job's tickets park at on_review (ask-first) or done (legacy).
2060
+ const prDelivery = this._jobPrDelivery.get(jobId) ?? false;
2061
+ this._jobPrDelivery.delete(jobId);
1909
2062
  const provenanceRepoDir = jobExecution?.repoDir ?? this._cwd;
1910
2063
  // Clean up the per-job openspec PATH shim (relocated claude rails only),
1911
2064
  // BEFORE any early return, so a disposed/unknown-job exit can't leak the
@@ -2024,24 +2177,7 @@ class QueueManager {
2024
2177
  // the pre-spawn snapshot and inserts one row per touched path. Gated by
2025
2178
  // SPECRAILS_CODE_EXPLORER (re-checked at each completion so the flag can
2026
2179
  // be flipped off mid-session without leaving partial writes).
2027
- if ((0, feature_flags_1.isCodeExplorerEnabled)() && provenanceRepoDir && this._projectId) {
2028
- const ref = snapshot?.ref ?? '';
2029
- try {
2030
- const diff = (0, file_provenance_1.diffAgainstSnapshot)(provenanceRepoDir, ref, snapshot?.untracked, snapshot?.headSha);
2031
- const patches = (0, file_provenance_1.collectDiffPatches)(provenanceRepoDir, ref, diff, snapshot?.headSha);
2032
- if (diff.length > 50) {
2033
- console.warn(`[provenance.large_job] job=${jobId} files=${diff.length}`);
2034
- }
2035
- const ticketIds = this._extractTicketIds(job.command);
2036
- const rows = (0, file_provenance_1.recordProvenanceForJob)(this._db, this._projectId, jobId, ticketIds[0] ?? null, diff, Date.now(), patches);
2037
- for (const row of rows) {
2038
- (0, file_provenance_1.broadcastProvenanceUpdated)(this._broadcast, this._projectId, row);
2039
- }
2040
- }
2041
- catch (err) {
2042
- console.warn(`[queue-manager] provenance recording failed: ${err.message}`);
2043
- }
2044
- }
2180
+ this._recordProvenance(jobId, job.command, provenanceRepoDir, snapshot);
2045
2181
  // Cost comes from the normalised result so providers without a native
2046
2182
  // total_cost_usd field (codex today) still trigger cost alerts based on
2047
2183
  // the pricing-table estimate. When `estimated`, the figure is best-
@@ -2051,26 +2187,8 @@ class QueueManager {
2051
2187
  const costStr = jobCost != null ? ` | cost: ${estimated ? '~' : ''}$${jobCost.toFixed(4)}` : '';
2052
2188
  emitLine('stdout', `[process exited with code ${code ?? 'unknown'}${costStr}]`);
2053
2189
  // Cost alert: check per-job threshold (app-level, then per-project).
2054
- // These prepared statements touch the DB, which may have been closed
2055
- // mid-job; guard so a throw never escapes the child 'close' listener.
2056
2190
  if (jobCost != null && finalStatus === 'completed') {
2057
- try {
2058
- const desktopThreshold = this._getCostAlertThreshold?.() ?? null;
2059
- if (desktopThreshold != null && jobCost >= desktopThreshold) {
2060
- this._broadcast({ type: 'cost_alert', projectId: '', jobId, cost: jobCost, threshold: desktopThreshold });
2061
- }
2062
- // Per-project job cost threshold (alerts independently of app threshold)
2063
- const projectThresholdRow = this._db.prepare(`SELECT value FROM queue_state WHERE key = 'config.job_cost_threshold_usd'`).get();
2064
- if (projectThresholdRow) {
2065
- const projectThreshold = parseFloat(projectThresholdRow.value);
2066
- if (projectThreshold > 0 && jobCost >= projectThreshold) {
2067
- this._broadcast({ type: 'cost_alert', projectId: '', jobId, cost: jobCost, threshold: projectThreshold });
2068
- }
2069
- }
2070
- }
2071
- catch (err) {
2072
- console.error('[queue-manager] cost-alert bookkeeping failed (db unavailable?):', err);
2073
- }
2191
+ this._emitCostAlerts(jobId, jobCost);
2074
2192
  }
2075
2193
  // ─── Daily-budget enforcement (MED-5) ───────────────────────────────────
2076
2194
  // Runs on EVERY terminal exit, not just completed jobs: a failed/aborted
@@ -2100,7 +2218,18 @@ class QueueManager {
2100
2218
  catch (err) {
2101
2219
  console.error('[queue-manager] cost read for webhook failed (db unavailable?):', err);
2102
2220
  }
2103
- this._onJobFinished(jobId, finalStatus, costUsd ?? undefined);
2221
+ if (finalStatus === 'completed') {
2222
+ // Thread the spawn-captured PR-delivery mode: under the ask-first
2223
+ // methodology a completed job's tickets park at on_review, never done.
2224
+ // Failure statuses keep the legacy 3-arg call shape (the field is
2225
+ // completion-only).
2226
+ this._onJobFinished(jobId, finalStatus, costUsd ?? undefined, {
2227
+ ticketCompletionStatus: prDelivery ? 'on_review' : 'done',
2228
+ });
2229
+ }
2230
+ else {
2231
+ this._onJobFinished(jobId, finalStatus, costUsd ?? undefined);
2232
+ }
2104
2233
  }
2105
2234
  // Handle dependent jobs: skip them if parent did not complete successfully
2106
2235
  if (finalStatus !== 'completed') {
@@ -2113,6 +2242,61 @@ class QueueManager {
2113
2242
  this._broadcastQueueState();
2114
2243
  this._drainQueue();
2115
2244
  }
2245
+ /**
2246
+ * Code-Explorer provenance recording, shared by the one-shot exit path
2247
+ * (_onJobExit) and the interactive settle path (_settleInteractiveJob).
2248
+ * Diffs the REPO working tree against the pre-spawn snapshot and inserts one
2249
+ * `file_provenance` row per touched path, broadcasting each. Gated by
2250
+ * SPECRAILS_CODE_EXPLORER (re-checked at each completion so the flag can be
2251
+ * flipped off mid-session without leaving partial writes). Best-effort.
2252
+ */
2253
+ _recordProvenance(jobId, command, provenanceRepoDir, snapshot) {
2254
+ if (!(0, feature_flags_1.isCodeExplorerEnabled)() || !provenanceRepoDir || !this._projectId || !this._db)
2255
+ return;
2256
+ const ref = snapshot?.ref ?? '';
2257
+ try {
2258
+ const diff = (0, file_provenance_1.diffAgainstSnapshot)(provenanceRepoDir, ref, snapshot?.untracked, snapshot?.headSha);
2259
+ const patches = (0, file_provenance_1.collectDiffPatches)(provenanceRepoDir, ref, diff, snapshot?.headSha);
2260
+ if (diff.length > 50) {
2261
+ console.warn(`[provenance.large_job] job=${jobId} files=${diff.length}`);
2262
+ }
2263
+ const ticketIds = this._extractTicketIds(command);
2264
+ const rows = (0, file_provenance_1.recordProvenanceForJob)(this._db, this._projectId, jobId, ticketIds[0] ?? null, diff, Date.now(), patches);
2265
+ for (const row of rows) {
2266
+ (0, file_provenance_1.broadcastProvenanceUpdated)(this._broadcast, this._projectId, row);
2267
+ }
2268
+ }
2269
+ catch (err) {
2270
+ console.warn(`[queue-manager] provenance recording failed: ${err.message}`);
2271
+ }
2272
+ }
2273
+ /**
2274
+ * Per-job cost alerts (app-level threshold, then per-project threshold),
2275
+ * shared by the one-shot exit path and the interactive settle path. The
2276
+ * prepared statement touches the DB, which may have been closed mid-job;
2277
+ * guarded so a throw never escapes a child 'close'/settle listener.
2278
+ */
2279
+ _emitCostAlerts(jobId, jobCost) {
2280
+ if (!this._db)
2281
+ return;
2282
+ try {
2283
+ const desktopThreshold = this._getCostAlertThreshold?.() ?? null;
2284
+ if (desktopThreshold != null && jobCost >= desktopThreshold) {
2285
+ this._broadcast({ type: 'cost_alert', projectId: '', jobId, cost: jobCost, threshold: desktopThreshold });
2286
+ }
2287
+ // Per-project job cost threshold (alerts independently of app threshold)
2288
+ const projectThresholdRow = this._db.prepare(`SELECT value FROM queue_state WHERE key = 'config.job_cost_threshold_usd'`).get();
2289
+ if (projectThresholdRow) {
2290
+ const projectThreshold = parseFloat(projectThresholdRow.value);
2291
+ if (projectThreshold > 0 && jobCost >= projectThreshold) {
2292
+ this._broadcast({ type: 'cost_alert', projectId: '', jobId, cost: jobCost, threshold: projectThreshold });
2293
+ }
2294
+ }
2295
+ }
2296
+ catch (err) {
2297
+ console.error('[queue-manager] cost-alert bookkeeping failed (db unavailable?):', err);
2298
+ }
2299
+ }
2116
2300
  _resetZombieTimer() {
2117
2301
  if (this._zombieTimeoutMs <= 0)
2118
2302
  return;
@@ -2268,6 +2452,7 @@ class QueueManager {
2268
2452
  this._jobProviderSelection.delete(jobId);
2269
2453
  this._jobResolvedProvider.delete(jobId);
2270
2454
  this._jobInteractiveSelection.delete(jobId);
2455
+ this._jobPrDelivery.delete(jobId);
2271
2456
  this._jobLiveAccounting.delete(jobId);
2272
2457
  this._cleanupOpenspecShim(jobId);
2273
2458
  this._activeProcess = null;