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
@@ -204,79 +204,78 @@
204
204
  .specrails-splash__mark .pill { opacity: 1; }
205
205
  }
206
206
  </style>
207
- <script type="module" crossorigin src="/assets/index-DIhMEAVw.js"></script>
207
+ <script type="module" crossorigin src="/assets/index-EzrkUb8B.js"></script>
208
208
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-CNC7AqOf.js">
209
209
  <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-zu2_FqZY.js">
210
210
  <link rel="modulepreload" crossorigin href="/assets/react-dom-DiWzBDP9.js">
211
211
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-Czpn1I53.js">
212
212
  <link rel="modulepreload" crossorigin href="/assets/chunk-KS7C4IRE-DEKu087k.js">
213
- <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-Bjbbp_KS.js">
214
- <link rel="modulepreload" crossorigin href="/assets/auth-D_5bQv5W.js">
215
213
  <link rel="modulepreload" crossorigin href="/assets/activity-DiyjsgQV.js">
216
214
  <link rel="modulepreload" crossorigin href="/assets/addspec-D2YIQ0GU.js">
217
- <link rel="modulepreload" crossorigin href="/assets/agent-DB1JeE64.js">
215
+ <link rel="modulepreload" crossorigin href="/assets/agent-Bh9K7iEt.js">
218
216
  <link rel="modulepreload" crossorigin href="/assets/agents-ms7TwG16.js">
219
217
  <link rel="modulepreload" crossorigin href="/assets/agentstudio-CN2pokQu.js">
220
218
  <link rel="modulepreload" crossorigin href="/assets/aiedit-iIjz2_Qk.js">
221
219
  <link rel="modulepreload" crossorigin href="/assets/analytics-BMzCvrCU.js">
222
220
  <link rel="modulepreload" crossorigin href="/assets/attachments-B53PG733.js">
223
- <link rel="modulepreload" crossorigin href="/assets/browser-Cu58EpZU.js">
224
- <link rel="modulepreload" crossorigin href="/assets/builder-CHuahItu.js">
221
+ <link rel="modulepreload" crossorigin href="/assets/browser-CG0PE1j_.js">
222
+ <link rel="modulepreload" crossorigin href="/assets/builder-BTiGnPT0.js">
225
223
  <link rel="modulepreload" crossorigin href="/assets/chat-BGD7MXAy.js">
226
- <link rel="modulepreload" crossorigin href="/assets/code-CHPkOkDS.js">
227
- <link rel="modulepreload" crossorigin href="/assets/commands-6tYQih5m.js">
228
- <link rel="modulepreload" crossorigin href="/assets/common-DHsv9N5d.js">
229
- <link rel="modulepreload" crossorigin href="/assets/dashboard-B9GhC5ku.js">
224
+ <link rel="modulepreload" crossorigin href="/assets/code-DaZ-ZwCT.js">
225
+ <link rel="modulepreload" crossorigin href="/assets/commands-BAWSYHjQ.js">
226
+ <link rel="modulepreload" crossorigin href="/assets/common-BrlwEnL7.js">
227
+ <link rel="modulepreload" crossorigin href="/assets/dashboard-BfBir_6o.js">
230
228
  <link rel="modulepreload" crossorigin href="/assets/explore-DgBACn39.js">
231
229
  <link rel="modulepreload" crossorigin href="/assets/integrations-mB-7zoyT.js">
232
230
  <link rel="modulepreload" crossorigin href="/assets/jira-CKJg3HZd.js">
233
- <link rel="modulepreload" crossorigin href="/assets/jobs-B_TeSQxb.js">
231
+ <link rel="modulepreload" crossorigin href="/assets/jobs-DzMjUcaN.js">
234
232
  <link rel="modulepreload" crossorigin href="/assets/loops-B7YpGizO.js">
235
- <link rel="modulepreload" crossorigin href="/assets/mcp-D8BT78_L.js">
236
- <link rel="modulepreload" crossorigin href="/assets/narration-DRaDnhT5.js">
237
- <link rel="modulepreload" crossorigin href="/assets/nav-DjkmQJjd.js">
238
- <link rel="modulepreload" crossorigin href="/assets/packet-Bh5kkbiB.js">
239
- <link rel="modulepreload" crossorigin href="/assets/settings-DHh7_IF5.js">
240
- <link rel="modulepreload" crossorigin href="/assets/setup-3jWaoVUO.js">
233
+ <link rel="modulepreload" crossorigin href="/assets/mcp-CUAN6ORK.js">
234
+ <link rel="modulepreload" crossorigin href="/assets/narration-B-ynWTpn.js">
235
+ <link rel="modulepreload" crossorigin href="/assets/nav-Ch-zHBG5.js">
236
+ <link rel="modulepreload" crossorigin href="/assets/packet-Cx-zRuWn.js">
237
+ <link rel="modulepreload" crossorigin href="/assets/settings-BJB9RKJj.js">
238
+ <link rel="modulepreload" crossorigin href="/assets/setup-Ba11l2JA.js">
241
239
  <link rel="modulepreload" crossorigin href="/assets/specs-DII0C8gw.js">
242
- <link rel="modulepreload" crossorigin href="/assets/terminal-BFRZnMPP.js">
240
+ <link rel="modulepreload" crossorigin href="/assets/terminal-BAzpHtpY.js">
243
241
  <link rel="modulepreload" crossorigin href="/assets/tickets-W6pBmbrX.js">
244
- <link rel="modulepreload" crossorigin href="/assets/i18n-hnX2DPmo.js">
245
- <link rel="modulepreload" crossorigin href="/assets/Trans-Bsz9_gyq.js">
246
- <link rel="modulepreload" crossorigin href="/assets/dist-bVqfYmby.js">
242
+ <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-Bjbbp_KS.js">
243
+ <link rel="modulepreload" crossorigin href="/assets/useSharedWebSocket-BOdS5_Iz.js">
244
+ <link rel="modulepreload" crossorigin href="/assets/Trans-SnMX4MhW.js">
245
+ <link rel="modulepreload" crossorigin href="/assets/useDesktop-RSMTyy7V.js">
247
246
  <link rel="modulepreload" crossorigin href="/assets/save-B6wGWwBR.js">
247
+ <link rel="modulepreload" crossorigin href="/assets/spending-BqbdPm_4.js">
248
248
  <link rel="modulepreload" crossorigin href="/assets/sparkles-DrY8hb0X.js">
249
249
  <link rel="modulepreload" crossorigin href="/assets/x-CBMI9ejn.js">
250
- <link rel="modulepreload" crossorigin href="/assets/useDesktop-BQVt8lFd.js">
251
- <link rel="modulepreload" crossorigin href="/assets/MinimizedChatsContext-Bd3OqR_S.js">
250
+ <link rel="modulepreload" crossorigin href="/assets/MinimizedChatsContext-Deg39peL.js">
252
251
  <link rel="modulepreload" crossorigin href="/assets/file-text-BcLCfcWZ.js">
253
252
  <link rel="modulepreload" crossorigin href="/assets/circle-x-CMYsN4ZH.js">
254
253
  <link rel="modulepreload" crossorigin href="/assets/download-CFHyyHcw.js">
255
254
  <link rel="modulepreload" crossorigin href="/assets/git-branch-BRM0F5GN.js">
256
255
  <link rel="modulepreload" crossorigin href="/assets/loader-circle-DcygOQpC.js">
257
256
  <link rel="modulepreload" crossorigin href="/assets/pencil-C9RkrIPZ.js">
258
- <link rel="modulepreload" crossorigin href="/assets/play-DNlrawbS.js">
257
+ <link rel="modulepreload" crossorigin href="/assets/square-Ci-PFcFe.js">
259
258
  <link rel="modulepreload" crossorigin href="/assets/plus-CsnjfkmX.js">
260
259
  <link rel="modulepreload" crossorigin href="/assets/search-Cq_gE3Ik.js">
261
260
  <link rel="modulepreload" crossorigin href="/assets/trash-2-BOU3WdZZ.js">
262
261
  <link rel="modulepreload" crossorigin href="/assets/triangle-alert-H9T4jAmh.js">
263
- <link rel="modulepreload" crossorigin href="/assets/jira-api-B1-MUehg.js">
262
+ <link rel="modulepreload" crossorigin href="/assets/jira-api-CSCqGr-Q.js">
264
263
  <link rel="modulepreload" crossorigin href="/assets/zap-CHo3aCD1.js">
265
264
  <link rel="modulepreload" crossorigin href="/assets/clsx-CjueKrWZ.js">
266
265
  <link rel="modulepreload" crossorigin href="/assets/utils-BC4DHlz2.js">
267
- <link rel="modulepreload" crossorigin href="/assets/dialog-CdWCb02j.js">
268
- <link rel="modulepreload" crossorigin href="/assets/button-CJqFnUOL.js">
269
- <link rel="modulepreload" crossorigin href="/assets/provider-capabilities-Doej9lfa.js">
266
+ <link rel="modulepreload" crossorigin href="/assets/dialog-SRw01_QU.js">
270
267
  <link rel="modulepreload" crossorigin href="/assets/lib-CGdyxIWg.js">
271
- <link rel="modulepreload" crossorigin href="/assets/getTimezoneOffsetInMilliseconds-C16cxSe1.js">
272
- <link rel="modulepreload" crossorigin href="/assets/formatDistanceToNow-DQCvMgUc.js">
273
- <link rel="modulepreload" crossorigin href="/assets/spending-EC9xqio-.js">
274
- <link rel="modulepreload" crossorigin href="/assets/TicketDetailModal-CsF-AWZX.js">
275
- <link rel="modulepreload" crossorigin href="/assets/bot-DzuuuC5R.js">
276
- <link rel="modulepreload" crossorigin href="/assets/git-refresh-wTW0rO0Z.js">
268
+ <link rel="modulepreload" crossorigin href="/assets/getTimezoneOffsetInMilliseconds-YhD8rIEs.js">
269
+ <link rel="modulepreload" crossorigin href="/assets/formatDistanceToNow-DSj5DprF.js">
270
+ <link rel="modulepreload" crossorigin href="/assets/button-DCBqEaZl.js">
271
+ <link rel="modulepreload" crossorigin href="/assets/project-repositories-DYhTvwQ1.js">
272
+ <link rel="modulepreload" crossorigin href="/assets/RepositoryScopeSelector-D-RCaknl.js">
273
+ <link rel="modulepreload" crossorigin href="/assets/provider-capabilities-B-wOHfLP.js">
274
+ <link rel="modulepreload" crossorigin href="/assets/TicketDetailModalContext-DqyF0so-.js">
277
275
  <link rel="modulepreload" crossorigin href="/assets/core-B3mKBIh5.js">
276
+ <link rel="modulepreload" crossorigin href="/assets/RepositoryDeliveries-CSDsiVUz.js">
278
277
  <link rel="modulepreload" crossorigin href="/assets/event-Bt7f3wXe.js">
279
- <link rel="stylesheet" crossorigin href="/assets/index-DwygcU7s.css">
278
+ <link rel="stylesheet" crossorigin href="/assets/index-DwAmL7m5.css">
280
279
  </head>
281
280
  <body>
282
281
  <div id="specrails-splash" aria-hidden="false" role="status" aria-label="Loading Specrails">
package/docs/README.md CHANGED
@@ -17,6 +17,9 @@ If you're contributing to the app itself or building on its API, head over to [`
17
17
  | Guide | Use it when… |
18
18
  |-------|-------------|
19
19
  | [Creating specs](creating-specs.md) | …you want to draft a spec, compare two specs, save a draft, split a big epic, or refine an existing spec |
20
+ | [Projects with several repositories](multi-repo-projects.md) | …your product spans frontend, backend or other repos and needs one shared backlog |
21
+ | [Messages during a mission](agent-live-steering.md) | …you want to give the agent new instructions while it is working |
22
+ | [Mission applications and process logs](mission-processes.md) | …you want to launch an application, stop it reliably or inspect its output |
20
23
  | [Running pipelines](running-pipelines.md) | …you want to launch the AI pipeline against a spec, manage rails, pick agent profiles, or install plugins |
21
24
  | [Using Codex](codex.md) | …you added a project with OpenAI's Codex CLI instead of (or alongside) Claude |
22
25
  | [Using Gemini](gemini.md) | …you added a project with Google's Gemini CLI instead of (or alongside) Claude, Codex, or Kimi |
@@ -0,0 +1,57 @@
1
+ # Mensajes durante una misión
2
+
3
+ Puedes escribir más contenido mientras el agente trabaja: por ejemplo, «incluye frontend y backend» o «mantén compatible la API actual». Al enviarlo, queda en cola para el siguiente turno. Cada mensaje pendiente tiene sus propios controles:
4
+
5
+ - **Guiar:** envía esa indicación al agente durante la ejecución, sin detener el modelo. Los demás mensajes conservan su posición en la cola.
6
+ - **Borrar:** retira el mensaje pendiente para que no se ejecute.
7
+ - **⋯ → Editar:** lleva su texto al compositor conservando adjuntos y referencias.
8
+
9
+ Enviar y Detener permanecen disponibles por separado. Una vez solicitada la entrega, los controles del mensaje se desactivan para evitar modificar contenido que ya está llegando al proveedor.
10
+
11
+ Con **Claude y Codex**, las indicaciones entran por el canal nativo del proveedor durante la ejecución. No hace falta esperar a una llamada al MCP de Specrails. Claude las incorpora al contexto después de su lote de herramientas en curso; Codex acepta la actualización del turno activo mediante `turn/steer`. No se mata una herramienta para introducir el mensaje. La conversación mantiene el orden: respuesta anterior, nueva indicación y continuación del agente.
12
+
13
+ Con **Gemini y Kimi**, los transportes actuales siguen entregando las indicaciones en el siguiente punto seguro de las herramientas de Specrails. Si una acción ya está ejecutándose, se conserva su resultado. Las acciones todavía no iniciadas se suspenden para que el agente lea la corrección y revise su plan. Si no aparece otro punto de entrega, Specrails continúa con el mensaje pendiente al terminar la invocación.
14
+
15
+ Si el agente está esperando novedades de un rail o job mediante `specrails_watch`, tu mensaje termina inmediatamente esa espera para darle paso. El rail o job observado sigue ejecutándose; no se cancela como efecto de enviar el mensaje.
16
+
17
+ ## Estados y recuperación
18
+
19
+ - **En cola:** el mensaje espera al siguiente turno. Puedes editarlo, borrarlo o pulsar Guiar.
20
+ - **Un check gris:** enviado desde la misión; aún falta confirmar su recepción por el proveedor. Tooltip «Enviado al agente».
21
+ - **Dos checks grises:** el transporte ha confirmado la recepción. Todavía no hay confirmación de lectura. Tooltip «Entregado al agente».
22
+ - **Dos checks verdes:** el agente ha confirmado la lectura del mensaje. Tooltip «Leído por el agente». No certifica que la implementación ya cumpla la indicación.
23
+ - **Cancelado antes de entregarse:** detuviste la misión cuando el mensaje todavía estaba pendiente de envío.
24
+ - **Entrega no confirmada:** el proceso se interrumpió o se perdió la confirmación del proveedor. El mensaje podría haber llegado; Specrails conserva el contenido y sus adjuntos y no lo reenvía automáticamente.
25
+
26
+ Una reconexión recupera los mensajes pendientes y el fragmento de respuesta actual. Si falla el envío HTTP, el borrador permanece disponible; reintentar ese mismo envío conserva su identificador para evitar duplicados cuando el servidor ya lo había aceptado.
27
+
28
+ Los estados de envío se muestran como iconos, con su explicación al pasar el ratón y una etiqueta para lectores de pantalla. Los recibos se guardan y avanzan en un solo sentido: enviado, entregado, leído. Un evento o una respuesta antigua no vuelve gris un recibo verde.
29
+
30
+ ## Alcance
31
+
32
+ Enviar durante una ejecución no garantiza que el modelo cambie una acción que ya ha comenzado ni que interrumpa su razonamiento inmediatamente. El eco de usuario con UUID en Claude y la respuesta de `turn/steer` en Codex confirman recepción; por sí solos no demuestran lectura. En ambos, el verde requiere que el agente confirme esos mensajes con `specrails_mission(action:'acknowledge_inputs', inputIds:[queueId, ...])`. Una salida posterior del modelo no marca automáticamente leída una corrección nativa. En la vía MCP, confirmar la revisión entregada con `acknowledge_updates` registra la lectura. El mensaje inicial incluye un identificador de entrada y también requiere un acuse explícito de lectura. Los avisos sintéticos del proveedor no ponen checks verdes. Si el turno ya terminó antes del envío, el mensaje continúa por la vía normal. Una escritura sin confirmación nunca se reintenta automáticamente.
33
+
34
+ Claude usa un proceso `stream-json` con entrada abierta; una indicación que llega después de su última frontera interna puede ejecutarse como siguiente turno nativo del mismo proceso. Gemini ACP actualmente cancela el prompt anterior al enviar otro, y Kimi requiere un transporte Server API diferente: no se usan esas rutas como sustituto de la entrega actual.
35
+
36
+ Una indicación a la misión no cambia por sí sola un job de los rails que ya se haya lanzado. El agente debe revisar su estado y realizar las acciones de gestión apropiadas con los permisos existentes. El proveedor, el proyecto fijado y los permisos del proceso activo tampoco cambian mediante una indicación.
37
+
38
+ Las referencias a specs, archivos y repositorios conservan su identidad. Los adjuntos de texto se resuelven como contexto. Codex recibe las imágenes por su entrada nativa de archivo; Claude recibe bloques de imagen y los otros transportes usan imágenes MCP, con un presupuesto de 8 MiB por lote. Los archivos originales y sus referencias se conservan; las imágenes no disponibles o que superan el presupuesto se indican explícitamente sin inventar su contenido.
39
+
40
+ ## Implementación
41
+
42
+ `agent_inputs` es una tabla aditiva en la base de datos global. Cada mensaje tiene un identificador idempotente por conversación, metadatos y estado. La entrega y la creación de la fila del usuario son atómicas. Los mensajes cancelados o interrumpidos no se incorporan como nuevas instrucciones al reconstruir el historial del proveedor.
43
+
44
+ Cada invocación tiene un único canal de entrega. Los transportes nativos conservan los permisos, el directorio y la configuración MCP del proceso. La confirmación del proveedor guarda de forma síncrona el fragmento de conversación antes de publicar más salida. La admisión, los límites de procesos y el encaminamiento de Headroom siguen usando `spawnAiCli`.
45
+
46
+ Para los transportes con entrega MCP, el intermediario se vincula al objeto de base de datos y a la capability de una invocación concreta. Intercepta las herramientas antes y después del despacho. El agente confirma las revisiones con `specrails_mission(acknowledge_updates)`; confirmar una entrega anterior no desbloquea acciones mientras haya indicaciones posteriores pendientes. Las llamadas externas o de otra misión no acceden a esta bandeja.
47
+
48
+ La migración 28 añade el recibo a la tabla existente. Las entregas anteriores se convierten en recibidas, nunca en leídas por suposición. `agent_input_receipt` actualiza el icono sin alterar el orden de la conversación ni la respuesta en curso. La confirmación de lectura nativa valida el lote completo contra los mensajes entregados en esa invocación; no puede marcar mensajes pendientes, de otra misión o de una invocación anterior.
49
+
50
+ Cada invocación, incluido un reintento por sesión caducada, recibe una capability y un archivo de credenciales propios. Al finalizar, ambos quedan revocados o retirados. Una llamada tardía de un proceso anterior no puede consumir mensajes ni heredar los permisos de la siguiente invocación.
51
+
52
+ ## Fuentes de los protocolos
53
+
54
+ - [Claude CLI: stream-json y replay-user-messages](https://code.claude.com/docs/en/cli-reference), contrastado con el bucle nativo de Claude Code 2.1.261.
55
+ - [Codex app-server](https://learn.chatgpt.com/docs/app-server), contrastado con el esquema generado por Codex 0.153.4.
56
+ - [Gemini model steering](https://geminicli.com/docs/cli/model-steering/) y ACP instalado 0.49.0: la capacidad interactiva no equivale a entrada sin interrupción en su transporte ACP.
57
+ - [Kimi Server API](https://www.kimi.com/code/docs/en/kimi-code-cli/reference/server-api.html): transporte distinto del modo print utilizado actualmente.
package/docs/ci-cd.md ADDED
@@ -0,0 +1,57 @@
1
+ # CI and releases
2
+
3
+ Desktop distributes an npm package and native installers. Their publication workflows require successful `CI` for the **same commit**, from a `main` push in this repository. A passing pull request, another commit, a skipped run or an older successful attempt does not authorize publication. No repository protection setting is assumed by this check.
4
+
5
+ ## Quality checks
6
+
7
+ | Workflow or command | What it checks |
8
+ | --- | --- |
9
+ | `CI` on pushes, pull requests and merge queues | Workflow syntax, secrets, TypeScript, server/client coverage, package contents and platform regressions |
10
+ | `npm run test:scripts` | Every `scripts/*.test.mjs` helper, including release admission, package integrity and Core dispatch handling |
11
+ | `npm run build` then `npm run check:package` | A real npm tarball, isolated production install with lifecycle scripts disabled, CLI help/version, MCP and required runtime resources |
12
+ | Windows x64 and ARM64 jobs | Native filesystem/process regressions, terminal/background containment, client tests, bundled Core and native browser/mission window fixtures |
13
+ | macOS native job | Native Rust tests and browser, popup, multiwindow and mission window fixtures |
14
+ | Native release builds | Packaged resources and installer validation; Windows additionally exercises installed NSIS/MSI artifacts |
15
+
16
+ The npm package check does not start a server or exercise native postinstall rebuilds. Native platform jobs and installed application smoke tests provide separate evidence. Defining a Windows or signing job is not evidence that it has passed: inspect the corresponding GitHub run before claiming platform or release acceptance.
17
+
18
+ Actions are pinned to commit SHAs. Downloaded actionlint and gitleaks binaries have fixed checksums verified before execution. Actionlint checks workflow structure, expressions and action inputs; its ShellCheck integration is disabled, so it does not claim complete shell-script analysis. Dependabot covers root/client/MCP npm dependencies, GitHub Actions and Cargo.
19
+
20
+ ## Release flow
21
+
22
+ 1. A successful main `CI` run triggers `Release`. It checks out that exact revision, skips superseded main revisions and lets release-please maintain the release pull request or tag. The credential-bearing job does not install dependencies or run builds.
23
+ 2. `Publish npm` and the publishing mode of `Desktop Release` accept a stable `vX.Y.Z` tag only when it exactly matches `package.json` and the checked-out commit. Publication retries must select that existing tag; for `Desktop Release`, explicitly set `validation_only=false`. Prereleases and branch-based manual publication are rejected.
24
+ 3. Both workflows wait for successful main CI for that exact SHA, with a bounded deadline. Failed or cancelled CI must be corrected or rerun successfully before retrying publication. This is an API check requiring `actions: read`, not an assumption about branch protection.
25
+ 4. The npm packaging job builds and verifies a tarball with read-only repository permissions. It uploads that tarball and its integrity receipt. A separate publication job rechecks its identity and hashes and publishes those exact bytes with lifecycle scripts disabled and provenance enabled.
26
+ 5. Native publication waits for every platform build. The mutable download channel is serialized, refuses older versions, and switches the verified manifest using an FTPS rename after all referenced files are uploaded. Server-managed `.htaccess` remains untouched. Previous binaries are retired only after the new manifest has been fetched and verified.
27
+
28
+ npm publication is serialized across versions and checks the current `latest` version before publishing. An already published version is skipped only if its registry integrity matches the verified tarball. A different payload fails rather than overwriting an immutable package. Concurrency alone cannot prevent an old retry from running after a newer release, which is why version guards are also required. [GitHub concurrency behavior](https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/control-workflow-concurrency).
29
+
30
+ Release admission uses the current run/attempt of the named CI workflow and the exact SHA, repository, branch and event. The metadata workflow consumes no artifacts from an untrusted pull request. [Workflow-run trust and event behavior](https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows), [workflow runs API](https://docs.github.com/en/rest/actions/workflow-runs).
31
+
32
+ ## Native validation without publication
33
+
34
+ Manually running `Desktop Release` defaults to `validation_only=true`. Select a trusted branch in this repository: admission requires successful push CI for that exact branch and SHA, and refuses evidence from another branch, a pull request or a fork. Selecting an existing matching release tag instead requires its main push CI. Validation builds retain their artifacts in GitHub Actions; macOS signing/notarization remains mandatory and the existing Windows installer signing policy is unchanged. The entire GitHub Release/Hostinger deployment job is skipped. A passing validation build does not publish a release or move an update channel.
35
+
36
+ Both validation and release builds use `assemble-chromium.mjs --release`. On macOS, the certificate and Apple API key are imported before Chromium assembly. The assembler must sign and notarize Chromium before writing a normal `chromium.tar.gz`; missing credentials or failed verification fail the build. Windows uses the same archive format without changing the browser's Authenticode signature. The archive keeps framework symlinks intact through Tauri resource copying. Staging and packaged macOS smoke tests require Chromium signature and notarization verification as well as actual browser execution.
37
+
38
+ Local source tests can verify archive structure, symlinks and failure handling without accessing signing keys. Acceptance of Developer ID signatures, notarization and Gatekeeper behavior still requires the native validation run and inspection of its artifacts; an unsigned development build is not equivalent evidence.
39
+
40
+ The macOS job retains `artifacts/chromium-signing/` as the `chromium-signing-macos` Actions artifact for 14 days, including on failure. It contains the notarization submission/result/log JSON and the bundle verification receipt with checksums; private keys and certificates are not stored there. The job allows 120 minutes for assembly, Chromium notarization, outer-app notarization and smoke tests. When updating Playwright to a different Chromium major, review [the entitlement policy](../scripts/chromium-entitlements/README.md) and its current major-148 guard before accepting the new browser; do not bypass that guard merely to make the build pass.
41
+
42
+ ## Credentials and external requirements
43
+
44
+ - `RELEASE_PAT` must be authorized for release-please's pull requests and releases. It also permits tag pushes to trigger publication workflows; events created with the repository's ordinary `GITHUB_TOKEN` generally do not trigger another workflow.
45
+ - `NPM_TOKEN` must authenticate an account with publishing permission for `specrails-desktop`. The workflow checks authentication and gives an explicit error before publishing. Provenance requires `id-token: write`; it does **not** grant npm publishing permission. Trusted publishing requires separate registry configuration and is not silently enabled here. An npm `E404` during publication is not sufficient evidence to identify a particular token or permission failure. [npm publishing and provenance](https://docs.github.com/en/actions/tutorials/publish-packages/publish-nodejs-packages).
46
+ - Existing Apple signing/notarization and Tauri updater signing secrets remain required. Installer build steps retain their platform-specific checks.
47
+ - Hostinger credentials must support **explicit FTPS**, a valid TLS certificate, uploads and `RNFR`/`RNTO` in the release directory. There is no plaintext FTP fallback. A failed transfer or rename fails the workflow before old files are removed. [FTP action protocol and security options](https://github.com/SamKirkland/FTP-Deploy-Action/blob/v4.3.6/action.yml).
48
+
49
+ No secret, registry authorization, signing certificate, hosting permission or branch protection is configured by these source changes. Dependency installation is separated from npm publishing credentials. Candidate Core packages and publication tarballs use `--ignore-scripts` at the relevant installation/publication boundaries. [npm installation lifecycle options](https://docs.npmjs.com/cli/v11/commands/npm-ci/).
50
+
51
+ ## Core compatibility dispatch
52
+
53
+ After publishing Core, its workflow dispatches `specrails-core-released` to Desktop with `client_payload.core_version` set to a bare stable version such as `5.0.0`. Desktop validates this value before using it as an npm package selector, installs that exact candidate in a temporary directory without running package scripts, and reads that candidate's contract explicitly.
54
+
55
+ A missing package, malformed version, registry failure or missing contract fails the check without claiming compatibility or opening a misleading drift issue. A measured contract mismatch or unsupported Core major opens one issue per version, using a separate `issues: write` job. The compatibility check does not upgrade the pinned native Core bundle; that remains a reviewed source change.
56
+
57
+ For local checks, run `npm run test:scripts` and actionlint 1.7.12 with `-shellcheck=`. For a reusable npm artifact, run `npm run build` followed by `npm run check:package -- --output artifacts/npm`; retain both the tarball and `package-verification.json` together. These commands do not publish anything.
@@ -0,0 +1,48 @@
1
+ # Exploring files and recorded changes
2
+
3
+ The Files workspace is a read-only way to navigate a project's repositories, understand source files and inspect the work recorded by Specrails. It is available as a full page and in the mission Files pane.
4
+
5
+ ## Navigation
6
+
7
+ - **Files** starts with all eligible files. The AI-touched filter and spec/run filters remain available. The tree supports arrow keys, Home, End, Enter and Space, reveals the selected file, and retains folder preferences per repository.
8
+ - **Search** finds filenames or literal source text. Multi-repository projects can search all repositories or the selected one. Content search supports case sensitivity and a folder/file restriction. Results carry repository identity and open the matching line.
9
+ - **Activity** lists recorded changes across repositories or within the selected repository, grouped by run and spec. It includes additions, modifications and deletions. Open a record to inspect its stored patch.
10
+
11
+ The repository selector, breadcrumbs and navigation history preserve file identity. URL links use `repositoryId`, `path`, optional `line`, and optional `changeJobId` for a recorded patch. `jobId` and `ticketId` remain list filters. Embedded mission navigation keeps its own history and does not change the mission URL.
12
+
13
+ In narrow panes, opening a file gives the reader the full pane width. The navigation toggle returns to Files, Search or Activity. The mission pane can also be resized or maximized. File names take priority over metadata in the tree.
14
+
15
+ ## Reading and understanding
16
+
17
+ The source reader provides syntax highlighting, line numbers, find-in-file, line navigation, word wrap, Markdown preview and path copying. It does not expose editing or saving. Legacy write endpoints are retained for compatibility.
18
+
19
+ File summaries explain purpose, responsibilities and contracts visible in the supplied source. Their metadata identifies the model, generation time, freshness and whether the source snapshot was partial. The source remains readable while a summary is absent or unavailable. Regeneration still uses the existing budget confirmation flow.
20
+
21
+ Construction stories connect interventions to their specs and runs and can explain stored patch evidence. Explanations with missing evidence are refused, incomplete evidence is disclosed, and cached explanations can be refreshed. Existing summary caches remain readable; language, prompt and evidence changes can make them stale.
22
+
23
+ ## Current source and recorded evidence
24
+
25
+ **Current file** reads the registered checkout. **Recorded change** displays a patch captured during a past Specrails run. A patch can remain available after file deletion or before worktree changes have been integrated. It is not a complete worktree snapshot and cannot reconstruct omitted content.
26
+
27
+ Missing patches and truncated evidence are explicit. The diff viewer bounds rendered evidence to 2,000 lines or 256,000 characters and reports when its preview is limited. Only recorded provenance is attributed to Specrails; this view does not infer authorship for arbitrary local edits.
28
+
29
+ Specs list touched files from all member repositories. Links retain the repository ID, including when different repositories contain the same relative path.
30
+
31
+ ## Reliability and limits
32
+
33
+ Reads and generation callbacks are scoped to project, repository and file. Abandoned reads are cancelled; late responses cannot replace a newer selection. Independent full-page and mission viewers have independent WebSocket subscriptions. Repeated provenance events are coalesced into bounded refreshes.
34
+
35
+ Tree and search limits are visible instead of appearing as exhaustive results. Tree pages share a snapshot (up to four snapshots per repository router, retained for two minutes); expired pages ask for a refresh instead of silently mixing different scans. Each page rechecks current path exclusions. Activity uses a stable snapshot and keyset pagination; each page rechecks project membership and path exclusions. Its defaults are 50 records per page, at most 100 requested records, and a 2,000-row/2-second scan budget. The activity UI retains at most 1,000 records. Narrow the repository or spec/run scope to continue exploring large histories.
36
+
37
+ Source discovery and activity respect excluded paths, Git ignore policy and repository boundaries. Unavailable repositories or unverifiable exclusions produce an incomplete-result state. A partial result never proves that no matching file or change exists.
38
+
39
+ Summary and story work share concurrency and spending controls. A summary stores the hash of the actual source snapshot sent to the provider and rechecks current freshness at completion. Disposing a project settles queued work and cancels running provider processes. Explicit provider errors cannot be saved as successful explanations.
40
+
41
+ ## API additions
42
+
43
+ - `GET /api/projects/:projectId/code/activity`: project-wide recorded activity.
44
+ - `GET /api/projects/:projectId/repositories/:repositoryId/code/activity`: repository-scoped activity.
45
+ - Query fields: `repositoryId`, `ticketId`, `jobId`, `limit`, `cursor`.
46
+ - Response: `{ entries, nextCursor, truncated, warnings? }`. Each entry includes repository identity, path, change kind, spec/run IDs, timestamp and patch availability.
47
+
48
+ The UI also uses the existing repository `/code/find`, `/code/search` and project `/code/discover` APIs. No language server, source-editing process or new model invocation is needed to search or inspect recorded changes.
package/docs/codex.md CHANGED
@@ -102,6 +102,17 @@ spawns, no overrides.
102
102
 
103
103
  ## What's different across providers
104
104
 
105
+ `gpt-6-astra` is available in the spec, agent, rail and standalone-loop model
106
+ pickers and is the Codex **Max** preset. The default remains `gpt-5.5`.
107
+ Its cost stays unavailable until a rate card is configured.
108
+
109
+ Reasoning choices follow the selected model's CLI capabilities, verified on
110
+ 2026-09-05: Astra, Sol and Terra offer `low`, `medium`, `high`, `xhigh`, `max`
111
+ and `ultra`; Luna stops at `max`; GPT-5.5 and GPT-5.4 Mini stop at `xhigh`.
112
+ These models do not offer `minimal`. Mission-originated launches inherit the
113
+ mission's model and effort when the engine matches; an explicit launch model
114
+ still takes precedence.
115
+
105
116
  The table below includes all four registered providers. See the
106
117
  [Kimi guide](kimi.md) for its full safety matrix.
107
118
 
@@ -111,7 +122,7 @@ The table below includes all four registered providers. See the
111
122
  | **Min CLI version** | none pinned | `0.128.0` | `0.11.0` | `0.27.0` |
112
123
  | **Project dir** | `.claude/` | `.codex/` | `.gemini/` | `.kimi-code/` |
113
124
  | **Instructions file** | `CLAUDE.md` | `AGENTS.md` | `GEMINI.md` | `AGENTS.md` |
114
- | **Default model** | `sonnet` | `gpt-5.5` | `gemini-3.5-flash` | `k3` |
125
+ | **Default model** | `sonnet` | `gpt-5.5` (catalog also lists `gpt-6-astra` — the `max` preset model, no rate card yet so its cost shows as unavailable — and the GPT-5.6 family `gpt-5.6-sol` / `gpt-5.6-terra` / `gpt-5.6-luna`) | `gemini-3.5-flash` | `k3` |
115
126
  | **Reasoning efforts** | `low`–`xhigh` | model-dependent | none | `low`/`high`/`max`, K3 only |
116
127
  | **Agent format** | `.claude/agents/<id>.md` | `.codex/skills/<id>/SKILL.md` | `.gemini/` target | `.kimi-code/skills/<id>/SKILL.md` |
117
128
  | **Agent profiles** | ✅ | legacy | legacy | ✅ provider-scoped |
@@ -0,0 +1,59 @@
1
+ # Detachable mission windows
2
+
3
+ A mission can move from the main Specrails interface to its own native window on macOS or Windows. Several missions can remain visible at once, each bound to its original conversation and project. Home missions also work. Browser-only development retains the integrated interface and does not offer native window controls.
4
+
5
+ ## Using the windows
6
+
7
+ Use the mission header action to open a separate window. Selecting that action again focuses the existing window; it does not create another copy. The main interface shows where the mission is open instead of exposing a second editable conversation. Each window has independent minimize, maximize/restore and resize controls. Minimizing main leaves the other mission windows available.
8
+
9
+ The reintegrate action and the mission window's native close button return it to main. Closing main preserves its existing hide-to-tray behavior. Quitting Specrails remains an application shutdown, including its backend; it is different from moving or closing one mission window.
10
+
11
+ ## State and execution
12
+
13
+ The feature moves a view of the existing conversation. It does not create another server, database, agent invocation or provider session, and it does not restart a running agent. Transcript, queued messages, active tools and running jobs remain in the existing backend. The destination reconnects to that state.
14
+
15
+ A versioned snapshot carries unsent composer text, inline reference positions, uploaded attachment descriptors, scroll position, workspace panels, selected repository/file, browser identity/URL and the selected terminal layout/session ID. Input is frozen during the handoff. The destination restores its view and acknowledges the current transfer revision before ownership changes or the old mission window is destroyed. Failed hydration and timeouts retain a recoverable source snapshot; a delayed acknowledgement cannot commit an obsolete transfer. Pending uploads or other unfinished composer operations must finish before moving the view.
16
+
17
+ Window placement and unsent view snapshots are session state, not a new durable draft backup. Existing persisted messages and jobs retain their normal storage behavior. Restarting the application is not covered by the in-memory handoff guarantee.
18
+
19
+ ## Browsers and authentication windows
20
+
21
+ Each native browser belongs to an exact registered app window and a mount owner. Commands derive the calling window from native IPC; web pages and authentication popups cannot impersonate that interface. Browser events follow the current owner window.
22
+
23
+ A handoff reparents the existing WebKit/WebView2 child instead of opening its URL again. DOM state, history, cookies and popup opener relationships stay with the session. Authentication popups are independent native top-level windows; destroying the former mission window does not destroy a popup belonging to the transferred browser. The destination adopts the same owner, updates its bounds and displays it at the destination screen's scale. Cleanup from the former window cannot close the transferred browser.
24
+
25
+ If the destination already contains another browser, its pane and popups are parked hidden, without destroying the session. Explicitly returning to that owner restores it. Rolling back the transfer retains the previous destination browser and requests restoration from its mounted interface. A parked browser and its popups remain hidden until that interface explicitly adopts the owner; moving another mission cannot expose an unframed browser over the main interface. A late cleanup for an inactive parked owner does not destroy it. Window teardown removes its remaining owned sessions. The limit is eight parked browsers per app window; exceeding it produces an actionable error rather than silently discarding a session.
26
+
27
+ ## Verification matrix
28
+
29
+ | Check | Native macOS | Windows x64 / ARM64 |
30
+ | --- | --- | --- |
31
+ | Rust ownership, snapshot scope, revisions and close policy | Passed locally; `native-macos` CI gate | `windows-parity` CI gates on windows-latest and windows-11-arm |
32
+ | `native-mission-window-smoke`: independent windows, Home scope, renderer IPC, duplicate focus, close/ack and timeout recovery | Passed locally; `native-macos` CI gate | Passes in `windows-parity` CI (WebView2, both architectures) |
33
+ | `native-browser-multiwindow-smoke`: separate owners/popups, transfer/adoption, parked target, rollback, source destruction with a live popup, event routing, destination scale and stale cleanup | Passed locally; `native-macos` CI gate | Passes in `windows-parity` CI (WebView2, both architectures) |
34
+ | `native-browser-smoke`: native capture, DOM/Shadow DOM selection, zoom and remote IPC denial | Passed locally; `native-macos` CI gate | Passes in `windows-parity` CI (WebView2, both architectures) |
35
+ | `native-browser-popup-smoke`: nested/cross-origin opener callbacks, self-close, capacity recovery and owner cleanup | Passed locally; `native-macos` CI gate | Passes in `windows-parity` CI; popup activation is asserted through the OS foreground window and skipped when another process owns the foreground |
36
+ | React handoff, draft/reference restoration and shared workspace behavior | Shared client regression suites | Shared client suite also runs on Windows |
37
+
38
+ The native fixtures use local or in-memory pages and isolated browser profiles. They do not start a sidecar, access user databases, authenticate with external tenants or call models. Run them from `src-tauri` after building the client assets:
39
+
40
+ ```sh
41
+ cargo test --locked --lib --features native-browser-smoke
42
+ cargo run --locked --example native-mission-window-smoke --features native-browser-smoke
43
+ cargo run --locked --example native-browser-multiwindow-smoke --features native-browser-smoke
44
+ cargo run --locked --example native-browser-smoke --features native-browser-smoke
45
+ cargo run --locked --example native-browser-popup-smoke --features native-browser-smoke
46
+ ```
47
+
48
+ For a source-only checkout without assembled desktop resources, set `TAURI_CONFIG` to `{"bundle":{"active":false,"externalBin":[],"resources":[]}}`, as CI does. These are interactive native tests; they require an OS desktop session.
49
+
50
+ On Windows the examples embed `src-tauri/examples/windows-app.manifest` (Common Controls v6) through `build.rs`. tauri-build only gives that manifest to the package binaries, and without it the loader refuses the example executable with `STATUS_ENTRYPOINT_NOT_FOUND` (0xC0000139): tao/wry import `SetWindowSubclass` by name, which comctl32 5.82 does not export. CI runs each fixture through `scripts/run-native-smoke.ps1`, which reports the process's own exit code, echoes its output and prints the PE subsystem, WebView2 runtime and DLL dependents when a run needs diagnosis.
51
+
52
+ ## Limits and remaining platform acceptance
53
+
54
+ - At most 16 detached missions and a 2 MiB transfer snapshot. Oversized state is rejected without truncating unsent work.
55
+ - Live browser transfer requires the same running native host. It does not migrate sessions between computers or survive application termination.
56
+ - Local macOS capture verifies the destination display's actual scale. Mixed-DPI monitor movement, Windows 100%/150%/200% scaling, and installed UI behavior still need real-device acceptance.
57
+ - Local authentication fixtures exercise browser mechanics. Corporate Okta/SSO tenants, OS policies and external provider authentication require separate acceptance with the intended environment.
58
+
59
+ See [Windows feature parity](../platforms/windows-parity.md) for installer and real-device release gates.
@@ -4,20 +4,20 @@ Specrails kann **sich selbst** für jeden KI-Assistenten bereitstellen, der das
4
4
 
5
5
  Das ist die umgekehrte Richtung zu den Plugins und dem Feature „Meine freigegebenen MCPs": Diese lassen Specrails andere MCP-Server *nutzen*; dieses hier lässt andere Apps **Specrails** nutzen.
6
6
 
7
- ## Einschalten
7
+ ## Von Anfang an eingeschaltet
8
8
 
9
- Es ist **standardmäßig aus**. Öffne **Einstellungen ▸ MCP** und aktiviere **MCP aktivieren**. Das war's — der Server startet sofort, ohne Neustart.
9
+ Es ist **standardmäßig an** — der Server läuft bereits beim ersten Öffnen der App, ohne Neustart und ohne etwas umzulegen. Öffne **Einstellungen ▸ MCP**, um die Client-Konfiguration zu kopieren oder ihn auszuschalten, falls du ihn nicht willst.
10
10
 
11
11
  Du behältst die Kontrolle darüber, *was* eine externe KI über Specrails tun darf, und zwar über eine Reihe von Berechtigungsstufen:
12
12
 
13
13
  | Stufe | Was sie erlaubt | Standard |
14
14
  |---|---|---|
15
15
  | **Lesen** | Projekte, Specs, Jobs, Analytics … auflisten und einsehen | Immer an (wenn MCP aktiviert ist) |
16
- | **Schreiben** | Specs erstellen und bearbeiten, Einstellungen und Rail-Konfiguration ändern | Aus — opt-in |
17
- | **KI-Start** | Aktionen, die eine KI ausführen und **Geld kosten** (ein Rail starten, eine Spec generieren, einen Chat-Zug senden) | Aus — opt-in |
18
- | **Destruktiv** | Projekte/Specs/Jobs löschen, laufende Arbeit stoppen | Aus — opt-in |
16
+ | **Schreiben** | Specs erstellen und bearbeiten, Einstellungen und Rail-Konfiguration ändern | An — zum Einschränken abwählen |
17
+ | **KI-Start** | Aktionen, die eine KI ausführen und **Geld kosten** (ein Rail starten, eine Spec generieren, einen Chat-Zug senden) | An — zum Einschränken abwählen |
18
+ | **Destruktiv** | Projekte/Specs/Jobs löschen, laufende Arbeit stoppen | An — zum Einschränken abwählen |
19
19
 
20
- Versucht dein Assistent etwas, das eine deaktivierte Stufe abdeckt, verweigert Specrails mit einer klaren Meldung, die dir sagt, welche Stufe du einschalten musst. So kannst du nur-lesend starten und genau das freigeben, was du brauchst.
20
+ Alle vier Stufen sind von Anfang an gewährt, sodass ein verbundener Assistent die ganze App sofort steuern kann. Wähle jede Stufe ab, die du lieber für dich behältst; versucht dein Assistent danach etwas, das diese Stufe abdeckt, verweigert Specrails mit einer klaren Meldung, welche Stufe du wieder einschalten musst.
21
21
 
22
22
  ## Deinen Assistenten verbinden
23
23
 
@@ -50,11 +50,15 @@ codex mcp add specrails -- <Bridge-Befehl aus Einstellungen ▸ MCP>
50
50
 
51
51
  Der Header `Authorization: Bearer <token>` funktioniert ebenfalls. Falls du den App-Port geändert hast, ersetze `4200`.
52
52
 
53
- Einmal verbunden, sieht dein Assistent etwa **18 Tools**, die die ganze App abdecken — Projekte, Specs, Rails und Jobs, Chat/Explore, Agenten, Plugins, Jira, Loops, den Code-Explorer, Analytics, Einstellungen — plus ein eingebautes **Guide**-Tool, das er zuerst liest, sodass er versteht, wie Specrails funktioniert, ohne dass du irgendetwas erklären musst.
53
+ Einmal verbunden, sieht dein Assistent **22 Tools**, die die ganze App abdecken — Projekte, Specs, Rails und Jobs, Chat/Explore, Agenten, Plugins, Jira, Loops, den Code-Explorer, Analytics, Einstellungen — darunter ein eingebautes **Guide**-Tool, das er zuerst liest, sodass er versteht, wie Specrails funktioniert, ohne dass du irgendetwas erklären musst.
54
+
55
+ Vor einer Aktion kann der Assistent mit `specrails_context` den aktuellen Stand von Projekt, Specs, Ausführungen und Git abrufen. Nicht verfügbare Abschnitte werden ausdrücklich gekennzeichnet; sie bedeuten nicht, dass das Projekt leer ist. `specrails_code(search)` sucht Text im Quellcode, und `read_file` liest bestimmte Zeilenbereiche mit Hinweisen zum Weiterlesen, wenn noch Inhalt übrig ist.
56
+
57
+ Jede externe MCP-Sitzung hat ihre eigene Projektauswahl. Im Missionsmodus gilt standardmäßig das im Gespräch angeheftete Projekt, das du in der Missionsoberfläche änderst; eine MCP-Auswahl kann es nicht überschreiben. Mit einer expliziten `projectId` lässt sich eine Aktion gezielt auf ein anderes Projekt richten.
54
58
 
55
59
  ## Was du damit machen kannst
56
60
 
57
- Ein paar Rezepte, sobald dein Assistent verbunden ist. Beginne mit aktiviertem **Lesen** und schalte dann **Schreiben** und **KI-Start** hinzu, wenn er tatsächlich Arbeit erstellen und starten soll.
61
+ Ein paar Rezepte, sobald dein Assistent verbunden ist. Alles ist standardmäßig an; wähle **Schreiben** oder **KI-Start** in Einstellungen ▸ MCP ab, wenn er vorerst nur beobachten soll.
58
62
 
59
63
  **Mach aus Arbeit in deinen anderen Tools Specs.** Wenn dein Assistent auch GitHub, Jira, Gmail oder Slack verbunden hat, kann er die Arbeit für dich nach Specrails holen:
60
64
  > *„Nimm die diese Woche offenen GitHub-Issues mit dem Label ‚bug', erstelle für jedes eine Spec im API-Projekt und starte sie."*
@@ -64,7 +68,7 @@ Ein paar Rezepte, sobald dein Assistent verbunden ist. Beginne mit aktiviertem *
64
68
  **Autopilot über Nacht.** Lass es mit der App im Tray laufen und komm zu einem Bericht zurück:
65
69
  > *„Hier sind 12 Ideen. Mach aus jeder eine Spec, starte sie zu dritt über die Rails, beobachte jeden Job und gib mir morgen eine Zusammenfassung, was fertig wurde, was fehlschlug und was es gekostet hat."*
66
70
 
67
- Lass **Destruktiv** aus, und es kann die ganze Nacht bauen, ohne jemals etwas zu löschen.
71
+ Wähle **Destruktiv** ab, und es kann die ganze Nacht bauen, ohne jemals etwas zu löschen.
68
72
 
69
73
  **Über alle deine Projekte hinweg.** Etwas, das das Dashboard von allein nicht kann:
70
74
  > *„Prüfe alle meine Projekte. Sag mir, welche Specs im Backlog haben und kein laufendes Rail, und starte in jedem das mit der höchsten Priorität."*
@@ -68,6 +68,7 @@ Antworten strömen flüssig herein und landen bereits formatiert (Überschriften
68
68
  - **Minimieren, nicht verlieren.** Klicke auf das ✕, um das Panel zurück in die Blase abzulegen — die Unterhaltung läuft weiter. Öffne es wieder und du landest bei der neuesten Nachricht; nichts muss neu getippt werden.
69
69
  - **Neue Unterhaltung.** Der **+**-Button startet einen sauberen Thread; der Verlauf lebt app-weit, oberhalb jedes einzelnen Projekts.
70
70
  - **Missionen wechseln.** Der Missions-Selektor neben dem Projekt-Selektor listet deine Unterhaltungen von neu nach alt — ein pulsierender Punkt markiert die, an denen der Agent noch arbeitet, und ein kleines Badge zählt die Nachrichten in der Warteschlange. Die Suche erscheint, sobald die Liste mehr als acht Einträge hat, und das Papierkorb-Symbol jeder Zeile löscht eine Mission nach einer kurzen Inline-Bestätigung — auch eine laufende (es warnt zuerst und stoppt dann den Agenten).
71
+ - **Eine Mission von überall finden.** Drücke **⌘K** (oder den **Suchen**-Button in der Seitenleiste im Agent-Modus) und tippe irgendein Fragment, an das du dich erinnerst — ein Wort aus dem Titel *oder* aus dem, was darin gesagt wurde. Missionen treffen sofort per Titel aus dem Speicher, einen Herzschlag später kommen die Inhaltstreffer mit hervorgehobener Passage dazu, plus angepinntes Projekt und letzte Aktivität. Im Agent-Modus sind Missionen die erste Gruppe; auf dem Board stehen sie direkt nach den Projekten. Enter öffnet die Mission.
71
72
 
72
73
  ## Ein paar Dinge, die du wissen solltest
73
74
 
@@ -4,20 +4,20 @@ Specrails can expose **itself** to any AI assistant that speaks the [Model Conte
4
4
 
5
5
  This is the opposite direction from the plugins and "My approved MCPs" features: those let Specrails *use* other MCP servers; this lets other apps use **Specrails**.
6
6
 
7
- ## Turning it on
7
+ ## It's on out of the box
8
8
 
9
- It's **off by default**. Open **Settings ▸ MCP** and flip **Enable MCP**. That's it — the server starts immediately, no restart.
9
+ It's **on by default** — the server is already running the first time you open the app, no restart, nothing to flip. Open **Settings ▸ MCP** to grab the client config, or to switch it off if you don't want it.
10
10
 
11
11
  You stay in control of *what* an external AI may do through a set of permission tiers:
12
12
 
13
13
  | Tier | What it allows | Default |
14
14
  |---|---|---|
15
15
  | **Read** | List and inspect projects, specs, jobs, analytics… | Always on (when MCP is enabled) |
16
- | **Write** | Create and edit specs, change settings and rail config | Off — opt in |
17
- | **AI-spawn** | Actions that run an AI and **cost money** (launch a rail, generate a spec, send a chat turn) | Off — opt in |
18
- | **Destructive** | Delete projects/specs/jobs, stop running work | Off — opt in |
16
+ | **Write** | Create and edit specs, change settings and rail config | On — untick to restrict |
17
+ | **AI-spawn** | Actions that run an AI and **cost money** (launch a rail, generate a spec, send a chat turn) | On — untick to restrict |
18
+ | **Destructive** | Delete projects/specs/jobs, stop running work | On — untick to restrict |
19
19
 
20
- If your assistant tries something a disabled tier covers, Specrails refuses with a clear message telling you which tier to switch on. So you can start read-only and open up exactly what you need.
20
+ All four tiers are granted out of the box, so a connected assistant can drive the whole app right away. Untick any tier you'd rather keep to yourself; if your assistant then tries something that tier covers, Specrails refuses with a clear message telling you which tier to switch back on.
21
21
 
22
22
  ## Connecting your assistant
23
23
 
@@ -50,11 +50,15 @@ codex mcp add specrails -- <bridge command from Settings ▸ MCP>
50
50
 
51
51
  The `Authorization: Bearer <token>` header works too. If you changed the app port, swap `4200` for yours.
52
52
 
53
- Once connected, your assistant sees about **18 tools** covering the whole app — projects, specs, rails and jobs, chat/Explore, agents, plugins, Jira, loops, the code explorer, analytics, settings — plus a built-in **guide** tool it reads first so it understands how Specrails works without you explaining anything.
53
+ Once connected, your assistant sees **22 tools** covering the whole app — projects, specs, rails and jobs, chat/Explore, agents, plugins, Jira, loops, the code explorer, analytics, settings — including a built-in **guide** tool it reads first so it understands how Specrails works without you explaining anything.
54
+
55
+ Before acting, the assistant can use `specrails_context` for a current briefing on the project, specs, runs and Git state. Unavailable sections are reported explicitly; they do not mean the project is empty. `specrails_code(search)` finds source text, and `read_file` reads specific line ranges with continuation information when more content remains.
56
+
57
+ Each external MCP session keeps its own selected project. In Mission mode, the default follows the conversation's project pin, which you change in the mission interface; an MCP selection cannot override it. An explicit `projectId` targets an intentional operation in another project.
54
58
 
55
59
  ## What you can do with it
56
60
 
57
- A few recipes once your assistant is connected. Start with **Read** on, then turn on **Write** and **AI-spawn** when you want it to actually create and launch work.
61
+ A few recipes once your assistant is connected. Everything is on by default; untick **Write** or **AI-spawn** in Settings ▸ MCP if you'd rather it only observe for now.
58
62
 
59
63
  **Turn work from your other tools into specs.** If your assistant also has GitHub, Jira, Gmail or Slack connected, it can bring the work to Specrails for you:
60
64
  > *"Take this week's open GitHub issues labelled 'bug', create a spec for each in the API project, and launch them."*
@@ -64,7 +68,7 @@ A few recipes once your assistant is connected. Start with **Read** on, then tur
64
68
  **Overnight autopilot.** Leave it running with the app in the tray and come back to a report:
65
69
  > *"Here are 12 ideas. Turn each into a spec, launch them three at a time across the rails, watch every job, and tomorrow give me a summary of what finished, what failed and what it cost."*
66
70
 
67
- Keep **Destructive** off and it can build all night without ever deleting anything.
71
+ Untick **Destructive** and it can build all night without ever deleting anything.
68
72
 
69
73
  **Across all your projects.** Something the dashboard doesn't do on its own:
70
74
  > *"Check all my projects. Tell me which have specs in the backlog and no rail running, and start the highest-priority one in each."*
@@ -73,6 +73,7 @@ Replies stream in smoothly and land formatted (headings, tables, lists), each wi
73
73
  - **Minimize, don't lose.** Click the ✕ to drop the panel back to the bubble — the conversation keeps running. Reopen and you land at the latest message; nothing is re-typed.
74
74
  - **New conversation.** The **+** button starts a clean thread; the history lives app-wide, above any single project.
75
75
  - **Switch missions.** The mission selector next to the project picker lists your conversations newest-first — a pulsing dot marks the ones where the agent is still working, and a small badge counts queued messages. Search appears when the list grows past eight, and the trash icon on each row deletes a mission after a quick inline confirm — even a running one (it warns first, then stops the agent).
76
+ - **Find a mission from anywhere.** Press **⌘K** (or the sidebar **Search** button in Agent Mode) and type any fragment you remember — a word from the title *or* from what was said inside. Missions match instantly by title from memory, and a heartbeat later the matches by content arrive with the matching passage highlighted, plus the pinned project and when it was last active. In Agent Mode missions are the first group; on the board they sit right after Projects. Enter opens the mission.
76
77
 
77
78
  ## A few things to know
78
79