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.
- package/README.md +28 -24
- package/client/dist/assets/{ActivityFeedPage-9DZOvIcY.js → ActivityFeedPage-CAhFRUO4.js} +1 -1
- package/client/dist/assets/{AgentBrowserCapture-DqyHbzk7.js → AgentBrowserCapture-Ct4G5lsE.js} +1 -1
- package/client/dist/assets/AgentModeCodePane-DQt9WIvu.js +2 -0
- package/client/dist/assets/{AgentModeJobsPane-CTIHMUKN.js → AgentModeJobsPane-podaJVl9.js} +1 -1
- package/client/dist/assets/AgentsPage-DTZdbW80.js +87 -0
- package/client/dist/assets/AnalyticsPage-BskgGPm0.js +1 -0
- package/client/dist/assets/CodePage-CvtYo1DU.js +2 -0
- package/client/dist/assets/{DesktopAnalyticsPage-CkXUFj3F.js → DesktopAnalyticsPage-Dnf99E8e.js} +1 -1
- package/client/dist/assets/{DocsDialog-PhdCJNVj.js → DocsDialog-DHi36rZ4.js} +1 -1
- package/client/dist/assets/{DocsPage-BY-wDthx.js → DocsPage-DIdVrQz1.js} +1 -1
- package/client/dist/assets/{InteractiveJobComposer-C9I0A4KR.js → InteractiveJobComposer-BHeB2inv.js} +1 -1
- package/client/dist/assets/{JobDetailModal-I_RoQJV4.js → JobDetailModal-CF1SKUHH.js} +1 -1
- package/client/dist/assets/JobDetailPage-De3rY18h.js +1 -0
- package/client/dist/assets/{JobsPage-DcllM4Ip.js → JobsPage-CfAqqJTx.js} +1 -1
- package/client/dist/assets/{LoopBuilderPage-DGm_iuff.js → LoopBuilderPage-DSBMuTb3.js} +2 -2
- package/client/dist/assets/{LoopPreviewModal-BC-TeFdD.js → LoopPreviewModal-B-c37kA0.js} +1 -1
- package/client/dist/assets/LoopsPage-DjnNXdmm.js +1 -0
- package/client/dist/assets/{MinimizedChatsContext-Cs34FPTz.js → MinimizedChatsContext-DIsnQMVz.js} +1 -1
- package/client/dist/assets/PluginsPage-DA5pQ_6u.js +2 -0
- package/client/dist/assets/{ProjectSettingsDialog-nEs-ENrE.js → ProjectSettingsDialog-DA23PSi6.js} +1 -1
- package/client/dist/assets/{TemplatePreviewModal-D4qW-J9B.js → TemplatePreviewModal-Cp7IQ-g2.js} +1 -1
- package/client/dist/assets/TicketDetailModal-BPD2i_0R.js +14 -0
- package/client/dist/assets/{Trans-CPISVji8.js → Trans-cWtExGkC.js} +1 -1
- package/client/dist/assets/addspec-4WmLJmBG.js +1 -0
- package/client/dist/assets/addspec-BRlk8jON.js +1 -0
- package/client/dist/assets/addspec-C7XRejU4.js +1 -0
- package/client/dist/assets/addspec-CHW9xf_X.js +1 -0
- package/client/dist/assets/addspec-DTmRrWrF.js +1 -0
- package/client/dist/assets/addspec-DhmnXER8.js +1 -0
- package/client/dist/assets/addspec-Di41DpYV.js +1 -0
- package/client/dist/assets/addspec-x3mizDxc.js +1 -0
- package/client/dist/assets/agent-BKsuIgIT.js +1 -0
- package/client/dist/assets/agent-Bs9NilfI.js +1 -0
- package/client/dist/assets/agent-C23h684q.js +1 -0
- package/client/dist/assets/agent-CqEjy3Z2.js +1 -0
- package/client/dist/assets/agent-D5DZTks1.js +1 -0
- package/client/dist/assets/agent-DE8hUYPl.js +1 -0
- package/client/dist/assets/agent-DsTuJGSc.js +1 -0
- package/client/dist/assets/agent-DwZM05-x.js +1 -0
- package/client/dist/assets/agents-45GbINfh.js +1 -0
- package/client/dist/assets/agents-BHp0_FQt.js +1 -0
- package/client/dist/assets/agents-Bvyi3y6R.js +1 -0
- package/client/dist/assets/agents-DMKFStHL.js +1 -0
- package/client/dist/assets/agents-DaYcxAr1.js +1 -0
- package/client/dist/assets/agents-IUOgqT5t.js +1 -0
- package/client/dist/assets/agents-ms7TwG16.js +1 -0
- package/client/dist/assets/agents-rzPnqoBR.js +1 -0
- package/client/dist/assets/agentstudio-8TQqBenW.js +1 -0
- package/client/dist/assets/agentstudio-B8Z_mmEX.js +1 -0
- package/client/dist/assets/agentstudio-BZR9YmLs.js +1 -0
- package/client/dist/assets/agentstudio-Bge9pAWb.js +1 -0
- package/client/dist/assets/agentstudio-Bz169Vzt.js +1 -0
- package/client/dist/assets/agentstudio-D6L2jpNi.js +1 -0
- package/client/dist/assets/agentstudio-K2-Z7CL0.js +1 -0
- package/client/dist/assets/agentstudio-Zmgzthv8.js +1 -0
- package/client/dist/assets/analytics-B8Qtptbl.js +1 -0
- package/client/dist/assets/analytics-BHqUazhP.js +1 -0
- package/client/dist/assets/analytics-BPptRY4f.js +1 -0
- package/client/dist/assets/analytics-BxDGOIwf.js +1 -0
- package/client/dist/assets/analytics-C9RaQcE3.js +1 -0
- package/client/dist/assets/analytics-CJIwqrEl.js +1 -0
- package/client/dist/assets/analytics-D_OZdQ9O.js +1 -0
- package/client/dist/assets/analytics-We6lUMI8.js +1 -0
- package/client/dist/assets/builder-3bygQtZi.js +1 -0
- package/client/dist/assets/builder-BiUG9Z5K.js +1 -0
- package/client/dist/assets/builder-CGRz_-zP.js +1 -0
- package/client/dist/assets/builder-CWYPw7Cw.js +1 -0
- package/client/dist/assets/builder-CX1437hF.js +1 -0
- package/client/dist/assets/{builder-CwA4T7gP.js → builder-Cowk9jtL.js} +1 -1
- package/client/dist/assets/builder-DwDexYRE.js +1 -0
- package/client/dist/assets/builder-skfnZ1uC.js +1 -0
- package/client/dist/assets/code-B0O8-p8k.js +1 -0
- package/client/dist/assets/code-B1VLZDhS.js +1 -0
- package/client/dist/assets/code-B86IMAfz.js +1 -0
- package/client/dist/assets/code-Bpj4Ddml.js +1 -0
- package/client/dist/assets/code-BykBZ5-e.js +1 -0
- package/client/dist/assets/code-CHPkOkDS.js +1 -0
- package/client/dist/assets/code-CkUuW4m9.js +1 -0
- package/client/dist/assets/code-cAqaqMTx.js +1 -0
- package/client/dist/assets/{dashboard-Dy2Um-US.js → dashboard-BVq6kRJe.js} +1 -1
- package/client/dist/assets/{dashboard-CHCEkds4.js → dashboard-BaKPPmLH.js} +1 -1
- package/client/dist/assets/{dashboard-CrlTV1ms.js → dashboard-Bm8e4zYG.js} +1 -1
- package/client/dist/assets/{dashboard-WhzOQw1S.js → dashboard-Bt6IesnM.js} +1 -1
- package/client/dist/assets/{dashboard-Cslu_GCH.js → dashboard-C_NQZle_.js} +1 -1
- package/client/dist/assets/{dashboard-DweT3Y4R.js → dashboard-CyZKoGoI.js} +1 -1
- package/client/dist/assets/{dashboard-DUU8-_Rg.js → dashboard-HIUdUBQ0.js} +1 -1
- package/client/dist/assets/{dashboard-Cqmmbh3l.js → dashboard-pm4Mr229.js} +1 -1
- package/client/dist/assets/{dist-js-jwoXo0YD.js → dist-js-BaP-xLOy.js} +1 -1
- package/client/dist/assets/{dist-js-Dj72W6qo.js → dist-js-CLlgOa5a.js} +1 -1
- package/client/dist/assets/format-command-C0D9IPmV.js +1 -0
- package/client/dist/assets/{formatDistanceToNow-ByKli7Q_.js → formatDistanceToNow-DUyzS4rr.js} +1 -1
- package/client/dist/assets/{getTimezoneOffsetInMilliseconds-qrcBaLW1.js → getTimezoneOffsetInMilliseconds-BCIwmmTj.js} +1 -1
- package/client/dist/assets/{i18n-Bf9Ckd10.js → i18n-D21Pr8Sj.js} +2 -2
- package/client/dist/assets/index-BdSDUFnA.css +2 -0
- package/client/dist/assets/index-Ci4-JKDr.js +77 -0
- package/client/dist/assets/{jobs-CVFD8rar.js → jobs-BAls3bWq.js} +1 -1
- package/client/dist/assets/{jobs-DoSaFzAa.js → jobs-B_TeSQxb.js} +1 -1
- package/client/dist/assets/jobs-Bgq-PZkC.js +1 -0
- package/client/dist/assets/jobs-Bpks6doU.js +1 -0
- package/client/dist/assets/jobs-CN_zv4Gr.js +1 -0
- package/client/dist/assets/jobs-DUlWSYq2.js +1 -0
- package/client/dist/assets/{jobs-B-sDHEay.js → jobs-DhxKgWFq.js} +1 -1
- package/client/dist/assets/{jobs-lk1_Dq1U.js → jobs-SwYS2M-B.js} +1 -1
- package/client/dist/assets/nav-BHDiSIVu.js +1 -0
- package/client/dist/assets/nav-CMiYAq4i.js +1 -0
- package/client/dist/assets/nav-CqS7NrDW.js +1 -0
- package/client/dist/assets/nav-D-0M7xfv.js +1 -0
- package/client/dist/assets/nav-D65O6u9I.js +1 -0
- package/client/dist/assets/nav-D_LKYvBr.js +1 -0
- package/client/dist/assets/nav-FDTJmU79.js +1 -0
- package/client/dist/assets/nav-VaB-C4k5.js +1 -0
- package/client/dist/assets/provider-capabilities-BvoExILy.js +1 -0
- package/client/dist/assets/settings-BveOJoaI.js +1 -0
- package/client/dist/assets/settings-Cj1C6F5k.js +1 -0
- package/client/dist/assets/settings-CuVwOpe0.js +1 -0
- package/client/dist/assets/settings-D5X4DfRc.js +1 -0
- package/client/dist/assets/settings-DXwxe-BW.js +1 -0
- package/client/dist/assets/settings-Di81Ba_V.js +1 -0
- package/client/dist/assets/settings-jbLjCYC_.js +1 -0
- package/client/dist/assets/settings-wIZNPFnn.js +1 -0
- package/client/dist/assets/setup-BBiHEO7h.js +1 -0
- package/client/dist/assets/setup-BlTWhNIQ.js +1 -0
- package/client/dist/assets/setup-Bp2L_oiP.js +1 -0
- package/client/dist/assets/setup-CInYXp1-.js +1 -0
- package/client/dist/assets/{setup-CITtPjed.js → setup-CYH3bP6K.js} +1 -1
- package/client/dist/assets/setup-DwcQ921P.js +1 -0
- package/client/dist/assets/setup-PBLjuDSs.js +1 -0
- package/client/dist/assets/setup-bx6FtoBp.js +1 -0
- package/client/dist/assets/{spending-DMnCXy84.js → spending-BCyUxoOI.js} +1 -1
- package/client/dist/assets/{tickets-B8BuAaj5.js → tickets-BL9r1G0e.js} +1 -1
- package/client/dist/assets/{tickets-DpmdE8tv.js → tickets-B_NyHJ8f.js} +1 -1
- package/client/dist/assets/{tickets-B_yh4qQk.js → tickets-BarF1wuG.js} +1 -1
- package/client/dist/assets/{tickets-pAUJkDTu.js → tickets-CclVhpQA.js} +1 -1
- package/client/dist/assets/{tickets-D_yDquEw.js → tickets-CqqOHbli.js} +1 -1
- package/client/dist/assets/{tickets-CFk2n2Or.js → tickets-DCkFSiqt.js} +1 -1
- package/client/dist/assets/{tickets-DQp7JS2R.js → tickets-Djn3ccfT.js} +1 -1
- package/client/dist/assets/{tickets-Bs37scwY.js → tickets-MiHBPsy_.js} +1 -1
- package/client/dist/assets/{useBrowserCaptureSession-CkBJShUw.js → useBrowserCaptureSession-CkVCDzer.js} +1 -1
- package/client/dist/assets/{useDesktop-B4pSBIDd.js → useDesktop-DCP_MHp9.js} +1 -1
- package/client/dist/index.html +25 -24
- package/docs/README.md +7 -3
- package/docs/cli.md +3 -3
- package/docs/codex.md +51 -64
- package/docs/creating-specs.md +36 -4
- package/docs/customizing.md +5 -5
- package/docs/gemini.md +35 -47
- package/docs/getting-started.md +15 -9
- package/docs/guide/de/agents/2-profiles-and-the-balanced-default.md +5 -1
- package/docs/guide/de/agents/4-custom-agents-catalog.md +7 -4
- package/docs/guide/de/getting-started/1-what-is-specrails.md +1 -0
- package/docs/guide/de/getting-started/2-installing-and-first-run.md +1 -0
- package/docs/guide/de/getting-started/4-the-dashboard-tour.md +4 -4
- package/docs/guide/de/integrations/1-ai-providers.md +29 -18
- package/docs/guide/de/integrations/2-plugins.md +3 -3
- package/docs/guide/de/integrations/6-agent-chat.md +8 -1
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +9 -6
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +3 -1
- package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +13 -13
- package/docs/guide/de/pipeline/5-the-loop-builder.md +6 -2
- package/docs/guide/de/specs/2-add-spec-quick-mode.md +6 -1
- package/docs/guide/en/agents/2-profiles-and-the-balanced-default.md +7 -1
- package/docs/guide/en/agents/4-custom-agents-catalog.md +17 -4
- package/docs/guide/en/getting-started/1-what-is-specrails.md +2 -1
- package/docs/guide/en/getting-started/2-installing-and-first-run.md +2 -1
- package/docs/guide/en/getting-started/4-the-dashboard-tour.md +5 -5
- package/docs/guide/en/insights/3-code-explorer.md +5 -0
- package/docs/guide/en/integrations/1-ai-providers.md +63 -22
- package/docs/guide/en/integrations/2-plugins.md +3 -3
- package/docs/guide/en/integrations/6-agent-chat.md +14 -2
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +19 -7
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +3 -1
- package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +25 -11
- package/docs/guide/en/pipeline/5-the-loop-builder.md +7 -2
- package/docs/guide/en/specs/2-add-spec-quick-mode.md +10 -1
- package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +5 -1
- package/docs/guide/es/agents/4-custom-agents-catalog.md +7 -4
- package/docs/guide/es/getting-started/1-what-is-specrails.md +1 -0
- package/docs/guide/es/getting-started/2-installing-and-first-run.md +1 -0
- package/docs/guide/es/getting-started/4-the-dashboard-tour.md +4 -4
- package/docs/guide/es/integrations/1-ai-providers.md +30 -18
- package/docs/guide/es/integrations/2-plugins.md +3 -3
- package/docs/guide/es/integrations/6-agent-chat.md +8 -1
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +9 -6
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +3 -1
- package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +15 -13
- package/docs/guide/es/pipeline/5-the-loop-builder.md +6 -2
- package/docs/guide/es/specs/2-add-spec-quick-mode.md +6 -1
- package/docs/guide/fr/agents/2-profiles-and-the-balanced-default.md +5 -1
- package/docs/guide/fr/agents/4-custom-agents-catalog.md +7 -4
- package/docs/guide/fr/getting-started/1-what-is-specrails.md +1 -0
- package/docs/guide/fr/getting-started/2-installing-and-first-run.md +1 -0
- package/docs/guide/fr/getting-started/4-the-dashboard-tour.md +4 -4
- package/docs/guide/fr/integrations/1-ai-providers.md +29 -18
- package/docs/guide/fr/integrations/2-plugins.md +3 -3
- package/docs/guide/fr/integrations/6-agent-chat.md +8 -1
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +9 -6
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +3 -1
- package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +15 -13
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +6 -2
- package/docs/guide/fr/specs/2-add-spec-quick-mode.md +6 -1
- package/docs/guide/it/agents/2-profiles-and-the-balanced-default.md +5 -1
- package/docs/guide/it/agents/4-custom-agents-catalog.md +7 -4
- package/docs/guide/it/getting-started/1-what-is-specrails.md +1 -0
- package/docs/guide/it/getting-started/2-installing-and-first-run.md +1 -0
- package/docs/guide/it/getting-started/4-the-dashboard-tour.md +4 -4
- package/docs/guide/it/integrations/1-ai-providers.md +28 -18
- package/docs/guide/it/integrations/2-plugins.md +3 -3
- package/docs/guide/it/integrations/6-agent-chat.md +8 -1
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +9 -6
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +3 -1
- package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +13 -13
- package/docs/guide/it/pipeline/5-the-loop-builder.md +6 -2
- package/docs/guide/it/specs/2-add-spec-quick-mode.md +6 -1
- package/docs/guide/ja/agents/2-profiles-and-the-balanced-default.md +6 -1
- package/docs/guide/ja/agents/4-custom-agents-catalog.md +7 -4
- package/docs/guide/ja/getting-started/1-what-is-specrails.md +1 -0
- package/docs/guide/ja/getting-started/2-installing-and-first-run.md +1 -0
- package/docs/guide/ja/getting-started/4-the-dashboard-tour.md +4 -4
- package/docs/guide/ja/integrations/1-ai-providers.md +28 -18
- package/docs/guide/ja/integrations/2-plugins.md +3 -3
- package/docs/guide/ja/integrations/6-agent-chat.md +7 -1
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +9 -6
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +3 -1
- package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +14 -13
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +6 -2
- package/docs/guide/ja/specs/2-add-spec-quick-mode.md +6 -1
- package/docs/guide/pt/agents/2-profiles-and-the-balanced-default.md +5 -1
- package/docs/guide/pt/agents/4-custom-agents-catalog.md +7 -4
- package/docs/guide/pt/getting-started/1-what-is-specrails.md +1 -0
- package/docs/guide/pt/getting-started/2-installing-and-first-run.md +1 -0
- package/docs/guide/pt/getting-started/4-the-dashboard-tour.md +4 -4
- package/docs/guide/pt/integrations/1-ai-providers.md +28 -18
- package/docs/guide/pt/integrations/2-plugins.md +3 -3
- package/docs/guide/pt/integrations/6-agent-chat.md +7 -1
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +9 -6
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +2 -1
- package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +14 -13
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +6 -2
- package/docs/guide/pt/specs/2-add-spec-quick-mode.md +6 -1
- package/docs/guide/zh/agents/2-profiles-and-the-balanced-default.md +4 -1
- package/docs/guide/zh/agents/4-custom-agents-catalog.md +7 -4
- package/docs/guide/zh/getting-started/1-what-is-specrails.md +1 -0
- package/docs/guide/zh/getting-started/2-installing-and-first-run.md +1 -0
- package/docs/guide/zh/getting-started/4-the-dashboard-tour.md +4 -4
- package/docs/guide/zh/integrations/1-ai-providers.md +26 -18
- package/docs/guide/zh/integrations/2-plugins.md +3 -3
- package/docs/guide/zh/integrations/6-agent-chat.md +6 -1
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +9 -6
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +2 -1
- package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +1 -1
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +12 -12
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +6 -2
- package/docs/guide/zh/specs/2-add-spec-quick-mode.md +6 -1
- package/docs/internals/README.md +4 -1
- package/docs/internals/adding-a-provider.md +32 -28
- package/docs/internals/api-reference.md +37 -13
- package/docs/internals/architecture.md +5 -5
- package/docs/internals/bundled-framework-build-plan.md +3 -3
- package/docs/internals/code-explorer-story.md +4 -0
- package/docs/internals/configuration.md +17 -5
- package/docs/internals/global-artifacts-alignment-contract.md +1 -1
- package/docs/internals/operations-runbook.md +1 -1
- package/docs/internals/profiles.md +37 -45
- package/docs/internals/project-builder.md +16 -0
- package/docs/kimi.md +291 -0
- package/docs/mcp.md +9 -2
- package/docs/platforms/macos.md +17 -7
- package/docs/platforms/windows.md +9 -4
- package/docs/running-pipelines.md +46 -12
- package/docs/terminal.md +1 -1
- package/docs/tracking-cost.md +25 -6
- package/package.json +4 -2
- package/server/dist/agent-chat-manager.js +74 -32
- package/server/dist/agent-chat-router.js +40 -17
- package/server/dist/agent-cwd-manager.js +14 -7
- package/server/dist/agent-generator.js +69 -85
- package/server/dist/agent-mcp-config.js +17 -11
- package/server/dist/agent-operator-prompt.js +29 -20
- package/server/dist/agent-refine-manager.js +58 -38
- package/server/dist/ai-invocations.js +65 -20
- package/server/dist/attachment-manager.js +49 -15
- package/server/dist/blueprint-chat-manager.js +41 -16
- package/server/dist/blueprint-router.js +40 -6
- package/server/dist/chat-manager.js +165 -89
- package/server/dist/code-explorer-router.js +26 -7
- package/server/dist/contract-refine-runner.js +146 -113
- package/server/dist/core-compat.js +57 -2
- package/server/dist/core-package.js +3 -3
- package/server/dist/core-update-manager.js +17 -1
- package/server/dist/db.js +60 -5
- package/server/dist/desktop-analytics.js +44 -6
- package/server/dist/desktop-router.js +127 -11
- package/server/dist/explore-cwd-manager.js +19 -3
- package/server/dist/feature-flags.js +1 -1
- package/server/dist/file-story-manager.js +3 -3
- package/server/dist/file-summary-generator.js +21 -15
- package/server/dist/file-summary-manager.js +6 -6
- package/server/dist/framework-manager.js +19 -2
- package/server/dist/framework-migration.js +27 -12
- package/server/dist/install-config-path.js +1 -1
- package/server/dist/interactive-job-session.js +8 -6
- package/server/dist/loop-command-catalog.js +27 -10
- package/server/dist/loop-executors.js +59 -27
- package/server/dist/loop-factory.js +2 -2
- package/server/dist/loop-run-manager.js +100 -39
- package/server/dist/loops-router.js +1 -1
- package/server/dist/mcp/guide.js +23 -16
- package/server/dist/mcp/tools/agents.js +47 -41
- package/server/dist/mcp/tools/analytics.js +2 -2
- package/server/dist/mcp/tools/loops.js +2 -2
- package/server/dist/mcp/tools/plugins.js +14 -9
- package/server/dist/mcp/tools/rails.js +12 -13
- package/server/dist/mcp/tools/support.js +1 -1
- package/server/dist/mobile/mobile-router.js +5 -1
- package/server/dist/offline-assemble.js +13 -1
- package/server/dist/path-resolver.js +2 -2
- package/server/dist/plugin-manager.js +391 -106
- package/server/dist/plugins/claude-md-mutation.js +5 -4
- package/server/dist/plugins/drift.js +32 -29
- package/server/dist/plugins/rail-integration.js +13 -2
- package/server/dist/plugins/serena/install.js +25 -17
- package/server/dist/plugins/serena/manifest.js +22 -5
- package/server/dist/plugins/serena/verify.js +46 -16
- package/server/dist/plugins-router.js +59 -8
- package/server/dist/profile-manager.js +148 -36
- package/server/dist/profiles-router.js +311 -82
- package/server/dist/project-registry.js +2 -2
- package/server/dist/project-router-chat.js +17 -8
- package/server/dist/project-router-helpers.js +93 -5
- package/server/dist/project-router-jobs.js +76 -12
- package/server/dist/project-router-loop-runs.js +42 -14
- package/server/dist/project-router-settings.js +31 -10
- package/server/dist/project-router-setup.js +4 -5
- package/server/dist/project-router-spending.js +15 -3
- package/server/dist/project-router-tickets.js +187 -181
- package/server/dist/project-router.js +1 -0
- package/server/dist/proposal-manager.js +125 -85
- package/server/dist/providers/claude-adapter.js +14 -0
- package/server/dist/providers/codex-adapter.js +20 -0
- package/server/dist/providers/gemini-adapter.js +14 -0
- package/server/dist/providers/index.js +18 -1
- package/server/dist/providers/kimi-adapter.js +361 -0
- package/server/dist/providers/kimi-skill-prompt.js +332 -0
- package/server/dist/providers/runtime.js +137 -0
- package/server/dist/queue-manager.js +103 -78
- package/server/dist/rail-isolated-launch.js +1 -1
- package/server/dist/rails-router.js +51 -38
- package/server/dist/result-event.js +5 -0
- package/server/dist/schemas/profile.v1.json +3 -4
- package/server/dist/setup-manager.js +222 -101
- package/server/dist/setup-prerequisites.js +7 -1
- package/server/dist/smash-runner.js +104 -57
- package/server/dist/spawn-lifecycle.js +18 -14
- package/server/dist/spec-launcher-manager.js +66 -54
- package/server/dist/spec-models.js +15 -6
- package/server/dist/spending.js +110 -17
- package/server/dist/util/cli-prompt.js +142 -5
- package/server/dist/util/stream-display.js +46 -0
- package/server/dist/workspace-manager.js +100 -37
- package/server/dist/worktree-manager.js +4 -0
- package/server/dist/worktree-overlay.js +12 -3
- package/client/dist/assets/AgentModeCodePane-BAYyFRmY.js +0 -2
- package/client/dist/assets/AgentsPage-DuyJuaFs.js +0 -86
- package/client/dist/assets/AnalyticsPage-BY7gtCx6.js +0 -1
- package/client/dist/assets/CodePage-vyQr40Vl.js +0 -2
- package/client/dist/assets/JobDetailPage-CU4FEnUC.js +0 -1
- package/client/dist/assets/LoopsPage-SqglnXlp.js +0 -1
- package/client/dist/assets/PluginsPage-B89S8o1a.js +0 -2
- package/client/dist/assets/TicketDetailModal-CI47Dq9E.js +0 -14
- package/client/dist/assets/addspec-BXjvkh5q.js +0 -1
- package/client/dist/assets/addspec-C4bwrmpi.js +0 -1
- package/client/dist/assets/addspec-CArHXUDM.js +0 -1
- package/client/dist/assets/addspec-DTKJcXiR.js +0 -1
- package/client/dist/assets/addspec-DbNBbrha.js +0 -1
- package/client/dist/assets/addspec-Rw8uVBC1.js +0 -1
- package/client/dist/assets/addspec-htHGZHOe.js +0 -1
- package/client/dist/assets/addspec-lr_LP6jk.js +0 -1
- package/client/dist/assets/agent-BABjRt0P.js +0 -1
- package/client/dist/assets/agent-BuUpgqVx.js +0 -1
- package/client/dist/assets/agent-CCDZesgU.js +0 -1
- package/client/dist/assets/agent-CVn64zWH.js +0 -1
- package/client/dist/assets/agent-CWeOny0E.js +0 -1
- package/client/dist/assets/agent-DOysmad_.js +0 -1
- package/client/dist/assets/agent-DSsjTBhn.js +0 -1
- package/client/dist/assets/agent-DlZMxfM9.js +0 -1
- package/client/dist/assets/agents-6ZOJXWVk.js +0 -1
- package/client/dist/assets/agents-BZ0XQKjg.js +0 -1
- package/client/dist/assets/agents-BqWklnHR.js +0 -1
- package/client/dist/assets/agents-Bz-thHkB.js +0 -1
- package/client/dist/assets/agents-CJclElx6.js +0 -1
- package/client/dist/assets/agents-D_l9L0VA.js +0 -1
- package/client/dist/assets/agents-DhG7mg6-.js +0 -1
- package/client/dist/assets/agents-u_C0jPB5.js +0 -1
- package/client/dist/assets/agentstudio-BF19hbXj.js +0 -1
- package/client/dist/assets/agentstudio-BIUe1Im2.js +0 -1
- package/client/dist/assets/agentstudio-BLGvxWBx.js +0 -1
- package/client/dist/assets/agentstudio-D9UKiWTj.js +0 -1
- package/client/dist/assets/agentstudio-Drs37nIM.js +0 -1
- package/client/dist/assets/agentstudio-nEnKkcXM.js +0 -1
- package/client/dist/assets/agentstudio-pyFcSBKy.js +0 -1
- package/client/dist/assets/agentstudio-zfTzQh3U.js +0 -1
- package/client/dist/assets/analytics-BC7mwR4s.js +0 -1
- package/client/dist/assets/analytics-BiNg8edP.js +0 -1
- package/client/dist/assets/analytics-C0s_T2GN.js +0 -1
- package/client/dist/assets/analytics-CdsAPAwZ.js +0 -1
- package/client/dist/assets/analytics-Cr1_q-lC.js +0 -1
- package/client/dist/assets/analytics-DZ8Aoq3I.js +0 -1
- package/client/dist/assets/analytics-IEsKZvpW.js +0 -1
- package/client/dist/assets/analytics-SRPf84OT.js +0 -1
- package/client/dist/assets/builder-BH8Fua-g.js +0 -1
- package/client/dist/assets/builder-BoV7DgKd.js +0 -1
- package/client/dist/assets/builder-Cc_Lf79C.js +0 -1
- package/client/dist/assets/builder-CwZ7Bme2.js +0 -1
- package/client/dist/assets/builder-CxW-JFsR.js +0 -1
- package/client/dist/assets/builder-D94lrV7x.js +0 -1
- package/client/dist/assets/builder-cqHpCyGa.js +0 -1
- package/client/dist/assets/code-76gS0IdL.js +0 -1
- package/client/dist/assets/code-BDXEM4ml.js +0 -1
- package/client/dist/assets/code-C1VwxlML.js +0 -1
- package/client/dist/assets/code-CnMZyJpr.js +0 -1
- package/client/dist/assets/code-D20ef9Cf.js +0 -1
- package/client/dist/assets/code-DdOXaWRY.js +0 -1
- package/client/dist/assets/code-Duohuf9l.js +0 -1
- package/client/dist/assets/code-geHmknB9.js +0 -1
- package/client/dist/assets/format-command-Dfa1o2d-.js +0 -1
- package/client/dist/assets/index-Dh9i4CnN.css +0 -2
- package/client/dist/assets/index-F9r8mWP_.js +0 -76
- package/client/dist/assets/jobs-BCtGfgUA.js +0 -1
- package/client/dist/assets/jobs-BHR_EnDI.js +0 -1
- package/client/dist/assets/jobs-BMbZJjJJ.js +0 -1
- package/client/dist/assets/jobs-DzSIR8V6.js +0 -1
- package/client/dist/assets/nav-BRJBxaGt.js +0 -1
- package/client/dist/assets/nav-CAGKv3_F.js +0 -1
- package/client/dist/assets/nav-CNskRJKQ.js +0 -1
- package/client/dist/assets/nav-DY93irBL.js +0 -1
- package/client/dist/assets/nav-DhjvYgqt.js +0 -1
- package/client/dist/assets/nav-Gb-r4wop.js +0 -1
- package/client/dist/assets/nav-TvumAFD2.js +0 -1
- package/client/dist/assets/nav-myFaXRHD.js +0 -1
- package/client/dist/assets/settings-B0ypw9uw.js +0 -1
- package/client/dist/assets/settings-B9ilOSYO.js +0 -1
- package/client/dist/assets/settings-BqlWHRHA.js +0 -1
- package/client/dist/assets/settings-D8dlqt4d.js +0 -1
- package/client/dist/assets/settings-DAZqjX2a.js +0 -1
- package/client/dist/assets/settings-DRh39v1S.js +0 -1
- package/client/dist/assets/settings-Mj1OJbfd.js +0 -1
- package/client/dist/assets/settings-lRReaSYm.js +0 -1
- package/client/dist/assets/setup-3832BJCo.js +0 -1
- package/client/dist/assets/setup-B8J-gECe.js +0 -1
- package/client/dist/assets/setup-BCIOxVsc.js +0 -1
- package/client/dist/assets/setup-BciLj_tU.js +0 -1
- package/client/dist/assets/setup-CTkE3cfh.js +0 -1
- package/client/dist/assets/setup-ajB4rYm-.js +0 -1
- 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 (
|
|
9
|
-
*
|
|
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
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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
|
|
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
|
|
34
|
-
'CATALOG actions: catalog_list, catalog_get (full
|
|
35
|
-
'generate (AI-generate a draft custom
|
|
36
|
-
'refine_start / refine_turn (AI iterative refine
|
|
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(
|
|
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)}
|
|
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
|
|
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
|
|
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
|
|
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)}
|
|
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
|
|
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
|
|
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)}
|
|
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
|
|
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
|
|
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('
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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('
|
|
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
|
|
232
|
-
// launch
|
|
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 &&
|
|
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 (
|
|
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
|
|
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 = [];
|