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.
Files changed (424) hide show
  1. package/client/dist/assets/{ActivityFeedPage-C_clKk8d.js → ActivityFeedPage-mGnv5SOe.js} +1 -1
  2. package/client/dist/assets/AgentsPage-BH1isg5j.js +86 -0
  3. package/client/dist/assets/AnalyticsPage-ByyshYRI.js +1 -0
  4. package/client/dist/assets/{BarChart-Dq1h8eYR.js → BarChart-BqHUOnl9.js} +3 -3
  5. package/client/dist/assets/CodePage-CU7T_HYs.js +2 -0
  6. package/client/dist/assets/{DesktopAnalyticsPage-CYhXhJoQ.js → DesktopAnalyticsPage-CR-m97Ui.js} +1 -1
  7. package/client/dist/assets/DocsDialog-CEmZp_8V.js +11 -0
  8. package/client/dist/assets/DocsPage-DYbAQ1AT.js +11 -0
  9. package/client/dist/assets/{ExportDropdown-DdB2ncYh.js → ExportDropdown-C-o1Q4ef.js} +1 -1
  10. package/client/dist/assets/IntegrationsPage-C6fKdwVH.js +3 -0
  11. package/client/dist/assets/JobDetailPage-CKfIfBgE.js +16 -0
  12. package/client/dist/assets/JobsPage-nBng0riZ.js +1 -0
  13. package/client/dist/assets/LoopBuilderPage-Co_TYqYk.js +7 -0
  14. package/client/dist/assets/LoopsPage-a2hd37Ya.js +1 -0
  15. package/client/dist/assets/{activity-Ca2XoBi-.js → activity-D8vQJrpW.js} +1 -1
  16. package/client/dist/assets/{addon-image-biWX2UUm.js → addon-image-Ba-TY3wr.js} +1 -1
  17. package/client/dist/assets/{addon-ligatures-D4EiDb5r.js → addon-ligatures-T4ARLiuu.js} +1 -1
  18. package/client/dist/assets/{addon-webgl-CDCIZQ03.js → addon-webgl-Cd73n8eh.js} +1 -1
  19. package/client/dist/assets/{addspec-DE_VfIyP.js → addspec-BloGn_ey.js} +1 -1
  20. package/client/dist/assets/agent-9WdSxPU5.js +1 -0
  21. package/client/dist/assets/agent-ASIyVcg0.js +1 -0
  22. package/client/dist/assets/agent-Bm2tPrdr.js +1 -0
  23. package/client/dist/assets/agent-C4bO1l_v.js +1 -0
  24. package/client/dist/assets/agent-CgKsh88Z2.js +1 -0
  25. package/client/dist/assets/agent-DMUrz9ZS2.js +1 -0
  26. package/client/dist/assets/agent-Dwkz5mPS.js +1 -0
  27. package/client/dist/assets/agent-pO8x4jbR.js +1 -0
  28. package/client/dist/assets/{agents-DcoUUFZl.js → agents-52t8NVpS.js} +1 -1
  29. package/client/dist/assets/{agents-DCX9D3-Q.js → agents-BAxAwHy-.js} +1 -1
  30. package/client/dist/assets/{agents-Jc-CjBDB.js → agents-BUYBb825.js} +1 -1
  31. package/client/dist/assets/{agents-CIhRSOna.js → agents-BjT_xLjv.js} +1 -1
  32. package/client/dist/assets/{agents-BYjUOrLD.js → agents-C07al8rI.js} +1 -1
  33. package/client/dist/assets/{agents-1lhqEcXH.js → agents-DfGvYtpq2.js} +1 -1
  34. package/client/dist/assets/{agents-CQlu1nOm.js → agents-Dli56gr82.js} +1 -1
  35. package/client/dist/assets/{agents-DVYpVGur.js → agents-Eqw_AQ6H.js} +1 -1
  36. package/client/dist/assets/{agentstudio-DCTpIqOx.js → agentstudio-CZm2rOzt.js} +1 -1
  37. package/client/dist/assets/{aiedit-Dirqf3Bm.js → aiedit-DYtnZU9H.js} +1 -1
  38. package/client/dist/assets/{analytics-BE49LbUk.js → analytics-B4FJ_pry.js} +1 -1
  39. package/client/dist/assets/{attachments-C2JPppoP.js → attachments-Ci6_42Kh.js} +1 -1
  40. package/client/dist/assets/{browser-Dpo_ug4c.js → browser-ZB1afzjZ.js} +1 -1
  41. package/client/dist/assets/{chat-mq1x9cxZ.js → chat-VMflhzxn.js} +1 -1
  42. package/client/dist/assets/chunk-BNv3lrIs.js +1 -0
  43. package/client/dist/assets/{code-DtIatVES.js → code-wtcs0ivb.js} +1 -1
  44. package/client/dist/assets/commands-Bc8y9eNo2.js +1 -0
  45. package/client/dist/assets/commands-Bl3-KVfj.js +1 -0
  46. package/client/dist/assets/commands-C5WQ9blx2.js +1 -0
  47. package/client/dist/assets/commands-CM99Upsz2.js +1 -0
  48. package/client/dist/assets/commands-Cc2WpuXa.js +1 -0
  49. package/client/dist/assets/commands-CckaBWdV.js +1 -0
  50. package/client/dist/assets/commands-DASXJD-l.js +1 -0
  51. package/client/dist/assets/commands-k9wbNYoi.js +1 -0
  52. package/client/dist/assets/{common-kftoE0Q-.js → common-BPQQkgJZ.js} +1 -1
  53. package/client/dist/assets/{cssMode-DSHXamUH.js → cssMode-DsArsSCT.js} +1 -1
  54. package/client/dist/assets/{dashboard-BQ3Oa8CE.js → dashboard-Cyzp4ox9.js} +1 -1
  55. package/client/dist/assets/{dist-js-Ele_sHO7.js → dist-js-BHhtSerX.js} +1 -1
  56. package/client/dist/assets/{dist-js-D27I-bfi.js → dist-js-CUegfF6k.js} +1 -1
  57. package/client/dist/assets/{editor.api2-Cwla1nvV.js → editor.api2-T7u8kQWG.js} +1 -1
  58. package/client/dist/assets/{editor.main-Cd8qBRAT.js → editor.main-G3Sl9C67.js} +2 -2
  59. package/client/dist/assets/{explore-CBYU76JD.js → explore-BKVV5JSu.js} +1 -1
  60. package/client/dist/assets/{freemarker2-CkEKTBm2.js → freemarker2-pBzQNgFi.js} +1 -1
  61. package/client/dist/assets/{handlebars-BRGx0JpL.js → handlebars-CtBTCnBI.js} +1 -1
  62. package/client/dist/assets/{html-BfRIaGgN.js → html-Dx3DYBzY.js} +1 -1
  63. package/client/dist/assets/{htmlMode-BTpSnsDE.js → htmlMode-In7frFOo.js} +1 -1
  64. package/client/dist/assets/index-B0FxQALR.css +2 -0
  65. package/client/dist/assets/index-B7vB20Jw.js +152 -0
  66. package/client/dist/assets/{integrations-jJGaKwff.js → integrations-CuWnMR5L.js} +1 -1
  67. package/client/dist/assets/{javascript-DMmE2kKN.js → javascript-BKcn-YkN.js} +1 -1
  68. package/client/dist/assets/{jira-BwACz875.js → jira-DXMoAKWD.js} +1 -1
  69. package/client/dist/assets/{jobs-DRInW0AE.js → jobs---dwa4Nf.js} +1 -1
  70. package/client/dist/assets/{jsonMode-hYuaUleY.js → jsonMode-jNREoQ3C.js} +1 -1
  71. package/client/dist/assets/{lib-qdRfWwE1.js → lib-PQoHlR5u.js} +2 -2
  72. package/client/dist/assets/{liquid-C-VbuTr7.js → liquid-CtRkGqBu.js} +1 -1
  73. package/client/dist/assets/{loops-DfGadne0.js → loops-D8Iu6Jss.js} +1 -1
  74. package/client/dist/assets/{lspLanguageFeatures-BALx-vjn.js → lspLanguageFeatures-Cl3gvD_W.js} +1 -1
  75. package/client/dist/assets/mcp-B4irfLJ2.js +1 -0
  76. package/client/dist/assets/mcp-B6nwJJmR.js +1 -0
  77. package/client/dist/assets/mcp-BOoEGTSQ.js +1 -0
  78. package/client/dist/assets/mcp-BP7PpbDr2.js +1 -0
  79. package/client/dist/assets/mcp-CIH0pH1K.js +1 -0
  80. package/client/dist/assets/mcp-CNgFiTEh.js +1 -0
  81. package/client/dist/assets/mcp-D3E4_Mmk2.js +1 -0
  82. package/client/dist/assets/mcp-mupPuPDO2.js +1 -0
  83. package/client/dist/assets/{mdx-Cs8MNCzn.js → mdx-B_nJldHz.js} +1 -1
  84. package/client/dist/assets/{monaco.contribution-CIvCAJs4.js → monaco.contribution-PUeaZk8T.js} +2 -2
  85. package/client/dist/assets/{nav-CCz4krPP.js → nav-DE3yWQw6.js} +1 -1
  86. package/client/dist/assets/{python-CGShLxuI.js → python-DS1Ce-A6.js} +1 -1
  87. package/client/dist/assets/{razor-CvOBQGd5.js → razor-L41Qg9OK.js} +1 -1
  88. package/client/dist/assets/settings-BKmORxlB2.js +1 -0
  89. package/client/dist/assets/settings-BVv2JgQ8.js +1 -0
  90. package/client/dist/assets/settings-Bghm3pAV.js +1 -0
  91. package/client/dist/assets/settings-BuC_aplX.js +1 -0
  92. package/client/dist/assets/settings-Bw_Qk8E32.js +1 -0
  93. package/client/dist/assets/settings-CAKgJv7p.js +1 -0
  94. package/client/dist/assets/settings-CEUgk1Ck.js +1 -0
  95. package/client/dist/assets/settings-C_PDE20s2.js +1 -0
  96. package/client/dist/assets/setup-4us-Bz3H.js +1 -0
  97. package/client/dist/assets/setup-BYoDYoPY2.js +1 -0
  98. package/client/dist/assets/setup-Bf9eLKxU.js +1 -0
  99. package/client/dist/assets/setup-C5UbM0RP.js +1 -0
  100. package/client/dist/assets/setup-CqGrWb6G.js +1 -0
  101. package/client/dist/assets/setup-JFkWWZnR.js +1 -0
  102. package/client/dist/assets/setup-faMApo0U2.js +1 -0
  103. package/client/dist/assets/setup-tloaTobG2.js +1 -0
  104. package/client/dist/assets/{specs-C_8j4ELZ.js → specs-BYeAbIEy.js} +1 -1
  105. package/client/dist/assets/{terminal-Cj4HzP3p.js → terminal-DFPNRLKp.js} +1 -1
  106. package/client/dist/assets/{tickets-DBQXMYYA.js → tickets-CkfbISuK.js} +1 -1
  107. package/client/dist/assets/{tsMode-04uOpiiP.js → tsMode-BC1g186U.js} +1 -1
  108. package/client/dist/assets/{typescript-CX0CwyIZ.js → typescript-BGlRGvJW.js} +1 -1
  109. package/client/dist/assets/upload-PnJDPHZH.js +1 -0
  110. package/client/dist/assets/{value-BRVOAvhY.js → value-BTDefcOV.js} +1 -1
  111. package/client/dist/assets/{workers-yr2u4c3C.js → workers-CXcXtO3b.js} +1 -1
  112. package/client/dist/assets/{xml-C0OFlt5X.js → xml-JdZZaIhJ.js} +1 -1
  113. package/client/dist/assets/{yaml-DgabaPs5.js → yaml-Cm82BVBt.js} +1 -1
  114. package/client/dist/index.html +30 -28
  115. package/docs/README.md +2 -0
  116. package/docs/guide/de/integrations/5-mcp-server.md +74 -0
  117. package/docs/guide/de/integrations/6-agent-chat.md +64 -0
  118. package/docs/guide/en/integrations/5-mcp-server.md +74 -0
  119. package/docs/guide/en/integrations/6-agent-chat.md +64 -0
  120. package/docs/guide/es/integrations/5-mcp-server.md +74 -0
  121. package/docs/guide/es/integrations/6-agent-chat.md +64 -0
  122. package/docs/guide/fr/integrations/5-mcp-server.md +74 -0
  123. package/docs/guide/fr/integrations/6-agent-chat.md +64 -0
  124. package/docs/guide/it/integrations/5-mcp-server.md +74 -0
  125. package/docs/guide/it/integrations/6-agent-chat.md +64 -0
  126. package/docs/guide/ja/integrations/5-mcp-server.md +74 -0
  127. package/docs/guide/ja/integrations/6-agent-chat.md +64 -0
  128. package/docs/guide/pt/integrations/5-mcp-server.md +74 -0
  129. package/docs/guide/pt/integrations/6-agent-chat.md +64 -0
  130. package/docs/guide/zh/integrations/5-mcp-server.md +74 -0
  131. package/docs/guide/zh/integrations/6-agent-chat.md +64 -0
  132. package/docs/mcp.md +249 -0
  133. package/package.json +8 -5
  134. package/server/dist/agent-chat-manager.js +224 -0
  135. package/server/dist/agent-chat-router.js +148 -0
  136. package/server/dist/agent-cwd-manager.js +94 -0
  137. package/server/dist/agent-mcp-config.js +208 -0
  138. package/server/dist/agent-store.js +59 -0
  139. package/server/dist/agent-tier.js +86 -0
  140. package/server/dist/desktop-db.js +27 -0
  141. package/server/dist/index.js +38 -0
  142. package/server/dist/mcp/guide.js +82 -0
  143. package/server/dist/mcp/index.js +21 -0
  144. package/server/dist/mcp/mcp-admin-router.js +71 -0
  145. package/server/dist/mcp/mcp-server.js +143 -0
  146. package/server/dist/mcp/mcp-tiers.js +48 -0
  147. package/server/dist/mcp/mcp-token.js +119 -0
  148. package/server/dist/mcp/resources.js +24 -0
  149. package/server/dist/mcp/tools/agents.js +319 -0
  150. package/server/dist/mcp/tools/analytics.js +168 -0
  151. package/server/dist/mcp/tools/app-settings.js +81 -0
  152. package/server/dist/mcp/tools/catalog.js +45 -0
  153. package/server/dist/mcp/tools/chat.js +147 -0
  154. package/server/dist/mcp/tools/code.js +145 -0
  155. package/server/dist/mcp/tools/jira.js +222 -0
  156. package/server/dist/mcp/tools/jobs.js +258 -0
  157. package/server/dist/mcp/tools/loops.js +229 -0
  158. package/server/dist/mcp/tools/meta.js +96 -0
  159. package/server/dist/mcp/tools/plugins.js +83 -0
  160. package/server/dist/mcp/tools/projects.js +62 -0
  161. package/server/dist/mcp/tools/rails.js +181 -0
  162. package/server/dist/mcp/tools/setup.js +167 -0
  163. package/server/dist/mcp/tools/specs.js +327 -0
  164. package/server/dist/mcp/tools/types.js +156 -0
  165. package/server/dist/mcp/tools/watch.js +93 -0
  166. package/server/dist/mobile/mobile-event-bus.js +2 -0
  167. package/server/dist/project-router-setup.js +15 -1
  168. package/server/dist/project-router-tickets.js +2 -2
  169. package/server/dist/providers/codex-adapter.js +19 -3
  170. package/server/dist/rails-router.js +5 -0
  171. package/server/dist/setup-manager.js +28 -0
  172. package/server/dist/spawn-lifecycle.js +21 -13
  173. package/server/dist/workspace-manager.js +11 -0
  174. package/client/dist/assets/AgentsPage-jcPUtPhP.js +0 -86
  175. package/client/dist/assets/AnalyticsPage-DZkVU3yd.js +0 -1
  176. package/client/dist/assets/CodePage-BcbZT88K.js +0 -2
  177. package/client/dist/assets/DocsDialog-CS3Syf61.js +0 -11
  178. package/client/dist/assets/DocsPage-l3ZcTO2E.js +0 -11
  179. package/client/dist/assets/IntegrationsPage-CJ_Om1zu.js +0 -3
  180. package/client/dist/assets/JobDetailPage-D5Cxw0md.js +0 -16
  181. package/client/dist/assets/JobsPage-3v_iX83r.js +0 -1
  182. package/client/dist/assets/LoopBuilderPage-4s_adZy5.js +0 -7
  183. package/client/dist/assets/LoopsPage-DA94-o0j.js +0 -1
  184. package/client/dist/assets/chunk-CilyBKbf.js +0 -1
  185. package/client/dist/assets/commands-B9XEyMj-.js +0 -1
  186. package/client/dist/assets/commands-BI1Ta-E7.js +0 -1
  187. package/client/dist/assets/commands-BdI0CtOL.js +0 -1
  188. package/client/dist/assets/commands-C2ewlyXo.js +0 -1
  189. package/client/dist/assets/commands-CwypztRT.js +0 -1
  190. package/client/dist/assets/commands-DSX3yJyr.js +0 -1
  191. package/client/dist/assets/commands-Ic1DJDxm.js +0 -1
  192. package/client/dist/assets/commands-yNn4IA4C.js +0 -1
  193. package/client/dist/assets/index-BRMyOS1B.css +0 -2
  194. package/client/dist/assets/index-meTWPBzY.js +0 -144
  195. package/client/dist/assets/settings-0m2iuTzd.js +0 -1
  196. package/client/dist/assets/settings-BA1V6KdK.js +0 -1
  197. package/client/dist/assets/settings-BN7OusER.js +0 -1
  198. package/client/dist/assets/settings-Bi5FFkIw.js +0 -1
  199. package/client/dist/assets/settings-CRJxyTNN.js +0 -1
  200. package/client/dist/assets/settings-DyBxunCh.js +0 -1
  201. package/client/dist/assets/settings-fk-WlnUt.js +0 -1
  202. package/client/dist/assets/settings-iQe5Dim-.js +0 -1
  203. package/client/dist/assets/setup-BOmQ4vh2.js +0 -1
  204. package/client/dist/assets/setup-BwO2-kuK.js +0 -1
  205. package/client/dist/assets/setup-CUTNWz-0.js +0 -1
  206. package/client/dist/assets/setup-Cf3hjChU.js +0 -1
  207. package/client/dist/assets/setup-CsuXrbJ2.js +0 -1
  208. package/client/dist/assets/setup-Df4cJOqu.js +0 -1
  209. package/client/dist/assets/setup-Do0fWx6W.js +0 -1
  210. package/client/dist/assets/setup-GlkDhBlJ.js +0 -1
  211. package/client/dist/assets/upload-DPG87J4t.js +0 -1
  212. /package/client/dist/assets/{abap-CK68cr9-.js → abap-CpHUwCVK.js} +0 -0
  213. /package/client/dist/assets/{activity-Di2f50_Z.js → activity-B82z3Pna.js} +0 -0
  214. /package/client/dist/assets/{activity-B2MvEH54.js → activity-BId0pwuS2.js} +0 -0
  215. /package/client/dist/assets/{activity-D4dhNEwO.js → activity-BVpZrs0J.js} +0 -0
  216. /package/client/dist/assets/{activity-DHjfmAyT.js → activity-BySXFT2J2.js} +0 -0
  217. /package/client/dist/assets/{activity-usnNa7FX.js → activity-DIWnV0Pl.js} +0 -0
  218. /package/client/dist/assets/{activity-C7VdmeGb.js → activity-Uj576ckT.js} +0 -0
  219. /package/client/dist/assets/{activity-BbNkUmW4.js → activity-w1qMFwxh.js} +0 -0
  220. /package/client/dist/assets/{addspec-CO1xv6BL.js → addspec-B9dY_F5T.js} +0 -0
  221. /package/client/dist/assets/{addspec-CNyAUGz_.js → addspec-B9nhMikb.js} +0 -0
  222. /package/client/dist/assets/{addspec-IozoiiGs.js → addspec-BtNaJHu2.js} +0 -0
  223. /package/client/dist/assets/{addspec-BxMn39wn.js → addspec-D43TlMVp2.js} +0 -0
  224. /package/client/dist/assets/{addspec-1HEtmLv1.js → addspec-DfgIZ5lO.js} +0 -0
  225. /package/client/dist/assets/{addspec-DfuR6EAl.js → addspec-W0r16BOC2.js} +0 -0
  226. /package/client/dist/assets/{addspec-DAveBiCE.js → addspec-tbxr3sHa.js} +0 -0
  227. /package/client/dist/assets/{agentstudio-DCyDW8sy.js → agentstudio-0o3XKrcy.js} +0 -0
  228. /package/client/dist/assets/{agentstudio-9NbsoGXk.js → agentstudio-Bu8m5jDw.js} +0 -0
  229. /package/client/dist/assets/{agentstudio-B1y0JWY-.js → agentstudio-C7xxqVWn.js} +0 -0
  230. /package/client/dist/assets/{agentstudio-1E-bag77.js → agentstudio-D-UoNAIA.js} +0 -0
  231. /package/client/dist/assets/{agentstudio-B-jQgYV-.js → agentstudio-OJjjz6Uf2.js} +0 -0
  232. /package/client/dist/assets/{agentstudio-Q0Sq_jTg.js → agentstudio-ObTpVbBP.js} +0 -0
  233. /package/client/dist/assets/{agentstudio-Bwa72b1S.js → agentstudio-PzFB3vfh2.js} +0 -0
  234. /package/client/dist/assets/{aiedit-DUpe7NxI.js → aiedit-BIQqv2XM2.js} +0 -0
  235. /package/client/dist/assets/{aiedit-kAU7KADg.js → aiedit-BaLZalLa.js} +0 -0
  236. /package/client/dist/assets/{aiedit-CvSspQmE.js → aiedit-BjlUzasF.js} +0 -0
  237. /package/client/dist/assets/{aiedit-DSLtsYIu.js → aiedit-BmDufyGU.js} +0 -0
  238. /package/client/dist/assets/{aiedit-qTGI_PGs.js → aiedit-DAM_WRAl2.js} +0 -0
  239. /package/client/dist/assets/{aiedit-CfBNanHE.js → aiedit-DRrNiaB4.js} +0 -0
  240. /package/client/dist/assets/{aiedit-CGxeml8D.js → aiedit-sP_iao2j.js} +0 -0
  241. /package/client/dist/assets/{analytics-CgEkAUiP.js → analytics-BDqqCzN9.js} +0 -0
  242. /package/client/dist/assets/{analytics-DEsEAJZL.js → analytics-B_rxNC9X.js} +0 -0
  243. /package/client/dist/assets/{analytics-D1ElChhs.js → analytics-C4z_NgJZ.js} +0 -0
  244. /package/client/dist/assets/{analytics-DDqve9Ma.js → analytics-DL2vJCbq.js} +0 -0
  245. /package/client/dist/assets/{analytics-CQqu1yE5.js → analytics-Ds_PNxtO2.js} +0 -0
  246. /package/client/dist/assets/{analytics-BDlELxc7.js → analytics-MVJRjcY52.js} +0 -0
  247. /package/client/dist/assets/{analytics-DBGO8B6-.js → analytics-e1mkNTgy2.js} +0 -0
  248. /package/client/dist/assets/{apex-BHHyAVNb.js → apex-DlD7oJX6.js} +0 -0
  249. /package/client/dist/assets/{atom-one-dark-DrWoEEbZ.js → atom-one-dark-BrRN8wBy.js} +0 -0
  250. /package/client/dist/assets/{attachments-BNgH6Tcu.js → attachments-8QCKHCEF2.js} +0 -0
  251. /package/client/dist/assets/{attachments-BLqqPGyy.js → attachments-BP0Ac1yt.js} +0 -0
  252. /package/client/dist/assets/{attachments-UJtEq892.js → attachments-CJaO1vCH.js} +0 -0
  253. /package/client/dist/assets/{attachments-D5fVsMgb.js → attachments-CPBVeHX72.js} +0 -0
  254. /package/client/dist/assets/{attachments-3CuBBRFu.js → attachments-CV2uaTGE.js} +0 -0
  255. /package/client/dist/assets/{attachments-CppM7de8.js → attachments-CaOjdN332.js} +0 -0
  256. /package/client/dist/assets/{attachments-pW3zm9nu.js → attachments-Db7JfA8a.js} +0 -0
  257. /package/client/dist/assets/{azcli-C56lfIEP.js → azcli-CmXFAbc-.js} +0 -0
  258. /package/client/dist/assets/{bat-BLamSaf-.js → bat-DdNJq4hH.js} +0 -0
  259. /package/client/dist/assets/{bicep-lrOcEItS.js → bicep-Bppz7WOA.js} +0 -0
  260. /package/client/dist/assets/{browser-C__Vz7KR.js → browser-0xeW8fUa2.js} +0 -0
  261. /package/client/dist/assets/{browser-EFmPpkvO.js → browser-543jbxE4.js} +0 -0
  262. /package/client/dist/assets/{browser-DhwTc0ry.js → browser-C9rUUxo4.js} +0 -0
  263. /package/client/dist/assets/{browser-C91MQBxx.js → browser-CEqx11iy.js} +0 -0
  264. /package/client/dist/assets/{browser-B7i7Ysc8.js → browser-CLC0etB_2.js} +0 -0
  265. /package/client/dist/assets/{browser-DwE289IS.js → browser-DyG2l9Wa.js} +0 -0
  266. /package/client/dist/assets/{browser-BVQgd1_1.js → browser-ExmELH702.js} +0 -0
  267. /package/client/dist/assets/{cameligo-BK_p0bgU.js → cameligo-0MRMdSmg.js} +0 -0
  268. /package/client/dist/assets/{chat-C5nJF6L0.js → chat-CCytD3P8.js} +0 -0
  269. /package/client/dist/assets/{chat-UMl6H55K.js → chat-CN8BMAMc.js} +0 -0
  270. /package/client/dist/assets/{chat-BXVx6rb5.js → chat-Cu6F3d6g2.js} +0 -0
  271. /package/client/dist/assets/{chat-CE8bx6Rz.js → chat-DagUyoVA.js} +0 -0
  272. /package/client/dist/assets/{chat-PVakYp92.js → chat-IjutwlBg.js} +0 -0
  273. /package/client/dist/assets/{chat-9RcD5Lcn.js → chat-NQPCBQo72.js} +0 -0
  274. /package/client/dist/assets/{chat-BnJPyeUK.js → chat-vVpwkOp52.js} +0 -0
  275. /package/client/dist/assets/{clojure-BQ7JOykv.js → clojure-B5dKj863.js} +0 -0
  276. /package/client/dist/assets/{clsx-CjLeUJfG.js → clsx-1dnHRn8W.js} +0 -0
  277. /package/client/dist/assets/{code-OoLqhjoI.js → code-32l6Naxu2.js} +0 -0
  278. /package/client/dist/assets/{code-Lg4awa35.js → code-BaG05zK62.js} +0 -0
  279. /package/client/dist/assets/{code-BPMR8_Vp.js → code-C5cibF2F.js} +0 -0
  280. /package/client/dist/assets/{code-aCUqkVN_.js → code-Ce-nBIwj.js} +0 -0
  281. /package/client/dist/assets/{code-BsOBm1Fb.js → code-Dap54vOb.js} +0 -0
  282. /package/client/dist/assets/{code-u9Sg9ohM.js → code-Dhb6jbAU.js} +0 -0
  283. /package/client/dist/assets/{code-eh4vO2-_.js → code-_NOCo-Ol2.js} +0 -0
  284. /package/client/dist/assets/{coffee-BD3DiL5s.js → coffee-DSbWjzk7.js} +0 -0
  285. /package/client/dist/assets/{common-C9VyfY7g.js → common-0aY9HQBP.js} +0 -0
  286. /package/client/dist/assets/{common-LDwESeCX.js → common-5jScBJqt.js} +0 -0
  287. /package/client/dist/assets/{common-ULlk84G4.js → common-BdaRciTu.js} +0 -0
  288. /package/client/dist/assets/{common-CzCQ0rpW.js → common-CHARW6MZ2.js} +0 -0
  289. /package/client/dist/assets/{common-CNoRVpnA.js → common-CQCJzAQq2.js} +0 -0
  290. /package/client/dist/assets/{common-Dmpyh323.js → common-DNhhqjlJ.js} +0 -0
  291. /package/client/dist/assets/{common-CcHFVATT.js → common-YdyZtmaI2.js} +0 -0
  292. /package/client/dist/assets/{cpp-splnCwCh.js → cpp-SBF8SAh9.js} +0 -0
  293. /package/client/dist/assets/{csharp-BCpsl-o3.js → csharp-Lzuq_1t-.js} +0 -0
  294. /package/client/dist/assets/{csp-tkCWrZmb.js → csp-BEzxZqi1.js} +0 -0
  295. /package/client/dist/assets/{css-B_xdnReq.js → css-C3D3PKln.js} +0 -0
  296. /package/client/dist/assets/{cypher-OL1zq-y3.js → cypher-CQ3dEPmv.js} +0 -0
  297. /package/client/dist/assets/{dart-CtTlOkrm.js → dart-DCPmxolI.js} +0 -0
  298. /package/client/dist/assets/{dashboard-C52PElPV.js → dashboard-BTiH361F.js} +0 -0
  299. /package/client/dist/assets/{dashboard-C-dXxut-.js → dashboard-COSm_14E.js} +0 -0
  300. /package/client/dist/assets/{dashboard-CUjyhohl.js → dashboard-CfOs70FN2.js} +0 -0
  301. /package/client/dist/assets/{dashboard-zH9quXks.js → dashboard-CzHDp14_2.js} +0 -0
  302. /package/client/dist/assets/{dashboard-03EpOoMM.js → dashboard-D6Woy2B5.js} +0 -0
  303. /package/client/dist/assets/{dashboard-C2owt3eN.js → dashboard-DwbH4oVH.js} +0 -0
  304. /package/client/dist/assets/{dashboard-Ch6H-457.js → dashboard-cWhU3krA2.js} +0 -0
  305. /package/client/dist/assets/{dockerfile-DcQ5CNiW.js → dockerfile-B_2_aaTO.js} +0 -0
  306. /package/client/dist/assets/{ecl-DZpiDRt6.js → ecl-rADUeXsV.js} +0 -0
  307. /package/client/dist/assets/{elixir-Dzj2lqtK.js → elixir-DOd-TuJO.js} +0 -0
  308. /package/client/dist/assets/{explore-CCcPXrHg.js → explore-B82VMUJ_.js} +0 -0
  309. /package/client/dist/assets/{explore-DQ0XEjed.js → explore-BGz1rvQE.js} +0 -0
  310. /package/client/dist/assets/{explore-xQoaak6e.js → explore-BzdMEpuf.js} +0 -0
  311. /package/client/dist/assets/{explore-B2n8r9Ye.js → explore-CbW0381i2.js} +0 -0
  312. /package/client/dist/assets/{explore-4SD1DxR0.js → explore-ChtxIiSM.js} +0 -0
  313. /package/client/dist/assets/{explore-BxR9q8Hq.js → explore-DfcUfiPw2.js} +0 -0
  314. /package/client/dist/assets/{explore-CZt4Ncpa.js → explore-yRF7wFSp2.js} +0 -0
  315. /package/client/dist/assets/{flow9-CFENCHIZ.js → flow9-Bf7zg_j0.js} +0 -0
  316. /package/client/dist/assets/{format-command-CMsBTOPN.js → format-command-D96da4fZ.js} +0 -0
  317. /package/client/dist/assets/{fsharp-D-4bv7FB.js → fsharp-BqROZjbA.js} +0 -0
  318. /package/client/dist/assets/{go-djxbTJq7.js → go-oQTP5uLe.js} +0 -0
  319. /package/client/dist/assets/{graphql-DHIFrkZ6.js → graphql-CSHfTU3q.js} +0 -0
  320. /package/client/dist/assets/{hcl-CXVoowNb.js → hcl-CeG-RoFJ.js} +0 -0
  321. /package/client/dist/assets/{ini-Crzc5kly.js → ini-B2Dv4ohc.js} +0 -0
  322. /package/client/dist/assets/{integrations-C7u7SInG.js → integrations-B0OBPU9_.js} +0 -0
  323. /package/client/dist/assets/{integrations-B17KyA-i.js → integrations-BA5pM05t.js} +0 -0
  324. /package/client/dist/assets/{integrations-DkBi-Gsh.js → integrations-BJvrlcc7.js} +0 -0
  325. /package/client/dist/assets/{integrations-DwSVdCpf.js → integrations-CPKYkG36.js} +0 -0
  326. /package/client/dist/assets/{integrations-A9f08E0o.js → integrations-CnrX7vqw2.js} +0 -0
  327. /package/client/dist/assets/{integrations-9qxUNhPD.js → integrations-DBou159M2.js} +0 -0
  328. /package/client/dist/assets/{integrations-B46ac3sf.js → integrations-DeJFRyXz2.js} +0 -0
  329. /package/client/dist/assets/{java-CYLaJrdE.js → java-aUDDeufb.js} +0 -0
  330. /package/client/dist/assets/{jira-Dht8qNck.js → jira-BDgxAFTF2.js} +0 -0
  331. /package/client/dist/assets/{jira-4Fin3fu7.js → jira-BwLBgmfI2.js} +0 -0
  332. /package/client/dist/assets/{jira-0ldfMByG.js → jira-D3GGzXOI.js} +0 -0
  333. /package/client/dist/assets/{jira-BpnpUFlb.js → jira-DeotPx6P2.js} +0 -0
  334. /package/client/dist/assets/{jira-DzIVvNmy.js → jira-NwlUCcQD.js} +0 -0
  335. /package/client/dist/assets/{jira-CBU0200d.js → jira-Srx2P5zS.js} +0 -0
  336. /package/client/dist/assets/{jira-01H1RfQj.js → jira-mi37H4Kt.js} +0 -0
  337. /package/client/dist/assets/{jobs-jEQidSIb.js → jobs-B56vQEkh2.js} +0 -0
  338. /package/client/dist/assets/{jobs-DM9owF1j.js → jobs-BYIk6Tg_.js} +0 -0
  339. /package/client/dist/assets/{jobs-Bw4hqEro.js → jobs-C-lM-iax2.js} +0 -0
  340. /package/client/dist/assets/{jobs-BF9raUkL.js → jobs-CYdevGgT.js} +0 -0
  341. /package/client/dist/assets/{jobs-ym72SIR9.js → jobs-D8adm2BX.js} +0 -0
  342. /package/client/dist/assets/{jobs-DcCONARH.js → jobs-K_Y8KAZ2.js} +0 -0
  343. /package/client/dist/assets/{jobs-Oz3UtLQn.js → jobs-OwM0ZWhI2.js} +0 -0
  344. /package/client/dist/assets/{julia-BJ7tUU-T.js → julia-C5LbruO5.js} +0 -0
  345. /package/client/dist/assets/{kotlin-CeWcU3lC.js → kotlin-C6mOuSKk.js} +0 -0
  346. /package/client/dist/assets/{less-CviwWNG4.js → less-D5qC3caW.js} +0 -0
  347. /package/client/dist/assets/{lexon-Dt28jqDS.js → lexon-Dr2La-fj.js} +0 -0
  348. /package/client/dist/assets/{loops-DE-2cmLw.js → loops-BDhEfnx82.js} +0 -0
  349. /package/client/dist/assets/{loops-mcoeFMat.js → loops-BM5QggwH.js} +0 -0
  350. /package/client/dist/assets/{loops-D_ZxkD4l.js → loops-CPjLAAxj.js} +0 -0
  351. /package/client/dist/assets/{loops-BYNUJVyD.js → loops-DKnk79TB2.js} +0 -0
  352. /package/client/dist/assets/{loops-B_gS4Pqu.js → loops-DLW0aFMm.js} +0 -0
  353. /package/client/dist/assets/{loops-Fv4Bs-9A.js → loops-Dcv3dFy_2.js} +0 -0
  354. /package/client/dist/assets/{loops-B_w7STrw.js → loops-y7wFRx6M.js} +0 -0
  355. /package/client/dist/assets/{lua-B6AOaJSi.js → lua-Zy6u5z6Z.js} +0 -0
  356. /package/client/dist/assets/{m3-VnMkHJcy.js → m3-C7XHeDz_.js} +0 -0
  357. /package/client/dist/assets/{markdown-8vKNdvIM.js → markdown-PiF7r-2h.js} +0 -0
  358. /package/client/dist/assets/{mips-DoEcuzan.js → mips-nn07GiyE.js} +0 -0
  359. /package/client/dist/assets/{msdax-CNzvHyEp.js → msdax-DaKFVMST.js} +0 -0
  360. /package/client/dist/assets/{mysql-Buk3vUtL.js → mysql-C6d6xrbU.js} +0 -0
  361. /package/client/dist/assets/{nav-Cw3_40fA.js → nav-1hj2izqB2.js} +0 -0
  362. /package/client/dist/assets/{nav-DNDJ3H-_.js → nav-BBUKMAu-2.js} +0 -0
  363. /package/client/dist/assets/{nav-CrG_mYRr.js → nav-CLqkP-26.js} +0 -0
  364. /package/client/dist/assets/{nav-DVp1nEsi.js → nav-Cv46L837.js} +0 -0
  365. /package/client/dist/assets/{nav-DbAbG5_k.js → nav-DgA-rjLk2.js} +0 -0
  366. /package/client/dist/assets/{nav-B5W9IMnf.js → nav-EG2pr6vN.js} +0 -0
  367. /package/client/dist/assets/{nav-_0vAgZ_k.js → nav-r3mIJVfU.js} +0 -0
  368. /package/client/dist/assets/{objective-c-DfOmda-5.js → objective-c-B6KMtI-k.js} +0 -0
  369. /package/client/dist/assets/{pascal-DoAA2yjy.js → pascal-DYr8MPE7.js} +0 -0
  370. /package/client/dist/assets/{pascaligo-C65Vn1fu.js → pascaligo-B3pd-jJ_.js} +0 -0
  371. /package/client/dist/assets/{perl-INlfQ_ro.js → perl-z2xUzoaL.js} +0 -0
  372. /package/client/dist/assets/{pgsql-DtwRzglx.js → pgsql-DUvT-09-.js} +0 -0
  373. /package/client/dist/assets/{php-DfHqVNet.js → php-CGyOmJfy.js} +0 -0
  374. /package/client/dist/assets/{pla-D3dNVRYk.js → pla-CMqgvyD0.js} +0 -0
  375. /package/client/dist/assets/{postiats-UKXD1rM4.js → postiats-Dx5LUn4Z.js} +0 -0
  376. /package/client/dist/assets/{powerquery-zE3E3O7s.js → powerquery-DazYxvJ6.js} +0 -0
  377. /package/client/dist/assets/{powershell-Df9b3zQl.js → powershell-B3nwlDka.js} +0 -0
  378. /package/client/dist/assets/{protobuf-BF0nUVrW.js → protobuf-BGuu2u2s.js} +0 -0
  379. /package/client/dist/assets/{pug-Bj6Yikv_.js → pug-Dbte1MXA.js} +0 -0
  380. /package/client/dist/assets/{qsharp-BI4h-raZ.js → qsharp-DJLwBOvG.js} +0 -0
  381. /package/client/dist/assets/{r-DhpnmaXx.js → r-DmGBRSHj.js} +0 -0
  382. /package/client/dist/assets/{redis-DwYYPr4d.js → redis-VvUYn0a4.js} +0 -0
  383. /package/client/dist/assets/{redshift-D2f3Bc-4.js → redshift-6GdDrxg3.js} +0 -0
  384. /package/client/dist/assets/{restructuredtext-Dkiif6fe.js → restructuredtext-CfAB8aRU.js} +0 -0
  385. /package/client/dist/assets/{ruby-C6hLmHy0.js → ruby-CIYK6MXY.js} +0 -0
  386. /package/client/dist/assets/{rust-X8WAGtxB.js → rust-CTHZfjj9.js} +0 -0
  387. /package/client/dist/assets/{sb-4M2la0Kr.js → sb-CkKTdkz_.js} +0 -0
  388. /package/client/dist/assets/{scala-CaCXz58E.js → scala-Bx-Wr9TM.js} +0 -0
  389. /package/client/dist/assets/{scheme-CMdjpmP7.js → scheme-Dcfi6f83.js} +0 -0
  390. /package/client/dist/assets/{scss-QopmvPyp.js → scss-ByL-7PFQ.js} +0 -0
  391. /package/client/dist/assets/{shell-CDBchS00.js → shell-Csnb9Yqd.js} +0 -0
  392. /package/client/dist/assets/{solidity-DvBfi5mC.js → solidity-Dbw5-0QP.js} +0 -0
  393. /package/client/dist/assets/{sophia-HSnXR17u.js → sophia-ZQ3saZQx.js} +0 -0
  394. /package/client/dist/assets/{sparql-DhG_ppup.js → sparql-BEtOel8u.js} +0 -0
  395. /package/client/dist/assets/{specs-CUE3xSFM.js → specs-B5XOoH-02.js} +0 -0
  396. /package/client/dist/assets/{specs-C2wW5bq8.js → specs-B8mwScoM2.js} +0 -0
  397. /package/client/dist/assets/{specs-Bku8SypT.js → specs-Bj_3fDrQ.js} +0 -0
  398. /package/client/dist/assets/{specs-CnH7dOiF.js → specs-CWNKAScX2.js} +0 -0
  399. /package/client/dist/assets/{specs-BvsFNKTs.js → specs-D4z5d8uq.js} +0 -0
  400. /package/client/dist/assets/{specs-D4ORogcT.js → specs-DgvIRZtM.js} +0 -0
  401. /package/client/dist/assets/{specs-D6Y76Bgi.js → specs-DuRzE5wE.js} +0 -0
  402. /package/client/dist/assets/{sql-DHeIS-tf.js → sql-DGPDbzB7.js} +0 -0
  403. /package/client/dist/assets/{st-CMWchiRU.js → st-GeW2MOgh.js} +0 -0
  404. /package/client/dist/assets/{swift-CDXvBefj.js → swift-BVYTN8jq.js} +0 -0
  405. /package/client/dist/assets/{systemverilog-0RTukYUE.js → systemverilog-Deg2a8Lr.js} +0 -0
  406. /package/client/dist/assets/{tcl-CbBF_Ttl.js → tcl-6DnLmROF.js} +0 -0
  407. /package/client/dist/assets/{terminal-BLh00ouM.js → terminal-B2sExUis.js} +0 -0
  408. /package/client/dist/assets/{terminal-Cz_Puz0q.js → terminal-CH0fdHvP.js} +0 -0
  409. /package/client/dist/assets/{terminal-DFEH9XTQ.js → terminal-CPMigUX7.js} +0 -0
  410. /package/client/dist/assets/{terminal-CB33IsO1.js → terminal-DOwfkxqa2.js} +0 -0
  411. /package/client/dist/assets/{terminal-CR6t-Oey.js → terminal-DjSSa5qP.js} +0 -0
  412. /package/client/dist/assets/{terminal-CY_sPfdD.js → terminal-DoMTHedv2.js} +0 -0
  413. /package/client/dist/assets/{terminal-BTanJIt_.js → terminal-w0i-OCp32.js} +0 -0
  414. /package/client/dist/assets/{tickets-D6f3GSYn.js → tickets-CQTana1u.js} +0 -0
  415. /package/client/dist/assets/{tickets-blQnNA4N.js → tickets-D00mSt832.js} +0 -0
  416. /package/client/dist/assets/{tickets-68LH1xp6.js → tickets-D7CSuWjO.js} +0 -0
  417. /package/client/dist/assets/{tickets-OrJwUxJR.js → tickets-Dq7HDy8n.js} +0 -0
  418. /package/client/dist/assets/{tickets-PtHNxQo5.js → tickets-DvbFg_-c2.js} +0 -0
  419. /package/client/dist/assets/{tickets-REr-EQx9.js → tickets-heDAaj8C2.js} +0 -0
  420. /package/client/dist/assets/{tickets-jxsTrApR.js → tickets-onKZz6Dd.js} +0 -0
  421. /package/client/dist/assets/{twig-DCcGd8FE.js → twig-XbbXW9Yz.js} +0 -0
  422. /package/client/dist/assets/{typespec-HTphp-Uh.js → typespec-CRlV8GhI.js} +0 -0
  423. /package/client/dist/assets/{vb-Cb_yUcVd.js → vb-BHE2izPH.js} +0 -0
  424. /package/client/dist/assets/{wgsl-DrKU3YXj.js → wgsl-Bf5vkfmY.js} +0 -0
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.appTools = appTools;
4
+ const zod_1 = require("zod");
5
+ const desktop_db_1 = require("../../desktop-db");
6
+ const mcp_tiers_1 = require("../mcp-tiers");
7
+ // App-level settings the MCP may read/write. NOTE: the MCP enable flag and the
8
+ // permission-tier toggles are intentionally NOT writable here — an external LLM
9
+ // must never be able to escalate its own permissions. Those are user-only,
10
+ // changed in the Settings ▸ MCP panel.
11
+ const WRITABLE_THEMES = ['specrails', 'dracula', 'aurora-light', 'obsidian-dark', 'matrix'];
12
+ const WRITABLE_LANGS = ['en', 'es', 'fr', 'de', 'pt', 'it', 'zh', 'ja'];
13
+ function appTools() {
14
+ return [
15
+ {
16
+ name: 'specrails_settings',
17
+ title: 'App settings',
18
+ description: 'Read or update app-level Specrails settings (theme, language, daily budget, cost-alert threshold). ' +
19
+ 'Actions: get, set. The MCP enable flag and permission tiers are read-only here (user-controlled in the app).',
20
+ hintTier: 'read',
21
+ tier: (args) => (args.action === 'set' ? 'write' : 'read'),
22
+ inputSchema: {
23
+ action: zod_1.z.enum(['get', 'set']).describe('Operation'),
24
+ theme: zod_1.z.enum(WRITABLE_THEMES).optional(),
25
+ language: zod_1.z.enum(WRITABLE_LANGS).optional(),
26
+ dailyBudgetUsd: zod_1.z.number().min(0).nullable().optional(),
27
+ costAlertThresholdUsd: zod_1.z.number().min(0).nullable().optional(),
28
+ },
29
+ handler: (ctx, args) => {
30
+ const db = ctx.desktopDb;
31
+ if (args.action === 'get') {
32
+ return {
33
+ theme: (0, desktop_db_1.getDesktopSetting)(db, 'ui_theme') ?? 'specrails',
34
+ language: (0, desktop_db_1.getDesktopSetting)(db, 'ui_language') ?? null,
35
+ dailyBudgetUsd: num((0, desktop_db_1.getDesktopSetting)(db, 'desktop_daily_budget_usd')),
36
+ costAlertThresholdUsd: num((0, desktop_db_1.getDesktopSetting)(db, 'cost_alert_threshold_usd')),
37
+ mcp: {
38
+ enabled: (0, mcp_tiers_1.isMcpEnabled)(db),
39
+ tierWrite: (0, mcp_tiers_1.isTierEnabled)(db, 'write'),
40
+ tierAiSpawn: (0, mcp_tiers_1.isTierEnabled)(db, 'ai-spawn'),
41
+ tierDestructive: (0, mcp_tiers_1.isTierEnabled)(db, 'destructive'),
42
+ },
43
+ };
44
+ }
45
+ // set
46
+ const changed = [];
47
+ if (args.theme !== undefined) {
48
+ (0, desktop_db_1.setDesktopSetting)(db, 'ui_theme', String(args.theme));
49
+ changed.push('theme');
50
+ }
51
+ if (args.language !== undefined) {
52
+ (0, desktop_db_1.setDesktopSetting)(db, 'ui_language', String(args.language));
53
+ changed.push('language');
54
+ }
55
+ if (args.dailyBudgetUsd !== undefined) {
56
+ writeNumOrClear(db, 'desktop_daily_budget_usd', args.dailyBudgetUsd);
57
+ changed.push('dailyBudgetUsd');
58
+ }
59
+ if (args.costAlertThresholdUsd !== undefined) {
60
+ writeNumOrClear(db, 'cost_alert_threshold_usd', args.costAlertThresholdUsd);
61
+ changed.push('costAlertThresholdUsd');
62
+ }
63
+ if (!changed.length)
64
+ throw new Error('set requires at least one field (theme, language, dailyBudgetUsd, costAlertThresholdUsd).');
65
+ return { ok: true, changed };
66
+ },
67
+ },
68
+ ];
69
+ }
70
+ function num(v) {
71
+ if (v === undefined)
72
+ return null;
73
+ const n = Number(v);
74
+ return Number.isFinite(n) ? n : null;
75
+ }
76
+ function writeNumOrClear(db, key, value) {
77
+ if (value === null)
78
+ (0, desktop_db_1.setDesktopSetting)(db, key, '');
79
+ else
80
+ (0, desktop_db_1.setDesktopSetting)(db, key, String(value));
81
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildToolSpecs = buildToolSpecs;
4
+ const projects_1 = require("./projects");
5
+ const app_settings_1 = require("./app-settings");
6
+ const watch_1 = require("./watch");
7
+ const meta_1 = require("./meta");
8
+ const specs_1 = require("./specs");
9
+ const rails_1 = require("./rails");
10
+ const jobs_1 = require("./jobs");
11
+ const chat_1 = require("./chat");
12
+ const agents_1 = require("./agents");
13
+ const plugins_1 = require("./plugins");
14
+ const jira_1 = require("./jira");
15
+ const loops_1 = require("./loops");
16
+ const code_1 = require("./code");
17
+ const setup_1 = require("./setup");
18
+ const analytics_1 = require("./analytics");
19
+ /**
20
+ * The full MCP tool catalog. Domain-facade tools each expose an `action` enum
21
+ * and call the app's REST API over loopback (see apiCall). Meta tools receive a
22
+ * lazy getter so `search`/`describe` can see the whole list.
23
+ */
24
+ function buildToolSpecs() {
25
+ const specs = [];
26
+ // App-level + meta + watch
27
+ specs.push(...(0, projects_1.projectsTools)());
28
+ specs.push(...(0, app_settings_1.appTools)());
29
+ specs.push((0, watch_1.watchTool)());
30
+ // Per-project domains
31
+ specs.push(...(0, specs_1.specsTools)());
32
+ specs.push(...(0, rails_1.railsTools)());
33
+ specs.push(...(0, jobs_1.jobsTools)());
34
+ specs.push(...(0, chat_1.chatTools)());
35
+ specs.push(...(0, agents_1.agentsTools)());
36
+ specs.push(...(0, plugins_1.pluginsTools)());
37
+ specs.push(...(0, jira_1.jiraTools)());
38
+ specs.push(...(0, loops_1.loopsTools)());
39
+ specs.push(...(0, code_1.codeTools)());
40
+ specs.push(...(0, setup_1.setupTools)());
41
+ specs.push(...(0, analytics_1.analyticsTools)());
42
+ // Meta last (needs the full list for search/describe)
43
+ specs.push(...(0, meta_1.metaTools)(() => specs));
44
+ return specs;
45
+ }
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.chatTools = chatTools;
4
+ const zod_1 = require("zod");
5
+ const types_1 = require("./types");
6
+ /**
7
+ * Chat / Explore conversations for a project. A domain-facade tool over the
8
+ * per-project chat routes in `server/project-router-chat.ts`. The agent-refine
9
+ * (AI-edit) routes under `/profiles/catalog/:agentId/refine` are intentionally
10
+ * NOT here — they belong to the agents domain.
11
+ *
12
+ * `send` is the only cost-incurring action: it 202-accepts and streams the
13
+ * assistant reply over WebSocket, so it returns a watch hint keyed on the
14
+ * conversation id.
15
+ */
16
+ function chatTools() {
17
+ return [
18
+ {
19
+ name: 'specrails_chat',
20
+ title: 'Chat / Explore',
21
+ description: 'Manage a project\'s chat & Explore-Spec conversations and drive their AI turns. ' +
22
+ 'Actions: list_conversations, get (conversation + messages), create (kind sidebar|explore, optional provider/model/contextScope), ' +
23
+ 'send (cost-incurring — spawns the AI CLI and streams the reply async over WS), abort (interrupt the in-flight turn), ' +
24
+ 'delete (destructive — removes the conversation, its messages, and clears linked draft origin), minimize (arm Explore idle-kill timer), ' +
25
+ 'restore (cancel the idle-kill timer), spec_draft (read the in-memory Explore spec-draft state), messages (persisted history only).',
26
+ hintTier: 'read',
27
+ tier: (a) => {
28
+ const action = a.action;
29
+ if (action === 'delete')
30
+ return 'destructive';
31
+ if (action === 'send')
32
+ return 'ai-spawn';
33
+ if (action === 'create' || action === 'update' || action === 'abort' || action === 'minimize' || action === 'restore')
34
+ return 'write';
35
+ return 'read';
36
+ },
37
+ inputSchema: {
38
+ action: zod_1.z
39
+ .enum([
40
+ 'list_conversations',
41
+ 'get',
42
+ 'create',
43
+ 'update',
44
+ 'send',
45
+ 'abort',
46
+ 'delete',
47
+ 'minimize',
48
+ 'restore',
49
+ 'spec_draft',
50
+ 'messages',
51
+ ])
52
+ .describe('Operation to perform'),
53
+ projectId: zod_1.z.string().optional().describe('Project id (defaults to the active project)'),
54
+ conversationId: zod_1.z.string().optional().describe('Conversation id (required for get/update/send/abort/delete/minimize/restore/spec_draft/messages)'),
55
+ // create params
56
+ kind: zod_1.z.enum(['sidebar', 'explore']).optional().describe('Conversation kind for create (default sidebar)'),
57
+ provider: zod_1.z.string().optional().describe('AI engine for create — must be installed on the project (alias of aiEngine); defaults to the primary provider'),
58
+ model: zod_1.z.string().optional().describe('Model for create/update — must be valid for the conversation\'s provider'),
59
+ contextScope: zod_1.z
60
+ .record(zod_1.z.unknown())
61
+ .optional()
62
+ .describe('Explore-only context scope flags for create (mcp/userMcp/full/specrails/openspec/contractRefine)'),
63
+ // update params
64
+ title: zod_1.z.string().optional().describe('New title for update'),
65
+ // send params
66
+ text: zod_1.z.string().optional().describe('User message text for send (required)'),
67
+ lightweight: zod_1.z.boolean().optional().describe('Use the lightweight system prompt for send'),
68
+ maxTurns: zod_1.z.number().optional().describe('Max agent turns for send'),
69
+ attachments: zod_1.z
70
+ .object({
71
+ ticketKey: zod_1.z.string().describe('Ticket key the attachments belong to'),
72
+ ids: zod_1.z.array(zod_1.z.string()).describe('Uploaded attachment ids'),
73
+ })
74
+ .optional()
75
+ .describe('Attachment references for send'),
76
+ },
77
+ async handler(ctx, args) {
78
+ const base = (0, types_1.projectPath)(ctx, args.projectId);
79
+ const action = args.action;
80
+ const convId = args.conversationId;
81
+ const requireConv = () => {
82
+ if (!convId)
83
+ throw new Error(`Action "${action}" requires a "conversationId".`);
84
+ return convId;
85
+ };
86
+ switch (action) {
87
+ case 'list_conversations':
88
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/chat/conversations`);
89
+ case 'get':
90
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/chat/conversations/${requireConv()}`);
91
+ case 'messages':
92
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/chat/conversations/${requireConv()}/messages`);
93
+ case 'spec_draft':
94
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/chat/conversations/${requireConv()}/spec-draft`);
95
+ case 'create': {
96
+ const body = {};
97
+ if (args.kind !== undefined)
98
+ body.kind = args.kind;
99
+ if (args.provider !== undefined)
100
+ body.aiEngine = args.provider;
101
+ if (args.model !== undefined)
102
+ body.model = args.model;
103
+ if (args.contextScope !== undefined)
104
+ body.contextScope = args.contextScope;
105
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/chat/conversations`, body);
106
+ }
107
+ case 'update': {
108
+ const body = {};
109
+ if (args.title !== undefined)
110
+ body.title = args.title;
111
+ if (args.model !== undefined)
112
+ body.model = args.model;
113
+ return (0, types_1.apiCall)(ctx, 'PATCH', `${base}/chat/conversations/${requireConv()}`, body);
114
+ }
115
+ case 'send': {
116
+ const text = args.text;
117
+ if (!text || !text.trim())
118
+ throw new Error('send requires non-empty "text".');
119
+ const body = { text: text.trim() };
120
+ if (args.lightweight !== undefined)
121
+ body.lightweight = args.lightweight;
122
+ if (args.maxTurns !== undefined)
123
+ body.maxTurns = args.maxTurns;
124
+ if (args.attachments !== undefined)
125
+ body.attachments = args.attachments;
126
+ const r = (await (0, types_1.apiCall)(ctx, 'POST', `${base}/chat/conversations/${requireConv()}/messages`, body));
127
+ return {
128
+ ...r,
129
+ conversationId: requireConv(),
130
+ hint: `Turn accepted (202). The assistant reply streams over WebSocket — use specrails_watch with conversationId "${requireConv()}" to await completion (chat_done / chat_error).`,
131
+ };
132
+ }
133
+ case 'abort':
134
+ return (0, types_1.apiCall)(ctx, 'DELETE', `${base}/chat/conversations/${requireConv()}/messages/stream`);
135
+ case 'delete':
136
+ return (0, types_1.apiCall)(ctx, 'DELETE', `${base}/chat/conversations/${requireConv()}`);
137
+ case 'minimize':
138
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/chat/conversations/${requireConv()}/minimize`);
139
+ case 'restore':
140
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/chat/conversations/${requireConv()}/restore`);
141
+ default:
142
+ throw new Error(`Unknown action "${action}".`);
143
+ }
144
+ },
145
+ },
146
+ ];
147
+ }
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.codeTools = codeTools;
4
+ const zod_1 = require("zod");
5
+ const types_1 = require("./types");
6
+ /**
7
+ * Read-only Code Explorer surface for a project: the AI-touched file tree,
8
+ * file contents + plain-language AI summaries, "touched by AI" provenance, and
9
+ * stored per-file diffs — plus the one cost-incurring action, regenerating a
10
+ * file's AI summary (async, fire-and-forget over WS).
11
+ *
12
+ * Every op is per-project under `/api/projects/:projectId/code/*`. The v1 edit
13
+ * path (PUT /code/file) is intentionally NOT exposed — Code Explorer is
14
+ * read-only here. The app-level GET/PATCH /api/code-explorer-settings ops are
15
+ * app-scoped settings, surfaced by the settings domain, not here.
16
+ *
17
+ * Encode query strings explicitly so file paths with spaces/`#`/`?` survive.
18
+ */
19
+ function codeTools() {
20
+ return [
21
+ {
22
+ name: 'specrails_code',
23
+ title: 'Code Explorer',
24
+ description: 'Read-only browse a project\'s source through the Code Explorer: list the file tree ' +
25
+ '(default scoped to AI-touched files, optional provenance rollup), read a file with its ' +
26
+ 'AI summary + staleness + provenance, fetch a stored summary alone, regenerate a file\'s ' +
27
+ 'AI summary (cost-incurring, async), list "touched by AI" provenance rows, and fetch the ' +
28
+ 'stored unified-diff a job applied to a file. ' +
29
+ 'Actions: tree, read_file, summary, regenerate_summary (ai-spawn — spawns an AI CLI, ' +
30
+ 'incurs cost, returns 202 then completes over WS), provenance, diff. ' +
31
+ 'Requires SPECRAILS_CODE_EXPLORER (default on); the /code prefix 404s when disabled.',
32
+ hintTier: 'read',
33
+ tier: (a) => (a.action === 'regenerate_summary' ? 'ai-spawn' : 'read'),
34
+ inputSchema: {
35
+ action: zod_1.z
36
+ .enum(['tree', 'read_file', 'summary', 'regenerate_summary', 'provenance', 'diff'])
37
+ .describe('Operation to perform'),
38
+ projectId: zod_1.z.string().optional().describe('Project id (defaults to the active project)'),
39
+ path: zod_1.z
40
+ .string()
41
+ .optional()
42
+ .describe('Project-relative file path. Required for read_file/summary/regenerate_summary/diff; ' +
43
+ 'optional narrowing filter for provenance.'),
44
+ filter: zod_1.z
45
+ .enum(['touched-by-ai', 'all'])
46
+ .optional()
47
+ .describe('tree only: scope to AI-touched files (default) or the whole repo'),
48
+ withProvenance: zod_1.z
49
+ .boolean()
50
+ .optional()
51
+ .describe('tree only: include per-file/dir provenance rollup (created-by / modified-by chips)'),
52
+ cursor: zod_1.z
53
+ .string()
54
+ .optional()
55
+ .describe('tree only: opaque pagination cursor from a prior response\'s nextCursor'),
56
+ ticketId: zod_1.z
57
+ .number()
58
+ .int()
59
+ .positive()
60
+ .optional()
61
+ .describe('tree/provenance: narrow to files touched by this ticket'),
62
+ jobId: zod_1.z
63
+ .string()
64
+ .optional()
65
+ .describe('tree/provenance/diff: narrow to a job; required for diff'),
66
+ overrideBudget: zod_1.z
67
+ .boolean()
68
+ .optional()
69
+ .describe('regenerate_summary only: bypass the monthly summary budget cap. Privileged — ' +
70
+ 'incurs cost beyond the configured limit.'),
71
+ },
72
+ async handler(ctx, args) {
73
+ const base = (0, types_1.projectPath)(ctx, args.projectId);
74
+ const action = args.action;
75
+ const requirePath = () => {
76
+ const p = args.path;
77
+ if (!p || p.trim() === '')
78
+ throw new Error(`Action "${action}" requires a "path".`);
79
+ return p;
80
+ };
81
+ switch (action) {
82
+ case 'tree': {
83
+ const qs = new URLSearchParams();
84
+ if (args.filter)
85
+ qs.set('filter', args.filter);
86
+ if (args.withProvenance === true)
87
+ qs.set('withProvenance', '1');
88
+ if (args.cursor)
89
+ qs.set('cursor', args.cursor);
90
+ if (typeof args.ticketId === 'number')
91
+ qs.set('ticketId', String(args.ticketId));
92
+ if (args.jobId)
93
+ qs.set('jobId', args.jobId);
94
+ const suffix = qs.toString() ? `?${qs.toString()}` : '';
95
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/code/tree${suffix}`);
96
+ }
97
+ case 'read_file': {
98
+ const qs = new URLSearchParams({ path: requirePath() });
99
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/code/file?${qs.toString()}`);
100
+ }
101
+ case 'summary': {
102
+ const qs = new URLSearchParams({ path: requirePath() });
103
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/code/summary?${qs.toString()}`);
104
+ }
105
+ case 'regenerate_summary': {
106
+ const qs = new URLSearchParams({ path: requirePath() });
107
+ const r = (await (0, types_1.apiCall)(ctx, 'POST', `${base}/code/file/regenerate-summary?${qs.toString()}`, { overrideBudget: args.overrideBudget === true }));
108
+ // 202 → enqueued; 200 → { skipped: '...' }. Either way the real
109
+ // outcome (summary ready / failed / skipped) arrives over WS, not in
110
+ // this response, so always point the caller at the live channel.
111
+ return {
112
+ ...r,
113
+ hint: 'Summary generation is async and cost-incurring. The outcome arrives over the ' +
114
+ 'WS channel as file.summary_updated / file.summary_failed / file.summary_skipped ' +
115
+ "(reason: 'budget'|'per-job-cap'|'ttl'|'not-found'), NOT in this response. A 202 " +
116
+ '{ enqueued: true } only means it was queued; a 200 { skipped } means it never ran.',
117
+ };
118
+ }
119
+ case 'provenance': {
120
+ const qs = new URLSearchParams();
121
+ if (typeof args.ticketId === 'number')
122
+ qs.set('ticketId', String(args.ticketId));
123
+ if (args.jobId)
124
+ qs.set('jobId', args.jobId);
125
+ if (args.path)
126
+ qs.set('path', args.path);
127
+ if (![...qs.keys()].length) {
128
+ throw new Error('Action "provenance" requires at least one of: ticketId, jobId, path.');
129
+ }
130
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/code/provenance?${qs.toString()}`);
131
+ }
132
+ case 'diff': {
133
+ const jobId = args.jobId;
134
+ if (!jobId)
135
+ throw new Error('Action "diff" requires a "jobId".');
136
+ const qs = new URLSearchParams({ jobId, path: requirePath() });
137
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/code/diff?${qs.toString()}`);
138
+ }
139
+ default:
140
+ throw new Error(`Unknown action "${action}".`);
141
+ }
142
+ },
143
+ },
144
+ ];
145
+ }
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jiraTools = jiraTools;
4
+ const zod_1 = require("zod");
5
+ const types_1 = require("./types");
6
+ /**
7
+ * Per-project Jira integration facade. Maps each action to the corresponding
8
+ * `/api/projects/:projectId/jira/*` route (server/jira-router.ts). Every op is
9
+ * project-scoped and external-network-bound (live HTTPS to the customer's Jira
10
+ * Cloud / Data Center instance with their stored or supplied credentials).
11
+ *
12
+ * SECURITY: the Jira API token / PAT is a high-value SECRET. It is passed as a
13
+ * plaintext `token` field on test / discover_projects / discover_statuses /
14
+ * connect; never log or echo it, and it is never returned on reads (GET
15
+ * /connection redacts it to `hasToken`).
16
+ *
17
+ * ID SCOPING: spec_details / discard_spec take the LOCAL monotonic ticket id
18
+ * (NOT a Jira `PROJ-123` key); retry_outbox takes the LOCAL outbox row id. Map
19
+ * Jira keys → local ids via the `links` action first.
20
+ */
21
+ function jiraTools() {
22
+ return [
23
+ {
24
+ name: 'specrails_jira',
25
+ title: 'Jira integration',
26
+ description: 'Manage a project\'s Jira-backed specs (each project syncs with its own Jira board). Read connection/links/outbox, run the connect wizard, sync, and create/discard Jira-backed specs. ' +
27
+ 'Actions: connection (get current connection, token redacted), test (validate creds), discover_projects, discover_statuses (with throwaway creds), connect (persist connection — write), update_connection (enable/disable hot-swap + statusMap/discardStatus — write), disconnect (remove connection + restore local write access — destructive), statuses (connected project\'s real statuses), sync (full re-fetch of the board — write, long-running on big boards), resume (drain parked outbox after re-auth — write), outbox (list ops + counts), retry_outbox (re-queue a dead-lettered op — write), create_spec (create a real Jira issue — write), discard_spec (move linked issue to discard status — write), spec_details (read-only Jira fields + dev panel), links (spec↔issue link map). ' +
28
+ 'The `token` param is a SECRET (Jira API token / PAT) — only required for test/discover_projects/discover_statuses/connect; it is never returned on reads.',
29
+ hintTier: 'read',
30
+ tier: (a) => {
31
+ const action = a.action;
32
+ if (action === 'disconnect')
33
+ return 'destructive';
34
+ if ([
35
+ 'connect',
36
+ 'update_connection',
37
+ 'sync',
38
+ 'resume',
39
+ 'retry_outbox',
40
+ 'create_spec',
41
+ 'discard_spec',
42
+ ].includes(action)) {
43
+ return 'write';
44
+ }
45
+ return 'read';
46
+ },
47
+ inputSchema: {
48
+ action: zod_1.z
49
+ .enum([
50
+ 'connection',
51
+ 'test',
52
+ 'discover_projects',
53
+ 'discover_statuses',
54
+ 'connect',
55
+ 'update_connection',
56
+ 'disconnect',
57
+ 'statuses',
58
+ 'sync',
59
+ 'resume',
60
+ 'outbox',
61
+ 'retry_outbox',
62
+ 'create_spec',
63
+ 'discard_spec',
64
+ 'spec_details',
65
+ 'links',
66
+ ])
67
+ .describe('Jira operation to perform'),
68
+ projectId: zod_1.z.string().optional().describe('Project id (defaults to the active project)'),
69
+ // Credential / probe fields (test, discover_projects, discover_statuses, connect)
70
+ baseUrl: zod_1.z
71
+ .string()
72
+ .optional()
73
+ .describe('Jira base URL, e.g. https://acme.atlassian.net (test / discover_* / connect)'),
74
+ accountEmail: zod_1.z
75
+ .string()
76
+ .optional()
77
+ .describe('Jira account email — required for Cloud Basic auth (test / discover_* / connect)'),
78
+ token: zod_1.z
79
+ .string()
80
+ .optional()
81
+ .describe('SECRET: Jira API token (Cloud) or PAT (Data Center). Required for test / discover_projects / discover_statuses / connect. Never returned on reads.'),
82
+ query: zod_1.z.string().optional().describe('Optional name filter for discover_projects'),
83
+ projectKey: zod_1.z
84
+ .string()
85
+ .optional()
86
+ .describe('Jira project key to inspect statuses for (discover_statuses)'),
87
+ jiraProjectKey: zod_1.z
88
+ .string()
89
+ .optional()
90
+ .describe('Jira project key to connect this project to (connect)'),
91
+ statusMap: zod_1.z
92
+ .record(zod_1.z.string(), zod_1.z.string())
93
+ .optional()
94
+ .describe('Optional map of logical states (todo / in_progress / done / cancelled) → Jira status name (connect / update_connection)'),
95
+ discardStatus: zod_1.z
96
+ .string()
97
+ .optional()
98
+ .describe('Jira status name the discard action moves an issue to; empty string clears it (connect / update_connection)'),
99
+ // update_connection
100
+ enabled: zod_1.z
101
+ .boolean()
102
+ .optional()
103
+ .describe('Hot-swap toggle: true re-arms Jira write-back (read-only local backlog), false restores local write access (update_connection)'),
104
+ // create_spec
105
+ title: zod_1.z.string().optional().describe('Issue summary/title (create_spec)'),
106
+ description: zod_1.z.string().optional().describe('Issue description (create_spec)'),
107
+ labels: zod_1.z.array(zod_1.z.string()).optional().describe('Issue labels (create_spec)'),
108
+ priority: zod_1.z.string().optional().describe('Jira priority name (create_spec)'),
109
+ issueType: zod_1.z.string().optional().describe('Jira issue type; defaults to Task (create_spec)'),
110
+ // discard_spec / spec_details
111
+ localId: zod_1.z
112
+ .number()
113
+ .optional()
114
+ .describe('LOCAL monotonic ticket id (discard_spec / spec_details) — NOT a Jira key; map via the links action'),
115
+ comment: zod_1.z.string().optional().describe('Optional reason comment posted on discard (discard_spec)'),
116
+ // retry_outbox
117
+ opId: zod_1.z
118
+ .number()
119
+ .optional()
120
+ .describe('LOCAL outbox row id of a dead-lettered op to re-queue (retry_outbox)'),
121
+ // outbox
122
+ state: zod_1.z
123
+ .enum(['pending', 'inflight', 'done', 'dead'])
124
+ .optional()
125
+ .describe('Filter outbox ops by state (outbox); omit for all'),
126
+ },
127
+ async handler(ctx, args) {
128
+ const base = `${(0, types_1.projectPath)(ctx, args.projectId)}/jira`;
129
+ const action = args.action;
130
+ switch (action) {
131
+ case 'connection':
132
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/connection`);
133
+ case 'test':
134
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/test`, {
135
+ baseUrl: args.baseUrl,
136
+ accountEmail: args.accountEmail,
137
+ token: args.token,
138
+ });
139
+ case 'discover_projects':
140
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/discover-projects`, {
141
+ baseUrl: args.baseUrl,
142
+ accountEmail: args.accountEmail,
143
+ token: args.token,
144
+ query: args.query,
145
+ });
146
+ case 'discover_statuses':
147
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/discover-statuses`, {
148
+ baseUrl: args.baseUrl,
149
+ accountEmail: args.accountEmail,
150
+ token: args.token,
151
+ projectKey: args.projectKey,
152
+ });
153
+ case 'connect':
154
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/connect`, {
155
+ baseUrl: args.baseUrl,
156
+ accountEmail: args.accountEmail,
157
+ token: args.token,
158
+ jiraProjectKey: args.jiraProjectKey,
159
+ statusMap: args.statusMap,
160
+ discardStatus: args.discardStatus,
161
+ });
162
+ case 'update_connection':
163
+ return (0, types_1.apiCall)(ctx, 'PATCH', `${base}/connection`, {
164
+ enabled: args.enabled,
165
+ discardStatus: args.discardStatus,
166
+ statusMap: args.statusMap,
167
+ });
168
+ case 'disconnect':
169
+ return (0, types_1.apiCall)(ctx, 'DELETE', `${base}/connection`);
170
+ case 'statuses':
171
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/statuses`);
172
+ case 'sync':
173
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/sync`);
174
+ case 'resume':
175
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/resume`);
176
+ case 'outbox': {
177
+ const state = args.state;
178
+ const qs = state ? `?state=${encodeURIComponent(state)}` : '';
179
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/outbox${qs}`);
180
+ }
181
+ case 'retry_outbox': {
182
+ const opId = args.opId;
183
+ if (opId === undefined)
184
+ throw new Error('retry_outbox requires an "opId" (local outbox row id).');
185
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/outbox/${opId}/retry`);
186
+ }
187
+ case 'create_spec':
188
+ return (0, types_1.apiCall)(ctx, 'POST', `${base}/specs`, {
189
+ title: args.title,
190
+ description: args.description,
191
+ labels: args.labels,
192
+ priority: args.priority,
193
+ issueType: args.issueType,
194
+ });
195
+ case 'discard_spec': {
196
+ const localId = args.localId;
197
+ if (localId === undefined)
198
+ throw new Error('discard_spec requires a "localId" (local ticket id).');
199
+ const r = await (0, types_1.apiCall)(ctx, 'POST', `${base}/specs/${localId}/discard`, {
200
+ comment: args.comment,
201
+ });
202
+ // 202 accepted: the transition + optional comment drain asynchronously.
203
+ return {
204
+ ...(typeof r === 'object' && r !== null ? r : { result: r }),
205
+ hint: 'Discard enqueued (202). Use action "outbox" to watch the transition/comment ops drain, or "connection" for live outbox counts.',
206
+ };
207
+ }
208
+ case 'spec_details': {
209
+ const localId = args.localId;
210
+ if (localId === undefined)
211
+ throw new Error('spec_details requires a "localId" (local ticket id).');
212
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/specs/${localId}/details`);
213
+ }
214
+ case 'links':
215
+ return (0, types_1.apiCall)(ctx, 'GET', `${base}/links`);
216
+ default:
217
+ throw new Error(`Unknown action "${action}".`);
218
+ }
219
+ },
220
+ },
221
+ ];
222
+ }