agentstudio 0.3.3 → 0.4.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 (371) hide show
  1. package/bin/agentstudio.js +44 -4
  2. package/bin/agentstudio.js.map +1 -1
  3. package/bin/serviceManager.d.ts.map +1 -1
  4. package/bin/serviceManager.js +312 -28
  5. package/bin/serviceManager.js.map +1 -1
  6. package/config/engineConfig.d.ts +96 -0
  7. package/config/engineConfig.d.ts.map +1 -0
  8. package/config/engineConfig.js +429 -0
  9. package/config/engineConfig.js.map +1 -0
  10. package/engines/claude/__tests__/supportedModels.test.d.ts +10 -0
  11. package/engines/claude/__tests__/supportedModels.test.d.ts.map +1 -0
  12. package/engines/claude/__tests__/supportedModels.test.js +89 -0
  13. package/engines/claude/__tests__/supportedModels.test.js.map +1 -0
  14. package/engines/claude/aguiAdapter.d.ts +101 -0
  15. package/engines/claude/aguiAdapter.d.ts.map +1 -0
  16. package/engines/claude/aguiAdapter.js +382 -0
  17. package/engines/claude/aguiAdapter.js.map +1 -0
  18. package/engines/claude/claudeEngine.d.ts +42 -0
  19. package/engines/claude/claudeEngine.d.ts.map +1 -0
  20. package/engines/claude/claudeEngine.js +325 -0
  21. package/engines/claude/claudeEngine.js.map +1 -0
  22. package/engines/claude/index.d.ts +8 -0
  23. package/engines/claude/index.d.ts.map +1 -0
  24. package/engines/claude/index.js +14 -0
  25. package/engines/claude/index.js.map +1 -0
  26. package/engines/cursor/__tests__/a2aAdapter.test.d.ts +6 -0
  27. package/engines/cursor/__tests__/a2aAdapter.test.d.ts.map +1 -0
  28. package/engines/cursor/__tests__/a2aAdapter.test.js +376 -0
  29. package/engines/cursor/__tests__/a2aAdapter.test.js.map +1 -0
  30. package/engines/cursor/a2aAdapter.d.ts +180 -0
  31. package/engines/cursor/a2aAdapter.d.ts.map +1 -0
  32. package/engines/cursor/a2aAdapter.js +405 -0
  33. package/engines/cursor/a2aAdapter.js.map +1 -0
  34. package/engines/cursor/aguiAdapter.d.ts +97 -0
  35. package/engines/cursor/aguiAdapter.d.ts.map +1 -0
  36. package/engines/cursor/aguiAdapter.js +507 -0
  37. package/engines/cursor/aguiAdapter.js.map +1 -0
  38. package/engines/cursor/cursorEngine.d.ts +68 -0
  39. package/engines/cursor/cursorEngine.d.ts.map +1 -0
  40. package/engines/cursor/cursorEngine.js +465 -0
  41. package/engines/cursor/cursorEngine.js.map +1 -0
  42. package/engines/cursor/index.d.ts +11 -0
  43. package/engines/cursor/index.d.ts.map +1 -0
  44. package/engines/cursor/index.js +21 -0
  45. package/engines/cursor/index.js.map +1 -0
  46. package/engines/engineManager.d.ts +80 -0
  47. package/engines/engineManager.d.ts.map +1 -0
  48. package/engines/engineManager.js +137 -0
  49. package/engines/engineManager.js.map +1 -0
  50. package/engines/index.d.ts +26 -0
  51. package/engines/index.d.ts.map +1 -0
  52. package/engines/index.js +81 -0
  53. package/engines/index.js.map +1 -0
  54. package/engines/types.d.ts +319 -0
  55. package/engines/types.d.ts.map +1 -0
  56. package/engines/types.js +69 -0
  57. package/engines/types.js.map +1 -0
  58. package/index.d.ts.map +1 -1
  59. package/index.js +178 -25
  60. package/index.js.map +1 -1
  61. package/middleware/auth.d.ts.map +1 -1
  62. package/middleware/auth.js +4 -0
  63. package/middleware/auth.js.map +1 -1
  64. package/package.json +7 -1
  65. package/public/assets/AgentsPage-D462iGRy.js +10 -0
  66. package/public/assets/{Button-BoiVlafj.js → Button-B_6lGF64.js} +1 -1
  67. package/public/assets/ChatPage-NjuRQPaL.js +478 -0
  68. package/public/assets/{CommandForm-Se4iemMp.js → CommandForm-DwGvE9A_.js} +1 -1
  69. package/public/assets/CommandsPage-DeUS8fhJ.js +1 -0
  70. package/public/assets/CursorConfigPage-Bl1Blrbr.js +1 -0
  71. package/public/assets/{DashboardPage-DbCVzPKz.js → DashboardPage-DH-2iuqf.js} +1 -1
  72. package/public/assets/EngineGate-DxTYx9wb.js +1 -0
  73. package/public/assets/{FileBrowser-DcoBWzKK.js → FileBrowser-CeGsJnUL.js} +5 -5
  74. package/public/assets/{FileExplorer-B41BB0LM.js → FileExplorer-x5R0Tcmk.js} +1 -1
  75. package/public/assets/GeneralSettingsPage-lhNEJQD_.js +1 -0
  76. package/public/assets/HooksPage-9fingjdz.js +1 -0
  77. package/public/assets/LandingPage-BAzi8PDo.js +1 -0
  78. package/public/assets/LoginPage-kQ_NWy8p.js +16 -0
  79. package/public/assets/McpAdminSettingsPage-DQHpWHRC.js +7 -0
  80. package/public/assets/McpPage-DLHfmhSJ.js +20 -0
  81. package/public/assets/{MemorySettingsPage-DYSuz-hU.js → MemorySettingsPage-CRIPja9X.js} +1 -1
  82. package/public/assets/ModelsPage-Bb5vSsuc.js +1 -0
  83. package/public/assets/PluginsPage-BhKM7gV7.js +12 -0
  84. package/public/assets/ProjectSelector-Cbct6pnn.js +1 -0
  85. package/public/assets/ProjectsPage-lQo7-7dt.js +21 -0
  86. package/public/assets/RulesPage-BRnB7__3.js +1 -0
  87. package/public/assets/ScheduledTasksPage-CZiABTSb.js +1 -0
  88. package/public/assets/SettingsLayout-BfG7ftoT.js +1 -0
  89. package/public/assets/SkillsPage-CL6MKxQ9.js +18 -0
  90. package/public/assets/{SubagentForm-C0R084ja.js → SubagentForm-BzzeWg0W.js} +2 -2
  91. package/public/assets/{SubagentsPage-BKFNmqxg.js → SubagentsPage-DhFP2kDE.js} +1 -1
  92. package/public/assets/SystemInfoPage-CFHUN3j8.js +1 -0
  93. package/public/assets/{TelemetrySettingsPage-Ck2btMol.js → TelemetrySettingsPage-BcZFVBXN.js} +1 -1
  94. package/public/assets/{ToastTestPage-B79DFhqI.js → ToastTestPage-BtGnZdyk.js} +1 -1
  95. package/public/assets/{ToolsList-Kfxwp80g.js → ToolsList-CTsQr53G.js} +1 -1
  96. package/public/assets/{UnifiedToolSelector-CkafUbz3.js → UnifiedToolSelector-BP6fuyzG.js} +1 -1
  97. package/public/assets/VersionSettingsPage-DjOjyL3X.js +5 -0
  98. package/public/assets/VoiceSettingsPage-d3l9AWBn.js +1 -0
  99. package/public/assets/WebSocketTunnelPage-CfHtJR9r.js +1 -0
  100. package/public/assets/_basePickBy-Bac3af5O.js +1 -0
  101. package/public/assets/{_baseUniq-COj5YnAO.js → _baseUniq-Dvh9sZ-T.js} +1 -1
  102. package/public/assets/{agents-3mB536QF.js → agents-KlPdWQ8K.js} +1 -1
  103. package/public/assets/arc-CRR5EPpK.js +1 -0
  104. package/public/assets/{architectureDiagram-VXUJARFQ-DD1BwT1T.js → architectureDiagram-VXUJARFQ-Ct1p8kmV.js} +1 -1
  105. package/public/assets/{blockDiagram-VD42YOAC-DFKUIZc6.js → blockDiagram-VD42YOAC-CX_8YiYn.js} +1 -1
  106. package/public/assets/{c4Diagram-YG6GDRKO-B0VVIIvh.js → c4Diagram-YG6GDRKO-BIBVWIY4.js} +1 -1
  107. package/public/assets/channel-CPs-2Y_m.js +1 -0
  108. package/public/assets/{chunk-4BX2VUAB-DM8J7YO9.js → chunk-4BX2VUAB-CQNNXsb5.js} +1 -1
  109. package/public/assets/{chunk-55IACEB6-BjhdmGlM.js → chunk-55IACEB6-N_ZrGhOu.js} +1 -1
  110. package/public/assets/{chunk-B4BG7PRW-1RJ6n2xv.js → chunk-B4BG7PRW-CI6DkhbM.js} +1 -1
  111. package/public/assets/{chunk-DI55MBZ5-1-EHSO67.js → chunk-DI55MBZ5-Dgj-Eo9U.js} +1 -1
  112. package/public/assets/{chunk-FMBD7UC4-DV3SMJK_.js → chunk-FMBD7UC4-o4B0HzSK.js} +1 -1
  113. package/public/assets/{chunk-QN33PNHL-IlsCTdDq.js → chunk-QN33PNHL-DXlfdPIk.js} +1 -1
  114. package/public/assets/{chunk-QZHKN3VN-DJXs-Fqo.js → chunk-QZHKN3VN-ZCBUGD7e.js} +1 -1
  115. package/public/assets/{chunk-TZMSLE5B-BxHO9wa1.js → chunk-TZMSLE5B-N3lZ106d.js} +1 -1
  116. package/public/assets/classDiagram-2ON5EDUG-DCwNRxvC.js +1 -0
  117. package/public/assets/classDiagram-v2-WZHVMYZB-DCwNRxvC.js +1 -0
  118. package/public/assets/clone-C3DcKvhB.js +1 -0
  119. package/public/assets/{cose-bilkent-S5V4N54A-BVJXoW_K.js → cose-bilkent-S5V4N54A-Crc39J9q.js} +1 -1
  120. package/public/assets/{dagre-6UL2VRFP-DHDnVshA.js → dagre-6UL2VRFP-nC3WLCf7.js} +1 -1
  121. package/public/assets/{diagram-PSM6KHXK-40qGxDeg.js → diagram-PSM6KHXK-B5DQIDQ3.js} +1 -1
  122. package/public/assets/diagram-QEK2KX5R-BccDOQuz.js +43 -0
  123. package/public/assets/{diagram-S2PKOQOG-D7AX72a5.js → diagram-S2PKOQOG-D-Cv16WE.js} +1 -1
  124. package/public/assets/{erDiagram-Q2GNP2WA-BHsgeBpL.js → erDiagram-Q2GNP2WA-Dr0ZgvnS.js} +1 -1
  125. package/public/assets/{flowDiagram-NV44I4VS-BYqChOSE.js → flowDiagram-NV44I4VS-DGbbfVi5.js} +1 -1
  126. package/public/assets/{ganttDiagram-LVOFAZNH-CZFFSLKX.js → ganttDiagram-LVOFAZNH-C-3Wnf96.js} +1 -1
  127. package/public/assets/{gitGraphDiagram-NY62KEGX-C5Bgrf0J.js → gitGraphDiagram-NY62KEGX--Q8whT5z.js} +1 -1
  128. package/public/assets/{graph-BP5lFRBg.js → graph-CO1DMS2E.js} +1 -1
  129. package/public/assets/{index-BEPv9Bqe.js → index-B5hSSnK3.js} +58 -58
  130. package/public/assets/index-gbHlIp96.css +1 -0
  131. package/public/assets/infoDiagram-F6ZHWCRC-DSR9cM2B.js +2 -0
  132. package/public/assets/{journeyDiagram-XKPGCS4Q--abC1RHz.js → journeyDiagram-XKPGCS4Q-Cc00zHNt.js} +1 -1
  133. package/public/assets/{kanban-definition-3W4ZIXB7-BJeChfWu.js → kanban-definition-3W4ZIXB7-BF_gHshF.js} +6 -6
  134. package/public/assets/{layout-DjAix4WK.js → layout-BxoLV88o.js} +1 -1
  135. package/public/assets/{linear-Cw0z8VNY.js → linear-Y8e2e012.js} +1 -1
  136. package/public/assets/{mindmap-definition-VGOIOE7T-U_T9xIUk.js → mindmap-definition-VGOIOE7T-CzpuQA4p.js} +1 -1
  137. package/public/assets/{pieDiagram-ADFJNKIX-B0mT9OgH.js → pieDiagram-ADFJNKIX-B22MhIcy.js} +2 -2
  138. package/public/assets/{quadrantDiagram-AYHSOK5B-BWdlgO0u.js → quadrantDiagram-AYHSOK5B-CTT9bIA8.js} +1 -1
  139. package/public/assets/{requirementDiagram-UZGBJVZJ-B-8LxsGB.js → requirementDiagram-UZGBJVZJ-B_vjXDH9.js} +1 -1
  140. package/public/assets/{sankeyDiagram-TZEHDZUN-OXuxkgGA.js → sankeyDiagram-TZEHDZUN-CKfZ4633.js} +1 -1
  141. package/public/assets/{sequenceDiagram-WL72ISMW-Bt5twlzi.js → sequenceDiagram-WL72ISMW-BmTPN6j6.js} +1 -1
  142. package/public/assets/{stateDiagram-FKZM4ZOC-Dmph7TeW.js → stateDiagram-FKZM4ZOC-y2fQE1C7.js} +1 -1
  143. package/public/assets/stateDiagram-v2-4FDKWEC3-C4CM6z52.js +1 -0
  144. package/public/assets/{table-DjMdAdjH.js → table-BJUz-ck5.js} +1 -1
  145. package/public/assets/{timeline-definition-IT6M3QCI-CcV8nyIH.js → timeline-definition-IT6M3QCI-DsXlR68n.js} +1 -1
  146. package/public/assets/{tools-BAI9XHGS.js → tools-BZTR2NP1.js} +1 -1
  147. package/public/assets/{treemap-KMMF4GRG-DBuwkj4f.js → treemap-KMMF4GRG-Cecs9uxX.js} +1 -1
  148. package/public/assets/{ui-components-DaGtjl0g.js → ui-components-DjgDPiqV.js} +153 -128
  149. package/public/assets/useAgents-8KXN6U61.js +2 -0
  150. package/public/assets/{useClaudeVersions-Cy71v4HE.js → useClaudeVersions-DicHLV6A.js} +1 -1
  151. package/public/assets/useCommands-DbSH48ba.js +1 -0
  152. package/public/assets/{useProjects-XgfgISgV.js → useProjects-Bbh6hJMM.js} +1 -1
  153. package/public/assets/{useSessions-CQgq4d84.js → useSessions-DOa4-xiB.js} +1 -1
  154. package/public/assets/{xychartDiagram-PRI3JC2R-Bo9K-U2S.js → xychartDiagram-PRI3JC2R-C2IWhyM7.js} +1 -1
  155. package/public/index.html +5 -5
  156. package/routes/a2a.d.ts +7 -0
  157. package/routes/a2a.d.ts.map +1 -1
  158. package/routes/a2a.js +193 -21
  159. package/routes/a2a.js.map +1 -1
  160. package/routes/agents.d.ts.map +1 -1
  161. package/routes/agents.js +45 -2
  162. package/routes/agents.js.map +1 -1
  163. package/routes/agui.d.ts +16 -0
  164. package/routes/agui.d.ts.map +1 -0
  165. package/routes/agui.js +520 -0
  166. package/routes/agui.js.map +1 -0
  167. package/routes/commands.d.ts.map +1 -1
  168. package/routes/commands.js +35 -3
  169. package/routes/commands.js.map +1 -1
  170. package/routes/cursorA2a.d.ts +18 -0
  171. package/routes/cursorA2a.d.ts.map +1 -0
  172. package/routes/cursorA2a.js +393 -0
  173. package/routes/cursorA2a.js.map +1 -0
  174. package/routes/engine.d.ts +12 -0
  175. package/routes/engine.d.ts.map +1 -0
  176. package/routes/engine.js +178 -0
  177. package/routes/engine.js.map +1 -0
  178. package/routes/gitVersions.d.ts +10 -0
  179. package/routes/gitVersions.d.ts.map +1 -0
  180. package/routes/gitVersions.js +147 -0
  181. package/routes/gitVersions.js.map +1 -0
  182. package/routes/hooks.d.ts +11 -0
  183. package/routes/hooks.d.ts.map +1 -0
  184. package/routes/hooks.js +303 -0
  185. package/routes/hooks.js.map +1 -0
  186. package/routes/mcp.d.ts.map +1 -1
  187. package/routes/mcp.js +28 -3
  188. package/routes/mcp.js.map +1 -1
  189. package/routes/plugins.d.ts.map +1 -1
  190. package/routes/plugins.js +317 -4
  191. package/routes/plugins.js.map +1 -1
  192. package/routes/rules.d.ts +9 -0
  193. package/routes/rules.d.ts.map +1 -0
  194. package/routes/rules.js +470 -0
  195. package/routes/rules.js.map +1 -0
  196. package/routes/sessions.d.ts.map +1 -1
  197. package/routes/sessions.js +68 -32
  198. package/routes/sessions.js.map +1 -1
  199. package/routes/speechToText.d.ts +8 -0
  200. package/routes/speechToText.d.ts.map +1 -0
  201. package/routes/speechToText.js +216 -0
  202. package/routes/speechToText.js.map +1 -0
  203. package/schemas/a2a.d.ts +2 -2
  204. package/services/__tests__/agentImporter.test.d.ts +5 -0
  205. package/services/__tests__/agentImporter.test.d.ts.map +1 -0
  206. package/services/__tests__/agentImporter.test.js +379 -0
  207. package/services/__tests__/agentImporter.test.js.map +1 -0
  208. package/services/__tests__/marketplaceUpdateService.test.d.ts +5 -0
  209. package/services/__tests__/marketplaceUpdateService.test.d.ts.map +1 -0
  210. package/services/__tests__/marketplaceUpdateService.test.js +227 -0
  211. package/services/__tests__/marketplaceUpdateService.test.js.map +1 -0
  212. package/services/__tests__/pluginInstaller.test.js +172 -0
  213. package/services/__tests__/pluginInstaller.test.js.map +1 -1
  214. package/services/__tests__/projectMetadataStorage.test.js +19 -4
  215. package/services/__tests__/projectMetadataStorage.test.js.map +1 -1
  216. package/services/a2a/__tests__/agentCardService.test.js +224 -0
  217. package/services/a2a/__tests__/agentCardService.test.js.map +1 -1
  218. package/services/a2a/__tests__/cursorA2aService.test.d.ts +6 -0
  219. package/services/a2a/__tests__/cursorA2aService.test.d.ts.map +1 -0
  220. package/services/a2a/__tests__/cursorA2aService.test.js +359 -0
  221. package/services/a2a/__tests__/cursorA2aService.test.js.map +1 -0
  222. package/services/a2a/agentCardService.d.ts +22 -0
  223. package/services/a2a/agentCardService.d.ts.map +1 -1
  224. package/services/a2a/agentCardService.js +246 -0
  225. package/services/a2a/agentCardService.js.map +1 -1
  226. package/services/a2a/cursorA2aService.d.ts +126 -0
  227. package/services/a2a/cursorA2aService.d.ts.map +1 -0
  228. package/services/a2a/cursorA2aService.js +336 -0
  229. package/services/a2a/cursorA2aService.js.map +1 -0
  230. package/services/agentImporter.d.ts +62 -0
  231. package/services/agentImporter.d.ts.map +1 -0
  232. package/services/agentImporter.js +335 -0
  233. package/services/agentImporter.js.map +1 -0
  234. package/services/cursorConfigService.d.ts +75 -0
  235. package/services/cursorConfigService.d.ts.map +1 -0
  236. package/services/cursorConfigService.js +538 -0
  237. package/services/cursorConfigService.js.map +1 -0
  238. package/services/gitVersionService.d.ts +52 -0
  239. package/services/gitVersionService.d.ts.map +1 -0
  240. package/services/gitVersionService.js +377 -0
  241. package/services/gitVersionService.js.map +1 -0
  242. package/services/marketplaceUpdateService.d.ts +66 -0
  243. package/services/marketplaceUpdateService.d.ts.map +1 -0
  244. package/services/marketplaceUpdateService.js +364 -0
  245. package/services/marketplaceUpdateService.js.map +1 -0
  246. package/services/mcpAdmin/__tests__/scheduledTaskTools.test.d.ts +5 -0
  247. package/services/mcpAdmin/__tests__/scheduledTaskTools.test.d.ts.map +1 -0
  248. package/services/mcpAdmin/__tests__/scheduledTaskTools.test.js +429 -0
  249. package/services/mcpAdmin/__tests__/scheduledTaskTools.test.js.map +1 -0
  250. package/services/mcpAdmin/tools/index.d.ts +1 -0
  251. package/services/mcpAdmin/tools/index.d.ts.map +1 -1
  252. package/services/mcpAdmin/tools/index.js +5 -1
  253. package/services/mcpAdmin/tools/index.js.map +1 -1
  254. package/services/mcpAdmin/tools/scheduledTaskTools.d.ts +64 -0
  255. package/services/mcpAdmin/tools/scheduledTaskTools.d.ts.map +1 -0
  256. package/services/mcpAdmin/tools/scheduledTaskTools.js +1002 -0
  257. package/services/mcpAdmin/tools/scheduledTaskTools.js.map +1 -0
  258. package/services/mcpAdmin/types.d.ts +1 -1
  259. package/services/mcpAdmin/types.d.ts.map +1 -1
  260. package/services/pluginInstaller.d.ts +55 -1
  261. package/services/pluginInstaller.d.ts.map +1 -1
  262. package/services/pluginInstaller.js +437 -13
  263. package/services/pluginInstaller.js.map +1 -1
  264. package/services/projectMetadataStorage.d.ts.map +1 -1
  265. package/services/projectMetadataStorage.js +4 -2
  266. package/services/projectMetadataStorage.js.map +1 -1
  267. package/services/sessionEventBus.d.ts +67 -0
  268. package/services/sessionEventBus.d.ts.map +1 -0
  269. package/services/sessionEventBus.js +106 -0
  270. package/services/sessionEventBus.js.map +1 -0
  271. package/services/sessionManager.d.ts.map +1 -1
  272. package/services/sessionManager.js +4 -2
  273. package/services/sessionManager.js.map +1 -1
  274. package/services/speechToText/__tests__/speechToText.test.d.ts +5 -0
  275. package/services/speechToText/__tests__/speechToText.test.d.ts.map +1 -0
  276. package/services/speechToText/__tests__/speechToText.test.js +208 -0
  277. package/services/speechToText/__tests__/speechToText.test.js.map +1 -0
  278. package/services/speechToText/index.d.ts +25 -0
  279. package/services/speechToText/index.d.ts.map +1 -0
  280. package/services/speechToText/index.js +228 -0
  281. package/services/speechToText/index.js.map +1 -0
  282. package/services/speechToText/providers/aliyun.d.ts +22 -0
  283. package/services/speechToText/providers/aliyun.d.ts.map +1 -0
  284. package/services/speechToText/providers/aliyun.js +185 -0
  285. package/services/speechToText/providers/aliyun.js.map +1 -0
  286. package/services/speechToText/providers/google.d.ts +24 -0
  287. package/services/speechToText/providers/google.d.ts.map +1 -0
  288. package/services/speechToText/providers/google.js +205 -0
  289. package/services/speechToText/providers/google.js.map +1 -0
  290. package/services/speechToText/providers/openaiCompatible.d.ts +22 -0
  291. package/services/speechToText/providers/openaiCompatible.d.ts.map +1 -0
  292. package/services/speechToText/providers/openaiCompatible.js +198 -0
  293. package/services/speechToText/providers/openaiCompatible.js.map +1 -0
  294. package/services/speechToText/providers/tencent.d.ts +23 -0
  295. package/services/speechToText/providers/tencent.d.ts.map +1 -0
  296. package/services/speechToText/providers/tencent.js +215 -0
  297. package/services/speechToText/providers/tencent.js.map +1 -0
  298. package/services/speechToText/types.d.ts +102 -0
  299. package/services/speechToText/types.d.ts.map +1 -0
  300. package/services/speechToText/types.js +43 -0
  301. package/services/speechToText/types.js.map +1 -0
  302. package/services/taskExecutor/__tests__/mcp-tools-integration.test.d.ts +8 -2
  303. package/services/taskExecutor/__tests__/mcp-tools-integration.test.d.ts.map +1 -1
  304. package/services/taskExecutor/__tests__/mcp-tools-integration.test.js +215 -72
  305. package/services/taskExecutor/__tests__/mcp-tools-integration.test.js.map +1 -1
  306. package/services/taskExecutor/taskWorker.js +9 -1
  307. package/services/taskExecutor/taskWorker.js.map +1 -1
  308. package/services/telemetry.js +1 -1
  309. package/types/a2a.d.ts +20 -0
  310. package/types/a2a.d.ts.map +1 -1
  311. package/types/engine.d.ts +314 -0
  312. package/types/engine.d.ts.map +1 -0
  313. package/types/engine.js +14 -0
  314. package/types/engine.js.map +1 -0
  315. package/types/hooks.d.ts +45 -0
  316. package/types/hooks.d.ts.map +1 -0
  317. package/types/hooks.js +9 -0
  318. package/types/hooks.js.map +1 -0
  319. package/types/plugins.d.ts +86 -2
  320. package/types/plugins.d.ts.map +1 -1
  321. package/types/plugins.js +1 -0
  322. package/types/plugins.js.map +1 -1
  323. package/types/rules.d.ts +51 -0
  324. package/types/rules.d.ts.map +1 -0
  325. package/types/rules.js +9 -0
  326. package/types/rules.js.map +1 -0
  327. package/utils/__tests__/cursorIdeAgentParser.test.d.ts +7 -0
  328. package/utils/__tests__/cursorIdeAgentParser.test.d.ts.map +1 -0
  329. package/utils/__tests__/cursorIdeAgentParser.test.js +289 -0
  330. package/utils/__tests__/cursorIdeAgentParser.test.js.map +1 -0
  331. package/utils/claudeUtils.d.ts +3 -1
  332. package/utils/claudeUtils.d.ts.map +1 -1
  333. package/utils/claudeUtils.js +26 -12
  334. package/utils/claudeUtils.js.map +1 -1
  335. package/utils/cursorCliHistoryParser.d.ts +58 -0
  336. package/utils/cursorCliHistoryParser.d.ts.map +1 -0
  337. package/utils/cursorCliHistoryParser.js +664 -0
  338. package/utils/cursorCliHistoryParser.js.map +1 -0
  339. package/utils/cursorIdeAgentParser.d.ts +49 -0
  340. package/utils/cursorIdeAgentParser.d.ts.map +1 -0
  341. package/utils/cursorIdeAgentParser.js +332 -0
  342. package/utils/cursorIdeAgentParser.js.map +1 -0
  343. package/public/assets/AgentsPage-gSnkPp2k.js +0 -10
  344. package/public/assets/ChatPage-BMrfVkpt.js +0 -471
  345. package/public/assets/CommandsPage-B6u4IO7L.js +0 -1
  346. package/public/assets/GeneralSettingsPage-BbEbWJUQ.js +0 -1
  347. package/public/assets/LandingPage-DFPm2d4Y.js +0 -1
  348. package/public/assets/LoginPage-D5kZJqhk.js +0 -16
  349. package/public/assets/McpAdminSettingsPage-D32iUEjH.js +0 -7
  350. package/public/assets/McpPage-QT4qs391.js +0 -20
  351. package/public/assets/PluginsPage-BotzuK9f.js +0 -1
  352. package/public/assets/ProjectSelector-DujNObqr.js +0 -1
  353. package/public/assets/ProjectsPage-CRWe6HPl.js +0 -21
  354. package/public/assets/ScheduledTasksPage-Beeurg-w.js +0 -1
  355. package/public/assets/SettingsLayout-BfkBUyI_.js +0 -1
  356. package/public/assets/SkillsPage-B59bAr6W.js +0 -18
  357. package/public/assets/SystemInfoPage-D89s7PjE.js +0 -1
  358. package/public/assets/VersionSettingsPage-CaB4PH6h.js +0 -5
  359. package/public/assets/WebSocketTunnelPage-Cbru_-hL.js +0 -1
  360. package/public/assets/_basePickBy-5fAM04Ra.js +0 -1
  361. package/public/assets/arc-C2gTU2ZR.js +0 -1
  362. package/public/assets/channel-DcVTcy-S.js +0 -1
  363. package/public/assets/classDiagram-2ON5EDUG-BXVT6Q7h.js +0 -1
  364. package/public/assets/classDiagram-v2-WZHVMYZB-BXVT6Q7h.js +0 -1
  365. package/public/assets/clone-Bp6orjIq.js +0 -1
  366. package/public/assets/diagram-QEK2KX5R-BfMGeeRo.js +0 -43
  367. package/public/assets/index-BgR-BTTw.css +0 -1
  368. package/public/assets/infoDiagram-F6ZHWCRC-C6OApgqf.js +0 -2
  369. package/public/assets/stateDiagram-v2-4FDKWEC3-DyE8O3Kx.js +0 -1
  370. package/public/assets/useAgents-D5EDAc_E.js +0 -2
  371. package/public/assets/useCommands-BgoCfyuu.js +0 -1
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /**
3
+ * Engine Configuration API Routes
4
+ *
5
+ * Provides endpoints for:
6
+ * - GET /api/engine - Get current engine configuration
7
+ * - GET /api/engine/capabilities - Get engine capabilities
8
+ * - GET /api/engine/paths - Get engine paths configuration
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const express_1 = require("express");
12
+ const engineConfig_js_1 = require("../config/engineConfig.js");
13
+ const cursorConfigService_js_1 = require("../services/cursorConfigService.js");
14
+ const router = (0, express_1.Router)();
15
+ /**
16
+ * GET /api/engine
17
+ * Get current engine configuration
18
+ */
19
+ router.get('/', (_req, res) => {
20
+ try {
21
+ const config = (0, engineConfig_js_1.getEngineConfig)();
22
+ const response = {
23
+ engine: config.engine,
24
+ name: config.name,
25
+ version: config.version,
26
+ capabilities: config.capabilities,
27
+ paths: config.paths,
28
+ };
29
+ res.json(response);
30
+ }
31
+ catch (error) {
32
+ console.error('Error getting engine config:', error);
33
+ res.status(500).json({
34
+ error: 'Failed to get engine configuration',
35
+ message: error instanceof Error ? error.message : 'Unknown error',
36
+ });
37
+ }
38
+ });
39
+ /**
40
+ * GET /api/engine/capabilities
41
+ * Get engine capabilities only
42
+ */
43
+ router.get('/capabilities', (_req, res) => {
44
+ try {
45
+ const config = (0, engineConfig_js_1.getEngineConfig)();
46
+ res.json(config.capabilities);
47
+ }
48
+ catch (error) {
49
+ console.error('Error getting engine capabilities:', error);
50
+ res.status(500).json({
51
+ error: 'Failed to get engine capabilities',
52
+ message: error instanceof Error ? error.message : 'Unknown error',
53
+ });
54
+ }
55
+ });
56
+ /**
57
+ * GET /api/engine/paths
58
+ * Get engine paths configuration
59
+ */
60
+ router.get('/paths', (_req, res) => {
61
+ try {
62
+ const paths = (0, engineConfig_js_1.getEnginePaths)();
63
+ res.json(paths);
64
+ }
65
+ catch (error) {
66
+ console.error('Error getting engine paths:', error);
67
+ res.status(500).json({
68
+ error: 'Failed to get engine paths',
69
+ message: error instanceof Error ? error.message : 'Unknown error',
70
+ });
71
+ }
72
+ });
73
+ /**
74
+ * GET /api/engine/feature/:feature
75
+ * Check if a specific feature is supported
76
+ */
77
+ router.get('/feature/:feature', (req, res) => {
78
+ try {
79
+ const { feature } = req.params;
80
+ const config = (0, engineConfig_js_1.getEngineConfig)();
81
+ const features = config.capabilities.features;
82
+ if (!(feature in features)) {
83
+ res.status(400).json({
84
+ error: 'Unknown feature',
85
+ message: `Feature "${feature}" is not recognized`,
86
+ validFeatures: Object.keys(features),
87
+ });
88
+ return;
89
+ }
90
+ const supported = (0, engineConfig_js_1.isFeatureSupported)(feature);
91
+ res.json({
92
+ feature,
93
+ supported,
94
+ engine: (0, engineConfig_js_1.getEngineType)(),
95
+ });
96
+ }
97
+ catch (error) {
98
+ console.error('Error checking feature:', error);
99
+ res.status(500).json({
100
+ error: 'Failed to check feature support',
101
+ message: error instanceof Error ? error.message : 'Unknown error',
102
+ });
103
+ }
104
+ });
105
+ /**
106
+ * GET /api/engine/project-data
107
+ * Get project data directory information
108
+ */
109
+ router.get('/project-data', (req, res) => {
110
+ try {
111
+ const { projectPath } = req.query;
112
+ if (!projectPath || typeof projectPath !== 'string') {
113
+ res.status(400).json({
114
+ error: 'Missing projectPath query parameter',
115
+ });
116
+ return;
117
+ }
118
+ const hash = (0, engineConfig_js_1.projectPathToHash)(projectPath);
119
+ const dataDir = (0, engineConfig_js_1.getProjectDataDir)(projectPath);
120
+ res.json({
121
+ projectPath,
122
+ hash,
123
+ dataDir,
124
+ mcpsDir: `${dataDir}/mcps`,
125
+ transcriptsDir: `${dataDir}/agent-transcripts`,
126
+ terminalsDir: `${dataDir}/terminals`,
127
+ assetsDir: `${dataDir}/assets`,
128
+ });
129
+ }
130
+ catch (error) {
131
+ console.error('Error getting project data:', error);
132
+ res.status(500).json({
133
+ error: 'Failed to get project data directory',
134
+ message: error instanceof Error ? error.message : 'Unknown error',
135
+ });
136
+ }
137
+ });
138
+ /**
139
+ * GET /api/engine/cursor-config
140
+ * Get Cursor configuration (MCP, rules, commands, skills, plugins)
141
+ * Only available when running with cursor-cli engine
142
+ */
143
+ router.get('/cursor-config', async (_req, res) => {
144
+ try {
145
+ if (!(0, engineConfig_js_1.isCursorEngine)()) {
146
+ res.status(400).json({
147
+ error: 'Not available',
148
+ message: 'This endpoint is only available when running with cursor-cli engine',
149
+ });
150
+ return;
151
+ }
152
+ const [mcp, rules, commands, skills, plugins, marketplaces] = await Promise.all([
153
+ (0, cursorConfigService_js_1.getMcpServers)(),
154
+ (0, cursorConfigService_js_1.getRules)(),
155
+ (0, cursorConfigService_js_1.getCommands)(),
156
+ (0, cursorConfigService_js_1.getSkills)(),
157
+ (0, cursorConfigService_js_1.getPluginsConfig)(),
158
+ (0, cursorConfigService_js_1.getMarketplacesConfig)(),
159
+ ]);
160
+ res.json({
161
+ mcp,
162
+ rules,
163
+ commands,
164
+ skills,
165
+ plugins,
166
+ marketplaces,
167
+ });
168
+ }
169
+ catch (error) {
170
+ console.error('Error getting Cursor config:', error);
171
+ res.status(500).json({
172
+ error: 'Failed to get Cursor configuration',
173
+ message: error instanceof Error ? error.message : 'Unknown error',
174
+ });
175
+ }
176
+ });
177
+ exports.default = router;
178
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/routes/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Git Version Management API Routes
3
+ *
4
+ * Provides endpoints for managing project versions via Git.
5
+ * All routes are scoped under /api/projects/:projectId/versions
6
+ */
7
+ import express from 'express';
8
+ declare const router: express.Router;
9
+ export default router;
10
+ //# sourceMappingURL=gitVersions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitVersions.d.ts","sourceRoot":"","sources":["../../src/routes/gitVersions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAe9B,QAAA,MAAM,MAAM,EAAE,OAAO,CAAC,MAA8C,CAAC;AAsJrE,eAAe,MAAM,CAAC"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ /**
3
+ * Git Version Management API Routes
4
+ *
5
+ * Provides endpoints for managing project versions via Git.
6
+ * All routes are scoped under /api/projects/:projectId/versions
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const express_1 = __importDefault(require("express"));
13
+ const projectMetadataStorage_1 = require("../services/projectMetadataStorage");
14
+ const gitVersionService_1 = require("../services/gitVersionService");
15
+ const router = express_1.default.Router({ mergeParams: true });
16
+ const projectStorage = new projectMetadataStorage_1.ProjectMetadataStorage();
17
+ /**
18
+ * Resolve project path from the projectId URL parameter.
19
+ * projectId can be an encoded path or a project identifier.
20
+ */
21
+ function resolveProjectPath(projectId) {
22
+ const decodedPath = decodeURIComponent(projectId);
23
+ // Try to look up the project to get the real path
24
+ const project = projectStorage.getProject(decodedPath);
25
+ if (project && project.path) {
26
+ return project.path;
27
+ }
28
+ // Fallback: use decoded path directly
29
+ return decodedPath;
30
+ }
31
+ // ========================================
32
+ // GET /api/projects/:projectId/versions
33
+ // List all versions for a project
34
+ // ========================================
35
+ router.get('/', async (req, res) => {
36
+ try {
37
+ const projectPath = resolveProjectPath(req.params.projectId);
38
+ const versions = await (0, gitVersionService_1.listVersions)(projectPath);
39
+ res.json({ versions });
40
+ }
41
+ catch (error) {
42
+ console.error('[GitVersion] Error listing versions:', error.message);
43
+ res.status(500).json({ error: error.message || 'Failed to list versions' });
44
+ }
45
+ });
46
+ // ========================================
47
+ // GET /api/projects/:projectId/versions/status
48
+ // Get version status (current version, dirty state, etc.)
49
+ // ========================================
50
+ router.get('/status', async (req, res) => {
51
+ try {
52
+ const projectPath = resolveProjectPath(req.params.projectId);
53
+ const status = await (0, gitVersionService_1.getVersionStatus)(projectPath);
54
+ res.json(status);
55
+ }
56
+ catch (error) {
57
+ console.error('[GitVersion] Error getting version status:', error.message);
58
+ res.status(500).json({ error: error.message || 'Failed to get version status' });
59
+ }
60
+ });
61
+ // ========================================
62
+ // POST /api/projects/:projectId/versions
63
+ // Create a new version
64
+ // Body: { message: string }
65
+ // ========================================
66
+ router.post('/', async (req, res) => {
67
+ try {
68
+ const projectPath = resolveProjectPath(req.params.projectId);
69
+ const { message } = req.body;
70
+ if (!message || typeof message !== 'string' || !message.trim()) {
71
+ return res.status(400).json({ error: 'Version message is required' });
72
+ }
73
+ const result = await (0, gitVersionService_1.createVersion)(projectPath, message.trim());
74
+ console.log(`[GitVersion] Created version ${result.tag} for project: ${projectPath}`);
75
+ res.json({
76
+ success: true,
77
+ version: result,
78
+ });
79
+ }
80
+ catch (error) {
81
+ console.error('[GitVersion] Error creating version:', error.message);
82
+ if (error.message.includes('No changes to save')) {
83
+ return res.status(400).json({ error: error.message });
84
+ }
85
+ res.status(500).json({ error: error.message || 'Failed to create version' });
86
+ }
87
+ });
88
+ // ========================================
89
+ // POST /api/projects/:projectId/versions/checkout
90
+ // Switch to a specific version
91
+ // Body: { tag: string, force?: boolean }
92
+ // ========================================
93
+ router.post('/checkout', async (req, res) => {
94
+ try {
95
+ const projectPath = resolveProjectPath(req.params.projectId);
96
+ const { tag, force } = req.body;
97
+ if (!tag || typeof tag !== 'string') {
98
+ return res.status(400).json({ error: 'Version tag is required' });
99
+ }
100
+ await (0, gitVersionService_1.checkoutVersion)(projectPath, tag, !!force);
101
+ console.log(`[GitVersion] Checked out version ${tag} for project: ${projectPath}`);
102
+ res.json({
103
+ success: true,
104
+ message: `Switched to version ${tag}`,
105
+ tag,
106
+ });
107
+ }
108
+ catch (error) {
109
+ console.error('[GitVersion] Error checking out version:', error.message);
110
+ if (error.message === 'DIRTY_WORKING_TREE') {
111
+ return res.status(409).json({
112
+ error: 'Working tree has uncommitted changes',
113
+ code: 'DIRTY_WORKING_TREE',
114
+ message: 'Please save a new version or discard changes before switching versions.',
115
+ });
116
+ }
117
+ if (error.message.includes('not found')) {
118
+ return res.status(404).json({ error: error.message });
119
+ }
120
+ res.status(500).json({ error: error.message || 'Failed to checkout version' });
121
+ }
122
+ });
123
+ // ========================================
124
+ // DELETE /api/projects/:projectId/versions/:tag
125
+ // Delete a version tag
126
+ // ========================================
127
+ router.delete('/:tag', async (req, res) => {
128
+ try {
129
+ const projectPath = resolveProjectPath(req.params.projectId);
130
+ const tag = req.params.tag;
131
+ await (0, gitVersionService_1.deleteVersion)(projectPath, tag);
132
+ console.log(`[GitVersion] Deleted version ${tag} for project: ${projectPath}`);
133
+ res.json({
134
+ success: true,
135
+ message: `Version ${tag} deleted`,
136
+ });
137
+ }
138
+ catch (error) {
139
+ console.error('[GitVersion] Error deleting version:', error.message);
140
+ if (error.message.includes('not found')) {
141
+ return res.status(404).json({ error: error.message });
142
+ }
143
+ res.status(500).json({ error: error.message || 'Failed to delete version' });
144
+ }
145
+ });
146
+ exports.default = router;
147
+ //# sourceMappingURL=gitVersions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitVersions.js","sourceRoot":"","sources":["../../src/routes/gitVersions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Hooks API routes (Claude Code only)
3
+ *
4
+ * Hooks are configured in settings files:
5
+ * - Global: ~/.claude/settings.json
6
+ * - Local: .claude/settings.local.json
7
+ */
8
+ import { Router } from 'express';
9
+ declare const router: Router;
10
+ export default router;
11
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/routes/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAgB,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAQ7D,QAAA,MAAM,MAAM,EAAE,MAAiB,CAAC;AA2UhC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,303 @@
1
+ "use strict";
2
+ /**
3
+ * Hooks API routes (Claude Code only)
4
+ *
5
+ * Hooks are configured in settings files:
6
+ * - Global: ~/.claude/settings.json
7
+ * - Local: .claude/settings.local.json
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ const express_1 = require("express");
14
+ const promises_1 = __importDefault(require("fs/promises"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const os_1 = __importDefault(require("os"));
17
+ const engineConfig_js_1 = require("../config/engineConfig.js");
18
+ const sdkConfig_js_1 = require("../config/sdkConfig.js");
19
+ const router = (0, express_1.Router)();
20
+ // Get global settings file path
21
+ const getGlobalSettingsPath = () => {
22
+ return path_1.default.join(os_1.default.homedir(), '.claude', 'settings.json');
23
+ };
24
+ // Get local settings file path
25
+ const getLocalSettingsPath = (projectPath) => {
26
+ const sdkDirName = (0, sdkConfig_js_1.getSdkDirName)();
27
+ if (projectPath) {
28
+ return path_1.default.join(projectPath, sdkDirName, 'settings.local.json');
29
+ }
30
+ return path_1.default.join(process.cwd(), '..', sdkDirName, 'settings.local.json');
31
+ };
32
+ // Check if file exists
33
+ async function fileExists(filePath) {
34
+ try {
35
+ await promises_1.default.access(filePath);
36
+ return true;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ // Read settings file
43
+ async function readSettingsFile(filePath) {
44
+ try {
45
+ if (!(await fileExists(filePath))) {
46
+ return {};
47
+ }
48
+ const content = await promises_1.default.readFile(filePath, 'utf-8');
49
+ return JSON.parse(content);
50
+ }
51
+ catch (error) {
52
+ console.error(`Error reading settings file ${filePath}:`, error);
53
+ return {};
54
+ }
55
+ }
56
+ // Write settings file
57
+ async function writeSettingsFile(filePath, settings) {
58
+ const dir = path_1.default.dirname(filePath);
59
+ await promises_1.default.mkdir(dir, { recursive: true });
60
+ await promises_1.default.writeFile(filePath, JSON.stringify(settings, null, 2), 'utf-8');
61
+ }
62
+ // Extract hooks from settings
63
+ function extractHooks(settings, scope) {
64
+ const hooksConfig = settings;
65
+ const hooks = hooksConfig.hooks || [];
66
+ return hooks.map((hook, index) => ({
67
+ id: `${scope}:${index}`,
68
+ event: hook.event,
69
+ command: hook.command,
70
+ matcher: hook.matcher,
71
+ enabled: hook.enabled !== false,
72
+ timeout: hook.timeout,
73
+ }));
74
+ }
75
+ // GET /api/hooks - List all hooks
76
+ router.get('/', async (req, res) => {
77
+ try {
78
+ // Hooks are only available in Claude SDK mode
79
+ if ((0, engineConfig_js_1.isCursorEngine)()) {
80
+ res.status(400).json({
81
+ error: 'Not available',
82
+ message: 'Hooks are only available when using Claude SDK engine',
83
+ });
84
+ return;
85
+ }
86
+ const projectPath = req.query.projectPath;
87
+ const scope = req.query.scope || 'all';
88
+ const hooks = [];
89
+ // Read global hooks
90
+ if (scope === 'all' || scope === 'global') {
91
+ const globalSettings = await readSettingsFile(getGlobalSettingsPath());
92
+ const globalHooks = extractHooks(globalSettings, 'global');
93
+ hooks.push(...globalHooks);
94
+ }
95
+ // Read local hooks
96
+ if (scope === 'all' || scope === 'local') {
97
+ const localSettings = await readSettingsFile(getLocalSettingsPath(projectPath));
98
+ const localHooks = extractHooks(localSettings, 'local');
99
+ hooks.push(...localHooks);
100
+ }
101
+ res.json({
102
+ hooks,
103
+ engine: 'claude-sdk',
104
+ });
105
+ }
106
+ catch (error) {
107
+ console.error('Error listing hooks:', error);
108
+ res.status(500).json({ error: 'Failed to list hooks' });
109
+ }
110
+ });
111
+ // GET /api/hooks/:id - Get a single hook
112
+ router.get('/:id', async (req, res) => {
113
+ try {
114
+ if ((0, engineConfig_js_1.isCursorEngine)()) {
115
+ res.status(400).json({
116
+ error: 'Not available',
117
+ message: 'Hooks are only available when using Claude SDK engine',
118
+ });
119
+ return;
120
+ }
121
+ const { id } = req.params;
122
+ const projectPath = req.query.projectPath;
123
+ // Parse id format: scope:index
124
+ const [scope, indexStr] = id.split(':');
125
+ const index = parseInt(indexStr, 10);
126
+ if (!scope || isNaN(index) || !['global', 'local'].includes(scope)) {
127
+ res.status(400).json({ error: 'Invalid hook ID format. Expected: scope:index' });
128
+ return;
129
+ }
130
+ const settingsPath = scope === 'global'
131
+ ? getGlobalSettingsPath()
132
+ : getLocalSettingsPath(projectPath);
133
+ const settings = await readSettingsFile(settingsPath);
134
+ const hooksConfig = settings;
135
+ const hooks = hooksConfig.hooks || [];
136
+ if (index < 0 || index >= hooks.length) {
137
+ res.status(404).json({ error: 'Hook not found' });
138
+ return;
139
+ }
140
+ const hook = hooks[index];
141
+ const hookItem = {
142
+ id,
143
+ event: hook.event,
144
+ command: hook.command,
145
+ matcher: hook.matcher,
146
+ enabled: hook.enabled !== false,
147
+ timeout: hook.timeout,
148
+ };
149
+ res.json({ hook: hookItem });
150
+ }
151
+ catch (error) {
152
+ console.error('Error getting hook:', error);
153
+ res.status(500).json({ error: 'Failed to get hook' });
154
+ }
155
+ });
156
+ // POST /api/hooks - Create a new hook
157
+ router.post('/', async (req, res) => {
158
+ try {
159
+ if ((0, engineConfig_js_1.isCursorEngine)()) {
160
+ res.status(400).json({
161
+ error: 'Not available',
162
+ message: 'Hooks are only available when using Claude SDK engine',
163
+ });
164
+ return;
165
+ }
166
+ const hookData = req.body;
167
+ const projectPath = req.query.projectPath;
168
+ const scope = req.query.scope || 'global';
169
+ if (!hookData.event || !hookData.command) {
170
+ res.status(400).json({ error: 'Missing required fields: event, command' });
171
+ return;
172
+ }
173
+ const validEvents = [
174
+ 'PreToolUse', 'PostToolUse', 'PostToolUseFailure',
175
+ 'PermissionRequest', 'SessionStart', 'UserPromptSubmit', 'Notification'
176
+ ];
177
+ if (!validEvents.includes(hookData.event)) {
178
+ res.status(400).json({ error: `Invalid event type. Must be one of: ${validEvents.join(', ')}` });
179
+ return;
180
+ }
181
+ const settingsPath = scope === 'global'
182
+ ? getGlobalSettingsPath()
183
+ : getLocalSettingsPath(projectPath);
184
+ const settings = await readSettingsFile(settingsPath);
185
+ const hooksConfig = settings;
186
+ if (!hooksConfig.hooks) {
187
+ hooksConfig.hooks = [];
188
+ }
189
+ const newHook = {
190
+ event: hookData.event,
191
+ command: hookData.command,
192
+ matcher: hookData.matcher,
193
+ enabled: hookData.enabled !== false,
194
+ timeout: hookData.timeout,
195
+ };
196
+ hooksConfig.hooks.push(newHook);
197
+ await writeSettingsFile(settingsPath, settings);
198
+ const hookItem = {
199
+ id: `${scope}:${hooksConfig.hooks.length - 1}`,
200
+ ...newHook,
201
+ enabled: newHook.enabled !== false,
202
+ };
203
+ res.status(201).json({ hook: hookItem, message: 'Hook created successfully' });
204
+ }
205
+ catch (error) {
206
+ console.error('Error creating hook:', error);
207
+ res.status(500).json({ error: 'Failed to create hook' });
208
+ }
209
+ });
210
+ // PUT /api/hooks/:id - Update a hook
211
+ router.put('/:id', async (req, res) => {
212
+ try {
213
+ if ((0, engineConfig_js_1.isCursorEngine)()) {
214
+ res.status(400).json({
215
+ error: 'Not available',
216
+ message: 'Hooks are only available when using Claude SDK engine',
217
+ });
218
+ return;
219
+ }
220
+ const { id } = req.params;
221
+ const updateData = req.body;
222
+ const projectPath = req.query.projectPath;
223
+ // Parse id format: scope:index
224
+ const [scope, indexStr] = id.split(':');
225
+ const index = parseInt(indexStr, 10);
226
+ if (!scope || isNaN(index) || !['global', 'local'].includes(scope)) {
227
+ res.status(400).json({ error: 'Invalid hook ID format. Expected: scope:index' });
228
+ return;
229
+ }
230
+ const settingsPath = scope === 'global'
231
+ ? getGlobalSettingsPath()
232
+ : getLocalSettingsPath(projectPath);
233
+ const settings = await readSettingsFile(settingsPath);
234
+ const hooksConfig = settings;
235
+ const hooks = hooksConfig.hooks || [];
236
+ if (index < 0 || index >= hooks.length) {
237
+ res.status(404).json({ error: 'Hook not found' });
238
+ return;
239
+ }
240
+ // Update hook
241
+ const existingHook = hooks[index];
242
+ const updatedHook = {
243
+ event: updateData.event ?? existingHook.event,
244
+ command: updateData.command ?? existingHook.command,
245
+ matcher: updateData.matcher ?? existingHook.matcher,
246
+ enabled: updateData.enabled ?? existingHook.enabled,
247
+ timeout: updateData.timeout ?? existingHook.timeout,
248
+ };
249
+ hooks[index] = updatedHook;
250
+ await writeSettingsFile(settingsPath, settings);
251
+ const hookItem = {
252
+ id,
253
+ ...updatedHook,
254
+ enabled: updatedHook.enabled !== false,
255
+ };
256
+ res.json({ hook: hookItem, message: 'Hook updated successfully' });
257
+ }
258
+ catch (error) {
259
+ console.error('Error updating hook:', error);
260
+ res.status(500).json({ error: 'Failed to update hook' });
261
+ }
262
+ });
263
+ // DELETE /api/hooks/:id - Delete a hook
264
+ router.delete('/:id', async (req, res) => {
265
+ try {
266
+ if ((0, engineConfig_js_1.isCursorEngine)()) {
267
+ res.status(400).json({
268
+ error: 'Not available',
269
+ message: 'Hooks are only available when using Claude SDK engine',
270
+ });
271
+ return;
272
+ }
273
+ const { id } = req.params;
274
+ const projectPath = req.query.projectPath;
275
+ // Parse id format: scope:index
276
+ const [scope, indexStr] = id.split(':');
277
+ const index = parseInt(indexStr, 10);
278
+ if (!scope || isNaN(index) || !['global', 'local'].includes(scope)) {
279
+ res.status(400).json({ error: 'Invalid hook ID format. Expected: scope:index' });
280
+ return;
281
+ }
282
+ const settingsPath = scope === 'global'
283
+ ? getGlobalSettingsPath()
284
+ : getLocalSettingsPath(projectPath);
285
+ const settings = await readSettingsFile(settingsPath);
286
+ const hooksConfig = settings;
287
+ const hooks = hooksConfig.hooks || [];
288
+ if (index < 0 || index >= hooks.length) {
289
+ res.status(404).json({ error: 'Hook not found' });
290
+ return;
291
+ }
292
+ // Remove hook
293
+ hooks.splice(index, 1);
294
+ await writeSettingsFile(settingsPath, settings);
295
+ res.json({ message: 'Hook deleted successfully' });
296
+ }
297
+ catch (error) {
298
+ console.error('Error deleting hook:', error);
299
+ res.status(500).json({ error: 'Failed to delete hook' });
300
+ }
301
+ });
302
+ exports.default = router;
303
+ //# sourceMappingURL=hooks.js.map