specrails-desktop 2.29.0 → 2.29.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (545) hide show
  1. package/client/dist/assets/ActivityFeedPage-ClpD5CFj.js +1 -0
  2. package/client/dist/assets/AgentBrowserCapture-CSPs9Ofc.js +1 -0
  3. package/client/dist/assets/AgentModeCodePane-DwcyklA5.js +2 -0
  4. package/client/dist/assets/AgentModeJobsPane-C69bqlMa.js +1 -0
  5. package/client/dist/assets/AgentsPage-pRiRr9-W.js +86 -0
  6. package/client/dist/assets/AnalyticsPage-C14exKsC.js +1 -0
  7. package/client/dist/assets/BarChart-nBOMNfiy.js +33 -0
  8. package/client/dist/assets/CodePage-CK76JKm9.js +2 -0
  9. package/client/dist/assets/DesktopAnalyticsPage-Cnv0f3XQ.js +1 -0
  10. package/client/dist/assets/DocsDialog-CHUm_Ym0.js +11 -0
  11. package/client/dist/assets/DocsPage-COI-oDok.js +11 -0
  12. package/client/dist/assets/ExportDropdown-BrtfWzEG.js +1 -0
  13. package/client/dist/assets/IntegrationsPage-Bs00_tl4.js +1 -0
  14. package/client/dist/assets/InteractiveJobComposer-CypM7R1F.js +19 -0
  15. package/client/dist/assets/JobDetailModal-B_W0H9dw.js +1 -0
  16. package/client/dist/assets/JobDetailPage-CeeXOoKS.js +1 -0
  17. package/client/dist/assets/JobsPage-CwhJG9jw.js +1 -0
  18. package/client/dist/assets/LoopBuilderPage-C51t1WOM.js +7 -0
  19. package/client/dist/assets/LoopPreviewModal-Y2HgtIJu.js +1 -0
  20. package/client/dist/assets/LoopsPage-Bvn1Kw5V.js +1 -0
  21. package/client/dist/assets/MinimizedChatsContext-DiFvZDPW.js +1 -0
  22. package/client/dist/assets/PluginsPage-BGPRJpdf.js +2 -0
  23. package/client/dist/assets/ProjectSettingsDialog-D_GTyGLc.js +1 -0
  24. package/client/dist/assets/TemplatePreviewModal-szwBhd7h.js +1 -0
  25. package/client/dist/assets/TicketDetailModal-9UEyK974.js +14 -0
  26. package/client/dist/assets/Trans-B_vKZ-Hb.js +1 -0
  27. package/client/dist/assets/activity-DiyjsgQV.js +1 -0
  28. package/client/dist/assets/addon-image-BRmmRHgQ.js +1 -0
  29. package/client/dist/assets/addon-ligatures-qIZUPvRV.js +2 -0
  30. package/client/dist/assets/{addon-webgl-DMbGeI_u.js → addon-webgl-C2d7lriQ.js} +3 -3
  31. package/client/dist/assets/addspec-Rw8uVBC1.js +1 -0
  32. package/client/dist/assets/agent-4rmXoo_p.js +1 -0
  33. package/client/dist/assets/agent-BxZuNGih.js +1 -0
  34. package/client/dist/assets/agent-C3uXOYv_.js +1 -0
  35. package/client/dist/assets/agent-CA8Y4wbw.js +1 -0
  36. package/client/dist/assets/agent-CASKrhG12.js +1 -0
  37. package/client/dist/assets/agent-Cv-jud5n2.js +1 -0
  38. package/client/dist/assets/agent-DitUxYh2.js +1 -0
  39. package/client/dist/assets/agent-Doow4X7o.js +1 -0
  40. package/client/dist/assets/agents-DhG7mg6-.js +1 -0
  41. package/client/dist/assets/agentstudio-BIUe1Im2.js +1 -0
  42. package/client/dist/assets/aiedit-iIjz2_Qk.js +1 -0
  43. package/client/dist/assets/analytics-DZ8Aoq3I.js +1 -0
  44. package/client/dist/assets/api-B2M7CtDw.js +1 -0
  45. package/client/dist/assets/arrow-left-CpIR4j7G.js +1 -0
  46. package/client/dist/assets/arrow-up-right-9DoMn7fD.js +1 -0
  47. package/client/dist/assets/attachments-B53PG733.js +1 -0
  48. package/client/dist/assets/brain-DI9lHkKY.js +1 -0
  49. package/client/dist/assets/browser-CXUcnTMI.js +1 -0
  50. package/client/dist/assets/button-BUIIBQPT.js +1 -0
  51. package/client/dist/assets/chat-BGD7MXAy.js +1 -0
  52. package/client/dist/assets/chevron-right-CViMxucY.js +1 -0
  53. package/client/dist/assets/chunk-KS7C4IRE-Cx5sqopX.js +3 -0
  54. package/client/dist/assets/circle-x-CMYsN4ZH.js +1 -0
  55. package/client/dist/assets/code-BDXEM4ml.js +1 -0
  56. package/client/dist/assets/commands-DyUZQ1FI.js +1 -0
  57. package/client/dist/assets/common-CD1QHriA2.js +1 -0
  58. package/client/dist/assets/common-CwwPaRxx.js +1 -0
  59. package/client/dist/assets/common-DVQuhs-m.js +1 -0
  60. package/client/dist/assets/common-Dg2jaX7d.js +1 -0
  61. package/client/dist/assets/common-DuBwj6tK.js +1 -0
  62. package/client/dist/assets/common-MRj9MHcc.js +1 -0
  63. package/client/dist/assets/common-O4ZpnMLp.js +1 -0
  64. package/client/dist/assets/common-fyeF0v7C2.js +1 -0
  65. package/client/dist/assets/createLucideIcon-Bjbbp_KS.js +1 -0
  66. package/client/dist/assets/{css.worker-Wv5dxAWO.js → css.worker-yKcq13f2.js} +13 -13
  67. package/client/dist/assets/{cssMode-DBHbkBvI.js → cssMode-BM4z9OX0.js} +1 -1
  68. package/client/dist/assets/dashboard-B_NkSHYm.js +1 -0
  69. package/client/dist/assets/dashboard-ClBb_3pq.js +1 -0
  70. package/client/dist/assets/dashboard-CpCmJvMB.js +1 -0
  71. package/client/dist/assets/dashboard-Czohu35O2.js +1 -0
  72. package/client/dist/assets/dashboard-DcjbD0UK.js +1 -0
  73. package/client/dist/assets/dashboard-Dvx5F3we.js +1 -0
  74. package/client/dist/assets/dashboard-R1bOPjBh2.js +1 -0
  75. package/client/dist/assets/dashboard-owcDucDi.js +1 -0
  76. package/client/dist/assets/dialog-CzIekCw0.js +45 -0
  77. package/client/dist/assets/dist-Cez5CRkX.js +1 -0
  78. package/client/dist/assets/dist-bVqfYmby.js +1 -0
  79. package/client/dist/assets/{dist-js-UjXbEWhN.js → dist-js-CcBCbb32.js} +1 -1
  80. package/client/dist/assets/{dist-js-BTAcxhPb.js → dist-js-VwztRkGj.js} +1 -1
  81. package/client/dist/assets/download-CFHyyHcw.js +1 -0
  82. package/client/dist/assets/editor.api2-4ndOupAA.js +872 -0
  83. package/client/dist/assets/{editor.main-C9J2ikJK.js → editor.main-DxrmGfoq.js} +2 -2
  84. package/client/dist/assets/editor.worker-tytyn86m.js +26 -0
  85. package/client/dist/assets/explore-DgBACn39.js +1 -0
  86. package/client/dist/assets/external-link-BcU5EWZp.js +1 -0
  87. package/client/dist/assets/file-text-CFT-xXKN.js +1 -0
  88. package/client/dist/assets/formatDistanceToNow-ByHIauTQ.js +1 -0
  89. package/client/dist/assets/{freemarker2-J5iIIIK-.js → freemarker2-CELlTDJ2.js} +1 -1
  90. package/client/dist/assets/getTimezoneOffsetInMilliseconds-BxHAksaU.js +1 -0
  91. package/client/dist/assets/git-branch-BRM0F5GN.js +1 -0
  92. package/client/dist/assets/{handlebars-DSw1l_tw.js → handlebars-NEjHJ7o_.js} +1 -1
  93. package/client/dist/assets/{html-h2-wE1Lj.js → html-CA10zN5A.js} +1 -1
  94. package/client/dist/assets/{html.worker-CQP8QQsS.js → html.worker-DSJ9zmd7.js} +12 -12
  95. package/client/dist/assets/{htmlMode-Cc_ij7lW.js → htmlMode-89rPYiyq.js} +1 -1
  96. package/client/dist/assets/i18n-CgaRxpII.js +2 -0
  97. package/client/dist/assets/index-BflYQpWm.css +2 -0
  98. package/client/dist/assets/index-C1_-BTXy.js +72 -0
  99. package/client/dist/assets/integrations-mB-7zoyT.js +1 -0
  100. package/client/dist/assets/{javascript-C1q3xv6N.js → javascript-B1gDmwzS.js} +1 -1
  101. package/client/dist/assets/jira-CmKWERE0.js +1 -0
  102. package/client/dist/assets/jira-api-BgFIr8eD.js +1 -0
  103. package/client/dist/assets/job-time-BCL7wee9.js +1 -0
  104. package/client/dist/assets/jobs-B-sDHEay2.js +1 -0
  105. package/client/dist/assets/jobs-BCtGfgUA.js +1 -0
  106. package/client/dist/assets/jobs-BHR_EnDI.js +1 -0
  107. package/client/dist/assets/jobs-BMbZJjJJ.js +1 -0
  108. package/client/dist/assets/jobs-CVFD8rar.js +1 -0
  109. package/client/dist/assets/jobs-DoSaFzAa.js +1 -0
  110. package/client/dist/assets/jobs-DzSIR8V62.js +1 -0
  111. package/client/dist/assets/jobs-lk1_Dq1U.js +1 -0
  112. package/client/dist/assets/json.worker-Oa9UrkKE.js +58 -0
  113. package/client/dist/assets/{jsonMode-CeaCdEhr.js → jsonMode-xHLMfzhF.js} +1 -1
  114. package/client/dist/assets/jsx-runtime-zu2_FqZY.js +1 -0
  115. package/client/dist/assets/lib-C7Mhm-gT.js +7 -0
  116. package/client/dist/assets/lib-CGdyxIWg.js +29 -0
  117. package/client/dist/assets/{liquid-eFsVK0V-.js → liquid-BY6hCUXG.js} +1 -1
  118. package/client/dist/assets/loader-circle-DcygOQpC.js +1 -0
  119. package/client/dist/assets/loops-BzfXWEwO.js +1 -0
  120. package/client/dist/assets/{lspLanguageFeatures-DT3-bbhn.js → lspLanguageFeatures-ira2aEJh.js} +1 -1
  121. package/client/dist/assets/mcp-uDkXYu4L.js +1 -0
  122. package/client/dist/assets/{mdx-Fuwnh1cX.js → mdx-BNx0xr3N.js} +1 -1
  123. package/client/dist/assets/monaco.contribution-Bt92R3Vw.js +2 -0
  124. package/client/dist/assets/nav-myFaXRHD.js +1 -0
  125. package/client/dist/assets/pencil-C9RkrIPZ.js +1 -0
  126. package/client/dist/assets/play-DNlrawbS.js +1 -0
  127. package/client/dist/assets/plus-CsnjfkmX.js +1 -0
  128. package/client/dist/assets/preload-helper-Czpn1I53.js +1 -0
  129. package/client/dist/assets/{python-BgoEs6Cj.js → python-DLdbtmNw.js} +1 -1
  130. package/client/dist/assets/{razor-CM1sPMMq.js → razor-B9gdhAbR.js} +1 -1
  131. package/client/dist/assets/react-dom-DiWzBDP9.js +1 -0
  132. package/client/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
  133. package/client/dist/assets/save-28sIlCdr.js +1 -0
  134. package/client/dist/assets/search-Cq_gE3Ik.js +1 -0
  135. package/client/dist/assets/settings-B0ypw9uw.js +1 -0
  136. package/client/dist/assets/{settings-Bp24JHlv2.js → settings-B9ilOSYO.js} +1 -1
  137. package/client/dist/assets/{settings-Bx2ObkTR2.js → settings-BqlWHRHA.js} +1 -1
  138. package/client/dist/assets/{settings-C_T0-j9d.js → settings-D8dlqt4d.js} +1 -1
  139. package/client/dist/assets/{settings-DhaFKpcw2.js → settings-DAZqjX2a2.js} +1 -1
  140. package/client/dist/assets/{settings-B_v3zgJf.js → settings-DRh39v1S2.js} +1 -1
  141. package/client/dist/assets/{settings-BemR_e3F.js → settings-Mj1OJbfd2.js} +1 -1
  142. package/client/dist/assets/{settings-BvIwQ3A1.js → settings-lRReaSYm.js} +1 -1
  143. package/client/dist/assets/setup-CmK87LuS.js +1 -0
  144. package/client/dist/assets/sparkles-DrY8hb0X.js +1 -0
  145. package/client/dist/assets/specs-DII0C8gw.js +1 -0
  146. package/client/dist/assets/spending-C4p06nen.js +1 -0
  147. package/client/dist/assets/terminal-BFRZnMPP.js +1 -0
  148. package/client/dist/assets/tickets-B8BuAaj5.js +1 -0
  149. package/client/dist/assets/tickets-B_yh4qQk.js +1 -0
  150. package/client/dist/assets/tickets-Bs37scwY2.js +1 -0
  151. package/client/dist/assets/tickets-CFk2n2Or.js +1 -0
  152. package/client/dist/assets/tickets-DQp7JS2R2.js +1 -0
  153. package/client/dist/assets/tickets-D_yDquEw.js +1 -0
  154. package/client/dist/assets/tickets-DpmdE8tv2.js +1 -0
  155. package/client/dist/assets/tickets-pAUJkDTu.js +1 -0
  156. package/client/dist/assets/trash-2-BOU3WdZZ.js +1 -0
  157. package/client/dist/assets/triangle-alert-H9T4jAmh.js +1 -0
  158. package/client/dist/assets/{ts.worker-METxwbDZ.js → ts.worker-BtjBFNHX.js} +48 -33
  159. package/client/dist/assets/{tsMode-BmT8WogI.js → tsMode-DEjSThU9.js} +1 -1
  160. package/client/dist/assets/{typescript-CQrQPsoW.js → typescript-CRRnD2Ts.js} +1 -1
  161. package/client/dist/assets/upload-DYMjAQ6M.js +1 -0
  162. package/client/dist/assets/useBrowserCaptureSession-2OqX0vap.js +1 -0
  163. package/client/dist/assets/useDesktop-X8YB9xzv.js +1 -0
  164. package/client/dist/assets/useSharedWebSocket-DaPh7QBL.js +1 -0
  165. package/client/dist/assets/utils-BC4DHlz2.js +1 -0
  166. package/client/dist/assets/value-s-gzBeyF.js +1 -0
  167. package/client/dist/assets/{workers-U0UXyLUf.js → workers-uOo7WLaa.js} +1 -1
  168. package/client/dist/assets/x-CBMI9ejn.js +1 -0
  169. package/client/dist/assets/{xml-WRxJs8_I.js → xml-EDREH2X7.js} +1 -1
  170. package/client/dist/assets/{yaml-CjpSTjJU.js → yaml-BjaDVX1E.js} +1 -1
  171. package/client/dist/assets/zap-CHo3aCD1.js +1 -0
  172. package/client/dist/index.html +73 -32
  173. package/docs/guide/en/integrations/5-mcp-server.md +2 -2
  174. package/docs/internals/safe-pr-review-flow.md +190 -132
  175. package/docs/mcp.md +15 -5
  176. package/package.json +11 -7
  177. package/server/dist/active-pr-continuation.js +16 -1
  178. package/server/dist/agent-chat-manager.js +360 -181
  179. package/server/dist/agent-cwd-manager.js +52 -8
  180. package/server/dist/agent-generator.js +90 -48
  181. package/server/dist/agent-mcp-config.js +69 -36
  182. package/server/dist/agent-operator-prompt.js +3 -2
  183. package/server/dist/agent-refine-manager.js +47 -6
  184. package/server/dist/agent-tier.js +13 -11
  185. package/server/dist/artifact-registry.js +33 -2
  186. package/server/dist/auth.js +5 -4
  187. package/server/dist/browser-capture-manager.js +92 -29
  188. package/server/dist/chat-manager.js +302 -46
  189. package/server/dist/contract-refine-runner.js +19 -6
  190. package/server/dist/db.js +665 -8
  191. package/server/dist/desktop-router.js +1 -2
  192. package/server/dist/headroom-manager.js +1310 -121
  193. package/server/dist/headroom-routing.js +120 -2
  194. package/server/dist/index.js +48 -13
  195. package/server/dist/interactive-job-session.js +237 -82
  196. package/server/dist/jira/jira-adf.js +10 -0
  197. package/server/dist/jira/jira-db.js +15 -3
  198. package/server/dist/jira/jira-sync-manager.js +182 -13
  199. package/server/dist/job-listing.js +140 -0
  200. package/server/dist/job-spawn-idempotency.js +67 -0
  201. package/server/dist/loop-run-manager.js +508 -98
  202. package/server/dist/loop-runs-store.js +266 -13
  203. package/server/dist/mcp/agent-capability.js +71 -0
  204. package/server/dist/mcp/guide.js +5 -2
  205. package/server/dist/mcp/mcp-server.js +5 -10
  206. package/server/dist/mcp/mcp-token.js +5 -5
  207. package/server/dist/mcp/tools/jobs.js +20 -13
  208. package/server/dist/mcp/tools/types.js +20 -42
  209. package/server/dist/mobile/mobile-router.js +1 -1
  210. package/server/dist/pr-lifecycle.js +77 -0
  211. package/server/dist/pr-publisher.js +94 -27
  212. package/server/dist/process-admission.js +82 -0
  213. package/server/dist/project-registry.js +572 -174
  214. package/server/dist/project-router-git.js +13 -2
  215. package/server/dist/project-router-jobs.js +111 -55
  216. package/server/dist/project-router-tickets.js +32 -2
  217. package/server/dist/providers/claude-adapter.js +21 -13
  218. package/server/dist/queue-manager.js +2332 -623
  219. package/server/dist/rail-isolated-launch.js +1141 -280
  220. package/server/dist/rail-isolation.js +4 -2
  221. package/server/dist/rail-pr-decision.js +756 -270
  222. package/server/dist/rail-pr-delivery.js +2 -1
  223. package/server/dist/rail-pr-store.js +317 -18
  224. package/server/dist/rail-pr-ticket-effects.js +328 -0
  225. package/server/dist/rail-worktree-release.js +28 -6
  226. package/server/dist/rails-router.js +149 -112
  227. package/server/dist/rails-store.js +106 -3
  228. package/server/dist/ticket-store.js +23 -1
  229. package/server/dist/transient-children.js +13 -0
  230. package/server/dist/util/cli-prompt.js +42 -8
  231. package/server/dist/util/secure-token-file.js +84 -0
  232. package/server/dist/worktree-manager.js +70 -21
  233. package/client/dist/assets/ActivityFeedPage-Be-6L0Ld.js +0 -1
  234. package/client/dist/assets/AgentBrowserCapture-CpZ-dd8O.js +0 -1
  235. package/client/dist/assets/AgentIntegrationsModal-DO1pN_Ez.js +0 -1
  236. package/client/dist/assets/AgentModeCodePane-DLltTOqp.js +0 -2
  237. package/client/dist/assets/AgentModeJobsPane-Dp5YvmW0.js +0 -1
  238. package/client/dist/assets/AgentsPage-ehHuVUds.js +0 -86
  239. package/client/dist/assets/AnalyticsPage-C4Ik95FX.js +0 -1
  240. package/client/dist/assets/BarChart-DVZgrhJd.js +0 -33
  241. package/client/dist/assets/CodePage-D4OCMfxL.js +0 -2
  242. package/client/dist/assets/DesktopAnalyticsPage-2Xf-52x2.js +0 -1
  243. package/client/dist/assets/DocsDialog-CHihLjWd.js +0 -11
  244. package/client/dist/assets/DocsPage-1vEk7XbH.js +0 -11
  245. package/client/dist/assets/ExportDropdown-DLHFQxVn.js +0 -1
  246. package/client/dist/assets/IntegrationsPage-CCb2YuyJ.js +0 -1
  247. package/client/dist/assets/InteractiveJobComposer-CxJJEnjw.js +0 -19
  248. package/client/dist/assets/JobDetailModal-CJI7qRkm.js +0 -1
  249. package/client/dist/assets/JobDetailPage-DwA9bbwx.js +0 -1
  250. package/client/dist/assets/JobsPage-BDIyFfd5.js +0 -1
  251. package/client/dist/assets/LoopBuilderPage-CpBaW59t.js +0 -7
  252. package/client/dist/assets/LoopPreviewModal-CwpKcv0Y.js +0 -1
  253. package/client/dist/assets/LoopsPage-BO0Pa8oz.js +0 -1
  254. package/client/dist/assets/PluginsPage-BBGTBpGh.js +0 -2
  255. package/client/dist/assets/ProjectSettingsDialog-M9zGQo0l.js +0 -1
  256. package/client/dist/assets/TemplatePreviewModal-eBI0zL5P.js +0 -1
  257. package/client/dist/assets/activity-Dbl71S-E.js +0 -1
  258. package/client/dist/assets/addon-image-CwoZj17F.js +0 -1
  259. package/client/dist/assets/addon-ligatures-CWDrED80.js +0 -2
  260. package/client/dist/assets/addspec-DrXqP8ip.js +0 -1
  261. package/client/dist/assets/agent-BEXYxDbs.js +0 -1
  262. package/client/dist/assets/agent-BoXSzaBk2.js +0 -1
  263. package/client/dist/assets/agent-C2-rROL52.js +0 -1
  264. package/client/dist/assets/agent-CeRTdGT12.js +0 -1
  265. package/client/dist/assets/agent-DZ8zTrQT.js +0 -1
  266. package/client/dist/assets/agent-DqyzT33X.js +0 -1
  267. package/client/dist/assets/agent-fQI_6tsA.js +0 -1
  268. package/client/dist/assets/agent-tJdAobaM.js +0 -1
  269. package/client/dist/assets/agents-CGDn_3kB.js +0 -1
  270. package/client/dist/assets/agentstudio-Dxe_94PK.js +0 -1
  271. package/client/dist/assets/aiedit-DrfHQnlz.js +0 -1
  272. package/client/dist/assets/analytics-CxDYcBl9.js +0 -1
  273. package/client/dist/assets/attachments-DvxQbBTC.js +0 -1
  274. package/client/dist/assets/brain-DecvjjPU.js +0 -1
  275. package/client/dist/assets/browser-DM8G151q.js +0 -1
  276. package/client/dist/assets/chat-0dg5hOo_.js +0 -1
  277. package/client/dist/assets/chunk-BNv3lrIs.js +0 -1
  278. package/client/dist/assets/code-B62fClk-.js +0 -1
  279. package/client/dist/assets/commands-DCJ-R9E4.js +0 -1
  280. package/client/dist/assets/common-BfQD173j.js +0 -1
  281. package/client/dist/assets/common-CF8iGXrG.js +0 -1
  282. package/client/dist/assets/common-Cfmwcrl52.js +0 -1
  283. package/client/dist/assets/common-D2cimsul.js +0 -1
  284. package/client/dist/assets/common-DH7fjyL1.js +0 -1
  285. package/client/dist/assets/common-DXrmj6WD.js +0 -1
  286. package/client/dist/assets/common-DZbXlmq72.js +0 -1
  287. package/client/dist/assets/common-DtXmzX2o2.js +0 -1
  288. package/client/dist/assets/dashboard-5C2FOZQX.js +0 -1
  289. package/client/dist/assets/dashboard-B6iQ-IL_.js +0 -1
  290. package/client/dist/assets/dashboard-BFfnCtq52.js +0 -1
  291. package/client/dist/assets/dashboard-BIC8KtRf2.js +0 -1
  292. package/client/dist/assets/dashboard-CEgg9NAr.js +0 -1
  293. package/client/dist/assets/dashboard-CiOyDh9L.js +0 -1
  294. package/client/dist/assets/dashboard-D6x5OnNj2.js +0 -1
  295. package/client/dist/assets/dashboard-DBuLfWo9.js +0 -1
  296. package/client/dist/assets/editor.api2-C3B0tp2x.js +0 -872
  297. package/client/dist/assets/editor.worker-Bd9IXS8d.js +0 -26
  298. package/client/dist/assets/explore-_XyU5e7R.js +0 -1
  299. package/client/dist/assets/index-BVbgKXUu.css +0 -2
  300. package/client/dist/assets/index-OBDI7bHm.js +0 -158
  301. package/client/dist/assets/integrations-By80EBkf.js +0 -1
  302. package/client/dist/assets/jira-DeIjwCK3.js +0 -1
  303. package/client/dist/assets/jobs-BFIdeDTw.js +0 -1
  304. package/client/dist/assets/jobs-BJ-Gcao22.js +0 -1
  305. package/client/dist/assets/jobs-DAGiPVIS2.js +0 -1
  306. package/client/dist/assets/jobs-DAU8C_tZ.js +0 -1
  307. package/client/dist/assets/jobs-Da0GaaSc.js +0 -1
  308. package/client/dist/assets/jobs-DrYmsKy5.js +0 -1
  309. package/client/dist/assets/jobs-P3unxtxo2.js +0 -1
  310. package/client/dist/assets/jobs-p360zdf1.js +0 -1
  311. package/client/dist/assets/json.worker-DzV-CpCQ.js +0 -58
  312. package/client/dist/assets/lib-C5ZxrPSR.js +0 -7
  313. package/client/dist/assets/loops-CO6q75W8.js +0 -1
  314. package/client/dist/assets/mcp-HwBbQDk0.js +0 -1
  315. package/client/dist/assets/monaco.contribution-Desq7oq4.js +0 -2
  316. package/client/dist/assets/nav-BTg8s-cD.js +0 -1
  317. package/client/dist/assets/preload-helper-DSXbuxSR.js +0 -1
  318. package/client/dist/assets/settings-BYCMtxOz.js +0 -1
  319. package/client/dist/assets/setup-D2CmgAro.js +0 -1
  320. package/client/dist/assets/specs-PGIOzMtc.js +0 -1
  321. package/client/dist/assets/terminal-CFt56A5f.js +0 -1
  322. package/client/dist/assets/tickets-BHv3ewvq.js +0 -1
  323. package/client/dist/assets/tickets-BIxU86j12.js +0 -1
  324. package/client/dist/assets/tickets-C2BhwzwR.js +0 -1
  325. package/client/dist/assets/tickets-D1IeX2EW.js +0 -1
  326. package/client/dist/assets/tickets-DZut8Ryt.js +0 -1
  327. package/client/dist/assets/tickets-LfK6LzKl2.js +0 -1
  328. package/client/dist/assets/tickets-dQfsc7Ph.js +0 -1
  329. package/client/dist/assets/tickets-sVun0I6v.js +0 -1
  330. package/client/dist/assets/upload-lgjKJgrl.js +0 -1
  331. package/client/dist/assets/value-Bc0_jlJA.js +0 -1
  332. /package/client/dist/assets/{abap-D0E4FfVW.js → abap-08VXUWAP.js} +0 -0
  333. /package/client/dist/assets/{activity-BbWiDfn-2.js → activity-B-rp4h_v.js} +0 -0
  334. /package/client/dist/assets/{activity-DvECTYGt.js → activity-C6kJpm9q2.js} +0 -0
  335. /package/client/dist/assets/{activity-D3Ic-HTS.js → activity-CGx4kb_j.js} +0 -0
  336. /package/client/dist/assets/{activity-BZZlEG3a.js → activity-CnoX2bH7.js} +0 -0
  337. /package/client/dist/assets/{activity-DtzRy92x.js → activity-DAyekdlt2.js} +0 -0
  338. /package/client/dist/assets/{activity-FleOlK0l2.js → activity-DCxtpT7j.js} +0 -0
  339. /package/client/dist/assets/{activity-DFbvNqhE2.js → activity-JzwRaWPD.js} +0 -0
  340. /package/client/dist/assets/{addspec-CFxGvmJR2.js → addspec-BXjvkh5q.js} +0 -0
  341. /package/client/dist/assets/{addspec-NBbcTbLc.js → addspec-C4bwrmpi.js} +0 -0
  342. /package/client/dist/assets/{addspec-BKrH2Ucz.js → addspec-CArHXUDM.js} +0 -0
  343. /package/client/dist/assets/{addspec-CR8MB5Fr2.js → addspec-DTKJcXiR.js} +0 -0
  344. /package/client/dist/assets/{addspec-B_LQMHW3.js → addspec-DbNBbrha2.js} +0 -0
  345. /package/client/dist/assets/{addspec-DaA-CbTt.js → addspec-htHGZHOe2.js} +0 -0
  346. /package/client/dist/assets/{addspec-Bw_YQwo62.js → addspec-lr_LP6jk.js} +0 -0
  347. /package/client/dist/assets/{agents-BHgn--3j.js → agents-6ZOJXWVk2.js} +0 -0
  348. /package/client/dist/assets/{agents-VsyFhGOS2.js → agents-BZ0XQKjg.js} +0 -0
  349. /package/client/dist/assets/{agents-HFCqQH0Z.js → agents-BqWklnHR.js} +0 -0
  350. /package/client/dist/assets/{agents-B_qGaB0F.js → agents-Bz-thHkB2.js} +0 -0
  351. /package/client/dist/assets/{agents-CP8_ezYG.js → agents-CJclElx6.js} +0 -0
  352. /package/client/dist/assets/{agents-B9pFSJQI2.js → agents-D_l9L0VA.js} +0 -0
  353. /package/client/dist/assets/{agents-CV-_xBvX2.js → agents-u_C0jPB5.js} +0 -0
  354. /package/client/dist/assets/{agentstudio-BEp7Sb46.js → agentstudio-BF19hbXj.js} +0 -0
  355. /package/client/dist/assets/{agentstudio-Br3WD7Xs.js → agentstudio-BLGvxWBx2.js} +0 -0
  356. /package/client/dist/assets/{agentstudio-BOjG6tgJ.js → agentstudio-D9UKiWTj2.js} +0 -0
  357. /package/client/dist/assets/{agentstudio-D2A5peWV2.js → agentstudio-Drs37nIM.js} +0 -0
  358. /package/client/dist/assets/{agentstudio-CuTt3ZGe2.js → agentstudio-nEnKkcXM.js} +0 -0
  359. /package/client/dist/assets/{agentstudio-RsxnZtUA.js → agentstudio-pyFcSBKy.js} +0 -0
  360. /package/client/dist/assets/{agentstudio-RfZavULt2.js → agentstudio-zfTzQh3U.js} +0 -0
  361. /package/client/dist/assets/{aiedit-DnBzjlVz2.js → aiedit-B0KUbpB6.js} +0 -0
  362. /package/client/dist/assets/{aiedit-D0Syl-mC.js → aiedit-BoG24nlg2.js} +0 -0
  363. /package/client/dist/assets/{aiedit-CcugGPbS.js → aiedit-CjlSRQVP.js} +0 -0
  364. /package/client/dist/assets/{aiedit-DrIjSojo.js → aiedit-DCjA7jLJ.js} +0 -0
  365. /package/client/dist/assets/{aiedit-CV520D4W2.js → aiedit-DNXxq_Dr.js} +0 -0
  366. /package/client/dist/assets/{aiedit-26p5A_HY2.js → aiedit-DQ-0_pvE.js} +0 -0
  367. /package/client/dist/assets/{aiedit-a-Z-g5iC.js → aiedit-olnv3QSt2.js} +0 -0
  368. /package/client/dist/assets/{analytics-DEe5BMz8.js → analytics-BC7mwR4s.js} +0 -0
  369. /package/client/dist/assets/{analytics-4HvXb0Vn2.js → analytics-BiNg8edP.js} +0 -0
  370. /package/client/dist/assets/{analytics-CpSTNfui.js → analytics-C0s_T2GN.js} +0 -0
  371. /package/client/dist/assets/{analytics-4-eskbtX.js → analytics-CdsAPAwZ2.js} +0 -0
  372. /package/client/dist/assets/{analytics-Bpe41fnX2.js → analytics-Cr1_q-lC.js} +0 -0
  373. /package/client/dist/assets/{analytics-DcOITHla2.js → analytics-IEsKZvpW2.js} +0 -0
  374. /package/client/dist/assets/{analytics-Bd9rHGjV.js → analytics-SRPf84OT.js} +0 -0
  375. /package/client/dist/assets/{apex-D_X_8J4d.js → apex-BWPQTe0t.js} +0 -0
  376. /package/client/dist/assets/{atom-one-dark-BMDPFwRZ.js → atom-one-dark-qiGhVQxg.js} +0 -0
  377. /package/client/dist/assets/{attachments-CgOQ9K-6.js → attachments-D0wXXt9T2.js} +0 -0
  378. /package/client/dist/assets/{attachments-DlEQu56g2.js → attachments-DenIjuVI.js} +0 -0
  379. /package/client/dist/assets/{attachments-CA2f3qL3.js → attachments-DhO7LPfy.js} +0 -0
  380. /package/client/dist/assets/{attachments-D2jwJXQ42.js → attachments-DoH5w0x4.js} +0 -0
  381. /package/client/dist/assets/{attachments-CHDbhKeH.js → attachments-Q9yNtiEM.js} +0 -0
  382. /package/client/dist/assets/{attachments-CKAY5aYG2.js → attachments-V_WZAYXx2.js} +0 -0
  383. /package/client/dist/assets/{attachments-jVdKzAXn.js → attachments-eaeScpjM.js} +0 -0
  384. /package/client/dist/assets/{auth-DpZq5p1e.js → auth-D_5bQv5W.js} +0 -0
  385. /package/client/dist/assets/{azcli-PZLnZ3jH.js → azcli-Bc_sGQ0U.js} +0 -0
  386. /package/client/dist/assets/{bat-KlBOxpO4.js → bat-i0X4ZdIN.js} +0 -0
  387. /package/client/dist/assets/{bicep-CgG9oF3V.js → bicep-B5-_aFwp.js} +0 -0
  388. /package/client/dist/assets/{browser-Cl-FwPXs.js → browser-C25DkQiO.js} +0 -0
  389. /package/client/dist/assets/{browser-JsiohNmW.js → browser-CiJ7-L32.js} +0 -0
  390. /package/client/dist/assets/{browser-BbJ_q_OT2.js → browser-CvgDySd9.js} +0 -0
  391. /package/client/dist/assets/{browser-BQFDxrRq.js → browser-CyR1Kp3m2.js} +0 -0
  392. /package/client/dist/assets/{browser-Do2jf8_N.js → browser-DwZljcRh2.js} +0 -0
  393. /package/client/dist/assets/{browser-C4VJ5CW12.js → browser-DxP-alBK.js} +0 -0
  394. /package/client/dist/assets/{browser-kA31eYhu2.js → browser-rRCwi7Y7.js} +0 -0
  395. /package/client/dist/assets/{cameligo-6R45j6Ph.js → cameligo-DMUM7wLl.js} +0 -0
  396. /package/client/dist/assets/{chat-BalviUAD.js → chat-2rIB8HhT.js} +0 -0
  397. /package/client/dist/assets/{chat-Ds8GvCnv.js → chat-BR8oe53x2.js} +0 -0
  398. /package/client/dist/assets/{chat-D5xEtsf3.js → chat-Bua03tty.js} +0 -0
  399. /package/client/dist/assets/{chat-SaG-ng1x2.js → chat-CZpAQan1.js} +0 -0
  400. /package/client/dist/assets/{chat-CJddjN3D2.js → chat-CdY5SGvS.js} +0 -0
  401. /package/client/dist/assets/{chat-n43nZGvn.js → chat-DZyu3ImY2.js} +0 -0
  402. /package/client/dist/assets/{chat-BMWD_Rx12.js → chat-D_I7nU5K.js} +0 -0
  403. /package/client/dist/assets/{clojure-CLAAMO7J.js → clojure-Cm7r79vr.js} +0 -0
  404. /package/client/dist/assets/{clsx-CNmW0Nip.js → clsx-CjueKrWZ.js} +0 -0
  405. /package/client/dist/assets/{code-C9U6M5-e2.js → code-76gS0IdL.js} +0 -0
  406. /package/client/dist/assets/{code-BotxM43N2.js → code-C1VwxlML.js} +0 -0
  407. /package/client/dist/assets/{code-HDK4P6Rx.js → code-CnMZyJpr.js} +0 -0
  408. /package/client/dist/assets/{code-DUe1Bouz.js → code-D20ef9Cf2.js} +0 -0
  409. /package/client/dist/assets/{code-Bit_z2Xd2.js → code-DdOXaWRY.js} +0 -0
  410. /package/client/dist/assets/{code-F_KjccGf.js → code-Duohuf9l.js} +0 -0
  411. /package/client/dist/assets/{code-CIPmDEd0.js → code-geHmknB92.js} +0 -0
  412. /package/client/dist/assets/{coffee-AruSygo-.js → coffee-Ba7i2nA0.js} +0 -0
  413. /package/client/dist/assets/{commands-BFQZc9AG.js → commands-B9RZO4qS.js} +0 -0
  414. /package/client/dist/assets/{commands-BMkC5-ki.js → commands-BEwbAjtD2.js} +0 -0
  415. /package/client/dist/assets/{commands-KBbhsnw8.js → commands-Bbxu8kLU.js} +0 -0
  416. /package/client/dist/assets/{commands-CzFSoIiq2.js → commands-CDU3qv68.js} +0 -0
  417. /package/client/dist/assets/{commands-CWX9WmDX2.js → commands-CzezgtQj.js} +0 -0
  418. /package/client/dist/assets/{commands-BllkJauO.js → commands-DTQBF_q52.js} +0 -0
  419. /package/client/dist/assets/{commands-cKTaLwwV2.js → commands-hOtKuOXc.js} +0 -0
  420. /package/client/dist/assets/{cpp-DEE5r4Pw.js → cpp-C7h46wYY.js} +0 -0
  421. /package/client/dist/assets/{csharp-BVXJUvbK.js → csharp-BKxtCVv1.js} +0 -0
  422. /package/client/dist/assets/{csp-cXOF0JoV.js → csp-bTuwJoIa.js} +0 -0
  423. /package/client/dist/assets/{css-C_zQuAoy.js → css-DIMkf-bt.js} +0 -0
  424. /package/client/dist/assets/{cypher-t95m_Q-O.js → cypher-CVaqCwHa.js} +0 -0
  425. /package/client/dist/assets/{dart-B4r1Tg-e.js → dart-onAF5SnQ.js} +0 -0
  426. /package/client/dist/assets/{dockerfile-6mt7zHQw.js → dockerfile-DZFCIeNp.js} +0 -0
  427. /package/client/dist/assets/{ecl-DEY_Fz_Q.js → ecl-D05T4iGw.js} +0 -0
  428. /package/client/dist/assets/{elixir-R6-q1c5t.js → elixir-6RTg0lbw.js} +0 -0
  429. /package/client/dist/assets/{explore-CAc8Qzu32.js → explore-BG99VGpL.js} +0 -0
  430. /package/client/dist/assets/{explore-BO_OinBD.js → explore-C0TjprJW2.js} +0 -0
  431. /package/client/dist/assets/{explore-Bhy7WWXv.js → explore-C2dgEo7q.js} +0 -0
  432. /package/client/dist/assets/{explore-ELbrSZyQ2.js → explore-C8NDHbob.js} +0 -0
  433. /package/client/dist/assets/{explore-DW_YTkQh.js → explore-CWWgzQGR.js} +0 -0
  434. /package/client/dist/assets/{explore-DCZL9gRN2.js → explore-CcQXpdtS.js} +0 -0
  435. /package/client/dist/assets/{explore-BEpIs343.js → explore-DsXAgnmJ2.js} +0 -0
  436. /package/client/dist/assets/{flow9-CNQvHBOt.js → flow9-C5_-GSwl.js} +0 -0
  437. /package/client/dist/assets/{format-command-Db1viey1.js → format-command-Dfa1o2d-.js} +0 -0
  438. /package/client/dist/assets/{fsharp-vPZkFXwv.js → fsharp-C8Ef5oNN.js} +0 -0
  439. /package/client/dist/assets/{go-KUzBMYJ_.js → go-C-y9NEjX.js} +0 -0
  440. /package/client/dist/assets/{graphql-C3W0rCsD.js → graphql-fmXr3nnJ.js} +0 -0
  441. /package/client/dist/assets/{hcl-BOOMFSNX.js → hcl-CpzslTdj.js} +0 -0
  442. /package/client/dist/assets/{ini-CFat1WJr.js → ini-sBoK_t0W.js} +0 -0
  443. /package/client/dist/assets/{integrations-CG2dp3Kd.js → integrations-CH0zy1Mw2.js} +0 -0
  444. /package/client/dist/assets/{integrations-CUNe3t9l2.js → integrations-CIAjhd7L.js} +0 -0
  445. /package/client/dist/assets/{integrations-CWjh5VRk.js → integrations-CZdwOe8A.js} +0 -0
  446. /package/client/dist/assets/{integrations-RJfzXkPx2.js → integrations-Ct7omMld.js} +0 -0
  447. /package/client/dist/assets/{integrations-CAjq5tdW2.js → integrations-D6MSxy3-.js} +0 -0
  448. /package/client/dist/assets/{integrations-JOHSCvB3.js → integrations-DbZa-Zyc.js} +0 -0
  449. /package/client/dist/assets/{integrations-CP_aiV_8.js → integrations-b8pH-vfl2.js} +0 -0
  450. /package/client/dist/assets/{java-Dee-CNAM.js → java-BEtHBSE6.js} +0 -0
  451. /package/client/dist/assets/{jira-CQ7mrZde.js → jira-BySfUuQZ.js} +0 -0
  452. /package/client/dist/assets/{jira-DIRkZk9U.js → jira-Byw2C0F8.js} +0 -0
  453. /package/client/dist/assets/{jira-C5UjxHE4.js → jira-CNeYi06w2.js} +0 -0
  454. /package/client/dist/assets/{jira-ZdKb-50F2.js → jira-D11gPhxz.js} +0 -0
  455. /package/client/dist/assets/{jira-DTYu3hJi2.js → jira-D38Gj7AT.js} +0 -0
  456. /package/client/dist/assets/{jira-B5wszJ1-2.js → jira-gAvOyije.js} +0 -0
  457. /package/client/dist/assets/{jira-DtZpokjJ.js → jira-pRaL7JQo2.js} +0 -0
  458. /package/client/dist/assets/{julia-CGNlLYuU.js → julia-Bri6UV-V.js} +0 -0
  459. /package/client/dist/assets/{kotlin-CY7lhknJ.js → kotlin-BOotOW0E.js} +0 -0
  460. /package/client/dist/assets/{less-D0KN7hfJ.js → less-B9JPFI3C.js} +0 -0
  461. /package/client/dist/assets/{lexon-CuRJufPs.js → lexon-CfSJPG6W.js} +0 -0
  462. /package/client/dist/assets/{loops-DKzYFcq6.js → loops-CPpgMapU.js} +0 -0
  463. /package/client/dist/assets/{loops-Du-bNVpc2.js → loops-CWWbKuVL.js} +0 -0
  464. /package/client/dist/assets/{loops-DDs4KPu_.js → loops-Crc9It8o2.js} +0 -0
  465. /package/client/dist/assets/{loops-Bi4ywYGn.js → loops-DH2hZcbK2.js} +0 -0
  466. /package/client/dist/assets/{loops-DvGbSfxw2.js → loops-DS5TmvIU2.js} +0 -0
  467. /package/client/dist/assets/{loops-D3wdUkZV.js → loops-P2f0cN8-.js} +0 -0
  468. /package/client/dist/assets/{loops-BjK8lmoZ2.js → loops-fJV-9hH7.js} +0 -0
  469. /package/client/dist/assets/{lua-DHvH62Zf.js → lua-CsQS60Ue.js} +0 -0
  470. /package/client/dist/assets/{m3-tlthQ8Fo.js → m3-D-oSqn_W.js} +0 -0
  471. /package/client/dist/assets/{markdown-Dbx1LgUZ.js → markdown-Cimd5fb3.js} +0 -0
  472. /package/client/dist/assets/{mcp-DfmzoT5t.js → mcp-Czd_iyp02.js} +0 -0
  473. /package/client/dist/assets/{mcp-BG-OCJca2.js → mcp-D2pc5GGx.js} +0 -0
  474. /package/client/dist/assets/{mcp-CrWdq5db.js → mcp-D4ZjtIx32.js} +0 -0
  475. /package/client/dist/assets/{mcp-CbJ04oFS2.js → mcp-DIfBUv2D2.js} +0 -0
  476. /package/client/dist/assets/{mcp-Dd844F5_.js → mcp-DsTwmjST.js} +0 -0
  477. /package/client/dist/assets/{mcp-zSJ2TsJj.js → mcp-SMkn8boG.js} +0 -0
  478. /package/client/dist/assets/{mcp-DyULurYS2.js → mcp-fSfiVYAc.js} +0 -0
  479. /package/client/dist/assets/{mips-D_O3IUz_.js → mips-CIPQ_RoX.js} +0 -0
  480. /package/client/dist/assets/{msdax-C_ZmCnRt.js → msdax-DauUninz.js} +0 -0
  481. /package/client/dist/assets/{mysql-C-dCEYSX.js → mysql-SOo6toE5.js} +0 -0
  482. /package/client/dist/assets/{nav-DUuw9VIU2.js → nav-BRJBxaGt2.js} +0 -0
  483. /package/client/dist/assets/{nav-D0Erv9ZJ2.js → nav-CAGKv3_F.js} +0 -0
  484. /package/client/dist/assets/{nav-BY_4EWRv.js → nav-CNskRJKQ2.js} +0 -0
  485. /package/client/dist/assets/{nav-CVXtv0wX2.js → nav-DY93irBL.js} +0 -0
  486. /package/client/dist/assets/{nav-B2_ToNqS.js → nav-DhjvYgqt.js} +0 -0
  487. /package/client/dist/assets/{nav-S4HM94vW.js → nav-Gb-r4wop.js} +0 -0
  488. /package/client/dist/assets/{nav-BAMkVEId.js → nav-TvumAFD22.js} +0 -0
  489. /package/client/dist/assets/{objective-c-DZY9Aqxd.js → objective-c-FvmIjYaQ.js} +0 -0
  490. /package/client/dist/assets/{pascal-BVHLXoor.js → pascal-DrH0SRf2.js} +0 -0
  491. /package/client/dist/assets/{pascaligo-XdG_6u3k.js → pascaligo-D-ptJ9y-.js} +0 -0
  492. /package/client/dist/assets/{perl-b9QV0BcD.js → perl-oz_6vUea.js} +0 -0
  493. /package/client/dist/assets/{pgsql-Du5FDOgT.js → pgsql-DTj74zXo.js} +0 -0
  494. /package/client/dist/assets/{php-WJD0z2Z_.js → php-nr791fC2.js} +0 -0
  495. /package/client/dist/assets/{pla-CbciTf2w.js → pla-CopQ2nXW.js} +0 -0
  496. /package/client/dist/assets/{postiats-C1QxmvVq.js → postiats-43DmfD33.js} +0 -0
  497. /package/client/dist/assets/{powerquery-BEYDhPLZ.js → powerquery-D3hlyOfw.js} +0 -0
  498. /package/client/dist/assets/{powershell-CfaYw4XL.js → powershell-DmHpPYUd.js} +0 -0
  499. /package/client/dist/assets/{protobuf-pwZEDOYa.js → protobuf-C531GsRP.js} +0 -0
  500. /package/client/dist/assets/{pug-5ftqSPVe.js → pug-Z5eAx3Zn.js} +0 -0
  501. /package/client/dist/assets/{qsharp-uI6qZMq4.js → qsharp-DkqhCAOL.js} +0 -0
  502. /package/client/dist/assets/{r-BK54P1EG.js → r-BwWrilGY.js} +0 -0
  503. /package/client/dist/assets/{redis-DI0yd7kN.js → redis-ClamHrr6.js} +0 -0
  504. /package/client/dist/assets/{redshift-Dov26eyI.js → redshift-DT7zqm-g.js} +0 -0
  505. /package/client/dist/assets/{restructuredtext-QqJ_1dC-.js → restructuredtext-BYgofb2h.js} +0 -0
  506. /package/client/dist/assets/{ruby-5WjveeVb.js → ruby-DezsRK8O.js} +0 -0
  507. /package/client/dist/assets/{rust-BzVSfqFH.js → rust-DdL9SqIa.js} +0 -0
  508. /package/client/dist/assets/{sb-DMIUfT-3.js → sb-CcwsVR0C.js} +0 -0
  509. /package/client/dist/assets/{scala-CSKA7lqt.js → scala-DHpiXF5c.js} +0 -0
  510. /package/client/dist/assets/{scheme-CojOP2Qc.js → scheme-BeGwcela.js} +0 -0
  511. /package/client/dist/assets/{scss-DoBZGJG6.js → scss-gp-XZpBa.js} +0 -0
  512. /package/client/dist/assets/{setup-JeBwoXoM.js → setup-CGZjy2IF2.js} +0 -0
  513. /package/client/dist/assets/{setup-1vN48B-m2.js → setup-CXa0Sx16.js} +0 -0
  514. /package/client/dist/assets/{setup-BmJ0Kx16.js → setup-D2ktKKMF2.js} +0 -0
  515. /package/client/dist/assets/{setup-T_ApeQDV2.js → setup-DG2H7ha5.js} +0 -0
  516. /package/client/dist/assets/{setup-DQWsu2TR.js → setup-DK5bHDUq2.js} +0 -0
  517. /package/client/dist/assets/{setup-q0wRHUp1.js → setup-DrWlIQTZ.js} +0 -0
  518. /package/client/dist/assets/{setup-mXnzww4f.js → setup-rzHUVgAu.js} +0 -0
  519. /package/client/dist/assets/{shell-YOaE4udl.js → shell-CC2rA5mh.js} +0 -0
  520. /package/client/dist/assets/{solidity-l3jSyVLu.js → solidity-BEEn4gHE.js} +0 -0
  521. /package/client/dist/assets/{sophia-BhSGTaQJ.js → sophia-CRfGWb83.js} +0 -0
  522. /package/client/dist/assets/{sparql-qhk6QD9w.js → sparql-D_Lu-MrJ.js} +0 -0
  523. /package/client/dist/assets/{specs-BGRKhM8t.js → specs-BcyxaCwf2.js} +0 -0
  524. /package/client/dist/assets/{specs-GkiL-snY.js → specs-C1q9geAi.js} +0 -0
  525. /package/client/dist/assets/{specs-DbtIzV8a.js → specs-CLZKysq-2.js} +0 -0
  526. /package/client/dist/assets/{specs-Ce5y2iFc2.js → specs-DZMS9o54.js} +0 -0
  527. /package/client/dist/assets/{specs-CT8exGOy2.js → specs-Dm6zUI-R.js} +0 -0
  528. /package/client/dist/assets/{specs-C6J2zrLM.js → specs-V3TvhKLX.js} +0 -0
  529. /package/client/dist/assets/{specs-DZDoZsDq.js → specs-dV3Mq5Mu2.js} +0 -0
  530. /package/client/dist/assets/{sql-DoO3y21-.js → sql-NEE52Syq.js} +0 -0
  531. /package/client/dist/assets/{st-ChZAY8oG.js → st-DbInun42.js} +0 -0
  532. /package/client/dist/assets/{swift-D290Tr7_.js → swift-Bxkupp3x.js} +0 -0
  533. /package/client/dist/assets/{systemverilog-DsxzgJ-o.js → systemverilog-Bz4Y3fRF.js} +0 -0
  534. /package/client/dist/assets/{tcl-BKDUHAAR.js → tcl-DISqw1ZD.js} +0 -0
  535. /package/client/dist/assets/{terminal-BTpE7iki.js → terminal-BZiIu3rf.js} +0 -0
  536. /package/client/dist/assets/{terminal-DEyt0prF.js → terminal-C2NAd7BW2.js} +0 -0
  537. /package/client/dist/assets/{terminal-a6Uq8B0p.js → terminal-IahE4LW92.js} +0 -0
  538. /package/client/dist/assets/{terminal-DDk_bTw0.js → terminal-QpXZU2Bn2.js} +0 -0
  539. /package/client/dist/assets/{terminal-BNSg2lR7.js → terminal-ScjyXNxQ.js} +0 -0
  540. /package/client/dist/assets/{terminal-Cvabyzm42.js → terminal-d7GadXbN.js} +0 -0
  541. /package/client/dist/assets/{terminal-D0z12_sJ2.js → terminal-tITa81iz.js} +0 -0
  542. /package/client/dist/assets/{twig-UpZQaM8G.js → twig-De2hgUGE.js} +0 -0
  543. /package/client/dist/assets/{typespec-DzaKvN8i.js → typespec-B8J7ngcE.js} +0 -0
  544. /package/client/dist/assets/{vb-CZpbb7tk.js → vb-DV3o63ZY.js} +0 -0
  545. /package/client/dist/assets/{wgsl-CNt3OIvl.js → wgsl-DpFanUEy.js} +0 -0
@@ -4,6 +4,8 @@ exports.registerGitRoutes = registerGitRoutes;
4
4
  const project_git_1 = require("./project-git");
5
5
  const git_diagnostics_1 = require("./git-diagnostics");
6
6
  const pr_publisher_1 = require("./pr-publisher");
7
+ const repo_lock_1 = require("./repo-lock");
8
+ const process_admission_1 = require("./process-admission");
7
9
  // ─── Git domain routes (/api/projects/:projectId/git) ─────────────────────────
8
10
  //
9
11
  // Backs the Agent-Mode git bar: current branch + last commit + local branches,
@@ -70,9 +72,14 @@ function registerGitRoutes(deps) {
70
72
  res.status(400).json({ error: 'branch is required' });
71
73
  return;
72
74
  }
73
- const repoDir = ctx(req).project.path;
75
+ const project = ctx(req).project;
76
+ const repoDir = project.path;
74
77
  try {
75
- const result = await (0, project_git_1.checkoutProjectBranch)(repoDir, branch);
78
+ const admission = (0, process_admission_1.captureProcessAdmission)(project.id);
79
+ const result = await (0, repo_lock_1.withRepoLock)(repoDir, () => {
80
+ admission.assertCurrent();
81
+ return (0, project_git_1.checkoutProjectBranch)(repoDir, branch);
82
+ });
76
83
  if (!result.ok) {
77
84
  // 409: the working tree state (or an unknown branch) refused the switch.
78
85
  res.status(409).json({ error: result.error });
@@ -81,6 +88,10 @@ function registerGitRoutes(deps) {
81
88
  res.json(await (0, project_git_1.getProjectGitInfo)(repoDir));
82
89
  }
83
90
  catch (err) {
91
+ if (err instanceof process_admission_1.ProcessAdmissionClosedError) {
92
+ res.status(409).json({ error: 'project_recovery_in_progress' });
93
+ return;
94
+ }
84
95
  console.error('[project-git] checkout failed:', err);
85
96
  res.status(500).json({ error: 'Checkout failed' });
86
97
  }
@@ -5,16 +5,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.registerJobsRoutes = registerJobsRoutes;
7
7
  const path_1 = __importDefault(require("path"));
8
+ const ids_1 = require("./ids");
8
9
  const db_1 = require("./db");
9
10
  const queue_manager_1 = require("./queue-manager");
10
11
  const feature_flags_1 = require("./feature-flags");
11
12
  const types_1 = require("./types");
12
13
  const hooks_1 = require("./hooks");
13
14
  const explore_smash_1 = require("./explore-smash");
15
+ const job_spawn_idempotency_1 = require("./job-spawn-idempotency");
14
16
  const spec_models_1 = require("./spec-models");
15
17
  const provider_selection_1 = require("./provider-selection");
16
18
  const loop_runs_store_1 = require("./loop-runs-store");
17
19
  const metrics_1 = require("./metrics");
20
+ const job_listing_1 = require("./job-listing");
18
21
  const ticket_store_1 = require("./ticket-store");
19
22
  const transient_children_1 = require("./transient-children");
20
23
  const project_router_helpers_1 = require("./project-router-helpers");
@@ -45,10 +48,23 @@ function registerJobsRoutes(deps) {
45
48
  res.status(400).json({ error: 'priority must be one of: low, normal, high, critical' });
46
49
  return;
47
50
  }
51
+ if (dependsOnJobId !== undefined &&
52
+ (typeof dependsOnJobId !== 'string' || !dependsOnJobId.trim())) {
53
+ res.status(400).json({ error: 'dependsOnJobId must be a non-empty string' });
54
+ return;
55
+ }
56
+ const normalizedDependsOnJobId = typeof dependsOnJobId === 'string'
57
+ ? dependsOnJobId.trim()
58
+ : undefined;
48
59
  // profileName accepts: undefined (default resolution), null (force legacy), string (explicit)
49
60
  const normalizedProfileName = profileName === null ? null
50
61
  : typeof profileName === 'string' && profileName.trim() ? profileName.trim()
51
62
  : undefined;
63
+ const idempotencyKey = req.get('Idempotency-Key');
64
+ if (idempotencyKey !== undefined && !/^[A-Za-z0-9._:-]{1,128}$/.test(idempotencyKey)) {
65
+ res.status(400).json({ error: 'Idempotency-Key must be 1-128 URL-safe characters' });
66
+ return;
67
+ }
52
68
  // aiEngine: optional per-job provider override; must be installed on the
53
69
  // project. Omitting it runs on the project's primary provider.
54
70
  const engineCheck = (0, provider_selection_1.validateRequestedProvider)(ctx(req).project, aiEngine);
@@ -57,12 +73,42 @@ function registerJobsRoutes(deps) {
57
73
  return;
58
74
  }
59
75
  try {
60
- const job = ctx(req).queueManager.enqueue(command, priority ?? 'normal', {
61
- dependsOnJobId: dependsOnJobId || undefined,
76
+ const c = ctx(req);
77
+ const normalizedPriority = priority ?? 'normal';
78
+ const spawnFingerprint = idempotencyKey ? (0, job_spawn_idempotency_1.fingerprintJobSpawn)({
79
+ command,
80
+ priority: normalizedPriority,
81
+ dependsOnJobId: normalizedDependsOnJobId ?? null,
82
+ pipelineId: pipelineId || null,
83
+ profileName: normalizedProfileName === undefined ? '__project_default__' : normalizedProfileName,
84
+ provider: aiEngine ? engineCheck.provider : null,
85
+ }) : null;
86
+ if (idempotencyKey && spawnFingerprint) {
87
+ const existingJobId = (0, job_spawn_idempotency_1.findIdempotentJob)(c.db, idempotencyKey, spawnFingerprint);
88
+ if (existingJobId) {
89
+ res.status(202).json({ jobId: existingJobId, position: null, idempotentReplay: true });
90
+ return;
91
+ }
92
+ }
93
+ // Preassign the id and commit queued_jobs + the idempotency claim in
94
+ // QueueManager's ONE outer transaction. QueueManager broadcasts/drains
95
+ // only after that commit, so a crash can expose neither an unclaimed job
96
+ // nor a ledger entry whose job was never admitted.
97
+ const preparedJobId = idempotencyKey ? (0, ids_1.newId)() : null;
98
+ const enqueueOptions = {
99
+ dependsOnJobId: normalizedDependsOnJobId,
62
100
  pipelineId: pipelineId || undefined,
63
- profileName: normalizedProfileName,
101
+ ...(normalizedProfileName !== undefined
102
+ ? { profileName: normalizedProfileName }
103
+ : {}),
64
104
  provider: aiEngine ? engineCheck.provider : undefined,
65
- });
105
+ };
106
+ const job = idempotencyKey && spawnFingerprint && preparedJobId
107
+ ? c.queueManager.enqueue(command, normalizedPriority, enqueueOptions, {
108
+ jobId: preparedJobId,
109
+ commit: (db) => (0, job_spawn_idempotency_1.claimIdempotentJob)(db, idempotencyKey, spawnFingerprint, preparedJobId),
110
+ })
111
+ : c.queueManager.enqueue(command, normalizedPriority, enqueueOptions);
66
112
  const position = job.queuePosition ?? 0;
67
113
  res.status(202).json({ jobId: job.id, position });
68
114
  }
@@ -70,6 +116,15 @@ function registerJobsRoutes(deps) {
70
116
  if (err instanceof queue_manager_1.ClaudeNotFoundError) {
71
117
  res.status(400).json({ error: err.message });
72
118
  }
119
+ else if (err instanceof queue_manager_1.InvalidJobDependencyError) {
120
+ res.status(409).json({ error: err.message });
121
+ }
122
+ else if (err instanceof job_spawn_idempotency_1.JobSpawnIdempotencyReplayError) {
123
+ res.status(202).json({ jobId: err.jobId, position: null, idempotentReplay: true });
124
+ }
125
+ else if (err instanceof job_spawn_idempotency_1.JobSpawnIdempotencyConflictError) {
126
+ res.status(409).json({ error: err.message });
127
+ }
73
128
  else {
74
129
  console.error('[project-router] spawn error:', err);
75
130
  res.status(500).json({ error: 'Internal server error' });
@@ -227,7 +282,10 @@ function registerJobsRoutes(deps) {
227
282
  const allowed = (0, spec_models_1.getModelsForProvider)(provider);
228
283
  res.json({ model, provider, allowed, providers: project.providers });
229
284
  });
230
- router.delete('/:projectId/jobs/:id', (req, res) => {
285
+ // Cancellation is idempotent and intentionally separate from history
286
+ // deletion. A stale UI request that races with natural completion must never
287
+ // erase the just-finished job and its telemetry.
288
+ router.post('/:projectId/jobs/:id/cancel', (req, res) => {
231
289
  const id = req.params.id;
232
290
  const c = ctx(req);
233
291
  // A loop run is backed by a job row but is NOT a QueueManager job — it is
@@ -249,17 +307,21 @@ function registerJobsRoutes(deps) {
249
307
  // the loop is still executing — cancel through the engine instead of
250
308
  // 404ing with a live child (the mission-modal "cancel did nothing" bug).
251
309
  const loopRun = (0, loop_runs_store_1.getLoopRun)(c.db, id);
252
- if (loopRun && (loopRun.status === 'running' || loopRun.status === 'paused') && c.loopRunManager) {
253
- c.loopRunManager.cancel(id);
254
- res.json({ ok: true, status: 'canceling' });
255
- return;
310
+ if (loopRun) {
311
+ if ((loopRun.status === 'running' || loopRun.status === 'paused') && c.loopRunManager) {
312
+ c.loopRunManager.cancel(id);
313
+ res.json({ ok: true, status: 'canceling' });
314
+ return;
315
+ }
316
+ if (loopRun.status === 'completed') {
317
+ res.json({ ok: true, status: 'already_terminal' });
318
+ return;
319
+ }
256
320
  }
257
321
  res.status(404).json({ error: 'Job not found' });
258
322
  }
259
323
  else if (err instanceof queue_manager_1.JobAlreadyTerminalError) {
260
- // Job already finished — delete it from the DB
261
- (0, db_1.deleteJob)(ctx(req).db, req.params.id);
262
- res.json({ ok: true, status: 'deleted' });
324
+ res.json({ ok: true, status: 'already_terminal' });
263
325
  }
264
326
  else {
265
327
  // Surface the real error (name/message/stack) so an unexpected cancel
@@ -271,6 +333,33 @@ function registerJobsRoutes(deps) {
271
333
  }
272
334
  }
273
335
  });
336
+ // Explicit history deletion. Active work must be canceled through the
337
+ // idempotent endpoint above and can only be deleted after it is terminal.
338
+ router.delete('/:projectId/jobs/:id', (req, res) => {
339
+ const id = req.params.id;
340
+ const c = ctx(req);
341
+ const job = (0, db_1.getJob)(c.db, id);
342
+ if (!job) {
343
+ res.status(404).json({ error: 'Job not found' });
344
+ return;
345
+ }
346
+ if (job.status === 'running' || job.status === 'queued') {
347
+ res.status(409).json({ error: 'Active jobs must be canceled before deletion' });
348
+ return;
349
+ }
350
+ try {
351
+ (0, db_1.deleteJob)(c.db, id);
352
+ res.json({ ok: true, status: 'deleted' });
353
+ }
354
+ catch (err) {
355
+ if (err instanceof db_1.JobRecoveryPendingError) {
356
+ res.status(409).json({ error: err.message, code: 'job_recovery_pending' });
357
+ return;
358
+ }
359
+ console.error(`[jobs] delete ${id} failed:`, err);
360
+ res.status(500).json({ error: 'Failed to delete job' });
361
+ }
362
+ });
274
363
  // ─── Interactive jobs (manager-agnostic) ───────────────────────────────────
275
364
  // Send one more user prompt to a running interactive job (queued behind the
276
365
  // active turn — see InteractiveJobSession). The job row may be owned by
@@ -374,46 +463,12 @@ function registerJobsRoutes(deps) {
374
463
  // Clamp to [1, 200] (H-11): a negative limit is LIMIT -1 in SQLite, which
375
464
  // means UNLIMITED — without the lower bound `?limit=-1` dumps the whole table.
376
465
  const limit = Math.max(1, Math.min(parseInt(String(req.query.limit ?? '50'), 10) || 50, 200));
377
- const offset = parseInt(String(req.query.offset ?? '0'), 10) || 0;
466
+ const offset = Math.max(0, parseInt(String(req.query.offset ?? '0'), 10) || 0);
378
467
  const status = req.query.status;
379
468
  const from = req.query.from;
380
469
  const to = req.query.to;
381
470
  const { db } = ctx(req);
382
- const result = (0, db_1.listJobs)(db, { limit, offset, status, from, to });
383
- // Merge in-memory queued jobs that haven't been persisted to DB yet
384
- const { queueManager } = ctx(req);
385
- const dbIds = new Set(result.jobs.map((j) => j.id));
386
- const queuedRows = queueManager
387
- .getJobs()
388
- .filter((j) => j.status === 'queued' && !dbIds.has(j.id))
389
- .filter((j) => !status || j.status === status)
390
- .map((j) => ({
391
- id: j.id,
392
- command: j.command,
393
- started_at: j.startedAt ?? new Date().toISOString(),
394
- finished_at: j.finishedAt,
395
- status: j.status,
396
- exit_code: j.exitCode,
397
- queue_position: j.queuePosition,
398
- priority: j.priority,
399
- tokens_in: null,
400
- tokens_out: null,
401
- tokens_cache_read: null,
402
- tokens_cache_create: null,
403
- total_cost_usd: null,
404
- num_turns: null,
405
- model: null,
406
- duration_ms: null,
407
- duration_api_ms: null,
408
- session_id: null,
409
- depends_on_job_id: j.dependsOnJobId,
410
- pipeline_id: j.pipelineId,
411
- skip_reason: j.skipReason,
412
- }));
413
- if (queuedRows.length > 0) {
414
- result.jobs = [...queuedRows, ...result.jobs];
415
- result.total += queuedRows.length;
416
- }
471
+ const result = (0, job_listing_1.listUnifiedJobs)(db, { limit, offset, status, from, to });
417
472
  // Annotate each job with hasTelemetry so the client can show the
418
473
  // Export diagnostic button without an extra round trip.
419
474
  const jobsWithTelemetry = (0, db_1.getJobsWithTelemetry)(db);
@@ -518,19 +573,20 @@ function registerJobsRoutes(deps) {
518
573
  const jobId = req.params.id;
519
574
  const job = (0, db_1.getJob)(db, jobId);
520
575
  if (!job) {
521
- // Queued jobs live only in memory until spawn time (createJob runs on spawn,
522
- // not enqueue). Fall back to the in-memory queue so /jobs/:id returns a
523
- // usable payload instead of 404 — the detail page then renders a "queued"
524
- // state and flips to live logs via WS once the job starts.
576
+ // Queued jobs have a durable admission timestamp but no execution start.
577
+ // Prefer SQLite so repeated detail reads return the same enqueued_at;
578
+ // retain the in-memory fallback only for non-project/test managers.
579
+ const durableQueued = (0, job_listing_1.getQueuedJobForListing)(db, jobId);
525
580
  const inMemory = queueManager.getJobs().find((j) => j.id === jobId);
526
- if (!inMemory) {
581
+ if (!durableQueued && !inMemory) {
527
582
  res.status(404).json({ error: 'Job not found' });
528
583
  return;
529
584
  }
530
- const synthetic = {
585
+ const synthetic = durableQueued ?? {
531
586
  id: inMemory.id,
532
587
  command: inMemory.command,
533
- started_at: inMemory.startedAt ?? '',
588
+ started_at: null,
589
+ enqueued_at: null,
534
590
  finished_at: inMemory.finishedAt,
535
591
  status: inMemory.status,
536
592
  exit_code: inMemory.exitCode,
@@ -57,6 +57,7 @@ const ticket_store_1 = require("./ticket-store");
57
57
  const explore_draft_title_1 = require("./explore-draft-title");
58
58
  const cli_prompt_1 = require("./util/cli-prompt");
59
59
  const transient_children_1 = require("./transient-children");
60
+ const process_admission_1 = require("./process-admission");
60
61
  const readline_1 = require("readline");
61
62
  const tree_kill_1 = __importDefault(require("tree-kill"));
62
63
  const workspace_resolution_1 = require("./workspace-resolution");
@@ -176,6 +177,7 @@ function registerTicketsRoutes(deps) {
176
177
  }
177
178
  const requestId = (0, ids_1.newId)();
178
179
  const projectId = project.id;
180
+ const admission = (0, process_admission_1.captureProcessAdmission)(projectId);
179
181
  const filePath = ticketPath(req);
180
182
  let hasAttachments = false;
181
183
  let baseUserPrompt = `Generate a spec for the following idea:\n\n${idea.trim()}`;
@@ -193,6 +195,10 @@ function registerTicketsRoutes(deps) {
193
195
  console.error('[project-router] generate-spec attachment extraction error:', err);
194
196
  }
195
197
  }
198
+ if (!admission.isCurrent()) {
199
+ res.status(409).json({ error: 'Project is being removed' });
200
+ return;
201
+ }
196
202
  // Parse contextScope from body. Quick and Explore share the same Context
197
203
  // Awareness controls; Quick still keeps Contract Refine as a top-level
198
204
  // field for the refine scheduler.
@@ -325,6 +331,8 @@ function registerTicketsRoutes(deps) {
325
331
  }
326
332
  catch { /* best-effort */ }
327
333
  }
334
+ if (!admission.isCurrent())
335
+ return;
328
336
  broadcast({
329
337
  type: 'spec_gen_error', projectId, requestId,
330
338
  error: `Spec generation timed out after ${Math.round(GENERATE_SPEC_TIMEOUT_MS / 1000)}s`,
@@ -355,6 +363,8 @@ function registerTicketsRoutes(deps) {
355
363
  child.on('error', (err) => {
356
364
  clearSpecGenWatchdog();
357
365
  console.error(`[project-router] spec-gen spawn failed (${binary}): ${err.message}`);
366
+ if (!admission.isCurrent())
367
+ return;
358
368
  const errMsg = {
359
369
  type: 'spec_gen_error', projectId, requestId,
360
370
  error: `Failed to launch ${binary}: ${err.message}`,
@@ -374,6 +384,8 @@ function registerTicketsRoutes(deps) {
374
384
  const turnStartedAt = new Date().toISOString();
375
385
  const stdoutReader = (0, readline_1.createInterface)({ input: child.stdout, crlfDelay: Infinity });
376
386
  stdoutReader.on('line', (line) => {
387
+ if (!admission.isCurrent())
388
+ return;
377
389
  const adapterEv = adapter.parseStreamLine(line);
378
390
  if (adapterEv)
379
391
  adapterEvents.push(adapterEv);
@@ -454,6 +466,8 @@ function registerTicketsRoutes(deps) {
454
466
  });
455
467
  child.on('close', async (code) => {
456
468
  clearSpecGenWatchdog();
469
+ if (!admission.isCurrent())
470
+ return;
457
471
  let createdTicketId = null;
458
472
  // When claude burns its whole --max-turns budget it exits non-zero with
459
473
  // a result event of subtype:error_max_turns — but it may already have
@@ -539,6 +553,8 @@ function registerTicketsRoutes(deps) {
539
553
  catch (err) {
540
554
  console.error('[project-router] generate-spec attachment migration error:', err);
541
555
  }
556
+ if (!admission.isCurrent())
557
+ return;
542
558
  }
543
559
  const ticketMsg = {
544
560
  type: 'ticket_created', ticket: created,
@@ -566,6 +582,8 @@ function registerTicketsRoutes(deps) {
566
582
  const refineDescription = created.description;
567
583
  const refineModel = req.body?.model ?? null;
568
584
  process.nextTick(() => {
585
+ if (!admission.isCurrent())
586
+ return;
569
587
  void (0, contract_refine_runner_1.runContractRefineForQuick)({
570
588
  db: ctx(req).db,
571
589
  projectId: project.id,
@@ -1576,6 +1594,7 @@ function registerTicketsRoutes(deps) {
1576
1594
  const adapter = (0, providers_1.getAdapter)(provider);
1577
1595
  const requestId = (0, ids_1.newId)();
1578
1596
  const projectId = project.id;
1597
+ const admission = (0, process_admission_1.captureProcessAdmission)(projectId);
1579
1598
  // Model used for the spawn (claude runs its CLI default, codex is pinned to
1580
1599
  // gpt-5.5, other providers use the adapter default). Used only as the
1581
1600
  // fallback model for cost accounting when the stream carries none.
@@ -1594,7 +1613,7 @@ function registerTicketsRoutes(deps) {
1594
1613
  `- The SHORT-SUMMARY line MUST always be present. If the user's refinement does not change what the spec is about, keep the previous summary verbatim. Never omit the line.\n` +
1595
1614
  `- After the SHORT-SUMMARY line and blank line, output ONLY the modified description in markdown. No preamble, no explanation, no wrapping.\n` +
1596
1615
  `- Preserve the existing markdown structure and section headings in the description.\n` +
1597
- `- If the user asks to add technical details, briefly check CLAUDE.md and the project directory structure (ls, not deep reads) to ground your edits.\n` +
1616
+ `- If the user asks to add technical details, briefly check CLAUDE.md and the project directory structure with Read, Grep, or Glob (not deep reads) to ground your edits.\n` +
1598
1617
  `- Keep it concise and actionable.\n` +
1599
1618
  `- Do NOT create files, tickets, or issues. Only output text.`;
1600
1619
  const refinementRule = isRefinement
@@ -1629,6 +1648,10 @@ function registerTicketsRoutes(deps) {
1629
1648
  console.error('[project-router] ai-edit attachment extraction error:', err);
1630
1649
  }
1631
1650
  }
1651
+ if (!admission.isCurrent()) {
1652
+ res.status(409).json({ error: 'Project is being removed' });
1653
+ return;
1654
+ }
1632
1655
  let binary;
1633
1656
  let args;
1634
1657
  if (provider === 'codex') {
@@ -1640,7 +1663,9 @@ function registerTicketsRoutes(deps) {
1640
1663
  binary = 'claude';
1641
1664
  args = [
1642
1665
  '--dangerously-skip-permissions',
1643
- '--tools', 'default',
1666
+ // AI Edit may ground prose in the repo, but it never needs shell,
1667
+ // network, MCP, or filesystem mutation authority.
1668
+ '--tools', 'Read,Grep,Glob',
1644
1669
  '--output-format', 'stream-json',
1645
1670
  '--verbose',
1646
1671
  '--max-turns', '4',
@@ -1667,6 +1692,7 @@ function registerTicketsRoutes(deps) {
1667
1692
  stdio: ['ignore', 'pipe', 'pipe'],
1668
1693
  cwd: project.path,
1669
1694
  });
1695
+ (0, transient_children_1.trackTransientChild)(projectId, child);
1670
1696
  _aiEditProcesses.set(requestId, child);
1671
1697
  // Pipe stderr to server log so failures surface for debugging.
1672
1698
  let aiEditStderrBuf = '';
@@ -1683,6 +1709,8 @@ function registerTicketsRoutes(deps) {
1683
1709
  child.on('error', (err) => {
1684
1710
  console.error(`[project-router] ai-edit spawn failed (${binary}): ${err.message}`);
1685
1711
  _aiEditProcesses.delete(requestId);
1712
+ if (!admission.isCurrent())
1713
+ return;
1686
1714
  const errMsg = {
1687
1715
  type: 'ticket_ai_edit_error', projectId, ticketId: Number(ticketId),
1688
1716
  requestId, error: `Failed to launch ${binary}: ${err.message}`,
@@ -1755,6 +1783,8 @@ function registerTicketsRoutes(deps) {
1755
1783
  });
1756
1784
  child.on('close', (code) => {
1757
1785
  _aiEditProcesses.delete(requestId);
1786
+ if (!admission.isCurrent())
1787
+ return;
1758
1788
  const delivered = code === 0 && buffer.trim().length > 0;
1759
1789
  if (delivered) {
1760
1790
  const msg = {
@@ -42,17 +42,8 @@ function normaliseModel(model) {
42
42
  return model || 'sonnet';
43
43
  }
44
44
  }
45
- /** Default arg block every claude spawn shares. `--setting-sources` is appended
46
- * separately per-spawn (see `commonFlagsFor`) because its value depends on
47
- * whether the caller opted into loading the user's full Claude environment. */
48
- const COMMON_FLAGS = [
49
- '--dangerously-skip-permissions',
50
- '--tools', 'default',
51
- '--output-format', 'stream-json',
52
- '--verbose',
53
- ];
54
45
  /**
55
- * COMMON_FLAGS + the `--setting-sources` value for this spawn.
46
+ * Common flags + the effective tool boundary for this spawn.
56
47
  *
57
48
  * Default (`project,local`) isolates app-spawned claude from the *user's*
58
49
  * global Claude config. Without this, the child loads ~/.claude (user CLAUDE.md
@@ -68,8 +59,23 @@ const COMMON_FLAGS = [
68
59
  * CLAUDE.md + hooks, which is the user's explicit opt-in via the toggle.
69
60
  */
70
61
  function commonFlagsFor(opts) {
62
+ const toolPolicy = opts.toolPolicy ?? 'default';
63
+ const toolArgs = toolPolicy === 'none'
64
+ // Claude silently drops an empty tool list on some versions and falls back
65
+ // to the default toolkit. A non-existent sentinel is the established,
66
+ // tested way this repo disables every tool (see context-scope.ts).
67
+ ? ['--tools', '__none__']
68
+ : toolPolicy === 'read-only'
69
+ ? ['--tools', 'Read,Grep,Glob']
70
+ : ['--tools', 'default'];
71
71
  return [
72
- ...COMMON_FLAGS,
72
+ // No approval bypass is necessary when no tool can be invoked. Keeping it
73
+ // off also makes the pure-output boundary fail closed if Claude ever
74
+ // changes how it interprets the sentinel.
75
+ ...(toolPolicy === 'none' ? [] : ['--dangerously-skip-permissions']),
76
+ ...toolArgs,
77
+ '--output-format', 'stream-json',
78
+ '--verbose',
73
79
  '--setting-sources',
74
80
  opts.loadUserEnv ? 'user,project,local' : 'project,local',
75
81
  // Native reasoning-effort flag (claude CLI accepts low|medium|high|xhigh|max).
@@ -80,7 +86,9 @@ function commonFlagsFor(opts) {
80
86
  function buildClaudeArgs(action, opts) {
81
87
  const args = [];
82
88
  const model = normaliseModel(opts.model);
83
- const commonFlags = commonFlagsFor(opts);
89
+ // Titles are unconditionally pure-output. Centralising the policy here keeps
90
+ // both ChatManager and AgentChatManager from accidentally regaining tools.
91
+ const commonFlags = commonFlagsFor(action === 'auto-title' ? { ...opts, toolPolicy: 'none' } : opts);
84
92
  switch (action) {
85
93
  case 'chat-turn': {
86
94
  args.push('--model', model);
@@ -151,7 +159,7 @@ function buildClaudeArgs(action, opts) {
151
159
  if (opts.maxTurns != null)
152
160
  args.push('--max-turns', String(opts.maxTurns));
153
161
  // Caller passes --tools override via extraArgs when scoped; otherwise
154
- // 'default' from COMMON_FLAGS applies.
162
+ // the default policy from commonFlagsFor applies.
155
163
  if (opts.systemPrompt)
156
164
  args.push('--system-prompt', opts.systemPrompt);
157
165
  args.push('-p', opts.prompt);