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,209 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
-
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;
|
|
22
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
-
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
-
};
|
|
44
|
-
var WorkflowService_1;
|
|
45
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.WorkflowService = void 0;
|
|
47
|
-
const common_1 = require("@nestjs/common");
|
|
48
|
-
const promises_1 = require("fs/promises");
|
|
49
|
-
const path_1 = require("path");
|
|
50
|
-
const yaml = __importStar(require("js-yaml"));
|
|
51
|
-
const workflow_1 = require("@crewx/workflow");
|
|
52
|
-
const workspace_context_store_js_1 = require("../../common/workspace-context.store.js");
|
|
53
|
-
// ─── Type label map ─────────────────────────────────────────────────────────
|
|
54
|
-
const TYPE_LABELS = {
|
|
55
|
-
agent_task: '에이전트 작업',
|
|
56
|
-
branch: '조건 분기',
|
|
57
|
-
parallel: '병렬 실행',
|
|
58
|
-
join: '병렬 합류',
|
|
59
|
-
end: '종료',
|
|
60
|
-
approval: '승인',
|
|
61
|
-
};
|
|
62
|
-
// ─── Service ────────────────────────────────────────────────────────────────
|
|
63
|
-
let WorkflowService = WorkflowService_1 = class WorkflowService {
|
|
64
|
-
logger = new common_1.Logger(WorkflowService_1.name);
|
|
65
|
-
engine;
|
|
66
|
-
get workflowDir() {
|
|
67
|
-
return (0, path_1.join)((0, workspace_context_store_js_1.getWorkspacePath)(), 'workflows');
|
|
68
|
-
}
|
|
69
|
-
constructor() {
|
|
70
|
-
this.engine = new workflow_1.WorkflowEngine();
|
|
71
|
-
}
|
|
72
|
-
// ── Validation ──────────────────────────────────────────────────────────
|
|
73
|
-
validateId(id) {
|
|
74
|
-
if (id.includes('..') || id.includes('/') || id.includes('\\')) {
|
|
75
|
-
throw new common_1.BadRequestException('Invalid workflow ID');
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
// ── Parse a single YAML file ───────────────────────────────────────────
|
|
79
|
-
async parseYamlFile(filePath) {
|
|
80
|
-
try {
|
|
81
|
-
const content = await (0, promises_1.readFile)(filePath, 'utf-8');
|
|
82
|
-
const doc = yaml.load(content);
|
|
83
|
-
if (!doc?.workflows) {
|
|
84
|
-
return { workflows: [], error: 'No workflows section found' };
|
|
85
|
-
}
|
|
86
|
-
const sourceFile = (0, path_1.basename)(filePath);
|
|
87
|
-
const result = [];
|
|
88
|
-
for (const [id, spec] of Object.entries(doc.workflows)) {
|
|
89
|
-
result.push({ id, spec, sourceFile });
|
|
90
|
-
}
|
|
91
|
-
return { workflows: result };
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
return { workflows: [], error: String(err.message) };
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
// ── Build summary from spec ────────────────────────────────────────────
|
|
98
|
-
buildSummary(id, spec, sourceFile) {
|
|
99
|
-
const nodes = spec.nodes ?? {};
|
|
100
|
-
const nodeEntries = Object.values(nodes);
|
|
101
|
-
const agentSet = new Set();
|
|
102
|
-
let branchCount = 0;
|
|
103
|
-
for (const node of nodeEntries) {
|
|
104
|
-
if (node.agent)
|
|
105
|
-
agentSet.add(node.agent);
|
|
106
|
-
if (node.type === 'branch')
|
|
107
|
-
branchCount++;
|
|
108
|
-
}
|
|
109
|
-
const description = spec.metadata?.description ?? '';
|
|
110
|
-
return {
|
|
111
|
-
id,
|
|
112
|
-
name: spec.metadata?.name ?? id,
|
|
113
|
-
description: description.length > 200 ? description.slice(0, 200) : description,
|
|
114
|
-
nodeCount: nodeEntries.length,
|
|
115
|
-
branchCount,
|
|
116
|
-
agents: Array.from(agentSet).slice(0, 6),
|
|
117
|
-
timeout: spec.timeout ?? 0,
|
|
118
|
-
maxIterations: spec.max_iterations ?? 0,
|
|
119
|
-
sourceFile,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
// ── Build node summaries ───────────────────────────────────────────────
|
|
123
|
-
buildNodeSummaries(nodes) {
|
|
124
|
-
return Object.entries(nodes).map(([nodeId, node]) => {
|
|
125
|
-
let description;
|
|
126
|
-
if (node.input) {
|
|
127
|
-
const firstLine = node.input.trim().split('\n')[0];
|
|
128
|
-
description = firstLine.length > 50 ? firstLine.slice(0, 50) : firstLine;
|
|
129
|
-
}
|
|
130
|
-
return {
|
|
131
|
-
id: nodeId,
|
|
132
|
-
type: node.type,
|
|
133
|
-
typeLabel: TYPE_LABELS[node.type] ?? node.type,
|
|
134
|
-
...(node.agent ? { agent: node.agent } : {}),
|
|
135
|
-
...(description ? { description } : {}),
|
|
136
|
-
...(node.next ? { next: node.next } : {}),
|
|
137
|
-
};
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
// ── Public API ─────────────────────────────────────────────────────────
|
|
141
|
-
async listWorkflows() {
|
|
142
|
-
let files;
|
|
143
|
-
try {
|
|
144
|
-
const entries = await (0, promises_1.readdir)(this.workflowDir);
|
|
145
|
-
files = entries.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'));
|
|
146
|
-
}
|
|
147
|
-
catch (err) {
|
|
148
|
-
const code = err.code;
|
|
149
|
-
if (code === 'ENOENT') {
|
|
150
|
-
return { workflows: [] };
|
|
151
|
-
}
|
|
152
|
-
this.logger.error(`Failed to read workflow directory: ${err}`);
|
|
153
|
-
throw new common_1.InternalServerErrorException('Failed to read workflow directory');
|
|
154
|
-
}
|
|
155
|
-
const workflows = [];
|
|
156
|
-
const errors = [];
|
|
157
|
-
for (const file of files) {
|
|
158
|
-
const filePath = (0, path_1.join)(this.workflowDir, file);
|
|
159
|
-
const result = await this.parseYamlFile(filePath);
|
|
160
|
-
if (result.error) {
|
|
161
|
-
errors.push({ file, reason: result.error });
|
|
162
|
-
}
|
|
163
|
-
for (const wf of result.workflows) {
|
|
164
|
-
workflows.push(this.buildSummary(wf.id, wf.spec, wf.sourceFile));
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return {
|
|
168
|
-
workflows,
|
|
169
|
-
...(errors.length > 0 ? { errors } : {}),
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
async getWorkflow(id) {
|
|
173
|
-
this.validateId(id);
|
|
174
|
-
let files;
|
|
175
|
-
try {
|
|
176
|
-
const entries = await (0, promises_1.readdir)(this.workflowDir);
|
|
177
|
-
files = entries.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'));
|
|
178
|
-
}
|
|
179
|
-
catch (err) {
|
|
180
|
-
const code = err.code;
|
|
181
|
-
if (code === 'ENOENT') {
|
|
182
|
-
throw new common_1.NotFoundException(`Workflow '${id}' not found`);
|
|
183
|
-
}
|
|
184
|
-
this.logger.error(`Failed to read workflow directory: ${err}`);
|
|
185
|
-
throw new common_1.InternalServerErrorException('Failed to read workflow directory');
|
|
186
|
-
}
|
|
187
|
-
// Search all YAML files for the matching workflow ID
|
|
188
|
-
for (const file of files) {
|
|
189
|
-
const filePath = (0, path_1.join)(this.workflowDir, file);
|
|
190
|
-
const result = await this.parseYamlFile(filePath);
|
|
191
|
-
for (const wf of result.workflows) {
|
|
192
|
-
if (wf.id === id) {
|
|
193
|
-
const summary = this.buildSummary(wf.id, wf.spec, wf.sourceFile);
|
|
194
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
195
|
-
const mermaid = this.engine.toMermaid(wf.spec);
|
|
196
|
-
const nodes = this.buildNodeSummaries(wf.spec.nodes ?? {});
|
|
197
|
-
const state = wf.spec.state ?? {};
|
|
198
|
-
return { ...summary, mermaid, nodes, state };
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
throw new common_1.NotFoundException(`Workflow '${id}' not found`);
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
exports.WorkflowService = WorkflowService;
|
|
206
|
-
exports.WorkflowService = WorkflowService = WorkflowService_1 = __decorate([
|
|
207
|
-
(0, common_1.Injectable)(),
|
|
208
|
-
__metadata("design:paramtypes", [])
|
|
209
|
-
], WorkflowService);
|
|
@@ -1,45 +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
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.CreateWorkspaceDto = void 0;
|
|
13
|
-
const swagger_1 = require("@nestjs/swagger");
|
|
14
|
-
const class_validator_1 = require("class-validator");
|
|
15
|
-
class CreateWorkspaceDto {
|
|
16
|
-
workspace_path;
|
|
17
|
-
slug;
|
|
18
|
-
name;
|
|
19
|
-
initIfMissing;
|
|
20
|
-
}
|
|
21
|
-
exports.CreateWorkspaceDto = CreateWorkspaceDto;
|
|
22
|
-
__decorate([
|
|
23
|
-
(0, swagger_1.ApiProperty)({ description: 'Absolute path to the workspace directory' }),
|
|
24
|
-
(0, class_validator_1.IsString)(),
|
|
25
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
26
|
-
__metadata("design:type", String)
|
|
27
|
-
], CreateWorkspaceDto.prototype, "workspace_path", void 0);
|
|
28
|
-
__decorate([
|
|
29
|
-
(0, swagger_1.ApiPropertyOptional)({ description: 'Workspace slug (defaults to directory basename)' }),
|
|
30
|
-
(0, class_validator_1.IsOptional)(),
|
|
31
|
-
(0, class_validator_1.IsString)(),
|
|
32
|
-
__metadata("design:type", String)
|
|
33
|
-
], CreateWorkspaceDto.prototype, "slug", void 0);
|
|
34
|
-
__decorate([
|
|
35
|
-
(0, swagger_1.ApiPropertyOptional)({ description: 'Workspace display name (defaults to directory basename)' }),
|
|
36
|
-
(0, class_validator_1.IsOptional)(),
|
|
37
|
-
(0, class_validator_1.IsString)(),
|
|
38
|
-
__metadata("design:type", String)
|
|
39
|
-
], CreateWorkspaceDto.prototype, "name", void 0);
|
|
40
|
-
__decorate([
|
|
41
|
-
(0, swagger_1.ApiPropertyOptional)({ description: 'Run crewx init if crewx.yaml is missing (default: false)' }),
|
|
42
|
-
(0, class_validator_1.IsOptional)(),
|
|
43
|
-
(0, class_validator_1.IsBoolean)(),
|
|
44
|
-
__metadata("design:type", Boolean)
|
|
45
|
-
], CreateWorkspaceDto.prototype, "initIfMissing", void 0);
|
|
@@ -1,32 +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
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.SwitchWorkspaceDto = void 0;
|
|
13
|
-
const class_validator_1 = require("class-validator");
|
|
14
|
-
/**
|
|
15
|
-
* WKS.SWITCH request DTO.
|
|
16
|
-
* At least one of workspacePath or workspaceId must be provided.
|
|
17
|
-
*/
|
|
18
|
-
class SwitchWorkspaceDto {
|
|
19
|
-
workspacePath;
|
|
20
|
-
workspaceId;
|
|
21
|
-
}
|
|
22
|
-
exports.SwitchWorkspaceDto = SwitchWorkspaceDto;
|
|
23
|
-
__decorate([
|
|
24
|
-
(0, class_validator_1.ValidateIf)((o) => !o.workspaceId),
|
|
25
|
-
(0, class_validator_1.IsString)(),
|
|
26
|
-
__metadata("design:type", String)
|
|
27
|
-
], SwitchWorkspaceDto.prototype, "workspacePath", void 0);
|
|
28
|
-
__decorate([
|
|
29
|
-
(0, class_validator_1.ValidateIf)((o) => !o.workspacePath),
|
|
30
|
-
(0, class_validator_1.IsString)(),
|
|
31
|
-
__metadata("design:type", String)
|
|
32
|
-
], SwitchWorkspaceDto.prototype, "workspaceId", void 0);
|
|
@@ -1,98 +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.WorkspaceController = void 0;
|
|
16
|
-
const common_1 = require("@nestjs/common");
|
|
17
|
-
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
-
const throttler_1 = require("@nestjs/throttler");
|
|
19
|
-
const workspace_service_js_1 = require("./workspace.service.js");
|
|
20
|
-
const switch_workspace_dto_js_1 = require("./dto/switch-workspace.dto.js");
|
|
21
|
-
const create_workspace_dto_js_1 = require("./dto/create-workspace.dto.js");
|
|
22
|
-
let WorkspaceController = class WorkspaceController {
|
|
23
|
-
workspaceService;
|
|
24
|
-
constructor(workspaceService) {
|
|
25
|
-
this.workspaceService = workspaceService;
|
|
26
|
-
}
|
|
27
|
-
// WKS.LIST: List active workspaces
|
|
28
|
-
listWorkspaces() {
|
|
29
|
-
const data = this.workspaceService.listWorkspaces();
|
|
30
|
-
return { success: true, data };
|
|
31
|
-
}
|
|
32
|
-
// WKS.CURRENT: Get current (server default) workspace
|
|
33
|
-
getCurrentWorkspace() {
|
|
34
|
-
const data = this.workspaceService.getCurrentWorkspace();
|
|
35
|
-
return { success: true, data };
|
|
36
|
-
}
|
|
37
|
-
// WKS.SWITCH: Switch workspace (triggers server restart)
|
|
38
|
-
switchWorkspace(dto) {
|
|
39
|
-
const data = this.workspaceService.switchWorkspace(dto);
|
|
40
|
-
return { success: true, data };
|
|
41
|
-
}
|
|
42
|
-
// WKS.CREATE: Create (register) workspace
|
|
43
|
-
async createWorkspace(dto) {
|
|
44
|
-
const data = await this.workspaceService.createWorkspace(dto);
|
|
45
|
-
return { success: true, data };
|
|
46
|
-
}
|
|
47
|
-
// WKS.DELETE: Delete (deregister) workspace
|
|
48
|
-
deleteWorkspace(id) {
|
|
49
|
-
this.workspaceService.deleteWorkspace(id);
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
exports.WorkspaceController = WorkspaceController;
|
|
53
|
-
__decorate([
|
|
54
|
-
(0, swagger_1.ApiOperation)({ operationId: 'WKS.LIST', summary: 'List active workspaces' }),
|
|
55
|
-
(0, common_1.Get)(),
|
|
56
|
-
__metadata("design:type", Function),
|
|
57
|
-
__metadata("design:paramtypes", []),
|
|
58
|
-
__metadata("design:returntype", void 0)
|
|
59
|
-
], WorkspaceController.prototype, "listWorkspaces", null);
|
|
60
|
-
__decorate([
|
|
61
|
-
(0, swagger_1.ApiOperation)({ operationId: 'WKS.CURRENT', summary: 'Get current workspace' }),
|
|
62
|
-
(0, common_1.Get)('current'),
|
|
63
|
-
__metadata("design:type", Function),
|
|
64
|
-
__metadata("design:paramtypes", []),
|
|
65
|
-
__metadata("design:returntype", void 0)
|
|
66
|
-
], WorkspaceController.prototype, "getCurrentWorkspace", null);
|
|
67
|
-
__decorate([
|
|
68
|
-
(0, swagger_1.ApiOperation)({ operationId: 'WKS.SWITCH', summary: 'Switch workspace and restart server' }),
|
|
69
|
-
(0, common_1.Post)('switch'),
|
|
70
|
-
__param(0, (0, common_1.Body)()),
|
|
71
|
-
__metadata("design:type", Function),
|
|
72
|
-
__metadata("design:paramtypes", [switch_workspace_dto_js_1.SwitchWorkspaceDto]),
|
|
73
|
-
__metadata("design:returntype", void 0)
|
|
74
|
-
], WorkspaceController.prototype, "switchWorkspace", null);
|
|
75
|
-
__decorate([
|
|
76
|
-
(0, swagger_1.ApiOperation)({ operationId: 'WKS.CREATE', summary: 'Create (register) workspace (init optional)' }),
|
|
77
|
-
(0, common_1.Post)(),
|
|
78
|
-
(0, common_1.HttpCode)(common_1.HttpStatus.CREATED),
|
|
79
|
-
__param(0, (0, common_1.Body)()),
|
|
80
|
-
__metadata("design:type", Function),
|
|
81
|
-
__metadata("design:paramtypes", [create_workspace_dto_js_1.CreateWorkspaceDto]),
|
|
82
|
-
__metadata("design:returntype", Promise)
|
|
83
|
-
], WorkspaceController.prototype, "createWorkspace", null);
|
|
84
|
-
__decorate([
|
|
85
|
-
(0, swagger_1.ApiOperation)({ operationId: 'WKS.DELETE', summary: 'Delete a workspace (workspaces table only, FS untouched)' }),
|
|
86
|
-
(0, throttler_1.Throttle)({ default: { ttl: 60000, limit: 20 } }),
|
|
87
|
-
(0, common_1.Delete)(':id'),
|
|
88
|
-
(0, common_1.HttpCode)(common_1.HttpStatus.NO_CONTENT),
|
|
89
|
-
__param(0, (0, common_1.Param)('id')),
|
|
90
|
-
__metadata("design:type", Function),
|
|
91
|
-
__metadata("design:paramtypes", [String]),
|
|
92
|
-
__metadata("design:returntype", void 0)
|
|
93
|
-
], WorkspaceController.prototype, "deleteWorkspace", null);
|
|
94
|
-
exports.WorkspaceController = WorkspaceController = __decorate([
|
|
95
|
-
(0, swagger_1.ApiTags)('workspaces'),
|
|
96
|
-
(0, common_1.Controller)('workspaces'),
|
|
97
|
-
__metadata("design:paramtypes", [workspace_service_js_1.WorkspaceService])
|
|
98
|
-
], WorkspaceController);
|
|
@@ -1,22 +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.WorkspaceModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const workspace_controller_js_1 = require("./workspace.controller.js");
|
|
12
|
-
const workspace_service_js_1 = require("./workspace.service.js");
|
|
13
|
-
let WorkspaceModule = class WorkspaceModule {
|
|
14
|
-
};
|
|
15
|
-
exports.WorkspaceModule = WorkspaceModule;
|
|
16
|
-
exports.WorkspaceModule = WorkspaceModule = __decorate([
|
|
17
|
-
(0, common_1.Module)({
|
|
18
|
-
controllers: [workspace_controller_js_1.WorkspaceController],
|
|
19
|
-
providers: [workspace_service_js_1.WorkspaceService],
|
|
20
|
-
exports: [workspace_service_js_1.WorkspaceService],
|
|
21
|
-
})
|
|
22
|
-
], WorkspaceModule);
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
-
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;
|
|
22
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
-
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
-
};
|
|
44
|
-
var WorkspaceService_1;
|
|
45
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.WorkspaceService = void 0;
|
|
47
|
-
const common_1 = require("@nestjs/common");
|
|
48
|
-
const sdk_1 = require("@crewx/sdk");
|
|
49
|
-
const cli_1 = require("@crewx/cli");
|
|
50
|
-
const path = __importStar(require("path"));
|
|
51
|
-
const fs_1 = require("fs");
|
|
52
|
-
const project_repository_js_1 = require("../../repository/project.repository.js");
|
|
53
|
-
const workspace_context_store_js_1 = require("../../common/workspace-context.store.js");
|
|
54
|
-
const limits_provider_js_1 = require("../../common/limits/limits-provider.js");
|
|
55
|
-
let WorkspaceService = WorkspaceService_1 = class WorkspaceService {
|
|
56
|
-
projectRepo;
|
|
57
|
-
limitsProvider;
|
|
58
|
-
logger = new common_1.Logger(WorkspaceService_1.name);
|
|
59
|
-
constructor(projectRepo, limitsProvider) {
|
|
60
|
-
this.projectRepo = projectRepo;
|
|
61
|
-
this.limitsProvider = limitsProvider;
|
|
62
|
-
}
|
|
63
|
-
/** Resolve the current workspace ID (request-scoped via AsyncLocalStorage). */
|
|
64
|
-
get currentWorkspaceId() {
|
|
65
|
-
const id = (0, workspace_context_store_js_1.getWorkspaceId)();
|
|
66
|
-
if (id)
|
|
67
|
-
return id;
|
|
68
|
-
return (0, sdk_1.hashWorkspaceId)((0, workspace_context_store_js_1.getWorkspacePath)());
|
|
69
|
-
}
|
|
70
|
-
/** WKS.CREATE: Create (register) a new workspace */
|
|
71
|
-
async createWorkspace(dto) {
|
|
72
|
-
const limits = await this.limitsProvider.resolve();
|
|
73
|
-
const { total } = this.projectRepo.listProjects({ isActive: true, limit: 1, offset: 0 });
|
|
74
|
-
if (limits.workspaces !== -1 && total >= limits.workspaces) {
|
|
75
|
-
throw new common_1.HttpException({ code: 'WORKSPACE_LIMIT_EXCEEDED', current: total, limit: limits.workspaces }, 412);
|
|
76
|
-
}
|
|
77
|
-
const workspacePath = (0, sdk_1.normalizeWorkspacePath)(dto.workspace_path);
|
|
78
|
-
if (!(0, fs_1.existsSync)(workspacePath)) {
|
|
79
|
-
throw new common_1.NotFoundException({ code: 'PATH_NOT_FOUND' });
|
|
80
|
-
}
|
|
81
|
-
const hasYaml = (0, fs_1.existsSync)(path.join(workspacePath, 'crewx.yaml')) ||
|
|
82
|
-
(0, fs_1.existsSync)(path.join(workspacePath, 'crewx.yml'));
|
|
83
|
-
if (!hasYaml && !dto.initIfMissing) {
|
|
84
|
-
throw new common_1.BadRequestException({ code: 'NOT_A_CREWX_WORKSPACE' });
|
|
85
|
-
}
|
|
86
|
-
const id = (0, sdk_1.hashWorkspaceId)(workspacePath);
|
|
87
|
-
// Check ALREADY_REGISTERED before calling handleInit to avoid unnecessary work
|
|
88
|
-
if (this.projectRepo.findById(id)) {
|
|
89
|
-
throw new common_1.ConflictException({ code: 'WORKSPACE_ALREADY_REGISTERED' });
|
|
90
|
-
}
|
|
91
|
-
// Always delegate to handleInit — it registers workspace (idempotent) for both
|
|
92
|
-
// yaml-exists and yaml-not-exists cases. skipHook=false so hooks are installed on init.
|
|
93
|
-
let initResult;
|
|
94
|
-
try {
|
|
95
|
-
initResult = await (0, cli_1.handleInit)({ path: workspacePath, skipHook: false });
|
|
96
|
-
}
|
|
97
|
-
catch (e) {
|
|
98
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
99
|
-
throw new common_1.HttpException({ code: 'INIT_FAILED', errors: [msg] }, 500);
|
|
100
|
-
}
|
|
101
|
-
if (!initResult.yamlCreated && initResult.errors.length > 0 && !initResult.skippedReason) {
|
|
102
|
-
throw new common_1.HttpException({ code: 'INIT_FAILED', errors: initResult.errors }, 500);
|
|
103
|
-
}
|
|
104
|
-
// Retrieve the workspace row registered by handleInit
|
|
105
|
-
const row = this.projectRepo.findById(id);
|
|
106
|
-
if (!row) {
|
|
107
|
-
throw new common_1.HttpException({ code: 'INIT_FAILED', errors: ['Workspace registration failed'] }, 500);
|
|
108
|
-
}
|
|
109
|
-
return { ...this.toWorkspaceInfo(row), initResult };
|
|
110
|
-
}
|
|
111
|
-
/** WKS.LIST: List active workspaces with is_current flag */
|
|
112
|
-
listWorkspaces() {
|
|
113
|
-
const { rows } = this.projectRepo.listProjects({
|
|
114
|
-
isActive: true,
|
|
115
|
-
limit: 1000,
|
|
116
|
-
offset: 0,
|
|
117
|
-
});
|
|
118
|
-
const workspaces = rows.map((row) => this.toWorkspaceInfo(row));
|
|
119
|
-
return { workspaces };
|
|
120
|
-
}
|
|
121
|
-
/** WKS.CURRENT: Get the current workspace (request-scoped) */
|
|
122
|
-
getCurrentWorkspace() {
|
|
123
|
-
const wsId = this.currentWorkspaceId;
|
|
124
|
-
const row = this.projectRepo.findById(wsId);
|
|
125
|
-
if (row) {
|
|
126
|
-
return this.toWorkspaceInfo(row);
|
|
127
|
-
}
|
|
128
|
-
throw new common_1.NotFoundException({
|
|
129
|
-
code: 'WORKSPACE_NOT_FOUND',
|
|
130
|
-
message: 'No workspace registered for current directory',
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* WKS.SWITCH: Validate workspace and return its info.
|
|
135
|
-
* No server restart needed — the frontend switches the X-CrewX-Workspace header
|
|
136
|
-
* and AsyncLocalStorage handles per-request workspace resolution.
|
|
137
|
-
*/
|
|
138
|
-
switchWorkspace(dto) {
|
|
139
|
-
let workspacePath;
|
|
140
|
-
if (dto.workspacePath) {
|
|
141
|
-
workspacePath = (0, sdk_1.normalizeWorkspacePath)(dto.workspacePath);
|
|
142
|
-
if (!(0, fs_1.existsSync)(workspacePath)) {
|
|
143
|
-
throw new common_1.NotFoundException('Workspace path does not exist');
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
else if (dto.workspaceId) {
|
|
147
|
-
const row = this.projectRepo.findById(dto.workspaceId);
|
|
148
|
-
if (!row?.workspace_path) {
|
|
149
|
-
throw new common_1.NotFoundException('Workspace not found');
|
|
150
|
-
}
|
|
151
|
-
workspacePath = (0, sdk_1.normalizeWorkspacePath)(row.workspace_path);
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
throw new common_1.BadRequestException('Either workspacePath or workspaceId is required');
|
|
155
|
-
}
|
|
156
|
-
const workspaceId = (0, sdk_1.hashWorkspaceId)(workspacePath);
|
|
157
|
-
const row = this.projectRepo.findById(workspaceId);
|
|
158
|
-
if (!row) {
|
|
159
|
-
throw new common_1.NotFoundException('Workspace not registered');
|
|
160
|
-
}
|
|
161
|
-
const workspace = this.toWorkspaceInfo(row);
|
|
162
|
-
this.logger.log(`Workspace switch validated: ${workspacePath}`);
|
|
163
|
-
return { message: 'Workspace switched', workspace };
|
|
164
|
-
}
|
|
165
|
-
/** WKS.DELETE: Deregister a workspace (removes row; FS untouched) */
|
|
166
|
-
deleteWorkspace(id) {
|
|
167
|
-
const target = this.projectRepo.findById(id);
|
|
168
|
-
if (!target) {
|
|
169
|
-
throw new common_1.NotFoundException({ code: 'WORKSPACE_NOT_FOUND', message: 'workspace not found' });
|
|
170
|
-
}
|
|
171
|
-
if (this.currentWorkspaceId === id) {
|
|
172
|
-
throw new common_1.ConflictException({
|
|
173
|
-
code: 'WORKSPACE_IS_CURRENT',
|
|
174
|
-
message: 'cannot delete the current workspace; switch to another one first',
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
this.projectRepo.delete(id);
|
|
178
|
-
this.logger.log(`[WKS.DELETE] removed: ${id} (${target.name})`);
|
|
179
|
-
}
|
|
180
|
-
/** Map a DB row to the API response shape */
|
|
181
|
-
toWorkspaceInfo(row) {
|
|
182
|
-
return {
|
|
183
|
-
id: row.id,
|
|
184
|
-
slug: row.slug,
|
|
185
|
-
name: row.name,
|
|
186
|
-
workspace_path: row.workspace_path ? (0, sdk_1.normalizeWorkspacePath)(row.workspace_path) : '',
|
|
187
|
-
is_current: row.id === this.currentWorkspaceId,
|
|
188
|
-
created_at: row.created_at,
|
|
189
|
-
updated_at: row.updated_at,
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
exports.WorkspaceService = WorkspaceService;
|
|
194
|
-
exports.WorkspaceService = WorkspaceService = WorkspaceService_1 = __decorate([
|
|
195
|
-
(0, common_1.Injectable)(),
|
|
196
|
-
__metadata("design:paramtypes", [project_repository_js_1.ProjectRepository,
|
|
197
|
-
limits_provider_js_1.LimitsProvider])
|
|
198
|
-
], WorkspaceService);
|