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,247 +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 BrowserSessionStore_1;
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.BrowserSessionStore = void 0;
14
- const common_1 = require("@nestjs/common");
15
- const crypto_1 = require("crypto");
16
- const SESSION_PREFIX = 'sess_';
17
- const SESSION_ID_BYTES = 16;
18
- const DEFAULT_TTL_MS = 30 * 60 * 1000; // 30 minutes
19
- const SWEEP_INTERVAL_MS = 60 * 1000; // 60 seconds
20
- const KEEPALIVE_INTERVAL_MS = 15 * 1000; // 15 seconds
21
- const TOOL_CALL_TIMEOUT_MS = 30 * 1000; // 30 seconds
22
- let BrowserSessionStore = BrowserSessionStore_1 = class BrowserSessionStore {
23
- logger = new common_1.Logger(BrowserSessionStore_1.name);
24
- sessions = new Map();
25
- sweepTimer;
26
- constructor() {
27
- this.sweepTimer = setInterval(() => this.sweep(), SWEEP_INTERVAL_MS);
28
- this.sweepTimer.unref();
29
- }
30
- onModuleDestroy() {
31
- clearInterval(this.sweepTimer);
32
- for (const session of this.sessions.values()) {
33
- this.destroySession(session);
34
- }
35
- this.sessions.clear();
36
- }
37
- create(clientType) {
38
- const id = SESSION_PREFIX + (0, crypto_1.randomBytes)(SESSION_ID_BYTES).toString('hex');
39
- const now = Date.now();
40
- const session = {
41
- id,
42
- clientType,
43
- sseResponse: null,
44
- registeredTools: new Map(),
45
- pendingCalls: new Map(),
46
- createdAt: now,
47
- lastActivity: now,
48
- };
49
- this.sessions.set(id, session);
50
- this.logger.debug(`Session created: ${id} (clientType=${clientType ?? 'none'})`);
51
- return session;
52
- }
53
- get(id) {
54
- return this.sessions.get(id);
55
- }
56
- delete(id) {
57
- const session = this.sessions.get(id);
58
- if (!session)
59
- return false;
60
- this.destroySession(session);
61
- this.sessions.delete(id);
62
- this.logger.debug(`Session deleted: ${id}`);
63
- return true;
64
- }
65
- get size() {
66
- return this.sessions.size;
67
- }
68
- bindSse(sessionId, res) {
69
- const session = this.sessions.get(sessionId);
70
- if (!session)
71
- return false;
72
- // Replace existing SSE connection (reconnect scenario)
73
- if (session.sseResponse) {
74
- this.logger.debug(`Replacing existing SSE for session: ${sessionId}`);
75
- this.cleanupSse(session);
76
- }
77
- session.sseResponse = res;
78
- session.lastActivity = Date.now();
79
- // SSE headers
80
- res.writeHead(200, {
81
- 'Content-Type': 'text/event-stream',
82
- 'Cache-Control': 'no-cache',
83
- 'Connection': 'keep-alive',
84
- 'X-Accel-Buffering': 'no',
85
- });
86
- res.flushHeaders();
87
- // Keepalive ping
88
- const timer = setInterval(() => {
89
- if (session.sseResponse && !session.sseResponse.writableEnded) {
90
- session.sseResponse.write(':ping\n\n');
91
- }
92
- }, KEEPALIVE_INTERVAL_MS);
93
- timer.unref();
94
- session.keepaliveTimer = timer;
95
- // Cleanup on disconnect — guard against stale close from a replaced response
96
- const boundRes = res;
97
- res.on('close', () => {
98
- if (session.sseResponse !== boundRes)
99
- return;
100
- this.logger.debug(`SSE disconnected for session: ${sessionId}`);
101
- this.cleanupSse(session);
102
- this.rejectAllPending(session, new Error('SSE connection closed'));
103
- });
104
- return true;
105
- }
106
- registerTools(sessionId, tools, mode = 'merge') {
107
- const session = this.sessions.get(sessionId);
108
- if (!session)
109
- return false;
110
- if (mode === 'replace') {
111
- session.registeredTools.clear();
112
- }
113
- for (const tool of tools) {
114
- session.registeredTools.set(tool.name, tool);
115
- }
116
- session.lastActivity = Date.now();
117
- this.logger.debug(`Tools registered (${mode}) for session ${sessionId}: ${tools.map((t) => t.name).join(', ')}`);
118
- return true;
119
- }
120
- getRegisteredTools(sessionId) {
121
- const session = this.sessions.get(sessionId);
122
- if (!session)
123
- return [];
124
- return Array.from(session.registeredTools.values());
125
- }
126
- hasRegisteredTool(sessionId, toolName) {
127
- const session = this.sessions.get(sessionId);
128
- if (!session)
129
- return false;
130
- return session.registeredTools.has(toolName);
131
- }
132
- dispatchToolCall(sessionId, toolName, args, skipToolCheck = false) {
133
- const session = this.sessions.get(sessionId);
134
- if (!session) {
135
- return Promise.reject(new Error(`Session not found: ${sessionId}`));
136
- }
137
- if (!session.sseResponse || session.sseResponse.writableEnded) {
138
- return Promise.reject(new Error(`No active SSE connection for session: ${sessionId}`));
139
- }
140
- if (!skipToolCheck && !session.registeredTools.has(toolName)) {
141
- return Promise.reject(new Error(`Tool not registered in session: ${toolName}`));
142
- }
143
- const callId = `c-${(0, crypto_1.randomBytes)(8).toString('hex')}`;
144
- return new Promise((resolve, reject) => {
145
- const pending = {
146
- callId,
147
- sessionId,
148
- toolName,
149
- createdAt: Date.now(),
150
- resolve,
151
- reject,
152
- };
153
- session.pendingCalls.set(callId, pending);
154
- session.lastActivity = Date.now();
155
- // SSE push: JSON-RPC request to extension
156
- const event = JSON.stringify({
157
- jsonrpc: '2.0',
158
- method: 'tools/call',
159
- id: callId,
160
- params: { name: toolName, arguments: args },
161
- });
162
- session.sseResponse.write(`data: ${event}\n\n`);
163
- // Timeout
164
- const timeout = setTimeout(() => {
165
- if (session.pendingCalls.has(callId)) {
166
- session.pendingCalls.delete(callId);
167
- reject(new Error(`Tool call timeout: ${toolName} (${callId})`));
168
- }
169
- }, TOOL_CALL_TIMEOUT_MS);
170
- timeout.unref();
171
- // Patch resolve/reject to clear timeout
172
- const origResolve = pending.resolve;
173
- const origReject = pending.reject;
174
- pending.resolve = (result) => {
175
- clearTimeout(timeout);
176
- origResolve(result);
177
- };
178
- pending.reject = (error) => {
179
- clearTimeout(timeout);
180
- origReject(error);
181
- };
182
- });
183
- }
184
- resolveToolCall(sessionId, callId, result) {
185
- const session = this.sessions.get(sessionId);
186
- if (!session)
187
- return false;
188
- const pending = session.pendingCalls.get(callId);
189
- if (!pending)
190
- return false;
191
- session.pendingCalls.delete(callId);
192
- session.lastActivity = Date.now();
193
- pending.resolve(result);
194
- return true;
195
- }
196
- rejectToolCall(sessionId, callId, error) {
197
- const session = this.sessions.get(sessionId);
198
- if (!session)
199
- return false;
200
- const pending = session.pendingCalls.get(callId);
201
- if (!pending)
202
- return false;
203
- session.pendingCalls.delete(callId);
204
- pending.reject(error);
205
- return true;
206
- }
207
- cleanupSse(session) {
208
- if (session.keepaliveTimer) {
209
- clearInterval(session.keepaliveTimer);
210
- session.keepaliveTimer = undefined;
211
- }
212
- if (session.sseResponse && !session.sseResponse.writableEnded) {
213
- session.sseResponse.end();
214
- }
215
- session.sseResponse = null;
216
- }
217
- rejectAllPending(session, error) {
218
- for (const pending of session.pendingCalls.values()) {
219
- pending.reject(error);
220
- }
221
- session.pendingCalls.clear();
222
- session.registeredTools.clear();
223
- }
224
- destroySession(session) {
225
- this.cleanupSse(session);
226
- this.rejectAllPending(session, new Error('Session destroyed'));
227
- }
228
- sweep() {
229
- const now = Date.now();
230
- let swept = 0;
231
- for (const [id, session] of this.sessions) {
232
- if (now - session.lastActivity > DEFAULT_TTL_MS) {
233
- this.destroySession(session);
234
- this.sessions.delete(id);
235
- swept++;
236
- }
237
- }
238
- if (swept > 0) {
239
- this.logger.log(`Swept ${swept} expired session(s)`);
240
- }
241
- }
242
- };
243
- exports.BrowserSessionStore = BrowserSessionStore;
244
- exports.BrowserSessionStore = BrowserSessionStore = BrowserSessionStore_1 = __decorate([
245
- (0, common_1.Injectable)(),
246
- __metadata("design:paramtypes", [])
247
- ], BrowserSessionStore);
@@ -1,119 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createCrewxTool = createCrewxTool;
4
- const common_1 = require("@nestjs/common");
5
- const workspace_context_store_js_1 = require("../../common/workspace-context.store.js");
6
- const logger = new common_1.Logger('CrewXToolFactory');
7
- /**
8
- * Create ICrewXTool implementation backed by a shared Crewx singleton (NestJS DI).
9
- *
10
- * All paths delegate to `crewx.query/execute` — threads row upsert, platform,
11
- * title, first_message, and message persistence are handled by the SDK's
12
- * ConversationPlugin chain. The Crewx instance lifecycle is owned by
13
- * CrewxModule; this factory must NEVER call crewx.close().
14
- */
15
- function createCrewxTool(crewx) {
16
- // Pre-call helper: ensures threads row exists before fire-and-forget SDK call,
17
- // closing the race window between task:start emission and REST response.
18
- const preEnsureThread = async (threadId, platform) => {
19
- if (!threadId)
20
- return;
21
- const conv = crewx.plugins.find((p) => p.name === 'conversation')?.conversationProvider;
22
- try {
23
- await conv?.ensureThread(threadId, platform, crewx.workspaceId);
24
- }
25
- catch (err) {
26
- logger.warn(`ensureThread skipped [thread=${threadId}]: ${err.message}`);
27
- }
28
- };
29
- return {
30
- async listAgents() {
31
- try {
32
- const availableAgents = Array.from(crewx.agents.values()).map((a) => ({
33
- id: a.id,
34
- name: a.name,
35
- role: a.role,
36
- team: a.team,
37
- description: a.description,
38
- }));
39
- const text = JSON.stringify(availableAgents, null, 2);
40
- return {
41
- content: [{ type: 'text', text }],
42
- success: true,
43
- availableAgents,
44
- totalCount: availableAgents.length,
45
- };
46
- }
47
- catch (err) {
48
- logger.error(`listAgents error: ${err.message}`, err.stack);
49
- return { content: [], success: false, totalCount: 0, error: err.message };
50
- }
51
- },
52
- async queryAgent(args) {
53
- try {
54
- const platform = args.platform ?? 'mcp';
55
- await preEnsureThread(args.threadId, platform);
56
- const onTaskId = args.onTaskId;
57
- let taskStartHandler;
58
- if (onTaskId) {
59
- taskStartHandler = (ev) => onTaskId(ev.traceId);
60
- crewx.once('task:start', taskStartHandler);
61
- }
62
- const result = await crewx.query(`@${args.agentId}`, args.query, {
63
- provider: args.provider,
64
- model: args.model,
65
- context: args.context,
66
- threadId: args.threadId,
67
- metadata: args.metadata,
68
- platform,
69
- cwd: (0, workspace_context_store_js_1.getWorkspacePath)(),
70
- });
71
- return {
72
- content: [{ type: 'text', text: result.data }],
73
- success: result.ok,
74
- agent: args.agentId,
75
- provider: args.provider,
76
- query: args.query,
77
- response: result.data,
78
- taskId: result.meta?.taskId,
79
- ...(result.ok ? {} : { isError: true, error: result.error?.message }),
80
- };
81
- }
82
- catch (err) {
83
- logger.error(`queryAgent error [agent=${args.agentId}]: ${err.message}`, err.stack);
84
- return { content: [], success: false, isError: true, error: err.message };
85
- }
86
- },
87
- async executeAgent(args) {
88
- const { agentId, task, metadata } = args;
89
- // threadId sibling takes priority; fall back to legacy metadata.thread for backward compat
90
- const threadId = args.threadId ?? metadata?.['thread'];
91
- logger.log(`[execute:${agentId}] starting (thread=${threadId ?? 'none'}) via shared Crewx`);
92
- const platform = args.platform ?? 'mcp';
93
- await preEnsureThread(threadId, platform);
94
- const onTaskId = args.onTaskId;
95
- if (onTaskId) {
96
- crewx.once('task:start', (ev) => onTaskId(ev.traceId));
97
- }
98
- // Fire-and-forget: return immediately, task runs in background.
99
- // Never close the shared Crewx instance — CrewxModule owns its lifecycle.
100
- crewx
101
- .execute(`@${agentId}`, task, {
102
- provider: args.provider,
103
- model: args.model,
104
- context: args.context,
105
- threadId,
106
- metadata: args.metadata,
107
- platform,
108
- })
109
- .then((r) => logger.log(`[execute:${agentId}] done (ok=${r.ok})`))
110
- .catch((e) => logger.error(`[execute:${agentId}] error: ${e.message}`, e.stack));
111
- return {
112
- content: [{ type: 'text', text: 'Task started' }],
113
- success: true,
114
- agent: agentId,
115
- taskId: threadId,
116
- };
117
- },
118
- };
119
- }
@@ -1,61 +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 __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.McpAuthGuard = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const mcp_constants_js_1 = require("./mcp.constants.js");
18
- let McpAuthGuard = class McpAuthGuard {
19
- tokenInfo;
20
- constructor(tokenInfo) {
21
- this.tokenInfo = tokenInfo;
22
- }
23
- canActivate(context) {
24
- const request = context.switchToHttp().getRequest();
25
- // Extract token: Authorization header takes priority over query parameter
26
- const bearerToken = this.extractTokenFromHeader(request)
27
- ?? this.extractTokenFromQuery(request);
28
- if (!bearerToken) {
29
- throw new common_1.UnauthorizedException('Missing authentication token');
30
- }
31
- if (bearerToken !== this.tokenInfo.token) {
32
- throw new common_1.UnauthorizedException('Invalid bearer token');
33
- }
34
- return true;
35
- }
36
- extractTokenFromHeader(request) {
37
- const authHeader = request.headers['authorization'] || request.headers['Authorization'];
38
- if (!authHeader || typeof authHeader !== 'string') {
39
- return null;
40
- }
41
- const prefix = 'Bearer ';
42
- if (!authHeader.startsWith(prefix)) {
43
- return null;
44
- }
45
- const token = authHeader.slice(prefix.length).trim();
46
- return token || null;
47
- }
48
- extractTokenFromQuery(request) {
49
- const token = request.query['token'];
50
- if (typeof token === 'string' && token.length > 0) {
51
- return token;
52
- }
53
- return null;
54
- }
55
- };
56
- exports.McpAuthGuard = McpAuthGuard;
57
- exports.McpAuthGuard = McpAuthGuard = __decorate([
58
- (0, common_1.Injectable)(),
59
- __param(0, (0, common_1.Inject)(mcp_constants_js_1.MCP_TOKEN)),
60
- __metadata("design:paramtypes", [Object])
61
- ], McpAuthGuard);
@@ -1,4 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MCP_TOKEN = void 0;
4
- exports.MCP_TOKEN = 'MCP_TOKEN';
@@ -1,125 +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 __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- var McpController_1;
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.McpController = void 0;
17
- const common_1 = require("@nestjs/common");
18
- const mcp_service_js_1 = require("./mcp.service.js");
19
- const mcp_auth_guard_js_1 = require("./mcp-auth.guard.js");
20
- const public_decorator_js_1 = require("../auth/decorators/public.decorator.js");
21
- const MCP_SESSION_HEADER = 'mcp-session-id';
22
- let McpController = McpController_1 = class McpController {
23
- mcpService;
24
- logger = new common_1.Logger(McpController_1.name);
25
- constructor(mcpService) {
26
- this.mcpService = mcpService;
27
- }
28
- async handleMcp(body, sessionId, clientType, res) {
29
- this.logger.debug(`MCP request [session=${sessionId ?? 'none'}]: ${JSON.stringify(body)}`);
30
- // JSON-RPC response from extension (has result or error, no method)
31
- // Must be checked BEFORE validateRequest — responses have no method field
32
- if (!body.method && body.id && ('result' in body || 'error' in body)) {
33
- if (!sessionId) {
34
- res.status(400).json({ error: 'Missing Mcp-Session-Id for tool call result' });
35
- return;
36
- }
37
- const handled = this.mcpService.handleToolCallResult(sessionId, body);
38
- res.status(handled ? 204 : 404).send();
39
- return;
40
- }
41
- // Validate JSON-RPC structure
42
- const validationError = this.mcpService.validateRequest(body);
43
- if (validationError) {
44
- this.logger.warn(`Invalid JSON-RPC request: ${validationError.error?.message}`);
45
- res.status(200).json(validationError);
46
- return;
47
- }
48
- const result = await this.mcpService.handleRequest(body, sessionId, clientType);
49
- // Notifications return null
50
- if (result === null) {
51
- this.logger.debug(`Notification processed: ${body.method}`);
52
- res.status(204).send();
53
- return;
54
- }
55
- // initialize: set Mcp-Session-Id header, strip internal _sessionId
56
- if (body.method === 'initialize' && result._sessionId) {
57
- const { _sessionId, ...jsonRpcResult } = result;
58
- res.setHeader('Mcp-Session-Id', _sessionId);
59
- this.logger.debug(`MCP initialize → session: ${_sessionId}`);
60
- res.status(200).json(jsonRpcResult);
61
- return;
62
- }
63
- this.logger.debug(`MCP response: ${JSON.stringify(result)}`);
64
- res.status(200).json(result);
65
- }
66
- handleSse(sessionId, accept, res) {
67
- if (!accept?.includes('text/event-stream')) {
68
- res.status(400).json({ error: 'Accept header must include text/event-stream' });
69
- return;
70
- }
71
- if (!sessionId) {
72
- res.status(400).json({ error: 'Missing Mcp-Session-Id header' });
73
- return;
74
- }
75
- const store = this.mcpService.getBrowserSessionStore();
76
- const session = store.get(sessionId);
77
- if (!session) {
78
- res.status(404).json({ error: 'Session not found' });
79
- return;
80
- }
81
- this.logger.log(`SSE connection for session: ${sessionId}`);
82
- store.bindSse(sessionId, res);
83
- }
84
- health() {
85
- return {
86
- status: 'ok',
87
- timestamp: new Date().toISOString(),
88
- server: 'crewx-ui',
89
- };
90
- }
91
- };
92
- exports.McpController = McpController;
93
- __decorate([
94
- (0, common_1.Post)('mcp'),
95
- (0, common_1.HttpCode)(200),
96
- (0, common_1.UseGuards)(mcp_auth_guard_js_1.McpAuthGuard),
97
- __param(0, (0, common_1.Body)()),
98
- __param(1, (0, common_1.Headers)(MCP_SESSION_HEADER)),
99
- __param(2, (0, common_1.Headers)('x-client-type')),
100
- __param(3, (0, common_1.Res)()),
101
- __metadata("design:type", Function),
102
- __metadata("design:paramtypes", [Object, Object, Object, Object]),
103
- __metadata("design:returntype", Promise)
104
- ], McpController.prototype, "handleMcp", null);
105
- __decorate([
106
- (0, common_1.Get)('mcp'),
107
- (0, common_1.UseGuards)(mcp_auth_guard_js_1.McpAuthGuard),
108
- __param(0, (0, common_1.Headers)(MCP_SESSION_HEADER)),
109
- __param(1, (0, common_1.Headers)('accept')),
110
- __param(2, (0, common_1.Res)()),
111
- __metadata("design:type", Function),
112
- __metadata("design:paramtypes", [Object, Object, Object]),
113
- __metadata("design:returntype", void 0)
114
- ], McpController.prototype, "handleSse", null);
115
- __decorate([
116
- (0, common_1.Get)('mcp/health'),
117
- __metadata("design:type", Function),
118
- __metadata("design:paramtypes", []),
119
- __metadata("design:returntype", void 0)
120
- ], McpController.prototype, "health", null);
121
- exports.McpController = McpController = McpController_1 = __decorate([
122
- (0, public_decorator_js_1.Public)(),
123
- (0, common_1.Controller)(),
124
- __metadata("design:paramtypes", [mcp_service_js_1.McpService])
125
- ], McpController);
@@ -1,12 +0,0 @@
1
- "use strict";
2
- // JSON-RPC 2.0 + MCP protocol types
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.JSON_RPC_ERRORS = void 0;
5
- // Standard JSON-RPC error codes
6
- exports.JSON_RPC_ERRORS = {
7
- PARSE_ERROR: { code: -32700, message: 'Parse error' },
8
- INVALID_REQUEST: { code: -32600, message: 'Invalid Request' },
9
- METHOD_NOT_FOUND: { code: -32601, message: 'Method not found' },
10
- INVALID_PARAMS: { code: -32602, message: 'Invalid params' },
11
- INTERNAL_ERROR: { code: -32603, message: 'Internal error' },
12
- };
@@ -1,49 +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
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.McpModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const config_1 = require("@nestjs/config");
12
- const crypto_1 = require("crypto");
13
- const mcp_controller_js_1 = require("./mcp.controller.js");
14
- const mcp_service_js_1 = require("./mcp.service.js");
15
- const browser_session_store_js_1 = require("./browser-session.store.js");
16
- const tool_router_service_js_1 = require("./tool-router.service.js");
17
- const mcp_constants_js_1 = require("./mcp.constants.js");
18
- const crewx_module_js_1 = require("../../modules/crewx.module.js");
19
- const repository_1 = require("@crewx/sdk/repository");
20
- let McpModule = class McpModule {
21
- };
22
- exports.McpModule = McpModule;
23
- exports.McpModule = McpModule = __decorate([
24
- (0, common_1.Module)({
25
- imports: [crewx_module_js_1.CrewxModule],
26
- controllers: [mcp_controller_js_1.McpController],
27
- providers: [
28
- mcp_service_js_1.McpService,
29
- browser_session_store_js_1.BrowserSessionStore,
30
- tool_router_service_js_1.ToolRouterService,
31
- {
32
- provide: mcp_constants_js_1.MCP_TOKEN,
33
- useFactory: (configService) => {
34
- const envToken = configService.get('MCP_BEARER_TOKEN');
35
- if (envToken) {
36
- return { token: envToken, source: 'env' };
37
- }
38
- return { token: (0, crypto_1.randomUUID)(), source: 'generated' };
39
- },
40
- inject: [config_1.ConfigService],
41
- },
42
- {
43
- provide: repository_1.ToolCallRepository,
44
- useFactory: () => new repository_1.ToolCallRepository(),
45
- },
46
- ],
47
- exports: [mcp_constants_js_1.MCP_TOKEN, browser_session_store_js_1.BrowserSessionStore],
48
- })
49
- ], McpModule);