specrails-desktop 2.64.1 → 2.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1117) hide show
  1. package/README.md +1 -1
  2. package/cli/dist/status.js +3 -0
  3. package/client/dist/assets/ActivityFeedPage-ByVKYII-.js +1 -0
  4. package/client/dist/assets/AgentBrowserCapture-BGUTjhUr.js +1 -0
  5. package/client/dist/assets/AgentModeAnalyticsPane-CtOLDDjB.js +2 -0
  6. package/client/dist/assets/AgentModeCodePane-CDhUKarT.js +2 -0
  7. package/client/dist/assets/AgentModeJobsPane-BAa_oEHJ.js +1 -0
  8. package/client/dist/assets/AgentsPage-D32hG4Ve.js +120 -0
  9. package/client/dist/assets/AnalyticsPage-BU50zeG6.js +5 -0
  10. package/client/dist/assets/BudgetCard-DP_jxwaD.js +55 -0
  11. package/client/dist/assets/CodePage-jiYnKGpp.js +3 -0
  12. package/client/dist/assets/CostValue-Bvn8674q.js +1 -0
  13. package/client/dist/assets/DesktopAnalyticsPage-CF__H4e3.js +1 -0
  14. package/client/dist/assets/DocView-RrAp70zp.js +11 -0
  15. package/client/dist/assets/DocsDialog-DkqHU-JF.js +1 -0
  16. package/client/dist/assets/DocsPage-C6X089zC.js +1 -0
  17. package/client/dist/assets/ExportDropdown-C5-o8y3K.js +1 -0
  18. package/client/dist/assets/HelpHint-Crf9_uoR.js +1 -0
  19. package/client/dist/assets/IntegrationsPage-aflU3KHK.js +1 -0
  20. package/client/dist/assets/InteractiveJobComposer-CEMMhyyJ.js +19 -0
  21. package/client/dist/assets/JobDetailModal-BVJ6hyRs.js +1 -0
  22. package/client/dist/assets/JobDetailPage-DHzBUmox.js +1 -0
  23. package/client/dist/assets/JobsPage-o-LAqkwC.js +1 -0
  24. package/client/dist/assets/LoopBuilderPage-DbSVmXBM.js +1 -0
  25. package/client/dist/assets/LoopPreviewModal-DbJcVyN1.js +1 -0
  26. package/client/dist/assets/{LoopWindowSurface-DE0v2K1p.js → LoopWindowSurface-Co1ZK26V.js} +1 -1
  27. package/client/dist/assets/LoopsPage-C4lgkPXB.js +2 -0
  28. package/client/dist/assets/MinimizedChatsContext-742ypO8n.js +1 -0
  29. package/client/dist/assets/PluginsPage-Acks9ges.js +2 -0
  30. package/client/dist/assets/RailTrack-BfLmBzBh.js +1 -0
  31. package/client/dist/assets/{RepositoryScopeSelector-2eSqR9WK.js → RepositoryScopeSelector-DcxbKI9w.js} +1 -1
  32. package/client/dist/assets/ReviewPacketPage-CAVSIOAJ.js +7 -0
  33. package/client/dist/assets/TemplatePreviewModal-C23SYCTm.js +1 -0
  34. package/client/dist/assets/TicketDetailModalContext-B-Gtm6Ob.js +23 -0
  35. package/client/dist/assets/Trans-C6J0cLyh.js +1 -0
  36. package/client/dist/assets/a11y-prefs-BqoP5goK.js +1 -0
  37. package/client/dist/assets/activity-BBWfoUOG.js +1 -0
  38. package/client/dist/assets/activity-BM_skann.js +1 -0
  39. package/client/dist/assets/activity-Cevl82ke.js +1 -0
  40. package/client/dist/assets/activity-CmACk5W5.js +1 -0
  41. package/client/dist/assets/activity-D9LBw3PQ.js +1 -0
  42. package/client/dist/assets/activity-Dspbb9lz.js +1 -0
  43. package/client/dist/assets/activity-FPjYIjv9.js +1 -0
  44. package/client/dist/assets/activity-nLCKMUKt.js +1 -0
  45. package/client/dist/assets/addspec-BI4jDMhA.js +1 -0
  46. package/client/dist/assets/addspec-BldTv7Tl.js +1 -0
  47. package/client/dist/assets/addspec-Cdq-2EcC.js +1 -0
  48. package/client/dist/assets/addspec-DH5M16BQ.js +1 -0
  49. package/client/dist/assets/addspec-DOFo9pD5.js +1 -0
  50. package/client/dist/assets/addspec-DPkwhdmL.js +1 -0
  51. package/client/dist/assets/addspec-Dzy12Pv3.js +1 -0
  52. package/client/dist/assets/addspec-skTs6EEW.js +1 -0
  53. package/client/dist/assets/agent-B_UEUy7Y.js +1 -0
  54. package/client/dist/assets/agent-BarjlhTA.js +1 -0
  55. package/client/dist/assets/agent-BfqIITo5.js +1 -0
  56. package/client/dist/assets/agent-Bt9a7Kyj.js +1 -0
  57. package/client/dist/assets/agent-C3689RwP.js +1 -0
  58. package/client/dist/assets/agent-CrmboTAi.js +1 -0
  59. package/client/dist/assets/agent-DcsoTnuE.js +1 -0
  60. package/client/dist/assets/agent-GDZoYwd4.js +1 -0
  61. package/client/dist/assets/{agentRuntime-es2ymSl-.js → agentRuntime-BYH70bKY.js} +1 -1
  62. package/client/dist/assets/agentRuntime-BijLh8I9.js +1 -0
  63. package/client/dist/assets/{agentRuntime-BzuwQQgn.js → agentRuntime-BvyuETPe.js} +1 -1
  64. package/client/dist/assets/{agentRuntime-BDvbJMmS.js → agentRuntime-C2WI6HQh.js} +1 -1
  65. package/client/dist/assets/{agentRuntime-BKJfv5YD.js → agentRuntime-CZPIlQsr.js} +1 -1
  66. package/client/dist/assets/{agentRuntime-DiCldqGG.js → agentRuntime-D2dDvCyJ.js} +1 -1
  67. package/client/dist/assets/agentRuntime-DWZedEbn.js +1 -0
  68. package/client/dist/assets/agentRuntime-DkIruUNw.js +1 -0
  69. package/client/dist/assets/agents-35_PDKx9.js +1 -0
  70. package/client/dist/assets/agents-8fZnHhEQ.js +1 -0
  71. package/client/dist/assets/agents-Bgimtw8z.js +1 -0
  72. package/client/dist/assets/agents-C4P160Us.js +1 -0
  73. package/client/dist/assets/agents-Clg67zbp.js +1 -0
  74. package/client/dist/assets/agents-DJfF4o6G.js +1 -0
  75. package/client/dist/assets/agents-Dc9-Y5cw.js +1 -0
  76. package/client/dist/assets/agents-EN1Zl4YZ.js +1 -0
  77. package/client/dist/assets/agentstudio-Bm4-NYaG.js +1 -0
  78. package/client/dist/assets/agentstudio-CD1fuj2o.js +1 -0
  79. package/client/dist/assets/agentstudio-CQGWFSst.js +1 -0
  80. package/client/dist/assets/agentstudio-CqVSb65S.js +1 -0
  81. package/client/dist/assets/agentstudio-DIE_HjsX.js +1 -0
  82. package/client/dist/assets/agentstudio-D_OmQK-k.js +1 -0
  83. package/client/dist/assets/agentstudio-Djz9aUfb.js +1 -0
  84. package/client/dist/assets/agentstudio-Qa3v9o5J.js +1 -0
  85. package/client/dist/assets/{aiedit-DNXxq_Dr.js → aiedit-1VzLs37W.js} +1 -1
  86. package/client/dist/assets/{aiedit-DCjA7jLJ.js → aiedit-BNp6GSik.js} +1 -1
  87. package/client/dist/assets/{aiedit-BoG24nlg.js → aiedit-BOY5xRPi.js} +1 -1
  88. package/client/dist/assets/{aiedit-iIjz2_Qk.js → aiedit-BrqMZvbc.js} +1 -1
  89. package/client/dist/assets/{aiedit-CjlSRQVP.js → aiedit-CVgtl7hm.js} +1 -1
  90. package/client/dist/assets/{aiedit-DQ-0_pvE.js → aiedit-CrFW9Jd2.js} +1 -1
  91. package/client/dist/assets/{aiedit-olnv3QSt.js → aiedit-YE2lILp7.js} +1 -1
  92. package/client/dist/assets/{aiedit-B0KUbpB6.js → aiedit-iA_R1AVQ.js} +1 -1
  93. package/client/dist/assets/analytics-3w0t-4ic.js +1 -0
  94. package/client/dist/assets/analytics-BRi4KQD6.js +1 -0
  95. package/client/dist/assets/analytics-BtjAqzke.js +1 -0
  96. package/client/dist/assets/analytics-COSQ1h47.js +1 -0
  97. package/client/dist/assets/analytics-CP2HjESk.js +1 -0
  98. package/client/dist/assets/analytics-DY65TC62.js +1 -0
  99. package/client/dist/assets/analytics-Den_vvxn.js +1 -0
  100. package/client/dist/assets/analytics-LmBS96O8.js +1 -0
  101. package/client/dist/assets/api-DOGbyfTO.js +2 -0
  102. package/client/dist/assets/builder-BMVvSr4v.js +1 -0
  103. package/client/dist/assets/builder-BN-MuLZt.js +1 -0
  104. package/client/dist/assets/builder-BQOZi4CF.js +1 -0
  105. package/client/dist/assets/builder-BjUPjsyu.js +1 -0
  106. package/client/dist/assets/builder-BoBtN18T.js +1 -0
  107. package/client/dist/assets/builder-C5g5NhxL.js +1 -0
  108. package/client/dist/assets/builder-RUHXw3yx.js +1 -0
  109. package/client/dist/assets/builder-fyS_AiyC.js +1 -0
  110. package/client/dist/assets/button-CHPkroew.js +1 -0
  111. package/client/dist/assets/chat-C9L5T7KI.js +1 -0
  112. package/client/dist/assets/chevron-right-CwMAj0w_.js +1 -0
  113. package/client/dist/assets/chevron-up-BAMuP0XD.js +1 -0
  114. package/client/dist/assets/chunk-OB3PAWPO-BBaq6pUk.js +3 -0
  115. package/client/dist/assets/code-4le5IIbf.js +1 -0
  116. package/client/dist/assets/code-B-jCVIbm.js +1 -0
  117. package/client/dist/assets/code-BRfrn5ix.js +1 -0
  118. package/client/dist/assets/code-CC9NCrDM.js +1 -0
  119. package/client/dist/assets/code-CK6pm8wY.js +1 -0
  120. package/client/dist/assets/code-DDiOzd6c.js +1 -0
  121. package/client/dist/assets/code-tGifiyf5.js +1 -0
  122. package/client/dist/assets/code-xkn8kQTg.js +1 -0
  123. package/client/dist/assets/commands-Bv1QshHR.js +1 -0
  124. package/client/dist/assets/commands-BvxTxboW.js +1 -0
  125. package/client/dist/assets/commands-C5ORR0fO.js +1 -0
  126. package/client/dist/assets/commands-CBKMFSTV.js +1 -0
  127. package/client/dist/assets/commands-CFJIRsJv.js +1 -0
  128. package/client/dist/assets/commands-D9o3ZcXl.js +1 -0
  129. package/client/dist/assets/commands-DNox0Edk.js +1 -0
  130. package/client/dist/assets/commands-DmIUMLdV.js +1 -0
  131. package/client/dist/assets/common-5H4TkaoI.js +1 -0
  132. package/client/dist/assets/common-9S3OdPjx.js +1 -0
  133. package/client/dist/assets/common-BqnwIcjs.js +1 -0
  134. package/client/dist/assets/common-CQP3VafS.js +1 -0
  135. package/client/dist/assets/common-CZnAfkB2.js +1 -0
  136. package/client/dist/assets/common-D5sNttV4.js +1 -0
  137. package/client/dist/assets/common-k_qX9nlv.js +1 -0
  138. package/client/dist/assets/common-s4HIi9XI.js +1 -0
  139. package/client/dist/assets/compass-B7guwBlY.js +1 -0
  140. package/client/dist/assets/confirm-dialog-ChZdHL3Q.js +1 -0
  141. package/client/dist/assets/copy-DOPlLymH.js +1 -0
  142. package/client/dist/assets/core-BozBzB6Y.js +1 -0
  143. package/client/dist/assets/dashboard-6zGLGcEz.js +1 -0
  144. package/client/dist/assets/dashboard-8Gi0FBDq.js +1 -0
  145. package/client/dist/assets/dashboard-B7E5YrSy.js +1 -0
  146. package/client/dist/assets/dashboard-BhdKV8xK.js +1 -0
  147. package/client/dist/assets/dashboard-Bu3zzH_s.js +1 -0
  148. package/client/dist/assets/dashboard-Ce_6rELA.js +1 -0
  149. package/client/dist/assets/dashboard-DWY-oz8P.js +1 -0
  150. package/client/dist/assets/dashboard-gUzlWk0o.js +1 -0
  151. package/client/dist/assets/date-input-Cdlr8kHz.js +1 -0
  152. package/client/dist/assets/dialog-C23lB2iP.js +5 -0
  153. package/client/dist/assets/dist-Di-oOFkX.js +1 -0
  154. package/client/dist/assets/dist-js-CBmS6MsJ.js +1 -0
  155. package/client/dist/assets/{dist-js-Rlh4FLH5.js → dist-js-DaJmKapi.js} +1 -1
  156. package/client/dist/assets/dropdown-menu-Bfp2CK6H.js +1 -0
  157. package/client/dist/assets/empty-state-D5w9OWj-.js +1 -0
  158. package/client/dist/assets/es2015-DfnECntk.js +41 -0
  159. package/client/dist/assets/esm-BKF6CE7v.js +1 -0
  160. package/client/dist/assets/event-BEnMLqAi.js +1 -0
  161. package/client/dist/assets/explore--NOz9LCN.js +1 -0
  162. package/client/dist/assets/explore-B2ulH6dO.js +1 -0
  163. package/client/dist/assets/explore-BD-QiLdg.js +1 -0
  164. package/client/dist/assets/explore-BOqd4_1j.js +1 -0
  165. package/client/dist/assets/explore-Be_Zh5zu.js +1 -0
  166. package/client/dist/assets/explore-CLjzPSKo.js +1 -0
  167. package/client/dist/assets/explore-D_-vHm29.js +1 -0
  168. package/client/dist/assets/explore-yEQTF6ro.js +1 -0
  169. package/client/dist/assets/file-text-CNXzL3wj.js +1 -0
  170. package/client/dist/assets/format-BODoFIw6.js +1 -0
  171. package/client/dist/assets/formatDistanceToNow-DLMIOS0N.js +1 -0
  172. package/client/dist/assets/getTimezoneOffsetInMilliseconds-O61feXch.js +1 -0
  173. package/client/dist/assets/git-compare-arrows-Cu6tICCq.js +1 -0
  174. package/client/dist/assets/humanise-command-CB4ybLwq.js +1 -0
  175. package/client/dist/assets/inbox-BLZ8cm6_.js +1 -0
  176. package/client/dist/assets/inbox-BQ3VmNYY.js +1 -0
  177. package/client/dist/assets/inbox-BdcXWCuT.js +1 -0
  178. package/client/dist/assets/inbox-CF1PHjns.js +1 -0
  179. package/client/dist/assets/inbox-CFNPDhso.js +1 -0
  180. package/client/dist/assets/inbox-DIttK_NW.js +1 -0
  181. package/client/dist/assets/inbox-Dfdv1Ykl.js +1 -0
  182. package/client/dist/assets/inbox-JS1inmeO.js +1 -0
  183. package/client/dist/assets/index-4UWY7Xyz.css +2 -0
  184. package/client/dist/assets/index-DHzB0T26.js +120 -0
  185. package/client/dist/assets/integrations-BcKgzgPD.js +1 -0
  186. package/client/dist/assets/integrations-BmX_XyJq.js +1 -0
  187. package/client/dist/assets/integrations-CHpwMjlY.js +1 -0
  188. package/client/dist/assets/integrations-CT3kr8e-.js +1 -0
  189. package/client/dist/assets/integrations-C_5XAkgz.js +1 -0
  190. package/client/dist/assets/integrations-Ct9zLX7N.js +1 -0
  191. package/client/dist/assets/integrations-DEYemxUv.js +1 -0
  192. package/client/dist/assets/integrations-DWvsB_WB.js +1 -0
  193. package/client/dist/assets/{jira-Cq6yvN4q.js → jira-B_ERkFRv.js} +1 -1
  194. package/client/dist/assets/jira-Bn-A5lwD.js +1 -0
  195. package/client/dist/assets/jira-C71Ybnhp.js +1 -0
  196. package/client/dist/assets/jira-CkwjeJz6.js +1 -0
  197. package/client/dist/assets/jira-D9pSLXjI.js +1 -0
  198. package/client/dist/assets/jira-DBRS_lcp.js +1 -0
  199. package/client/dist/assets/jira-DHS6CsKh.js +1 -0
  200. package/client/dist/assets/jira-MInHRUb1.js +1 -0
  201. package/client/dist/assets/jira-api-DHme7Upx.js +1 -0
  202. package/client/dist/assets/jobs-BMLTDo63.js +1 -0
  203. package/client/dist/assets/jobs-BO8q4Mi1.js +1 -0
  204. package/client/dist/assets/jobs-Ck8uOWMM.js +1 -0
  205. package/client/dist/assets/jobs-CyFfPCpg.js +1 -0
  206. package/client/dist/assets/jobs-DT5s4fZ6.js +1 -0
  207. package/client/dist/assets/jobs-DZAgVPcD.js +1 -0
  208. package/client/dist/assets/jobs-b5gPYaKr.js +1 -0
  209. package/client/dist/assets/jobs-xsZK1440.js +1 -0
  210. package/client/dist/assets/launch-forecast-BTa-p3RP.js +1 -0
  211. package/client/dist/assets/{loop-layout-DtxX27Jz.css → loop-layout-DLioOiRN.css} +1 -1
  212. package/client/dist/assets/loop-layout-Sl9cfTvs.js +7 -0
  213. package/client/dist/assets/loops-BEEOVJDR.js +1 -0
  214. package/client/dist/assets/loops-BcrQ2vk7.js +1 -0
  215. package/client/dist/assets/loops-BjWxzJIZ.js +1 -0
  216. package/client/dist/assets/loops-BogV595N.js +1 -0
  217. package/client/dist/assets/loops-CU0BLZiz.js +1 -0
  218. package/client/dist/assets/loops-CrNBgi1G.js +1 -0
  219. package/client/dist/assets/loops-CwalwS_i.js +1 -0
  220. package/client/dist/assets/loops-_TDVN-fX.js +1 -0
  221. package/client/dist/assets/mcp-BNs8gxoL.js +1 -0
  222. package/client/dist/assets/mcp-BvRh_xO5.js +1 -0
  223. package/client/dist/assets/mcp-C2F1pghi.js +1 -0
  224. package/client/dist/assets/mcp-D9RLKAs2.js +1 -0
  225. package/client/dist/assets/mcp-DAghcsR0.js +1 -0
  226. package/client/dist/assets/mcp-DWWAPi1G.js +1 -0
  227. package/client/dist/assets/mcp-DbGSFC3f.js +1 -0
  228. package/client/dist/assets/mcp-FelCicrv.js +1 -0
  229. package/client/dist/assets/narration-C3NBkAR4.js +1 -0
  230. package/client/dist/assets/narration-CkoJq-Lf.js +1 -0
  231. package/client/dist/assets/narration-Cr0NeW9K.js +1 -0
  232. package/client/dist/assets/narration-DJUXOs-W.js +1 -0
  233. package/client/dist/assets/narration-DgL8TMvN.js +1 -0
  234. package/client/dist/assets/narration-DjBafgv0.js +1 -0
  235. package/client/dist/assets/narration-Dle6Iv0c.js +1 -0
  236. package/client/dist/assets/narration-MYlfktga.js +1 -0
  237. package/client/dist/assets/nav-BSQ8KW1c.js +1 -0
  238. package/client/dist/assets/nav-BauVof8Z.js +1 -0
  239. package/client/dist/assets/nav-BfOAH1se.js +1 -0
  240. package/client/dist/assets/nav-D3bOsipX.js +1 -0
  241. package/client/dist/assets/nav-DOMMhlLx.js +1 -0
  242. package/client/dist/assets/nav-DPzVlgZU.js +1 -0
  243. package/client/dist/assets/nav-DZJbFbah.js +1 -0
  244. package/client/dist/assets/nav-D_5aojd2.js +1 -0
  245. package/client/dist/assets/notify-error-BsWANx1T.js +1 -0
  246. package/client/dist/assets/onboarding-BdZQnNm3.js +1 -0
  247. package/client/dist/assets/onboarding-CJQEv1vp.js +1 -0
  248. package/client/dist/assets/onboarding-CWJGYUW3.js +1 -0
  249. package/client/dist/assets/onboarding-ChfYN7dA.js +1 -0
  250. package/client/dist/assets/onboarding-CjvDUR3V.js +1 -0
  251. package/client/dist/assets/onboarding-I6vS-zTB.js +1 -0
  252. package/client/dist/assets/onboarding-dgC_9dTB.js +1 -0
  253. package/client/dist/assets/onboarding-mlXSyKzX.js +1 -0
  254. package/client/dist/assets/origin-03nTuaOb.js +1 -0
  255. package/client/dist/assets/packet-BjpyRnZr.js +1 -0
  256. package/client/dist/assets/packet-BwgG5mBt.js +1 -0
  257. package/client/dist/assets/packet-C3eAUFkV.js +1 -0
  258. package/client/dist/assets/packet-C8wZuSld.js +1 -0
  259. package/client/dist/assets/packet-CNXEy_85.js +1 -0
  260. package/client/dist/assets/packet-DsV5Aa_8.js +1 -0
  261. package/client/dist/assets/packet-aasskOE7.js +1 -0
  262. package/client/dist/assets/packet-phxCc2gJ.js +1 -0
  263. package/client/dist/assets/page-header-BStSHkP8.js +1 -0
  264. package/client/dist/assets/project-repositories-DJPeAVBK.js +1 -0
  265. package/client/dist/assets/{provider-capabilities-lePfeT_Y.js → provider-capabilities-DtwcTme4.js} +1 -1
  266. package/client/dist/assets/recovery-BPDOsC92.js +1 -0
  267. package/client/dist/assets/recovery-BluNHoXM.js +1 -0
  268. package/client/dist/assets/recovery-CRvEmB0C.js +1 -0
  269. package/client/dist/assets/recovery-CeIoRnkR.js +1 -0
  270. package/client/dist/assets/recovery-DHCo8KGi.js +1 -0
  271. package/client/dist/assets/recovery-OxAIpbBF.js +1 -0
  272. package/client/dist/assets/recovery-XXexYGOJ.js +1 -0
  273. package/client/dist/assets/recovery-pITlc--v.js +1 -0
  274. package/client/dist/assets/refresh-cw-DfyTkbsf.js +1 -0
  275. package/client/dist/assets/select-xA3pSmqE.js +1 -0
  276. package/client/dist/assets/settings--yzDbX9r.js +1 -0
  277. package/client/dist/assets/settings-5_heTv8s.js +1 -0
  278. package/client/dist/assets/settings-BSf27MDg.js +1 -0
  279. package/client/dist/assets/settings-BSj6FakR.js +1 -0
  280. package/client/dist/assets/settings-BZDo_8Nn.js +1 -0
  281. package/client/dist/assets/settings-BdWgmNc0.js +1 -0
  282. package/client/dist/assets/settings-DRouxKqb.js +1 -0
  283. package/client/dist/assets/settings-DnWFoY-F.js +1 -0
  284. package/client/dist/assets/setup-BJWy62ri.js +1 -0
  285. package/client/dist/assets/setup-BgKOIuzc.js +1 -0
  286. package/client/dist/assets/setup-BvVIyUlz.js +1 -0
  287. package/client/dist/assets/setup-BxCk2pe1.js +1 -0
  288. package/client/dist/assets/setup-C-xQTL7R.js +1 -0
  289. package/client/dist/assets/setup-CbaVoiwV.js +1 -0
  290. package/client/dist/assets/setup-DxTBkX3P.js +1 -0
  291. package/client/dist/assets/setup-oGoVAzOD.js +1 -0
  292. package/client/dist/assets/specs-7tAb4IKr.js +1 -0
  293. package/client/dist/assets/specs-BUcY4s5v.js +1 -0
  294. package/client/dist/assets/specs-Bk5LeBAA.js +1 -0
  295. package/client/dist/assets/specs-CAA4Lrlg.js +1 -0
  296. package/client/dist/assets/specs-CS091AnA.js +1 -0
  297. package/client/dist/assets/specs-DJ6gmFcK.js +1 -0
  298. package/client/dist/assets/specs-GfCcrBSC.js +1 -0
  299. package/client/dist/assets/specs-xQgyc7WL.js +1 -0
  300. package/client/dist/assets/spending-CVH8VREb.js +1 -0
  301. package/client/dist/assets/square-Co6h5vZg.js +1 -0
  302. package/client/dist/assets/tauri-shell-43ixPGfa.js +2 -0
  303. package/client/dist/assets/terminal-0v9sBylD.js +1 -0
  304. package/client/dist/assets/terminal-AbUAmCxE.js +1 -0
  305. package/client/dist/assets/terminal-BJayIbIP.js +1 -0
  306. package/client/dist/assets/terminal-C2RUlXyi.js +1 -0
  307. package/client/dist/assets/terminal-CMmSb_Nj.js +1 -0
  308. package/client/dist/assets/terminal-DKWjj7HJ.js +1 -0
  309. package/client/dist/assets/terminal-KlFu7_pV.js +1 -0
  310. package/client/dist/assets/terminal-i99yqFvm.js +1 -0
  311. package/client/dist/assets/tickets-846Oq3i3.js +1 -0
  312. package/client/dist/assets/tickets-B5LJTe_b.js +1 -0
  313. package/client/dist/assets/tickets-Bfo2GGmH.js +1 -0
  314. package/client/dist/assets/tickets-BhdZ1yY2.js +1 -0
  315. package/client/dist/assets/tickets-CgjWJHAW.js +1 -0
  316. package/client/dist/assets/tickets-Ct9DbDUR.js +1 -0
  317. package/client/dist/assets/tickets-rptLEJB1.js +1 -0
  318. package/client/dist/assets/tickets-xQ6DpYdu.js +1 -0
  319. package/client/dist/assets/trending-up-BGvb4zZt.js +1 -0
  320. package/client/dist/assets/undo-6zuS4-sL.js +1 -0
  321. package/client/dist/assets/undo-BeM4gDOP.js +1 -0
  322. package/client/dist/assets/undo-BeppX8xS.js +1 -0
  323. package/client/dist/assets/undo-BqvNZ5MG.js +1 -0
  324. package/client/dist/assets/undo-BzwEPf_k.js +1 -0
  325. package/client/dist/assets/undo-CJ9Cu1NN.js +1 -0
  326. package/client/dist/assets/undo-ds8nMFbX.js +1 -0
  327. package/client/dist/assets/undo-x_gA-knG.js +1 -0
  328. package/client/dist/assets/useDesktop-BuOp2-MR.js +1 -0
  329. package/client/dist/assets/useRuntimeRuns-BRS6ncnO.js +1 -0
  330. package/client/dist/assets/utils-ELimjS2Y.js +1 -0
  331. package/client/dist/assets/wrench-Br2n1Lxd.js +1 -0
  332. package/client/dist/index.html +75 -60
  333. package/docs/ci-cd.md +29 -1
  334. package/docs/cli.md +10 -31
  335. package/docs/codex.md +1 -1
  336. package/docs/creating-specs.md +15 -12
  337. package/docs/customizing.md +16 -13
  338. package/docs/getting-started.md +12 -11
  339. package/docs/guide/de/agents/1-meet-the-agents.md +1 -1
  340. package/docs/guide/de/getting-started/2-installing-and-first-run.md +2 -0
  341. package/docs/guide/de/getting-started/3-try-the-sample-project.md +35 -0
  342. package/docs/guide/de/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  343. package/docs/guide/de/getting-started/6-universal-search.md +34 -0
  344. package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +20 -6
  345. package/docs/guide/de/insights/2-the-integrated-terminal.md +1 -1
  346. package/docs/guide/de/insights/3-code-explorer.md +1 -1
  347. package/docs/guide/de/integrations/1-ai-providers.md +1 -1
  348. package/docs/guide/de/integrations/2-plugins.md +1 -1
  349. package/docs/guide/de/integrations/3-jira-integration.md +3 -3
  350. package/docs/guide/de/integrations/4-mobile-companion.md +1 -1
  351. package/docs/guide/de/integrations/5-mcp-server.md +1 -1
  352. package/docs/guide/de/integrations/6-agent-chat.md +12 -5
  353. package/docs/guide/de/integrations/8-flow-mode.md +69 -0
  354. package/docs/guide/de/pipeline/1-rails-and-jobs.md +21 -1
  355. package/docs/guide/de/pipeline/2-the-job-detail-view.md +12 -0
  356. package/docs/guide/de/pipeline/3-reviewing-a-delivery.md +43 -0
  357. package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
  358. package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
  359. package/docs/guide/de/settings/1-themes.md +1 -1
  360. package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  361. package/docs/guide/de/settings/5-project-environment.md +1 -1
  362. package/docs/guide/de/settings/6-updates.md +24 -0
  363. package/docs/guide/de/settings/7-existing-projects.md +33 -0
  364. package/docs/guide/de/settings/8-accessibility.md +23 -0
  365. package/docs/guide/de/specs/1-specs-and-the-backlog.md +41 -3
  366. package/docs/guide/de/specs/2-add-spec-quick-mode.md +1 -1
  367. package/docs/guide/de/specs/3-add-spec-explore-mode.md +1 -1
  368. package/docs/guide/en/agents/1-meet-the-agents.md +1 -1
  369. package/docs/guide/en/getting-started/1-what-is-specrails.md +1 -1
  370. package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -0
  371. package/docs/guide/en/getting-started/3-try-the-sample-project.md +35 -0
  372. package/docs/guide/en/getting-started/5-the-dashboard-tour.md +52 -0
  373. package/docs/guide/en/getting-started/6-universal-search.md +34 -0
  374. package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +24 -10
  375. package/docs/guide/en/insights/2-the-integrated-terminal.md +1 -1
  376. package/docs/guide/en/insights/3-code-explorer.md +5 -5
  377. package/docs/guide/en/integrations/1-ai-providers.md +1 -1
  378. package/docs/guide/en/integrations/2-plugins.md +1 -1
  379. package/docs/guide/en/integrations/3-jira-integration.md +4 -4
  380. package/docs/guide/en/integrations/4-mobile-companion.md +1 -1
  381. package/docs/guide/en/integrations/5-mcp-server.md +4 -4
  382. package/docs/guide/en/integrations/6-agent-chat.md +12 -5
  383. package/docs/guide/en/integrations/8-flow-mode.md +69 -0
  384. package/docs/guide/en/pipeline/1-rails-and-jobs.md +22 -3
  385. package/docs/guide/en/pipeline/2-the-job-detail-view.md +19 -7
  386. package/docs/guide/en/pipeline/3-reviewing-a-delivery.md +43 -0
  387. package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
  388. package/docs/guide/en/pipeline/5-the-loop-builder.md +2 -2
  389. package/docs/guide/en/settings/1-themes.md +1 -1
  390. package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  391. package/docs/guide/en/settings/5-project-environment.md +1 -1
  392. package/docs/guide/en/settings/6-updates.md +24 -0
  393. package/docs/guide/en/settings/7-existing-projects.md +33 -0
  394. package/docs/guide/en/settings/8-accessibility.md +23 -0
  395. package/docs/guide/en/specs/1-specs-and-the-backlog.md +42 -6
  396. package/docs/guide/en/specs/2-add-spec-quick-mode.md +1 -1
  397. package/docs/guide/en/specs/3-add-spec-explore-mode.md +2 -2
  398. package/docs/guide/es/agents/1-meet-the-agents.md +1 -1
  399. package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +1 -1
  400. package/docs/guide/es/agents/3-customizing-models-per-agent.md +2 -2
  401. package/docs/guide/es/agents/4-custom-agents-catalog.md +1 -1
  402. package/docs/guide/es/getting-started/1-what-is-specrails.md +3 -3
  403. package/docs/guide/es/getting-started/2-installing-and-first-run.md +2 -0
  404. package/docs/guide/es/getting-started/3-try-the-sample-project.md +35 -0
  405. package/docs/guide/es/getting-started/5-the-dashboard-tour.md +52 -0
  406. package/docs/guide/es/getting-started/6-universal-search.md +34 -0
  407. package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +26 -12
  408. package/docs/guide/es/insights/2-the-integrated-terminal.md +1 -1
  409. package/docs/guide/es/insights/3-code-explorer.md +5 -5
  410. package/docs/guide/es/integrations/1-ai-providers.md +1 -1
  411. package/docs/guide/es/integrations/2-plugins.md +1 -1
  412. package/docs/guide/es/integrations/3-jira-integration.md +4 -4
  413. package/docs/guide/es/integrations/4-mobile-companion.md +1 -1
  414. package/docs/guide/es/integrations/5-mcp-server.md +4 -4
  415. package/docs/guide/es/integrations/6-agent-chat.md +14 -7
  416. package/docs/guide/es/integrations/7-local-engines.md +1 -1
  417. package/docs/guide/es/integrations/8-flow-mode.md +69 -0
  418. package/docs/guide/es/pipeline/1-rails-and-jobs.md +33 -13
  419. package/docs/guide/es/pipeline/2-the-job-detail-view.md +38 -26
  420. package/docs/guide/es/pipeline/3-reviewing-a-delivery.md +43 -0
  421. package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
  422. package/docs/guide/es/pipeline/5-the-loop-builder.md +4 -4
  423. package/docs/guide/es/settings/1-themes.md +1 -1
  424. package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +10 -10
  425. package/docs/guide/es/settings/5-project-environment.md +1 -1
  426. package/docs/guide/es/settings/6-updates.md +24 -0
  427. package/docs/guide/es/settings/7-existing-projects.md +33 -0
  428. package/docs/guide/es/settings/8-accessibility.md +23 -0
  429. package/docs/guide/es/specs/1-specs-and-the-backlog.md +43 -7
  430. package/docs/guide/es/specs/2-add-spec-quick-mode.md +1 -1
  431. package/docs/guide/es/specs/3-add-spec-explore-mode.md +3 -3
  432. package/docs/guide/fr/agents/1-meet-the-agents.md +1 -1
  433. package/docs/guide/fr/getting-started/2-installing-and-first-run.md +2 -0
  434. package/docs/guide/fr/getting-started/3-try-the-sample-project.md +35 -0
  435. package/docs/guide/fr/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  436. package/docs/guide/fr/getting-started/6-universal-search.md +34 -0
  437. package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +18 -4
  438. package/docs/guide/fr/insights/2-the-integrated-terminal.md +1 -1
  439. package/docs/guide/fr/insights/3-code-explorer.md +1 -1
  440. package/docs/guide/fr/integrations/1-ai-providers.md +1 -1
  441. package/docs/guide/fr/integrations/2-plugins.md +1 -1
  442. package/docs/guide/fr/integrations/3-jira-integration.md +3 -3
  443. package/docs/guide/fr/integrations/4-mobile-companion.md +1 -1
  444. package/docs/guide/fr/integrations/5-mcp-server.md +1 -1
  445. package/docs/guide/fr/integrations/6-agent-chat.md +11 -4
  446. package/docs/guide/fr/integrations/8-flow-mode.md +69 -0
  447. package/docs/guide/fr/pipeline/1-rails-and-jobs.md +21 -1
  448. package/docs/guide/fr/pipeline/2-the-job-detail-view.md +12 -0
  449. package/docs/guide/fr/pipeline/3-reviewing-a-delivery.md +43 -0
  450. package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
  451. package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
  452. package/docs/guide/fr/settings/1-themes.md +1 -1
  453. package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  454. package/docs/guide/fr/settings/5-project-environment.md +1 -1
  455. package/docs/guide/fr/settings/6-updates.md +24 -0
  456. package/docs/guide/fr/settings/7-existing-projects.md +33 -0
  457. package/docs/guide/fr/settings/8-accessibility.md +23 -0
  458. package/docs/guide/fr/specs/1-specs-and-the-backlog.md +41 -3
  459. package/docs/guide/fr/specs/2-add-spec-quick-mode.md +1 -1
  460. package/docs/guide/fr/specs/3-add-spec-explore-mode.md +1 -1
  461. package/docs/guide/it/agents/1-meet-the-agents.md +1 -1
  462. package/docs/guide/it/getting-started/2-installing-and-first-run.md +2 -0
  463. package/docs/guide/it/getting-started/3-try-the-sample-project.md +35 -0
  464. package/docs/guide/it/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  465. package/docs/guide/it/getting-started/6-universal-search.md +34 -0
  466. package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +18 -4
  467. package/docs/guide/it/insights/2-the-integrated-terminal.md +1 -1
  468. package/docs/guide/it/insights/3-code-explorer.md +1 -1
  469. package/docs/guide/it/integrations/1-ai-providers.md +1 -1
  470. package/docs/guide/it/integrations/2-plugins.md +1 -1
  471. package/docs/guide/it/integrations/3-jira-integration.md +3 -3
  472. package/docs/guide/it/integrations/4-mobile-companion.md +1 -1
  473. package/docs/guide/it/integrations/5-mcp-server.md +1 -1
  474. package/docs/guide/it/integrations/6-agent-chat.md +11 -4
  475. package/docs/guide/it/integrations/8-flow-mode.md +69 -0
  476. package/docs/guide/it/pipeline/1-rails-and-jobs.md +21 -1
  477. package/docs/guide/it/pipeline/2-the-job-detail-view.md +12 -0
  478. package/docs/guide/it/pipeline/3-reviewing-a-delivery.md +43 -0
  479. package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
  480. package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
  481. package/docs/guide/it/settings/1-themes.md +1 -1
  482. package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  483. package/docs/guide/it/settings/5-project-environment.md +1 -1
  484. package/docs/guide/it/settings/6-updates.md +24 -0
  485. package/docs/guide/it/settings/7-existing-projects.md +33 -0
  486. package/docs/guide/it/settings/8-accessibility.md +23 -0
  487. package/docs/guide/it/specs/1-specs-and-the-backlog.md +41 -3
  488. package/docs/guide/it/specs/2-add-spec-quick-mode.md +1 -1
  489. package/docs/guide/it/specs/3-add-spec-explore-mode.md +1 -1
  490. package/docs/guide/ja/agents/1-meet-the-agents.md +1 -1
  491. package/docs/guide/ja/getting-started/2-installing-and-first-run.md +2 -0
  492. package/docs/guide/ja/getting-started/3-try-the-sample-project.md +35 -0
  493. package/docs/guide/ja/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  494. package/docs/guide/ja/getting-started/6-universal-search.md +34 -0
  495. package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +18 -4
  496. package/docs/guide/ja/insights/2-the-integrated-terminal.md +1 -1
  497. package/docs/guide/ja/insights/3-code-explorer.md +1 -1
  498. package/docs/guide/ja/integrations/1-ai-providers.md +1 -1
  499. package/docs/guide/ja/integrations/2-plugins.md +1 -1
  500. package/docs/guide/ja/integrations/3-jira-integration.md +3 -3
  501. package/docs/guide/ja/integrations/4-mobile-companion.md +1 -1
  502. package/docs/guide/ja/integrations/5-mcp-server.md +1 -1
  503. package/docs/guide/ja/integrations/6-agent-chat.md +11 -4
  504. package/docs/guide/ja/integrations/8-flow-mode.md +69 -0
  505. package/docs/guide/ja/pipeline/1-rails-and-jobs.md +21 -1
  506. package/docs/guide/ja/pipeline/2-the-job-detail-view.md +12 -0
  507. package/docs/guide/ja/pipeline/3-reviewing-a-delivery.md +43 -0
  508. package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
  509. package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
  510. package/docs/guide/ja/settings/1-themes.md +1 -1
  511. package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  512. package/docs/guide/ja/settings/5-project-environment.md +1 -1
  513. package/docs/guide/ja/settings/6-updates.md +24 -0
  514. package/docs/guide/ja/settings/7-existing-projects.md +33 -0
  515. package/docs/guide/ja/settings/8-accessibility.md +23 -0
  516. package/docs/guide/ja/specs/1-specs-and-the-backlog.md +41 -3
  517. package/docs/guide/ja/specs/2-add-spec-quick-mode.md +1 -1
  518. package/docs/guide/ja/specs/3-add-spec-explore-mode.md +1 -1
  519. package/docs/guide/pt/agents/1-meet-the-agents.md +1 -1
  520. package/docs/guide/pt/getting-started/2-installing-and-first-run.md +2 -0
  521. package/docs/guide/pt/getting-started/3-try-the-sample-project.md +35 -0
  522. package/docs/guide/pt/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  523. package/docs/guide/pt/getting-started/6-universal-search.md +34 -0
  524. package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +18 -4
  525. package/docs/guide/pt/insights/2-the-integrated-terminal.md +1 -1
  526. package/docs/guide/pt/insights/3-code-explorer.md +1 -1
  527. package/docs/guide/pt/integrations/1-ai-providers.md +1 -1
  528. package/docs/guide/pt/integrations/2-plugins.md +1 -1
  529. package/docs/guide/pt/integrations/3-jira-integration.md +3 -3
  530. package/docs/guide/pt/integrations/4-mobile-companion.md +1 -1
  531. package/docs/guide/pt/integrations/5-mcp-server.md +1 -1
  532. package/docs/guide/pt/integrations/6-agent-chat.md +12 -5
  533. package/docs/guide/pt/integrations/8-flow-mode.md +69 -0
  534. package/docs/guide/pt/pipeline/1-rails-and-jobs.md +21 -1
  535. package/docs/guide/pt/pipeline/2-the-job-detail-view.md +12 -0
  536. package/docs/guide/pt/pipeline/3-reviewing-a-delivery.md +43 -0
  537. package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
  538. package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
  539. package/docs/guide/pt/settings/1-themes.md +1 -1
  540. package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  541. package/docs/guide/pt/settings/5-project-environment.md +1 -1
  542. package/docs/guide/pt/settings/6-updates.md +24 -0
  543. package/docs/guide/pt/settings/7-existing-projects.md +33 -0
  544. package/docs/guide/pt/settings/8-accessibility.md +23 -0
  545. package/docs/guide/pt/specs/1-specs-and-the-backlog.md +41 -3
  546. package/docs/guide/pt/specs/2-add-spec-quick-mode.md +1 -1
  547. package/docs/guide/pt/specs/3-add-spec-explore-mode.md +1 -1
  548. package/docs/guide/zh/agents/1-meet-the-agents.md +1 -1
  549. package/docs/guide/zh/getting-started/2-installing-and-first-run.md +2 -0
  550. package/docs/guide/zh/getting-started/3-try-the-sample-project.md +35 -0
  551. package/docs/guide/zh/getting-started/{4-the-dashboard-tour.md → 5-the-dashboard-tour.md} +7 -3
  552. package/docs/guide/zh/getting-started/6-universal-search.md +34 -0
  553. package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +18 -4
  554. package/docs/guide/zh/insights/2-the-integrated-terminal.md +1 -1
  555. package/docs/guide/zh/insights/3-code-explorer.md +1 -1
  556. package/docs/guide/zh/integrations/1-ai-providers.md +1 -1
  557. package/docs/guide/zh/integrations/2-plugins.md +1 -1
  558. package/docs/guide/zh/integrations/3-jira-integration.md +3 -3
  559. package/docs/guide/zh/integrations/4-mobile-companion.md +1 -1
  560. package/docs/guide/zh/integrations/5-mcp-server.md +1 -1
  561. package/docs/guide/zh/integrations/6-agent-chat.md +11 -4
  562. package/docs/guide/zh/integrations/8-flow-mode.md +69 -0
  563. package/docs/guide/zh/pipeline/1-rails-and-jobs.md +21 -1
  564. package/docs/guide/zh/pipeline/2-the-job-detail-view.md +12 -0
  565. package/docs/guide/zh/pipeline/3-reviewing-a-delivery.md +43 -0
  566. package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
  567. package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
  568. package/docs/guide/zh/settings/1-themes.md +1 -1
  569. package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +2 -2
  570. package/docs/guide/zh/settings/5-project-environment.md +1 -1
  571. package/docs/guide/zh/settings/6-updates.md +24 -0
  572. package/docs/guide/zh/settings/7-existing-projects.md +33 -0
  573. package/docs/guide/zh/settings/8-accessibility.md +23 -0
  574. package/docs/guide/zh/specs/1-specs-and-the-backlog.md +41 -3
  575. package/docs/guide/zh/specs/2-add-spec-quick-mode.md +1 -1
  576. package/docs/guide/zh/specs/3-add-spec-explore-mode.md +1 -1
  577. package/docs/internals/README.md +8 -0
  578. package/docs/internals/adding-a-provider.md +19 -2
  579. package/docs/internals/agent-actions-audit.md +101 -0
  580. package/docs/internals/agent-sessions.md +36 -1
  581. package/docs/internals/api-reference.md +190 -45
  582. package/docs/internals/architecture.md +53 -47
  583. package/docs/internals/companion-inbox-decisions.md +42 -0
  584. package/docs/internals/companion-rails-as-loops-contract.md +17 -6
  585. package/docs/internals/configuration.md +140 -9
  586. package/docs/internals/core-runtime-updates.md +4 -4
  587. package/docs/internals/existing-project-anchoring.md +168 -0
  588. package/docs/internals/flow-mode.md +668 -0
  589. package/docs/internals/legacy-implementation-notes.md +13 -0
  590. package/docs/internals/local-testing-feedback-2026-10.md +210 -0
  591. package/docs/internals/mcp-mission-audit.md +4 -0
  592. package/docs/internals/mission-rail-cards.md +10 -5
  593. package/docs/internals/mission-read-only-policy.md +152 -0
  594. package/docs/internals/modal-standard.md +181 -0
  595. package/docs/internals/openspec-workflow.md +32 -0
  596. package/docs/internals/operations-runbook.md +30 -0
  597. package/docs/internals/profiles.md +6 -3
  598. package/docs/internals/programmatic-agent-runtime.md +8 -0
  599. package/docs/internals/project-builder.md +1 -1
  600. package/docs/internals/review-packet.md +161 -9
  601. package/docs/internals/safe-pr-review-flow.md +135 -6
  602. package/docs/internals/source-map.md +413 -18
  603. package/docs/internals/spec-addenda.md +10 -0
  604. package/docs/internals/spec-triage.md +140 -0
  605. package/docs/internals/visual-design-audit.md +15 -2
  606. package/docs/local-providers.md +3 -0
  607. package/docs/mcp.md +21 -3
  608. package/docs/platforms/macos.md +1 -1
  609. package/docs/platforms/windows.md +2 -2
  610. package/docs/running-pipelines.md +22 -6
  611. package/docs/tracking-cost.md +54 -10
  612. package/local-runner/dist/specrails-local-runner.js +3851 -1178
  613. package/mcp-bridge/dist/specrails-mcp.js +3864 -1143
  614. package/package.json +10 -9
  615. package/server/dist/agent-mcp-config.js +37 -1
  616. package/server/dist/api-version.js +19 -0
  617. package/server/dist/command-resolver.js +4 -2
  618. package/server/dist/core-compat.js +1 -1
  619. package/server/dist/core-execution.js +2 -1
  620. package/server/dist/core-update-manager.js +71 -13
  621. package/server/dist/db/job-search.js +248 -0
  622. package/server/dist/db/jobs.js +6 -0
  623. package/server/dist/db/migrations.js +239 -0
  624. package/server/dist/db.js +9 -2
  625. package/server/dist/desktop-db.js +99 -5
  626. package/server/dist/desktop-router.js +126 -13
  627. package/server/dist/docs-router.js +67 -1
  628. package/server/dist/feature-flags.js +22 -0
  629. package/server/dist/index.js +30 -15
  630. package/server/dist/jira/jira-adf.js +13 -1
  631. package/server/dist/jira/jira-clarifications.js +146 -0
  632. package/server/dist/jira/jira-client.js +8 -1
  633. package/server/dist/jira/jira-db.js +41 -0
  634. package/server/dist/jira/jira-sync-manager.js +328 -25
  635. package/server/dist/mcp/guide.js +17 -7
  636. package/server/dist/mcp/tools/agents.js +1 -1
  637. package/server/dist/mcp/tools/analytics.js +15 -3
  638. package/server/dist/mcp/tools/app-settings.js +14 -1
  639. package/server/dist/mcp/tools/chat.js +1 -1
  640. package/server/dist/mcp/tools/env.js +4 -2
  641. package/server/dist/mcp/tools/jobs.js +96 -7
  642. package/server/dist/mcp/tools/loops.js +1 -1
  643. package/server/dist/mcp/tools/meta.js +10 -13
  644. package/server/dist/mcp/tools/rails.js +15 -1
  645. package/server/dist/mcp/tools/setup.js +1 -1
  646. package/server/dist/mcp/tools/specs.js +8 -5
  647. package/server/dist/mcp/tools/support.js +6 -3
  648. package/server/dist/mcp/tools/types.js +38 -1
  649. package/server/dist/mobile/mobile-admin-router.js +0 -16
  650. package/server/dist/mobile/mobile-gateway.js +0 -18
  651. package/server/dist/mobile/mobile-inbox.js +240 -0
  652. package/server/dist/mobile/mobile-missions.js +6 -8
  653. package/server/dist/mobile/mobile-router.js +9 -9
  654. package/server/dist/mobile/mobile-webrtc-peer.js +4 -54
  655. package/server/dist/mobile/mobile-ws.js +27 -4
  656. package/server/dist/modules/accounting/runtime/ai-invocations.js +4 -0
  657. package/server/dist/modules/accounting/runtime/decision-times.js +102 -0
  658. package/server/dist/modules/accounting/runtime/loop-economics.js +284 -0
  659. package/server/dist/modules/accounting/runtime/spending.js +7 -2
  660. package/server/dist/modules/accounting/runtime/what-if.js +87 -0
  661. package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +86 -5
  662. package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +28 -2
  663. package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +15 -2
  664. package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +21 -2
  665. package/server/dist/modules/agent-runtime/runtime/core-capabilities.js +55 -0
  666. package/server/dist/modules/agent-sessions/adapters/host-process.js +1 -1
  667. package/server/dist/modules/agent-sessions/domain/availability.js +16 -0
  668. package/server/dist/modules/agent-sessions/domain/protocol.js +8 -1
  669. package/server/dist/modules/agent-sessions/index.js +3 -1
  670. package/server/dist/modules/agent-sessions/runtime/core-sessions-availability.js +16 -0
  671. package/server/dist/modules/agents/runtime/agent-refine-manager.js +3 -1
  672. package/server/dist/modules/agents/runtime/agent-store.js +60 -73
  673. package/server/dist/modules/audit/adapters/http.js +66 -0
  674. package/server/dist/modules/audit/adapters/runtime.js +60 -0
  675. package/server/dist/modules/audit/adapters/sqlite.js +73 -0
  676. package/server/dist/modules/audit/application.js +190 -0
  677. package/server/dist/modules/audit/domain.js +434 -0
  678. package/server/dist/modules/audit/index.js +27 -0
  679. package/server/dist/modules/audit/ports.js +2 -0
  680. package/server/dist/modules/browser/runtime/browser-capture-manager.js +18 -141
  681. package/server/dist/modules/browser/runtime/browser-capture-types.js +1 -10
  682. package/server/dist/modules/browser/runtime/browser-playwright.js +0 -19
  683. package/server/dist/modules/code/runtime/file-provenance.js +23 -0
  684. package/server/dist/modules/conversations/runtime/chat-manager.js +5 -2
  685. package/server/dist/modules/delivery/adapters/decisions/chains.js +1 -0
  686. package/server/dist/modules/delivery/adapters/decisions/create.js +19 -1
  687. package/server/dist/modules/delivery/adapters/decisions/discard.js +2 -0
  688. package/server/dist/modules/delivery/adapters/decisions/local-changes.js +427 -0
  689. package/server/dist/modules/delivery/adapters/decisions/merge-local.js +80 -6
  690. package/server/dist/modules/delivery/adapters/decisions/observations.js +5 -0
  691. package/server/dist/modules/delivery/adapters/decisions/ownership.js +2 -1
  692. package/server/dist/modules/delivery/adapters/decisions/transitions.js +9 -0
  693. package/server/dist/modules/delivery/adapters/review-wip-store.js +37 -0
  694. package/server/dist/modules/delivery/domain/review-wip.js +71 -0
  695. package/server/dist/modules/delivery/index.js +9 -1
  696. package/server/dist/modules/delivery/runtime/delivery-changes.js +355 -0
  697. package/server/dist/modules/delivery/runtime/delivery-evidence.js +249 -8
  698. package/server/dist/modules/delivery/runtime/flow-review-legacy.js +99 -0
  699. package/server/dist/modules/delivery/runtime/flow-review-outcome.js +107 -0
  700. package/server/dist/modules/delivery/runtime/flow-worktree-handoff.js +32 -0
  701. package/server/dist/modules/delivery/runtime/flow-worktree-return.js +87 -0
  702. package/server/dist/modules/delivery/runtime/isolated-worktree.js +380 -0
  703. package/server/dist/modules/delivery/runtime/local-restore-branch.js +325 -0
  704. package/server/dist/modules/delivery/runtime/local-restore-resolver.js +48 -0
  705. package/server/dist/modules/delivery/runtime/local-stash.js +423 -0
  706. package/server/dist/modules/delivery/runtime/multi-repo-execution.js +27 -1
  707. package/server/dist/modules/delivery/runtime/phase3-harvest.js +40 -0
  708. package/server/dist/modules/delivery/runtime/pr-body.js +50 -0
  709. package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +169 -166
  710. package/server/dist/modules/delivery/runtime/rail-launch-parser.js +5 -2
  711. package/server/dist/modules/delivery/runtime/rail-pr-decision.js +7 -1
  712. package/server/dist/modules/delivery/runtime/rail-pr-store.js +193 -12
  713. package/server/dist/modules/delivery/runtime/rails-router.js +267 -5
  714. package/server/dist/modules/delivery/runtime/review-brief.js +208 -0
  715. package/server/dist/modules/delivery/runtime/review-packet.js +41 -2
  716. package/server/dist/modules/delivery/runtime/review-wip-gate.js +67 -0
  717. package/server/dist/modules/delivery/runtime/run-records.js +267 -0
  718. package/server/dist/modules/delivery/runtime/run-review-diagnosis.js +102 -0
  719. package/server/dist/modules/execution/adapters/budget-storage.js +76 -0
  720. package/server/dist/modules/execution/application/enforce-budget.js +17 -2
  721. package/server/dist/modules/execution/domain/agent-env.js +98 -0
  722. package/server/dist/modules/execution/domain/daily-budget.js +36 -0
  723. package/server/dist/modules/execution/domain/spend-caps.js +166 -0
  724. package/server/dist/modules/execution/index.js +34 -1
  725. package/server/dist/modules/execution/runtime/budget-overview.js +76 -0
  726. package/server/dist/modules/execution/runtime/daily-budget-gate.js +86 -0
  727. package/server/dist/modules/execution/runtime/interactive-job-session.js +8 -0
  728. package/server/dist/modules/execution/runtime/launch-forecast.js +33 -0
  729. package/server/dist/modules/execution/runtime/queue-manager.js +54 -15
  730. package/server/dist/modules/execution/runtime/run-duration-stats.js +31 -13
  731. package/server/dist/modules/flow/adapters/bindings.js +1089 -0
  732. package/server/dist/modules/flow/adapters/http.js +147 -0
  733. package/server/dist/modules/flow/adapters/sqlite.js +121 -0
  734. package/server/dist/modules/flow/application.js +805 -0
  735. package/server/dist/modules/flow/domain.js +790 -0
  736. package/server/dist/modules/flow/index.js +34 -0
  737. package/server/dist/modules/flow/ports.js +2 -0
  738. package/server/dist/modules/inbox/adapters/http.js +21 -0
  739. package/server/dist/modules/inbox/adapters/project-source.js +233 -0
  740. package/server/dist/modules/inbox/application.js +28 -0
  741. package/server/dist/modules/inbox/domain.js +43 -0
  742. package/server/dist/modules/inbox/index.js +10 -0
  743. package/server/dist/modules/inbox/ports.js +2 -0
  744. package/server/dist/modules/loops/runtime/loop-definition-run.js +9 -0
  745. package/server/dist/modules/loops/runtime/loop-definition.js +5 -2
  746. package/server/dist/modules/loops/runtime/loop-executors.js +90 -9
  747. package/server/dist/modules/loops/runtime/loop-factory.js +30 -2
  748. package/server/dist/modules/loops/runtime/loop-flow-spec-recipe.js +166 -0
  749. package/server/dist/modules/loops/runtime/loop-graph.js +1 -1
  750. package/server/dist/modules/loops/runtime/loop-role-engines.js +4 -1
  751. package/server/dist/modules/loops/runtime/loop-run-manager.js +267 -10
  752. package/server/dist/modules/loops/runtime/loop-runs-store.js +21 -5
  753. package/server/dist/modules/loops/runtime/loop-templates.js +55 -12
  754. package/server/dist/modules/missions/runtime/agent-chat-manager.js +283 -20
  755. package/server/dist/modules/missions/runtime/agent-chat-router.js +96 -21
  756. package/server/dist/modules/missions/runtime/agent-failure-briefing.js +11 -3
  757. package/server/dist/modules/missions/runtime/agent-fence-promotion.js +9 -1
  758. package/server/dist/modules/missions/runtime/agent-flow-prompt.js +64 -0
  759. package/server/dist/modules/missions/runtime/agent-input-store.js +9 -4
  760. package/server/dist/modules/missions/runtime/agent-operator-prompt.js +100 -14
  761. package/server/dist/modules/missions/runtime/agent-session-store.js +88 -27
  762. package/server/dist/modules/missions/runtime/core-session-runner.js +89 -9
  763. package/server/dist/modules/missions/runtime/flow-turn-context.js +17 -0
  764. package/server/dist/modules/missions/runtime/mission-core-sessions.js +295 -55
  765. package/server/dist/modules/missions/runtime/mission-run-notify.js +2 -0
  766. package/server/dist/modules/missions/runtime/mission-session-projector.js +56 -19
  767. package/server/dist/modules/missions/runtime/mission-tool-policy.js +47 -0
  768. package/server/dist/modules/onboarding/adapters/http.js +78 -0
  769. package/server/dist/modules/onboarding/adapters/providers.js +41 -0
  770. package/server/dist/modules/onboarding/adapters/runtime.js +130 -0
  771. package/server/dist/modules/onboarding/application.js +133 -0
  772. package/server/dist/modules/onboarding/catalog.js +217 -0
  773. package/server/dist/modules/onboarding/domain.js +102 -0
  774. package/server/dist/modules/onboarding/index.js +20 -0
  775. package/server/dist/modules/onboarding/ports.js +2 -0
  776. package/server/dist/modules/project-rules/adapters/http.js +91 -0
  777. package/server/dist/modules/project-rules/domain.js +122 -0
  778. package/server/dist/modules/project-rules/runtime/rules-inventory-runs.js +97 -0
  779. package/server/dist/modules/project-rules/runtime/rules-store.js +109 -0
  780. package/server/dist/modules/project-settings/adapters/http.js +13 -0
  781. package/server/dist/modules/project-settings/adapters/sqlite.js +78 -8
  782. package/server/dist/modules/project-settings/domain.js +47 -1
  783. package/server/dist/modules/project-settings/index.js +7 -1
  784. package/server/dist/modules/recovery/adapters/sqlite.js +28 -0
  785. package/server/dist/modules/recovery/domain.js +162 -0
  786. package/server/dist/modules/recovery/index.js +16 -0
  787. package/server/dist/modules/specs/adapters/timeline-http.js +101 -0
  788. package/server/dist/modules/specs/domain/handoff-labels.js +371 -0
  789. package/server/dist/modules/specs/domain/handoff.js +260 -0
  790. package/server/dist/modules/specs/domain/non-goals.js +101 -0
  791. package/server/dist/modules/specs/domain/timeline.js +164 -0
  792. package/server/dist/modules/specs/domain/triage.js +320 -0
  793. package/server/dist/modules/specs/runtime/contract-refine-runner.js +3 -2
  794. package/server/dist/modules/specs/runtime/generated-spec-parser.js +75 -0
  795. package/server/dist/modules/specs/runtime/proposal-manager.js +4 -3
  796. package/server/dist/modules/specs/runtime/smash-runner.js +2 -1
  797. package/server/dist/modules/specs/runtime/spec-addenda.js +31 -0
  798. package/server/dist/modules/specs/runtime/spec-draft-parser.js +6 -1
  799. package/server/dist/modules/specs/runtime/spec-generation.js +431 -0
  800. package/server/dist/modules/specs/runtime/spec-handoff.js +103 -0
  801. package/server/dist/modules/specs/runtime/spec-history.js +376 -0
  802. package/server/dist/modules/specs/runtime/spec-launcher-manager.js +4 -3
  803. package/server/dist/modules/specs/runtime/spec-search.js +117 -0
  804. package/server/dist/modules/specs/runtime/ticket-store.js +47 -2
  805. package/server/dist/modules/specs/runtime/ticket-trash-service.js +62 -0
  806. package/server/dist/modules/specs/runtime/ticket-trash.js +193 -0
  807. package/server/dist/modules/specs/runtime/triage-runner.js +171 -0
  808. package/server/dist/modules/specs/runtime/triage.js +365 -0
  809. package/server/dist/modules/terminals/domain/app-urls.js +96 -0
  810. package/server/dist/modules/terminals/runtime/app-urls.js +77 -0
  811. package/server/dist/modules/terminals/runtime/background-process-service.js +25 -28
  812. package/server/dist/openspec-shim.js +1 -1
  813. package/server/dist/project-env.js +60 -0
  814. package/server/dist/project-git.js +65 -0
  815. package/server/dist/project-registry.js +264 -27
  816. package/server/dist/project-router-background-processes.js +27 -3
  817. package/server/dist/project-router-git.js +30 -0
  818. package/server/dist/project-router-helpers.js +5 -30
  819. package/server/dist/project-router-jobs.js +49 -1
  820. package/server/dist/project-router-loop-runs.js +72 -2
  821. package/server/dist/project-router-rules.js +54 -0
  822. package/server/dist/project-router-search.js +52 -0
  823. package/server/dist/project-router-settings.js +6 -0
  824. package/server/dist/project-router-setup.js +1 -1
  825. package/server/dist/project-router-spending.js +138 -0
  826. package/server/dist/project-router-tickets.js +246 -427
  827. package/server/dist/project-router.js +7 -0
  828. package/server/dist/providers/claude-adapter.js +25 -3
  829. package/server/dist/providers/codex-adapter.js +9 -1
  830. package/server/dist/providers/gemini-adapter.js +6 -1
  831. package/server/dist/providers/kimi-adapter.js +2 -0
  832. package/server/dist/providers/local-adapter.js +2 -0
  833. package/server/dist/providers/runtime.js +8 -0
  834. package/server/dist/schemas/agent-runtime.schema.json +3 -1
  835. package/server/dist/schemas/workflow-definition.schema.json +1 -0
  836. package/server/dist/setup-manager.js +19 -1
  837. package/server/dist/transient-children.js +25 -8
  838. package/server/dist/update-channel.js +21 -0
  839. package/server/dist/util/search-snippet.js +74 -0
  840. package/server/dist/worktree-manager.js +19 -8
  841. package/client/dist/assets/ActivityFeedPage-Dtp7EyHc.js +0 -1
  842. package/client/dist/assets/AgentBrowserCapture-CLqlEFw8.js +0 -1
  843. package/client/dist/assets/AgentModeAnalyticsPane-B8_hM3Tw.js +0 -2
  844. package/client/dist/assets/AgentModeCodePane-CNF8ZNjE.js +0 -2
  845. package/client/dist/assets/AgentModeJobsPane-CJpJbO9m.js +0 -1
  846. package/client/dist/assets/AgentsPage-BC8XSR79.js +0 -120
  847. package/client/dist/assets/AnalyticsPage-Cdv4jLtW.js +0 -1
  848. package/client/dist/assets/BarChart-BDMqVFJy.js +0 -55
  849. package/client/dist/assets/CodePage-DI1kegAr.js +0 -3
  850. package/client/dist/assets/DesktopAnalyticsPage-Bdp8E8U6.js +0 -1
  851. package/client/dist/assets/DocsDialog-Bm4RS7FX.js +0 -11
  852. package/client/dist/assets/DocsPage-DihYcU8r.js +0 -11
  853. package/client/dist/assets/ExportDropdown-Bb1lHx3r.js +0 -1
  854. package/client/dist/assets/IntegrationsPage-EAipiDWm.js +0 -1
  855. package/client/dist/assets/InteractiveJobComposer-BO6ASN-2.js +0 -19
  856. package/client/dist/assets/JobDetailModal-CuPYq7tP.js +0 -1
  857. package/client/dist/assets/JobDetailPage-BusMjJi9.js +0 -1
  858. package/client/dist/assets/JobsPage-C0QbsF2d.js +0 -1
  859. package/client/dist/assets/LoopBuilderPage-B7TlU4iS.js +0 -1
  860. package/client/dist/assets/LoopPreviewModal-BRWtXOD2.js +0 -1
  861. package/client/dist/assets/LoopsPage-C4q1DmCE.js +0 -2
  862. package/client/dist/assets/MinimizedChatsContext-DHfigjHS.js +0 -1
  863. package/client/dist/assets/PluginsPage-Z1JHSMdR.js +0 -2
  864. package/client/dist/assets/ProjectSettingsDialog-BUNj0tvN.js +0 -1
  865. package/client/dist/assets/RepositoryDeliveries-B4ybHOyB.js +0 -5
  866. package/client/dist/assets/ReviewPacketPage-hwfPNjyy.js +0 -4
  867. package/client/dist/assets/TemplatePreviewModal-V7FpMWuw.js +0 -1
  868. package/client/dist/assets/TicketDetailModalContext-Dkwo2cDs.js +0 -16
  869. package/client/dist/assets/Trans-BbFxRFtR.js +0 -1
  870. package/client/dist/assets/activity-B-rp4h_v.js +0 -1
  871. package/client/dist/assets/activity-C6kJpm9q.js +0 -1
  872. package/client/dist/assets/activity-CGx4kb_j.js +0 -1
  873. package/client/dist/assets/activity-CnoX2bH7.js +0 -1
  874. package/client/dist/assets/activity-DAyekdlt.js +0 -1
  875. package/client/dist/assets/activity-DCxtpT7j.js +0 -1
  876. package/client/dist/assets/activity-DiyjsgQV.js +0 -1
  877. package/client/dist/assets/activity-JzwRaWPD.js +0 -1
  878. package/client/dist/assets/addspec-BOvgmcgk.js +0 -1
  879. package/client/dist/assets/addspec-Clmyfn_R.js +0 -1
  880. package/client/dist/assets/addspec-CsNaBpHp.js +0 -1
  881. package/client/dist/assets/addspec-D2tvWmmV.js +0 -1
  882. package/client/dist/assets/addspec-D3nFwvD0.js +0 -1
  883. package/client/dist/assets/addspec-DVLEhK3w.js +0 -1
  884. package/client/dist/assets/addspec-DXbK-tb0.js +0 -1
  885. package/client/dist/assets/addspec-OHG8DFEn.js +0 -1
  886. package/client/dist/assets/agent-5bSixVzz.js +0 -1
  887. package/client/dist/assets/agent-BR4EHfhq.js +0 -1
  888. package/client/dist/assets/agent-C0IKkJP8.js +0 -1
  889. package/client/dist/assets/agent-C7li9ayC.js +0 -1
  890. package/client/dist/assets/agent-D0dRmEen.js +0 -1
  891. package/client/dist/assets/agent-DZVGHm7H.js +0 -1
  892. package/client/dist/assets/agent-Dip4h2YE.js +0 -1
  893. package/client/dist/assets/agent-Pp-P-n1p.js +0 -1
  894. package/client/dist/assets/agentRuntime-BxF81z52.js +0 -1
  895. package/client/dist/assets/agentRuntime-BxYS5V7u.js +0 -1
  896. package/client/dist/assets/agentRuntime-Dc9HG3BA.js +0 -1
  897. package/client/dist/assets/agents-B6ZsnARo.js +0 -1
  898. package/client/dist/assets/agents-BORdhe0K.js +0 -1
  899. package/client/dist/assets/agents-C6aq9Oqs.js +0 -1
  900. package/client/dist/assets/agents-Cbsc4bcX.js +0 -1
  901. package/client/dist/assets/agents-D0uYR6hq.js +0 -1
  902. package/client/dist/assets/agents-Doe1sHY5.js +0 -1
  903. package/client/dist/assets/agents-DyNi_I9m.js +0 -1
  904. package/client/dist/assets/agents-StKxiTg0.js +0 -1
  905. package/client/dist/assets/agentstudio-7cYCXn-L.js +0 -1
  906. package/client/dist/assets/agentstudio-BHWQh8G3.js +0 -1
  907. package/client/dist/assets/agentstudio-BjnWHyRs.js +0 -1
  908. package/client/dist/assets/agentstudio-BkV8vcK4.js +0 -1
  909. package/client/dist/assets/agentstudio-BzugqB_N.js +0 -1
  910. package/client/dist/assets/agentstudio-CWbp7KvH.js +0 -1
  911. package/client/dist/assets/agentstudio-DG6plf5o.js +0 -1
  912. package/client/dist/assets/agentstudio-DkZVF-Cc.js +0 -1
  913. package/client/dist/assets/analytics-B1DIQd4m.js +0 -1
  914. package/client/dist/assets/analytics-BAIZ9vE_.js +0 -1
  915. package/client/dist/assets/analytics-BTqgmgBd.js +0 -1
  916. package/client/dist/assets/analytics-BWynXPEm.js +0 -1
  917. package/client/dist/assets/analytics-DGcUsQ44.js +0 -1
  918. package/client/dist/assets/analytics-GnSnpJ4W.js +0 -1
  919. package/client/dist/assets/analytics-TWgYaoO0.js +0 -1
  920. package/client/dist/assets/analytics-kJy6Tuko.js +0 -1
  921. package/client/dist/assets/atom-one-dark-qiGhVQxg.js +0 -1
  922. package/client/dist/assets/builder-B9gorTnT.js +0 -1
  923. package/client/dist/assets/builder-Bvw5s3Mi.js +0 -1
  924. package/client/dist/assets/builder-CL5l4dU3.js +0 -1
  925. package/client/dist/assets/builder-CVDTVrQX.js +0 -1
  926. package/client/dist/assets/builder-CpS9liE9.js +0 -1
  927. package/client/dist/assets/builder-DNctIL9Q.js +0 -1
  928. package/client/dist/assets/builder-De2NxX6o.js +0 -1
  929. package/client/dist/assets/builder-DeYT7Y-m.js +0 -1
  930. package/client/dist/assets/button-4FS1ZDTp.js +0 -1
  931. package/client/dist/assets/chat-D_I7nU5K.js +0 -1
  932. package/client/dist/assets/chevron-up-6EFqEHBj.js +0 -1
  933. package/client/dist/assets/chunk-OB3PAWPO-B1EMk45A.js +0 -3
  934. package/client/dist/assets/clsx-CjueKrWZ.js +0 -1
  935. package/client/dist/assets/code-B37GRg9C.js +0 -1
  936. package/client/dist/assets/code-BBOEZbf9.js +0 -1
  937. package/client/dist/assets/code-BRm-jcyx.js +0 -1
  938. package/client/dist/assets/code-CF7w62CR.js +0 -1
  939. package/client/dist/assets/code-CLuvJt2r.js +0 -1
  940. package/client/dist/assets/code-D0RCm59f.js +0 -1
  941. package/client/dist/assets/code-DaZ-ZwCT.js +0 -1
  942. package/client/dist/assets/code-iIHkGaCL.js +0 -1
  943. package/client/dist/assets/commands-0XjAftla.js +0 -1
  944. package/client/dist/assets/commands-BAWSYHjQ.js +0 -1
  945. package/client/dist/assets/commands-BBwowgiE.js +0 -1
  946. package/client/dist/assets/commands-BacjIZLN.js +0 -1
  947. package/client/dist/assets/commands-Bs62IAZ3.js +0 -1
  948. package/client/dist/assets/commands-CLPdh-Hh.js +0 -1
  949. package/client/dist/assets/commands-DlbFzgrp.js +0 -1
  950. package/client/dist/assets/commands-LjPSsi5F.js +0 -1
  951. package/client/dist/assets/common-Bdi0qN4S.js +0 -1
  952. package/client/dist/assets/common-Bhb9zN1P.js +0 -1
  953. package/client/dist/assets/common-BykKlZg1.js +0 -1
  954. package/client/dist/assets/common-CvnNNSJA.js +0 -1
  955. package/client/dist/assets/common-D5zk_mqq.js +0 -1
  956. package/client/dist/assets/common-DQNO_al5.js +0 -1
  957. package/client/dist/assets/common-Dax30Vmp.js +0 -1
  958. package/client/dist/assets/common-DkllpVSb.js +0 -1
  959. package/client/dist/assets/core-B3mKBIh5.js +0 -1
  960. package/client/dist/assets/dashboard-B1ndRHuC.js +0 -1
  961. package/client/dist/assets/dashboard-BX7KXiqA.js +0 -1
  962. package/client/dist/assets/dashboard-B_BSNxcN.js +0 -1
  963. package/client/dist/assets/dashboard-CCeFN7-V.js +0 -1
  964. package/client/dist/assets/dashboard-CRl0WtFJ.js +0 -1
  965. package/client/dist/assets/dashboard-XGdQ5mjw.js +0 -1
  966. package/client/dist/assets/dashboard-_oltA6Jd.js +0 -1
  967. package/client/dist/assets/dashboard-bAuf5KVk.js +0 -1
  968. package/client/dist/assets/dialog-DtdR05v1.js +0 -45
  969. package/client/dist/assets/dist-js-CJ_2XX1Y.js +0 -1
  970. package/client/dist/assets/event-Bt7f3wXe.js +0 -1
  971. package/client/dist/assets/explore-BG99VGpL.js +0 -1
  972. package/client/dist/assets/explore-C0TjprJW.js +0 -1
  973. package/client/dist/assets/explore-C2dgEo7q.js +0 -1
  974. package/client/dist/assets/explore-C8NDHbob.js +0 -1
  975. package/client/dist/assets/explore-CWWgzQGR.js +0 -1
  976. package/client/dist/assets/explore-CcQXpdtS.js +0 -1
  977. package/client/dist/assets/explore-DgBACn39.js +0 -1
  978. package/client/dist/assets/explore-DsXAgnmJ.js +0 -1
  979. package/client/dist/assets/file-text-C0blZHLh.js +0 -1
  980. package/client/dist/assets/formatDistanceToNow-NjPHBLfB.js +0 -1
  981. package/client/dist/assets/getTimezoneOffsetInMilliseconds-vJ7qUoqN.js +0 -1
  982. package/client/dist/assets/git-branch-yf6LE1Bw.js +0 -1
  983. package/client/dist/assets/index-BgbCbIua.css +0 -2
  984. package/client/dist/assets/index-Ce4yZtKf.js +0 -83
  985. package/client/dist/assets/integrations-BkpRUbvp.js +0 -1
  986. package/client/dist/assets/integrations-Bo8qbJf4.js +0 -1
  987. package/client/dist/assets/integrations-CmSrKzZb.js +0 -1
  988. package/client/dist/assets/integrations-DGtq26Rr.js +0 -1
  989. package/client/dist/assets/integrations-De38GFnQ.js +0 -1
  990. package/client/dist/assets/integrations-Dw6zdtb-.js +0 -1
  991. package/client/dist/assets/integrations-Dwl9KQp0.js +0 -1
  992. package/client/dist/assets/integrations-Refg_d2I.js +0 -1
  993. package/client/dist/assets/jira-B6OYw4CJ.js +0 -1
  994. package/client/dist/assets/jira-BTF6RaOe.js +0 -1
  995. package/client/dist/assets/jira-CEetIB2q.js +0 -1
  996. package/client/dist/assets/jira-CIzsZLw5.js +0 -1
  997. package/client/dist/assets/jira-Daw9tmpI.js +0 -1
  998. package/client/dist/assets/jira-FXr7u2lh.js +0 -1
  999. package/client/dist/assets/jira-LaNQn7yl.js +0 -1
  1000. package/client/dist/assets/jira-api-Cabj-H0J.js +0 -1
  1001. package/client/dist/assets/job-time-BCL7wee9.js +0 -1
  1002. package/client/dist/assets/jobs-ARwD85B9.js +0 -1
  1003. package/client/dist/assets/jobs-BMF1w4WT.js +0 -1
  1004. package/client/dist/assets/jobs-CBfzGLwm.js +0 -1
  1005. package/client/dist/assets/jobs-CPjiluBY.js +0 -1
  1006. package/client/dist/assets/jobs-CQQd58pY.js +0 -1
  1007. package/client/dist/assets/jobs-De3EqaO0.js +0 -1
  1008. package/client/dist/assets/jobs-Du9-Ei9a.js +0 -1
  1009. package/client/dist/assets/jobs-qMHbnxwC.js +0 -1
  1010. package/client/dist/assets/layers-BCLTgHXO.js +0 -1
  1011. package/client/dist/assets/loader-circle-BqV9xYGf.js +0 -1
  1012. package/client/dist/assets/loop-layout-CyXj9223.js +0 -7
  1013. package/client/dist/assets/loops-B2PhQLKR.js +0 -1
  1014. package/client/dist/assets/loops-BqbF46st.js +0 -1
  1015. package/client/dist/assets/loops-CINnHbfI.js +0 -1
  1016. package/client/dist/assets/loops-D-3XhH04.js +0 -1
  1017. package/client/dist/assets/loops-DKkEEjZ_.js +0 -1
  1018. package/client/dist/assets/loops-DzWR5-v6.js +0 -1
  1019. package/client/dist/assets/loops-WyWDkhok.js +0 -1
  1020. package/client/dist/assets/loops-scD5fIBf.js +0 -1
  1021. package/client/dist/assets/mcp-6rMoZfEO.js +0 -1
  1022. package/client/dist/assets/mcp-BD8sL5mP.js +0 -1
  1023. package/client/dist/assets/mcp-BkcA3I5s.js +0 -1
  1024. package/client/dist/assets/mcp-CCpSelOh.js +0 -1
  1025. package/client/dist/assets/mcp-CUAN6ORK.js +0 -1
  1026. package/client/dist/assets/mcp-CqbRxRTE.js +0 -1
  1027. package/client/dist/assets/mcp-DP2YfVhO.js +0 -1
  1028. package/client/dist/assets/mcp-DUVQamDz.js +0 -1
  1029. package/client/dist/assets/narration-BEKMVxGm.js +0 -1
  1030. package/client/dist/assets/narration-CjLwGKap.js +0 -1
  1031. package/client/dist/assets/narration-DANWuGsW.js +0 -1
  1032. package/client/dist/assets/narration-DGeEDWiT.js +0 -1
  1033. package/client/dist/assets/narration-DJgpGwIP.js +0 -1
  1034. package/client/dist/assets/narration-DbHnz0qV.js +0 -1
  1035. package/client/dist/assets/narration-bZSsTZG8.js +0 -1
  1036. package/client/dist/assets/narration-i6aKJKEc.js +0 -1
  1037. package/client/dist/assets/nav--u7iPYlS.js +0 -1
  1038. package/client/dist/assets/nav-C5Jgfaby.js +0 -1
  1039. package/client/dist/assets/nav-CAna_Wpt.js +0 -1
  1040. package/client/dist/assets/nav-CCLqeyHo.js +0 -1
  1041. package/client/dist/assets/nav-Cf3c90Jk.js +0 -1
  1042. package/client/dist/assets/nav-DMYQaQjR.js +0 -1
  1043. package/client/dist/assets/nav-Df_PkZ9F.js +0 -1
  1044. package/client/dist/assets/nav-VyNGBJwj.js +0 -1
  1045. package/client/dist/assets/packet-8nn9RsU7.js +0 -1
  1046. package/client/dist/assets/packet-B0H15elv.js +0 -1
  1047. package/client/dist/assets/packet-BQvBgrwh.js +0 -1
  1048. package/client/dist/assets/packet-BR7mO0-a.js +0 -1
  1049. package/client/dist/assets/packet-BgcQ6q_K.js +0 -1
  1050. package/client/dist/assets/packet-D2s92Jnn.js +0 -1
  1051. package/client/dist/assets/packet-YbtcD1HS.js +0 -1
  1052. package/client/dist/assets/packet-c0Qj_9eX.js +0 -1
  1053. package/client/dist/assets/project-repositories-Cnnuj9Ia.js +0 -1
  1054. package/client/dist/assets/rotate-ccw-DalJAQQX.js +0 -1
  1055. package/client/dist/assets/settings-B1NV8Ow9.js +0 -1
  1056. package/client/dist/assets/settings-BQ8XFZeE.js +0 -1
  1057. package/client/dist/assets/settings-BRkxfBbO.js +0 -1
  1058. package/client/dist/assets/settings-C_CcU1dP.js +0 -1
  1059. package/client/dist/assets/settings-Cto9n0eL.js +0 -1
  1060. package/client/dist/assets/settings-Pyw8uYtL.js +0 -1
  1061. package/client/dist/assets/settings-b3HVCNNd.js +0 -1
  1062. package/client/dist/assets/settings-hdive4u6.js +0 -1
  1063. package/client/dist/assets/setup-Be485n2u.js +0 -1
  1064. package/client/dist/assets/setup-CKGUxKr-.js +0 -1
  1065. package/client/dist/assets/setup-Ck1Uwd7_.js +0 -1
  1066. package/client/dist/assets/setup-Cm774a6v.js +0 -1
  1067. package/client/dist/assets/setup-DIqMQpxt.js +0 -1
  1068. package/client/dist/assets/setup-DfCsoNFL.js +0 -1
  1069. package/client/dist/assets/setup-DkeE8mP0.js +0 -1
  1070. package/client/dist/assets/setup-xVntVaz1.js +0 -1
  1071. package/client/dist/assets/specs-Bqvtz2kz.js +0 -1
  1072. package/client/dist/assets/specs-CKes-kz6.js +0 -1
  1073. package/client/dist/assets/specs-CfXxPDNB.js +0 -1
  1074. package/client/dist/assets/specs-CyF9HuTI.js +0 -1
  1075. package/client/dist/assets/specs-DMj035Mt.js +0 -1
  1076. package/client/dist/assets/specs-DfIdoU5L.js +0 -1
  1077. package/client/dist/assets/specs-j5pGLQeU.js +0 -1
  1078. package/client/dist/assets/specs-xW5pkkB7.js +0 -1
  1079. package/client/dist/assets/spending-CQnrWiR3.js +0 -1
  1080. package/client/dist/assets/square-D0JTbRSR.js +0 -1
  1081. package/client/dist/assets/tauri-shell-DE6LfGPw.js +0 -2
  1082. package/client/dist/assets/terminal-BAzpHtpY.js +0 -1
  1083. package/client/dist/assets/terminal-C7dHeR3x.js +0 -1
  1084. package/client/dist/assets/terminal-CMla5Qsz.js +0 -1
  1085. package/client/dist/assets/terminal-CdNXH-n9.js +0 -1
  1086. package/client/dist/assets/terminal-Cw5bZsmV.js +0 -1
  1087. package/client/dist/assets/terminal-DFUP4eNv.js +0 -1
  1088. package/client/dist/assets/terminal-DGqljeK_.js +0 -1
  1089. package/client/dist/assets/terminal-cU70NodO.js +0 -1
  1090. package/client/dist/assets/tickets--tiSOCcn.js +0 -1
  1091. package/client/dist/assets/tickets-BUJ3DMWU.js +0 -1
  1092. package/client/dist/assets/tickets-C1WNPODq.js +0 -1
  1093. package/client/dist/assets/tickets-CDjhWmiE.js +0 -1
  1094. package/client/dist/assets/tickets-CLgPC3uO.js +0 -1
  1095. package/client/dist/assets/tickets-D41ZMQpf.js +0 -1
  1096. package/client/dist/assets/tickets-DEaQC06P.js +0 -1
  1097. package/client/dist/assets/tickets-kcMzbLCp.js +0 -1
  1098. package/client/dist/assets/trash-D8zYUmTg.js +0 -1
  1099. package/client/dist/assets/useDesktop-BjLT0_EE.js +0 -1
  1100. package/client/dist/assets/useRuntimeRuns-C97qEqMg.js +0 -1
  1101. package/client/dist/assets/useSharedWebSocket-Bj4LMp7b.js +0 -2
  1102. package/client/dist/assets/utils-BC4DHlz2.js +0 -1
  1103. package/docs/guide/en/getting-started/4-the-dashboard-tour.md +0 -48
  1104. package/docs/guide/es/getting-started/4-the-dashboard-tour.md +0 -48
  1105. package/server/dist/mobile/mobile-preview-channel.js +0 -179
  1106. package/server/dist/mobile/mobile-preview.js +0 -366
  1107. package/server/dist/modules/browser/domain/preview-origins.js +0 -117
  1108. package/server/dist/modules/browser/runtime/preview-targets.js +0 -80
  1109. /package/client/dist/assets/{atom-one-dark-B-oHczHB.css → DocView-B-oHczHB.css} +0 -0
  1110. /package/docs/guide/de/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1111. /package/docs/guide/en/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1112. /package/docs/guide/es/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1113. /package/docs/guide/fr/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1114. /package/docs/guide/it/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1115. /package/docs/guide/ja/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1116. /package/docs/guide/pt/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
  1117. /package/docs/guide/zh/getting-started/{3-adding-your-first-project.md → 4-adding-your-first-project.md} +0 -0
@@ -30,7 +30,7 @@ function supportTools() {
30
30
  name: 'specrails_support',
31
31
  title: 'Support & troubleshooting',
32
32
  description: 'Support and troubleshooting for Specrails installation and usage problems. Use this when the user needs help setting up Specrails, adding/provisioning a project, fixing missing agents/skills/commands from the global specrails-core framework, provider CLI/MCP/agent-chat issues, rails/jobs/specs, or GitHub/PR/cost/plugin questions. ' +
33
- 'Actions: triage (read-only support playbook + diagnostics), core_update_status/check/apply (global specrails-core framework update). ' +
33
+ 'Actions: triage (read-only support playbook + diagnostics), core_update_status/check/apply (global specrails-core framework update; follows the app update channel latest|stable), api_meta (API/app/Core/contract versions and update channel). ' +
34
34
  'This tool never creates specs; repair actions require the normal permission tier and explicit user confirmation.',
35
35
  tier: (a) => (String(a.action) === 'core_update_apply' ? 'ai-spawn' : 'read'),
36
36
  hintTier: 'read',
@@ -41,6 +41,7 @@ function supportTools() {
41
41
  'core_update_status',
42
42
  'core_update_check',
43
43
  'core_update_apply',
44
+ 'api_meta',
44
45
  ])
45
46
  .describe('Support operation to perform'),
46
47
  question: zod_1.z
@@ -69,6 +70,8 @@ function supportTools() {
69
70
  switch (action) {
70
71
  case 'core_update_status':
71
72
  return (0, types_1.apiCall)(ctx, 'GET', '/core-update/status');
73
+ case 'api_meta':
74
+ return (0, types_1.apiCall)(ctx, 'GET', '/meta');
72
75
  case 'core_update_check':
73
76
  return (0, types_1.apiCall)(ctx, 'POST', '/core-update/check', {});
74
77
  case 'core_update_apply': {
@@ -239,7 +242,7 @@ function nextSteps(topic) {
239
242
  'For specrails-core installation questions, evaluate only global core status and prerequisites. Do not treat project setup checkpoints as evidence of a core problem.',
240
243
  'If global core status is current/healthy and the user has not provided an actual job error, say the core installation looks healthy and ask for the concrete failing job/error before recommending repair.',
241
244
  'If a job explicitly reports missing agents, missing skills, unresolved slash commands, or missing /specrails:* commands, explain that those definitions come from the app-global specrails-core framework.',
242
- 'If an update is available, offer core_update_check followed by core_update_apply with confirmation. If no update is available but the job still fails with missing core definitions, give the manual fallback: run `npx specrails-core@latest update` from the project root, then retry, or collect the job diagnostic for a framework-loading bug.',
245
+ 'If an update is available, offer core_update_check followed by core_update_apply with confirmation. If no update is available but the job still fails with missing core definitions, do not suggest a CLI command (Core 6 has no standalone `update`): collect the job diagnostic (specrails_jobs diagnostic) and report it as a framework-loading bug. A human can re-check and apply Core updates from Settings → Updates in the app.',
243
246
  'Never recommend specrails_setup(install) or a project reinstall solely because setup/checkpoints show pending or 0 agents/commands.',
244
247
  ];
245
248
  case 'rails_jobs':
@@ -315,7 +318,7 @@ function repairActions(topic) {
315
318
  if (topic === 'framework_install') {
316
319
  return [
317
320
  'specrails_support(core_update_check) then specrails_support(core_update_apply) - apply requires operate/ai-spawn and only makes sense when a newer global specrails-core framework is available.',
318
- 'Manual fallback when no update is available but a real job still cannot load core definitions: run `npx specrails-core@latest update` from the project root, then retry or collect a job diagnostic.',
321
+ 'When no update is available but a real job still cannot load core definitions: collect a job diagnostic (specrails_jobs diagnostic) and report a framework-loading bug. Humans use Settings → Updates in the app; Core 6 has no standalone `update` command.',
319
322
  ];
320
323
  }
321
324
  if (topic !== 'project_setup' && topic !== 'installation')
@@ -10,6 +10,7 @@ exports.requireProject = requireProject;
10
10
  exports.setActiveProject = setActiveProject;
11
11
  exports.getActiveProject = getActiveProject;
12
12
  exports.toolTierAllowed = toolTierAllowed;
13
+ exports.recordMissionMcpAction = recordMissionMcpAction;
13
14
  exports.registerTieredTool = registerTieredTool;
14
15
  const mcp_tiers_1 = require("../mcp-tiers");
15
16
  const internal_api_1 = require("../../internal-api");
@@ -197,6 +198,40 @@ function emitMcpActivity(ctx, spec, args, tier) {
197
198
  /* a notification failure must never fail the tool */
198
199
  }
199
200
  }
201
+ /**
202
+ * Agent actions audit for first-party mission agents: one `mcp` row per
203
+ * admitted tool call, in the capability's project, run id = the mission
204
+ * conversation. Only the tool and its action are stored — never arguments.
205
+ * Observing only: a missing project or a failing sink never affects the call.
206
+ */
207
+ function recordMissionMcpAction(ctx, toolName, args) {
208
+ try {
209
+ const projectId = ctx.requestProjectId;
210
+ const conversationId = ctx.originConversationId;
211
+ if (!projectId || !conversationId)
212
+ return;
213
+ const recorder = ctx.registry.getContext(projectId)?.agentAudit?.recorder;
214
+ if (!recorder)
215
+ return;
216
+ const action = typeof args.action === 'string' && /^[a-z0-9_.-]{1,64}$/i.test(args.action) ? args.action : null;
217
+ recorder.record({
218
+ runId: conversationId,
219
+ role: 'mission',
220
+ kind: 'mcp',
221
+ target: action ? `${toolName}:${action}` : toolName,
222
+ source: 'mcp-wrapper',
223
+ });
224
+ }
225
+ catch { /* audit is observing only */ }
226
+ }
227
+ function admittedByException(spec, ctx, args) {
228
+ try {
229
+ return spec.tierException?.(ctx, args) === true;
230
+ }
231
+ catch {
232
+ return false;
233
+ }
234
+ }
200
235
  /**
201
236
  * Registers a tool on the McpServer, wrapping the handler with (1) tier
202
237
  * enforcement and (2) uniform success/error result shaping. No tool can forget
@@ -236,9 +271,11 @@ function registerTieredTool(server, ctx, spec) {
236
271
  : { ...ctx };
237
272
  callCtx.signal = extra?.signal;
238
273
  const tier = typeof spec.tier === 'function' ? spec.tier(args ?? {}) : spec.tier;
239
- if (!toolTierAllowed(callCtx, tier)) {
274
+ if (!toolTierAllowed(callCtx, tier) && !(callCtx.firstPartyAgent && admittedByException(spec, callCtx, args ?? {}))) {
240
275
  return errorResult((0, mcp_tiers_1.tierRefusalMessage)(tier));
241
276
  }
277
+ if (capability)
278
+ recordMissionMcpAction(callCtx, spec.name, args ?? {});
242
279
  const operation = async () => {
243
280
  try {
244
281
  const data = await spec.handler(callCtx, args ?? {});
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createMobileAdminRouter = createMobileAdminRouter;
4
4
  const express_1 = require("express");
5
5
  const mobile_devices_1 = require("./mobile-devices");
6
- const desktop_db_1 = require("../desktop-db");
7
6
  const DEVICE_ID_RE = /^[A-Za-z0-9-]{1,64}$/;
8
7
  function createMobileAdminRouter(deps) {
9
8
  const router = (0, express_1.Router)();
@@ -38,25 +37,10 @@ function createMobileAdminRouter(deps) {
38
37
  const changed = (0, mobile_devices_1.revokeDevice)(desktopDb, id);
39
38
  if (changed) {
40
39
  gateway.bridge?.closeForDevice(id);
41
- void gateway.closePreviewsForDevice(id).catch(() => { });
42
40
  deps.broadcast({ type: 'mobile.device_revoked', deviceId: id, timestamp: new Date().toISOString() });
43
41
  }
44
42
  res.json({ ok: changed });
45
43
  });
46
- // —— Companion app previews (Desktop indicator) ——
47
- router.get('/previews', (_req, res) => {
48
- const previews = gateway.preview?.listDeviceSessions() ?? [];
49
- res.json({ previews: previews.map((p) => ({ ...p, projectName: (0, desktop_db_1.getProject)(desktopDb, p.projectId)?.name ?? p.projectId })) });
50
- });
51
- router.delete('/previews/:projectId/:sessionId', async (req, res) => {
52
- const projectId = typeof req.params.projectId === 'string' ? req.params.projectId : '';
53
- const sessionId = typeof req.params.sessionId === 'string' ? req.params.sessionId : '';
54
- if (!/^[A-Za-z0-9_-]{1,160}$/.test(projectId) || !/^[A-Za-z0-9_-]{1,160}$/.test(sessionId)) {
55
- res.status(400).json({ error: 'Invalid parameter' });
56
- return;
57
- }
58
- res.json({ ok: (await gateway.preview?.endFromDesktop(projectId, sessionId)) ?? false });
59
- });
60
44
  router.post('/cert/rotate', async (_req, res) => {
61
45
  const status = await gateway.rotateCert();
62
46
  res.json(status);
@@ -17,7 +17,6 @@ const mobile_webrtc_peer_1 = require("./mobile-webrtc-peer");
17
17
  const mobile_signal_reconnect_1 = require("./mobile-signal-reconnect");
18
18
  const mobile_webrtc_1 = require("./mobile-webrtc");
19
19
  const agent_store_1 = require("../modules/agents/runtime/agent-store");
20
- const mobile_preview_1 = require("./mobile-preview");
21
20
  // Lifecycle owner of the second HTTPS+WSS listener (default :4202), hard-isolated
22
21
  // from the main server. Off by default; started on enable or boot-if-enabled.
23
22
  const DEFAULT_PORT = 4202;
@@ -48,28 +47,12 @@ class MobileGateway {
48
47
  _running = false;
49
48
  _boundPort = DEFAULT_PORT;
50
49
  _portOverride;
51
- _preview;
52
50
  constructor(deps) {
53
51
  this._db = deps.desktopDb;
54
52
  this._desktopPort = deps.desktopPort;
55
53
  this._broadcast = deps.broadcast;
56
54
  this._bindHost = deps.bindHost ?? '0.0.0.0';
57
55
  this._portOverride = deps.port;
58
- this._preview = deps.preview
59
- ? new mobile_preview_1.MobilePreviewService({
60
- ...deps.preview,
61
- openChannel: (deviceId, label) => this._webrtc?.openChannel(deviceId, label) ?? null,
62
- onChange: () => this._broadcast({ type: 'mobile.previews_changed', timestamp: new Date().toISOString() }),
63
- })
64
- : null;
65
- }
66
- get preview() {
67
- return this._preview;
68
- }
69
- /** A revoked device loses its peer mapping and every preview it owns. */
70
- async closePreviewsForDevice(deviceId) {
71
- this._webrtc?.forgetDevice(deviceId);
72
- await this._preview?.closeForDevice(deviceId);
73
56
  }
74
57
  get bridge() {
75
58
  return this._bridge;
@@ -156,7 +139,6 @@ class MobileGateway {
156
139
  db: this._db,
157
140
  desktopPort: this._desktopPort,
158
141
  currentFingerprint: () => this._cert.fingerprint,
159
- ...(this._preview ? { preview: this._preview } : {}),
160
142
  }));
161
143
  const server = https_1.default.createServer({ cert: this._cert.certPem, key: this._cert.keyPem }, app);
162
144
  // BUG-MOBILE-02: scope each socket's subscribe to the device's granted
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.COMPANION_ACTION_TIERS = exports.COMPANION_ACTIONS = void 0;
4
+ exports.companionTargetsFor = companionTargetsFor;
5
+ exports.companionView = companionView;
6
+ exports.createMobileInboxRouter = createMobileInboxRouter;
7
+ const express_1 = require("express");
8
+ const mcp_tiers_1 = require("../mcp/mcp-tiers");
9
+ const mobile_devices_1 = require("./mobile-devices");
10
+ const mobile_redact_1 = require("./mobile-redact");
11
+ /**
12
+ * The paired companion as a decision remote for the "Needs you" inbox.
13
+ *
14
+ * Read: `GET /v1/inbox` is the desktop read-model, narrowed to the device's
15
+ * project grant, with the SAFE actions each row offers right now.
16
+ *
17
+ * Act: a closed set of four actions, each forwarded to the very route the
18
+ * desktop UI uses, addressed to ONE project and tier-checked with the MCP
19
+ * permission tiers (so turning a tier off in Settings ▸ MCP also turns the
20
+ * action off on the phone). Everything else (merge, discard, force-push,
21
+ * settings, delete) has no route here and the catch-all refuses it.
22
+ */
23
+ /** Actions a companion may run. Anything else is desktop-only. */
24
+ exports.COMPANION_ACTIONS = ['answer', 'resume', 'retry', 'create-pr'];
25
+ /**
26
+ * Tier per action. Answering only continues work the person already started
27
+ * (write); resume and retry spend tokens (ai-spawn); a draft PR pushes a branch
28
+ * to the remote, an external-system mutation (destructive, as in the MCP tiers).
29
+ */
30
+ exports.COMPANION_ACTION_TIERS = {
31
+ answer: 'write',
32
+ resume: 'ai-spawn',
33
+ retry: 'ai-spawn',
34
+ 'create-pr': 'destructive',
35
+ };
36
+ const NOT_PRIMARY = new Set(['open-logs', 'edit-spec']);
37
+ /** The first remedy a phone can act on, mirroring the desktop's ranking (open-logs / edit-spec need the desk). */
38
+ function primaryRemedy(item) {
39
+ const remedies = item.diagnosis?.remedies ?? [];
40
+ return remedies.find((remedy) => !NOT_PRIMARY.has(remedy)) ?? null;
41
+ }
42
+ /** Which safe actions an item offers, and the identities the phone posts back. Pure. */
43
+ function companionTargetsFor(item) {
44
+ const none = { ids: [], target: {} };
45
+ if (item.action === 'raise-cap' || item.action === 'retry-jira')
46
+ return none;
47
+ if (item.kind === 'question')
48
+ return { ids: ['answer'], target: { runId: item.subjectId } };
49
+ if (item.action === 'resume-run')
50
+ return { ids: ['resume'], target: { runId: item.subjectId } };
51
+ if (item.kind === 'review') {
52
+ return item.decision === 'on_review'
53
+ ? { ids: ['create-pr'], target: { expectedDecision: 'on_review' } }
54
+ : none;
55
+ }
56
+ if (item.kind === 'failed' || item.kind === 'blocked') {
57
+ const primary = primaryRemedy(item);
58
+ const isRun = item.action === 'open-run';
59
+ if (primary === 'resume' && isRun)
60
+ return { ids: ['resume'], target: { runId: item.subjectId } };
61
+ if (primary === 'retry' && typeof item.railIndex === 'number') {
62
+ return { ids: ['retry'], target: { sourceId: isRun ? `run:${item.subjectId}` : item.subjectId, railIndex: item.railIndex } };
63
+ }
64
+ }
65
+ return none;
66
+ }
67
+ function companionView(db, item) {
68
+ const { ids, target } = companionTargetsFor(item);
69
+ return {
70
+ actions: ids.map((id) => ({ id, tier: exports.COMPANION_ACTION_TIERS[id], enabled: (0, mcp_tiers_1.isTierEnabled)(db, exports.COMPANION_ACTION_TIERS[id]) })),
71
+ ...target,
72
+ };
73
+ }
74
+ const PID = /^[A-Za-z0-9_-]{1,64}$/;
75
+ const RUN_ID = /^[A-Za-z0-9-]{1,128}$/;
76
+ const SOURCE_ID = /^(?:run:)?[A-Za-z0-9-]{1,128}$/;
77
+ const MAX_ANSWER = 20_000;
78
+ const MAX_RUN_CAP_USD = 10_000;
79
+ const record = (value) => value && typeof value === 'object' && !Array.isArray(value) ? value : {};
80
+ const pick = (value, keys) => Object.fromEntries(Object.entries(record(value)).filter(([key]) => keys.includes(key)));
81
+ function createMobileInboxRouter({ db, upstream }) {
82
+ const router = (0, express_1.Router)();
83
+ const seg = (value) => (typeof value === 'string' ? value : '');
84
+ const send = async (res, method, path, body, shape) => {
85
+ try {
86
+ const result = await upstream(method, path, body);
87
+ const ok = result.status >= 200 && result.status < 300;
88
+ res.status(result.status).json((0, mobile_redact_1.redact)(ok && shape ? shape(result.json) : result.json));
89
+ }
90
+ catch {
91
+ res.status(502).json({ error: 'Desktop is unreachable. Retry when connected.' });
92
+ }
93
+ };
94
+ /** 403 unless the action's permission tier is on. */
95
+ const tierGate = (res, action) => {
96
+ const tier = exports.COMPANION_ACTION_TIERS[action];
97
+ if ((0, mcp_tiers_1.isTierEnabled)(db, tier))
98
+ return true;
99
+ res.status(403).json({ error: 'tier_disabled', tier, action });
100
+ return false;
101
+ };
102
+ const base = (pid) => `/api/projects/${encodeURIComponent(pid)}`;
103
+ router.get('/inbox', async (req, res) => {
104
+ const allowed = (0, mobile_devices_1.getAllowedProjects)(db, req.mobileDevice.id);
105
+ try {
106
+ const result = await upstream('GET', '/api/inbox');
107
+ if (result.status !== 200) {
108
+ res.status(result.status).json((0, mobile_redact_1.redact)(result.json));
109
+ return;
110
+ }
111
+ const snapshot = record(result.json);
112
+ const visible = (projectId) => typeof projectId === 'string' && (allowed === null || allowed.has(projectId));
113
+ const items = (Array.isArray(snapshot.items) ? snapshot.items : [])
114
+ .filter((item) => visible(record(item).projectId))
115
+ .map((item) => ({ ...item, companion: companionView(db, item) }));
116
+ const projects = (Array.isArray(snapshot.projects) ? snapshot.projects : []).filter((p) => visible(record(p).projectId));
117
+ res.json((0, mobile_redact_1.redact)({ items, projects, generatedAt: snapshot.generatedAt }));
118
+ }
119
+ catch {
120
+ res.status(502).json({ error: 'Desktop is unreachable. Retry when connected.' });
121
+ }
122
+ });
123
+ // The question a paused run is waiting on (the Answer sheet shows it verbatim).
124
+ router.get('/projects/:pid/inbox/runs/:runId/question', async (req, res) => {
125
+ const pid = seg(req.params.pid), runId = seg(req.params.runId);
126
+ if (!PID.test(pid) || !RUN_ID.test(runId)) {
127
+ res.status(400).json({ error: 'Invalid parameter' });
128
+ return;
129
+ }
130
+ await send(res, 'GET', `${base(pid)}/agent-runtime/runs/${encodeURIComponent(runId)}`, undefined, (json) => {
131
+ const run = record((Array.isArray(record(json).runs) ? record(json).runs : [])[0]);
132
+ const question = record(run.pendingQuestion);
133
+ return typeof question.question === 'string'
134
+ ? { pending: true, question: question.question, requestedAt: question.requestedAt ?? null }
135
+ : { pending: false };
136
+ });
137
+ });
138
+ // Answer agent question: the desktop's run "Answer" (runtime resume with an answer).
139
+ router.post('/projects/:pid/inbox/answer', async (req, res) => {
140
+ const pid = seg(req.params.pid), body = record(req.body), runId = seg(body.runId), answer = body.answer;
141
+ if (!PID.test(pid) || !RUN_ID.test(runId)) {
142
+ res.status(400).json({ error: 'Invalid parameter' });
143
+ return;
144
+ }
145
+ if (typeof answer !== 'string' || !answer.trim() || answer.length > MAX_ANSWER) {
146
+ res.status(400).json({ error: `An answer of 1–${MAX_ANSWER} characters is required` });
147
+ return;
148
+ }
149
+ if (!tierGate(res, 'answer'))
150
+ return;
151
+ let run;
152
+ try {
153
+ const status = await upstream('GET', `${base(pid)}/agent-runtime/runs/${encodeURIComponent(runId)}`);
154
+ if (status.status !== 200) {
155
+ res.status(status.status).json((0, mobile_redact_1.redact)(status.json));
156
+ return;
157
+ }
158
+ run = record((Array.isArray(record(status.json).runs) ? record(status.json).runs : [])[0]);
159
+ }
160
+ catch {
161
+ res.status(502).json({ error: 'Desktop is unreachable. Retry when connected.' });
162
+ return;
163
+ }
164
+ const question = record(run.pendingQuestion);
165
+ if (typeof question.question !== 'string' || question.answeredAt !== undefined) {
166
+ res.status(409).json({ error: 'no_pending_question' });
167
+ return;
168
+ }
169
+ const definition = run.engineVersion === 2;
170
+ const path = definition
171
+ ? `${base(pid)}/loop-runs/${encodeURIComponent(runId)}/resume`
172
+ : `${base(pid)}/agent-runtime/runs/${encodeURIComponent(runId)}/resume`;
173
+ await send(res, 'POST', path, { answer: answer.trim(), ...(definition && typeof question.stepId === 'string' ? { interruptId: question.stepId } : {}) });
174
+ });
175
+ // Resume a budget/limit-paused or interrupted run; a run paused at its per-run cap takes the person's choice.
176
+ router.post('/projects/:pid/inbox/resume', async (req, res) => {
177
+ const pid = seg(req.params.pid), body = record(req.body), runId = seg(body.runId);
178
+ if (!PID.test(pid) || !RUN_ID.test(runId)) {
179
+ res.status(400).json({ error: 'Invalid parameter' });
180
+ return;
181
+ }
182
+ const narrowed = {};
183
+ if (body.runCap !== undefined) {
184
+ if (body.runCap !== 'ignore') {
185
+ res.status(400).json({ error: 'runCap must be "ignore"' });
186
+ return;
187
+ }
188
+ narrowed.runCap = 'ignore';
189
+ }
190
+ if (body.runCapUsd !== undefined) {
191
+ if (typeof body.runCapUsd !== 'number' || !Number.isFinite(body.runCapUsd) || body.runCapUsd <= 0 || body.runCapUsd > MAX_RUN_CAP_USD) {
192
+ res.status(400).json({ error: 'runCapUsd must be a positive amount' });
193
+ return;
194
+ }
195
+ if (narrowed.runCap) {
196
+ res.status(400).json({ error: 'Choose ignore or raise, not both' });
197
+ return;
198
+ }
199
+ narrowed.runCapUsd = body.runCapUsd;
200
+ }
201
+ if (!tierGate(res, 'resume'))
202
+ return;
203
+ await send(res, 'POST', `${base(pid)}/loop-runs/${encodeURIComponent(runId)}/resume`, narrowed);
204
+ });
205
+ // Retry the failed attempt: the cockpit's relaunch of the same rail, same source.
206
+ router.post('/projects/:pid/inbox/retry', async (req, res) => {
207
+ const pid = seg(req.params.pid), body = record(req.body), sourceId = seg(body.sourceId), railIndex = body.railIndex;
208
+ if (!PID.test(pid) || !SOURCE_ID.test(sourceId)) {
209
+ res.status(400).json({ error: 'Invalid parameter' });
210
+ return;
211
+ }
212
+ if (typeof railIndex !== 'number' || !Number.isSafeInteger(railIndex) || railIndex < 0 || railIndex > 1000) {
213
+ res.status(400).json({ error: 'Invalid rail' });
214
+ return;
215
+ }
216
+ if (!tierGate(res, 'retry'))
217
+ return;
218
+ await send(res, 'POST', `${base(pid)}/rails/${railIndex}/relaunch`, { sourceId });
219
+ });
220
+ // Create draft PR: the PR decision, narrowed to create-pr on a delivery that is still on review.
221
+ router.post('/projects/:pid/inbox/create-pr', async (req, res) => {
222
+ const pid = seg(req.params.pid), body = record(req.body), prDeliveryId = seg(body.prDeliveryId);
223
+ if (!PID.test(pid) || !RUN_ID.test(prDeliveryId)) {
224
+ res.status(400).json({ error: 'Invalid parameter' });
225
+ return;
226
+ }
227
+ if (body.expectedDecision !== 'on_review') {
228
+ res.status(400).json({ error: 'expectedDecision must be on_review' });
229
+ return;
230
+ }
231
+ if (!tierGate(res, 'create-pr'))
232
+ return;
233
+ await send(res, 'POST', `${base(pid)}/rails/pr-decision`, { prDeliveryId, action: 'create-pr', expectedDecision: 'on_review' }, (json) => pick(json, ['ok', 'decision', 'prUrl', 'prState', 'detail']));
234
+ });
235
+ // Deny by name, not by silence: merge, discard, publish, force-push, settings, delete.
236
+ router.all('/projects/:pid/inbox/:action', (_req, res) => {
237
+ res.status(403).json({ error: 'action_not_allowed_for_companion', detail: 'This decision stays on Desktop.' });
238
+ });
239
+ return router;
240
+ }
@@ -16,11 +16,9 @@ const record = (value) => value && typeof value === 'object' && !Array.isArray(v
16
16
  const pick = (value, keys) => Object.fromEntries(Object.entries(record(value)).filter(([key]) => keys.includes(key)));
17
17
  exports.MOBILE_PROTOCOL_VERSION = 2;
18
18
  exports.MISSION_ACCESS_REASON = 'Mission agents can access more than their pinned project. Missions require an all-projects device grant; your permitted Specs and Rails remain available.';
19
- function mobileCapabilities(db, deviceId, opts = {}) {
19
+ function mobileCapabilities(db, deviceId) {
20
20
  const missions = process.env.SPECRAILS_AGENT_CHAT !== 'false' && (0, mobile_devices_1.getAllowedProjects)(db, deviceId) === null;
21
- // App preview targets come from mission processes, so it inherits the
22
- // mission grant and additionally needs Desktop's browser capture.
23
- return { protocolVersion: exports.MOBILE_PROTOCOL_VERSION, features: { missions, missionControl: missions, missionQueue: missions, missionProcesses: missions, repositories: true, codeExplorer: (0, feature_flags_1.isCodeExplorerEnabled)(), missionRailCards: missions && (0, feature_flags_1.isMissionRailCardsEnabled)(), appPreview: missions && opts.appPreview === true },
21
+ return { protocolVersion: exports.MOBILE_PROTOCOL_VERSION, features: { missions, missionControl: missions, missionQueue: missions, missionProcesses: missions, repositories: true, codeExplorer: (0, feature_flags_1.isCodeExplorerEnabled)(), missionRailCards: missions && (0, feature_flags_1.isMissionRailCardsEnabled)() },
24
22
  ...(!missions ? { missionsUnavailableReason: process.env.SPECRAILS_AGENT_CHAT === 'false' ? 'Missions are disabled on Desktop.' : exports.MISSION_ACCESS_REASON } : {}) };
25
23
  }
26
24
  function conversationView(value) {
@@ -74,7 +72,7 @@ function missionSnapshot(value) {
74
72
  pendingMessages, pendingTruncated: pending.length > 50,
75
73
  live: { ...pick(live, ['isStreaming', 'startedAt']), streamingText, textTruncated: streamingText.length < liveRaw.length } };
76
74
  }
77
- function createMobileMissionsRouter({ db, upstream, appPreview }) {
75
+ function createMobileMissionsRouter({ db, upstream }) {
78
76
  const router = (0, express_1.Router)();
79
77
  const segment = (value) => typeof value === 'string' ? value : '';
80
78
  const send = async (res, method, path, body, shape) => {
@@ -86,7 +84,7 @@ function createMobileMissionsRouter({ db, upstream, appPreview }) {
86
84
  res.status(502).json({ error: 'Desktop is unreachable. Retry when connected.' });
87
85
  }
88
86
  };
89
- router.get('/capabilities', (req, res) => res.json(mobileCapabilities(db, req.mobileDevice.id, { appPreview: appPreview?.() ?? false })));
87
+ router.get('/capabilities', (req, res) => res.json(mobileCapabilities(db, req.mobileDevice.id)));
90
88
  router.get('/mission-models', (req, res) => {
91
89
  const provider = segment(req.query.provider);
92
90
  if (!/^[a-z0-9_-]{1,40}$/.test(provider)) {
@@ -129,7 +127,7 @@ function createMobileMissionsRouter({ db, upstream, appPreview }) {
129
127
  return null;
130
128
  }
131
129
  const conversation = (0, agent_store_1.getAgentConversation)(db, cid);
132
- if (!conversation || conversation.pinned_project_id !== pid) {
130
+ if (!conversation || conversation.deleted_at || conversation.pinned_project_id !== pid) {
133
131
  res.status(404).json({ error: 'Mission not found in this project' });
134
132
  return null;
135
133
  }
@@ -144,7 +142,7 @@ function createMobileMissionsRouter({ db, upstream, appPreview }) {
144
142
  }
145
143
  // Query the project before applying the limit: active projects must not
146
144
  // disappear behind another project's most recent conversations.
147
- const rows = db.prepare('SELECT id FROM agent_conversations WHERE pinned_project_id = ? ORDER BY updated_at DESC, id DESC LIMIT ?').all(pid, rawLimit + 1);
145
+ const rows = db.prepare('SELECT id FROM agent_conversations WHERE pinned_project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC, id DESC LIMIT ?').all(pid, rawLimit + 1);
148
146
  try {
149
147
  const active = await upstream('GET', '/api/agent/active-turns');
150
148
  if (active.status !== 200) {
@@ -9,7 +9,7 @@ const mobile_auth_1 = require("./mobile-auth");
9
9
  const mobile_devices_1 = require("./mobile-devices");
10
10
  const mobile_missions_1 = require("./mobile-missions");
11
11
  const mobile_code_1 = require("./mobile-code");
12
- const mobile_preview_1 = require("./mobile-preview");
12
+ const mobile_inbox_1 = require("./mobile-inbox");
13
13
  // The gateway's authenticated REST surface: the `/v1/*` allow-list. Each route
14
14
  // forwards, in-process, via a REAL loopback HTTP request to
15
15
  // http://127.0.0.1:<desktopPort> with the master token injected server-side as
@@ -456,10 +456,9 @@ function createMobileRouter(deps) {
456
456
  ...(body !== undefined ? { body: JSON.stringify(body) } : {}) });
457
457
  return { status: response.status, json: await response.json() };
458
458
  };
459
- v1.use((0, mobile_missions_1.createMobileMissionsRouter)({ db: deps.db, upstream: mobileUpstream, appPreview: () => deps.preview?.available() ?? false }));
460
- if (deps.preview)
461
- v1.use((0, mobile_preview_1.createMobilePreviewRouter)({ db: deps.db, preview: deps.preview }));
459
+ v1.use((0, mobile_missions_1.createMobileMissionsRouter)({ db: deps.db, upstream: mobileUpstream }));
462
460
  v1.use((0, mobile_code_1.createMobileCodeRouter)(mobileUpstream));
461
+ v1.use((0, mobile_inbox_1.createMobileInboxRouter)({ db: deps.db, upstream: mobileUpstream }));
463
462
  router.use('/v1', v1);
464
463
  // Any unmatched gateway path → 404 JSON (NEVER falls through to a SPA handler;
465
464
  // the gateway serves JSON/WS only, no static client).
@@ -471,15 +470,16 @@ function createMobileRouter(deps) {
471
470
  /** The allow-list, exported for the CI drift test (asserts each entry resolves
472
471
  * against a real internal route, and that no traversal param is accepted). */
473
472
  exports.MOBILE_ALLOWLIST = [
473
+ { method: 'GET', path: '/v1/inbox' },
474
+ { method: 'GET', path: '/v1/projects/:pid/inbox/runs/:runId/question' },
475
+ { method: 'POST', path: '/v1/projects/:pid/inbox/answer' },
476
+ { method: 'POST', path: '/v1/projects/:pid/inbox/resume' },
477
+ { method: 'POST', path: '/v1/projects/:pid/inbox/retry' },
478
+ { method: 'POST', path: '/v1/projects/:pid/inbox/create-pr' },
474
479
  { method: 'GET', path: '/v1/projects/:pid/repositories/:rid/code/tree' },
475
480
  { method: 'GET', path: '/v1/projects/:pid/repositories/:rid/code/find' },
476
481
  { method: 'GET', path: '/v1/projects/:pid/repositories/:rid/code/file' },
477
482
  { method: 'GET', path: '/v1/capabilities' },
478
- { method: 'GET', path: '/v1/projects/:pid/missions/:cid/preview-targets' },
479
- { method: 'POST', path: '/v1/projects/:pid/preview-sessions' },
480
- { method: 'POST', path: '/v1/projects/:pid/preview-sessions/:sid/attach' },
481
- { method: 'POST', path: '/v1/projects/:pid/preview-sessions/:sid/navigate' },
482
- { method: 'DELETE', path: '/v1/projects/:pid/preview-sessions/:sid' },
483
483
  { method: 'GET', path: '/v1/mission-models' },
484
484
  { method: 'PATCH', path: '/v1/projects/:pid/missions/:cid/messages/:mid/intent' },
485
485
  { method: 'GET', path: '/v1/projects/:pid/repositories' },
@@ -14,9 +14,6 @@ class MobileWebrtcGateway {
14
14
  // answer to whatever happened to be pending. Per-room keying isolates them.
15
15
  _pending = new Map();
16
16
  _active = new Set();
17
- /** The live peer of each authenticated device (latest wins), so Desktop can
18
- * open extra DataChannels (app preview) on the connection it already has. */
19
- _byDevice = new Map();
20
17
  constructor(_deps) {
21
18
  this._deps = _deps;
22
19
  }
@@ -51,23 +48,17 @@ class MobileWebrtcGateway {
51
48
  // require a valid existing device token instead, and never mint.
52
49
  new mobile_datachannel_1.DataChannelPeer(toChannelLike(dc), {
53
50
  registerDevice: async (input) => {
54
- let result;
55
51
  if (isReconnect) {
56
- result = await this._deps.registerDevice({
52
+ return this._deps.registerDevice({
57
53
  deviceName: input.deviceName,
58
54
  platform: input.platform,
59
55
  token: input.token,
60
56
  requireExistingToken: true,
61
57
  });
62
58
  }
63
- else {
64
- result = input.secret && (0, auth_1.safeEqual)(input.secret, secret)
65
- ? await this._deps.registerDevice({ deviceName: input.deviceName, platform: input.platform, token: input.token })
66
- : { ok: false };
67
- }
68
- if (result.ok)
69
- this._byDevice.set(result.deviceId, pc);
70
- return result;
59
+ return input.secret && (0, auth_1.safeEqual)(input.secret, secret)
60
+ ? this._deps.registerDevice({ deviceName: input.deviceName, platform: input.platform, token: input.token })
61
+ : { ok: false };
71
62
  },
72
63
  rpcDispatch: this._deps.rpcDispatch,
73
64
  bridge: this._deps.bridge,
@@ -76,9 +67,6 @@ class MobileWebrtcGateway {
76
67
  console.log('[webrtc] pc connectionState:', s);
77
68
  if (s === 'failed' || s === 'closed' || s === 'disconnected') {
78
69
  this._active.delete(pc);
79
- for (const [deviceId, owned] of this._byDevice)
80
- if (owned === pc)
81
- this._byDevice.delete(deviceId);
82
70
  // Drop this pc from whichever room slot still holds it.
83
71
  if (this._pending.get(key)?.pc === pc)
84
72
  this._pending.delete(key);
@@ -113,24 +101,6 @@ class MobileWebrtcGateway {
113
101
  return { ok: false };
114
102
  }
115
103
  }
116
- /** Open an ordered, reliable DataChannel on the device's live peer (no SDP
117
- * renegotiation: the SCTP association already exists). Null when the
118
- * device has no connected WebRTC peer. */
119
- openChannel(deviceId, label) {
120
- const pc = this._byDevice.get(deviceId);
121
- if (!pc || pc.connectionState !== 'connected')
122
- return null;
123
- try {
124
- return toPreviewChannel(pc.createDataChannel(label, { ordered: true }));
125
- }
126
- catch {
127
- return null;
128
- }
129
- }
130
- /** Forget a device's peer (revoked). Its channels close with the peer. */
131
- forgetDevice(deviceId) {
132
- this._byDevice.delete(deviceId);
133
- }
134
104
  /** Tear down every peer (gateway stopping / disabled). */
135
105
  stop() {
136
106
  for (const key of [...this._pending.keys()])
@@ -138,7 +108,6 @@ class MobileWebrtcGateway {
138
108
  for (const pc of this._active)
139
109
  this._close(pc);
140
110
  this._active.clear();
141
- this._byDevice.clear();
142
111
  }
143
112
  _close(pc) {
144
113
  try {
@@ -168,25 +137,6 @@ function toChannelLike(dc) {
168
137
  },
169
138
  };
170
139
  }
171
- function toPreviewChannel(dc) {
172
- return {
173
- get label() { return dc.label; },
174
- get readyState() { return dc.readyState; },
175
- get bufferedAmount() { return dc.bufferedAmount; },
176
- send: (data) => dc.send(data),
177
- close: () => dc.close(),
178
- onOpen: (cb) => {
179
- if (dc.readyState === 'open')
180
- queueMicrotask(cb);
181
- else
182
- dc.stateChanged.subscribe((s) => { if (s === 'open')
183
- cb(); });
184
- },
185
- onMessage: (cb) => { dc.onMessage.subscribe((d) => cb(d)); },
186
- onClose: (cb) => { dc.stateChanged.subscribe((s) => { if (s === 'closed')
187
- cb(); }); },
188
- };
189
- }
190
140
  /** Vanilla ICE: resolve once gathering completes so the offer SDP carries all
191
141
  * candidates (there's no trickle channel — the SDP travels by QR). */
192
142
  function waitIceComplete(pc) {