specrails-desktop 2.36.0 → 2.42.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 (510) hide show
  1. package/README.md +94 -247
  2. package/client/dist/assets/ActivityFeedPage-DoEMumQS.js +1 -0
  3. package/client/dist/assets/AgentBrowserCapture-DIh4K0gh.js +1 -0
  4. package/client/dist/assets/AgentModeAnalyticsPane-mbq4WEoO.js +2 -0
  5. package/client/dist/assets/AgentModeCodePane-CKh7zuA4.js +2 -0
  6. package/client/dist/assets/AgentModeJobsPane-BDokPiLJ.js +1 -0
  7. package/client/dist/assets/AgentsPage-BFVAZbBj.js +87 -0
  8. package/client/dist/assets/AnalyticsPage-3Y9LuWwz.js +1 -0
  9. package/client/dist/assets/CodePage-C9KyuV_C.js +3 -0
  10. package/client/dist/assets/DesktopAnalyticsPage-Bhi54bXQ.js +1 -0
  11. package/client/dist/assets/{DocsDialog-C76VdBJC.js → DocsDialog-Dj6mt4ga.js} +2 -2
  12. package/client/dist/assets/{DocsPage-ziMlj6B6.js → DocsPage-24yWglNI.js} +1 -1
  13. package/client/dist/assets/ExportDropdown-ophapHrT.js +1 -0
  14. package/client/dist/assets/InteractiveJobComposer-C1ucmxQh.js +19 -0
  15. package/client/dist/assets/JobDetailModal-DNWmgVHD.js +1 -0
  16. package/client/dist/assets/JobDetailPage-BcajZyuu.js +1 -0
  17. package/client/dist/assets/JobsPage-B9nTZw6e.js +1 -0
  18. package/client/dist/assets/LoopBuilderPage-Oc48iOFW.js +7 -0
  19. package/client/dist/assets/LoopPreviewModal-ae0Fr6SU.js +1 -0
  20. package/client/dist/assets/LoopsPage-CUEqzUBI.js +1 -0
  21. package/client/dist/assets/MinimizedChatsContext-Deg39peL.js +1 -0
  22. package/client/dist/assets/PluginsPage-C1xtARIx.js +2 -0
  23. package/client/dist/assets/ProjectSettingsDialog-JZzrXFBN.js +1 -0
  24. package/client/dist/assets/RepositoryDeliveries-CSDsiVUz.js +5 -0
  25. package/client/dist/assets/RepositoryScopeSelector-D-RCaknl.js +1 -0
  26. package/client/dist/assets/ReviewPacketPage-x5EfGTiL.js +1 -0
  27. package/client/dist/assets/TemplatePreviewModal-BSyuZxGq.js +1 -0
  28. package/client/dist/assets/TicketDetailModalContext-DqyF0so-.js +14 -0
  29. package/client/dist/assets/Trans-SnMX4MhW.js +1 -0
  30. package/client/dist/assets/agent-BdT0SB1D.js +1 -0
  31. package/client/dist/assets/agent-Bh9K7iEt.js +1 -0
  32. package/client/dist/assets/agent-C4ibdFk9.js +1 -0
  33. package/client/dist/assets/agent-CSFY22Zo.js +1 -0
  34. package/client/dist/assets/agent-DAnqxUn8.js +1 -0
  35. package/client/dist/assets/agent-DTQiu0Mi.js +1 -0
  36. package/client/dist/assets/agent-T54WuR_Y.js +1 -0
  37. package/client/dist/assets/agent-i75WDZOA.js +1 -0
  38. package/client/dist/assets/browser-05vRDg_y.js +1 -0
  39. package/client/dist/assets/browser-Bulb-cB1.js +1 -0
  40. package/client/dist/assets/browser-C7f-Jsg1.js +1 -0
  41. package/client/dist/assets/browser-CG0PE1j_.js +1 -0
  42. package/client/dist/assets/browser-CMzaqAjo.js +1 -0
  43. package/client/dist/assets/browser-DMajYdNX.js +1 -0
  44. package/client/dist/assets/browser-DxcOHrdP.js +1 -0
  45. package/client/dist/assets/browser-ObE7xVo3.js +1 -0
  46. package/client/dist/assets/builder-765NeYTp.js +1 -0
  47. package/client/dist/assets/builder-8MG3V6ea.js +1 -0
  48. package/client/dist/assets/builder-B-1UBs5K.js +1 -0
  49. package/client/dist/assets/builder-BTiGnPT0.js +1 -0
  50. package/client/dist/assets/builder-Cx9Rz-7u.js +1 -0
  51. package/client/dist/assets/builder-DKFMELBl.js +1 -0
  52. package/client/dist/assets/builder-OcmKrC0h.js +1 -0
  53. package/client/dist/assets/builder-P9qVBXFZ.js +1 -0
  54. package/client/dist/assets/{button-CJqFnUOL.js → button-DCBqEaZl.js} +1 -1
  55. package/client/dist/assets/{code-CkUuW4m9.js → code-B37GRg9C.js} +1 -1
  56. package/client/dist/assets/{code-B0O8-p8k.js → code-BBOEZbf9.js} +1 -1
  57. package/client/dist/assets/{code-B1VLZDhS.js → code-BRm-jcyx.js} +1 -1
  58. package/client/dist/assets/{code-Bpj4Ddml.js → code-CF7w62CR.js} +1 -1
  59. package/client/dist/assets/{code-BykBZ5-e.js → code-CLuvJt2r.js} +1 -1
  60. package/client/dist/assets/{code-B86IMAfz.js → code-D0RCm59f.js} +1 -1
  61. package/client/dist/assets/code-DaZ-ZwCT.js +1 -0
  62. package/client/dist/assets/{code-cAqaqMTx.js → code-iIHkGaCL.js} +1 -1
  63. package/client/dist/assets/commands-0XjAftla.js +1 -0
  64. package/client/dist/assets/commands-BAWSYHjQ.js +1 -0
  65. package/client/dist/assets/commands-BBwowgiE.js +1 -0
  66. package/client/dist/assets/commands-BacjIZLN.js +1 -0
  67. package/client/dist/assets/commands-Bs62IAZ3.js +1 -0
  68. package/client/dist/assets/commands-CLPdh-Hh.js +1 -0
  69. package/client/dist/assets/commands-DlbFzgrp.js +1 -0
  70. package/client/dist/assets/commands-LjPSsi5F.js +1 -0
  71. package/client/dist/assets/common-B5AZNYMH.js +1 -0
  72. package/client/dist/assets/common-BFZ0c_vN.js +1 -0
  73. package/client/dist/assets/common-BrlwEnL7.js +1 -0
  74. package/client/dist/assets/common-BttQx3z4.js +1 -0
  75. package/client/dist/assets/common-CM65k_-e.js +1 -0
  76. package/client/dist/assets/common-D4mvFFlu.js +1 -0
  77. package/client/dist/assets/common-TZ9Ny96S.js +1 -0
  78. package/client/dist/assets/common-nFpSF4GC.js +1 -0
  79. package/client/dist/assets/dashboard-B14uYXkG.js +1 -0
  80. package/client/dist/assets/dashboard-BK_mez-z.js +1 -0
  81. package/client/dist/assets/dashboard-BfBir_6o.js +1 -0
  82. package/client/dist/assets/dashboard-Bt0cCzeG.js +1 -0
  83. package/client/dist/assets/dashboard-BwkjxI6H.js +1 -0
  84. package/client/dist/assets/{dashboard-C8WOEiPu.js → dashboard-C3bDKf7s.js} +1 -1
  85. package/client/dist/assets/dashboard-CdvjGfog.js +1 -0
  86. package/client/dist/assets/dashboard-fRrP0Kv0.js +1 -0
  87. package/client/dist/assets/dialog-SRw01_QU.js +45 -0
  88. package/client/dist/assets/dist-js-CJ_2XX1Y.js +1 -0
  89. package/client/dist/assets/formatDistanceToNow-DSj5DprF.js +1 -0
  90. package/client/dist/assets/getTimezoneOffsetInMilliseconds-YhD8rIEs.js +1 -0
  91. package/client/dist/assets/index-DwAmL7m5.css +2 -0
  92. package/client/dist/assets/index-EzrkUb8B.js +76 -0
  93. package/client/dist/assets/{jira-api-B1-MUehg.js → jira-api-CSCqGr-Q.js} +1 -1
  94. package/client/dist/assets/{jobs-CN_zv4Gr.js → jobs-B8rrzfyZ.js} +1 -1
  95. package/client/dist/assets/{jobs-DUlWSYq2.js → jobs-BS6RTurf.js} +1 -1
  96. package/client/dist/assets/{jobs-Bpks6doU.js → jobs-BTT0Bsks.js} +1 -1
  97. package/client/dist/assets/{jobs-Bgq-PZkC.js → jobs-CezU69AE.js} +1 -1
  98. package/client/dist/assets/{jobs-SwYS2M-B.js → jobs-ClFJae0s.js} +1 -1
  99. package/client/dist/assets/{jobs-BAls3bWq.js → jobs-DJSFIFVy.js} +1 -1
  100. package/client/dist/assets/{jobs-DhxKgWFq.js → jobs-DhgGr8vm.js} +1 -1
  101. package/client/dist/assets/{jobs-B_TeSQxb.js → jobs-DzMjUcaN.js} +1 -1
  102. package/client/dist/assets/mcp-6rMoZfEO.js +1 -0
  103. package/client/dist/assets/mcp-BD8sL5mP.js +1 -0
  104. package/client/dist/assets/mcp-BkcA3I5s.js +1 -0
  105. package/client/dist/assets/mcp-CCpSelOh.js +1 -0
  106. package/client/dist/assets/mcp-CUAN6ORK.js +1 -0
  107. package/client/dist/assets/mcp-CqbRxRTE.js +1 -0
  108. package/client/dist/assets/mcp-DP2YfVhO.js +1 -0
  109. package/client/dist/assets/mcp-DUVQamDz.js +1 -0
  110. package/client/dist/assets/narration-B-ynWTpn.js +1 -0
  111. package/client/dist/assets/narration-Bj_laZwg.js +1 -0
  112. package/client/dist/assets/narration-BxHpmMv_.js +1 -0
  113. package/client/dist/assets/narration-C1Px0-0j.js +1 -0
  114. package/client/dist/assets/narration-CAXhGbzM.js +1 -0
  115. package/client/dist/assets/narration-DQ1l_Kq6.js +1 -0
  116. package/client/dist/assets/narration-XISXwqZd.js +1 -0
  117. package/client/dist/assets/narration-kwzfglQo.js +1 -0
  118. package/client/dist/assets/nav-1-Hh2kOz.js +1 -0
  119. package/client/dist/assets/nav-B34QkESm.js +1 -0
  120. package/client/dist/assets/nav-Bap_UXAq.js +1 -0
  121. package/client/dist/assets/{nav-pYuXq7sf.js → nav-BwxXIB24.js} +1 -1
  122. package/client/dist/assets/nav-Ch-zHBG5.js +1 -0
  123. package/client/dist/assets/nav-CygC_WN-.js +1 -0
  124. package/client/dist/assets/{nav-iwjCg5FR.js → nav-KnnLQtOQ.js} +1 -1
  125. package/client/dist/assets/nav-m00uxYUG.js +1 -0
  126. package/client/dist/assets/packet-BQ2tXfJI.js +1 -0
  127. package/client/dist/assets/packet-BdpOJ1Cy.js +1 -0
  128. package/client/dist/assets/packet-C3Ievb9R.js +1 -0
  129. package/client/dist/assets/packet-C4zJIG0Y.js +1 -0
  130. package/client/dist/assets/packet-Cx-zRuWn.js +1 -0
  131. package/client/dist/assets/packet-DUTGX52M.js +1 -0
  132. package/client/dist/assets/packet-DhsKtUPB.js +1 -0
  133. package/client/dist/assets/packet-z3LJ8Zyy.js +1 -0
  134. package/client/dist/assets/project-repositories-DYhTvwQ1.js +1 -0
  135. package/client/dist/assets/provider-capabilities-B-wOHfLP.js +1 -0
  136. package/client/dist/assets/settings-BBt2xtDQ.js +1 -0
  137. package/client/dist/assets/settings-BJB9RKJj.js +1 -0
  138. package/client/dist/assets/settings-CHwQR2rB.js +1 -0
  139. package/client/dist/assets/settings-CrMi3kSi.js +1 -0
  140. package/client/dist/assets/settings-DKyhDGD1.js +1 -0
  141. package/client/dist/assets/settings-Deupji9c.js +1 -0
  142. package/client/dist/assets/settings-DqRMmwAM.js +1 -0
  143. package/client/dist/assets/settings-J4rj6vo-.js +1 -0
  144. package/client/dist/assets/setup-2xGgu4Sk.js +1 -0
  145. package/client/dist/assets/setup-Ba11l2JA.js +1 -0
  146. package/client/dist/assets/setup-BzW4kMok.js +1 -0
  147. package/client/dist/assets/setup-COzwYhkJ.js +1 -0
  148. package/client/dist/assets/setup-CRVULhtF.js +1 -0
  149. package/client/dist/assets/setup-DgvlxwpE.js +1 -0
  150. package/client/dist/assets/setup-Dw_wYeEY.js +1 -0
  151. package/client/dist/assets/setup-ZPtEeJPW.js +1 -0
  152. package/client/dist/assets/spending-BqbdPm_4.js +1 -0
  153. package/client/dist/assets/square-Ci-PFcFe.js +1 -0
  154. package/client/dist/assets/{terminal-BFRZnMPP.js → terminal-BAzpHtpY.js} +1 -1
  155. package/client/dist/assets/{terminal-IahE4LW9.js → terminal-C7dHeR3x.js} +1 -1
  156. package/client/dist/assets/{terminal-tITa81iz.js → terminal-CMla5Qsz.js} +1 -1
  157. package/client/dist/assets/{terminal-BZiIu3rf.js → terminal-CdNXH-n9.js} +1 -1
  158. package/client/dist/assets/{terminal-ScjyXNxQ.js → terminal-Cw5bZsmV.js} +1 -1
  159. package/client/dist/assets/{terminal-C2NAd7BW.js → terminal-DFUP4eNv.js} +1 -1
  160. package/client/dist/assets/{terminal-d7GadXbN.js → terminal-DGqljeK_.js} +1 -1
  161. package/client/dist/assets/{terminal-QpXZU2Bn.js → terminal-cU70NodO.js} +1 -1
  162. package/client/dist/assets/useDesktop-RSMTyy7V.js +1 -0
  163. package/client/dist/assets/useSharedWebSocket-BOdS5_Iz.js +2 -0
  164. package/client/dist/index.html +34 -35
  165. package/docs/README.md +3 -0
  166. package/docs/agent-live-steering.md +57 -0
  167. package/docs/ci-cd.md +57 -0
  168. package/docs/code-explorer.md +48 -0
  169. package/docs/codex.md +12 -1
  170. package/docs/features/detachable-mission-windows.md +59 -0
  171. package/docs/guide/de/integrations/5-mcp-server.md +13 -9
  172. package/docs/guide/de/integrations/6-agent-chat.md +1 -0
  173. package/docs/guide/en/integrations/5-mcp-server.md +13 -9
  174. package/docs/guide/en/integrations/6-agent-chat.md +1 -0
  175. package/docs/guide/es/integrations/5-mcp-server.md +13 -9
  176. package/docs/guide/es/integrations/6-agent-chat.md +1 -0
  177. package/docs/guide/fr/integrations/5-mcp-server.md +13 -9
  178. package/docs/guide/fr/integrations/6-agent-chat.md +1 -0
  179. package/docs/guide/it/integrations/5-mcp-server.md +13 -9
  180. package/docs/guide/it/integrations/6-agent-chat.md +1 -0
  181. package/docs/guide/ja/integrations/5-mcp-server.md +13 -9
  182. package/docs/guide/ja/integrations/6-agent-chat.md +1 -0
  183. package/docs/guide/pt/integrations/5-mcp-server.md +13 -9
  184. package/docs/guide/pt/integrations/6-agent-chat.md +1 -0
  185. package/docs/guide/zh/integrations/5-mcp-server.md +13 -9
  186. package/docs/guide/zh/integrations/6-agent-chat.md +1 -0
  187. package/docs/internals/README.md +1 -0
  188. package/docs/internals/browser-capture-performance.md +55 -3
  189. package/docs/internals/browser-login-popups.md +45 -0
  190. package/docs/internals/browser-native-retina-audit.md +39 -0
  191. package/docs/internals/ci-cd-audit.md +39 -0
  192. package/docs/internals/core-runtime-updates.md +68 -0
  193. package/docs/internals/embedded-browser-native-webview-evaluation.md +2 -0
  194. package/docs/internals/implementation-reliability-audit.md +93 -0
  195. package/docs/internals/interactive-jobs.md +110 -6
  196. package/docs/internals/mcp-mission-audit.md +76 -0
  197. package/docs/internals/project-builder.md +404 -42
  198. package/docs/internals/safe-pr-review-flow.md +52 -10
  199. package/docs/internals/startup-recovery-audit.md +58 -0
  200. package/docs/mcp.md +74 -41
  201. package/docs/mission-processes.md +59 -0
  202. package/docs/multi-repo-projects.md +51 -0
  203. package/docs/platforms/windows-parity.md +70 -0
  204. package/docs/platforms/windows.md +13 -11
  205. package/docs/running-pipelines.md +14 -0
  206. package/mcp-bridge/dist/specrails-mcp.js +7186 -0
  207. package/package.json +9 -4
  208. package/server/dist/agent-chat-manager.js +537 -68
  209. package/server/dist/agent-chat-router.js +87 -6
  210. package/server/dist/agent-context-resolver.js +129 -25
  211. package/server/dist/agent-defaults.js +19 -11
  212. package/server/dist/agent-input-store.js +206 -0
  213. package/server/dist/agent-mcp-config.js +54 -15
  214. package/server/dist/agent-operator-prompt.js +255 -65
  215. package/server/dist/agent-spec-framing.js +202 -0
  216. package/server/dist/agent-steering.js +218 -0
  217. package/server/dist/agent-store.js +153 -0
  218. package/server/dist/api-not-found.js +8 -0
  219. package/server/dist/background-process-control.js +164 -0
  220. package/server/dist/background-process-service.js +61 -0
  221. package/server/dist/background-process-store.js +242 -0
  222. package/server/dist/background-windows-bootstrap.js +238 -0
  223. package/server/dist/blueprint-chat-manager.js +476 -62
  224. package/server/dist/blueprint-commit.js +21 -1
  225. package/server/dist/blueprint-draft-parser.js +122 -17
  226. package/server/dist/blueprint-generation.js +238 -0
  227. package/server/dist/blueprint-operator-prompt.js +91 -63
  228. package/server/dist/blueprint-router.js +55 -3
  229. package/server/dist/blueprint-spec-fixtures.js +85 -0
  230. package/server/dist/blueprint-spec-quality.js +57 -16
  231. package/server/dist/blueprint-store.js +92 -1
  232. package/server/dist/browser-capture-manager.js +86 -30
  233. package/server/dist/browser-playwright.js +168 -45
  234. package/server/dist/browser-viewport.js +26 -0
  235. package/server/dist/chat-manager.js +23 -15
  236. package/server/dist/chromium-archive.cjs +83 -0
  237. package/server/dist/chromium-resolver.js +72 -64
  238. package/server/dist/code-activity.js +145 -0
  239. package/server/dist/code-explorer-router.js +714 -114
  240. package/server/dist/core-compat.js +28 -1
  241. package/server/dist/core-execution.js +111 -0
  242. package/server/dist/core-package.js +4 -16
  243. package/server/dist/core-runtime.js +202 -0
  244. package/server/dist/core-update-manager.js +161 -60
  245. package/server/dist/core-update-state.js +29 -0
  246. package/server/dist/db.js +66 -35
  247. package/server/dist/delivery-evidence.js +142 -39
  248. package/server/dist/desktop-db.js +239 -43
  249. package/server/dist/desktop-router.js +109 -9
  250. package/server/dist/dev-ports.js +8 -3
  251. package/server/dist/file-provenance.js +34 -22
  252. package/server/dist/file-story-manager.js +62 -64
  253. package/server/dist/file-story.js +118 -35
  254. package/server/dist/file-summary-generator.js +46 -5
  255. package/server/dist/file-summary-manager.js +355 -106
  256. package/server/dist/framework-manager.js +98 -110
  257. package/server/dist/framework-reseed.js +76 -10
  258. package/server/dist/git-diagnostics.js +2 -2
  259. package/server/dist/headroom-manager.js +38 -3
  260. package/server/dist/host-control.js +52 -0
  261. package/server/dist/index.js +43 -2
  262. package/server/dist/interactive-job-session.js +149 -16
  263. package/server/dist/internal-api.js +48 -0
  264. package/server/dist/jira/jira-materializer.js +1 -0
  265. package/server/dist/json-tolerant.js +174 -0
  266. package/server/dist/legacy-migration.js +4 -2
  267. package/server/dist/loop-command-catalog.js +83 -21
  268. package/server/dist/loop-constants.js +6 -1
  269. package/server/dist/loop-decider.js +11 -1
  270. package/server/dist/loop-executors.js +194 -45
  271. package/server/dist/loop-factory.js +11 -4
  272. package/server/dist/loop-graph.js +90 -4
  273. package/server/dist/loop-run-manager.js +301 -69
  274. package/server/dist/loop-shell-invocation.js +21 -0
  275. package/server/dist/loop-step-idle.js +55 -0
  276. package/server/dist/loop-templates.js +31 -7
  277. package/server/dist/mcp/agent-capability.js +37 -4
  278. package/server/dist/mcp/guide.js +149 -36
  279. package/server/dist/mcp/mcp-admin-router.js +20 -4
  280. package/server/dist/mcp/mcp-server.js +89 -43
  281. package/server/dist/mcp/mcp-tiers.js +6 -5
  282. package/server/dist/mcp/mcp-token.js +3 -1
  283. package/server/dist/mcp/resources.js +5 -4
  284. package/server/dist/mcp/tools/catalog.js +4 -0
  285. package/server/dist/mcp/tools/code.js +125 -14
  286. package/server/dist/mcp/tools/context.js +153 -0
  287. package/server/dist/mcp/tools/git.js +15 -5
  288. package/server/dist/mcp/tools/jobs.js +84 -71
  289. package/server/dist/mcp/tools/loops.js +17 -6
  290. package/server/dist/mcp/tools/meta.js +74 -27
  291. package/server/dist/mcp/tools/mission.js +29 -0
  292. package/server/dist/mcp/tools/projects.js +22 -6
  293. package/server/dist/mcp/tools/rails.js +48 -11
  294. package/server/dist/mcp/tools/specs.js +86 -14
  295. package/server/dist/mcp/tools/support.js +1 -1
  296. package/server/dist/mcp/tools/types.js +117 -43
  297. package/server/dist/mcp/tools/watch.js +144 -51
  298. package/server/dist/milestone-chain-store.js +164 -0
  299. package/server/dist/milestone-chain.js +487 -0
  300. package/server/dist/milestone-progress.js +348 -0
  301. package/server/dist/mobile/mobile-devices.js +10 -7
  302. package/server/dist/mobile/mobile-gateway.js +2 -0
  303. package/server/dist/mobile/mobile-missions.js +214 -0
  304. package/server/dist/mobile/mobile-redact.js +17 -3
  305. package/server/dist/mobile/mobile-router.js +46 -4
  306. package/server/dist/mobile/mobile-ws.js +49 -4
  307. package/server/dist/multi-repo-bases.js +56 -0
  308. package/server/dist/multi-repo-checkout.js +101 -0
  309. package/server/dist/multi-repo-delivery.js +100 -0
  310. package/server/dist/multi-repo-execution-store.js +65 -0
  311. package/server/dist/multi-repo-execution.js +453 -0
  312. package/server/dist/offline-assemble.js +10 -8
  313. package/server/dist/openspec-runtime-plugin-commands.json +18 -0
  314. package/server/dist/openspec-runtime-plugin.js +120 -0
  315. package/server/dist/plugins/codex-spawn.js +49 -0
  316. package/server/dist/plugins/serena/manifest.js +2 -2
  317. package/server/dist/plugins/serena/templates/instructions.md +16 -0
  318. package/server/dist/pr-publisher.js +1 -1
  319. package/server/dist/profiles-router.js +3 -18
  320. package/server/dist/project-code-discovery.js +142 -0
  321. package/server/dist/project-git.js +19 -21
  322. package/server/dist/project-registry.js +272 -20
  323. package/server/dist/project-repositories.js +157 -0
  324. package/server/dist/project-repository-provenance.js +31 -0
  325. package/server/dist/project-router-background-processes.js +105 -0
  326. package/server/dist/project-router-git.js +75 -16
  327. package/server/dist/project-router-jobs.js +2 -126
  328. package/server/dist/project-router-loop-runs.js +72 -2
  329. package/server/dist/project-router-tickets.js +53 -8
  330. package/server/dist/project-router.js +239 -38
  331. package/server/dist/provider-detection.js +18 -6
  332. package/server/dist/provider-limit.js +64 -0
  333. package/server/dist/providers/claude-adapter.js +26 -1
  334. package/server/dist/providers/claude-background-tasks.js +18 -0
  335. package/server/dist/providers/claude-live-session.js +383 -0
  336. package/server/dist/providers/codex-adapter.js +19 -0
  337. package/server/dist/providers/codex-live-session.js +545 -0
  338. package/server/dist/providers/gemini-adapter.js +1 -0
  339. package/server/dist/providers/live-session-types.js +12 -0
  340. package/server/dist/providers/live-session.js +13 -0
  341. package/server/dist/providers/terminal-result.js +24 -0
  342. package/server/dist/queue-manager.js +2 -0
  343. package/server/dist/rail-isolated-launch.js +141 -16
  344. package/server/dist/rail-pr-decision.js +364 -99
  345. package/server/dist/rail-pr-store.js +24 -10
  346. package/server/dist/rail-worktree-release.js +34 -2
  347. package/server/dist/rail-worktrees-store.js +4 -4
  348. package/server/dist/rails-router.js +249 -55
  349. package/server/dist/repo-lock.js +92 -17
  350. package/server/dist/review-packet.js +23 -13
  351. package/server/dist/schemas/file-summary.v1.json +59 -59
  352. package/server/dist/schemas/profile.v1.json +137 -137
  353. package/server/dist/setup-manager.js +52 -8
  354. package/server/dist/shell-integration/bash-shim.bash +45 -0
  355. package/server/dist/shell-integration/fish-shim.fish +36 -0
  356. package/server/dist/shell-integration/powershell-shim.ps1 +48 -0
  357. package/server/dist/shell-integration/zsh-shim.zsh +47 -0
  358. package/server/dist/smash-runner.js +1 -0
  359. package/server/dist/spawn-lifecycle.js +44 -27
  360. package/server/dist/spec-contract-prompt.js +143 -0
  361. package/server/dist/spec-draft-parser.js +6 -1
  362. package/server/dist/spec-models.js +1 -0
  363. package/server/dist/stuck-run-detector.js +1 -0
  364. package/server/dist/terminal-manager.js +21 -1
  365. package/server/dist/terminal-shell-integration.js +4 -1
  366. package/server/dist/transient-children.js +619 -230
  367. package/server/dist/util/cli-prompt.js +78 -5
  368. package/server/dist/util/sqlite-migrations.js +20 -0
  369. package/server/dist/util/win-spawn.js +18 -3
  370. package/server/dist/util/windows-provider-shell.js +29 -0
  371. package/server/dist/verification-sentinel.js +14 -0
  372. package/server/dist/vitest-setup.js +2 -0
  373. package/server/dist/windows-job-supervisor.js +133 -0
  374. package/server/dist/workspace-manager.js +9 -30
  375. package/server/dist/worktree-manager.js +17 -2
  376. package/server/dist/worktree-overlay.js +3 -1
  377. package/client/dist/assets/ActivityFeedPage-tAQcWs1R.js +0 -1
  378. package/client/dist/assets/AgentBrowserCapture-BX8BNae5.js +0 -1
  379. package/client/dist/assets/AgentModeAnalyticsPane-BVAqCL0K.js +0 -2
  380. package/client/dist/assets/AgentModeCodePane-9XfqQc9c.js +0 -2
  381. package/client/dist/assets/AgentModeJobsPane-BCjLsPhc.js +0 -1
  382. package/client/dist/assets/AgentsPage-C8J_42sm.js +0 -87
  383. package/client/dist/assets/AnalyticsPage-BtQuyfJm.js +0 -1
  384. package/client/dist/assets/CodePage-BZ2MwdCu.js +0 -2
  385. package/client/dist/assets/DesktopAnalyticsPage-Bh_29V4g.js +0 -1
  386. package/client/dist/assets/ExportDropdown-BrtfWzEG.js +0 -1
  387. package/client/dist/assets/InteractiveJobComposer-BCZiSfzc.js +0 -19
  388. package/client/dist/assets/JobDetailModal-NAJmuYIT.js +0 -1
  389. package/client/dist/assets/JobDetailPage-fE0ZycUX.js +0 -1
  390. package/client/dist/assets/JobsPage-z5M_HVJG.js +0 -1
  391. package/client/dist/assets/LoopBuilderPage-j1FQS47c.js +0 -7
  392. package/client/dist/assets/LoopPreviewModal-DhDJjdCe.js +0 -1
  393. package/client/dist/assets/LoopsPage-Ll7zORZb.js +0 -1
  394. package/client/dist/assets/MinimizedChatsContext-Bd3OqR_S.js +0 -1
  395. package/client/dist/assets/PluginsPage-DN4kGvJt.js +0 -2
  396. package/client/dist/assets/ProjectSettingsDialog-OgsgxjzF.js +0 -1
  397. package/client/dist/assets/ReviewPacketPage-DFog4sXn.js +0 -1
  398. package/client/dist/assets/TemplatePreviewModal-L2XxqiOD.js +0 -1
  399. package/client/dist/assets/TicketDetailModal-CsF-AWZX.js +0 -14
  400. package/client/dist/assets/Trans-Bsz9_gyq.js +0 -1
  401. package/client/dist/assets/agent-BQgKv_2F.js +0 -1
  402. package/client/dist/assets/agent-C1NRDJqL.js +0 -1
  403. package/client/dist/assets/agent-CLNleiy6.js +0 -1
  404. package/client/dist/assets/agent-CmceArkQ.js +0 -1
  405. package/client/dist/assets/agent-D3UxQ3SR.js +0 -1
  406. package/client/dist/assets/agent-DB1JeE64.js +0 -1
  407. package/client/dist/assets/agent-DXkHcQ-D.js +0 -1
  408. package/client/dist/assets/agent-DjJJJ2M8.js +0 -1
  409. package/client/dist/assets/auth-D_5bQv5W.js +0 -1
  410. package/client/dist/assets/ban-E4EaZe3a.js +0 -1
  411. package/client/dist/assets/bot-DzuuuC5R.js +0 -1
  412. package/client/dist/assets/browser-BgqHDMXP.js +0 -1
  413. package/client/dist/assets/browser-CsKJtrpv.js +0 -1
  414. package/client/dist/assets/browser-Cu58EpZU.js +0 -1
  415. package/client/dist/assets/browser-CvXOJm-j.js +0 -1
  416. package/client/dist/assets/browser-DOrFh1c7.js +0 -1
  417. package/client/dist/assets/browser-DQv_Jo7x.js +0 -1
  418. package/client/dist/assets/browser-LPgxvJu2.js +0 -1
  419. package/client/dist/assets/browser-eL-3MIEI.js +0 -1
  420. package/client/dist/assets/builder-0IWtosUm.js +0 -1
  421. package/client/dist/assets/builder-Bf2N6XWn.js +0 -1
  422. package/client/dist/assets/builder-BnqaaBkT.js +0 -1
  423. package/client/dist/assets/builder-BxxfGgAO.js +0 -1
  424. package/client/dist/assets/builder-C5IIgWsq.js +0 -1
  425. package/client/dist/assets/builder-CHuahItu.js +0 -1
  426. package/client/dist/assets/builder-CjWosXL_.js +0 -1
  427. package/client/dist/assets/builder-CpCIOoKj.js +0 -1
  428. package/client/dist/assets/code-CHPkOkDS.js +0 -1
  429. package/client/dist/assets/commands-6tYQih5m.js +0 -1
  430. package/client/dist/assets/commands-BK2QinXN.js +0 -1
  431. package/client/dist/assets/commands-C2Nca76h.js +0 -1
  432. package/client/dist/assets/commands-CKdLihNX.js +0 -1
  433. package/client/dist/assets/commands-CYIBTAlc.js +0 -1
  434. package/client/dist/assets/commands-CjUtYJIM.js +0 -1
  435. package/client/dist/assets/commands-Cq_u_8y9.js +0 -1
  436. package/client/dist/assets/commands-D_ZHYQug.js +0 -1
  437. package/client/dist/assets/common-6MLbD-jM.js +0 -1
  438. package/client/dist/assets/common-BKGEu4rm.js +0 -1
  439. package/client/dist/assets/common-BNbnv8cE.js +0 -1
  440. package/client/dist/assets/common-BqGWtDbt.js +0 -1
  441. package/client/dist/assets/common-DBtTzeYm.js +0 -1
  442. package/client/dist/assets/common-DEW3Nr8n.js +0 -1
  443. package/client/dist/assets/common-DHsv9N5d.js +0 -1
  444. package/client/dist/assets/common-mkrEcW-Y.js +0 -1
  445. package/client/dist/assets/dashboard-B9GhC5ku.js +0 -1
  446. package/client/dist/assets/dashboard-CBnv6zOI.js +0 -1
  447. package/client/dist/assets/dashboard-CaP0fU87.js +0 -1
  448. package/client/dist/assets/dashboard-D4ZZ4x84.js +0 -1
  449. package/client/dist/assets/dashboard-DmuTQBX8.js +0 -1
  450. package/client/dist/assets/dashboard-DynLYj3d.js +0 -1
  451. package/client/dist/assets/dashboard-zj4gGFJ1.js +0 -1
  452. package/client/dist/assets/dialog-CdWCb02j.js +0 -45
  453. package/client/dist/assets/dist-bVqfYmby.js +0 -1
  454. package/client/dist/assets/dist-js-CWeUdf5Z.js +0 -1
  455. package/client/dist/assets/formatDistanceToNow-DQCvMgUc.js +0 -1
  456. package/client/dist/assets/getTimezoneOffsetInMilliseconds-C16cxSe1.js +0 -1
  457. package/client/dist/assets/git-refresh-wTW0rO0Z.js +0 -1
  458. package/client/dist/assets/i18n-hnX2DPmo.js +0 -2
  459. package/client/dist/assets/index-DIhMEAVw.js +0 -66
  460. package/client/dist/assets/index-DwygcU7s.css +0 -2
  461. package/client/dist/assets/mcp-B8X8wBLu.js +0 -1
  462. package/client/dist/assets/mcp-C2AojZZN.js +0 -1
  463. package/client/dist/assets/mcp-D8BT78_L.js +0 -1
  464. package/client/dist/assets/mcp-Df5RWBNk.js +0 -1
  465. package/client/dist/assets/mcp-Dj7BgMQW.js +0 -1
  466. package/client/dist/assets/mcp-Q7iT7rcz.js +0 -1
  467. package/client/dist/assets/mcp-YlvNvJbW.js +0 -1
  468. package/client/dist/assets/mcp-mKFpTSRb.js +0 -1
  469. package/client/dist/assets/narration-4Z2VUhZw.js +0 -1
  470. package/client/dist/assets/narration-BGuiEDj3.js +0 -1
  471. package/client/dist/assets/narration-BuSoqRmv.js +0 -1
  472. package/client/dist/assets/narration-CB9t29fy.js +0 -1
  473. package/client/dist/assets/narration-CU3x8FHD.js +0 -1
  474. package/client/dist/assets/narration-CWeXhfP5.js +0 -1
  475. package/client/dist/assets/narration-DRaDnhT5.js +0 -1
  476. package/client/dist/assets/narration-DtEbQgCw.js +0 -1
  477. package/client/dist/assets/nav-ApJVg3xu.js +0 -1
  478. package/client/dist/assets/nav-BKNky1Bg.js +0 -1
  479. package/client/dist/assets/nav-C6vWWKYx.js +0 -1
  480. package/client/dist/assets/nav-CXJ6Aw89.js +0 -1
  481. package/client/dist/assets/nav-CsmFBIDf.js +0 -1
  482. package/client/dist/assets/nav-DjkmQJjd.js +0 -1
  483. package/client/dist/assets/packet-B1IxaL5f.js +0 -1
  484. package/client/dist/assets/packet-Bh5kkbiB.js +0 -1
  485. package/client/dist/assets/packet-By8fqYxW.js +0 -1
  486. package/client/dist/assets/packet-CZdvA44E.js +0 -1
  487. package/client/dist/assets/packet-CrjHRQCP.js +0 -1
  488. package/client/dist/assets/packet-Dwi2pTtx.js +0 -1
  489. package/client/dist/assets/packet-_-ZIa0IR.js +0 -1
  490. package/client/dist/assets/packet-n0W6E1Hn.js +0 -1
  491. package/client/dist/assets/play-DNlrawbS.js +0 -1
  492. package/client/dist/assets/provider-capabilities-Doej9lfa.js +0 -1
  493. package/client/dist/assets/settings-Bd0x4TBa.js +0 -1
  494. package/client/dist/assets/settings-C1-7cXzC.js +0 -1
  495. package/client/dist/assets/settings-CAFaT38b.js +0 -1
  496. package/client/dist/assets/settings-Ct3v1nW2.js +0 -1
  497. package/client/dist/assets/settings-DHh7_IF5.js +0 -1
  498. package/client/dist/assets/settings-DQXAmdcv.js +0 -1
  499. package/client/dist/assets/settings-guzlhpup.js +0 -1
  500. package/client/dist/assets/settings-sZfTPMEH.js +0 -1
  501. package/client/dist/assets/setup-3jWaoVUO.js +0 -1
  502. package/client/dist/assets/setup-BjgRneb2.js +0 -1
  503. package/client/dist/assets/setup-BzFIjv-f.js +0 -1
  504. package/client/dist/assets/setup-C4VfQsxE.js +0 -1
  505. package/client/dist/assets/setup-DfUkpDbN.js +0 -1
  506. package/client/dist/assets/setup-ECe90Pmu.js +0 -1
  507. package/client/dist/assets/setup-dlqC4Jmm.js +0 -1
  508. package/client/dist/assets/setup-jwfLMiM2.js +0 -1
  509. package/client/dist/assets/spending-EC9xqio-.js +0 -1
  510. package/client/dist/assets/useDesktop-BQVt8lFd.js +0 -1
@@ -37,10 +37,13 @@ exports.parseNpmCmdShimEntry = parseNpmCmdShimEntry;
37
37
  exports.spawnKimi = spawnKimi;
38
38
  exports.spawnAiCli = spawnAiCli;
39
39
  const node_fs_1 = require("node:fs");
40
+ const node_os_1 = require("node:os");
40
41
  const node_path_1 = __importDefault(require("node:path"));
41
42
  const win_spawn_1 = require("./win-spawn");
42
43
  const headroom_routing_1 = require("../headroom-routing");
43
44
  const process_admission_1 = require("../process-admission");
45
+ const openspec_runtime_plugin_1 = require("../openspec-runtime-plugin");
46
+ const windows_provider_shell_1 = require("./windows-provider-shell");
44
47
  // Per-call (not a frozen module const) so a test can flip the platform with a
45
48
  // `process.platform` spy without re-importing this module — which removes a
46
49
  // flaky vi.doMock + resetModules + dynamic-import dance in the spawn tests.
@@ -138,8 +141,8 @@ function transformCodexArgsForWindows(args) {
138
141
  }
139
142
  i += 1;
140
143
  }
141
- if (stdin === null || !stdin.includes('\n')) {
142
- // Single-line prompts pass through cmd.exe fine — keep argv to
144
+ if (stdin === null || (!/[\r\n]/.test(stdin) && estimatedWindowsArgvChars('codex', args) < 7000)) {
145
+ // Short single-line prompts pass through cmd.exe fine — keep argv to
143
146
  // dodge any codex versions that don't recognise `-` as stdin.
144
147
  if (stdin !== null && promptReplacedIdx >= 0) {
145
148
  out[promptReplacedIdx] = stdin;
@@ -174,6 +177,8 @@ function ensureStdinPipe(stdio) {
174
177
  */
175
178
  function spawnClaude(args, options = {}) {
176
179
  (0, process_admission_1.assertProcessAdmission)();
180
+ (0, openspec_runtime_plugin_1.ensureOpenSpecRuntimePluginForArgs)(args);
181
+ options = (0, windows_provider_shell_1.withWindowsProviderShell)('claude', options);
177
182
  options = (0, headroom_routing_1.withHeadroomSpawnEnv)('claude', options);
178
183
  let child;
179
184
  if (!isWin()) {
@@ -182,6 +187,43 @@ function spawnClaude(args, options = {}) {
182
187
  return child;
183
188
  }
184
189
  /* c8 ignore start -- Windows-only branch; coverage runs on Linux/macOS */
190
+ if (args.some((arg, index) => arg === '--input-format' && args[index + 1] === 'stream-json')) {
191
+ // Resident sessions own stdin for JSON frames. Folding the system prompt
192
+ // into stdin both corrupts that protocol and closes it before the first turn.
193
+ let directory;
194
+ const cleanup = () => { if (directory) {
195
+ try {
196
+ (0, node_fs_1.rmSync)(directory, { recursive: true, force: true });
197
+ }
198
+ catch { /* best effort */ }
199
+ } };
200
+ try {
201
+ const streamArgs = [...args];
202
+ for (let index = 0; index < streamArgs.length; index++) {
203
+ if (!['--system-prompt', '--append-system-prompt'].includes(streamArgs[index]))
204
+ continue;
205
+ const value = streamArgs[index + 1];
206
+ if (value === undefined)
207
+ throw new Error('claude_stream_system_prompt_missing');
208
+ directory ??= (0, node_fs_1.mkdtempSync)(node_path_1.default.join((0, node_os_1.tmpdir)(), 'specrails-claude-stream-'));
209
+ const file = node_path_1.default.join(directory, `prompt-${index}.txt`);
210
+ (0, node_fs_1.writeFileSync)(file, value, { encoding: 'utf8', mode: 0o600 });
211
+ streamArgs[index] += '-file';
212
+ streamArgs[++index] = file;
213
+ }
214
+ child = (0, win_spawn_1.spawnCli)('claude', streamArgs, options);
215
+ if (directory) {
216
+ child.once('error', cleanup);
217
+ child.once('close', cleanup);
218
+ }
219
+ (0, headroom_routing_1.registerHeadroomRoutedChild)('claude', options.env, child);
220
+ return child;
221
+ }
222
+ catch (error) {
223
+ cleanup();
224
+ throw error;
225
+ }
226
+ }
185
227
  const { args: winArgs, stdinPayload } = transformClaudeArgsForWindows(args);
186
228
  if (stdinPayload === null) {
187
229
  child = (0, win_spawn_1.spawnCli)('claude', winArgs, options);
@@ -239,8 +281,8 @@ function spawnCodex(args, options = {}) {
239
281
  * call) when the project dir is not a "trusted folder" — the documented escape
240
282
  * hatch for headless/automated environments. Validated empirically: without it,
241
283
  * a headless `gemini -p` run executes zero tool calls and the rail does nothing.
242
- * No multi-line argv quirk (the prompt rides on a single `-p` value), so the
243
- * Windows path is identical to POSIX.
284
+ * Windows sends the prompt through Gemini's headless stdin transport so cmd.exe
285
+ * cannot split multiline text or reject a long command line.
244
286
  */
245
287
  // Gemini auth env vars. Forwarded from `process.env` into the spawn env when
246
288
  // present so a caller that narrows the env (or a relocated spawn) still carries
@@ -262,7 +304,34 @@ function spawnGemini(args, options = {}) {
262
304
  if (process.env[key] && env[key] === undefined)
263
305
  env[key] = process.env[key];
264
306
  }
265
- return (0, win_spawn_1.spawnCli)('gemini', args, { ...options, env });
307
+ const promptIndex = args.findIndex((arg) => arg === '-p' || arg === '--prompt');
308
+ if (!isWin() || promptIndex < 0 || args[promptIndex + 1] === undefined) {
309
+ return (0, win_spawn_1.spawnCli)('gemini', args, { ...options, env });
310
+ }
311
+ const prompt = args[promptIndex + 1];
312
+ // Gemini headless bounds stdin at 8 MiB and otherwise silently truncates it.
313
+ if (Buffer.byteLength(prompt, 'utf8') > 8 * 1024 * 1024)
314
+ throw new Error('gemini_windows_prompt_too_large: headless stdin is limited to 8 MiB.');
315
+ const forwarded = [...args];
316
+ forwarded.splice(promptIndex, 2);
317
+ const child = (0, win_spawn_1.spawnCli)('gemini', forwarded, { ...options, env, stdio: ensureStdinPipe(options.stdio) });
318
+ if (!child.stdin) {
319
+ try {
320
+ child.kill('SIGTERM');
321
+ }
322
+ catch { /* already gone */ }
323
+ throw new Error('gemini_windows_prompt_stdin_unavailable');
324
+ }
325
+ child.stdin.on('error', (error) => {
326
+ if (error.code !== 'EPIPE') {
327
+ try {
328
+ child.kill('SIGTERM');
329
+ }
330
+ catch { /* already gone */ }
331
+ }
332
+ });
333
+ child.stdin.end(prompt);
334
+ return child;
266
335
  }
267
336
  /**
268
337
  * Extract the JavaScript entry from a standard npm-generated Windows `.cmd`
@@ -306,6 +375,7 @@ function estimatedWindowsArgvChars(binary, args) {
306
375
  }
307
376
  function spawnKimi(args, options = {}) {
308
377
  (0, process_admission_1.assertProcessAdmission)();
378
+ options = (0, windows_provider_shell_1.withWindowsProviderShell)('kimi', options);
309
379
  if (!isWin())
310
380
  return (0, win_spawn_1.spawnCli)('kimi', args, options);
311
381
  /* c8 ignore start -- Windows-only branch; unit tests force process.platform */
@@ -402,5 +472,8 @@ function spawnAiCli(binary, args, options = {}) {
402
472
  return spawnGemini(args, options);
403
473
  if (binary === 'kimi')
404
474
  return spawnKimi(args, options);
475
+ // An explicitly selected Claude executable can be an absolute path/shim.
476
+ // Its adapter still supplies the same exact managed-plugin argv contract.
477
+ (0, openspec_runtime_plugin_1.ensureOpenSpecRuntimePluginForArgs)(args);
405
478
  return (0, win_spawn_1.spawnCli)(binary, args, options);
406
479
  }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyNumberedMigrations = applyNumberedMigrations;
4
+ /** Recheck the version while holding the write lock: another startup may have
5
+ * migrated the database after our initial read, while we waited for SQLite. */
6
+ function applyNumberedMigrations(db, migrations) {
7
+ const applied = new Set(db.prepare('SELECT version FROM schema_migrations').all().map((row) => row.version));
8
+ const hasVersion = db.prepare('SELECT 1 FROM schema_migrations WHERE version = ?');
9
+ const recordVersion = db.prepare('INSERT INTO schema_migrations (version) VALUES (?)');
10
+ const migrate = db.transaction((version, body) => {
11
+ if (hasVersion.get(version))
12
+ return;
13
+ body(db);
14
+ recordVersion.run(version);
15
+ });
16
+ for (let i = 0; i < migrations.length; i++) {
17
+ if (!applied.has(i + 1))
18
+ migrate.immediate(i + 1, migrations[i]);
19
+ }
20
+ }
@@ -32,6 +32,7 @@ exports.resolveWindowsBinary = resolveWindowsBinary;
32
32
  exports.__resetWindowsBinaryResolveCacheForTest = __resetWindowsBinaryResolveCacheForTest;
33
33
  const child_process_1 = require("child_process");
34
34
  const path_1 = __importDefault(require("path"));
35
+ const os_1 = __importDefault(require("os"));
35
36
  const cross_spawn_1 = __importDefault(require("cross-spawn"));
36
37
  const tree_kill_1 = __importDefault(require("tree-kill"));
37
38
  /**
@@ -95,6 +96,17 @@ function windowsSpawnEnv(base = process.env) {
95
96
  if (process.platform !== 'win32')
96
97
  return base;
97
98
  const env = { ...base };
99
+ // Windows env names are case-insensitive, even when a caller passes an
100
+ // ordinary JS object. Avoid conflicting aliases when spawning that object.
101
+ for (const name of ['SystemRoot', 'windir', 'ComSpec', 'USERPROFILE', 'HOMEDRIVE', 'HOMEPATH', 'APPDATA', 'LOCALAPPDATA', 'TEMP', 'TMP']) {
102
+ const aliases = Object.keys(env).filter(key => key.toLowerCase() === name.toLowerCase());
103
+ const value = env[name] || aliases.map(key => env[key]).find(Boolean);
104
+ for (const key of aliases)
105
+ if (key !== name)
106
+ delete env[key];
107
+ if (value !== undefined)
108
+ env[name] = value;
109
+ }
98
110
  const systemRoot = (env.SystemRoot || env.windir || 'C:\\Windows').replace(/[\\/]$/, '');
99
111
  env.SystemRoot = env.SystemRoot || systemRoot;
100
112
  env.windir = env.windir || systemRoot;
@@ -103,10 +115,13 @@ function windowsSpawnEnv(base = process.env) {
103
115
  // npm-prefix.js resolver), which reads the user profile via USERPROFILE /
104
116
  // APPDATA / HOMEDRIVE+HOMEPATH / TEMP. A GUI-launched, env-stripped sidecar can
105
117
  // lack these → `node npm-cli.js --version` fails the same way the .cmd shim did.
106
- // Backfill canonical Windows defaults when absent (node.exe itself needs none
107
- // of these, which is why node/git probed fine while npm/npx did not).
118
+ // Query the real account BEFORE ensureWindowsBaseEnv mutates process.env.
119
+ // Inventing C:\\Users\\Default here redirects os.homedir(), the project
120
+ // database and provider authentication to another account's directory.
108
121
  const userProfile = env.USERPROFILE ||
109
- (env.HOMEDRIVE && env.HOMEPATH ? `${env.HOMEDRIVE}${env.HOMEPATH}` : 'C:\\Users\\Default');
122
+ (env.HOMEDRIVE && env.HOMEPATH ? `${env.HOMEDRIVE}${env.HOMEPATH}` : os_1.default.homedir());
123
+ if (!userProfile)
124
+ throw new Error('Cannot determine the Windows user profile; refusing to select another data directory.');
110
125
  env.USERPROFILE = userProfile;
111
126
  const drive = /^([A-Za-z]:)(.*)$/.exec(userProfile);
112
127
  if (drive) {
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.withWindowsProviderShell = withWindowsProviderShell;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const win_spawn_1 = require("./win-spawn");
10
+ /** Provider tools must find PortableGit's Bash even with only git/cmd on PATH. */
11
+ function withWindowsProviderShell(binary, options) {
12
+ if (process.platform !== 'win32')
13
+ return options;
14
+ const key = binary === 'claude' ? 'CLAUDE_CODE_GIT_BASH_PATH' : 'KIMI_SHELL_PATH';
15
+ const effective = options.env ?? process.env;
16
+ if (Object.entries(effective).some(([name, value]) => name.toUpperCase() === key && value !== undefined))
17
+ return options;
18
+ const inherited = Object.entries(process.env).find(([name, value]) => name.toUpperCase() === key && value !== undefined)?.[1];
19
+ const runtimes = (0, win_spawn_1.stripWindowsVerbatimPrefix)(effective.SPECRAILS_BUNDLED_RUNTIMES_PATH ?? process.env.SPECRAILS_BUNDLED_RUNTIMES_PATH ?? '');
20
+ const bundled = runtimes ? [node_path_1.default.join(runtimes, 'git', 'bin', 'bash.exe'), node_path_1.default.join(runtimes, 'git', 'usr', 'bin', 'bash.exe')]
21
+ .find(candidate => { try {
22
+ return (0, node_fs_1.statSync)(candidate).isFile();
23
+ }
24
+ catch {
25
+ return false;
26
+ } }) : undefined;
27
+ const selected = inherited ?? bundled;
28
+ return selected === undefined ? options : { ...options, env: { ...effective, [key]: selected } };
29
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseVerificationSentinel = parseVerificationSentinel;
4
+ const SENTINEL_RE = /^[ \t]*VERIFICATION:[ \t]*(PASS|FAIL)\b[ \t]*(?:[—:-][ \t]*)?([^\r\n]*)/gim;
5
+ function parseVerificationSentinel(text) {
6
+ let verdict = 'absent';
7
+ let detail = null;
8
+ for (const match of text.matchAll(SENTINEL_RE)) {
9
+ verdict = match[1].toUpperCase() === 'PASS' ? 'pass' : 'fail';
10
+ const tail = (match[2] ?? '').trim();
11
+ detail = verdict === 'fail' && tail ? tail.slice(0, 512) : null;
12
+ }
13
+ return { verdict, detail };
14
+ }
@@ -48,6 +48,8 @@ for (const k of [
48
48
  'SPECRAILS_WORKSPACE_DIR',
49
49
  'SPECRAILS_PROFILES_DIR',
50
50
  'SPECRAILS_STATE_DIR',
51
+ 'SPECRAILS_EXECUTION_CONTEXT',
52
+ 'SPECRAILS_PIPELINE_RUNTIME',
51
53
  ]) {
52
54
  delete process.env[k];
53
55
  }
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WINDOWS_JOB_SUPERVISOR = void 0;
4
+ /** Windows PowerShell 5.1/.NET Framework: no additional executable or addon.
5
+ * This process creates the bootstrap itself and owns its kernel handle; it
6
+ * never adopts a pid. Its unnamed, non-inheritable job contains descendants
7
+ * even when every intermediate wrapper has already exited. */
8
+ exports.WINDOWS_JOB_SUPERVISOR = String.raw `
9
+ param([string]$NodePath, [string]$BootstrapPath, [string]$PipeName)
10
+ $ErrorActionPreference = 'Stop'
11
+ Add-Type -TypeDefinition @'
12
+ using System;
13
+ using System.Diagnostics;
14
+ using System.IO;
15
+ using System.IO.Pipes;
16
+ using System.Runtime.InteropServices;
17
+ using System.Text;
18
+ using System.Threading;
19
+ using System.Threading.Tasks;
20
+ public static class SpecrailsBackgroundJob {
21
+ [StructLayout(LayoutKind.Sequential)] struct BasicLimits {
22
+ public long ProcessTime, JobTime; public uint Flags;
23
+ public UIntPtr MinWorkingSet, MaxWorkingSet; public uint ActiveLimit;
24
+ public UIntPtr Affinity; public uint Priority, Scheduling;
25
+ }
26
+ [StructLayout(LayoutKind.Sequential)] struct IoCounters {
27
+ public ulong ReadOps, WriteOps, OtherOps, ReadBytes, WriteBytes, OtherBytes;
28
+ }
29
+ [StructLayout(LayoutKind.Sequential)] struct ExtendedLimits {
30
+ public BasicLimits Basic; public IoCounters Io;
31
+ public UIntPtr ProcessMemory, JobMemory, PeakProcessMemory, PeakJobMemory;
32
+ }
33
+ [StructLayout(LayoutKind.Sequential)] struct Accounting {
34
+ public long UserTime, KernelTime, PeriodUserTime, PeriodKernelTime;
35
+ public uint PageFaults, Total, Active, Terminated;
36
+ }
37
+ [DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)] static extern IntPtr CreateJobObject(IntPtr attrs, string name);
38
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool SetInformationJobObject(IntPtr job, int kind, ref ExtendedLimits info, uint length);
39
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool QueryInformationJobObject(IntPtr job, int kind, out Accounting info, uint length, IntPtr returned);
40
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process);
41
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool TerminateJobObject(IntPtr job, uint code);
42
+ [DllImport("kernel32.dll", SetLastError=true)] static extern bool TerminateProcess(IntPtr process, uint code);
43
+ [DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr handle);
44
+ static void Check(bool okay, string operation) { if (!okay) throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error(), operation); }
45
+ static uint Active(IntPtr job) {
46
+ Accounting info;
47
+ Check(QueryInformationJobObject(job, 1, out info, (uint)Marshal.SizeOf(typeof(Accounting)), IntPtr.Zero), "QueryInformationJobObject");
48
+ return info.Active;
49
+ }
50
+ static string Quote(string value) {
51
+ var result=new StringBuilder("\""); int slashes=0;
52
+ foreach(char c in value) {
53
+ if(c=='\\') { slashes++; continue; }
54
+ result.Append('\\', c=='"' ? slashes*2+1 : slashes); result.Append(c); slashes=0;
55
+ }
56
+ result.Append('\\',slashes*2); return result.Append('"').ToString();
57
+ }
58
+ public static int Run(string node, string bootstrap, string pipeName) {
59
+ IntPtr job=IntPtr.Zero; Process root=null; StreamWriter output=null; bool assigned=false;
60
+ int code=125;
61
+ try {
62
+ var pipeOptions=PipeOptions.Asynchronous;
63
+ if(Enum.IsDefined(typeof(PipeOptions),"CurrentUserOnly")) pipeOptions|=(PipeOptions)Enum.Parse(typeof(PipeOptions),"CurrentUserOnly");
64
+ using(var pipe=new NamedPipeClientStream(".",pipeName,PipeDirection.InOut,pipeOptions)) {
65
+ pipe.Connect(8000);
66
+ var reader=new StreamReader(pipe,new UTF8Encoding(false),false,4096,true);
67
+ output=new StreamWriter(pipe,new UTF8Encoding(false),4096,true); output.AutoFlush=true;
68
+ job=CreateJobObject(IntPtr.Zero,null); Check(job!=IntPtr.Zero,"CreateJobObject");
69
+ var limits=new ExtendedLimits(); limits.Basic.Flags=0x2000; // KILL_ON_JOB_CLOSE; no BREAKAWAY flags.
70
+ Check(SetInformationJobObject(job,9,ref limits,(uint)Marshal.SizeOf(typeof(ExtendedLimits))),"SetInformationJobObject");
71
+ var start=new ProcessStartInfo(node,Quote(bootstrap));
72
+ start.UseShellExecute=false; start.CreateNoWindow=true; start.RedirectStandardInput=true;
73
+ // A user preload must not execute before job assignment. The bootstrap
74
+ // restores these only for the admitted application child.
75
+ foreach(string key in new [] {"NODE_OPTIONS","NODE_PATH"}) {
76
+ string value=start.EnvironmentVariables[key];
77
+ if(value!=null) start.EnvironmentVariables["SPECRAILS_JOB_"+key+"_B64"]=Convert.ToBase64String(Encoding.UTF8.GetBytes(value));
78
+ start.EnvironmentVariables.Remove(key);
79
+ }
80
+ root=Process.Start(start);
81
+ if(root==null) throw new Exception("Could not create background bootstrap.");
82
+ Check(AssignProcessToJobObject(job,root.Handle),"AssignProcessToJobObject"); assigned=true;
83
+ output.WriteLine("ready");
84
+ bool admitted=false, stopping=false;
85
+ Task<string> input=reader.ReadLineAsync();
86
+ while(true) {
87
+ if(input.Wait(100)) {
88
+ string line=input.Result;
89
+ if(line==null) { Check(TerminateJobObject(job,137),"TerminateJobObject"); stopping=true; break; }
90
+ string[] parts=line.Split(new [] {'\t'},2);
91
+ if(parts[0]=="start" && parts.Length==2 && !admitted && !stopping) {
92
+ Convert.FromBase64String(parts[1]); // validate before framing JSON for Node
93
+ root.StandardInput.WriteLine("{\"commandBase64\":\""+parts[1]+"\"}"); root.StandardInput.Close(); admitted=true;
94
+ } else if(parts[0]=="stop") {
95
+ Check(TerminateJobObject(job,137),"TerminateJobObject"); stopping=true;
96
+ output.WriteLine("state\t"+(parts.Length==2?parts[1]:"0")+"\t"+Active(job));
97
+ } else if(parts[0]=="poll") {
98
+ output.WriteLine("state\t"+(parts.Length==2?parts[1]:"0")+"\t"+Active(job));
99
+ }
100
+ input=reader.ReadLineAsync();
101
+ }
102
+ if(Active(job)==0) {
103
+ root.WaitForExit(); code=root.ExitCode;
104
+ output.WriteLine("empty"); return code;
105
+ }
106
+ }
107
+ // EOF means the owning sidecar disappeared. The job still owns every
108
+ // descendant; wait for the kernel's active count before releasing it.
109
+ var deadline=DateTime.UtcNow.AddSeconds(5);
110
+ while(Active(job)>0 && DateTime.UtcNow<deadline) Thread.Sleep(25);
111
+ }
112
+ } catch(Exception error) {
113
+ try { if(output!=null) output.WriteLine("error\t"+Convert.ToBase64String(Encoding.UTF8.GetBytes(error.Message))); } catch {}
114
+ Console.Error.WriteLine("Background job supervisor failed: "+error.Message);
115
+ } finally {
116
+ if(job!=IntPtr.Zero) {
117
+ if(assigned) {
118
+ TerminateJobObject(job,137);
119
+ try { var until=DateTime.UtcNow.AddSeconds(5); while(Active(job)>0 && DateTime.UtcNow<until) Thread.Sleep(25); } catch {}
120
+ }
121
+ CloseHandle(job);
122
+ }
123
+ if(root!=null) {
124
+ if(!assigned) { try { TerminateProcess(root.Handle,125); } catch {} }
125
+ root.Dispose();
126
+ }
127
+ }
128
+ return code;
129
+ }
130
+ }
131
+ '@
132
+ exit [SpecrailsBackgroundJob]::Run($NodePath, $BootstrapPath, $PipeName)
133
+ `;
@@ -10,23 +10,12 @@ exports.ensureWorkspace = ensureWorkspace;
10
10
  exports.assembleWorkspaceFramework = assembleWorkspaceFramework;
11
11
  exports.removeWorkspace = removeWorkspace;
12
12
  const fs_1 = __importDefault(require("fs"));
13
+ const core_update_state_1 = require("./core-update-state");
13
14
  const path_1 = __importDefault(require("path"));
14
15
  const framework_manager_1 = require("./framework-manager");
15
16
  const framework_migration_1 = require("./framework-migration");
16
17
  const artifact_registry_1 = require("./artifact-registry");
17
18
  const agent_mcp_config_1 = require("./agent-mcp-config");
18
- /** Highest-first semver-ish sort for framework version dir names. */
19
- function compareFrameworkVersionDesc(a, b) {
20
- const pa = a.split('.').map((n) => parseInt(n, 10));
21
- const pb = b.split('.').map((n) => parseInt(n, 10));
22
- for (let i = 0; i < 3; i++) {
23
- const x = pa[i] ?? 0;
24
- const y = pb[i] ?? 0;
25
- if (x !== y)
26
- return y - x;
27
- }
28
- return 0;
29
- }
30
19
  /**
31
20
  * Windows repair: ensure the workspace's `<providerDir>/agents` holds the
32
21
  * framework's `sr-*` agent definitions, copied from the REAL versioned framework
@@ -48,25 +37,12 @@ function compareFrameworkVersionDesc(a, b) {
48
37
  * byte-identical). Additive (never touches user `custom-*.md`) + idempotent.
49
38
  * Returns the number of agents copied.
50
39
  */
51
- /** Newest REAL framework version dir under the root — resolved by LISTING (not
52
- * via the `current` junction, which is the very thing that may be untraversable
53
- * on Windows). Null when the framework isn't materialized. */
54
- function newestFrameworkVersion(root) {
55
- try {
56
- return fs_1.default
57
- .readdirSync(root)
58
- .filter((n) => /^\d+\.\d+\.\d+$/.test(n))
59
- .sort(compareFrameworkVersionDesc)[0] ?? null;
60
- }
61
- catch {
62
- return null;
63
- }
64
- }
65
40
  function ensureFrameworkAgents(workspaceDir, providerDir, home) {
41
+ (0, core_update_state_1.assertWorkspaceCoreReady)(workspaceDir, home);
66
42
  if (process.platform !== 'win32')
67
43
  return 0;
68
44
  const root = (0, framework_manager_1.frameworkRoot)(home);
69
- const version = newestFrameworkVersion(root);
45
+ const version = (0, framework_manager_1.readCurrentFrameworkVersion)(home);
70
46
  if (!version)
71
47
  return 0;
72
48
  const src = path_1.default.join(root, version, providerDir, 'agents');
@@ -173,10 +149,11 @@ function hasReadableFrameworkContent(dest) {
173
149
  * idempotent. Returns the number of repaired subtrees/managed skill children.
174
150
  */
175
151
  function ensureFrameworkCommandSubtrees(workspaceDir, providerDir, home) {
152
+ (0, core_update_state_1.assertWorkspaceCoreReady)(workspaceDir, home);
176
153
  if (process.platform !== 'win32')
177
154
  return 0;
178
155
  const root = (0, framework_manager_1.frameworkRoot)(home);
179
- const version = newestFrameworkVersion(root);
156
+ const version = (0, framework_manager_1.readCurrentFrameworkVersion)(home);
180
157
  if (!version)
181
158
  return 0;
182
159
  let healed = 0;
@@ -199,7 +176,9 @@ function ensureFrameworkCommandSubtrees(workspaceDir, providerDir, home) {
199
176
  removeBrokenFrameworkDestination(dest);
200
177
  try {
201
178
  fs_1.default.mkdirSync(path_1.default.dirname(dest), { recursive: true });
202
- fs_1.default.cpSync(src, dest, { recursive: true });
179
+ // JS traversal avoids Node 22's native Unicode directory-copy failure on
180
+ // Windows (nodejs/node#61878). The missing subtree is a fresh destination.
181
+ fs_1.default.cpSync(src, dest, { recursive: true, filter: () => true, mode: fs_1.default.constants.COPYFILE_FICLONE });
203
182
  healed += 1;
204
183
  }
205
184
  catch {
@@ -240,7 +219,7 @@ function ensureFrameworkCommandSubtrees(workspaceDir, providerDir, home) {
240
219
  removeBrokenFrameworkDestination(dest);
241
220
  try {
242
221
  fs_1.default.mkdirSync(path_1.default.dirname(dest), { recursive: true });
243
- fs_1.default.cpSync(src, dest, { recursive: true });
222
+ fs_1.default.cpSync(src, dest, { recursive: true, filter: () => true, mode: fs_1.default.constants.COPYFILE_FICLONE });
244
223
  healed += 1;
245
224
  }
246
225
  catch {
@@ -130,6 +130,13 @@ exports.PR_NEVER_STAGE_PATHS = [
130
130
  '.kimi-code/agent-memory/**',
131
131
  '.kimi-code/agent-memory/explanations',
132
132
  '.kimi-code/agent-memory/explanations/**',
133
+ // The relocated workspace root. The Revision gate harvests reviewer scores
134
+ // from `.specrails/agent-memory/explanations/`, so that dir now materializes
135
+ // inside the worktree — it is private evidence, never PR content.
136
+ '.specrails/agent-memory',
137
+ '.specrails/agent-memory/**',
138
+ '.specrails/agent-memory/explanations',
139
+ '.specrails/agent-memory/explanations/**',
133
140
  ];
134
141
  const PR_NEVER_STAGE_EXCLUDE_MARKER_BEGIN = '# specrails: never stage private agent artifacts';
135
142
  const PR_NEVER_STAGE_EXCLUDE_MARKER_END = '# /specrails: never stage private agent artifacts';
@@ -184,6 +191,14 @@ async function fastForwardExistingBranch(git, repoDir, branch, baseRef, mountedW
184
191
  * callers creating fresh work may choose shared cwd. PR continuations must fail
185
192
  * closed because shared cwd cannot guarantee branch identity.
186
193
  */
194
+ function canonicalWorktreePath(value) {
195
+ try {
196
+ return fs.realpathSync.native(value);
197
+ }
198
+ catch {
199
+ return path.resolve(value);
200
+ }
201
+ }
187
202
  async function createWorktree(git, input) {
188
203
  const branch = input.branch ?? worktreeBranch(input.slug, input.ticketId);
189
204
  const wt = worktreePath(input.worktreesRoot, input.ticketId);
@@ -195,7 +210,7 @@ async function createWorktree(git, input) {
195
210
  // it out into a worktree (resume from the committed partial work).
196
211
  // 3. neither → create a fresh branch off base.
197
212
  const existing = await listWorktrees(git, input.repoDir);
198
- if (existing.some((p) => path.resolve(p) === path.resolve(wt))) {
213
+ if (existing.some((p) => canonicalWorktreePath(p) === canonicalWorktreePath(wt))) {
199
214
  // The still-mounted worktree may be checked out on a DIFFERENT branch than
200
215
  // the caller's preferred name (the path is keyed by ticketId only, so a
201
216
  // stale mount from a prior run of the same ticket collides here). The
@@ -445,7 +460,7 @@ async function listWorktrees(git, repoDir) {
445
460
  for (const line of res.stdout.split('\n')) {
446
461
  if (line.startsWith('worktree ')) {
447
462
  const p = line.slice('worktree '.length).trim();
448
- if (p && path.resolve(p) !== path.resolve(repoDir))
463
+ if (p && canonicalWorktreePath(p) !== canonicalWorktreePath(repoDir))
449
464
  paths.push(p);
450
465
  }
451
466
  }
@@ -310,8 +310,10 @@ function linkOrCopyEntry(src, dest, rel, created, warnings) {
310
310
  // Copy fallback (Windows without symlink rights, exotic filesystems).
311
311
  // Dereference so workspace-internal symlinks become real files.
312
312
  try {
313
+ // A filter avoids Node 22's native Unicode directory-copy failure on
314
+ // Windows (nodejs/node#61878). The caller admits only a missing destination.
313
315
  if (srcIsDir)
314
- fs_1.default.cpSync(src, dest, { recursive: true, dereference: true });
316
+ fs_1.default.cpSync(src, dest, { recursive: true, dereference: true, filter: () => true, mode: fs_1.default.constants.COPYFILE_FICLONE });
315
317
  else
316
318
  fs_1.default.copyFileSync(src, dest);
317
319
  linked = true;
@@ -1 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{o as r,w as i}from"./i18n-hnX2DPmo.js";import{n as a}from"./createLucideIcon-Bjbbp_KS.js";import{t as o}from"./ban-E4EaZe3a.js";import{t as s}from"./circle-x-CMYsN4ZH.js";import{t as c}from"./loader-circle-DcygOQpC.js";import{t as l}from"./zap-CHo3aCD1.js";import{a as u,r as d}from"./useDesktop-BQVt8lFd.js";import{Ot as f,Pt as p}from"./index-DIhMEAVw.js";var m=e(t(),1);function h(e){let t=new Set;return e.filter(e=>{let n=`${e.type}:${e.jobId}`;return t.has(n)?!1:(t.add(n),!0)})}function g({activeProjectId:e,limit:t=50}){let[n,a]=(0,m.useState)([]),[o,s]=(0,m.useState)(!1),[c,l]=(0,m.useState)(!0),d=(0,m.useRef)(e);(0,m.useEffect)(()=>{d.current=e},[e]);let{registerHandler:f,unregisterHandler:p}=i();(0,m.useEffect)(()=>{if(!e){a([]),l(!0);return}let n=!1;s(!0),a([]),l(!0);async function r(){let e=u();try{let r=await fetch(`${e}/activity?limit=${t}`);if(!r.ok||n)return;let i=await r.json();if(n)return;a(i),l(i.length===t)}catch{}finally{n||s(!1)}}return r(),()=>{n=!0}},[e,t]);let g=(0,m.useCallback)(async()=>{if(o||!c)return;s(!0);let e=u(),n=d.current;try{a(r=>{let i=r[r.length-1];if(!i)return r;let o=encodeURIComponent(i.timestamp);return fetch(`${e}/activity?limit=${t}&before=${o}`).then(e=>e.json()).then(e=>{if(d.current!==n){s(!1);return}a(t=>h([...t,...e])),l(e.length===t),s(!1)}).catch(()=>s(!1)),r})}catch{s(!1)}},[o,c,t]),_=(0,m.useCallback)(e=>{let t=e,n=d.current;if(!(!t||typeof t.type!=`string`)&&!(t.projectId&&t.projectId!==n)){if(t.type===`queue`&&Array.isArray(t.jobs)){let e=[];for(let n of t.jobs){let t=n.status===`completed`?`job_completed`:n.status===`failed`?`job_failed`:n.status===`canceled`?`job_canceled`:`job_started`;e.push({id:`${t}:${n.id}`,type:t,jobId:n.id,jobCommand:n.command??``,timestamp:n.startedAt??new Date().toISOString(),summary:`${t.replace(`_`,` `)}: ${n.command??``}`,costUsd:null})}e.length>0&&a(t=>h([...e,...t]))}if(t.type===`phase`&&t.phase&&t.state&&t.timestamp){let e={id:`phase:${t.phase}:${t.state}:${t.timestamp}`,type:`job_started`,jobId:`phase-${t.phase}`,jobCommand:r.t(`activity:feed.phaseCommand`,{phase:t.phase,state:t.state}),timestamp:t.timestamp,summary:`Phase ${t.phase} is ${t.state}`,costUsd:null};a(t=>h([e,...t]))}}},[]);return(0,m.useLayoutEffect)(()=>(f(`activity`,_),()=>p(`activity`)),[_,f,p]),{items:n,loading:o,hasMore:c,loadMore:g}}var _=n();function v(e,t){let n=Date.now()-new Date(e).getTime(),r=Math.floor(n/1e3);if(r<60)return t(`feed.relativeTime.seconds`,{value:r});let i=Math.floor(r/60);if(i<60)return t(`feed.relativeTime.minutes`,{value:i});let a=Math.floor(i/60);return a<24?t(`feed.relativeTime.hours`,{value:a}):t(`feed.relativeTime.days`,{value:Math.floor(a/24)})}function y({type:e}){switch(e){case`job_completed`:return(0,_.jsx)(f,{className:`w-4 h-4 text-green-500 aurora-light:text-accent-success flex-shrink-0`});case`job_failed`:return(0,_.jsx)(s,{className:`w-4 h-4 text-red-500 aurora-light:text-destructive flex-shrink-0`});case`job_canceled`:return(0,_.jsx)(o,{className:`w-4 h-4 text-muted-foreground flex-shrink-0`});default:return(0,_.jsx)(l,{className:`w-4 h-4 text-blue-500 aurora-light:text-accent-info flex-shrink-0`})}}function b(e,t){switch(e){case`job_completed`:return t(`common:status.completed`);case`job_failed`:return t(`common:status.failed`);case`job_canceled`:return t(`common:status.canceled`);default:return t(`feed.typeStarted`)}}function x(e){switch(e){case`job_completed`:return`text-green-500 aurora-light:text-accent-success`;case`job_failed`:return`text-red-500 aurora-light:text-destructive`;case`job_canceled`:return`text-muted-foreground`;default:return`text-blue-500 aurora-light:text-accent-info`}}function S(){let{t:e}=a(`activity`),{activeProjectId:t}=d(),{items:n,loading:r,hasMore:i,loadMore:o}=g({activeProjectId:t}),s=(0,m.useRef)(null);return(0,m.useEffect)(()=>{let e=s.current;if(!e)return;let t=new IntersectionObserver(e=>{e[0].isIntersecting&&i&&!r&&o()},{threshold:.1});return t.observe(e),()=>t.disconnect()},[i,r,o]),(0,_.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden`,children:[(0,_.jsxs)(`div`,{className:`flex items-center gap-2 px-4 py-3 border-b border-border bg-background/50`,children:[(0,_.jsx)(p,{className:`w-4 h-4 text-muted-foreground`}),(0,_.jsx)(`h1`,{className:`text-sm font-medium`,children:e(`feed.title`)})]}),(0,_.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[r&&n.length===0?(0,_.jsx)(`div`,{className:`flex items-center justify-center h-32`,children:(0,_.jsx)(c,{className:`w-4 h-4 animate-spin text-muted-foreground`})}):n.length===0?(0,_.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-48 gap-2 text-muted-foreground`,children:[(0,_.jsx)(p,{className:`w-8 h-8 opacity-40`}),(0,_.jsx)(`p`,{className:`text-sm`,children:e(`feed.emptyTitle`)}),(0,_.jsx)(`p`,{className:`text-xs opacity-70`,children:e(`feed.emptyHint`)})]}):(0,_.jsx)(`ul`,{className:`divide-y divide-border/50`,children:n.map(t=>(0,_.jsxs)(`li`,{className:`flex items-center gap-3 px-4 py-2.5 hover:bg-accent/30 transition-colors`,children:[(0,_.jsx)(y,{type:t.type}),(0,_.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,_.jsx)(`p`,{className:`text-xs text-foreground truncate`,title:t.jobCommand,children:t.jobCommand}),(0,_.jsxs)(`div`,{className:`flex items-center gap-2 mt-0.5`,children:[(0,_.jsx)(`span`,{className:`text-xs font-medium ${x(t.type)}`,children:b(t.type,e)}),t.costUsd!=null&&(0,_.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`$`,t.costUsd.toFixed(4)]})]})]}),(0,_.jsx)(`span`,{className:`text-xs text-muted-foreground flex-shrink-0 tabular-nums`,children:v(t.timestamp,e)})]},`${t.type}:${t.jobId}`))}),(0,_.jsx)(`div`,{ref:s,className:`h-1`}),r&&n.length>0&&(0,_.jsx)(`div`,{className:`flex justify-center py-3`,children:(0,_.jsx)(c,{className:`w-4 h-4 animate-spin text-muted-foreground`})}),!i&&n.length>0&&(0,_.jsx)(`p`,{className:`text-center text-xs text-muted-foreground py-3`,children:e(`feed.allLoaded`)})]})]})}export{S as default};
@@ -1 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{n as r}from"./createLucideIcon-Bjbbp_KS.js";import{n as i}from"./dist-bVqfYmby.js";import{O as a,a as o,n as s,u as c}from"./index-DIhMEAVw.js";var l=e(t(),1);function u(e,t){let n=e.indexOf(`,`);if(!e.startsWith(`data:`)||n===-1)throw Error(`dataUrlToFile: not a data URL`);let r=e.slice(0,n),i=/^data:([^;,]+)/.exec(r)?.[1]||`application/octet-stream`,a=e.slice(n+1);if(/;base64$/i.test(r)){let e=atob(a),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return new File([n],t,{type:i})}return new File([decodeURIComponent(a)],t,{type:i})}var d=n();function f({projectId:e,conversationId:t}){let{t:n}=r(`agent`),{closeBrowser:f,queueCapture:p}=o(),{materializeDraftConversation:m}=s(),h=(0,l.useMemo)(()=>`agent-${t??`home`}-${Math.round(performance.now())}`,[t]),g=async e=>{try{let r=await c(t??(await m()).id,u(e.screenshotDataUrl,`capture-${Date.now()}.png`));p(r),i.success(n(`workspace.browserCaptured`)),f()}catch(e){i.error(n(`workspace.uploadFailed`),{description:e instanceof Error?e.message:void 0})}};return(0,d.jsx)(a,{open:!0,onClose:f,projectId:e,pendingSpecId:h,confirmLabel:n(`workspace.browserConfirm`),selectLabel:n(`workspace.browserSelectStart`),onCaptured:e=>{g(e)}})}export{f as AgentBrowserCapture};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/AnalyticsPage-BtQuyfJm.js","assets/rolldown-runtime-CNC7AqOf.js","assets/jsx-runtime-zu2_FqZY.js","assets/chunk-KS7C4IRE-DEKu087k.js","assets/preload-helper-Czpn1I53.js","assets/i18n-hnX2DPmo.js","assets/createLucideIcon-Bjbbp_KS.js","assets/auth-D_5bQv5W.js","assets/activity-DiyjsgQV.js","assets/addspec-D2YIQ0GU.js","assets/agent-DB1JeE64.js","assets/agents-ms7TwG16.js","assets/agentstudio-CN2pokQu.js","assets/aiedit-iIjz2_Qk.js","assets/analytics-BMzCvrCU.js","assets/attachments-B53PG733.js","assets/browser-Cu58EpZU.js","assets/builder-CHuahItu.js","assets/chat-BGD7MXAy.js","assets/code-CHPkOkDS.js","assets/commands-6tYQih5m.js","assets/common-DHsv9N5d.js","assets/dashboard-B9GhC5ku.js","assets/explore-DgBACn39.js","assets/integrations-mB-7zoyT.js","assets/jira-CKJg3HZd.js","assets/jobs-B_TeSQxb.js","assets/loops-B7YpGizO.js","assets/mcp-D8BT78_L.js","assets/narration-DRaDnhT5.js","assets/nav-DjkmQJjd.js","assets/packet-Bh5kkbiB.js","assets/settings-DHh7_IF5.js","assets/setup-3jWaoVUO.js","assets/specs-DII0C8gw.js","assets/terminal-BFRZnMPP.js","assets/tickets-W6pBmbrX.js","assets/Trans-Bsz9_gyq.js","assets/bot-DzuuuC5R.js","assets/useDesktop-BQVt8lFd.js","assets/dist-bVqfYmby.js","assets/react-dom-DiWzBDP9.js","assets/clsx-CjueKrWZ.js","assets/provider-capabilities-Doej9lfa.js","assets/formatDistanceToNow-DQCvMgUc.js","assets/getTimezoneOffsetInMilliseconds-C16cxSe1.js","assets/spending-EC9xqio-.js","assets/index-DIhMEAVw.js","assets/save-B6wGWwBR.js","assets/TicketDetailModal-CsF-AWZX.js","assets/MinimizedChatsContext-Bd3OqR_S.js","assets/sparkles-DrY8hb0X.js","assets/x-CBMI9ejn.js","assets/file-text-BcLCfcWZ.js","assets/circle-x-CMYsN4ZH.js","assets/download-CFHyyHcw.js","assets/git-branch-BRM0F5GN.js","assets/loader-circle-DcygOQpC.js","assets/pencil-C9RkrIPZ.js","assets/play-DNlrawbS.js","assets/plus-CsnjfkmX.js","assets/search-Cq_gE3Ik.js","assets/trash-2-BOU3WdZZ.js","assets/triangle-alert-H9T4jAmh.js","assets/jira-api-B1-MUehg.js","assets/zap-CHo3aCD1.js","assets/dialog-CdWCb02j.js","assets/utils-BC4DHlz2.js","assets/button-CJqFnUOL.js","assets/lib-CGdyxIWg.js","assets/git-refresh-wTW0rO0Z.js","assets/core-B3mKBIh5.js","assets/event-Bt7f3wXe.js","assets/index-DwygcU7s.css","assets/ExportDropdown-BrtfWzEG.js","assets/BarChart-nBOMNfiy.js","assets/value-s-gzBeyF.js"])))=>i.map(i=>d[i]);
2
- import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{n as i}from"./createLucideIcon-Bjbbp_KS.js";import{t as a}from"./loader-circle-DcygOQpC.js";import{t as o}from"./x-CBMI9ejn.js";import{t as s}from"./utils-BC4DHlz2.js";import{a as c,ft as l,pt as u}from"./index-DIhMEAVw.js";var d=e(t(),1),f=n(),p=(0,d.lazy)(()=>r(()=>import(`./AnalyticsPage-BtQuyfJm.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76]))),m=420,h=560;function g(){let{t:e}=i(`agent`),{closeAnalyticsPane:t}=c(),[n,r]=(0,d.useState)(h),[g,_]=(0,d.useState)(!1),v=(0,d.useCallback)(e=>{let t=e.clientX,i=n,a=window.innerWidth-m;try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}let o=e=>{let n=Math.min(Math.max(i+(t-e.clientX),m),a);r(n)},s=()=>{window.removeEventListener(`pointermove`,o),window.removeEventListener(`pointerup`,s),window.removeEventListener(`pointercancel`,s)};window.addEventListener(`pointermove`,o),window.addEventListener(`pointerup`,s),window.addEventListener(`pointercancel`,s)},[n]);return(0,f.jsxs)(`div`,{className:s(`flex h-full flex-col overflow-hidden border-l border-border bg-background`,g&&`absolute inset-0 z-30 border-l-0`),style:g?void 0:{width:n,flexShrink:0},"data-testid":`agent-analytics-pane`,children:[(0,f.jsx)(`div`,{className:`relative flex items-center`,children:!g&&(0,f.jsx)(`div`,{role:`separator`,"aria-orientation":`vertical`,onPointerDown:v,className:`absolute left-0 top-0 h-full w-1.5 -translate-x-full cursor-col-resize select-none touch-none hover:bg-accent-primary/20`,title:e(`workspace.resizeAnalytics`)})}),(0,f.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border/60 bg-surface/40 px-3 py-1.5`,children:[(0,f.jsx)(`span`,{className:`text-xs font-medium text-foreground/70`,children:e(`workspace.analytics`)}),(0,f.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[(0,f.jsx)(`button`,{type:`button`,onClick:()=>_(e=>!e),"aria-label":e(g?`restore`:`maximize`),title:e(g?`restore`:`maximize`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:g?(0,f.jsx)(l,{className:`h-4 w-4`}):(0,f.jsx)(u,{className:`h-4 w-4`})}),(0,f.jsx)(`button`,{type:`button`,onClick:t,"aria-label":e(`workspace.closeAnalytics`),title:e(`workspace.closeAnalytics`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:(0,f.jsx)(o,{className:`h-4 w-4`})})]})]}),(0,f.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:(0,f.jsx)(d.Suspense,{fallback:(0,f.jsx)(`div`,{className:`flex h-24 items-center justify-center text-muted-foreground`,children:(0,f.jsx)(a,{className:`h-4 w-4 animate-spin`})}),children:(0,f.jsx)(p,{})})})]})}export{g as AgentModeAnalyticsPane};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/CodePage-BZ2MwdCu.js","assets/rolldown-runtime-CNC7AqOf.js","assets/jsx-runtime-zu2_FqZY.js","assets/react-dom-DiWzBDP9.js","assets/preload-helper-Czpn1I53.js","assets/chunk-KS7C4IRE-DEKu087k.js","assets/i18n-hnX2DPmo.js","assets/createLucideIcon-Bjbbp_KS.js","assets/auth-D_5bQv5W.js","assets/activity-DiyjsgQV.js","assets/addspec-D2YIQ0GU.js","assets/agent-DB1JeE64.js","assets/agents-ms7TwG16.js","assets/agentstudio-CN2pokQu.js","assets/aiedit-iIjz2_Qk.js","assets/analytics-BMzCvrCU.js","assets/attachments-B53PG733.js","assets/browser-Cu58EpZU.js","assets/builder-CHuahItu.js","assets/chat-BGD7MXAy.js","assets/code-CHPkOkDS.js","assets/commands-6tYQih5m.js","assets/common-DHsv9N5d.js","assets/dashboard-B9GhC5ku.js","assets/explore-DgBACn39.js","assets/integrations-mB-7zoyT.js","assets/jira-CKJg3HZd.js","assets/jobs-B_TeSQxb.js","assets/loops-B7YpGizO.js","assets/mcp-D8BT78_L.js","assets/narration-DRaDnhT5.js","assets/nav-DjkmQJjd.js","assets/packet-Bh5kkbiB.js","assets/settings-DHh7_IF5.js","assets/setup-3jWaoVUO.js","assets/specs-DII0C8gw.js","assets/terminal-BFRZnMPP.js","assets/tickets-W6pBmbrX.js","assets/dist-bVqfYmby.js","assets/TicketDetailModal-CsF-AWZX.js","assets/Trans-Bsz9_gyq.js","assets/save-B6wGWwBR.js","assets/MinimizedChatsContext-Bd3OqR_S.js","assets/sparkles-DrY8hb0X.js","assets/x-CBMI9ejn.js","assets/useDesktop-BQVt8lFd.js","assets/file-text-BcLCfcWZ.js","assets/circle-x-CMYsN4ZH.js","assets/download-CFHyyHcw.js","assets/git-branch-BRM0F5GN.js","assets/loader-circle-DcygOQpC.js","assets/pencil-C9RkrIPZ.js","assets/play-DNlrawbS.js","assets/plus-CsnjfkmX.js","assets/search-Cq_gE3Ik.js","assets/trash-2-BOU3WdZZ.js","assets/triangle-alert-H9T4jAmh.js","assets/jira-api-B1-MUehg.js","assets/zap-CHo3aCD1.js","assets/dialog-CdWCb02j.js","assets/utils-BC4DHlz2.js","assets/clsx-CjueKrWZ.js","assets/button-CJqFnUOL.js","assets/provider-capabilities-Doej9lfa.js","assets/lib-CGdyxIWg.js","assets/formatDistanceToNow-DQCvMgUc.js","assets/getTimezoneOffsetInMilliseconds-C16cxSe1.js","assets/spending-EC9xqio-.js","assets/index-DIhMEAVw.js","assets/bot-DzuuuC5R.js","assets/git-refresh-wTW0rO0Z.js","assets/core-B3mKBIh5.js","assets/event-Bt7f3wXe.js","assets/index-DwygcU7s.css"])))=>i.map(i=>d[i]);
2
- import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{n as i}from"./createLucideIcon-Bjbbp_KS.js";import{t as a}from"./x-CBMI9ejn.js";import{a as o,ft as s,pt as c}from"./index-DIhMEAVw.js";var l=e(t(),1),u=n(),d=(0,l.lazy)(()=>r(()=>import(`./CodePage-BZ2MwdCu.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73]))),f=new Map,p=420,m=560;function h({projectId:e,conversationId:t}){let{t:n}=i(`agent`),{closeCodePane:r}=o(),[h,g]=(0,l.useState)(m),[_,v]=(0,l.useState)(!1),y=(0,l.useRef)(null),b=`${e}:${t}`,x=(0,l.useCallback)(e=>{f.set(b,e)},[b]),S=(0,l.useCallback)(e=>{let t=e.clientX,n=h,r=window.innerWidth-p;try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}let i=e=>{let i=Math.min(Math.max(n+(t-e.clientX),p),r);g(i)},a=()=>{window.removeEventListener(`pointermove`,i),window.removeEventListener(`pointerup`,a),window.removeEventListener(`pointercancel`,a)};window.addEventListener(`pointermove`,i),window.addEventListener(`pointerup`,a),window.addEventListener(`pointercancel`,a)},[h]);return(0,u.jsxs)(`div`,{ref:y,className:`flex h-full flex-col overflow-hidden border-l border-border bg-background${_?` absolute inset-0 z-30 border-l-0`:``}`,style:_?void 0:{width:h,flexShrink:0},children:[(0,u.jsx)(`div`,{className:`relative flex items-center`,children:!_&&(0,u.jsx)(`div`,{role:`separator`,"aria-orientation":`vertical`,onPointerDown:S,className:`absolute left-0 top-0 h-full w-1.5 -translate-x-full cursor-col-resize select-none touch-none hover:bg-accent-primary/20`,title:n(`workspace.resizeCode`)})}),(0,u.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border/60 bg-surface/40 px-3 py-1.5`,children:[(0,u.jsx)(`span`,{className:`text-xs font-medium text-foreground/70`,children:n(`workspace.files`)}),(0,u.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[(0,u.jsx)(`button`,{type:`button`,onClick:()=>v(e=>!e),"aria-label":n(_?`restore`:`maximize`),title:n(_?`restore`:`maximize`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:_?(0,u.jsx)(s,{className:`h-4 w-4`}):(0,u.jsx)(c,{className:`h-4 w-4`})}),(0,u.jsx)(`button`,{type:`button`,onClick:r,"aria-label":n(`workspace.closeFiles`),title:n(`workspace.closeFiles`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:(0,u.jsx)(a,{className:`h-4 w-4`})})]})]}),(0,u.jsx)(`div`,{className:`min-h-0 flex-1 overflow-hidden`,children:(0,u.jsx)(l.Suspense,{fallback:(0,u.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:`…`}),children:(0,u.jsx)(d,{embedded:!0,initialPath:f.get(b)??null,onSelectedPathChange:x})})})]},b)}export{h as AgentModeCodePane};
@@ -1 +0,0 @@
1
- import{a as e}from"./rolldown-runtime-CNC7AqOf.js";import{n as t,t as n}from"./jsx-runtime-zu2_FqZY.js";import{a as r,w as i}from"./i18n-hnX2DPmo.js";import{n as a}from"./createLucideIcon-Bjbbp_KS.js";import{t as o}from"./loader-circle-DcygOQpC.js";import{t as s}from"./x-CBMI9ejn.js";import{a as c,i as l,r as u}from"./useDesktop-BQVt8lFd.js";import{t as d}from"./utils-BC4DHlz2.js";import{t as f}from"./formatDistanceToNow-DQCvMgUc.js";import{L as p,a as m,ft as h,jt as g,pt as _}from"./index-DIhMEAVw.js";import{n as v,t as y}from"./job-time-BCL7wee9.js";import{JobDetailModal as b}from"./JobDetailModal-NAJmuYIT.js";import{t as x}from"./format-command-C0D9IPmV.js";var S=e(t(),1),C=n(),w=360,T=480,E={running:`running`,completed:`success`,failed:`failed`,canceled:`canceled`,queued:`queued`};function D({projectId:e}){let{t}=a(`agent`),{t:n}=a(`jobs`),{closeJobsPane:D}=m(),{projects:O}=u(),k=O.find(t=>t.id===e)?.provider,[A,j]=(0,S.useState)(T),[M,N]=(0,S.useState)(!1),[P,F]=(0,S.useState)(null),{data:I,isFirstLoad:L,refresh:R}=l({namespace:`agent-jobs`,projectId:e,initialValue:[],fetcher:async()=>{let e=await fetch(`${c()}/jobs?limit=50`);return e.ok?(await e.json()).jobs:[]},pollInterval:5e3}),{registerHandler:z,unregisterHandler:B}=i(),V=(0,S.useRef)(e);V.current=e;let H=(0,S.useRef)(R);H.current=R,(0,S.useEffect)(()=>(z(`agent-jobs-pane`,e=>{let t=e;t.type===`queue`&&(t.projectId&&t.projectId!==V.current||H.current())}),()=>B(`agent-jobs-pane`)),[z,B]);let U=(0,S.useCallback)(e=>{let t=e.clientX,n=A,r=window.innerWidth-w;try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}let i=e=>{let i=Math.min(Math.max(n+(t-e.clientX),w),r);j(i)},a=()=>{window.removeEventListener(`pointermove`,i),window.removeEventListener(`pointerup`,a),window.removeEventListener(`pointercancel`,a)};window.addEventListener(`pointermove`,i),window.addEventListener(`pointerup`,a),window.addEventListener(`pointercancel`,a)},[A]);return(0,C.jsxs)(`div`,{className:d(`flex h-full flex-col overflow-hidden border-l border-border bg-background`,M&&`absolute inset-0 z-30 border-l-0`),style:M?void 0:{width:A,flexShrink:0},children:[(0,C.jsx)(`div`,{className:`relative flex items-center`,children:!M&&(0,C.jsx)(`div`,{role:`separator`,"aria-orientation":`vertical`,onPointerDown:U,className:`absolute left-0 top-0 h-full w-1.5 -translate-x-full cursor-col-resize select-none touch-none hover:bg-accent-primary/20`,title:t(`workspace.resizeJobs`)})}),(0,C.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border/60 bg-surface/40 px-3 py-1.5`,children:[(0,C.jsx)(`span`,{className:`text-xs font-medium text-foreground/70`,children:t(`workspace.jobs`)}),(0,C.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[(0,C.jsx)(`button`,{type:`button`,onClick:()=>N(e=>!e),"aria-label":t(M?`restore`:`maximize`),title:t(M?`restore`:`maximize`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:M?(0,C.jsx)(h,{className:`h-4 w-4`}):(0,C.jsx)(_,{className:`h-4 w-4`})}),(0,C.jsx)(`button`,{type:`button`,onClick:D,"aria-label":t(`workspace.closeJobs`),title:t(`workspace.closeJobs`),className:`rounded-md p-1 text-foreground/60 hover:bg-surface hover:text-foreground`,children:(0,C.jsx)(s,{className:`h-4 w-4`})})]})]}),(0,C.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-2`,children:L?(0,C.jsx)(`div`,{className:`flex h-24 items-center justify-center text-muted-foreground`,children:(0,C.jsx)(o,{className:`h-4 w-4 animate-spin`})}):I.length===0?(0,C.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-2 text-center text-muted-foreground`,children:[(0,C.jsx)(g,{className:`h-6 w-6 opacity-40`}),(0,C.jsx)(`p`,{className:`text-xs`,children:t(`workspace.noJobs`)})]}):(0,C.jsx)(`ul`,{className:`space-y-1`,children:I.map(e=>(0,C.jsx)(`li`,{children:(0,C.jsxs)(`button`,{type:`button`,onClick:()=>F(e.id),className:d(`flex w-full flex-col gap-1 rounded-lg border border-border/50 bg-surface/30 px-2.5 py-2 text-left transition-colors`,`hover:border-accent-primary/40 hover:bg-surface/60`),children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,C.jsx)(p,{variant:E[e.status]??`queued`,children:n(`statusLabel.${e.status in E?e.status:`queued`}`)}),e.status===`running`&&(0,C.jsx)(o,{className:`h-3 w-3 animate-spin text-accent-primary`}),(0,C.jsx)(`span`,{className:`ml-auto text-[10px] text-muted-foreground`,children:(()=>{let t=v(y(e));return t?f(t,{addSuffix:!0,locale:r()}):`—`})()})]}),(0,C.jsx)(`code`,{className:`truncate font-mono text-xs text-foreground/85`,children:x(e.command,k)})]})},e.id))})}),P&&(0,C.jsx)(b,{jobId:P,onClose:()=>F(null)})]})}export{D as AgentModeJobsPane};