crewx 0.8.7-rc.21 → 0.8.7-rc.22

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 (222) hide show
  1. package/dist/assets/{MarketPage-aY16UW1_.js → MarketPage-lLBtAENs.js} +10 -15
  2. package/dist/assets/{PromptTab-C3aTJS6u.js → PromptTab-Daq54dMi.js} +1 -1
  3. package/dist/assets/_baseUniq-BJDqmZBO.js +1 -0
  4. package/dist/assets/{arc-BCQAokB1.js → arc-ByjRIa5p.js} +1 -1
  5. package/dist/assets/{architectureDiagram-UYN6MBPD-Bc87ujv2.js → architectureDiagram-UYN6MBPD-DcKpqSFb.js} +1 -1
  6. package/dist/assets/{blockDiagram-ZHA2E4KO-wC9uH8Lb.js → blockDiagram-ZHA2E4KO-YvUeULT5.js} +1 -1
  7. package/dist/assets/{c4Diagram-6F5ED5ID-CqB7lqni.js → c4Diagram-6F5ED5ID-vggzH2N5.js} +1 -1
  8. package/dist/assets/channel-1Y6YooBb.js +1 -0
  9. package/dist/assets/{chunk-5HRBRIJM-Cc1L17Eh.js → chunk-5HRBRIJM-BbaQwJkn.js} +1 -1
  10. package/dist/assets/{chunk-7U56Z5CX-Df3nu_7G.js → chunk-7U56Z5CX-DVYVpFaa.js} +1 -1
  11. package/dist/assets/{chunk-ASOPGD6M-DIXslLG-.js → chunk-ASOPGD6M-CXEvWb-8.js} +1 -1
  12. package/dist/assets/{chunk-KFBOBJHC-FytVljyP.js → chunk-KFBOBJHC-CadVXFV3.js} +1 -1
  13. package/dist/assets/{chunk-T2TOU4HS-CU5z-cXq.js → chunk-T2TOU4HS-lDZr1sVF.js} +1 -1
  14. package/dist/assets/{chunk-TMUBEWPD-CWo1AFyn.js → chunk-TMUBEWPD-D5A0MrFD.js} +1 -1
  15. package/dist/assets/classDiagram-LNE6IOMH-CDxkV2JV.js +1 -0
  16. package/dist/assets/classDiagram-v2-MQ7JQ4JX-CDxkV2JV.js +1 -0
  17. package/dist/assets/clone-6xznz_9G.js +1 -0
  18. package/dist/assets/{dagre-4EVJKHTY-CgZW5tg4.js → dagre-4EVJKHTY-Bncx7Ijq.js} +1 -1
  19. package/dist/assets/{diagram-QW4FP2JN-CJAng8RC.js → diagram-QW4FP2JN-RkxVNs99.js} +1 -1
  20. package/dist/assets/{erDiagram-6RL3IURR-C1uHztHX.js → erDiagram-6RL3IURR-DIiKqQdx.js} +1 -1
  21. package/dist/assets/{flowDiagram-7ASYPVHJ-Yiu2odO-.js → flowDiagram-7ASYPVHJ-DQ5PN7v6.js} +1 -1
  22. package/dist/assets/{ganttDiagram-NTVNEXSI-tutc0dJP.js → ganttDiagram-NTVNEXSI-BeNWGpB6.js} +1 -1
  23. package/dist/assets/{gitGraph-YCYPL57B-C3jM6T4G.js → gitGraph-YCYPL57B-CdMe059q.js} +1 -1
  24. package/dist/assets/{gitGraphDiagram-NRZ2UAAF-0aqHEKzz.js → gitGraphDiagram-NRZ2UAAF-BEke5TyK.js} +1 -1
  25. package/dist/assets/{graph-DC224ILV.js → graph-DyQIwWJd.js} +1 -1
  26. package/dist/assets/{infoDiagram-A4XQUW5V-Do7Mpzkx.js → infoDiagram-A4XQUW5V-CUcC8I_5.js} +1 -1
  27. package/dist/assets/{journeyDiagram-G5WM74LC-DAruEJc7.js → journeyDiagram-G5WM74LC-CQ5DqAH5.js} +1 -1
  28. package/dist/assets/{kanban-definition-QRCXZQQD-DB63vLR0.js → kanban-definition-QRCXZQQD-BBsgOii7.js} +1 -1
  29. package/dist/assets/{layout-BiYH5x6Q.js → layout-D7vBs_Wy.js} +1 -1
  30. package/dist/assets/{linear-CLyGW2s0.js → linear-CEOF9oJz.js} +1 -1
  31. package/dist/assets/{main-CEKkUqZb.js → main-Bx1nZ7_p.js} +278 -273
  32. package/dist/assets/main-C4ebvOIJ.css +10 -0
  33. package/dist/assets/{min-ChJMFU2N.js → min-RK9J5Utn.js} +1 -1
  34. package/dist/assets/{mindmap-definition-GWI6TPTV-CtADqQgd.js → mindmap-definition-GWI6TPTV-BXvEU7qC.js} +1 -1
  35. package/dist/assets/{pieDiagram-YF2LJOPJ-BSOfzo3O.js → pieDiagram-YF2LJOPJ-TrXqcpni.js} +1 -1
  36. package/dist/assets/{quadrantDiagram-OS5C2QUG-BLBQNFVb.js → quadrantDiagram-OS5C2QUG-B-chTEU4.js} +1 -1
  37. package/dist/assets/{requirementDiagram-MIRIMTAZ-DqorvuS6.js → requirementDiagram-MIRIMTAZ-BgJhNLp_.js} +1 -1
  38. package/dist/assets/{sankeyDiagram-Y46BX6SQ-4NDcrLkB.js → sankeyDiagram-Y46BX6SQ-BVsgYKK7.js} +1 -1
  39. package/dist/assets/{sequenceDiagram-G6AWOVSC-yha6BxK2.js → sequenceDiagram-G6AWOVSC-ByJOpkq3.js} +1 -1
  40. package/dist/assets/{stateDiagram-MAYHULR4-XJ_I41ez.js → stateDiagram-MAYHULR4-Dw7lUL1B.js} +1 -1
  41. package/dist/assets/stateDiagram-v2-4JROLMXI-DYJiM3bF.js +1 -0
  42. package/dist/assets/{timeline-definition-U7ZMHBDA-DCNrmvE7.js → timeline-definition-U7ZMHBDA-CSoEYs60.js} +1 -1
  43. package/dist/assets/{xychartDiagram-6QU3TZC5-9N-Ohhdp.js → xychartDiagram-6QU3TZC5-0_rG7p3L.js} +1 -1
  44. package/dist/index.html +2 -2
  45. package/package.json +8 -8
  46. package/packages/cli/package.json +1 -1
  47. package/dist/assets/_baseUniq-DxEFlwNt.js +0 -1
  48. package/dist/assets/channel-DNLHkiNp.js +0 -1
  49. package/dist/assets/classDiagram-LNE6IOMH-B430Onym.js +0 -1
  50. package/dist/assets/classDiagram-v2-MQ7JQ4JX-B430Onym.js +0 -1
  51. package/dist/assets/clone-B9O3E3P1.js +0 -1
  52. package/dist/assets/main-D3YeRndF.css +0 -10
  53. package/dist/assets/stateDiagram-v2-4JROLMXI-CxcyPJO2.js +0 -1
  54. package/dist-server/adapters/adapter.module.js +0 -35
  55. package/dist-server/adapters/adapter.service.js +0 -79
  56. package/dist-server/adapters/http-router.service.js +0 -91
  57. package/dist-server/app.module.js +0 -111
  58. package/dist-server/bootstrap/crewx-server.js +0 -80
  59. package/dist-server/bootstrap/tls.js +0 -138
  60. package/dist-server/common/analytics.client.js +0 -180
  61. package/dist-server/common/analytics.module.js +0 -21
  62. package/dist-server/common/cors.js +0 -15
  63. package/dist-server/common/decorators/project.decorator.js +0 -21
  64. package/dist-server/common/decorators/workspace.decorator.js +0 -24
  65. package/dist-server/common/device-id.js +0 -33
  66. package/dist-server/common/interceptor/api-id-header.interceptor.js +0 -53
  67. package/dist-server/common/interceptor/http-logging.interceptor.js +0 -124
  68. package/dist-server/common/limits/defaults.js +0 -13
  69. package/dist-server/common/limits/limits-provider.js +0 -6
  70. package/dist-server/common/limits/limits.controller.js +0 -38
  71. package/dist-server/common/limits/limits.module.js +0 -24
  72. package/dist-server/common/limits/local-limits.provider.js +0 -27
  73. package/dist-server/common/middleware/workspace.middleware.js +0 -210
  74. package/dist-server/common/repository.exception-filter.js +0 -48
  75. package/dist-server/common/workspace-context.store.js +0 -25
  76. package/dist-server/domain/agent/agent.controller.js +0 -96
  77. package/dist-server/domain/agent/agent.module.js +0 -27
  78. package/dist-server/domain/agent/agent.service.js +0 -335
  79. package/dist-server/domain/agent/agent.types.js +0 -3
  80. package/dist-server/domain/agent/dto/create-agent.dto.js +0 -80
  81. package/dist-server/domain/agent/dto/preview-prompt.dto.js +0 -77
  82. package/dist-server/domain/agent/dto/provider-meta.dto.js +0 -2
  83. package/dist-server/domain/agent/dto/update-agent.dto.js +0 -92
  84. package/dist-server/domain/agent/provider.controller.js +0 -38
  85. package/dist-server/domain/agent/template-processor.service.js +0 -71
  86. package/dist-server/domain/auth/auth.constants.js +0 -4
  87. package/dist-server/domain/auth/auth.controller.js +0 -123
  88. package/dist-server/domain/auth/auth.module.js +0 -47
  89. package/dist-server/domain/auth/decorators/public.decorator.js +0 -7
  90. package/dist-server/domain/auth/guards/base-auth.guard.js +0 -66
  91. package/dist-server/domain/auth/session-store.js +0 -26
  92. package/dist-server/domain/auth/utils/ip.utils.js +0 -31
  93. package/dist-server/domain/box/box.controller.js +0 -77
  94. package/dist-server/domain/box/box.module.js +0 -21
  95. package/dist-server/domain/box/box.service.js +0 -97
  96. package/dist-server/domain/box/dto/create-box.dto.js +0 -74
  97. package/dist-server/domain/cli/cli.controller.js +0 -136
  98. package/dist-server/domain/cli/cli.module.js +0 -21
  99. package/dist-server/domain/cli/cli.service.js +0 -598
  100. package/dist-server/domain/cli/dto/login-cli.dto.js +0 -25
  101. package/dist-server/domain/cli/dto/update-cli.dto.js +0 -31
  102. package/dist-server/domain/doc/doc.controller.js +0 -95
  103. package/dist-server/domain/doc/doc.module.js +0 -21
  104. package/dist-server/domain/doc/doc.service.js +0 -368
  105. package/dist-server/domain/doc/dto/doc.dto.js +0 -64
  106. package/dist-server/domain/document/document.controller.js +0 -57
  107. package/dist-server/domain/document/document.module.js +0 -22
  108. package/dist-server/domain/document/document.service.js +0 -274
  109. package/dist-server/domain/document/dto/register-document.dto.js +0 -24
  110. package/dist-server/domain/fs/dto/mkdir-request.dto.js +0 -47
  111. package/dist-server/domain/fs/dto/mkdir-response.dto.js +0 -2
  112. package/dist-server/domain/fs/dto/quick-access.dto.js +0 -2
  113. package/dist-server/domain/fs/dto/tree-node.dto.js +0 -2
  114. package/dist-server/domain/fs/dto/tree-query.dto.js +0 -35
  115. package/dist-server/domain/fs/fs.controller.js +0 -63
  116. package/dist-server/domain/fs/fs.module.js +0 -22
  117. package/dist-server/domain/fs/fs.service.js +0 -303
  118. package/dist-server/domain/git/git.module.js +0 -20
  119. package/dist-server/domain/git/git.service.js +0 -222
  120. package/dist-server/domain/goal/dto/goal.dto.js +0 -49
  121. package/dist-server/domain/goal/goal.controller.js +0 -86
  122. package/dist-server/domain/goal/goal.module.js +0 -22
  123. package/dist-server/domain/goal/goal.service.js +0 -197
  124. package/dist-server/domain/goal/parser/goal-md-parser.js +0 -166
  125. package/dist-server/domain/goal/parser/goal-md-serializer.js +0 -110
  126. package/dist-server/domain/health/health.controller.js +0 -57
  127. package/dist-server/domain/health/health.module.js +0 -19
  128. package/dist-server/domain/knowledge/dto/graph-knowledge.dto.js +0 -27
  129. package/dist-server/domain/knowledge/dto/knowledge.dto.js +0 -71
  130. package/dist-server/domain/knowledge/knowledge.controller.js +0 -122
  131. package/dist-server/domain/knowledge/knowledge.module.js +0 -21
  132. package/dist-server/domain/knowledge/knowledge.service.js +0 -538
  133. package/dist-server/domain/market/dto/add-registry.dto.js +0 -32
  134. package/dist-server/domain/market/dto/install-market.dto.js +0 -30
  135. package/dist-server/domain/market/market.controller.js +0 -163
  136. package/dist-server/domain/market/market.module.js +0 -22
  137. package/dist-server/domain/market/market.service.js +0 -1447
  138. package/dist-server/domain/mcp/browser-session.store.js +0 -247
  139. package/dist-server/domain/mcp/crewx-tool.factory.js +0 -119
  140. package/dist-server/domain/mcp/mcp-auth.guard.js +0 -61
  141. package/dist-server/domain/mcp/mcp.constants.js +0 -4
  142. package/dist-server/domain/mcp/mcp.controller.js +0 -125
  143. package/dist-server/domain/mcp/mcp.dto.js +0 -12
  144. package/dist-server/domain/mcp/mcp.module.js +0 -49
  145. package/dist-server/domain/mcp/mcp.service.js +0 -684
  146. package/dist-server/domain/mcp/tool-router.service.js +0 -120
  147. package/dist-server/domain/message/dto/list-messages.dto.js +0 -57
  148. package/dist-server/domain/message/dto/send-message.dto.js +0 -45
  149. package/dist-server/domain/message/message.controller.js +0 -73
  150. package/dist-server/domain/message/message.module.js +0 -25
  151. package/dist-server/domain/message/message.service.js +0 -160
  152. package/dist-server/domain/onboarding/onboarding.controller.js +0 -97
  153. package/dist-server/domain/onboarding/onboarding.module.js +0 -23
  154. package/dist-server/domain/onboarding/onboarding.service.js +0 -106
  155. package/dist-server/domain/onboarding/onboarding.types.js +0 -2
  156. package/dist-server/domain/onboarding/presets/custom.js +0 -10
  157. package/dist-server/domain/onboarding/presets/dev-team.js +0 -41
  158. package/dist-server/domain/onboarding/presets/index.js +0 -15
  159. package/dist-server/domain/onboarding/presets/marketing-team.js +0 -29
  160. package/dist-server/domain/onboarding/presets/planning-team.js +0 -29
  161. package/dist-server/domain/onboarding/presets/solo.js +0 -17
  162. package/dist-server/domain/planner/dto/planner.dto.js +0 -58
  163. package/dist-server/domain/planner/planner.controller.js +0 -74
  164. package/dist-server/domain/planner/planner.module.js +0 -22
  165. package/dist-server/domain/planner/planner.service.js +0 -269
  166. package/dist-server/domain/project/dto/create-project.dto.js +0 -46
  167. package/dist-server/domain/project/dto/update-project.dto.js +0 -60
  168. package/dist-server/domain/project/project.controller.js +0 -129
  169. package/dist-server/domain/project/project.module.js +0 -22
  170. package/dist-server/domain/project/project.service.js +0 -173
  171. package/dist-server/domain/settings/settings.controller.js +0 -52
  172. package/dist-server/domain/settings/settings.module.js +0 -22
  173. package/dist-server/domain/settings/settings.service.js +0 -105
  174. package/dist-server/domain/task/dto/all-tasks.dto.js +0 -55
  175. package/dist-server/domain/task/dto/list-tasks.dto.js +0 -69
  176. package/dist-server/domain/task/dto/search-tasks.dto.js +0 -66
  177. package/dist-server/domain/task/dto/send-message.dto.js +0 -31
  178. package/dist-server/domain/task/dto/task-status.dto.js +0 -34
  179. package/dist-server/domain/task/dto/workspace-usage.dto.js +0 -38
  180. package/dist-server/domain/task/task.constants.js +0 -5
  181. package/dist-server/domain/task/task.controller.js +0 -169
  182. package/dist-server/domain/task/task.module.js +0 -23
  183. package/dist-server/domain/task/task.service.js +0 -775
  184. package/dist-server/domain/thread/dto/build-context.dto.js +0 -42
  185. package/dist-server/domain/thread/dto/list-messages.dto.js +0 -49
  186. package/dist-server/domain/thread/dto/list-threads.dto.js +0 -70
  187. package/dist-server/domain/thread/dto/search-threads.dto.js +0 -13
  188. package/dist-server/domain/thread/dto/update-thread.dto.js +0 -23
  189. package/dist-server/domain/thread/thread.controller.js +0 -160
  190. package/dist-server/domain/thread/thread.module.js +0 -23
  191. package/dist-server/domain/thread/thread.service.js +0 -419
  192. package/dist-server/domain/usage/usage.controller.js +0 -118
  193. package/dist-server/domain/usage/usage.module.js +0 -21
  194. package/dist-server/domain/usage/usage.service.js +0 -358
  195. package/dist-server/domain/usage/usage.types.js +0 -4
  196. package/dist-server/domain/wbs/wbs.controller.js +0 -51
  197. package/dist-server/domain/wbs/wbs.module.js +0 -21
  198. package/dist-server/domain/wbs/wbs.service.js +0 -94
  199. package/dist-server/domain/workflow/workflow.controller.js +0 -53
  200. package/dist-server/domain/workflow/workflow.module.js +0 -21
  201. package/dist-server/domain/workflow/workflow.service.js +0 -209
  202. package/dist-server/domain/workspace/dto/create-workspace.dto.js +0 -45
  203. package/dist-server/domain/workspace/dto/switch-workspace.dto.js +0 -32
  204. package/dist-server/domain/workspace/dto/workspace-info.dto.js +0 -2
  205. package/dist-server/domain/workspace/workspace.controller.js +0 -98
  206. package/dist-server/domain/workspace/workspace.module.js +0 -22
  207. package/dist-server/domain/workspace/workspace.service.js +0 -198
  208. package/dist-server/main.js +0 -204
  209. package/dist-server/modules/crewx-pool.service.js +0 -75
  210. package/dist-server/modules/crewx.module.js +0 -47
  211. package/dist-server/repository/base-sqlite.repository.js +0 -18
  212. package/dist-server/repository/box.repository.js +0 -99
  213. package/dist-server/repository/message.repository.js +0 -22
  214. package/dist-server/repository/project.repository.js +0 -51
  215. package/dist-server/repository/repository.module.js +0 -34
  216. package/dist-server/repository/request-log.repository.js +0 -96
  217. package/dist-server/repository/task.repository.js +0 -105
  218. package/dist-server/repository/thread.repository.js +0 -165
  219. package/dist-server/shared/crewx-home.js +0 -58
  220. package/dist-server/shared/crewx-state.js +0 -66
  221. package/dist-server/test-utils/compat-database.js +0 -30
  222. package/dist-server/utils/tokenizer.js +0 -8
@@ -1,684 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var McpService_1;
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.McpService = void 0;
14
- const common_1 = require("@nestjs/common");
15
- const mcp_dto_js_1 = require("./mcp.dto.js");
16
- const crewx_tool_factory_js_1 = require("./crewx-tool.factory.js");
17
- const browser_session_store_js_1 = require("./browser-session.store.js");
18
- const tool_router_service_js_1 = require("./tool-router.service.js");
19
- const crewx_pool_service_js_1 = require("../../modules/crewx-pool.service.js");
20
- const project_repository_js_1 = require("../../repository/project.repository.js");
21
- const repository_1 = require("@crewx/sdk/repository");
22
- const sdk_1 = require("@crewx/sdk");
23
- const BROWSER_TOOL_DEFINITIONS = [
24
- {
25
- name: 'callBrowser',
26
- description: 'Execute a WebMCP tool on a specific browser tab',
27
- inputSchema: {
28
- type: 'object',
29
- properties: {
30
- tabId: { type: 'number', description: 'Target tab ID' },
31
- tool: { type: 'string', description: 'WebMCP tool name' },
32
- args: { type: 'object', description: 'Arguments to pass to the tool' },
33
- },
34
- required: ['tabId', 'tool'],
35
- },
36
- },
37
- {
38
- name: 'openTab',
39
- description: 'Open a new browser tab with the given URL',
40
- inputSchema: {
41
- type: 'object',
42
- properties: {
43
- url: { type: 'string', description: 'URL to open' },
44
- },
45
- required: ['url'],
46
- },
47
- },
48
- {
49
- name: 'listTabs',
50
- description: 'List all connected tabs and their available tools',
51
- inputSchema: {
52
- type: 'object',
53
- properties: {},
54
- },
55
- },
56
- {
57
- name: 'closeTab',
58
- description: 'Close a browser tab',
59
- inputSchema: {
60
- type: 'object',
61
- properties: {
62
- tabId: { type: 'number', description: 'Tab ID to close' },
63
- },
64
- required: ['tabId'],
65
- },
66
- },
67
- ];
68
- const SERVER_NAME = 'crewx-ui';
69
- const SERVER_VERSION = '0.1.0';
70
- const PROTOCOL_VERSION = '2024-11-05';
71
- // workspace optional parameter schema — shared across tools that support it
72
- const WORKSPACE_PARAM = {
73
- workspace: {
74
- type: 'string',
75
- description: 'Optional workspace slug (e.g. "crewx-ui"). Omit to use the server\'s current workspace.',
76
- },
77
- };
78
- // Tool definitions exposed via tools/list
79
- const TOOL_DEFINITIONS = [
80
- {
81
- name: 'crewx_listWorkspaces',
82
- description: 'List all registered workspaces (slug, name, path).',
83
- inputSchema: {
84
- type: 'object',
85
- properties: {},
86
- },
87
- },
88
- {
89
- name: 'crewx_queryAgent',
90
- description: 'Query an agent (read-only). The agent will answer your question without making changes.',
91
- inputSchema: {
92
- type: 'object',
93
- properties: {
94
- agentId: {
95
- type: 'string',
96
- description: 'The ID of the agent to query (e.g., "ui_backend_dev")',
97
- },
98
- query: {
99
- type: 'string',
100
- description: 'The question or request to send to the agent',
101
- },
102
- context: {
103
- type: 'string',
104
- description: 'Optional additional context for the query',
105
- },
106
- thread: {
107
- type: 'string',
108
- description: 'Thread ID for conversation continuity. Previous messages with the same thread ID will be included in the context automatically.',
109
- },
110
- metadata: {
111
- type: 'object',
112
- additionalProperties: true,
113
- description: 'Free-form metadata (e.g., workflow_id, project_id) persisted to the task record for tracing.',
114
- },
115
- ...WORKSPACE_PARAM,
116
- },
117
- required: ['agentId', 'query'],
118
- },
119
- },
120
- {
121
- name: 'crewx_executeAgent',
122
- description: 'Execute a task with an agent (read-write). The agent can modify files and run commands.',
123
- inputSchema: {
124
- type: 'object',
125
- properties: {
126
- agentId: {
127
- type: 'string',
128
- description: 'The ID of the agent to execute (e.g., "ui_backend_dev")',
129
- },
130
- task: {
131
- type: 'string',
132
- description: 'The task description for the agent to execute',
133
- },
134
- context: {
135
- type: 'string',
136
- description: 'Optional additional context for the task',
137
- },
138
- thread: {
139
- type: 'string',
140
- description: 'Thread ID for conversation continuity. Previous messages with the same thread ID will be included in the context automatically.',
141
- },
142
- metadata: {
143
- type: 'object',
144
- additionalProperties: true,
145
- description: 'Free-form metadata (e.g., workflow_id, project_id) persisted to the task record for tracing.',
146
- },
147
- ...WORKSPACE_PARAM,
148
- },
149
- required: ['agentId', 'task'],
150
- },
151
- },
152
- {
153
- name: 'crewx_listAgents',
154
- description: 'List all available agents and their capabilities.',
155
- inputSchema: {
156
- type: 'object',
157
- properties: {
158
- ...WORKSPACE_PARAM,
159
- },
160
- },
161
- },
162
- ];
163
- let McpService = McpService_1 = class McpService {
164
- crewxPool;
165
- projectRepo;
166
- browserSessions;
167
- toolRouter;
168
- toolCallRepo;
169
- logger = new common_1.Logger(McpService_1.name);
170
- activeTaskMap = new Map();
171
- constructor(crewxPool, projectRepo, browserSessions, toolRouter, toolCallRepo) {
172
- this.crewxPool = crewxPool;
173
- this.projectRepo = projectRepo;
174
- this.browserSessions = browserSessions;
175
- this.toolRouter = toolRouter;
176
- this.toolCallRepo = toolCallRepo;
177
- }
178
- async getToolForCurrentRequest() {
179
- const crewx = await this.crewxPool.getForCurrentRequest();
180
- return (0, crewx_tool_factory_js_1.createCrewxTool)(crewx);
181
- }
182
- /**
183
- * Resolve ICrewXTool for the given workspace slug.
184
- * If slug is omitted, falls back to the current request's workspace.
185
- * Throws a tagged error (code: WORKSPACE_NOT_FOUND) if slug is unknown.
186
- */
187
- async getToolForWorkspace(slug) {
188
- if (!slug) {
189
- return this.getToolForCurrentRequest();
190
- }
191
- const row = this.projectRepo.findBySlug(slug);
192
- if (!row?.workspace_path) {
193
- throw Object.assign(new Error(`Workspace not found: ${slug}`), {
194
- code: 'WORKSPACE_NOT_FOUND',
195
- });
196
- }
197
- const crewx = await this.crewxPool.getForPath(row.workspace_path);
198
- return (0, crewx_tool_factory_js_1.createCrewxTool)(crewx);
199
- }
200
- // Validate JSON-RPC 2.0 request structure
201
- validateRequest(body) {
202
- if (!body || typeof body !== 'object') {
203
- return {
204
- jsonrpc: '2.0',
205
- id: null,
206
- error: {
207
- code: mcp_dto_js_1.JSON_RPC_ERRORS.INVALID_REQUEST.code,
208
- message: 'Request body must be a JSON object',
209
- },
210
- };
211
- }
212
- if (body.jsonrpc !== '2.0') {
213
- return {
214
- jsonrpc: '2.0',
215
- id: body.id ?? null,
216
- error: {
217
- code: mcp_dto_js_1.JSON_RPC_ERRORS.INVALID_REQUEST.code,
218
- message: 'Missing or invalid "jsonrpc" field - must be "2.0"',
219
- },
220
- };
221
- }
222
- if (!body.method || typeof body.method !== 'string') {
223
- return {
224
- jsonrpc: '2.0',
225
- id: body.id ?? null,
226
- error: {
227
- code: mcp_dto_js_1.JSON_RPC_ERRORS.INVALID_REQUEST.code,
228
- message: 'Missing or invalid "method" field - must be a string',
229
- },
230
- };
231
- }
232
- return null; // Valid
233
- }
234
- // Check if the request is a notification (no id field)
235
- isNotification(body) {
236
- return body.id === undefined || body.id === null;
237
- }
238
- async handleRequest(body, sessionId, clientType) {
239
- const { method, id } = body;
240
- this.logger.debug(`Handling MCP method: ${method}`);
241
- if (this.isNotification(body)) {
242
- if (method === 'browser/registerTools') {
243
- return this.handleRegisterTools(sessionId, body.params);
244
- }
245
- if (method.startsWith('notifications/')) {
246
- this.logger.debug(`Received notification: ${method}`);
247
- return null;
248
- }
249
- }
250
- switch (method) {
251
- case 'initialize':
252
- return this.handleInitialize(id, clientType);
253
- case 'notifications/initialized':
254
- return null;
255
- case 'tools/list':
256
- return this.handleToolsList(id, sessionId);
257
- case 'tools/call':
258
- return this.handleToolsCall(id, body.params, sessionId);
259
- case 'prompts/list':
260
- return {
261
- jsonrpc: '2.0',
262
- id,
263
- result: { prompts: [] },
264
- };
265
- case 'resources/list':
266
- return {
267
- jsonrpc: '2.0',
268
- id,
269
- result: { resources: [] },
270
- };
271
- default:
272
- return {
273
- jsonrpc: '2.0',
274
- id,
275
- error: {
276
- code: mcp_dto_js_1.JSON_RPC_ERRORS.METHOD_NOT_FOUND.code,
277
- message: `Method not found: ${method}`,
278
- },
279
- };
280
- }
281
- }
282
- handleToolCallResult(sessionId, body) {
283
- if (!body.id || typeof body.id !== 'string')
284
- return false;
285
- if (body.error) {
286
- const err = Object.assign(new Error(body.error.message ?? 'Tool call failed'), { jsonRpcCode: body.error.code });
287
- return this.browserSessions.rejectToolCall(sessionId, body.id, err);
288
- }
289
- return this.browserSessions.resolveToolCall(sessionId, body.id, body.result);
290
- }
291
- createBrowserSession(clientType) {
292
- return this.browserSessions.create(clientType).id;
293
- }
294
- getBrowserSessionStore() {
295
- return this.browserSessions;
296
- }
297
- handleInitialize(id, clientType) {
298
- const sessionId = this.createBrowserSession(clientType);
299
- return {
300
- jsonrpc: '2.0',
301
- id: id ?? null,
302
- result: {
303
- protocolVersion: PROTOCOL_VERSION,
304
- capabilities: {
305
- tools: {},
306
- },
307
- serverInfo: {
308
- name: SERVER_NAME,
309
- version: SERVER_VERSION,
310
- },
311
- },
312
- _sessionId: sessionId,
313
- };
314
- }
315
- handleToolsList(id, sessionId) {
316
- const tools = [...TOOL_DEFINITIONS];
317
- if (sessionId) {
318
- const session = this.browserSessions.get(sessionId);
319
- if (session?.clientType === 'browser') {
320
- tools.push(...BROWSER_TOOL_DEFINITIONS);
321
- }
322
- const browserTools = this.browserSessions.getRegisteredTools(sessionId);
323
- for (const bt of browserTools) {
324
- tools.push({
325
- name: bt.name,
326
- description: bt.description ?? '',
327
- inputSchema: {
328
- type: 'object',
329
- properties: bt.inputSchema?.properties ?? {},
330
- ...(bt.inputSchema?.required ? { required: bt.inputSchema.required } : {}),
331
- },
332
- ...(bt.title ? { title: bt.title } : {}),
333
- ...(bt.annotations ? { annotations: bt.annotations } : {}),
334
- });
335
- }
336
- }
337
- return {
338
- jsonrpc: '2.0',
339
- id: id ?? null,
340
- result: { tools },
341
- };
342
- }
343
- handleRegisterTools(sessionId, params) {
344
- if (!sessionId || !Array.isArray(params?.tools)) {
345
- this.logger.warn('browser/registerTools: missing sessionId or params');
346
- return null;
347
- }
348
- this.browserSessions.registerTools(sessionId, params.tools, params.mode);
349
- return null;
350
- }
351
- async handleToolsCall(id, params, sessionId) {
352
- if (!params?.name) {
353
- return {
354
- jsonrpc: '2.0',
355
- id: id ?? null,
356
- error: {
357
- code: mcp_dto_js_1.JSON_RPC_ERRORS.INVALID_PARAMS.code,
358
- message: 'Missing tool name in params',
359
- },
360
- };
361
- }
362
- const startTime = Date.now();
363
- let response;
364
- // Browser tool: route via SSE to the extension (dual routing: prefix + session lookup)
365
- if (this.toolRouter.isBrowserTool(params.name, sessionId)) {
366
- this.logger.log(`tools/call [browser]: ${params.name}`);
367
- response = await this.toolRouter.dispatch(sessionId, params.name, params.arguments ?? {}, id);
368
- }
369
- else {
370
- // Server tool: must exist in TOOL_DEFINITIONS
371
- const tool = TOOL_DEFINITIONS.find((t) => t.name === params.name);
372
- if (!tool) {
373
- return {
374
- jsonrpc: '2.0',
375
- id: id ?? null,
376
- error: {
377
- code: mcp_dto_js_1.JSON_RPC_ERRORS.METHOD_NOT_FOUND.code,
378
- message: `Unknown tool: ${params.name}`,
379
- },
380
- };
381
- }
382
- this.logger.log(`tools/call: ${params.name}(${JSON.stringify(params.arguments)})`);
383
- try {
384
- switch (params.name) {
385
- case 'crewx_listWorkspaces':
386
- response = this.execListWorkspaces(id);
387
- break;
388
- case 'crewx_listAgents':
389
- response = await this.execListAgents(id, params.arguments ?? {});
390
- break;
391
- case 'crewx_queryAgent':
392
- response = await this.execQueryAgent(id, params.arguments, sessionId);
393
- break;
394
- case 'crewx_executeAgent':
395
- response = await this.execExecuteAgent(id, params.arguments, sessionId);
396
- break;
397
- default:
398
- response = {
399
- jsonrpc: '2.0',
400
- id: id ?? null,
401
- error: {
402
- code: mcp_dto_js_1.JSON_RPC_ERRORS.METHOD_NOT_FOUND.code,
403
- message: `Tool not implemented: ${params.name}`,
404
- },
405
- };
406
- }
407
- }
408
- catch (err) {
409
- this.logger.error(`tools/call error: ${err.message}`, err.stack);
410
- if (err.code === 'WORKSPACE_NOT_FOUND') {
411
- response = {
412
- jsonrpc: '2.0',
413
- id: id ?? null,
414
- error: {
415
- code: mcp_dto_js_1.JSON_RPC_ERRORS.INVALID_PARAMS.code,
416
- message: `WORKSPACE_NOT_FOUND: ${err.message}`,
417
- },
418
- };
419
- }
420
- else {
421
- response = {
422
- jsonrpc: '2.0',
423
- id: id ?? null,
424
- error: {
425
- code: mcp_dto_js_1.JSON_RPC_ERRORS.INTERNAL_ERROR.code,
426
- message: `Tool execution failed: ${err.message}`,
427
- },
428
- };
429
- }
430
- }
431
- }
432
- // Record only browser tool calls (agent calling a tool during execution).
433
- // Server tools (queryAgent, executeAgent, etc.) are task triggers, not tool calls.
434
- if (this.toolRouter.isBrowserTool(params.name, sessionId)) {
435
- const duration = Date.now() - startTime;
436
- const taskId = (sessionId ? this.activeTaskMap.get(sessionId) : undefined) ?? null;
437
- try {
438
- this.toolCallRepo.insertToolCall({
439
- id: (0, sdk_1.generateId)('tcl'),
440
- task_id: taskId,
441
- session_id: sessionId ?? null,
442
- tool_name: `mcp_${params.name}`,
443
- input: JSON.stringify(params.arguments ?? {}),
444
- output: JSON.stringify(response.result?.content ?? response.error ?? null),
445
- duration_ms: duration,
446
- timestamp: new Date().toISOString(),
447
- });
448
- }
449
- catch (err) {
450
- this.logger.warn(`tool_calls insert failed: ${err?.message}`);
451
- }
452
- }
453
- return response;
454
- }
455
- // ──────────────────────────────────────────────
456
- // Tool implementations — direct CrewXTool calls
457
- // ──────────────────────────────────────────────
458
- /**
459
- * crewx_listWorkspaces — returns all registered workspaces (slug, name, path)
460
- */
461
- execListWorkspaces(id) {
462
- try {
463
- const { rows } = this.projectRepo.listProjects({ isActive: true, limit: 1000, offset: 0 });
464
- const workspaces = rows.map((r) => ({
465
- slug: r.slug,
466
- name: r.name,
467
- path: r.workspace_path ?? '',
468
- }));
469
- return {
470
- jsonrpc: '2.0',
471
- id: id ?? null,
472
- result: {
473
- content: [{ type: 'text', text: JSON.stringify(workspaces, null, 2) }],
474
- isError: false,
475
- },
476
- };
477
- }
478
- catch (err) {
479
- this.logger.error(`listWorkspaces error: ${err.message}`, err.stack);
480
- return {
481
- jsonrpc: '2.0',
482
- id: id ?? null,
483
- result: {
484
- content: [{ type: 'text', text: `Error listing workspaces: ${err.message}` }],
485
- isError: true,
486
- },
487
- };
488
- }
489
- }
490
- /**
491
- * crewx_listAgents — delegates to CrewXTool.listAgents()
492
- */
493
- async execListAgents(id, args) {
494
- // May throw WORKSPACE_NOT_FOUND — propagates to handleToolsCall outer catch
495
- const tool = await this.getToolForWorkspace(args.workspace);
496
- try {
497
- const result = await tool.listAgents();
498
- return {
499
- jsonrpc: '2.0',
500
- id: id ?? null,
501
- result: {
502
- content: result.content,
503
- isError: !result.success,
504
- },
505
- };
506
- }
507
- catch (err) {
508
- this.logger.error(`listAgents error: ${err.message}`, err.stack);
509
- return {
510
- jsonrpc: '2.0',
511
- id: id ?? null,
512
- result: {
513
- content: [
514
- {
515
- type: 'text',
516
- text: `Error listing agents: ${err.message}`,
517
- },
518
- ],
519
- isError: true,
520
- },
521
- };
522
- }
523
- }
524
- /**
525
- * crewx_queryAgent — delegates to CrewXTool.queryAgent()
526
- */
527
- async execQueryAgent(id, args, sessionId) {
528
- const { agentId, query, context, thread, metadata, workspace } = args;
529
- if (!agentId || !query) {
530
- return {
531
- jsonrpc: '2.0',
532
- id: id ?? null,
533
- error: {
534
- code: mcp_dto_js_1.JSON_RPC_ERRORS.INVALID_PARAMS.code,
535
- message: 'Missing required params: agentId, query',
536
- },
537
- };
538
- }
539
- // May throw WORKSPACE_NOT_FOUND — propagates to handleToolsCall outer catch
540
- const tool = await this.getToolForWorkspace(workspace);
541
- try {
542
- const startTime = Date.now();
543
- const result = await tool.queryAgent({
544
- agentId,
545
- query,
546
- context,
547
- threadId: thread,
548
- metadata: metadata ?? {},
549
- platform: 'mcp',
550
- onTaskId: sessionId
551
- ? (taskId) => this.activeTaskMap.set(sessionId, taskId)
552
- : undefined,
553
- });
554
- const duration = Date.now() - startTime;
555
- const content = normalizeContent(result);
556
- return {
557
- jsonrpc: '2.0',
558
- id: id ?? null,
559
- result: {
560
- content,
561
- isError: result.isError ?? !result.success,
562
- _meta: {
563
- agent: result.agent ?? agentId,
564
- provider: result.provider,
565
- taskId: result.taskId,
566
- thread,
567
- duration,
568
- },
569
- },
570
- };
571
- }
572
- catch (err) {
573
- this.logger.error(`queryAgent error: ${err.message}`, err.stack);
574
- return {
575
- jsonrpc: '2.0',
576
- id: id ?? null,
577
- result: {
578
- content: [
579
- {
580
- type: 'text',
581
- text: `Error querying agent: ${err.message}`,
582
- },
583
- ],
584
- isError: true,
585
- _meta: { agent: agentId },
586
- },
587
- };
588
- }
589
- finally {
590
- if (sessionId) {
591
- this.activeTaskMap.delete(sessionId);
592
- }
593
- }
594
- }
595
- /**
596
- * crewx_executeAgent — delegates to CrewXTool.executeAgent()
597
- */
598
- async execExecuteAgent(id, args, sessionId) {
599
- const { agentId, task, context, thread, metadata, workspace } = args;
600
- if (!agentId || !task) {
601
- return {
602
- jsonrpc: '2.0',
603
- id: id ?? null,
604
- error: {
605
- code: mcp_dto_js_1.JSON_RPC_ERRORS.INVALID_PARAMS.code,
606
- message: 'Missing required params: agentId, task',
607
- },
608
- };
609
- }
610
- // May throw WORKSPACE_NOT_FOUND — propagates to handleToolsCall outer catch
611
- const tool = await this.getToolForWorkspace(workspace);
612
- try {
613
- const startTime = Date.now();
614
- const result = await tool.executeAgent({
615
- agentId,
616
- task,
617
- context,
618
- threadId: thread,
619
- metadata: metadata ?? {},
620
- platform: 'mcp',
621
- onTaskId: sessionId
622
- ? (taskId) => this.activeTaskMap.set(sessionId, taskId)
623
- : undefined,
624
- });
625
- const duration = Date.now() - startTime;
626
- const content = normalizeContent(result);
627
- return {
628
- jsonrpc: '2.0',
629
- id: id ?? null,
630
- result: {
631
- content,
632
- isError: result.isError ?? !result.success,
633
- _meta: {
634
- agent: result.agent ?? agentId,
635
- provider: result.provider,
636
- taskId: result.taskId,
637
- thread,
638
- duration,
639
- },
640
- },
641
- };
642
- }
643
- catch (err) {
644
- this.logger.error(`executeAgent error: ${err.message}`, err.stack);
645
- return {
646
- jsonrpc: '2.0',
647
- id: id ?? null,
648
- result: {
649
- content: [
650
- {
651
- type: 'text',
652
- text: `Error executing agent: ${err.message}`,
653
- },
654
- ],
655
- isError: true,
656
- _meta: { agent: agentId },
657
- },
658
- };
659
- }
660
- finally {
661
- if (sessionId) {
662
- this.activeTaskMap.delete(sessionId);
663
- }
664
- }
665
- }
666
- };
667
- exports.McpService = McpService;
668
- exports.McpService = McpService = McpService_1 = __decorate([
669
- (0, common_1.Injectable)(),
670
- __metadata("design:paramtypes", [crewx_pool_service_js_1.CrewxPoolService,
671
- project_repository_js_1.ProjectRepository,
672
- browser_session_store_js_1.BrowserSessionStore,
673
- tool_router_service_js_1.ToolRouterService,
674
- repository_1.ToolCallRepository])
675
- ], McpService);
676
- function normalizeContent(result) {
677
- if (Array.isArray(result.content) && result.content.length > 0) {
678
- return result.content;
679
- }
680
- if (typeof result.response === 'string' && result.response.length > 0) {
681
- return [{ type: 'text', text: result.response }];
682
- }
683
- return [];
684
- }