specrails-desktop 2.30.2 → 2.31.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 (462) hide show
  1. package/README.md +28 -24
  2. package/client/dist/assets/{ActivityFeedPage-9DZOvIcY.js → ActivityFeedPage-CAhFRUO4.js} +1 -1
  3. package/client/dist/assets/{AgentBrowserCapture-DqyHbzk7.js → AgentBrowserCapture-Ct4G5lsE.js} +1 -1
  4. package/client/dist/assets/AgentModeCodePane-DQt9WIvu.js +2 -0
  5. package/client/dist/assets/{AgentModeJobsPane-CTIHMUKN.js → AgentModeJobsPane-podaJVl9.js} +1 -1
  6. package/client/dist/assets/AgentsPage-DTZdbW80.js +87 -0
  7. package/client/dist/assets/AnalyticsPage-BskgGPm0.js +1 -0
  8. package/client/dist/assets/CodePage-CvtYo1DU.js +2 -0
  9. package/client/dist/assets/{DesktopAnalyticsPage-CkXUFj3F.js → DesktopAnalyticsPage-Dnf99E8e.js} +1 -1
  10. package/client/dist/assets/{DocsDialog-PhdCJNVj.js → DocsDialog-DHi36rZ4.js} +1 -1
  11. package/client/dist/assets/{DocsPage-BY-wDthx.js → DocsPage-DIdVrQz1.js} +1 -1
  12. package/client/dist/assets/{InteractiveJobComposer-C9I0A4KR.js → InteractiveJobComposer-BHeB2inv.js} +1 -1
  13. package/client/dist/assets/{JobDetailModal-I_RoQJV4.js → JobDetailModal-CF1SKUHH.js} +1 -1
  14. package/client/dist/assets/JobDetailPage-De3rY18h.js +1 -0
  15. package/client/dist/assets/{JobsPage-DcllM4Ip.js → JobsPage-CfAqqJTx.js} +1 -1
  16. package/client/dist/assets/{LoopBuilderPage-DGm_iuff.js → LoopBuilderPage-DSBMuTb3.js} +2 -2
  17. package/client/dist/assets/{LoopPreviewModal-BC-TeFdD.js → LoopPreviewModal-B-c37kA0.js} +1 -1
  18. package/client/dist/assets/LoopsPage-DjnNXdmm.js +1 -0
  19. package/client/dist/assets/{MinimizedChatsContext-Cs34FPTz.js → MinimizedChatsContext-DIsnQMVz.js} +1 -1
  20. package/client/dist/assets/PluginsPage-DA5pQ_6u.js +2 -0
  21. package/client/dist/assets/{ProjectSettingsDialog-nEs-ENrE.js → ProjectSettingsDialog-DA23PSi6.js} +1 -1
  22. package/client/dist/assets/{TemplatePreviewModal-D4qW-J9B.js → TemplatePreviewModal-Cp7IQ-g2.js} +1 -1
  23. package/client/dist/assets/TicketDetailModal-BPD2i_0R.js +14 -0
  24. package/client/dist/assets/{Trans-CPISVji8.js → Trans-cWtExGkC.js} +1 -1
  25. package/client/dist/assets/addspec-4WmLJmBG.js +1 -0
  26. package/client/dist/assets/addspec-BRlk8jON.js +1 -0
  27. package/client/dist/assets/addspec-C7XRejU4.js +1 -0
  28. package/client/dist/assets/addspec-CHW9xf_X.js +1 -0
  29. package/client/dist/assets/addspec-DTmRrWrF.js +1 -0
  30. package/client/dist/assets/addspec-DhmnXER8.js +1 -0
  31. package/client/dist/assets/addspec-Di41DpYV.js +1 -0
  32. package/client/dist/assets/addspec-x3mizDxc.js +1 -0
  33. package/client/dist/assets/agent-BKsuIgIT.js +1 -0
  34. package/client/dist/assets/agent-Bs9NilfI.js +1 -0
  35. package/client/dist/assets/agent-C23h684q.js +1 -0
  36. package/client/dist/assets/agent-CqEjy3Z2.js +1 -0
  37. package/client/dist/assets/agent-D5DZTks1.js +1 -0
  38. package/client/dist/assets/agent-DE8hUYPl.js +1 -0
  39. package/client/dist/assets/agent-DsTuJGSc.js +1 -0
  40. package/client/dist/assets/agent-DwZM05-x.js +1 -0
  41. package/client/dist/assets/agents-45GbINfh.js +1 -0
  42. package/client/dist/assets/agents-BHp0_FQt.js +1 -0
  43. package/client/dist/assets/agents-Bvyi3y6R.js +1 -0
  44. package/client/dist/assets/agents-DMKFStHL.js +1 -0
  45. package/client/dist/assets/agents-DaYcxAr1.js +1 -0
  46. package/client/dist/assets/agents-IUOgqT5t.js +1 -0
  47. package/client/dist/assets/agents-ms7TwG16.js +1 -0
  48. package/client/dist/assets/agents-rzPnqoBR.js +1 -0
  49. package/client/dist/assets/agentstudio-8TQqBenW.js +1 -0
  50. package/client/dist/assets/agentstudio-B8Z_mmEX.js +1 -0
  51. package/client/dist/assets/agentstudio-BZR9YmLs.js +1 -0
  52. package/client/dist/assets/agentstudio-Bge9pAWb.js +1 -0
  53. package/client/dist/assets/agentstudio-Bz169Vzt.js +1 -0
  54. package/client/dist/assets/agentstudio-D6L2jpNi.js +1 -0
  55. package/client/dist/assets/agentstudio-K2-Z7CL0.js +1 -0
  56. package/client/dist/assets/agentstudio-Zmgzthv8.js +1 -0
  57. package/client/dist/assets/analytics-B8Qtptbl.js +1 -0
  58. package/client/dist/assets/analytics-BHqUazhP.js +1 -0
  59. package/client/dist/assets/analytics-BPptRY4f.js +1 -0
  60. package/client/dist/assets/analytics-BxDGOIwf.js +1 -0
  61. package/client/dist/assets/analytics-C9RaQcE3.js +1 -0
  62. package/client/dist/assets/analytics-CJIwqrEl.js +1 -0
  63. package/client/dist/assets/analytics-D_OZdQ9O.js +1 -0
  64. package/client/dist/assets/analytics-We6lUMI8.js +1 -0
  65. package/client/dist/assets/builder-3bygQtZi.js +1 -0
  66. package/client/dist/assets/builder-BiUG9Z5K.js +1 -0
  67. package/client/dist/assets/builder-CGRz_-zP.js +1 -0
  68. package/client/dist/assets/builder-CWYPw7Cw.js +1 -0
  69. package/client/dist/assets/builder-CX1437hF.js +1 -0
  70. package/client/dist/assets/{builder-CwA4T7gP.js → builder-Cowk9jtL.js} +1 -1
  71. package/client/dist/assets/builder-DwDexYRE.js +1 -0
  72. package/client/dist/assets/builder-skfnZ1uC.js +1 -0
  73. package/client/dist/assets/code-B0O8-p8k.js +1 -0
  74. package/client/dist/assets/code-B1VLZDhS.js +1 -0
  75. package/client/dist/assets/code-B86IMAfz.js +1 -0
  76. package/client/dist/assets/code-Bpj4Ddml.js +1 -0
  77. package/client/dist/assets/code-BykBZ5-e.js +1 -0
  78. package/client/dist/assets/code-CHPkOkDS.js +1 -0
  79. package/client/dist/assets/code-CkUuW4m9.js +1 -0
  80. package/client/dist/assets/code-cAqaqMTx.js +1 -0
  81. package/client/dist/assets/{dashboard-Dy2Um-US.js → dashboard-BVq6kRJe.js} +1 -1
  82. package/client/dist/assets/{dashboard-CHCEkds4.js → dashboard-BaKPPmLH.js} +1 -1
  83. package/client/dist/assets/{dashboard-CrlTV1ms.js → dashboard-Bm8e4zYG.js} +1 -1
  84. package/client/dist/assets/{dashboard-WhzOQw1S.js → dashboard-Bt6IesnM.js} +1 -1
  85. package/client/dist/assets/{dashboard-Cslu_GCH.js → dashboard-C_NQZle_.js} +1 -1
  86. package/client/dist/assets/{dashboard-DweT3Y4R.js → dashboard-CyZKoGoI.js} +1 -1
  87. package/client/dist/assets/{dashboard-DUU8-_Rg.js → dashboard-HIUdUBQ0.js} +1 -1
  88. package/client/dist/assets/{dashboard-Cqmmbh3l.js → dashboard-pm4Mr229.js} +1 -1
  89. package/client/dist/assets/{dist-js-jwoXo0YD.js → dist-js-BaP-xLOy.js} +1 -1
  90. package/client/dist/assets/{dist-js-Dj72W6qo.js → dist-js-CLlgOa5a.js} +1 -1
  91. package/client/dist/assets/format-command-C0D9IPmV.js +1 -0
  92. package/client/dist/assets/{formatDistanceToNow-ByKli7Q_.js → formatDistanceToNow-DUyzS4rr.js} +1 -1
  93. package/client/dist/assets/{getTimezoneOffsetInMilliseconds-qrcBaLW1.js → getTimezoneOffsetInMilliseconds-BCIwmmTj.js} +1 -1
  94. package/client/dist/assets/{i18n-Bf9Ckd10.js → i18n-D21Pr8Sj.js} +2 -2
  95. package/client/dist/assets/index-BdSDUFnA.css +2 -0
  96. package/client/dist/assets/index-Ci4-JKDr.js +77 -0
  97. package/client/dist/assets/{jobs-CVFD8rar.js → jobs-BAls3bWq.js} +1 -1
  98. package/client/dist/assets/{jobs-DoSaFzAa.js → jobs-B_TeSQxb.js} +1 -1
  99. package/client/dist/assets/jobs-Bgq-PZkC.js +1 -0
  100. package/client/dist/assets/jobs-Bpks6doU.js +1 -0
  101. package/client/dist/assets/jobs-CN_zv4Gr.js +1 -0
  102. package/client/dist/assets/jobs-DUlWSYq2.js +1 -0
  103. package/client/dist/assets/{jobs-B-sDHEay.js → jobs-DhxKgWFq.js} +1 -1
  104. package/client/dist/assets/{jobs-lk1_Dq1U.js → jobs-SwYS2M-B.js} +1 -1
  105. package/client/dist/assets/nav-BHDiSIVu.js +1 -0
  106. package/client/dist/assets/nav-CMiYAq4i.js +1 -0
  107. package/client/dist/assets/nav-CqS7NrDW.js +1 -0
  108. package/client/dist/assets/nav-D-0M7xfv.js +1 -0
  109. package/client/dist/assets/nav-D65O6u9I.js +1 -0
  110. package/client/dist/assets/nav-D_LKYvBr.js +1 -0
  111. package/client/dist/assets/nav-FDTJmU79.js +1 -0
  112. package/client/dist/assets/nav-VaB-C4k5.js +1 -0
  113. package/client/dist/assets/provider-capabilities-BvoExILy.js +1 -0
  114. package/client/dist/assets/settings-BveOJoaI.js +1 -0
  115. package/client/dist/assets/settings-Cj1C6F5k.js +1 -0
  116. package/client/dist/assets/settings-CuVwOpe0.js +1 -0
  117. package/client/dist/assets/settings-D5X4DfRc.js +1 -0
  118. package/client/dist/assets/settings-DXwxe-BW.js +1 -0
  119. package/client/dist/assets/settings-Di81Ba_V.js +1 -0
  120. package/client/dist/assets/settings-jbLjCYC_.js +1 -0
  121. package/client/dist/assets/settings-wIZNPFnn.js +1 -0
  122. package/client/dist/assets/setup-BBiHEO7h.js +1 -0
  123. package/client/dist/assets/setup-BlTWhNIQ.js +1 -0
  124. package/client/dist/assets/setup-Bp2L_oiP.js +1 -0
  125. package/client/dist/assets/setup-CInYXp1-.js +1 -0
  126. package/client/dist/assets/{setup-CITtPjed.js → setup-CYH3bP6K.js} +1 -1
  127. package/client/dist/assets/setup-DwcQ921P.js +1 -0
  128. package/client/dist/assets/setup-PBLjuDSs.js +1 -0
  129. package/client/dist/assets/setup-bx6FtoBp.js +1 -0
  130. package/client/dist/assets/{spending-DMnCXy84.js → spending-BCyUxoOI.js} +1 -1
  131. package/client/dist/assets/{tickets-B8BuAaj5.js → tickets-BL9r1G0e.js} +1 -1
  132. package/client/dist/assets/{tickets-DpmdE8tv.js → tickets-B_NyHJ8f.js} +1 -1
  133. package/client/dist/assets/{tickets-B_yh4qQk.js → tickets-BarF1wuG.js} +1 -1
  134. package/client/dist/assets/{tickets-pAUJkDTu.js → tickets-CclVhpQA.js} +1 -1
  135. package/client/dist/assets/{tickets-D_yDquEw.js → tickets-CqqOHbli.js} +1 -1
  136. package/client/dist/assets/{tickets-CFk2n2Or.js → tickets-DCkFSiqt.js} +1 -1
  137. package/client/dist/assets/{tickets-DQp7JS2R.js → tickets-Djn3ccfT.js} +1 -1
  138. package/client/dist/assets/{tickets-Bs37scwY.js → tickets-MiHBPsy_.js} +1 -1
  139. package/client/dist/assets/{useBrowserCaptureSession-CkBJShUw.js → useBrowserCaptureSession-CkVCDzer.js} +1 -1
  140. package/client/dist/assets/{useDesktop-B4pSBIDd.js → useDesktop-DCP_MHp9.js} +1 -1
  141. package/client/dist/index.html +25 -24
  142. package/docs/README.md +7 -3
  143. package/docs/cli.md +3 -3
  144. package/docs/codex.md +51 -64
  145. package/docs/creating-specs.md +36 -4
  146. package/docs/customizing.md +5 -5
  147. package/docs/gemini.md +35 -47
  148. package/docs/getting-started.md +15 -9
  149. package/docs/guide/de/agents/2-profiles-and-the-balanced-default.md +5 -1
  150. package/docs/guide/de/agents/4-custom-agents-catalog.md +7 -4
  151. package/docs/guide/de/getting-started/1-what-is-specrails.md +1 -0
  152. package/docs/guide/de/getting-started/2-installing-and-first-run.md +1 -0
  153. package/docs/guide/de/getting-started/4-the-dashboard-tour.md +4 -4
  154. package/docs/guide/de/integrations/1-ai-providers.md +29 -18
  155. package/docs/guide/de/integrations/2-plugins.md +3 -3
  156. package/docs/guide/de/integrations/6-agent-chat.md +8 -1
  157. package/docs/guide/de/pipeline/1-rails-and-jobs.md +9 -6
  158. package/docs/guide/de/pipeline/2-the-job-detail-view.md +3 -1
  159. package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  160. package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +13 -13
  161. package/docs/guide/de/pipeline/5-the-loop-builder.md +6 -2
  162. package/docs/guide/de/specs/2-add-spec-quick-mode.md +6 -1
  163. package/docs/guide/en/agents/2-profiles-and-the-balanced-default.md +7 -1
  164. package/docs/guide/en/agents/4-custom-agents-catalog.md +17 -4
  165. package/docs/guide/en/getting-started/1-what-is-specrails.md +2 -1
  166. package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -1
  167. package/docs/guide/en/getting-started/4-the-dashboard-tour.md +5 -5
  168. package/docs/guide/en/insights/3-code-explorer.md +5 -0
  169. package/docs/guide/en/integrations/1-ai-providers.md +63 -22
  170. package/docs/guide/en/integrations/2-plugins.md +3 -3
  171. package/docs/guide/en/integrations/6-agent-chat.md +14 -2
  172. package/docs/guide/en/pipeline/1-rails-and-jobs.md +19 -7
  173. package/docs/guide/en/pipeline/2-the-job-detail-view.md +3 -1
  174. package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  175. package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +25 -11
  176. package/docs/guide/en/pipeline/5-the-loop-builder.md +7 -2
  177. package/docs/guide/en/specs/2-add-spec-quick-mode.md +10 -1
  178. package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +5 -1
  179. package/docs/guide/es/agents/4-custom-agents-catalog.md +7 -4
  180. package/docs/guide/es/getting-started/1-what-is-specrails.md +1 -0
  181. package/docs/guide/es/getting-started/2-installing-and-first-run.md +1 -0
  182. package/docs/guide/es/getting-started/4-the-dashboard-tour.md +4 -4
  183. package/docs/guide/es/integrations/1-ai-providers.md +30 -18
  184. package/docs/guide/es/integrations/2-plugins.md +3 -3
  185. package/docs/guide/es/integrations/6-agent-chat.md +8 -1
  186. package/docs/guide/es/pipeline/1-rails-and-jobs.md +9 -6
  187. package/docs/guide/es/pipeline/2-the-job-detail-view.md +3 -1
  188. package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  189. package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +15 -13
  190. package/docs/guide/es/pipeline/5-the-loop-builder.md +6 -2
  191. package/docs/guide/es/specs/2-add-spec-quick-mode.md +6 -1
  192. package/docs/guide/fr/agents/2-profiles-and-the-balanced-default.md +5 -1
  193. package/docs/guide/fr/agents/4-custom-agents-catalog.md +7 -4
  194. package/docs/guide/fr/getting-started/1-what-is-specrails.md +1 -0
  195. package/docs/guide/fr/getting-started/2-installing-and-first-run.md +1 -0
  196. package/docs/guide/fr/getting-started/4-the-dashboard-tour.md +4 -4
  197. package/docs/guide/fr/integrations/1-ai-providers.md +29 -18
  198. package/docs/guide/fr/integrations/2-plugins.md +3 -3
  199. package/docs/guide/fr/integrations/6-agent-chat.md +8 -1
  200. package/docs/guide/fr/pipeline/1-rails-and-jobs.md +9 -6
  201. package/docs/guide/fr/pipeline/2-the-job-detail-view.md +3 -1
  202. package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  203. package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +15 -13
  204. package/docs/guide/fr/pipeline/5-the-loop-builder.md +6 -2
  205. package/docs/guide/fr/specs/2-add-spec-quick-mode.md +6 -1
  206. package/docs/guide/it/agents/2-profiles-and-the-balanced-default.md +5 -1
  207. package/docs/guide/it/agents/4-custom-agents-catalog.md +7 -4
  208. package/docs/guide/it/getting-started/1-what-is-specrails.md +1 -0
  209. package/docs/guide/it/getting-started/2-installing-and-first-run.md +1 -0
  210. package/docs/guide/it/getting-started/4-the-dashboard-tour.md +4 -4
  211. package/docs/guide/it/integrations/1-ai-providers.md +28 -18
  212. package/docs/guide/it/integrations/2-plugins.md +3 -3
  213. package/docs/guide/it/integrations/6-agent-chat.md +8 -1
  214. package/docs/guide/it/pipeline/1-rails-and-jobs.md +9 -6
  215. package/docs/guide/it/pipeline/2-the-job-detail-view.md +3 -1
  216. package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  217. package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +13 -13
  218. package/docs/guide/it/pipeline/5-the-loop-builder.md +6 -2
  219. package/docs/guide/it/specs/2-add-spec-quick-mode.md +6 -1
  220. package/docs/guide/ja/agents/2-profiles-and-the-balanced-default.md +6 -1
  221. package/docs/guide/ja/agents/4-custom-agents-catalog.md +7 -4
  222. package/docs/guide/ja/getting-started/1-what-is-specrails.md +1 -0
  223. package/docs/guide/ja/getting-started/2-installing-and-first-run.md +1 -0
  224. package/docs/guide/ja/getting-started/4-the-dashboard-tour.md +4 -4
  225. package/docs/guide/ja/integrations/1-ai-providers.md +28 -18
  226. package/docs/guide/ja/integrations/2-plugins.md +3 -3
  227. package/docs/guide/ja/integrations/6-agent-chat.md +7 -1
  228. package/docs/guide/ja/pipeline/1-rails-and-jobs.md +9 -6
  229. package/docs/guide/ja/pipeline/2-the-job-detail-view.md +3 -1
  230. package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  231. package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +14 -13
  232. package/docs/guide/ja/pipeline/5-the-loop-builder.md +6 -2
  233. package/docs/guide/ja/specs/2-add-spec-quick-mode.md +6 -1
  234. package/docs/guide/pt/agents/2-profiles-and-the-balanced-default.md +5 -1
  235. package/docs/guide/pt/agents/4-custom-agents-catalog.md +7 -4
  236. package/docs/guide/pt/getting-started/1-what-is-specrails.md +1 -0
  237. package/docs/guide/pt/getting-started/2-installing-and-first-run.md +1 -0
  238. package/docs/guide/pt/getting-started/4-the-dashboard-tour.md +4 -4
  239. package/docs/guide/pt/integrations/1-ai-providers.md +28 -18
  240. package/docs/guide/pt/integrations/2-plugins.md +3 -3
  241. package/docs/guide/pt/integrations/6-agent-chat.md +7 -1
  242. package/docs/guide/pt/pipeline/1-rails-and-jobs.md +9 -6
  243. package/docs/guide/pt/pipeline/2-the-job-detail-view.md +2 -1
  244. package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  245. package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +14 -13
  246. package/docs/guide/pt/pipeline/5-the-loop-builder.md +6 -2
  247. package/docs/guide/pt/specs/2-add-spec-quick-mode.md +6 -1
  248. package/docs/guide/zh/agents/2-profiles-and-the-balanced-default.md +4 -1
  249. package/docs/guide/zh/agents/4-custom-agents-catalog.md +7 -4
  250. package/docs/guide/zh/getting-started/1-what-is-specrails.md +1 -0
  251. package/docs/guide/zh/getting-started/2-installing-and-first-run.md +1 -0
  252. package/docs/guide/zh/getting-started/4-the-dashboard-tour.md +4 -4
  253. package/docs/guide/zh/integrations/1-ai-providers.md +26 -18
  254. package/docs/guide/zh/integrations/2-plugins.md +3 -3
  255. package/docs/guide/zh/integrations/6-agent-chat.md +6 -1
  256. package/docs/guide/zh/pipeline/1-rails-and-jobs.md +9 -6
  257. package/docs/guide/zh/pipeline/2-the-job-detail-view.md +2 -1
  258. package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  259. package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +12 -12
  260. package/docs/guide/zh/pipeline/5-the-loop-builder.md +6 -2
  261. package/docs/guide/zh/specs/2-add-spec-quick-mode.md +6 -1
  262. package/docs/internals/README.md +4 -1
  263. package/docs/internals/adding-a-provider.md +32 -28
  264. package/docs/internals/api-reference.md +37 -13
  265. package/docs/internals/architecture.md +5 -5
  266. package/docs/internals/bundled-framework-build-plan.md +3 -3
  267. package/docs/internals/code-explorer-story.md +4 -0
  268. package/docs/internals/configuration.md +17 -5
  269. package/docs/internals/global-artifacts-alignment-contract.md +1 -1
  270. package/docs/internals/operations-runbook.md +1 -1
  271. package/docs/internals/profiles.md +37 -45
  272. package/docs/internals/project-builder.md +16 -0
  273. package/docs/kimi.md +291 -0
  274. package/docs/mcp.md +9 -2
  275. package/docs/platforms/macos.md +17 -7
  276. package/docs/platforms/windows.md +9 -4
  277. package/docs/running-pipelines.md +46 -12
  278. package/docs/terminal.md +1 -1
  279. package/docs/tracking-cost.md +25 -6
  280. package/package.json +4 -2
  281. package/server/dist/agent-chat-manager.js +74 -32
  282. package/server/dist/agent-chat-router.js +40 -17
  283. package/server/dist/agent-cwd-manager.js +14 -7
  284. package/server/dist/agent-generator.js +69 -85
  285. package/server/dist/agent-mcp-config.js +17 -11
  286. package/server/dist/agent-operator-prompt.js +29 -20
  287. package/server/dist/agent-refine-manager.js +58 -38
  288. package/server/dist/ai-invocations.js +65 -20
  289. package/server/dist/attachment-manager.js +49 -15
  290. package/server/dist/blueprint-chat-manager.js +41 -16
  291. package/server/dist/blueprint-router.js +40 -6
  292. package/server/dist/chat-manager.js +165 -89
  293. package/server/dist/code-explorer-router.js +26 -7
  294. package/server/dist/contract-refine-runner.js +146 -113
  295. package/server/dist/core-compat.js +57 -2
  296. package/server/dist/core-package.js +3 -3
  297. package/server/dist/core-update-manager.js +17 -1
  298. package/server/dist/db.js +60 -5
  299. package/server/dist/desktop-analytics.js +44 -6
  300. package/server/dist/desktop-router.js +127 -11
  301. package/server/dist/explore-cwd-manager.js +19 -3
  302. package/server/dist/feature-flags.js +1 -1
  303. package/server/dist/file-story-manager.js +3 -3
  304. package/server/dist/file-summary-generator.js +21 -15
  305. package/server/dist/file-summary-manager.js +6 -6
  306. package/server/dist/framework-manager.js +19 -2
  307. package/server/dist/framework-migration.js +27 -12
  308. package/server/dist/install-config-path.js +1 -1
  309. package/server/dist/interactive-job-session.js +8 -6
  310. package/server/dist/loop-command-catalog.js +27 -10
  311. package/server/dist/loop-executors.js +59 -27
  312. package/server/dist/loop-factory.js +2 -2
  313. package/server/dist/loop-run-manager.js +100 -39
  314. package/server/dist/loops-router.js +1 -1
  315. package/server/dist/mcp/guide.js +23 -16
  316. package/server/dist/mcp/tools/agents.js +47 -41
  317. package/server/dist/mcp/tools/analytics.js +2 -2
  318. package/server/dist/mcp/tools/loops.js +2 -2
  319. package/server/dist/mcp/tools/plugins.js +14 -9
  320. package/server/dist/mcp/tools/rails.js +12 -13
  321. package/server/dist/mcp/tools/support.js +1 -1
  322. package/server/dist/mobile/mobile-router.js +5 -1
  323. package/server/dist/offline-assemble.js +13 -1
  324. package/server/dist/path-resolver.js +2 -2
  325. package/server/dist/plugin-manager.js +391 -106
  326. package/server/dist/plugins/claude-md-mutation.js +5 -4
  327. package/server/dist/plugins/drift.js +32 -29
  328. package/server/dist/plugins/rail-integration.js +13 -2
  329. package/server/dist/plugins/serena/install.js +25 -17
  330. package/server/dist/plugins/serena/manifest.js +22 -5
  331. package/server/dist/plugins/serena/verify.js +46 -16
  332. package/server/dist/plugins-router.js +59 -8
  333. package/server/dist/profile-manager.js +148 -36
  334. package/server/dist/profiles-router.js +311 -82
  335. package/server/dist/project-registry.js +2 -2
  336. package/server/dist/project-router-chat.js +17 -8
  337. package/server/dist/project-router-helpers.js +93 -5
  338. package/server/dist/project-router-jobs.js +76 -12
  339. package/server/dist/project-router-loop-runs.js +42 -14
  340. package/server/dist/project-router-settings.js +31 -10
  341. package/server/dist/project-router-setup.js +4 -5
  342. package/server/dist/project-router-spending.js +15 -3
  343. package/server/dist/project-router-tickets.js +187 -181
  344. package/server/dist/project-router.js +1 -0
  345. package/server/dist/proposal-manager.js +125 -85
  346. package/server/dist/providers/claude-adapter.js +14 -0
  347. package/server/dist/providers/codex-adapter.js +20 -0
  348. package/server/dist/providers/gemini-adapter.js +14 -0
  349. package/server/dist/providers/index.js +18 -1
  350. package/server/dist/providers/kimi-adapter.js +361 -0
  351. package/server/dist/providers/kimi-skill-prompt.js +332 -0
  352. package/server/dist/providers/runtime.js +137 -0
  353. package/server/dist/queue-manager.js +103 -78
  354. package/server/dist/rail-isolated-launch.js +1 -1
  355. package/server/dist/rails-router.js +51 -38
  356. package/server/dist/result-event.js +5 -0
  357. package/server/dist/schemas/profile.v1.json +3 -4
  358. package/server/dist/setup-manager.js +222 -101
  359. package/server/dist/setup-prerequisites.js +7 -1
  360. package/server/dist/smash-runner.js +104 -57
  361. package/server/dist/spawn-lifecycle.js +18 -14
  362. package/server/dist/spec-launcher-manager.js +66 -54
  363. package/server/dist/spec-models.js +15 -6
  364. package/server/dist/spending.js +110 -17
  365. package/server/dist/util/cli-prompt.js +142 -5
  366. package/server/dist/util/stream-display.js +46 -0
  367. package/server/dist/workspace-manager.js +100 -37
  368. package/server/dist/worktree-manager.js +4 -0
  369. package/server/dist/worktree-overlay.js +12 -3
  370. package/client/dist/assets/AgentModeCodePane-BAYyFRmY.js +0 -2
  371. package/client/dist/assets/AgentsPage-DuyJuaFs.js +0 -86
  372. package/client/dist/assets/AnalyticsPage-BY7gtCx6.js +0 -1
  373. package/client/dist/assets/CodePage-vyQr40Vl.js +0 -2
  374. package/client/dist/assets/JobDetailPage-CU4FEnUC.js +0 -1
  375. package/client/dist/assets/LoopsPage-SqglnXlp.js +0 -1
  376. package/client/dist/assets/PluginsPage-B89S8o1a.js +0 -2
  377. package/client/dist/assets/TicketDetailModal-CI47Dq9E.js +0 -14
  378. package/client/dist/assets/addspec-BXjvkh5q.js +0 -1
  379. package/client/dist/assets/addspec-C4bwrmpi.js +0 -1
  380. package/client/dist/assets/addspec-CArHXUDM.js +0 -1
  381. package/client/dist/assets/addspec-DTKJcXiR.js +0 -1
  382. package/client/dist/assets/addspec-DbNBbrha.js +0 -1
  383. package/client/dist/assets/addspec-Rw8uVBC1.js +0 -1
  384. package/client/dist/assets/addspec-htHGZHOe.js +0 -1
  385. package/client/dist/assets/addspec-lr_LP6jk.js +0 -1
  386. package/client/dist/assets/agent-BABjRt0P.js +0 -1
  387. package/client/dist/assets/agent-BuUpgqVx.js +0 -1
  388. package/client/dist/assets/agent-CCDZesgU.js +0 -1
  389. package/client/dist/assets/agent-CVn64zWH.js +0 -1
  390. package/client/dist/assets/agent-CWeOny0E.js +0 -1
  391. package/client/dist/assets/agent-DOysmad_.js +0 -1
  392. package/client/dist/assets/agent-DSsjTBhn.js +0 -1
  393. package/client/dist/assets/agent-DlZMxfM9.js +0 -1
  394. package/client/dist/assets/agents-6ZOJXWVk.js +0 -1
  395. package/client/dist/assets/agents-BZ0XQKjg.js +0 -1
  396. package/client/dist/assets/agents-BqWklnHR.js +0 -1
  397. package/client/dist/assets/agents-Bz-thHkB.js +0 -1
  398. package/client/dist/assets/agents-CJclElx6.js +0 -1
  399. package/client/dist/assets/agents-D_l9L0VA.js +0 -1
  400. package/client/dist/assets/agents-DhG7mg6-.js +0 -1
  401. package/client/dist/assets/agents-u_C0jPB5.js +0 -1
  402. package/client/dist/assets/agentstudio-BF19hbXj.js +0 -1
  403. package/client/dist/assets/agentstudio-BIUe1Im2.js +0 -1
  404. package/client/dist/assets/agentstudio-BLGvxWBx.js +0 -1
  405. package/client/dist/assets/agentstudio-D9UKiWTj.js +0 -1
  406. package/client/dist/assets/agentstudio-Drs37nIM.js +0 -1
  407. package/client/dist/assets/agentstudio-nEnKkcXM.js +0 -1
  408. package/client/dist/assets/agentstudio-pyFcSBKy.js +0 -1
  409. package/client/dist/assets/agentstudio-zfTzQh3U.js +0 -1
  410. package/client/dist/assets/analytics-BC7mwR4s.js +0 -1
  411. package/client/dist/assets/analytics-BiNg8edP.js +0 -1
  412. package/client/dist/assets/analytics-C0s_T2GN.js +0 -1
  413. package/client/dist/assets/analytics-CdsAPAwZ.js +0 -1
  414. package/client/dist/assets/analytics-Cr1_q-lC.js +0 -1
  415. package/client/dist/assets/analytics-DZ8Aoq3I.js +0 -1
  416. package/client/dist/assets/analytics-IEsKZvpW.js +0 -1
  417. package/client/dist/assets/analytics-SRPf84OT.js +0 -1
  418. package/client/dist/assets/builder-BH8Fua-g.js +0 -1
  419. package/client/dist/assets/builder-BoV7DgKd.js +0 -1
  420. package/client/dist/assets/builder-Cc_Lf79C.js +0 -1
  421. package/client/dist/assets/builder-CwZ7Bme2.js +0 -1
  422. package/client/dist/assets/builder-CxW-JFsR.js +0 -1
  423. package/client/dist/assets/builder-D94lrV7x.js +0 -1
  424. package/client/dist/assets/builder-cqHpCyGa.js +0 -1
  425. package/client/dist/assets/code-76gS0IdL.js +0 -1
  426. package/client/dist/assets/code-BDXEM4ml.js +0 -1
  427. package/client/dist/assets/code-C1VwxlML.js +0 -1
  428. package/client/dist/assets/code-CnMZyJpr.js +0 -1
  429. package/client/dist/assets/code-D20ef9Cf.js +0 -1
  430. package/client/dist/assets/code-DdOXaWRY.js +0 -1
  431. package/client/dist/assets/code-Duohuf9l.js +0 -1
  432. package/client/dist/assets/code-geHmknB9.js +0 -1
  433. package/client/dist/assets/format-command-Dfa1o2d-.js +0 -1
  434. package/client/dist/assets/index-Dh9i4CnN.css +0 -2
  435. package/client/dist/assets/index-F9r8mWP_.js +0 -76
  436. package/client/dist/assets/jobs-BCtGfgUA.js +0 -1
  437. package/client/dist/assets/jobs-BHR_EnDI.js +0 -1
  438. package/client/dist/assets/jobs-BMbZJjJJ.js +0 -1
  439. package/client/dist/assets/jobs-DzSIR8V6.js +0 -1
  440. package/client/dist/assets/nav-BRJBxaGt.js +0 -1
  441. package/client/dist/assets/nav-CAGKv3_F.js +0 -1
  442. package/client/dist/assets/nav-CNskRJKQ.js +0 -1
  443. package/client/dist/assets/nav-DY93irBL.js +0 -1
  444. package/client/dist/assets/nav-DhjvYgqt.js +0 -1
  445. package/client/dist/assets/nav-Gb-r4wop.js +0 -1
  446. package/client/dist/assets/nav-TvumAFD2.js +0 -1
  447. package/client/dist/assets/nav-myFaXRHD.js +0 -1
  448. package/client/dist/assets/settings-B0ypw9uw.js +0 -1
  449. package/client/dist/assets/settings-B9ilOSYO.js +0 -1
  450. package/client/dist/assets/settings-BqlWHRHA.js +0 -1
  451. package/client/dist/assets/settings-D8dlqt4d.js +0 -1
  452. package/client/dist/assets/settings-DAZqjX2a.js +0 -1
  453. package/client/dist/assets/settings-DRh39v1S.js +0 -1
  454. package/client/dist/assets/settings-Mj1OJbfd.js +0 -1
  455. package/client/dist/assets/settings-lRReaSYm.js +0 -1
  456. package/client/dist/assets/setup-3832BJCo.js +0 -1
  457. package/client/dist/assets/setup-B8J-gECe.js +0 -1
  458. package/client/dist/assets/setup-BCIOxVsc.js +0 -1
  459. package/client/dist/assets/setup-BciLj_tU.js +0 -1
  460. package/client/dist/assets/setup-CTkE3cfh.js +0 -1
  461. package/client/dist/assets/setup-ajB4rYm-.js +0 -1
  462. package/client/dist/assets/setup-xFO1wNl0.js +0 -1
@@ -5,35 +5,31 @@ const zod_1 = require("zod");
5
5
  const types_1 = require("./types");
6
6
  /**
7
7
  * Agents domain — agent PROFILES (declarative per-project routing config) and
8
- * the agents CATALOG (the `.claude/agents/*.md` definitions: read-only `sr-*`
9
- * upstream agents + user-authored `custom-*` agents, with AI generate/test/
8
+ * the provider-native agents CATALOG (read-only `sr-*` upstream agents +
9
+ * user-authored `custom-*` roles, with capability-gated AI generate/test/
10
10
  * iterative-refine on the custom ones).
11
11
  *
12
- * CLAUDE-ONLY: agent profiles are a Claude concept. On a project whose primary
13
- * provider (or any installed provider) is codex/gemini, rails force-null the
14
- * profile and the whole section is hidden client-side — creating profiles for a
15
- * non-Claude project is mostly inert. The server still validates against that
16
- * provider's adapter catalog. Prefer using this tool on Claude projects.
17
- *
18
12
  * Every operation is per-project (mounted at /api/projects/:projectId/profiles)
19
13
  * and is gated by SPECRAILS_AGENTS_SECTION — a disabled server 404s every route.
20
14
  *
21
15
  * The catalog `generate`, `test`, `refine_start`, and `refine_turn` actions
22
- * SPAWN the claude CLI and incur real cost (refine records ai_invocations and
23
- * streams agent_refine_* WS events). `refine_apply` / `update_custom` /
24
- * `delete_custom` / `create_custom` mutate `custom-*.md` files on disk.
16
+ * SPAWN the selected provider CLI and incur real cost when that adapter exposes
17
+ * a safe output-only/read-only policy (refine records ai_invocations and
18
+ * streams agent_refine_* WS events). Other actions read/write the provider's
19
+ * native custom-role artifact (`custom-*.md`, or Kimi
20
+ * `custom-<id>/SKILL.md`).
25
21
  */
26
22
  function agentsTools() {
27
23
  return [
28
24
  {
29
25
  name: 'specrails_agents',
30
26
  title: 'Agents (Profiles & Catalog)',
31
- description: 'Manage agent PROFILES and the agents CATALOG for a project (Claude-only — profiles are inert on codex/gemini projects). ' +
27
+ description: 'Manage provider-aware agent PROFILES and the agents CATALOG for a project. Pass provider to target a non-primary installed provider. ' +
32
28
  'PROFILE actions: list, get, resolve (preview which profile a rail would resolve to), create, update, delete (destructive — protected default/project-default cannot be deleted), ' +
33
- 'duplicate, rename, migrate (seed a default profile from installed sr-*.md frontmatter), analytics (per-profile metrics), core_version (specrails-core version + 4.1.0 profile-aware check). ' +
34
- 'CATALOG actions: catalog_list, catalog_get (full agent .md body), versions (custom agent edit history), create_custom (custom-*.md), update_custom, delete_custom (destructive), ' +
35
- 'generate (AI-generate a draft custom agent — spawns claude, costs), test (AI smoke-test a draft body — spawns claude, costs), ' +
36
- 'refine_start / refine_turn (AI iterative refine of a custom agent — spawn claude, cost, stream over WS), refine_list, refine_get, refine_patch (toggle autoTest), refine_cancel (kill the spawn), refine_apply (write the refined draft to disk).',
29
+ 'duplicate, rename, migrate (seed a default profile from installed provider-native sr-* role frontmatter), analytics (per-profile metrics), core_version (specrails-core version + 4.1.0 profile-aware check). ' +
30
+ 'CATALOG actions: catalog_list, catalog_get (full provider-native role body), versions (custom role edit history), create_custom, update_custom, delete_custom (destructive), ' +
31
+ 'generate (AI-generate a draft custom role — selected provider spawn, costs), test (AI smoke-test a draft body — selected provider spawn, costs), ' +
32
+ 'refine_start / refine_turn (AI iterative refine — selected provider spawn, cost, stream over WS), refine_list, refine_get, refine_patch (toggle autoTest), refine_cancel (kill the spawn), refine_apply (write the refined draft). AI automation is rejected when the provider lacks a safe none/read-only tool policy; Kimi custom roles remain manually editable.',
37
33
  hintTier: 'read',
38
34
  tier: (a) => {
39
35
  const action = a.action;
@@ -92,11 +88,15 @@ function agentsTools() {
92
88
  ])
93
89
  .describe('Operation to perform (profile or catalog action)'),
94
90
  projectId: zod_1.z.string().optional().describe('Project id (defaults to the active project)'),
91
+ provider: zod_1.z
92
+ .string()
93
+ .optional()
94
+ .describe('Installed project provider to target (defaults to the project primary provider)'),
95
95
  // Profile params
96
96
  name: zod_1.z
97
97
  .string()
98
98
  .optional()
99
- .describe('Profile name (get/update/delete/duplicate/rename source). For duplicate/rename, the NEW name goes in `newName`.'),
99
+ .describe("Profile name (get/update/delete/duplicate/rename source). For duplicate/rename, the NEW name goes in `newName`."),
100
100
  newName: zod_1.z.string().optional().describe('New profile name (for duplicate / rename)'),
101
101
  profileName: zod_1.z
102
102
  .string()
@@ -128,39 +128,45 @@ function agentsTools() {
128
128
  async handler(ctx, args) {
129
129
  const base = `${(0, types_1.projectPath)(ctx, args.projectId)}/profiles`;
130
130
  const action = args.action;
131
+ const provider = args.provider;
132
+ const withProvider = (url) => {
133
+ if (!provider)
134
+ return url;
135
+ return `${url}${url.includes('?') ? '&' : '?'}provider=${encodeURIComponent(provider)}`;
136
+ };
131
137
  const agentId = args.agentId;
132
138
  const refineId = args.refineId;
133
139
  const profileName = args.name;
134
140
  switch (action) {
135
141
  // ── PROFILES ────────────────────────────────────────────────────
136
142
  case 'list':
137
- return (0, types_1.apiCall)(ctx, 'GET', base);
143
+ return (0, types_1.apiCall)(ctx, 'GET', withProvider(base));
138
144
  case 'get': {
139
145
  if (!profileName)
140
146
  throw new Error('get requires a profile "name".');
141
- return (0, types_1.apiCall)(ctx, 'GET', `${base}/${encodeURIComponent(profileName)}`);
147
+ return (0, types_1.apiCall)(ctx, 'GET', withProvider(`${base}/${encodeURIComponent(profileName)}`));
142
148
  }
143
149
  case 'resolve': {
144
150
  const p = args.profileName;
145
151
  const qs = p ? `?profile=${encodeURIComponent(p)}` : '';
146
- return (0, types_1.apiCall)(ctx, 'GET', `${base}/resolve${qs}`);
152
+ return (0, types_1.apiCall)(ctx, 'GET', withProvider(`${base}/resolve${qs}`));
147
153
  }
148
154
  case 'create': {
149
155
  if (!args.profile)
150
156
  throw new Error('create requires a "profile" body.');
151
- return (0, types_1.apiCall)(ctx, 'POST', base, args.profile);
157
+ return (0, types_1.apiCall)(ctx, 'POST', withProvider(base), args.profile);
152
158
  }
153
159
  case 'update': {
154
160
  if (!profileName)
155
161
  throw new Error('update requires a profile "name".');
156
162
  if (!args.profile)
157
163
  throw new Error('update requires a "profile" body (its name must equal "name").');
158
- return (0, types_1.apiCall)(ctx, 'PATCH', `${base}/${encodeURIComponent(profileName)}`, args.profile);
164
+ return (0, types_1.apiCall)(ctx, 'PATCH', withProvider(`${base}/${encodeURIComponent(profileName)}`), args.profile);
159
165
  }
160
166
  case 'delete': {
161
167
  if (!profileName)
162
168
  throw new Error('delete requires a profile "name".');
163
- return (0, types_1.apiCall)(ctx, 'DELETE', `${base}/${encodeURIComponent(profileName)}`);
169
+ return (0, types_1.apiCall)(ctx, 'DELETE', withProvider(`${base}/${encodeURIComponent(profileName)}`));
164
170
  }
165
171
  case 'duplicate': {
166
172
  if (!profileName)
@@ -168,7 +174,7 @@ function agentsTools() {
168
174
  const newName = args.newName;
169
175
  if (!newName)
170
176
  throw new Error('duplicate requires a "newName".');
171
- return (0, types_1.apiCall)(ctx, 'POST', `${base}/${encodeURIComponent(profileName)}/duplicate`, { name: newName });
177
+ return (0, types_1.apiCall)(ctx, 'POST', withProvider(`${base}/${encodeURIComponent(profileName)}/duplicate`), { name: newName });
172
178
  }
173
179
  case 'rename': {
174
180
  if (!profileName)
@@ -176,10 +182,10 @@ function agentsTools() {
176
182
  const newName = args.newName;
177
183
  if (!newName)
178
184
  throw new Error('rename requires a "newName".');
179
- return (0, types_1.apiCall)(ctx, 'POST', `${base}/${encodeURIComponent(profileName)}/rename`, { name: newName });
185
+ return (0, types_1.apiCall)(ctx, 'POST', withProvider(`${base}/${encodeURIComponent(profileName)}/rename`), { name: newName });
180
186
  }
181
187
  case 'migrate':
182
- return (0, types_1.apiCall)(ctx, 'POST', `${base}/migrate-from-settings`);
188
+ return (0, types_1.apiCall)(ctx, 'POST', withProvider(`${base}/migrate-from-settings`));
183
189
  case 'analytics': {
184
190
  const wd = args.windowDays;
185
191
  const qs = typeof wd === 'number' ? `?windowDays=${wd}` : '';
@@ -189,16 +195,16 @@ function agentsTools() {
189
195
  return (0, types_1.apiCall)(ctx, 'GET', `${base}/core-version`);
190
196
  // ── CATALOG: definitions ────────────────────────────────────────
191
197
  case 'catalog_list':
192
- return (0, types_1.apiCall)(ctx, 'GET', `${base}/catalog`);
198
+ return (0, types_1.apiCall)(ctx, 'GET', withProvider(`${base}/catalog`));
193
199
  case 'catalog_get': {
194
200
  if (!agentId)
195
201
  throw new Error('catalog_get requires an "agentId".');
196
- return (0, types_1.apiCall)(ctx, 'GET', `${base}/catalog/${encodeURIComponent(agentId)}`);
202
+ return (0, types_1.apiCall)(ctx, 'GET', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}`));
197
203
  }
198
204
  case 'versions': {
199
205
  if (!agentId)
200
206
  throw new Error('versions requires an "agentId".');
201
- return (0, types_1.apiCall)(ctx, 'GET', `${base}/catalog/${encodeURIComponent(agentId)}/versions`);
207
+ return (0, types_1.apiCall)(ctx, 'GET', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}/versions`));
202
208
  }
203
209
  case 'create_custom': {
204
210
  const id = args.agentName;
@@ -207,7 +213,7 @@ function agentsTools() {
207
213
  throw new Error('create_custom requires an "agentName" (custom-* id).');
208
214
  if (!body)
209
215
  throw new Error('create_custom requires a "body".');
210
- return (0, types_1.apiCall)(ctx, 'POST', `${base}/catalog`, { id, body });
216
+ return (0, types_1.apiCall)(ctx, 'POST', withProvider(`${base}/catalog`), { id, body });
211
217
  }
212
218
  case 'update_custom': {
213
219
  if (!agentId)
@@ -215,12 +221,12 @@ function agentsTools() {
215
221
  const body = args.body;
216
222
  if (!body)
217
223
  throw new Error('update_custom requires a "body".');
218
- return (0, types_1.apiCall)(ctx, 'PATCH', `${base}/catalog/${encodeURIComponent(agentId)}`, { body });
224
+ return (0, types_1.apiCall)(ctx, 'PATCH', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}`), { body });
219
225
  }
220
226
  case 'delete_custom': {
221
227
  if (!agentId)
222
228
  throw new Error('delete_custom requires an "agentId" (custom-* only).');
223
- return (0, types_1.apiCall)(ctx, 'DELETE', `${base}/catalog/${encodeURIComponent(agentId)}`);
229
+ return (0, types_1.apiCall)(ctx, 'DELETE', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}`));
224
230
  }
225
231
  // ── CATALOG: AI spawns (cost) ───────────────────────────────────
226
232
  case 'generate': {
@@ -230,7 +236,7 @@ function agentsTools() {
230
236
  throw new Error('generate requires an "agentName" (custom-* id).');
231
237
  if (!description)
232
238
  throw new Error('generate requires a "description".');
233
- return (0, types_1.apiCall)(ctx, 'POST', `${base}/catalog/generate`, { name, description });
239
+ return (0, types_1.apiCall)(ctx, 'POST', withProvider(`${base}/catalog/generate`), { name, description });
234
240
  }
235
241
  case 'test': {
236
242
  const draftBody = args.draftBody;
@@ -239,7 +245,7 @@ function agentsTools() {
239
245
  throw new Error('test requires a "draftBody".');
240
246
  if (!sampleTask)
241
247
  throw new Error('test requires a "sampleTask".');
242
- return (0, types_1.apiCall)(ctx, 'POST', `${base}/catalog/test`, {
248
+ return (0, types_1.apiCall)(ctx, 'POST', withProvider(`${base}/catalog/test`), {
243
249
  ...(agentId ? { agentId } : {}),
244
250
  draftBody,
245
251
  sampleTask,
@@ -252,7 +258,7 @@ function agentsTools() {
252
258
  const instruction = args.instruction;
253
259
  if (!instruction)
254
260
  throw new Error('refine_start requires an "instruction".');
255
- const r = await (0, types_1.apiCall)(ctx, 'POST', `${base}/catalog/${encodeURIComponent(agentId)}/refine`, {
261
+ const r = await (0, types_1.apiCall)(ctx, 'POST', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}/refine`), {
256
262
  instruction,
257
263
  ...(typeof args.autoTest === 'boolean' ? { autoTest: args.autoTest } : {}),
258
264
  });
@@ -269,7 +275,7 @@ function agentsTools() {
269
275
  const instruction = args.instruction;
270
276
  if (!instruction)
271
277
  throw new Error('refine_turn requires an "instruction".');
272
- const r = await (0, types_1.apiCall)(ctx, 'POST', `${base}/catalog/${encodeURIComponent(agentId)}/refine/${encodeURIComponent(refineId)}/turn`, { instruction });
278
+ const r = await (0, types_1.apiCall)(ctx, 'POST', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}/refine/${encodeURIComponent(refineId)}/turn`), { instruction });
273
279
  return {
274
280
  ...r,
275
281
  hint: 'The turn streams over WS (agent_refine_* events). Use refine_get with the refineId to read the updated draft.',
@@ -278,14 +284,14 @@ function agentsTools() {
278
284
  case 'refine_list': {
279
285
  if (!agentId)
280
286
  throw new Error('refine_list requires an "agentId".');
281
- return (0, types_1.apiCall)(ctx, 'GET', `${base}/catalog/${encodeURIComponent(agentId)}/refine`);
287
+ return (0, types_1.apiCall)(ctx, 'GET', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}/refine`));
282
288
  }
283
289
  case 'refine_get': {
284
290
  if (!agentId)
285
291
  throw new Error('refine_get requires an "agentId".');
286
292
  if (!refineId)
287
293
  throw new Error('refine_get requires a "refineId".');
288
- return (0, types_1.apiCall)(ctx, 'GET', `${base}/catalog/${encodeURIComponent(agentId)}/refine/${encodeURIComponent(refineId)}`);
294
+ return (0, types_1.apiCall)(ctx, 'GET', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}/refine/${encodeURIComponent(refineId)}`));
289
295
  }
290
296
  case 'refine_patch': {
291
297
  if (!agentId)
@@ -294,21 +300,21 @@ function agentsTools() {
294
300
  throw new Error('refine_patch requires a "refineId".');
295
301
  if (typeof args.autoTest !== 'boolean')
296
302
  throw new Error('refine_patch requires a boolean "autoTest".');
297
- return (0, types_1.apiCall)(ctx, 'PATCH', `${base}/catalog/${encodeURIComponent(agentId)}/refine/${encodeURIComponent(refineId)}`, { autoTest: args.autoTest });
303
+ return (0, types_1.apiCall)(ctx, 'PATCH', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}/refine/${encodeURIComponent(refineId)}`), { autoTest: args.autoTest });
298
304
  }
299
305
  case 'refine_cancel': {
300
306
  if (!agentId)
301
307
  throw new Error('refine_cancel requires an "agentId".');
302
308
  if (!refineId)
303
309
  throw new Error('refine_cancel requires a "refineId".');
304
- return (0, types_1.apiCall)(ctx, 'DELETE', `${base}/catalog/${encodeURIComponent(agentId)}/refine/${encodeURIComponent(refineId)}`);
310
+ return (0, types_1.apiCall)(ctx, 'DELETE', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}/refine/${encodeURIComponent(refineId)}`));
305
311
  }
306
312
  case 'refine_apply': {
307
313
  if (!agentId)
308
314
  throw new Error('refine_apply requires an "agentId".');
309
315
  if (!refineId)
310
316
  throw new Error('refine_apply requires a "refineId".');
311
- return (0, types_1.apiCall)(ctx, 'POST', `${base}/catalog/${encodeURIComponent(agentId)}/refine/${encodeURIComponent(refineId)}/apply`, { ...(typeof args.force === 'boolean' ? { force: args.force } : {}) });
317
+ return (0, types_1.apiCall)(ctx, 'POST', withProvider(`${base}/catalog/${encodeURIComponent(agentId)}/refine/${encodeURIComponent(refineId)}/apply`), { ...(typeof args.force === 'boolean' ? { force: args.force } : {}) });
312
318
  }
313
319
  default:
314
320
  throw new Error(`Unknown action "${action}".`);
@@ -57,11 +57,11 @@ function analyticsTools() {
57
57
  modelProvider: zod_1.z
58
58
  .array(zod_1.z.string())
59
59
  .optional()
60
- .describe('Providers index-aligned to model[] (scopes each model id to its provider so codex/gemini estimated cost does not merge into a claude bar)'),
60
+ .describe('Providers index-aligned to model[] (scopes each model id to its provider so native or estimated costs from claude/codex/gemini/kimi do not merge into another provider\'s bar)'),
61
61
  provider: zod_1.z
62
62
  .array(zod_1.z.string())
63
63
  .optional()
64
- .describe('Filter to these providers (e.g. claude, codex, gemini) (CSV)'),
64
+ .describe('Filter to these providers (e.g. claude, codex, gemini, kimi) (CSV)'),
65
65
  status: zod_1.z.enum(['success', 'failed', 'aborted']).optional().describe('Filter by invocation status'),
66
66
  minCostUsd: zod_1.z.number().optional().describe('Only invocations costing at least this many USD'),
67
67
  ticketId: zod_1.z.number().int().optional().describe('Scope to a single ticket id'),
@@ -124,9 +124,9 @@ function loopsTools() {
124
124
  .optional()
125
125
  .describe('Model for run — validated against the chosen provider\'s catalog; omit for the provider default'),
126
126
  reasoning_effort: zod_1.z
127
- .enum(['low', 'medium', 'high'])
127
+ .enum(['minimal', 'low', 'medium', 'high', 'xhigh', 'max', 'ultra'])
128
128
  .optional()
129
- .describe('Reasoning-effort tier for run'),
129
+ .describe('Provider-supported reasoning-effort tier for run; Kimi K3 supports low/high/max'),
130
130
  loops: zod_1.z.array(zod_1.z.unknown()).optional().describe('Array of loop export envelopes (for import)'),
131
131
  },
132
132
  async handler(ctx, args) {
@@ -19,7 +19,7 @@ function pluginsTools() {
19
19
  title: 'Plugins',
20
20
  description: 'List and manage a project\'s MCP-based integration plugins (Integrations). ' +
21
21
  'Actions: list (catalog with status/health/version/drift), preview (dry-run install diff + requirements), ' +
22
- 'install (write — runs the installer + verify, surgically merges .mcp.json, streams plugin.install_progress; long-running), ' +
22
+ 'install (write — runs the installer + verify, updates the provider-native MCP registry, streams plugin.install_progress; long-running), ' +
23
23
  'uninstall (destructive — reverts contributors, removes owned mcpServers + installed files, drops state), ' +
24
24
  'activate (re-enable an installed-but-off plugin), deactivate (toggle off without uninstalling), ' +
25
25
  'update (apply manifest drift — re-merge owned mcpServers + re-apply contributors), ' +
@@ -38,6 +38,7 @@ function pluginsTools() {
38
38
  .enum(['list', 'preview', 'install', 'uninstall', 'activate', 'deactivate', 'update', 'health'])
39
39
  .describe('Operation to perform'),
40
40
  projectId: zod_1.z.string().optional().describe('Project id (defaults to the active project)'),
41
+ provider: zod_1.z.string().optional().describe('Configured AI provider to manage (defaults to the launching conversation provider, then the project primary)'),
41
42
  name: zod_1.z
42
43
  .string()
43
44
  .optional()
@@ -47,6 +48,10 @@ function pluginsTools() {
47
48
  const base = `${(0, types_1.projectPath)(ctx, args.projectId)}/plugins`;
48
49
  const action = args.action;
49
50
  const name = args.name;
51
+ const provider = args.provider
52
+ ?? (0, types_1.originConversationDefaults)(ctx).provider;
53
+ const query = provider ? `?provider=${encodeURIComponent(provider)}` : '';
54
+ const body = provider ? { provider } : undefined;
50
55
  const requireName = () => {
51
56
  if (!name)
52
57
  throw new Error(`Action "${action}" requires a "name" (bundled plugin name).`);
@@ -54,26 +59,26 @@ function pluginsTools() {
54
59
  };
55
60
  switch (action) {
56
61
  case 'list':
57
- return (0, types_1.apiCall)(ctx, 'GET', base);
62
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}${query}`);
58
63
  case 'preview':
59
- return (0, types_1.apiCall)(ctx, 'GET', `${base}/${requireName()}/preview-install`);
64
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/${requireName()}/preview-install${query}`);
60
65
  case 'install': {
61
- const r = await (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/install`);
66
+ const r = await (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/install`, body);
62
67
  return {
63
68
  ...(typeof r === 'object' && r !== null ? r : { result: r }),
64
69
  hint: 'Install runs the plugin installer + verify and streams plugin.install_progress / plugin.installed WS events. Use specrails_watch to observe progress, or call action="health" to confirm the plugin verified.',
65
70
  };
66
71
  }
67
72
  case 'uninstall':
68
- return (0, types_1.apiCall)(ctx, 'DELETE', `${base}/${requireName()}`);
73
+ return (0, types_1.apiCall)(ctx, 'DELETE', `${base}/${requireName()}${query}`);
69
74
  case 'activate':
70
- return (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/activate`);
75
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/activate`, body);
71
76
  case 'deactivate':
72
- return (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/deactivate`);
77
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/deactivate`, body);
73
78
  case 'update':
74
- return (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/update`);
79
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/update`, body);
75
80
  case 'health':
76
- return (0, types_1.apiCall)(ctx, 'GET', `${base}/${requireName()}/health`);
81
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/${requireName()}/health${query}`);
77
82
  default:
78
83
  throw new Error(`Unknown action "${action}".`);
79
84
  }
@@ -3,10 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.railsTools = railsTools;
4
4
  const zod_1 = require("zod");
5
5
  const types_1 = require("./types");
6
- /** Launch-route contract (rails-router VALID_REASONING_EFFORTS): conversation
7
- * efforts outside it (codex 'minimal', claude 'xhigh') are never defaulted —
8
- * a default must not 400 a launch that would succeed without it. */
9
- const RAIL_REASONING_EFFORTS = new Set(['low', 'medium', 'high']);
10
6
  function isRecord(value) {
11
7
  return typeof value === 'object' && value !== null && !Array.isArray(value);
12
8
  }
@@ -30,7 +26,7 @@ function prDeliveryContinuesTickets(raw, ticketIds) {
30
26
  /**
31
27
  * Rails domain facade. A "rail" is a numbered launch slot per project: it holds
32
28
  * a set of assigned ticket IDs plus a mode/profile/engine/name, and launching it
33
- * spawns the AI pipeline (claude/codex/gemini) over those tickets.
29
+ * spawns the selected installed provider's AI pipeline over those tickets.
34
30
  *
35
31
  * Every operation is per-project under /api/projects/:projectId/rails. The
36
32
  * launch action is the only cost-incurring / repo-mutating one (ai-spawn, 202);
@@ -46,7 +42,7 @@ function railsTools() {
46
42
  'Launching several rails in parallel is safe and normal: each launch runs in its own isolated git worktree. ' +
47
43
  'Actions: list (rails + active jobs/loop runs), create_rail (add a new rail slot; returns its railIndex), set_tickets (assign ticket IDs), set_profile (default agent profile, null=legacy), ' +
48
44
  'set_engine (provider override, null=primary), set_name (display label, null clears), ' +
49
- 'launch (ai-spawn — spawns claude/codex/gemini CLI job(s) that WRITE CODE, RUN TESTS, COMMIT, and INCUR TOKEN COST; returns 202 with jobId/jobIds/loopRunIds), ' +
45
+ 'launch (ai-spawn — spawns the selected installed provider CLI job(s), including Kimi when installed, that WRITE CODE, RUN TESTS, COMMIT, and INCUR TOKEN COST; returns 202 with jobId/jobIds/loopRunIds), ' +
50
46
  'launch_all (ai-spawn — launches EVERY rail that has tickets and no active run/uncontinuable pending PR decision, in parallel, using each rail\'s stored mode/engine/profile; returns per-rail outcomes with skip reasons), ' +
51
47
  'stop (destructive — kills all active jobs and loop runs for the rail). ' +
52
48
  'For on_review tickets with an already-open GitHub PR (including a published pr_ready delivery), launch automatically tries to continue that PR head branch; Jira-linked in_progress tickets can do the same when the PR match is explicit; fresh tickets still start from the project integration branch. ' +
@@ -103,11 +99,11 @@ function railsTools() {
103
99
  mode: zod_1.z
104
100
  .enum(['implement', 'batch-implement', 'freestyle', 'loop'])
105
101
  .optional()
106
- .describe('Launch mode (launch; default "implement"). Use "freestyle" as the canonical API enum value for Freestyle: a free-form autonomous prompt sent straight to Claude, one job per ticket. In prose, call it "Freestyle". Loop runs an app-driven loop per ticket.'),
102
+ .describe('Launch mode (launch; default "implement"). Use "freestyle" as the canonical API enum value for Freestyle. It invokes the selected provider\'s native free-form autonomous workflow (currently Claude and Kimi), one job per ticket. In prose, call it "Freestyle". Loop runs an app-driven loop per ticket.'),
107
103
  model: zod_1.z
108
104
  .string()
109
105
  .optional()
110
- .describe('Model for launch. Freestyle is Claude-only and takes a Claude alias (haiku | sonnet | opus | fable); its API mode value is "freestyle". For loop mode, any model string valid for the rail\'s provider (claude/codex/gemini).'),
106
+ .describe('Model for launch. For Freestyle or loop mode, pass a model string valid for the selected installed provider; Kimi preserves configured model aliases. Freestyle availability is capability-gated by provider.'),
111
107
  interactive: zod_1.z
112
108
  .boolean()
113
109
  .optional()
@@ -117,9 +113,9 @@ function railsTools() {
117
113
  .optional()
118
114
  .describe('Loop id to run (launch). Use "factory:sdd-quick-openspec" for SDD Quick (OpenSpec): small OpenSpec-governed work via mode="loop". Factory ids (e.g. "factory:implement") map to a legacy mode; a custom published loop id keeps mode="loop". Browse/author loops with specrails_loops; the loop must be Published.'),
119
115
  reasoning_effort: zod_1.z
120
- .enum(['low', 'medium', 'high'])
116
+ .enum(['minimal', 'low', 'medium', 'high', 'xhigh', 'max', 'ultra'])
121
117
  .optional()
122
- .describe('Reasoning-effort tier for loop launches (launch, loop mode). From the in-app agent chat, omitting it defaults to the launching conversation\'s effort when that is low/medium/high.'),
118
+ .describe('Provider-supported reasoning-effort tier for loop launches. Kimi K3 supports low/high/max; the server validates against the selected provider.'),
123
119
  targetPrNumber: zod_1.z
124
120
  .number()
125
121
  .int()
@@ -228,14 +224,17 @@ function railsTools() {
228
224
  // not silently launch claude via the router's rail/primary
229
225
  // fall-through. Explicit aiEngine (string OR null) always wins; the
230
226
  // router still validates installed-ness (clear 400 back). The
231
- // conversation's reasoning effort rides along only when it fits the
232
- // launch contract (low|medium|high). Dashboard / external-client
227
+ // conversation's already-provider-validated reasoning effort rides
228
+ // along only when this launch targets that same provider. Dashboard / external-client
233
229
  // calls (no origin conversation) are byte-identical to before.
234
230
  const defaults = (0, types_1.originConversationDefaults)(ctx);
235
231
  if (body.aiEngine === undefined && defaults.provider) {
236
232
  body.aiEngine = defaults.provider;
237
233
  }
238
- if (body.reasoning_effort === undefined && defaults.reasoningEffort && RAIL_REASONING_EFFORTS.has(defaults.reasoningEffort)) {
234
+ if (body.reasoning_effort === undefined &&
235
+ defaults.reasoningEffort &&
236
+ defaults.provider &&
237
+ body.aiEngine === defaults.provider) {
239
238
  body.reasoning_effort = defaults.reasoningEffort;
240
239
  }
241
240
  const r = await (0, types_1.apiCall)(ctx, 'POST', `${base}/${railIndex}/launch`, body);
@@ -131,7 +131,7 @@ function inferTopic(question) {
131
131
  return 'agent_chat';
132
132
  if (/\b(specrails-core|core framework|missing agents?|missing skills?|no agents?|no skills?|slash command|command not found|propose-feature|opsx|framework files?|reinstall)\b/.test(q))
133
133
  return 'framework_install';
134
- if (/\b(claude|codex|gemini|provider|engine|cli|auth|login|api key|path)\b/.test(q))
134
+ if (/\b(claude|codex|gemini|kimi|provider|engine|cli|auth|login|api key|path)\b/.test(q))
135
135
  return 'provider_cli';
136
136
  if (/\b(add project|project setup|setup wizard|provision|checkpoint|install config)\b/.test(q))
137
137
  return 'project_setup';
@@ -198,8 +198,12 @@ function createMobileRouter(deps) {
198
198
  // Additive — the frozen bare-`mode` path is untouched (a v1 client sends no loopId).
199
199
  if (typeof b.loopId === 'string')
200
200
  narrowed.loopId = b.loopId;
201
- if (b.reasoning_effort === 'low' || b.reasoning_effort === 'medium' || b.reasoning_effort === 'high')
201
+ if (typeof b.reasoning_effort === 'string' &&
202
+ ['minimal', 'low', 'medium', 'high', 'xhigh', 'max', 'ultra'].includes(b.reasoning_effort)) {
203
+ // The internal rail route validates the tier against the selected
204
+ // provider. This gateway only narrows to the cross-provider enum.
202
205
  narrowed.reasoning_effort = b.reasoning_effort;
206
+ }
203
207
  if (typeof b.interactive === 'boolean')
204
208
  narrowed.interactive = b.interactive;
205
209
  void forward(res, 'POST', `/api/projects/${encodeURIComponent(pid)}/rails/${encodeURIComponent(i)}/launch`, '', narrowed);
@@ -17,6 +17,7 @@ const artifact_registry_1 = require("./artifact-registry");
17
17
  const install_config_path_1 = require("./install-config-path");
18
18
  const workspace_manager_1 = require("./workspace-manager");
19
19
  const core_package_1 = require("./core-package");
20
+ const providers_1 = require("./providers");
20
21
  // ─── Offline workspace assemble (add-project-builder D4) ─────────────────────
21
22
  //
22
23
  // The single shared "assemble a project workspace from the BUNDLED framework"
@@ -127,6 +128,17 @@ function buildQuickInstallConfigYaml(provider, defaultModel) {
127
128
  '',
128
129
  ].join('\n');
129
130
  }
131
+ function defaultModelForProvider(opts, provider) {
132
+ const providerOverride = opts.defaultModels?.[provider];
133
+ if (providerOverride)
134
+ return providerOverride;
135
+ // Preserve the original override API for its unambiguous use case. Applying
136
+ // one alias across a mixed-provider install is unsafe: `sonnet`, for example,
137
+ // is a Claude alias and is not a valid Kimi/Codex/Gemini default.
138
+ if (opts.providers.length === 1 && opts.defaultModel)
139
+ return opts.defaultModel;
140
+ return (0, providers_1.getAdapter)(provider).defaultModel();
141
+ }
130
142
  /**
131
143
  * Assemble a project workspace from the bundled framework when available, or
132
144
  * from the npx fallback in development/runtimes-less builds: registry mirror
@@ -174,7 +186,7 @@ async function assembleProjectOffline(opts) {
174
186
  for (const provider of providers) {
175
187
  const configPath = (0, install_config_path_1.installConfigPathForProvider)({ slug, path: projectPath }, provider);
176
188
  (0, fs_1.mkdirSync)((0, path_1.dirname)(configPath), { recursive: true });
177
- (0, fs_1.writeFileSync)(configPath, buildQuickInstallConfigYaml(provider, opts.defaultModel ?? 'sonnet'), 'utf-8');
189
+ (0, fs_1.writeFileSync)(configPath, buildQuickInstallConfigYaml(provider, defaultModelForProvider(opts, provider)), 'utf-8');
178
190
  const child = spawnInit(['--yes', '--from-config', configPath], projectPath);
179
191
  if (!child) {
180
192
  throw new Error('specrails-core is not available — reinstall the Specrails app');
@@ -284,7 +284,7 @@ function resolveStartupPathBase() {
284
284
  const inheritedSet = new Set(inherited);
285
285
  const bundledDirs = [nodeBinDir, gitBinDir, uvBinDir].filter((d) => !!d && !inheritedSet.has(d));
286
286
  bundledDirs.forEach((d) => inheritedSet.add(d));
287
- // Provider CLIs (claude/codex/gemini) are NEVER bundled — they always
287
+ // Provider CLIs (claude/codex/gemini/kimi) are NEVER bundled — they always
288
288
  // come from the system. On Windows their `.cmd` shims live in
289
289
  // `%APPDATA%\npm`, which a GUI-launched (Explorer/Tauri) process may not
290
290
  // have on PATH. This branch returns early, skipping the win32 fallback
@@ -317,7 +317,7 @@ function resolveStartupPathBase() {
317
317
  const inheritedSet = new Set(inherited);
318
318
  if (process.platform === 'win32') {
319
319
  // Prepend well-known global-CLI dirs (npm prefix, Program Files\nodejs) that
320
- // a GUI-launched process may lack, so provider shims (claude/codex/gemini
320
+ // a GUI-launched process may lack, so provider shims (claude/codex/gemini/kimi
321
321
  // .cmd) — and any RECURSIVE bare-name invocation by a spawned CLI — resolve.
322
322
  // Existence-gated + deduped; no-op when already present (the common case).
323
323
  const winPrepend = [];