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.
- package/dist/assets/{MarketPage-aY16UW1_.js → MarketPage-lLBtAENs.js} +10 -15
- package/dist/assets/{PromptTab-C3aTJS6u.js → PromptTab-Daq54dMi.js} +1 -1
- package/dist/assets/_baseUniq-BJDqmZBO.js +1 -0
- package/dist/assets/{arc-BCQAokB1.js → arc-ByjRIa5p.js} +1 -1
- package/dist/assets/{architectureDiagram-UYN6MBPD-Bc87ujv2.js → architectureDiagram-UYN6MBPD-DcKpqSFb.js} +1 -1
- package/dist/assets/{blockDiagram-ZHA2E4KO-wC9uH8Lb.js → blockDiagram-ZHA2E4KO-YvUeULT5.js} +1 -1
- package/dist/assets/{c4Diagram-6F5ED5ID-CqB7lqni.js → c4Diagram-6F5ED5ID-vggzH2N5.js} +1 -1
- package/dist/assets/channel-1Y6YooBb.js +1 -0
- package/dist/assets/{chunk-5HRBRIJM-Cc1L17Eh.js → chunk-5HRBRIJM-BbaQwJkn.js} +1 -1
- package/dist/assets/{chunk-7U56Z5CX-Df3nu_7G.js → chunk-7U56Z5CX-DVYVpFaa.js} +1 -1
- package/dist/assets/{chunk-ASOPGD6M-DIXslLG-.js → chunk-ASOPGD6M-CXEvWb-8.js} +1 -1
- package/dist/assets/{chunk-KFBOBJHC-FytVljyP.js → chunk-KFBOBJHC-CadVXFV3.js} +1 -1
- package/dist/assets/{chunk-T2TOU4HS-CU5z-cXq.js → chunk-T2TOU4HS-lDZr1sVF.js} +1 -1
- package/dist/assets/{chunk-TMUBEWPD-CWo1AFyn.js → chunk-TMUBEWPD-D5A0MrFD.js} +1 -1
- package/dist/assets/classDiagram-LNE6IOMH-CDxkV2JV.js +1 -0
- package/dist/assets/classDiagram-v2-MQ7JQ4JX-CDxkV2JV.js +1 -0
- package/dist/assets/clone-6xznz_9G.js +1 -0
- package/dist/assets/{dagre-4EVJKHTY-CgZW5tg4.js → dagre-4EVJKHTY-Bncx7Ijq.js} +1 -1
- package/dist/assets/{diagram-QW4FP2JN-CJAng8RC.js → diagram-QW4FP2JN-RkxVNs99.js} +1 -1
- package/dist/assets/{erDiagram-6RL3IURR-C1uHztHX.js → erDiagram-6RL3IURR-DIiKqQdx.js} +1 -1
- package/dist/assets/{flowDiagram-7ASYPVHJ-Yiu2odO-.js → flowDiagram-7ASYPVHJ-DQ5PN7v6.js} +1 -1
- package/dist/assets/{ganttDiagram-NTVNEXSI-tutc0dJP.js → ganttDiagram-NTVNEXSI-BeNWGpB6.js} +1 -1
- package/dist/assets/{gitGraph-YCYPL57B-C3jM6T4G.js → gitGraph-YCYPL57B-CdMe059q.js} +1 -1
- package/dist/assets/{gitGraphDiagram-NRZ2UAAF-0aqHEKzz.js → gitGraphDiagram-NRZ2UAAF-BEke5TyK.js} +1 -1
- package/dist/assets/{graph-DC224ILV.js → graph-DyQIwWJd.js} +1 -1
- package/dist/assets/{infoDiagram-A4XQUW5V-Do7Mpzkx.js → infoDiagram-A4XQUW5V-CUcC8I_5.js} +1 -1
- package/dist/assets/{journeyDiagram-G5WM74LC-DAruEJc7.js → journeyDiagram-G5WM74LC-CQ5DqAH5.js} +1 -1
- package/dist/assets/{kanban-definition-QRCXZQQD-DB63vLR0.js → kanban-definition-QRCXZQQD-BBsgOii7.js} +1 -1
- package/dist/assets/{layout-BiYH5x6Q.js → layout-D7vBs_Wy.js} +1 -1
- package/dist/assets/{linear-CLyGW2s0.js → linear-CEOF9oJz.js} +1 -1
- package/dist/assets/{main-CEKkUqZb.js → main-Bx1nZ7_p.js} +278 -273
- package/dist/assets/main-C4ebvOIJ.css +10 -0
- package/dist/assets/{min-ChJMFU2N.js → min-RK9J5Utn.js} +1 -1
- package/dist/assets/{mindmap-definition-GWI6TPTV-CtADqQgd.js → mindmap-definition-GWI6TPTV-BXvEU7qC.js} +1 -1
- package/dist/assets/{pieDiagram-YF2LJOPJ-BSOfzo3O.js → pieDiagram-YF2LJOPJ-TrXqcpni.js} +1 -1
- package/dist/assets/{quadrantDiagram-OS5C2QUG-BLBQNFVb.js → quadrantDiagram-OS5C2QUG-B-chTEU4.js} +1 -1
- package/dist/assets/{requirementDiagram-MIRIMTAZ-DqorvuS6.js → requirementDiagram-MIRIMTAZ-BgJhNLp_.js} +1 -1
- package/dist/assets/{sankeyDiagram-Y46BX6SQ-4NDcrLkB.js → sankeyDiagram-Y46BX6SQ-BVsgYKK7.js} +1 -1
- package/dist/assets/{sequenceDiagram-G6AWOVSC-yha6BxK2.js → sequenceDiagram-G6AWOVSC-ByJOpkq3.js} +1 -1
- package/dist/assets/{stateDiagram-MAYHULR4-XJ_I41ez.js → stateDiagram-MAYHULR4-Dw7lUL1B.js} +1 -1
- package/dist/assets/stateDiagram-v2-4JROLMXI-DYJiM3bF.js +1 -0
- package/dist/assets/{timeline-definition-U7ZMHBDA-DCNrmvE7.js → timeline-definition-U7ZMHBDA-CSoEYs60.js} +1 -1
- package/dist/assets/{xychartDiagram-6QU3TZC5-9N-Ohhdp.js → xychartDiagram-6QU3TZC5-0_rG7p3L.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +8 -8
- package/packages/cli/package.json +1 -1
- package/dist/assets/_baseUniq-DxEFlwNt.js +0 -1
- package/dist/assets/channel-DNLHkiNp.js +0 -1
- package/dist/assets/classDiagram-LNE6IOMH-B430Onym.js +0 -1
- package/dist/assets/classDiagram-v2-MQ7JQ4JX-B430Onym.js +0 -1
- package/dist/assets/clone-B9O3E3P1.js +0 -1
- package/dist/assets/main-D3YeRndF.css +0 -10
- package/dist/assets/stateDiagram-v2-4JROLMXI-CxcyPJO2.js +0 -1
- package/dist-server/adapters/adapter.module.js +0 -35
- package/dist-server/adapters/adapter.service.js +0 -79
- package/dist-server/adapters/http-router.service.js +0 -91
- package/dist-server/app.module.js +0 -111
- package/dist-server/bootstrap/crewx-server.js +0 -80
- package/dist-server/bootstrap/tls.js +0 -138
- package/dist-server/common/analytics.client.js +0 -180
- package/dist-server/common/analytics.module.js +0 -21
- package/dist-server/common/cors.js +0 -15
- package/dist-server/common/decorators/project.decorator.js +0 -21
- package/dist-server/common/decorators/workspace.decorator.js +0 -24
- package/dist-server/common/device-id.js +0 -33
- package/dist-server/common/interceptor/api-id-header.interceptor.js +0 -53
- package/dist-server/common/interceptor/http-logging.interceptor.js +0 -124
- package/dist-server/common/limits/defaults.js +0 -13
- package/dist-server/common/limits/limits-provider.js +0 -6
- package/dist-server/common/limits/limits.controller.js +0 -38
- package/dist-server/common/limits/limits.module.js +0 -24
- package/dist-server/common/limits/local-limits.provider.js +0 -27
- package/dist-server/common/middleware/workspace.middleware.js +0 -210
- package/dist-server/common/repository.exception-filter.js +0 -48
- package/dist-server/common/workspace-context.store.js +0 -25
- package/dist-server/domain/agent/agent.controller.js +0 -96
- package/dist-server/domain/agent/agent.module.js +0 -27
- package/dist-server/domain/agent/agent.service.js +0 -335
- package/dist-server/domain/agent/agent.types.js +0 -3
- package/dist-server/domain/agent/dto/create-agent.dto.js +0 -80
- package/dist-server/domain/agent/dto/preview-prompt.dto.js +0 -77
- package/dist-server/domain/agent/dto/provider-meta.dto.js +0 -2
- package/dist-server/domain/agent/dto/update-agent.dto.js +0 -92
- package/dist-server/domain/agent/provider.controller.js +0 -38
- package/dist-server/domain/agent/template-processor.service.js +0 -71
- package/dist-server/domain/auth/auth.constants.js +0 -4
- package/dist-server/domain/auth/auth.controller.js +0 -123
- package/dist-server/domain/auth/auth.module.js +0 -47
- package/dist-server/domain/auth/decorators/public.decorator.js +0 -7
- package/dist-server/domain/auth/guards/base-auth.guard.js +0 -66
- package/dist-server/domain/auth/session-store.js +0 -26
- package/dist-server/domain/auth/utils/ip.utils.js +0 -31
- package/dist-server/domain/box/box.controller.js +0 -77
- package/dist-server/domain/box/box.module.js +0 -21
- package/dist-server/domain/box/box.service.js +0 -97
- package/dist-server/domain/box/dto/create-box.dto.js +0 -74
- package/dist-server/domain/cli/cli.controller.js +0 -136
- package/dist-server/domain/cli/cli.module.js +0 -21
- package/dist-server/domain/cli/cli.service.js +0 -598
- package/dist-server/domain/cli/dto/login-cli.dto.js +0 -25
- package/dist-server/domain/cli/dto/update-cli.dto.js +0 -31
- package/dist-server/domain/doc/doc.controller.js +0 -95
- package/dist-server/domain/doc/doc.module.js +0 -21
- package/dist-server/domain/doc/doc.service.js +0 -368
- package/dist-server/domain/doc/dto/doc.dto.js +0 -64
- package/dist-server/domain/document/document.controller.js +0 -57
- package/dist-server/domain/document/document.module.js +0 -22
- package/dist-server/domain/document/document.service.js +0 -274
- package/dist-server/domain/document/dto/register-document.dto.js +0 -24
- package/dist-server/domain/fs/dto/mkdir-request.dto.js +0 -47
- package/dist-server/domain/fs/dto/mkdir-response.dto.js +0 -2
- package/dist-server/domain/fs/dto/quick-access.dto.js +0 -2
- package/dist-server/domain/fs/dto/tree-node.dto.js +0 -2
- package/dist-server/domain/fs/dto/tree-query.dto.js +0 -35
- package/dist-server/domain/fs/fs.controller.js +0 -63
- package/dist-server/domain/fs/fs.module.js +0 -22
- package/dist-server/domain/fs/fs.service.js +0 -303
- package/dist-server/domain/git/git.module.js +0 -20
- package/dist-server/domain/git/git.service.js +0 -222
- package/dist-server/domain/goal/dto/goal.dto.js +0 -49
- package/dist-server/domain/goal/goal.controller.js +0 -86
- package/dist-server/domain/goal/goal.module.js +0 -22
- package/dist-server/domain/goal/goal.service.js +0 -197
- package/dist-server/domain/goal/parser/goal-md-parser.js +0 -166
- package/dist-server/domain/goal/parser/goal-md-serializer.js +0 -110
- package/dist-server/domain/health/health.controller.js +0 -57
- package/dist-server/domain/health/health.module.js +0 -19
- package/dist-server/domain/knowledge/dto/graph-knowledge.dto.js +0 -27
- package/dist-server/domain/knowledge/dto/knowledge.dto.js +0 -71
- package/dist-server/domain/knowledge/knowledge.controller.js +0 -122
- package/dist-server/domain/knowledge/knowledge.module.js +0 -21
- package/dist-server/domain/knowledge/knowledge.service.js +0 -538
- package/dist-server/domain/market/dto/add-registry.dto.js +0 -32
- package/dist-server/domain/market/dto/install-market.dto.js +0 -30
- package/dist-server/domain/market/market.controller.js +0 -163
- package/dist-server/domain/market/market.module.js +0 -22
- package/dist-server/domain/market/market.service.js +0 -1447
- package/dist-server/domain/mcp/browser-session.store.js +0 -247
- package/dist-server/domain/mcp/crewx-tool.factory.js +0 -119
- package/dist-server/domain/mcp/mcp-auth.guard.js +0 -61
- package/dist-server/domain/mcp/mcp.constants.js +0 -4
- package/dist-server/domain/mcp/mcp.controller.js +0 -125
- package/dist-server/domain/mcp/mcp.dto.js +0 -12
- package/dist-server/domain/mcp/mcp.module.js +0 -49
- package/dist-server/domain/mcp/mcp.service.js +0 -684
- package/dist-server/domain/mcp/tool-router.service.js +0 -120
- package/dist-server/domain/message/dto/list-messages.dto.js +0 -57
- package/dist-server/domain/message/dto/send-message.dto.js +0 -45
- package/dist-server/domain/message/message.controller.js +0 -73
- package/dist-server/domain/message/message.module.js +0 -25
- package/dist-server/domain/message/message.service.js +0 -160
- package/dist-server/domain/onboarding/onboarding.controller.js +0 -97
- package/dist-server/domain/onboarding/onboarding.module.js +0 -23
- package/dist-server/domain/onboarding/onboarding.service.js +0 -106
- package/dist-server/domain/onboarding/onboarding.types.js +0 -2
- package/dist-server/domain/onboarding/presets/custom.js +0 -10
- package/dist-server/domain/onboarding/presets/dev-team.js +0 -41
- package/dist-server/domain/onboarding/presets/index.js +0 -15
- package/dist-server/domain/onboarding/presets/marketing-team.js +0 -29
- package/dist-server/domain/onboarding/presets/planning-team.js +0 -29
- package/dist-server/domain/onboarding/presets/solo.js +0 -17
- package/dist-server/domain/planner/dto/planner.dto.js +0 -58
- package/dist-server/domain/planner/planner.controller.js +0 -74
- package/dist-server/domain/planner/planner.module.js +0 -22
- package/dist-server/domain/planner/planner.service.js +0 -269
- package/dist-server/domain/project/dto/create-project.dto.js +0 -46
- package/dist-server/domain/project/dto/update-project.dto.js +0 -60
- package/dist-server/domain/project/project.controller.js +0 -129
- package/dist-server/domain/project/project.module.js +0 -22
- package/dist-server/domain/project/project.service.js +0 -173
- package/dist-server/domain/settings/settings.controller.js +0 -52
- package/dist-server/domain/settings/settings.module.js +0 -22
- package/dist-server/domain/settings/settings.service.js +0 -105
- package/dist-server/domain/task/dto/all-tasks.dto.js +0 -55
- package/dist-server/domain/task/dto/list-tasks.dto.js +0 -69
- package/dist-server/domain/task/dto/search-tasks.dto.js +0 -66
- package/dist-server/domain/task/dto/send-message.dto.js +0 -31
- package/dist-server/domain/task/dto/task-status.dto.js +0 -34
- package/dist-server/domain/task/dto/workspace-usage.dto.js +0 -38
- package/dist-server/domain/task/task.constants.js +0 -5
- package/dist-server/domain/task/task.controller.js +0 -169
- package/dist-server/domain/task/task.module.js +0 -23
- package/dist-server/domain/task/task.service.js +0 -775
- package/dist-server/domain/thread/dto/build-context.dto.js +0 -42
- package/dist-server/domain/thread/dto/list-messages.dto.js +0 -49
- package/dist-server/domain/thread/dto/list-threads.dto.js +0 -70
- package/dist-server/domain/thread/dto/search-threads.dto.js +0 -13
- package/dist-server/domain/thread/dto/update-thread.dto.js +0 -23
- package/dist-server/domain/thread/thread.controller.js +0 -160
- package/dist-server/domain/thread/thread.module.js +0 -23
- package/dist-server/domain/thread/thread.service.js +0 -419
- package/dist-server/domain/usage/usage.controller.js +0 -118
- package/dist-server/domain/usage/usage.module.js +0 -21
- package/dist-server/domain/usage/usage.service.js +0 -358
- package/dist-server/domain/usage/usage.types.js +0 -4
- package/dist-server/domain/wbs/wbs.controller.js +0 -51
- package/dist-server/domain/wbs/wbs.module.js +0 -21
- package/dist-server/domain/wbs/wbs.service.js +0 -94
- package/dist-server/domain/workflow/workflow.controller.js +0 -53
- package/dist-server/domain/workflow/workflow.module.js +0 -21
- package/dist-server/domain/workflow/workflow.service.js +0 -209
- package/dist-server/domain/workspace/dto/create-workspace.dto.js +0 -45
- package/dist-server/domain/workspace/dto/switch-workspace.dto.js +0 -32
- package/dist-server/domain/workspace/dto/workspace-info.dto.js +0 -2
- package/dist-server/domain/workspace/workspace.controller.js +0 -98
- package/dist-server/domain/workspace/workspace.module.js +0 -22
- package/dist-server/domain/workspace/workspace.service.js +0 -198
- package/dist-server/main.js +0 -204
- package/dist-server/modules/crewx-pool.service.js +0 -75
- package/dist-server/modules/crewx.module.js +0 -47
- package/dist-server/repository/base-sqlite.repository.js +0 -18
- package/dist-server/repository/box.repository.js +0 -99
- package/dist-server/repository/message.repository.js +0 -22
- package/dist-server/repository/project.repository.js +0 -51
- package/dist-server/repository/repository.module.js +0 -34
- package/dist-server/repository/request-log.repository.js +0 -96
- package/dist-server/repository/task.repository.js +0 -105
- package/dist-server/repository/thread.repository.js +0 -165
- package/dist-server/shared/crewx-home.js +0 -58
- package/dist-server/shared/crewx-state.js +0 -66
- package/dist-server/test-utils/compat-database.js +0 -30
- 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
|
-
}
|