crewx 0.8.4 → 0.8.5-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/packages/cli/package.json +1 -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 -102
- package/dist-server/bootstrap/crewx-server.js +0 -79
- 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/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 -26
- package/dist-server/domain/agent/agent.service.js +0 -317
- 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 -120
- 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 -62
- 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 -88
- package/dist-server/domain/cli/cli.module.js +0 -21
- package/dist-server/domain/cli/cli.service.js +0 -435
- 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 -271
- 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/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/mcp/browser-session.store.js +0 -247
- package/dist-server/domain/mcp/crewx-tool.factory.js +0 -117
- 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 -682
- 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 -158
- 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/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/skill/dto/add-registry.dto.js +0 -23
- package/dist-server/domain/skill/dto/install-skill.dto.js +0 -30
- package/dist-server/domain/skill/skill.controller.js +0 -136
- package/dist-server/domain/skill/skill.module.js +0 -22
- package/dist-server/domain/skill/skill.service.js +0 -632
- 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 -722
- 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 -132
- package/dist-server/domain/thread/thread.module.js +0 -23
- package/dist-server/domain/thread/thread.service.js +0 -399
- 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 -343
- 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 -216
- package/dist-server/main.js +0 -175
- package/dist-server/modules/crewx-pool.service.js +0 -70
- package/dist-server/modules/crewx.module.js +0 -47
- package/dist-server/package.json +0 -3
- 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 -48
- 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 -102
- package/dist-server/repository/thread.repository.js +0 -143
- 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,303 +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 FsService_1;
|
|
45
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.FsService = void 0;
|
|
47
|
-
const common_1 = require("@nestjs/common");
|
|
48
|
-
const fs_1 = require("fs");
|
|
49
|
-
const os = __importStar(require("os"));
|
|
50
|
-
const nodePath = __importStar(require("path"));
|
|
51
|
-
const project_repository_js_1 = require("../../repository/project.repository.js");
|
|
52
|
-
let FsService = class FsService {
|
|
53
|
-
static { FsService_1 = this; }
|
|
54
|
-
projectRepo;
|
|
55
|
-
logger = new common_1.Logger(FsService_1.name);
|
|
56
|
-
/** Hard cap regardless of what caller requests. */
|
|
57
|
-
static MAX_DEPTH = 5;
|
|
58
|
-
/**
|
|
59
|
-
* Prefixes that are unconditionally blocked for security (POSIX).
|
|
60
|
-
* Checked against the resolved (real) absolute path.
|
|
61
|
-
*/
|
|
62
|
-
static BLOCKED_PREFIXES = [
|
|
63
|
-
'/etc',
|
|
64
|
-
'/private',
|
|
65
|
-
'/var',
|
|
66
|
-
'/System',
|
|
67
|
-
'/usr',
|
|
68
|
-
'/bin',
|
|
69
|
-
'/sbin',
|
|
70
|
-
'/dev',
|
|
71
|
-
];
|
|
72
|
-
/**
|
|
73
|
-
* Prefixes blocked on Windows.
|
|
74
|
-
* security_reviewer High-2: Win32 전용 BLOCKED_PREFIXES 분리.
|
|
75
|
-
*/
|
|
76
|
-
static BLOCKED_PREFIXES_WIN = [
|
|
77
|
-
'C:\\Windows',
|
|
78
|
-
'C:\\Program Files',
|
|
79
|
-
'C:\\Program Files (x86)',
|
|
80
|
-
'C:\\System Volume Information',
|
|
81
|
-
'C:\\ProgramData',
|
|
82
|
-
'C:\\Recovery',
|
|
83
|
-
];
|
|
84
|
-
constructor(projectRepo) {
|
|
85
|
-
this.projectRepo = projectRepo;
|
|
86
|
-
}
|
|
87
|
-
resolveQuickAccess() {
|
|
88
|
-
const home = os.homedir();
|
|
89
|
-
const crewxWorkspaces = nodePath.join(home, 'crewx');
|
|
90
|
-
return [
|
|
91
|
-
{ key: 'home', path: home, exists: (0, fs_1.existsSync)(home) },
|
|
92
|
-
{ key: 'workspaces', path: crewxWorkspaces, exists: (0, fs_1.existsSync)(crewxWorkspaces) },
|
|
93
|
-
];
|
|
94
|
-
}
|
|
95
|
-
async getTree(rawPath, maxDepth) {
|
|
96
|
-
// 1. Reject relative paths immediately
|
|
97
|
-
if (!nodePath.isAbsolute(rawPath)) {
|
|
98
|
-
throw new common_1.BadRequestException({ code: 'PATH_NOT_ABSOLUTE', message: 'path must be absolute' });
|
|
99
|
-
}
|
|
100
|
-
// 2. Normalize (resolves .., ., and trailing slashes) without following symlinks
|
|
101
|
-
const absPath = nodePath.resolve(rawPath);
|
|
102
|
-
// 3. Reject system/protected directories
|
|
103
|
-
if (FsService_1.BLOCKED_PREFIXES.some((prefix) => absPath === prefix || absPath.startsWith(prefix + '/'))) {
|
|
104
|
-
this.logger.warn(`Blocked path access attempt: ${absPath}`);
|
|
105
|
-
throw new common_1.ForbiddenException({ code: 'PATH_BLOCKED', message: 'access to this path is not allowed' });
|
|
106
|
-
}
|
|
107
|
-
// 4. Check existence
|
|
108
|
-
if (!(0, fs_1.existsSync)(absPath)) {
|
|
109
|
-
throw new common_1.NotFoundException({ code: 'PATH_NOT_FOUND', message: 'path does not exist' });
|
|
110
|
-
}
|
|
111
|
-
// 5. Clamp depth
|
|
112
|
-
const clampedDepth = Math.min(Math.max(1, maxDepth), FsService_1.MAX_DEPTH);
|
|
113
|
-
// 6. Pre-load registered workspace paths (N+1 prevention)
|
|
114
|
-
const registeredPaths = new Set(this.projectRepo
|
|
115
|
-
.listProjects({ isActive: true, limit: 1000, offset: 0 })
|
|
116
|
-
.rows.map((r) => r.workspace_path)
|
|
117
|
-
.filter((p) => !!p));
|
|
118
|
-
// 7. Recursive walk with symlink-loop detection via visited real paths
|
|
119
|
-
return this.walk(absPath, clampedDepth, 0, registeredPaths, new Set());
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Creates a new directory at parentPath/name.
|
|
123
|
-
*
|
|
124
|
-
* security_reviewer 2026-05-07 권고 반영:
|
|
125
|
-
* - High-1: realpathSync로 symlink traversal 방어
|
|
126
|
-
* - High-2: Win32 BLOCKED_PREFIXES 분기 + UNC path 차단
|
|
127
|
-
* - Medium-3: name에 ':' 차단 (NTFS ADS)
|
|
128
|
-
* - Medium-4: Windows reserved device name 차단
|
|
129
|
-
* - Medium-5: name.trim() === '' 차단
|
|
130
|
-
* - Info-9: 성공 시 audit log
|
|
131
|
-
*/
|
|
132
|
-
async mkdir(parentPath, name) {
|
|
133
|
-
// 1. Validate parent path is absolute
|
|
134
|
-
if (!nodePath.isAbsolute(parentPath)) {
|
|
135
|
-
throw new common_1.BadRequestException({ code: 'PATH_NOT_ABSOLUTE', message: 'parentPath must be absolute' });
|
|
136
|
-
}
|
|
137
|
-
const absParent = nodePath.resolve(parentPath);
|
|
138
|
-
// High-1: resolve symlinks BEFORE blocked-prefix check (parent may be a symlink to /etc, etc.)
|
|
139
|
-
let realParent;
|
|
140
|
-
try {
|
|
141
|
-
realParent = (0, fs_1.realpathSync)(absParent);
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
throw new common_1.NotFoundException({ code: 'PARENT_NOT_FOUND', message: 'parent directory does not exist' });
|
|
145
|
-
}
|
|
146
|
-
// Verify the resolved parent is actually a directory (catches files on all platforms)
|
|
147
|
-
if (!(0, fs_1.statSync)(realParent).isDirectory()) {
|
|
148
|
-
throw new common_1.BadRequestException({ code: 'NOT_A_DIRECTORY', message: 'parent is not a directory' });
|
|
149
|
-
}
|
|
150
|
-
this.assertPathAllowed(realParent);
|
|
151
|
-
// 2. Validate name (defense-in-depth — DTO already validates, but server-side recheck)
|
|
152
|
-
if (name === '' || name === '.' || name === '..') {
|
|
153
|
-
throw new common_1.BadRequestException({ code: 'NAME_INVALID', message: 'name must not be empty, "." or ".."' });
|
|
154
|
-
}
|
|
155
|
-
if (name.trim() === '') {
|
|
156
|
-
// Medium-5: blank-only (spaces/tabs only)
|
|
157
|
-
throw new common_1.BadRequestException({ code: 'NAME_INVALID', message: 'name must not be blank' });
|
|
158
|
-
}
|
|
159
|
-
if (name.includes('/') || name.includes('\\') || /[\x00-\x1f]/.test(name)) {
|
|
160
|
-
throw new common_1.BadRequestException({ code: 'NAME_INVALID', message: 'name must not contain separators or control chars' });
|
|
161
|
-
}
|
|
162
|
-
if (process.platform === 'win32') {
|
|
163
|
-
if (name.includes(':')) {
|
|
164
|
-
// Medium-3: NTFS Alternate Data Streams
|
|
165
|
-
throw new common_1.BadRequestException({ code: 'NAME_INVALID', message: 'name must not contain colon on Windows' });
|
|
166
|
-
}
|
|
167
|
-
if (/^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\.|$)/i.test(name)) {
|
|
168
|
-
// Medium-4: reserved device names
|
|
169
|
-
throw new common_1.BadRequestException({ code: 'NAME_INVALID', message: 'reserved device name on Windows' });
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
// 3. Resolve target against real parent and verify containment
|
|
173
|
-
const target = nodePath.join(realParent, name);
|
|
174
|
-
if (!target.startsWith(realParent + nodePath.sep) && target !== realParent) {
|
|
175
|
-
throw new common_1.BadRequestException({ code: 'PATH_ESCAPE', message: 'resolved target escapes parent' });
|
|
176
|
-
}
|
|
177
|
-
// Re-check blocked prefixes against the resolved target
|
|
178
|
-
this.assertPathAllowed(target);
|
|
179
|
-
// 4. Attempt mkdir (NOT recursive — parent must already exist)
|
|
180
|
-
try {
|
|
181
|
-
(0, fs_1.mkdirSync)(target); // recursive not specified: ENOENT if parent missing, EEXIST if already present
|
|
182
|
-
this.logger.log(`[FS.MKDIR] created: ${target}`); // Info-9: audit log
|
|
183
|
-
return { path: target, created: true };
|
|
184
|
-
}
|
|
185
|
-
catch (err) {
|
|
186
|
-
const code = err.code;
|
|
187
|
-
if (code === 'EEXIST') {
|
|
188
|
-
// Idempotent: if it already exists AND is a directory, return created: false
|
|
189
|
-
const stat = (0, fs_1.statSync)(target);
|
|
190
|
-
if (stat.isDirectory()) {
|
|
191
|
-
return { path: target, created: false };
|
|
192
|
-
}
|
|
193
|
-
throw new common_1.ConflictException({ code: 'NOT_A_DIRECTORY', message: 'target exists but is not a directory' });
|
|
194
|
-
}
|
|
195
|
-
if (code === 'EACCES' || code === 'EPERM') {
|
|
196
|
-
throw new common_1.ForbiddenException({ code: 'PERMISSION_DENIED', message: 'permission denied' });
|
|
197
|
-
}
|
|
198
|
-
if (code === 'ENOENT') {
|
|
199
|
-
throw new common_1.NotFoundException({ code: 'PARENT_NOT_FOUND', message: 'parent directory does not exist' });
|
|
200
|
-
}
|
|
201
|
-
if (code === 'ENOTDIR') {
|
|
202
|
-
throw new common_1.BadRequestException({ code: 'NOT_A_DIRECTORY', message: 'parent is not a directory' });
|
|
203
|
-
}
|
|
204
|
-
if (code === 'EROFS') {
|
|
205
|
-
throw new common_1.ForbiddenException({ code: 'READ_ONLY_FS', message: 'filesystem is read-only' });
|
|
206
|
-
}
|
|
207
|
-
if (code === 'ENAMETOOLONG') {
|
|
208
|
-
throw new common_1.BadRequestException({ code: 'NAME_TOO_LONG', message: 'path or name too long' });
|
|
209
|
-
}
|
|
210
|
-
this.logger.error(`mkdir failed: ${err}`);
|
|
211
|
-
throw new common_1.InternalServerErrorException({ code: 'MKDIR_FAILED', message: 'failed to create directory' });
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Asserts that the given absolute path is not in a blocked system prefix.
|
|
216
|
-
* Used by both getTree and mkdir.
|
|
217
|
-
*
|
|
218
|
-
* security_reviewer High-2/High-3:
|
|
219
|
-
* - OS-specific BLOCKED_PREFIXES (Win32 vs POSIX)
|
|
220
|
-
* - UNC path block on Windows
|
|
221
|
-
* - Uses nodePath.sep for correct separator per OS
|
|
222
|
-
*/
|
|
223
|
-
assertPathAllowed(absPath) {
|
|
224
|
-
if (process.platform === 'win32' && absPath.startsWith('\\\\')) {
|
|
225
|
-
throw new common_1.ForbiddenException({ code: 'PATH_BLOCKED', message: 'UNC paths are not allowed' });
|
|
226
|
-
}
|
|
227
|
-
const prefixes = process.platform === 'win32' ? FsService_1.BLOCKED_PREFIXES_WIN : FsService_1.BLOCKED_PREFIXES;
|
|
228
|
-
if (prefixes.some((p) => absPath === p || absPath.startsWith(p + nodePath.sep))) {
|
|
229
|
-
this.logger.warn(`Blocked path access attempt: ${absPath}`);
|
|
230
|
-
throw new common_1.ForbiddenException({ code: 'PATH_BLOCKED', message: 'access to this path is not allowed' });
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
walk(dir, maxDepth, depth, registered, visited) {
|
|
234
|
-
if (depth >= maxDepth)
|
|
235
|
-
return [];
|
|
236
|
-
// Resolve real path to detect symlink loops
|
|
237
|
-
let realDir;
|
|
238
|
-
try {
|
|
239
|
-
realDir = (0, fs_1.realpathSync)(dir);
|
|
240
|
-
}
|
|
241
|
-
catch {
|
|
242
|
-
return []; // dangling symlink or permission error
|
|
243
|
-
}
|
|
244
|
-
if (visited.has(realDir)) {
|
|
245
|
-
this.logger.warn(`Symlink loop detected at: ${dir} → ${realDir}`);
|
|
246
|
-
return [];
|
|
247
|
-
}
|
|
248
|
-
// Clone visited set so sibling branches don't share loop state
|
|
249
|
-
const branchVisited = new Set(visited);
|
|
250
|
-
branchVisited.add(realDir);
|
|
251
|
-
let entries;
|
|
252
|
-
try {
|
|
253
|
-
entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
254
|
-
}
|
|
255
|
-
catch {
|
|
256
|
-
return []; // permission denied or other I/O error
|
|
257
|
-
}
|
|
258
|
-
const nodes = [];
|
|
259
|
-
for (const entry of entries) {
|
|
260
|
-
// Skip hidden directories (.git, .claude, etc.)
|
|
261
|
-
if (entry.name.startsWith('.'))
|
|
262
|
-
continue;
|
|
263
|
-
// Directory picker — files are excluded
|
|
264
|
-
if (!entry.isDirectory() && !entry.isSymbolicLink())
|
|
265
|
-
continue;
|
|
266
|
-
const childPath = nodePath.join(dir, entry.name);
|
|
267
|
-
// For symlinks: resolve real path, verify it's a directory, and check for loops
|
|
268
|
-
if (entry.isSymbolicLink()) {
|
|
269
|
-
let realChild;
|
|
270
|
-
try {
|
|
271
|
-
realChild = (0, fs_1.realpathSync)(childPath);
|
|
272
|
-
(0, fs_1.readdirSync)(realChild, { withFileTypes: true }); // throws if not a directory
|
|
273
|
-
}
|
|
274
|
-
catch {
|
|
275
|
-
continue; // broken symlink or target is not a directory
|
|
276
|
-
}
|
|
277
|
-
// Skip if the symlink target is already on this branch (loop prevention)
|
|
278
|
-
if (branchVisited.has(realChild)) {
|
|
279
|
-
this.logger.warn(`Symlink loop detected at: ${childPath} → ${realChild}`);
|
|
280
|
-
continue;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
const hasCrewxYaml = (0, fs_1.existsSync)(nodePath.join(childPath, 'crewx.yaml')) ||
|
|
284
|
-
(0, fs_1.existsSync)(nodePath.join(childPath, 'crewx.yml'));
|
|
285
|
-
const children = this.walk(childPath, maxDepth, depth + 1, registered, branchVisited);
|
|
286
|
-
nodes.push({
|
|
287
|
-
name: entry.name,
|
|
288
|
-
path: childPath,
|
|
289
|
-
isDirectory: true,
|
|
290
|
-
children,
|
|
291
|
-
hasCrewxYaml,
|
|
292
|
-
isRegistered: registered.has(childPath),
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
// Sort alphabetically for deterministic output
|
|
296
|
-
return nodes.sort((a, b) => a.name.localeCompare(b.name));
|
|
297
|
-
}
|
|
298
|
-
};
|
|
299
|
-
exports.FsService = FsService;
|
|
300
|
-
exports.FsService = FsService = FsService_1 = __decorate([
|
|
301
|
-
(0, common_1.Injectable)(),
|
|
302
|
-
__metadata("design:paramtypes", [project_repository_js_1.ProjectRepository])
|
|
303
|
-
], FsService);
|
|
@@ -1,20 +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.GitModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const git_service_js_1 = require("./git.service.js");
|
|
12
|
-
let GitModule = class GitModule {
|
|
13
|
-
};
|
|
14
|
-
exports.GitModule = GitModule;
|
|
15
|
-
exports.GitModule = GitModule = __decorate([
|
|
16
|
-
(0, common_1.Module)({
|
|
17
|
-
providers: [git_service_js_1.GitService],
|
|
18
|
-
exports: [git_service_js_1.GitService],
|
|
19
|
-
})
|
|
20
|
-
], GitModule);
|
|
@@ -1,222 +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 GitService_1;
|
|
42
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
-
exports.GitService = void 0;
|
|
44
|
-
const common_1 = require("@nestjs/common");
|
|
45
|
-
const path_1 = require("path");
|
|
46
|
-
const fs = __importStar(require("fs"));
|
|
47
|
-
const git = __importStar(require("isomorphic-git"));
|
|
48
|
-
const workspace_context_store_js_1 = require("../../common/workspace-context.store.js");
|
|
49
|
-
const AUTHOR = { name: 'CrewX', email: 'crewx@local' };
|
|
50
|
-
let GitService = GitService_1 = class GitService {
|
|
51
|
-
logger = new common_1.Logger(GitService_1.name);
|
|
52
|
-
// Reuse cache object per isomorphic-git recommendation
|
|
53
|
-
cache = {};
|
|
54
|
-
get dir() {
|
|
55
|
-
return (0, workspace_context_store_js_1.getWorkspacePath)();
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Stage a file and create a commit. Returns the commit SHA.
|
|
59
|
-
*/
|
|
60
|
-
async commitFile(filepath, message) {
|
|
61
|
-
await git.add({ fs, dir: this.dir, filepath, cache: this.cache });
|
|
62
|
-
const sha = await git.commit({
|
|
63
|
-
fs,
|
|
64
|
-
dir: this.dir,
|
|
65
|
-
message,
|
|
66
|
-
author: AUTHOR,
|
|
67
|
-
cache: this.cache,
|
|
68
|
-
});
|
|
69
|
-
return sha;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Return commit history, optionally filtered by filepath.
|
|
73
|
-
*/
|
|
74
|
-
async getHistory(filepath, depth = 50) {
|
|
75
|
-
const commits = await git.log({
|
|
76
|
-
fs,
|
|
77
|
-
dir: this.dir,
|
|
78
|
-
depth,
|
|
79
|
-
filepath,
|
|
80
|
-
cache: this.cache,
|
|
81
|
-
});
|
|
82
|
-
return commits.map((c) => ({
|
|
83
|
-
sha: c.oid,
|
|
84
|
-
message: c.commit.message.trim(),
|
|
85
|
-
timestamp: c.commit.committer.timestamp * 1000,
|
|
86
|
-
author: c.commit.author.name,
|
|
87
|
-
}));
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Restore a file to its state at the given commit SHA.
|
|
91
|
-
*/
|
|
92
|
-
async rollbackFile(filepath, commitSha) {
|
|
93
|
-
// Read file blob at that commit
|
|
94
|
-
const { blob } = await git.readBlob({
|
|
95
|
-
fs,
|
|
96
|
-
dir: this.dir,
|
|
97
|
-
oid: commitSha,
|
|
98
|
-
filepath,
|
|
99
|
-
cache: this.cache,
|
|
100
|
-
});
|
|
101
|
-
const absPath = (0, path_1.join)(this.dir, filepath);
|
|
102
|
-
fs.writeFileSync(absPath, Buffer.from(blob));
|
|
103
|
-
// Commit the rollback
|
|
104
|
-
await this.commitFile(filepath, `revert: restore ${filepath} to ${commitSha.slice(0, 7)}`);
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Return diff entries for the given commit compared to its parent.
|
|
108
|
-
* If filepath is provided, only include that file.
|
|
109
|
-
*/
|
|
110
|
-
async getFileDiff(commitSha, filepath) {
|
|
111
|
-
const commits = await git.log({
|
|
112
|
-
fs,
|
|
113
|
-
dir: this.dir,
|
|
114
|
-
depth: 2,
|
|
115
|
-
ref: commitSha,
|
|
116
|
-
cache: this.cache,
|
|
117
|
-
});
|
|
118
|
-
const currentCommit = commits[0];
|
|
119
|
-
const parentCommit = commits[1];
|
|
120
|
-
if (!currentCommit)
|
|
121
|
-
return [];
|
|
122
|
-
const currentTree = currentCommit.commit.tree;
|
|
123
|
-
const parentTree = parentCommit?.commit.tree;
|
|
124
|
-
const results = [];
|
|
125
|
-
const walkerTrees = parentTree
|
|
126
|
-
? [git.TREE({ ref: parentTree }), git.TREE({ ref: currentTree })]
|
|
127
|
-
: [git.TREE({ ref: currentTree })];
|
|
128
|
-
const changes = await git.walk({
|
|
129
|
-
fs,
|
|
130
|
-
dir: this.dir,
|
|
131
|
-
trees: walkerTrees,
|
|
132
|
-
map: async (path, entries) => {
|
|
133
|
-
if (filepath && path !== filepath)
|
|
134
|
-
return null;
|
|
135
|
-
// When no parent: single walker entry means all files are "add"
|
|
136
|
-
if (!parentTree) {
|
|
137
|
-
const [current] = entries;
|
|
138
|
-
if (!current)
|
|
139
|
-
return null;
|
|
140
|
-
const entryType = await current.type();
|
|
141
|
-
if (entryType === 'tree')
|
|
142
|
-
return null;
|
|
143
|
-
const oid = await current.oid();
|
|
144
|
-
let afterContent;
|
|
145
|
-
try {
|
|
146
|
-
const { blob } = await git.readBlob({
|
|
147
|
-
fs,
|
|
148
|
-
dir: this.dir,
|
|
149
|
-
oid,
|
|
150
|
-
cache: this.cache,
|
|
151
|
-
});
|
|
152
|
-
afterContent = Buffer.from(blob).toString('utf-8');
|
|
153
|
-
}
|
|
154
|
-
catch (e) {
|
|
155
|
-
this.logger.warn(`Failed to read blob for ${path}: ${e}`);
|
|
156
|
-
}
|
|
157
|
-
return { filepath: path, type: 'add', after: afterContent };
|
|
158
|
-
}
|
|
159
|
-
const [before, after] = entries;
|
|
160
|
-
const beforeType = await before?.type();
|
|
161
|
-
const afterType = await after?.type();
|
|
162
|
-
// Skip directories
|
|
163
|
-
if (beforeType === 'tree' || afterType === 'tree')
|
|
164
|
-
return null;
|
|
165
|
-
const beforeOid = await before?.oid();
|
|
166
|
-
const afterOid = await after?.oid();
|
|
167
|
-
if (beforeOid === afterOid)
|
|
168
|
-
return null; // No change
|
|
169
|
-
let type;
|
|
170
|
-
if (!before || beforeType === undefined) {
|
|
171
|
-
type = 'add';
|
|
172
|
-
}
|
|
173
|
-
else if (!after || afterType === undefined) {
|
|
174
|
-
type = 'delete';
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
type = 'modify';
|
|
178
|
-
}
|
|
179
|
-
let beforeContent;
|
|
180
|
-
let afterContent;
|
|
181
|
-
try {
|
|
182
|
-
if (type !== 'add' && beforeOid) {
|
|
183
|
-
const { blob } = await git.readBlob({
|
|
184
|
-
fs,
|
|
185
|
-
dir: this.dir,
|
|
186
|
-
oid: beforeOid,
|
|
187
|
-
cache: this.cache,
|
|
188
|
-
});
|
|
189
|
-
beforeContent = Buffer.from(blob).toString('utf-8');
|
|
190
|
-
}
|
|
191
|
-
if (type !== 'delete' && afterOid) {
|
|
192
|
-
const { blob } = await git.readBlob({
|
|
193
|
-
fs,
|
|
194
|
-
dir: this.dir,
|
|
195
|
-
oid: afterOid,
|
|
196
|
-
cache: this.cache,
|
|
197
|
-
});
|
|
198
|
-
afterContent = Buffer.from(blob).toString('utf-8');
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
catch (e) {
|
|
202
|
-
this.logger.warn(`Failed to read blob for ${path}: ${e}`);
|
|
203
|
-
}
|
|
204
|
-
return {
|
|
205
|
-
filepath: path,
|
|
206
|
-
type,
|
|
207
|
-
before: beforeContent,
|
|
208
|
-
after: afterContent,
|
|
209
|
-
};
|
|
210
|
-
},
|
|
211
|
-
});
|
|
212
|
-
for (const entry of changes) {
|
|
213
|
-
if (entry)
|
|
214
|
-
results.push(entry);
|
|
215
|
-
}
|
|
216
|
-
return results;
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
exports.GitService = GitService;
|
|
220
|
-
exports.GitService = GitService = GitService_1 = __decorate([
|
|
221
|
-
(0, common_1.Injectable)()
|
|
222
|
-
], GitService);
|
|
@@ -1,57 +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.HealthController = void 0;
|
|
13
|
-
const node_fs_1 = require("node:fs");
|
|
14
|
-
const node_path_1 = require("node:path");
|
|
15
|
-
const common_1 = require("@nestjs/common");
|
|
16
|
-
const swagger_1 = require("@nestjs/swagger");
|
|
17
|
-
const sdk_1 = require("@crewx/sdk");
|
|
18
|
-
const public_decorator_js_1 = require("../auth/decorators/public.decorator.js");
|
|
19
|
-
// Walk up from __dirname to find root package.json (works in both src/ and dist-server/ layouts)
|
|
20
|
-
const PKG_VERSION = (() => {
|
|
21
|
-
let dir = __dirname;
|
|
22
|
-
while (dir !== (0, node_path_1.dirname)(dir)) {
|
|
23
|
-
try {
|
|
24
|
-
const pkg = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(dir, 'package.json'), 'utf-8'));
|
|
25
|
-
if (pkg.name === 'crewx')
|
|
26
|
-
return pkg.version;
|
|
27
|
-
}
|
|
28
|
-
catch { }
|
|
29
|
-
dir = (0, node_path_1.dirname)(dir);
|
|
30
|
-
}
|
|
31
|
-
return 'unknown';
|
|
32
|
-
})();
|
|
33
|
-
let HealthController = class HealthController {
|
|
34
|
-
startedAt = Date.now();
|
|
35
|
-
health() {
|
|
36
|
-
const raw = process.env.CREWX_WORKSPACE || process.cwd();
|
|
37
|
-
const workspace = (0, sdk_1.normalizeWorkspacePath)(raw);
|
|
38
|
-
const uptime = Math.floor((Date.now() - this.startedAt) / 1000);
|
|
39
|
-
return {
|
|
40
|
-
success: true,
|
|
41
|
-
data: { status: 'ok', version: PKG_VERSION, workspace, uptime },
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
exports.HealthController = HealthController;
|
|
46
|
-
__decorate([
|
|
47
|
-
(0, swagger_1.ApiOperation)({ operationId: 'SYS.HEALTH', summary: 'Server health check' }),
|
|
48
|
-
(0, common_1.Get)(),
|
|
49
|
-
__metadata("design:type", Function),
|
|
50
|
-
__metadata("design:paramtypes", []),
|
|
51
|
-
__metadata("design:returntype", void 0)
|
|
52
|
-
], HealthController.prototype, "health", null);
|
|
53
|
-
exports.HealthController = HealthController = __decorate([
|
|
54
|
-
(0, public_decorator_js_1.Public)(),
|
|
55
|
-
(0, swagger_1.ApiTags)('health'),
|
|
56
|
-
(0, common_1.Controller)('health')
|
|
57
|
-
], HealthController);
|
|
@@ -1,19 +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.HealthModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const health_controller_js_1 = require("./health.controller.js");
|
|
12
|
-
let HealthModule = class HealthModule {
|
|
13
|
-
};
|
|
14
|
-
exports.HealthModule = HealthModule;
|
|
15
|
-
exports.HealthModule = HealthModule = __decorate([
|
|
16
|
-
(0, common_1.Module)({
|
|
17
|
-
controllers: [health_controller_js_1.HealthController],
|
|
18
|
-
})
|
|
19
|
-
], HealthModule);
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* DTOs for KNW.GRAPH Knowledge Graph API
|
|
4
|
-
*/
|
|
5
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
6
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
7
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
8
|
-
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;
|
|
9
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
10
|
-
};
|
|
11
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
12
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.GraphKnowledgeDto = void 0;
|
|
16
|
-
const swagger_1 = require("@nestjs/swagger");
|
|
17
|
-
const class_validator_1 = require("class-validator");
|
|
18
|
-
class GraphKnowledgeDto {
|
|
19
|
-
agent;
|
|
20
|
-
}
|
|
21
|
-
exports.GraphKnowledgeDto = GraphKnowledgeDto;
|
|
22
|
-
__decorate([
|
|
23
|
-
(0, swagger_1.ApiPropertyOptional)({ description: 'Filter by agent' }),
|
|
24
|
-
(0, class_validator_1.IsOptional)(),
|
|
25
|
-
(0, class_validator_1.IsString)(),
|
|
26
|
-
__metadata("design:type", String)
|
|
27
|
-
], GraphKnowledgeDto.prototype, "agent", void 0);
|