specrails-desktop 2.16.0 → 2.18.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/client/dist/assets/{ActivityFeedPage-C_clKk8d.js → ActivityFeedPage-mGnv5SOe.js} +1 -1
- package/client/dist/assets/AgentsPage-BH1isg5j.js +86 -0
- package/client/dist/assets/AnalyticsPage-ByyshYRI.js +1 -0
- package/client/dist/assets/{BarChart-Dq1h8eYR.js → BarChart-BqHUOnl9.js} +3 -3
- package/client/dist/assets/CodePage-CU7T_HYs.js +2 -0
- package/client/dist/assets/{DesktopAnalyticsPage-CYhXhJoQ.js → DesktopAnalyticsPage-CR-m97Ui.js} +1 -1
- package/client/dist/assets/DocsDialog-CEmZp_8V.js +11 -0
- package/client/dist/assets/DocsPage-DYbAQ1AT.js +11 -0
- package/client/dist/assets/{ExportDropdown-DdB2ncYh.js → ExportDropdown-C-o1Q4ef.js} +1 -1
- package/client/dist/assets/IntegrationsPage-C6fKdwVH.js +3 -0
- package/client/dist/assets/JobDetailPage-CKfIfBgE.js +16 -0
- package/client/dist/assets/JobsPage-nBng0riZ.js +1 -0
- package/client/dist/assets/LoopBuilderPage-Co_TYqYk.js +7 -0
- package/client/dist/assets/LoopsPage-a2hd37Ya.js +1 -0
- package/client/dist/assets/{activity-Ca2XoBi-.js → activity-D8vQJrpW.js} +1 -1
- package/client/dist/assets/{addon-image-biWX2UUm.js → addon-image-Ba-TY3wr.js} +1 -1
- package/client/dist/assets/{addon-ligatures-D4EiDb5r.js → addon-ligatures-T4ARLiuu.js} +1 -1
- package/client/dist/assets/{addon-webgl-CDCIZQ03.js → addon-webgl-Cd73n8eh.js} +1 -1
- package/client/dist/assets/{addspec-DE_VfIyP.js → addspec-BloGn_ey.js} +1 -1
- package/client/dist/assets/agent-9WdSxPU5.js +1 -0
- package/client/dist/assets/agent-ASIyVcg0.js +1 -0
- package/client/dist/assets/agent-Bm2tPrdr.js +1 -0
- package/client/dist/assets/agent-C4bO1l_v.js +1 -0
- package/client/dist/assets/agent-CgKsh88Z2.js +1 -0
- package/client/dist/assets/agent-DMUrz9ZS2.js +1 -0
- package/client/dist/assets/agent-Dwkz5mPS.js +1 -0
- package/client/dist/assets/agent-pO8x4jbR.js +1 -0
- package/client/dist/assets/{agents-DcoUUFZl.js → agents-52t8NVpS.js} +1 -1
- package/client/dist/assets/{agents-DCX9D3-Q.js → agents-BAxAwHy-.js} +1 -1
- package/client/dist/assets/{agents-Jc-CjBDB.js → agents-BUYBb825.js} +1 -1
- package/client/dist/assets/{agents-CIhRSOna.js → agents-BjT_xLjv.js} +1 -1
- package/client/dist/assets/{agents-BYjUOrLD.js → agents-C07al8rI.js} +1 -1
- package/client/dist/assets/{agents-1lhqEcXH.js → agents-DfGvYtpq2.js} +1 -1
- package/client/dist/assets/{agents-CQlu1nOm.js → agents-Dli56gr82.js} +1 -1
- package/client/dist/assets/{agents-DVYpVGur.js → agents-Eqw_AQ6H.js} +1 -1
- package/client/dist/assets/{agentstudio-DCTpIqOx.js → agentstudio-CZm2rOzt.js} +1 -1
- package/client/dist/assets/{aiedit-Dirqf3Bm.js → aiedit-DYtnZU9H.js} +1 -1
- package/client/dist/assets/{analytics-BE49LbUk.js → analytics-B4FJ_pry.js} +1 -1
- package/client/dist/assets/{attachments-C2JPppoP.js → attachments-Ci6_42Kh.js} +1 -1
- package/client/dist/assets/{browser-Dpo_ug4c.js → browser-ZB1afzjZ.js} +1 -1
- package/client/dist/assets/{chat-mq1x9cxZ.js → chat-VMflhzxn.js} +1 -1
- package/client/dist/assets/chunk-BNv3lrIs.js +1 -0
- package/client/dist/assets/{code-DtIatVES.js → code-wtcs0ivb.js} +1 -1
- package/client/dist/assets/commands-Bc8y9eNo2.js +1 -0
- package/client/dist/assets/commands-Bl3-KVfj.js +1 -0
- package/client/dist/assets/commands-C5WQ9blx2.js +1 -0
- package/client/dist/assets/commands-CM99Upsz2.js +1 -0
- package/client/dist/assets/commands-Cc2WpuXa.js +1 -0
- package/client/dist/assets/commands-CckaBWdV.js +1 -0
- package/client/dist/assets/commands-DASXJD-l.js +1 -0
- package/client/dist/assets/commands-k9wbNYoi.js +1 -0
- package/client/dist/assets/{common-kftoE0Q-.js → common-BPQQkgJZ.js} +1 -1
- package/client/dist/assets/{cssMode-DSHXamUH.js → cssMode-DsArsSCT.js} +1 -1
- package/client/dist/assets/{dashboard-BQ3Oa8CE.js → dashboard-Cyzp4ox9.js} +1 -1
- package/client/dist/assets/{dist-js-Ele_sHO7.js → dist-js-BHhtSerX.js} +1 -1
- package/client/dist/assets/{dist-js-D27I-bfi.js → dist-js-CUegfF6k.js} +1 -1
- package/client/dist/assets/{editor.api2-Cwla1nvV.js → editor.api2-T7u8kQWG.js} +1 -1
- package/client/dist/assets/{editor.main-Cd8qBRAT.js → editor.main-G3Sl9C67.js} +2 -2
- package/client/dist/assets/{explore-CBYU76JD.js → explore-BKVV5JSu.js} +1 -1
- package/client/dist/assets/{freemarker2-CkEKTBm2.js → freemarker2-pBzQNgFi.js} +1 -1
- package/client/dist/assets/{handlebars-BRGx0JpL.js → handlebars-CtBTCnBI.js} +1 -1
- package/client/dist/assets/{html-BfRIaGgN.js → html-Dx3DYBzY.js} +1 -1
- package/client/dist/assets/{htmlMode-BTpSnsDE.js → htmlMode-In7frFOo.js} +1 -1
- package/client/dist/assets/index-B0FxQALR.css +2 -0
- package/client/dist/assets/index-B7vB20Jw.js +152 -0
- package/client/dist/assets/{integrations-jJGaKwff.js → integrations-CuWnMR5L.js} +1 -1
- package/client/dist/assets/{javascript-DMmE2kKN.js → javascript-BKcn-YkN.js} +1 -1
- package/client/dist/assets/{jira-BwACz875.js → jira-DXMoAKWD.js} +1 -1
- package/client/dist/assets/{jobs-DRInW0AE.js → jobs---dwa4Nf.js} +1 -1
- package/client/dist/assets/{jsonMode-hYuaUleY.js → jsonMode-jNREoQ3C.js} +1 -1
- package/client/dist/assets/{lib-qdRfWwE1.js → lib-PQoHlR5u.js} +2 -2
- package/client/dist/assets/{liquid-C-VbuTr7.js → liquid-CtRkGqBu.js} +1 -1
- package/client/dist/assets/{loops-DfGadne0.js → loops-D8Iu6Jss.js} +1 -1
- package/client/dist/assets/{lspLanguageFeatures-BALx-vjn.js → lspLanguageFeatures-Cl3gvD_W.js} +1 -1
- package/client/dist/assets/mcp-B4irfLJ2.js +1 -0
- package/client/dist/assets/mcp-B6nwJJmR.js +1 -0
- package/client/dist/assets/mcp-BOoEGTSQ.js +1 -0
- package/client/dist/assets/mcp-BP7PpbDr2.js +1 -0
- package/client/dist/assets/mcp-CIH0pH1K.js +1 -0
- package/client/dist/assets/mcp-CNgFiTEh.js +1 -0
- package/client/dist/assets/mcp-D3E4_Mmk2.js +1 -0
- package/client/dist/assets/mcp-mupPuPDO2.js +1 -0
- package/client/dist/assets/{mdx-Cs8MNCzn.js → mdx-B_nJldHz.js} +1 -1
- package/client/dist/assets/{monaco.contribution-CIvCAJs4.js → monaco.contribution-PUeaZk8T.js} +2 -2
- package/client/dist/assets/{nav-CCz4krPP.js → nav-DE3yWQw6.js} +1 -1
- package/client/dist/assets/{python-CGShLxuI.js → python-DS1Ce-A6.js} +1 -1
- package/client/dist/assets/{razor-CvOBQGd5.js → razor-L41Qg9OK.js} +1 -1
- package/client/dist/assets/settings-BKmORxlB2.js +1 -0
- package/client/dist/assets/settings-BVv2JgQ8.js +1 -0
- package/client/dist/assets/settings-Bghm3pAV.js +1 -0
- package/client/dist/assets/settings-BuC_aplX.js +1 -0
- package/client/dist/assets/settings-Bw_Qk8E32.js +1 -0
- package/client/dist/assets/settings-CAKgJv7p.js +1 -0
- package/client/dist/assets/settings-CEUgk1Ck.js +1 -0
- package/client/dist/assets/settings-C_PDE20s2.js +1 -0
- package/client/dist/assets/setup-4us-Bz3H.js +1 -0
- package/client/dist/assets/setup-BYoDYoPY2.js +1 -0
- package/client/dist/assets/setup-Bf9eLKxU.js +1 -0
- package/client/dist/assets/setup-C5UbM0RP.js +1 -0
- package/client/dist/assets/setup-CqGrWb6G.js +1 -0
- package/client/dist/assets/setup-JFkWWZnR.js +1 -0
- package/client/dist/assets/setup-faMApo0U2.js +1 -0
- package/client/dist/assets/setup-tloaTobG2.js +1 -0
- package/client/dist/assets/{specs-C_8j4ELZ.js → specs-BYeAbIEy.js} +1 -1
- package/client/dist/assets/{terminal-Cj4HzP3p.js → terminal-DFPNRLKp.js} +1 -1
- package/client/dist/assets/{tickets-DBQXMYYA.js → tickets-CkfbISuK.js} +1 -1
- package/client/dist/assets/{tsMode-04uOpiiP.js → tsMode-BC1g186U.js} +1 -1
- package/client/dist/assets/{typescript-CX0CwyIZ.js → typescript-BGlRGvJW.js} +1 -1
- package/client/dist/assets/upload-PnJDPHZH.js +1 -0
- package/client/dist/assets/{value-BRVOAvhY.js → value-BTDefcOV.js} +1 -1
- package/client/dist/assets/{workers-yr2u4c3C.js → workers-CXcXtO3b.js} +1 -1
- package/client/dist/assets/{xml-C0OFlt5X.js → xml-JdZZaIhJ.js} +1 -1
- package/client/dist/assets/{yaml-DgabaPs5.js → yaml-Cm82BVBt.js} +1 -1
- package/client/dist/index.html +30 -28
- package/docs/README.md +2 -0
- package/docs/guide/de/integrations/5-mcp-server.md +74 -0
- package/docs/guide/de/integrations/6-agent-chat.md +64 -0
- package/docs/guide/en/integrations/5-mcp-server.md +74 -0
- package/docs/guide/en/integrations/6-agent-chat.md +64 -0
- package/docs/guide/es/integrations/5-mcp-server.md +74 -0
- package/docs/guide/es/integrations/6-agent-chat.md +64 -0
- package/docs/guide/fr/integrations/5-mcp-server.md +74 -0
- package/docs/guide/fr/integrations/6-agent-chat.md +64 -0
- package/docs/guide/it/integrations/5-mcp-server.md +74 -0
- package/docs/guide/it/integrations/6-agent-chat.md +64 -0
- package/docs/guide/ja/integrations/5-mcp-server.md +74 -0
- package/docs/guide/ja/integrations/6-agent-chat.md +64 -0
- package/docs/guide/pt/integrations/5-mcp-server.md +74 -0
- package/docs/guide/pt/integrations/6-agent-chat.md +64 -0
- package/docs/guide/zh/integrations/5-mcp-server.md +74 -0
- package/docs/guide/zh/integrations/6-agent-chat.md +64 -0
- package/docs/mcp.md +249 -0
- package/package.json +8 -5
- package/server/dist/agent-chat-manager.js +224 -0
- package/server/dist/agent-chat-router.js +148 -0
- package/server/dist/agent-cwd-manager.js +94 -0
- package/server/dist/agent-mcp-config.js +208 -0
- package/server/dist/agent-store.js +59 -0
- package/server/dist/agent-tier.js +86 -0
- package/server/dist/desktop-db.js +27 -0
- package/server/dist/index.js +38 -0
- package/server/dist/mcp/guide.js +82 -0
- package/server/dist/mcp/index.js +21 -0
- package/server/dist/mcp/mcp-admin-router.js +71 -0
- package/server/dist/mcp/mcp-server.js +143 -0
- package/server/dist/mcp/mcp-tiers.js +48 -0
- package/server/dist/mcp/mcp-token.js +119 -0
- package/server/dist/mcp/resources.js +24 -0
- package/server/dist/mcp/tools/agents.js +319 -0
- package/server/dist/mcp/tools/analytics.js +168 -0
- package/server/dist/mcp/tools/app-settings.js +81 -0
- package/server/dist/mcp/tools/catalog.js +45 -0
- package/server/dist/mcp/tools/chat.js +147 -0
- package/server/dist/mcp/tools/code.js +145 -0
- package/server/dist/mcp/tools/jira.js +222 -0
- package/server/dist/mcp/tools/jobs.js +258 -0
- package/server/dist/mcp/tools/loops.js +229 -0
- package/server/dist/mcp/tools/meta.js +96 -0
- package/server/dist/mcp/tools/plugins.js +83 -0
- package/server/dist/mcp/tools/projects.js +62 -0
- package/server/dist/mcp/tools/rails.js +181 -0
- package/server/dist/mcp/tools/setup.js +167 -0
- package/server/dist/mcp/tools/specs.js +327 -0
- package/server/dist/mcp/tools/types.js +156 -0
- package/server/dist/mcp/tools/watch.js +93 -0
- package/server/dist/mobile/mobile-event-bus.js +2 -0
- package/server/dist/project-router-setup.js +15 -1
- package/server/dist/project-router-tickets.js +2 -2
- package/server/dist/providers/codex-adapter.js +19 -3
- package/server/dist/rails-router.js +5 -0
- package/server/dist/setup-manager.js +28 -0
- package/server/dist/spawn-lifecycle.js +21 -13
- package/server/dist/workspace-manager.js +11 -0
- package/client/dist/assets/AgentsPage-jcPUtPhP.js +0 -86
- package/client/dist/assets/AnalyticsPage-DZkVU3yd.js +0 -1
- package/client/dist/assets/CodePage-BcbZT88K.js +0 -2
- package/client/dist/assets/DocsDialog-CS3Syf61.js +0 -11
- package/client/dist/assets/DocsPage-l3ZcTO2E.js +0 -11
- package/client/dist/assets/IntegrationsPage-CJ_Om1zu.js +0 -3
- package/client/dist/assets/JobDetailPage-D5Cxw0md.js +0 -16
- package/client/dist/assets/JobsPage-3v_iX83r.js +0 -1
- package/client/dist/assets/LoopBuilderPage-4s_adZy5.js +0 -7
- package/client/dist/assets/LoopsPage-DA94-o0j.js +0 -1
- package/client/dist/assets/chunk-CilyBKbf.js +0 -1
- package/client/dist/assets/commands-B9XEyMj-.js +0 -1
- package/client/dist/assets/commands-BI1Ta-E7.js +0 -1
- package/client/dist/assets/commands-BdI0CtOL.js +0 -1
- package/client/dist/assets/commands-C2ewlyXo.js +0 -1
- package/client/dist/assets/commands-CwypztRT.js +0 -1
- package/client/dist/assets/commands-DSX3yJyr.js +0 -1
- package/client/dist/assets/commands-Ic1DJDxm.js +0 -1
- package/client/dist/assets/commands-yNn4IA4C.js +0 -1
- package/client/dist/assets/index-BRMyOS1B.css +0 -2
- package/client/dist/assets/index-meTWPBzY.js +0 -144
- package/client/dist/assets/settings-0m2iuTzd.js +0 -1
- package/client/dist/assets/settings-BA1V6KdK.js +0 -1
- package/client/dist/assets/settings-BN7OusER.js +0 -1
- package/client/dist/assets/settings-Bi5FFkIw.js +0 -1
- package/client/dist/assets/settings-CRJxyTNN.js +0 -1
- package/client/dist/assets/settings-DyBxunCh.js +0 -1
- package/client/dist/assets/settings-fk-WlnUt.js +0 -1
- package/client/dist/assets/settings-iQe5Dim-.js +0 -1
- package/client/dist/assets/setup-BOmQ4vh2.js +0 -1
- package/client/dist/assets/setup-BwO2-kuK.js +0 -1
- package/client/dist/assets/setup-CUTNWz-0.js +0 -1
- package/client/dist/assets/setup-Cf3hjChU.js +0 -1
- package/client/dist/assets/setup-CsuXrbJ2.js +0 -1
- package/client/dist/assets/setup-Df4cJOqu.js +0 -1
- package/client/dist/assets/setup-Do0fWx6W.js +0 -1
- package/client/dist/assets/setup-GlkDhBlJ.js +0 -1
- package/client/dist/assets/upload-DPG87J4t.js +0 -1
- /package/client/dist/assets/{abap-CK68cr9-.js → abap-CpHUwCVK.js} +0 -0
- /package/client/dist/assets/{activity-Di2f50_Z.js → activity-B82z3Pna.js} +0 -0
- /package/client/dist/assets/{activity-B2MvEH54.js → activity-BId0pwuS2.js} +0 -0
- /package/client/dist/assets/{activity-D4dhNEwO.js → activity-BVpZrs0J.js} +0 -0
- /package/client/dist/assets/{activity-DHjfmAyT.js → activity-BySXFT2J2.js} +0 -0
- /package/client/dist/assets/{activity-usnNa7FX.js → activity-DIWnV0Pl.js} +0 -0
- /package/client/dist/assets/{activity-C7VdmeGb.js → activity-Uj576ckT.js} +0 -0
- /package/client/dist/assets/{activity-BbNkUmW4.js → activity-w1qMFwxh.js} +0 -0
- /package/client/dist/assets/{addspec-CO1xv6BL.js → addspec-B9dY_F5T.js} +0 -0
- /package/client/dist/assets/{addspec-CNyAUGz_.js → addspec-B9nhMikb.js} +0 -0
- /package/client/dist/assets/{addspec-IozoiiGs.js → addspec-BtNaJHu2.js} +0 -0
- /package/client/dist/assets/{addspec-BxMn39wn.js → addspec-D43TlMVp2.js} +0 -0
- /package/client/dist/assets/{addspec-1HEtmLv1.js → addspec-DfgIZ5lO.js} +0 -0
- /package/client/dist/assets/{addspec-DfuR6EAl.js → addspec-W0r16BOC2.js} +0 -0
- /package/client/dist/assets/{addspec-DAveBiCE.js → addspec-tbxr3sHa.js} +0 -0
- /package/client/dist/assets/{agentstudio-DCyDW8sy.js → agentstudio-0o3XKrcy.js} +0 -0
- /package/client/dist/assets/{agentstudio-9NbsoGXk.js → agentstudio-Bu8m5jDw.js} +0 -0
- /package/client/dist/assets/{agentstudio-B1y0JWY-.js → agentstudio-C7xxqVWn.js} +0 -0
- /package/client/dist/assets/{agentstudio-1E-bag77.js → agentstudio-D-UoNAIA.js} +0 -0
- /package/client/dist/assets/{agentstudio-B-jQgYV-.js → agentstudio-OJjjz6Uf2.js} +0 -0
- /package/client/dist/assets/{agentstudio-Q0Sq_jTg.js → agentstudio-ObTpVbBP.js} +0 -0
- /package/client/dist/assets/{agentstudio-Bwa72b1S.js → agentstudio-PzFB3vfh2.js} +0 -0
- /package/client/dist/assets/{aiedit-DUpe7NxI.js → aiedit-BIQqv2XM2.js} +0 -0
- /package/client/dist/assets/{aiedit-kAU7KADg.js → aiedit-BaLZalLa.js} +0 -0
- /package/client/dist/assets/{aiedit-CvSspQmE.js → aiedit-BjlUzasF.js} +0 -0
- /package/client/dist/assets/{aiedit-DSLtsYIu.js → aiedit-BmDufyGU.js} +0 -0
- /package/client/dist/assets/{aiedit-qTGI_PGs.js → aiedit-DAM_WRAl2.js} +0 -0
- /package/client/dist/assets/{aiedit-CfBNanHE.js → aiedit-DRrNiaB4.js} +0 -0
- /package/client/dist/assets/{aiedit-CGxeml8D.js → aiedit-sP_iao2j.js} +0 -0
- /package/client/dist/assets/{analytics-CgEkAUiP.js → analytics-BDqqCzN9.js} +0 -0
- /package/client/dist/assets/{analytics-DEsEAJZL.js → analytics-B_rxNC9X.js} +0 -0
- /package/client/dist/assets/{analytics-D1ElChhs.js → analytics-C4z_NgJZ.js} +0 -0
- /package/client/dist/assets/{analytics-DDqve9Ma.js → analytics-DL2vJCbq.js} +0 -0
- /package/client/dist/assets/{analytics-CQqu1yE5.js → analytics-Ds_PNxtO2.js} +0 -0
- /package/client/dist/assets/{analytics-BDlELxc7.js → analytics-MVJRjcY52.js} +0 -0
- /package/client/dist/assets/{analytics-DBGO8B6-.js → analytics-e1mkNTgy2.js} +0 -0
- /package/client/dist/assets/{apex-BHHyAVNb.js → apex-DlD7oJX6.js} +0 -0
- /package/client/dist/assets/{atom-one-dark-DrWoEEbZ.js → atom-one-dark-BrRN8wBy.js} +0 -0
- /package/client/dist/assets/{attachments-BNgH6Tcu.js → attachments-8QCKHCEF2.js} +0 -0
- /package/client/dist/assets/{attachments-BLqqPGyy.js → attachments-BP0Ac1yt.js} +0 -0
- /package/client/dist/assets/{attachments-UJtEq892.js → attachments-CJaO1vCH.js} +0 -0
- /package/client/dist/assets/{attachments-D5fVsMgb.js → attachments-CPBVeHX72.js} +0 -0
- /package/client/dist/assets/{attachments-3CuBBRFu.js → attachments-CV2uaTGE.js} +0 -0
- /package/client/dist/assets/{attachments-CppM7de8.js → attachments-CaOjdN332.js} +0 -0
- /package/client/dist/assets/{attachments-pW3zm9nu.js → attachments-Db7JfA8a.js} +0 -0
- /package/client/dist/assets/{azcli-C56lfIEP.js → azcli-CmXFAbc-.js} +0 -0
- /package/client/dist/assets/{bat-BLamSaf-.js → bat-DdNJq4hH.js} +0 -0
- /package/client/dist/assets/{bicep-lrOcEItS.js → bicep-Bppz7WOA.js} +0 -0
- /package/client/dist/assets/{browser-C__Vz7KR.js → browser-0xeW8fUa2.js} +0 -0
- /package/client/dist/assets/{browser-EFmPpkvO.js → browser-543jbxE4.js} +0 -0
- /package/client/dist/assets/{browser-DhwTc0ry.js → browser-C9rUUxo4.js} +0 -0
- /package/client/dist/assets/{browser-C91MQBxx.js → browser-CEqx11iy.js} +0 -0
- /package/client/dist/assets/{browser-B7i7Ysc8.js → browser-CLC0etB_2.js} +0 -0
- /package/client/dist/assets/{browser-DwE289IS.js → browser-DyG2l9Wa.js} +0 -0
- /package/client/dist/assets/{browser-BVQgd1_1.js → browser-ExmELH702.js} +0 -0
- /package/client/dist/assets/{cameligo-BK_p0bgU.js → cameligo-0MRMdSmg.js} +0 -0
- /package/client/dist/assets/{chat-C5nJF6L0.js → chat-CCytD3P8.js} +0 -0
- /package/client/dist/assets/{chat-UMl6H55K.js → chat-CN8BMAMc.js} +0 -0
- /package/client/dist/assets/{chat-BXVx6rb5.js → chat-Cu6F3d6g2.js} +0 -0
- /package/client/dist/assets/{chat-CE8bx6Rz.js → chat-DagUyoVA.js} +0 -0
- /package/client/dist/assets/{chat-PVakYp92.js → chat-IjutwlBg.js} +0 -0
- /package/client/dist/assets/{chat-9RcD5Lcn.js → chat-NQPCBQo72.js} +0 -0
- /package/client/dist/assets/{chat-BnJPyeUK.js → chat-vVpwkOp52.js} +0 -0
- /package/client/dist/assets/{clojure-BQ7JOykv.js → clojure-B5dKj863.js} +0 -0
- /package/client/dist/assets/{clsx-CjLeUJfG.js → clsx-1dnHRn8W.js} +0 -0
- /package/client/dist/assets/{code-OoLqhjoI.js → code-32l6Naxu2.js} +0 -0
- /package/client/dist/assets/{code-Lg4awa35.js → code-BaG05zK62.js} +0 -0
- /package/client/dist/assets/{code-BPMR8_Vp.js → code-C5cibF2F.js} +0 -0
- /package/client/dist/assets/{code-aCUqkVN_.js → code-Ce-nBIwj.js} +0 -0
- /package/client/dist/assets/{code-BsOBm1Fb.js → code-Dap54vOb.js} +0 -0
- /package/client/dist/assets/{code-u9Sg9ohM.js → code-Dhb6jbAU.js} +0 -0
- /package/client/dist/assets/{code-eh4vO2-_.js → code-_NOCo-Ol2.js} +0 -0
- /package/client/dist/assets/{coffee-BD3DiL5s.js → coffee-DSbWjzk7.js} +0 -0
- /package/client/dist/assets/{common-C9VyfY7g.js → common-0aY9HQBP.js} +0 -0
- /package/client/dist/assets/{common-LDwESeCX.js → common-5jScBJqt.js} +0 -0
- /package/client/dist/assets/{common-ULlk84G4.js → common-BdaRciTu.js} +0 -0
- /package/client/dist/assets/{common-CzCQ0rpW.js → common-CHARW6MZ2.js} +0 -0
- /package/client/dist/assets/{common-CNoRVpnA.js → common-CQCJzAQq2.js} +0 -0
- /package/client/dist/assets/{common-Dmpyh323.js → common-DNhhqjlJ.js} +0 -0
- /package/client/dist/assets/{common-CcHFVATT.js → common-YdyZtmaI2.js} +0 -0
- /package/client/dist/assets/{cpp-splnCwCh.js → cpp-SBF8SAh9.js} +0 -0
- /package/client/dist/assets/{csharp-BCpsl-o3.js → csharp-Lzuq_1t-.js} +0 -0
- /package/client/dist/assets/{csp-tkCWrZmb.js → csp-BEzxZqi1.js} +0 -0
- /package/client/dist/assets/{css-B_xdnReq.js → css-C3D3PKln.js} +0 -0
- /package/client/dist/assets/{cypher-OL1zq-y3.js → cypher-CQ3dEPmv.js} +0 -0
- /package/client/dist/assets/{dart-CtTlOkrm.js → dart-DCPmxolI.js} +0 -0
- /package/client/dist/assets/{dashboard-C52PElPV.js → dashboard-BTiH361F.js} +0 -0
- /package/client/dist/assets/{dashboard-C-dXxut-.js → dashboard-COSm_14E.js} +0 -0
- /package/client/dist/assets/{dashboard-CUjyhohl.js → dashboard-CfOs70FN2.js} +0 -0
- /package/client/dist/assets/{dashboard-zH9quXks.js → dashboard-CzHDp14_2.js} +0 -0
- /package/client/dist/assets/{dashboard-03EpOoMM.js → dashboard-D6Woy2B5.js} +0 -0
- /package/client/dist/assets/{dashboard-C2owt3eN.js → dashboard-DwbH4oVH.js} +0 -0
- /package/client/dist/assets/{dashboard-Ch6H-457.js → dashboard-cWhU3krA2.js} +0 -0
- /package/client/dist/assets/{dockerfile-DcQ5CNiW.js → dockerfile-B_2_aaTO.js} +0 -0
- /package/client/dist/assets/{ecl-DZpiDRt6.js → ecl-rADUeXsV.js} +0 -0
- /package/client/dist/assets/{elixir-Dzj2lqtK.js → elixir-DOd-TuJO.js} +0 -0
- /package/client/dist/assets/{explore-CCcPXrHg.js → explore-B82VMUJ_.js} +0 -0
- /package/client/dist/assets/{explore-DQ0XEjed.js → explore-BGz1rvQE.js} +0 -0
- /package/client/dist/assets/{explore-xQoaak6e.js → explore-BzdMEpuf.js} +0 -0
- /package/client/dist/assets/{explore-B2n8r9Ye.js → explore-CbW0381i2.js} +0 -0
- /package/client/dist/assets/{explore-4SD1DxR0.js → explore-ChtxIiSM.js} +0 -0
- /package/client/dist/assets/{explore-BxR9q8Hq.js → explore-DfcUfiPw2.js} +0 -0
- /package/client/dist/assets/{explore-CZt4Ncpa.js → explore-yRF7wFSp2.js} +0 -0
- /package/client/dist/assets/{flow9-CFENCHIZ.js → flow9-Bf7zg_j0.js} +0 -0
- /package/client/dist/assets/{format-command-CMsBTOPN.js → format-command-D96da4fZ.js} +0 -0
- /package/client/dist/assets/{fsharp-D-4bv7FB.js → fsharp-BqROZjbA.js} +0 -0
- /package/client/dist/assets/{go-djxbTJq7.js → go-oQTP5uLe.js} +0 -0
- /package/client/dist/assets/{graphql-DHIFrkZ6.js → graphql-CSHfTU3q.js} +0 -0
- /package/client/dist/assets/{hcl-CXVoowNb.js → hcl-CeG-RoFJ.js} +0 -0
- /package/client/dist/assets/{ini-Crzc5kly.js → ini-B2Dv4ohc.js} +0 -0
- /package/client/dist/assets/{integrations-C7u7SInG.js → integrations-B0OBPU9_.js} +0 -0
- /package/client/dist/assets/{integrations-B17KyA-i.js → integrations-BA5pM05t.js} +0 -0
- /package/client/dist/assets/{integrations-DkBi-Gsh.js → integrations-BJvrlcc7.js} +0 -0
- /package/client/dist/assets/{integrations-DwSVdCpf.js → integrations-CPKYkG36.js} +0 -0
- /package/client/dist/assets/{integrations-A9f08E0o.js → integrations-CnrX7vqw2.js} +0 -0
- /package/client/dist/assets/{integrations-9qxUNhPD.js → integrations-DBou159M2.js} +0 -0
- /package/client/dist/assets/{integrations-B46ac3sf.js → integrations-DeJFRyXz2.js} +0 -0
- /package/client/dist/assets/{java-CYLaJrdE.js → java-aUDDeufb.js} +0 -0
- /package/client/dist/assets/{jira-Dht8qNck.js → jira-BDgxAFTF2.js} +0 -0
- /package/client/dist/assets/{jira-4Fin3fu7.js → jira-BwLBgmfI2.js} +0 -0
- /package/client/dist/assets/{jira-0ldfMByG.js → jira-D3GGzXOI.js} +0 -0
- /package/client/dist/assets/{jira-BpnpUFlb.js → jira-DeotPx6P2.js} +0 -0
- /package/client/dist/assets/{jira-DzIVvNmy.js → jira-NwlUCcQD.js} +0 -0
- /package/client/dist/assets/{jira-CBU0200d.js → jira-Srx2P5zS.js} +0 -0
- /package/client/dist/assets/{jira-01H1RfQj.js → jira-mi37H4Kt.js} +0 -0
- /package/client/dist/assets/{jobs-jEQidSIb.js → jobs-B56vQEkh2.js} +0 -0
- /package/client/dist/assets/{jobs-DM9owF1j.js → jobs-BYIk6Tg_.js} +0 -0
- /package/client/dist/assets/{jobs-Bw4hqEro.js → jobs-C-lM-iax2.js} +0 -0
- /package/client/dist/assets/{jobs-BF9raUkL.js → jobs-CYdevGgT.js} +0 -0
- /package/client/dist/assets/{jobs-ym72SIR9.js → jobs-D8adm2BX.js} +0 -0
- /package/client/dist/assets/{jobs-DcCONARH.js → jobs-K_Y8KAZ2.js} +0 -0
- /package/client/dist/assets/{jobs-Oz3UtLQn.js → jobs-OwM0ZWhI2.js} +0 -0
- /package/client/dist/assets/{julia-BJ7tUU-T.js → julia-C5LbruO5.js} +0 -0
- /package/client/dist/assets/{kotlin-CeWcU3lC.js → kotlin-C6mOuSKk.js} +0 -0
- /package/client/dist/assets/{less-CviwWNG4.js → less-D5qC3caW.js} +0 -0
- /package/client/dist/assets/{lexon-Dt28jqDS.js → lexon-Dr2La-fj.js} +0 -0
- /package/client/dist/assets/{loops-DE-2cmLw.js → loops-BDhEfnx82.js} +0 -0
- /package/client/dist/assets/{loops-mcoeFMat.js → loops-BM5QggwH.js} +0 -0
- /package/client/dist/assets/{loops-D_ZxkD4l.js → loops-CPjLAAxj.js} +0 -0
- /package/client/dist/assets/{loops-BYNUJVyD.js → loops-DKnk79TB2.js} +0 -0
- /package/client/dist/assets/{loops-B_gS4Pqu.js → loops-DLW0aFMm.js} +0 -0
- /package/client/dist/assets/{loops-Fv4Bs-9A.js → loops-Dcv3dFy_2.js} +0 -0
- /package/client/dist/assets/{loops-B_w7STrw.js → loops-y7wFRx6M.js} +0 -0
- /package/client/dist/assets/{lua-B6AOaJSi.js → lua-Zy6u5z6Z.js} +0 -0
- /package/client/dist/assets/{m3-VnMkHJcy.js → m3-C7XHeDz_.js} +0 -0
- /package/client/dist/assets/{markdown-8vKNdvIM.js → markdown-PiF7r-2h.js} +0 -0
- /package/client/dist/assets/{mips-DoEcuzan.js → mips-nn07GiyE.js} +0 -0
- /package/client/dist/assets/{msdax-CNzvHyEp.js → msdax-DaKFVMST.js} +0 -0
- /package/client/dist/assets/{mysql-Buk3vUtL.js → mysql-C6d6xrbU.js} +0 -0
- /package/client/dist/assets/{nav-Cw3_40fA.js → nav-1hj2izqB2.js} +0 -0
- /package/client/dist/assets/{nav-DNDJ3H-_.js → nav-BBUKMAu-2.js} +0 -0
- /package/client/dist/assets/{nav-CrG_mYRr.js → nav-CLqkP-26.js} +0 -0
- /package/client/dist/assets/{nav-DVp1nEsi.js → nav-Cv46L837.js} +0 -0
- /package/client/dist/assets/{nav-DbAbG5_k.js → nav-DgA-rjLk2.js} +0 -0
- /package/client/dist/assets/{nav-B5W9IMnf.js → nav-EG2pr6vN.js} +0 -0
- /package/client/dist/assets/{nav-_0vAgZ_k.js → nav-r3mIJVfU.js} +0 -0
- /package/client/dist/assets/{objective-c-DfOmda-5.js → objective-c-B6KMtI-k.js} +0 -0
- /package/client/dist/assets/{pascal-DoAA2yjy.js → pascal-DYr8MPE7.js} +0 -0
- /package/client/dist/assets/{pascaligo-C65Vn1fu.js → pascaligo-B3pd-jJ_.js} +0 -0
- /package/client/dist/assets/{perl-INlfQ_ro.js → perl-z2xUzoaL.js} +0 -0
- /package/client/dist/assets/{pgsql-DtwRzglx.js → pgsql-DUvT-09-.js} +0 -0
- /package/client/dist/assets/{php-DfHqVNet.js → php-CGyOmJfy.js} +0 -0
- /package/client/dist/assets/{pla-D3dNVRYk.js → pla-CMqgvyD0.js} +0 -0
- /package/client/dist/assets/{postiats-UKXD1rM4.js → postiats-Dx5LUn4Z.js} +0 -0
- /package/client/dist/assets/{powerquery-zE3E3O7s.js → powerquery-DazYxvJ6.js} +0 -0
- /package/client/dist/assets/{powershell-Df9b3zQl.js → powershell-B3nwlDka.js} +0 -0
- /package/client/dist/assets/{protobuf-BF0nUVrW.js → protobuf-BGuu2u2s.js} +0 -0
- /package/client/dist/assets/{pug-Bj6Yikv_.js → pug-Dbte1MXA.js} +0 -0
- /package/client/dist/assets/{qsharp-BI4h-raZ.js → qsharp-DJLwBOvG.js} +0 -0
- /package/client/dist/assets/{r-DhpnmaXx.js → r-DmGBRSHj.js} +0 -0
- /package/client/dist/assets/{redis-DwYYPr4d.js → redis-VvUYn0a4.js} +0 -0
- /package/client/dist/assets/{redshift-D2f3Bc-4.js → redshift-6GdDrxg3.js} +0 -0
- /package/client/dist/assets/{restructuredtext-Dkiif6fe.js → restructuredtext-CfAB8aRU.js} +0 -0
- /package/client/dist/assets/{ruby-C6hLmHy0.js → ruby-CIYK6MXY.js} +0 -0
- /package/client/dist/assets/{rust-X8WAGtxB.js → rust-CTHZfjj9.js} +0 -0
- /package/client/dist/assets/{sb-4M2la0Kr.js → sb-CkKTdkz_.js} +0 -0
- /package/client/dist/assets/{scala-CaCXz58E.js → scala-Bx-Wr9TM.js} +0 -0
- /package/client/dist/assets/{scheme-CMdjpmP7.js → scheme-Dcfi6f83.js} +0 -0
- /package/client/dist/assets/{scss-QopmvPyp.js → scss-ByL-7PFQ.js} +0 -0
- /package/client/dist/assets/{shell-CDBchS00.js → shell-Csnb9Yqd.js} +0 -0
- /package/client/dist/assets/{solidity-DvBfi5mC.js → solidity-Dbw5-0QP.js} +0 -0
- /package/client/dist/assets/{sophia-HSnXR17u.js → sophia-ZQ3saZQx.js} +0 -0
- /package/client/dist/assets/{sparql-DhG_ppup.js → sparql-BEtOel8u.js} +0 -0
- /package/client/dist/assets/{specs-CUE3xSFM.js → specs-B5XOoH-02.js} +0 -0
- /package/client/dist/assets/{specs-C2wW5bq8.js → specs-B8mwScoM2.js} +0 -0
- /package/client/dist/assets/{specs-Bku8SypT.js → specs-Bj_3fDrQ.js} +0 -0
- /package/client/dist/assets/{specs-CnH7dOiF.js → specs-CWNKAScX2.js} +0 -0
- /package/client/dist/assets/{specs-BvsFNKTs.js → specs-D4z5d8uq.js} +0 -0
- /package/client/dist/assets/{specs-D4ORogcT.js → specs-DgvIRZtM.js} +0 -0
- /package/client/dist/assets/{specs-D6Y76Bgi.js → specs-DuRzE5wE.js} +0 -0
- /package/client/dist/assets/{sql-DHeIS-tf.js → sql-DGPDbzB7.js} +0 -0
- /package/client/dist/assets/{st-CMWchiRU.js → st-GeW2MOgh.js} +0 -0
- /package/client/dist/assets/{swift-CDXvBefj.js → swift-BVYTN8jq.js} +0 -0
- /package/client/dist/assets/{systemverilog-0RTukYUE.js → systemverilog-Deg2a8Lr.js} +0 -0
- /package/client/dist/assets/{tcl-CbBF_Ttl.js → tcl-6DnLmROF.js} +0 -0
- /package/client/dist/assets/{terminal-BLh00ouM.js → terminal-B2sExUis.js} +0 -0
- /package/client/dist/assets/{terminal-Cz_Puz0q.js → terminal-CH0fdHvP.js} +0 -0
- /package/client/dist/assets/{terminal-DFEH9XTQ.js → terminal-CPMigUX7.js} +0 -0
- /package/client/dist/assets/{terminal-CB33IsO1.js → terminal-DOwfkxqa2.js} +0 -0
- /package/client/dist/assets/{terminal-CR6t-Oey.js → terminal-DjSSa5qP.js} +0 -0
- /package/client/dist/assets/{terminal-CY_sPfdD.js → terminal-DoMTHedv2.js} +0 -0
- /package/client/dist/assets/{terminal-BTanJIt_.js → terminal-w0i-OCp32.js} +0 -0
- /package/client/dist/assets/{tickets-D6f3GSYn.js → tickets-CQTana1u.js} +0 -0
- /package/client/dist/assets/{tickets-blQnNA4N.js → tickets-D00mSt832.js} +0 -0
- /package/client/dist/assets/{tickets-68LH1xp6.js → tickets-D7CSuWjO.js} +0 -0
- /package/client/dist/assets/{tickets-OrJwUxJR.js → tickets-Dq7HDy8n.js} +0 -0
- /package/client/dist/assets/{tickets-PtHNxQo5.js → tickets-DvbFg_-c2.js} +0 -0
- /package/client/dist/assets/{tickets-REr-EQx9.js → tickets-heDAaj8C2.js} +0 -0
- /package/client/dist/assets/{tickets-jxsTrApR.js → tickets-onKZz6Dd.js} +0 -0
- /package/client/dist/assets/{twig-DCcGd8FE.js → twig-XbbXW9Yz.js} +0 -0
- /package/client/dist/assets/{typespec-HTphp-Uh.js → typespec-CRlV8GhI.js} +0 -0
- /package/client/dist/assets/{vb-Cb_yUcVd.js → vb-BHE2izPH.js} +0 -0
- /package/client/dist/assets/{wgsl-DrKU3YXj.js → wgsl-Bf5vkfmY.js} +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pluginsTools = pluginsTools;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
/**
|
|
7
|
+
* Plugins (Integrations) domain facade. Per-project marketplace of MCP-based
|
|
8
|
+
* integrations (bundled-only in v1). Maps each action to the matching REST
|
|
9
|
+
* endpoint under `/api/projects/:projectId/plugins`.
|
|
10
|
+
*
|
|
11
|
+
* Excluded by design (v1 out of scope): the `uv` prerequisite installer
|
|
12
|
+
* (`/plugins/_prerequisites/:prereq/install`) and the marketplace
|
|
13
|
+
* global-settings mutation (`/plugins/_marketplace/disable`).
|
|
14
|
+
*/
|
|
15
|
+
function pluginsTools() {
|
|
16
|
+
return [
|
|
17
|
+
{
|
|
18
|
+
name: 'specrails_plugins',
|
|
19
|
+
title: 'Plugins',
|
|
20
|
+
description: 'List and manage a project\'s MCP-based integration plugins (Integrations). ' +
|
|
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), ' +
|
|
23
|
+
'uninstall (destructive — reverts contributors, removes owned mcpServers + installed files, drops state), ' +
|
|
24
|
+
'activate (re-enable an installed-but-off plugin), deactivate (toggle off without uninstalling), ' +
|
|
25
|
+
'update (apply manifest drift — re-merge owned mcpServers + re-apply contributors), ' +
|
|
26
|
+
'health (on-demand verify of an installed plugin).',
|
|
27
|
+
hintTier: 'read',
|
|
28
|
+
tier: (a) => {
|
|
29
|
+
const action = a.action;
|
|
30
|
+
if (action === 'uninstall')
|
|
31
|
+
return 'destructive';
|
|
32
|
+
if (['install', 'activate', 'deactivate', 'update'].includes(action))
|
|
33
|
+
return 'write';
|
|
34
|
+
return 'read';
|
|
35
|
+
},
|
|
36
|
+
inputSchema: {
|
|
37
|
+
action: zod_1.z
|
|
38
|
+
.enum(['list', 'preview', 'install', 'uninstall', 'activate', 'deactivate', 'update', 'health'])
|
|
39
|
+
.describe('Operation to perform'),
|
|
40
|
+
projectId: zod_1.z.string().optional().describe('Project id (defaults to the active project)'),
|
|
41
|
+
name: zod_1.z
|
|
42
|
+
.string()
|
|
43
|
+
.optional()
|
|
44
|
+
.describe('Bundled plugin name (required for preview/install/uninstall/activate/deactivate/update/health)'),
|
|
45
|
+
},
|
|
46
|
+
async handler(ctx, args) {
|
|
47
|
+
const base = `${(0, types_1.projectPath)(ctx, args.projectId)}/plugins`;
|
|
48
|
+
const action = args.action;
|
|
49
|
+
const name = args.name;
|
|
50
|
+
const requireName = () => {
|
|
51
|
+
if (!name)
|
|
52
|
+
throw new Error(`Action "${action}" requires a "name" (bundled plugin name).`);
|
|
53
|
+
return encodeURIComponent(name);
|
|
54
|
+
};
|
|
55
|
+
switch (action) {
|
|
56
|
+
case 'list':
|
|
57
|
+
return (0, types_1.apiCall)(ctx, 'GET', base);
|
|
58
|
+
case 'preview':
|
|
59
|
+
return (0, types_1.apiCall)(ctx, 'GET', `${base}/${requireName()}/preview-install`);
|
|
60
|
+
case 'install': {
|
|
61
|
+
const r = await (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/install`);
|
|
62
|
+
return {
|
|
63
|
+
...(typeof r === 'object' && r !== null ? r : { result: r }),
|
|
64
|
+
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
|
+
};
|
|
66
|
+
}
|
|
67
|
+
case 'uninstall':
|
|
68
|
+
return (0, types_1.apiCall)(ctx, 'DELETE', `${base}/${requireName()}`);
|
|
69
|
+
case 'activate':
|
|
70
|
+
return (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/activate`);
|
|
71
|
+
case 'deactivate':
|
|
72
|
+
return (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/deactivate`);
|
|
73
|
+
case 'update':
|
|
74
|
+
return (0, types_1.apiCall)(ctx, 'POST', `${base}/${requireName()}/update`);
|
|
75
|
+
case 'health':
|
|
76
|
+
return (0, types_1.apiCall)(ctx, 'GET', `${base}/${requireName()}/health`);
|
|
77
|
+
default:
|
|
78
|
+
throw new Error(`Unknown action "${action}".`);
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serializeProject = serializeProject;
|
|
4
|
+
exports.projectsTools = projectsTools;
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const types_1 = require("./types");
|
|
7
|
+
function serializeProject(p) {
|
|
8
|
+
return {
|
|
9
|
+
id: p.id,
|
|
10
|
+
slug: p.slug,
|
|
11
|
+
name: p.name,
|
|
12
|
+
path: p.path,
|
|
13
|
+
provider: p.provider,
|
|
14
|
+
providers: p.providers,
|
|
15
|
+
addedAt: p.added_at,
|
|
16
|
+
lastSeenAt: p.last_seen_at,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function projectsTools() {
|
|
20
|
+
return [
|
|
21
|
+
{
|
|
22
|
+
name: 'specrails_projects',
|
|
23
|
+
title: 'Projects',
|
|
24
|
+
description: 'List and inspect registered Specrails projects, resolve a project by filesystem path, or unregister one. ' +
|
|
25
|
+
'Actions: list, get, resolve (by path), unregister (destructive — removes the project and its workspace).',
|
|
26
|
+
hintTier: 'read',
|
|
27
|
+
tier: (args) => (args.action === 'unregister' ? 'destructive' : 'read'),
|
|
28
|
+
inputSchema: {
|
|
29
|
+
action: zod_1.z.enum(['list', 'get', 'resolve', 'unregister']).describe('Operation to perform'),
|
|
30
|
+
projectId: zod_1.z.string().optional().describe('Project id (for get / unregister)'),
|
|
31
|
+
path: zod_1.z.string().optional().describe('Filesystem path (for resolve)'),
|
|
32
|
+
},
|
|
33
|
+
handler: (ctx, args) => {
|
|
34
|
+
const action = args.action;
|
|
35
|
+
switch (action) {
|
|
36
|
+
case 'list':
|
|
37
|
+
return ctx.registry.listContexts().map((c) => serializeProject(c.project));
|
|
38
|
+
case 'get':
|
|
39
|
+
return serializeProject((0, types_1.requireProject)(ctx, args.projectId).project);
|
|
40
|
+
case 'resolve': {
|
|
41
|
+
const p = args.path;
|
|
42
|
+
if (!p)
|
|
43
|
+
throw new Error('resolve requires a "path".');
|
|
44
|
+
const pc = ctx.registry.getContextByPath(p);
|
|
45
|
+
return pc ? serializeProject(pc.project) : { resolved: false };
|
|
46
|
+
}
|
|
47
|
+
case 'unregister': {
|
|
48
|
+
const id = args.projectId;
|
|
49
|
+
if (!id)
|
|
50
|
+
throw new Error('unregister requires a "projectId".');
|
|
51
|
+
if (!ctx.registry.getContext(id))
|
|
52
|
+
throw new Error(`Unknown projectId "${id}".`);
|
|
53
|
+
ctx.registry.removeProject(id);
|
|
54
|
+
return { ok: true, unregistered: id };
|
|
55
|
+
}
|
|
56
|
+
default:
|
|
57
|
+
throw new Error(`Unknown action "${action}".`);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.railsTools = railsTools;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
/**
|
|
7
|
+
* Rails domain facade. A "rail" is a numbered launch slot per project: it holds
|
|
8
|
+
* a set of assigned ticket IDs plus a mode/profile/engine/name, and launching it
|
|
9
|
+
* spawns the AI pipeline (claude/codex/gemini) over those tickets.
|
|
10
|
+
*
|
|
11
|
+
* Every operation is per-project under /api/projects/:projectId/rails. The
|
|
12
|
+
* launch action is the only cost-incurring / repo-mutating one (ai-spawn, 202);
|
|
13
|
+
* stop is destructive (kills running child process trees + cancels queued jobs).
|
|
14
|
+
*/
|
|
15
|
+
function railsTools() {
|
|
16
|
+
return [
|
|
17
|
+
{
|
|
18
|
+
name: 'specrails_rails',
|
|
19
|
+
title: 'Rails',
|
|
20
|
+
description: 'List and configure a project\'s rail launch slots, then launch or stop the AI pipeline for a rail. ' +
|
|
21
|
+
'A rail holds assigned ticket IDs plus a mode/profile/engine/name. ' +
|
|
22
|
+
'Actions: list (rails + active jobs/loop runs), set_tickets (assign ticket IDs), set_profile (default agent profile, null=legacy), ' +
|
|
23
|
+
'set_engine (provider override, null=primary), set_name (display label, null clears), ' +
|
|
24
|
+
'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), ' +
|
|
25
|
+
'stop (destructive — kills all active jobs and loop runs for the rail).',
|
|
26
|
+
hintTier: 'read',
|
|
27
|
+
tier: (a) => {
|
|
28
|
+
const action = a.action;
|
|
29
|
+
if (action === 'stop')
|
|
30
|
+
return 'destructive';
|
|
31
|
+
if (action === 'launch')
|
|
32
|
+
return 'ai-spawn';
|
|
33
|
+
if (action === 'set_tickets' || action === 'set_profile' || action === 'set_engine' || action === 'set_name')
|
|
34
|
+
return 'write';
|
|
35
|
+
return 'read';
|
|
36
|
+
},
|
|
37
|
+
inputSchema: {
|
|
38
|
+
action: zod_1.z
|
|
39
|
+
.enum(['list', 'set_tickets', 'set_profile', 'set_engine', 'set_name', 'launch', 'stop'])
|
|
40
|
+
.describe('Operation to perform'),
|
|
41
|
+
projectId: zod_1.z.string().optional().describe('Project id (defaults to the active project)'),
|
|
42
|
+
railIndex: zod_1.z
|
|
43
|
+
.number()
|
|
44
|
+
.int()
|
|
45
|
+
.min(0)
|
|
46
|
+
.optional()
|
|
47
|
+
.describe('Rail slot index (required for every action except list)'),
|
|
48
|
+
// set_tickets
|
|
49
|
+
ticketIds: zod_1.z
|
|
50
|
+
.array(zod_1.z.number().int())
|
|
51
|
+
.optional()
|
|
52
|
+
.describe('Ticket IDs to assign to the rail (set_tickets — replaces the existing set)'),
|
|
53
|
+
// set_profile
|
|
54
|
+
profileName: zod_1.z
|
|
55
|
+
.string()
|
|
56
|
+
.nullable()
|
|
57
|
+
.optional()
|
|
58
|
+
.describe('Agent profile name; null forces legacy/no-profile mode (set_profile; also optional override for launch)'),
|
|
59
|
+
// set_engine / launch
|
|
60
|
+
aiEngine: zod_1.z
|
|
61
|
+
.string()
|
|
62
|
+
.nullable()
|
|
63
|
+
.optional()
|
|
64
|
+
.describe('AI engine/provider override; null = project primary (set_engine; also optional override for launch). Must be an installed provider.'),
|
|
65
|
+
// set_name
|
|
66
|
+
name: zod_1.z
|
|
67
|
+
.string()
|
|
68
|
+
.nullable()
|
|
69
|
+
.optional()
|
|
70
|
+
.describe('Rail display label (<=60 chars); null/empty clears to default (set_name)'),
|
|
71
|
+
// launch
|
|
72
|
+
mode: zod_1.z
|
|
73
|
+
.enum(['implement', 'batch-implement', 'ultracode', 'loop'])
|
|
74
|
+
.optional()
|
|
75
|
+
.describe('Launch mode (launch; default "implement"). ultracode is Claude-only and runs one job per ticket; loop runs an app-driven loop per ticket.'),
|
|
76
|
+
model: zod_1.z
|
|
77
|
+
.enum(['haiku', 'sonnet', 'opus'])
|
|
78
|
+
.optional()
|
|
79
|
+
.describe('Ultracode Claude model (launch, ultracode mode only). For loop mode, a provider-valid model string.'),
|
|
80
|
+
interactive: zod_1.z
|
|
81
|
+
.boolean()
|
|
82
|
+
.optional()
|
|
83
|
+
.describe('Interactive ultracode session (launch, ultracode + Claude only; requires the interactive-jobs feature)'),
|
|
84
|
+
loopId: zod_1.z
|
|
85
|
+
.string()
|
|
86
|
+
.optional()
|
|
87
|
+
.describe('Loop id to run (launch). Factory ids (e.g. "factory:implement") map to a legacy mode; a custom published loop id keeps mode="loop".'),
|
|
88
|
+
reasoning_effort: zod_1.z
|
|
89
|
+
.enum(['low', 'medium', 'high'])
|
|
90
|
+
.optional()
|
|
91
|
+
.describe('Reasoning-effort tier for loop launches (launch, loop mode)'),
|
|
92
|
+
},
|
|
93
|
+
async handler(ctx, args) {
|
|
94
|
+
const base = `${(0, types_1.projectPath)(ctx, args.projectId)}/rails`;
|
|
95
|
+
const action = args.action;
|
|
96
|
+
const requireRailIndex = () => {
|
|
97
|
+
const idx = args.railIndex;
|
|
98
|
+
if (typeof idx !== 'number' || !Number.isInteger(idx) || idx < 0) {
|
|
99
|
+
throw new Error(`Action "${action}" requires a non-negative integer "railIndex".`);
|
|
100
|
+
}
|
|
101
|
+
return idx;
|
|
102
|
+
};
|
|
103
|
+
switch (action) {
|
|
104
|
+
case 'list':
|
|
105
|
+
return (0, types_1.apiCall)(ctx, 'GET', base);
|
|
106
|
+
case 'set_tickets': {
|
|
107
|
+
const railIndex = requireRailIndex();
|
|
108
|
+
const ticketIds = args.ticketIds;
|
|
109
|
+
if (!Array.isArray(ticketIds)) {
|
|
110
|
+
throw new Error('set_tickets requires "ticketIds" (an array of numbers).');
|
|
111
|
+
}
|
|
112
|
+
const body = { ticketIds };
|
|
113
|
+
if (args.mode !== undefined)
|
|
114
|
+
body.mode = args.mode;
|
|
115
|
+
if ('profileName' in args && args.profileName !== undefined)
|
|
116
|
+
body.profileName = args.profileName;
|
|
117
|
+
if ('aiEngine' in args && args.aiEngine !== undefined)
|
|
118
|
+
body.aiEngine = args.aiEngine;
|
|
119
|
+
return (0, types_1.apiCall)(ctx, 'PUT', `${base}/${railIndex}/tickets`, body);
|
|
120
|
+
}
|
|
121
|
+
case 'set_profile': {
|
|
122
|
+
const railIndex = requireRailIndex();
|
|
123
|
+
if (!('profileName' in args)) {
|
|
124
|
+
throw new Error('set_profile requires "profileName" (string or null).');
|
|
125
|
+
}
|
|
126
|
+
return (0, types_1.apiCall)(ctx, 'PUT', `${base}/${railIndex}/profile`, {
|
|
127
|
+
profileName: (args.profileName ?? null),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
case 'set_engine': {
|
|
131
|
+
const railIndex = requireRailIndex();
|
|
132
|
+
if (!('aiEngine' in args)) {
|
|
133
|
+
throw new Error('set_engine requires "aiEngine" (string or null).');
|
|
134
|
+
}
|
|
135
|
+
return (0, types_1.apiCall)(ctx, 'PUT', `${base}/${railIndex}/engine`, {
|
|
136
|
+
aiEngine: (args.aiEngine ?? null),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
case 'set_name': {
|
|
140
|
+
const railIndex = requireRailIndex();
|
|
141
|
+
if (!('name' in args)) {
|
|
142
|
+
throw new Error('set_name requires "name" (string or null).');
|
|
143
|
+
}
|
|
144
|
+
return (0, types_1.apiCall)(ctx, 'PUT', `${base}/${railIndex}/name`, {
|
|
145
|
+
name: (args.name ?? null),
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
case 'launch': {
|
|
149
|
+
const railIndex = requireRailIndex();
|
|
150
|
+
const body = {};
|
|
151
|
+
if (args.mode !== undefined)
|
|
152
|
+
body.mode = args.mode;
|
|
153
|
+
if ('profileName' in args && args.profileName !== undefined)
|
|
154
|
+
body.profileName = args.profileName;
|
|
155
|
+
if ('aiEngine' in args && args.aiEngine !== undefined)
|
|
156
|
+
body.aiEngine = args.aiEngine;
|
|
157
|
+
if (args.model !== undefined)
|
|
158
|
+
body.model = args.model;
|
|
159
|
+
if (args.interactive !== undefined)
|
|
160
|
+
body.interactive = args.interactive;
|
|
161
|
+
if (args.loopId !== undefined)
|
|
162
|
+
body.loopId = args.loopId;
|
|
163
|
+
if (args.reasoning_effort !== undefined)
|
|
164
|
+
body.reasoning_effort = args.reasoning_effort;
|
|
165
|
+
const r = await (0, types_1.apiCall)(ctx, 'POST', `${base}/${railIndex}/launch`, body);
|
|
166
|
+
return {
|
|
167
|
+
...r,
|
|
168
|
+
hint: 'Launch accepted (202). Use specrails_watch with the returned jobId/jobIds (or loopRunIds for loop mode) to await completion. Live output streams over the job WS.',
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
case 'stop': {
|
|
172
|
+
const railIndex = requireRailIndex();
|
|
173
|
+
return (0, types_1.apiCall)(ctx, 'POST', `${base}/${railIndex}/stop`);
|
|
174
|
+
}
|
|
175
|
+
default:
|
|
176
|
+
throw new Error(`Unknown action "${action}".`);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
];
|
|
181
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setupTools = setupTools;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
/**
|
|
7
|
+
* The setup-wizard domain facade. Mixes APP-LEVEL operations (prerequisites,
|
|
8
|
+
* available_providers, add_project — mounted at `/api` with NO `:projectId`)
|
|
9
|
+
* with PER-PROJECT operations (install-config, install, checkpoints, abort,
|
|
10
|
+
* integration-contract — under `/api/projects/:projectId/*`).
|
|
11
|
+
*
|
|
12
|
+
* QUICK-only: the agent path provisions the quick (offline) tier and installs
|
|
13
|
+
* every registered provider in ONE `install` call (the server chains them). The
|
|
14
|
+
* legacy full/enrich AI flow is intentionally NOT exposed through the MCP.
|
|
15
|
+
*
|
|
16
|
+
* LIFECYCLE the caller must respect:
|
|
17
|
+
* 1. prerequisites → must be ok before adding a project
|
|
18
|
+
* 2. add_project → creates the ProjectContext + slug + registry mirror + workspace
|
|
19
|
+
* 3. install_config (one POST per provider for multi-provider projects; tier forced to quick)
|
|
20
|
+
* 4. install → 202 async; installs ALL providers; result arrives via WS / checkpoints
|
|
21
|
+
* 5. poll checkpoints (or stream WS) until isInstalling === false
|
|
22
|
+
*
|
|
23
|
+
* The async `install` action returns immediately (HTTP 202) and does the real,
|
|
24
|
+
* long-running work in a detached child whose only output channel is WebSocket —
|
|
25
|
+
* so it returns a hint to poll `checkpoints` (which also exposes
|
|
26
|
+
* isInstalling/logLines/summary) for true completion.
|
|
27
|
+
*/
|
|
28
|
+
function setupTools() {
|
|
29
|
+
return [
|
|
30
|
+
{
|
|
31
|
+
name: 'specrails_setup',
|
|
32
|
+
title: 'Setup & Project Provisioning',
|
|
33
|
+
description: 'Add and provision Specrails projects via the setup wizard, and inspect setup prerequisites/providers. ' +
|
|
34
|
+
'App-level actions ignore projectId: prerequisites (probe node/npm/npx/git + provider CLIs), ' +
|
|
35
|
+
'available_providers (which AI CLIs are detected + install tiers), add_project (register a repo path). ' +
|
|
36
|
+
'Per-project actions: install_config (persist install-config.yaml), install (spawn offline framework scaffold — async/202), ' +
|
|
37
|
+
'checkpoints (poll live setup/install state — the canonical completion signal when not streaming WS), ' +
|
|
38
|
+
'abort (SIGTERM/SIGKILL the in-progress install child), integration_contract (read the ticket-provider contract). ' +
|
|
39
|
+
'Install is QUICK-only and provisions every registered provider in one shot; the legacy full/enrich AI flow is not exposed here.',
|
|
40
|
+
hintTier: 'read',
|
|
41
|
+
tier: (a) => {
|
|
42
|
+
const action = a.action;
|
|
43
|
+
if (action === 'abort')
|
|
44
|
+
return 'destructive';
|
|
45
|
+
if (action === 'install')
|
|
46
|
+
return 'ai-spawn';
|
|
47
|
+
if (action === 'add_project' || action === 'install_config')
|
|
48
|
+
return 'write';
|
|
49
|
+
return 'read';
|
|
50
|
+
},
|
|
51
|
+
inputSchema: {
|
|
52
|
+
action: zod_1.z
|
|
53
|
+
.enum([
|
|
54
|
+
'prerequisites',
|
|
55
|
+
'available_providers',
|
|
56
|
+
'add_project',
|
|
57
|
+
'install_config',
|
|
58
|
+
'install',
|
|
59
|
+
'checkpoints',
|
|
60
|
+
'abort',
|
|
61
|
+
'integration_contract',
|
|
62
|
+
])
|
|
63
|
+
.describe('Setup operation to perform'),
|
|
64
|
+
projectId: zod_1.z
|
|
65
|
+
.string()
|
|
66
|
+
.optional()
|
|
67
|
+
.describe('Project id for per-project actions (install_config/install/checkpoints/abort/integration_contract). Ignored by app-level actions.'),
|
|
68
|
+
// prerequisites
|
|
69
|
+
diagnostic: zod_1.z
|
|
70
|
+
.boolean()
|
|
71
|
+
.optional()
|
|
72
|
+
.describe('prerequisites: when true, include the resolved PATH segments/sources + per-tool which results'),
|
|
73
|
+
// add_project
|
|
74
|
+
path: zod_1.z
|
|
75
|
+
.string()
|
|
76
|
+
.optional()
|
|
77
|
+
.describe('add_project: filesystem path of the repo to register (required for add_project)'),
|
|
78
|
+
name: zod_1.z
|
|
79
|
+
.string()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('add_project: display name (defaults to the directory basename)'),
|
|
82
|
+
provider: zod_1.z
|
|
83
|
+
.string()
|
|
84
|
+
.optional()
|
|
85
|
+
.describe('add_project: legacy single primary provider; install: which per-provider install-config to read'),
|
|
86
|
+
providers: zod_1.z
|
|
87
|
+
.array(zod_1.z.string())
|
|
88
|
+
.optional()
|
|
89
|
+
.describe('add_project: providers to install (first = primary/default); de-duped server-side'),
|
|
90
|
+
// install_config
|
|
91
|
+
config: zod_1.z
|
|
92
|
+
.record(zod_1.z.unknown())
|
|
93
|
+
.optional()
|
|
94
|
+
.describe('install_config: the install-config object to serialize (e.g. { tier:"quick", provider, agents }); required for install_config'),
|
|
95
|
+
},
|
|
96
|
+
async handler(ctx, args) {
|
|
97
|
+
const action = args.action;
|
|
98
|
+
switch (action) {
|
|
99
|
+
// ─── App-level (no projectId) ───────────────────────────────────────
|
|
100
|
+
case 'prerequisites': {
|
|
101
|
+
const qs = args.diagnostic === true ? '?diagnostic=1' : '';
|
|
102
|
+
return (0, types_1.apiCall)(ctx, 'GET', `/setup-prerequisites${qs}`);
|
|
103
|
+
}
|
|
104
|
+
case 'available_providers':
|
|
105
|
+
return (0, types_1.apiCall)(ctx, 'GET', '/available-providers');
|
|
106
|
+
case 'add_project': {
|
|
107
|
+
const path = args.path;
|
|
108
|
+
if (!path)
|
|
109
|
+
throw new Error('add_project requires a "path".');
|
|
110
|
+
const body = { path };
|
|
111
|
+
if (typeof args.name === 'string')
|
|
112
|
+
body.name = args.name;
|
|
113
|
+
if (typeof args.provider === 'string')
|
|
114
|
+
body.provider = args.provider;
|
|
115
|
+
if (Array.isArray(args.providers))
|
|
116
|
+
body.providers = args.providers;
|
|
117
|
+
return (0, types_1.apiCall)(ctx, 'POST', '/projects', body);
|
|
118
|
+
}
|
|
119
|
+
// ─── Per-project ────────────────────────────────────────────────────
|
|
120
|
+
case 'install_config': {
|
|
121
|
+
const base = (0, types_1.projectPath)(ctx, args.projectId);
|
|
122
|
+
const config = args.config;
|
|
123
|
+
if (config === undefined || typeof config !== 'object' || Array.isArray(config)) {
|
|
124
|
+
throw new Error('install_config requires a "config" object.');
|
|
125
|
+
}
|
|
126
|
+
// The MCP/agent path is QUICK-only — force the tier so a full/enrich
|
|
127
|
+
// install can never be provisioned through the agent (deprecated).
|
|
128
|
+
const quickConfig = { ...config, tier: 'quick' };
|
|
129
|
+
return (0, types_1.apiCall)(ctx, 'POST', `${base}/setup/install-config`, quickConfig);
|
|
130
|
+
}
|
|
131
|
+
case 'install': {
|
|
132
|
+
const base = (0, types_1.projectPath)(ctx, args.projectId);
|
|
133
|
+
// Quick-only, all-provider install: by default provision EVERY provider
|
|
134
|
+
// the project is registered with in one shot (server chains them). An
|
|
135
|
+
// explicit `providers` list narrows it; a single `provider` still works.
|
|
136
|
+
const body = {};
|
|
137
|
+
if (Array.isArray(args.providers))
|
|
138
|
+
body.providers = args.providers;
|
|
139
|
+
else if (typeof args.provider === 'string')
|
|
140
|
+
body.provider = args.provider;
|
|
141
|
+
else
|
|
142
|
+
body.all = true;
|
|
143
|
+
const r = await (0, types_1.apiCall)(ctx, 'POST', `${base}/setup/install`, body);
|
|
144
|
+
return {
|
|
145
|
+
...(typeof r === 'object' && r !== null ? r : { result: r }),
|
|
146
|
+
hint: 'Install is async (HTTP 202). Installs ALL registered providers (quick tier) in one shot; poll specrails_setup(checkpoints) until isInstalling === false, or stream the setup_install_done / setup_error WS events.',
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
case 'checkpoints': {
|
|
150
|
+
const base = (0, types_1.projectPath)(ctx, args.projectId);
|
|
151
|
+
return (0, types_1.apiCall)(ctx, 'GET', `${base}/setup/checkpoints`);
|
|
152
|
+
}
|
|
153
|
+
case 'abort': {
|
|
154
|
+
const base = (0, types_1.projectPath)(ctx, args.projectId);
|
|
155
|
+
return (0, types_1.apiCall)(ctx, 'POST', `${base}/setup/abort`, {});
|
|
156
|
+
}
|
|
157
|
+
case 'integration_contract': {
|
|
158
|
+
const base = (0, types_1.projectPath)(ctx, args.projectId);
|
|
159
|
+
return (0, types_1.apiCall)(ctx, 'GET', `${base}/integration-contract`);
|
|
160
|
+
}
|
|
161
|
+
default:
|
|
162
|
+
throw new Error(`Unknown action "${action}".`);
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
];
|
|
167
|
+
}
|