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,71 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* TemplateProcessorService
|
|
4
|
-
*
|
|
5
|
-
* Server-side equivalent of CLI's processDocumentTemplate function.
|
|
6
|
-
* Provides Handlebars template rendering with the same helpers and
|
|
7
|
-
* document context as the CLI, ensuring preview results match
|
|
8
|
-
* `crewx agent prompt @agent_id` output.
|
|
9
|
-
*
|
|
10
|
-
* Registers identical helpers to CLI's registerHandlebarsHelpers():
|
|
11
|
-
* eq, ne, contains, and, or, not, json
|
|
12
|
-
*/
|
|
13
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
14
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
15
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
-
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;
|
|
17
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
18
|
-
};
|
|
19
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
20
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
21
|
-
};
|
|
22
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.TemplateProcessorService = void 0;
|
|
24
|
-
const common_1 = require("@nestjs/common");
|
|
25
|
-
const handlebars_1 = __importDefault(require("handlebars"));
|
|
26
|
-
let TemplateProcessorService = class TemplateProcessorService {
|
|
27
|
-
/**
|
|
28
|
-
* Process a Handlebars template with document variables and context.
|
|
29
|
-
*
|
|
30
|
-
* Equivalent to CLI's processDocumentTemplate — registers the same helpers
|
|
31
|
-
* and builds the same context shape so preview output matches CLI output.
|
|
32
|
-
*
|
|
33
|
-
* @param template - Handlebars template string
|
|
34
|
-
* @param documents - Pre-loaded document context (content, toc, path)
|
|
35
|
-
* @param additionalContext - Optional agent/vars/env/mode context
|
|
36
|
-
* @returns Rendered template string
|
|
37
|
-
* @throws Error on Handlebars compilation failure (caller wraps with 422)
|
|
38
|
-
*/
|
|
39
|
-
processTemplate(template, documents, additionalContext) {
|
|
40
|
-
const context = {
|
|
41
|
-
documents,
|
|
42
|
-
agent: additionalContext?.agent ?? {},
|
|
43
|
-
vars: additionalContext?.vars ?? {},
|
|
44
|
-
env: additionalContext?.env ?? {},
|
|
45
|
-
mode: additionalContext?.mode,
|
|
46
|
-
platform: additionalContext?.platform,
|
|
47
|
-
};
|
|
48
|
-
// Create isolated Handlebars instance (same pattern as CLI)
|
|
49
|
-
const hbs = handlebars_1.default.create();
|
|
50
|
-
this.registerHelpers(hbs);
|
|
51
|
-
const compiled = hbs.compile(template, { noEscape: true });
|
|
52
|
-
return compiled(context);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Register CLI-equivalent Handlebars helpers.
|
|
56
|
-
* Matches registerHandlebarsHelpers() in packages/cli/src/utils/template-processor.ts
|
|
57
|
-
*/
|
|
58
|
-
registerHelpers(hbs) {
|
|
59
|
-
hbs.registerHelper('eq', (a, b) => a === b);
|
|
60
|
-
hbs.registerHelper('ne', (a, b) => a !== b);
|
|
61
|
-
hbs.registerHelper('contains', (array, value) => Array.isArray(array) && array.includes(value));
|
|
62
|
-
hbs.registerHelper('and', (a, b) => Boolean(a && b));
|
|
63
|
-
hbs.registerHelper('or', (a, b) => Boolean(a || b));
|
|
64
|
-
hbs.registerHelper('not', (a) => !a);
|
|
65
|
-
hbs.registerHelper('json', (ctx) => JSON.stringify(ctx, null, 2));
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
exports.TemplateProcessorService = TemplateProcessorService;
|
|
69
|
-
exports.TemplateProcessorService = TemplateProcessorService = __decorate([
|
|
70
|
-
(0, common_1.Injectable)()
|
|
71
|
-
], TemplateProcessorService);
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
-
};
|
|
14
|
-
var AuthController_1;
|
|
15
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.AuthController = void 0;
|
|
17
|
-
const common_1 = require("@nestjs/common");
|
|
18
|
-
const swagger_1 = require("@nestjs/swagger");
|
|
19
|
-
const class_validator_1 = require("class-validator");
|
|
20
|
-
const throttler_1 = require("@nestjs/throttler");
|
|
21
|
-
const mcp_constants_js_1 = require("../mcp/mcp.constants.js");
|
|
22
|
-
const auth_constants_js_1 = require("./auth.constants.js");
|
|
23
|
-
const public_decorator_js_1 = require("./decorators/public.decorator.js");
|
|
24
|
-
const ip_utils_js_1 = require("./utils/ip.utils.js");
|
|
25
|
-
class LoginDto {
|
|
26
|
-
username;
|
|
27
|
-
password;
|
|
28
|
-
}
|
|
29
|
-
__decorate([
|
|
30
|
-
(0, class_validator_1.IsString)(),
|
|
31
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
32
|
-
__metadata("design:type", String)
|
|
33
|
-
], LoginDto.prototype, "username", void 0);
|
|
34
|
-
__decorate([
|
|
35
|
-
(0, class_validator_1.IsString)(),
|
|
36
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
37
|
-
__metadata("design:type", String)
|
|
38
|
-
], LoginDto.prototype, "password", void 0);
|
|
39
|
-
const COOKIE_NAME = 'crewx_token';
|
|
40
|
-
let AuthController = AuthController_1 = class AuthController {
|
|
41
|
-
mcpToken;
|
|
42
|
-
credentials;
|
|
43
|
-
logger = new common_1.Logger(AuthController_1.name);
|
|
44
|
-
constructor(mcpToken, credentials) {
|
|
45
|
-
this.mcpToken = mcpToken;
|
|
46
|
-
this.credentials = credentials;
|
|
47
|
-
}
|
|
48
|
-
// AUTH.CHECK: Guard already passed at this point — always returns 200
|
|
49
|
-
check(req) {
|
|
50
|
-
const ip = req.ip || req.socket?.remoteAddress;
|
|
51
|
-
const isLocal = (0, ip_utils_js_1.isLoopback)(ip);
|
|
52
|
-
let method = 'local';
|
|
53
|
-
if (!isLocal) {
|
|
54
|
-
method = req.cookies?.[COOKIE_NAME] ? 'cookie' : 'token';
|
|
55
|
-
}
|
|
56
|
-
return { success: true, data: { authenticated: true, method } };
|
|
57
|
-
}
|
|
58
|
-
// AUTH.LOGIN: brute-force protected, @Public() skips BaseAuthGuard
|
|
59
|
-
login(body, res) {
|
|
60
|
-
const usernameOk = (0, ip_utils_js_1.safeCompare)(body.username, this.credentials.username);
|
|
61
|
-
const passwordOk = (0, ip_utils_js_1.safeCompare)(body.password, this.credentials.password);
|
|
62
|
-
if (!usernameOk || !passwordOk) {
|
|
63
|
-
this.logger.warn('Failed login attempt');
|
|
64
|
-
throw new common_1.UnauthorizedException({
|
|
65
|
-
success: false,
|
|
66
|
-
error: { code: 'INVALID_CREDENTIALS', message: 'Invalid username or password' },
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
res.cookie(COOKIE_NAME, this.mcpToken.token, {
|
|
70
|
-
httpOnly: true,
|
|
71
|
-
sameSite: 'strict',
|
|
72
|
-
secure: process.env.NODE_ENV === 'production',
|
|
73
|
-
maxAge: 7 * 24 * 60 * 60 * 1000,
|
|
74
|
-
path: '/',
|
|
75
|
-
});
|
|
76
|
-
return { success: true, data: { authenticated: true } };
|
|
77
|
-
}
|
|
78
|
-
// AUTH.LOGOUT: clear session cookie (BaseAuthGuard applied — not @Public)
|
|
79
|
-
logout(res) {
|
|
80
|
-
res.cookie(COOKIE_NAME, '', { httpOnly: true, maxAge: 0, path: '/' });
|
|
81
|
-
return { success: true, data: { authenticated: false } };
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
exports.AuthController = AuthController;
|
|
85
|
-
__decorate([
|
|
86
|
-
(0, swagger_1.ApiOperation)({ operationId: 'AUTH.CHECK', summary: 'Check auth status' }),
|
|
87
|
-
(0, common_1.Get)('check'),
|
|
88
|
-
__param(0, (0, common_1.Req)()),
|
|
89
|
-
__metadata("design:type", Function),
|
|
90
|
-
__metadata("design:paramtypes", [Object]),
|
|
91
|
-
__metadata("design:returntype", Object)
|
|
92
|
-
], AuthController.prototype, "check", null);
|
|
93
|
-
__decorate([
|
|
94
|
-
(0, swagger_1.ApiOperation)({ operationId: 'AUTH.LOGIN', summary: 'Login with username and password' }),
|
|
95
|
-
(0, public_decorator_js_1.Public)(),
|
|
96
|
-
(0, common_1.Post)('login'),
|
|
97
|
-
(0, common_1.HttpCode)(200),
|
|
98
|
-
(0, throttler_1.Throttle)({ default: { limit: 5, ttl: 60000 } }),
|
|
99
|
-
__param(0, (0, common_1.Body)()),
|
|
100
|
-
__param(1, (0, common_1.Res)({ passthrough: true })),
|
|
101
|
-
__metadata("design:type", Function),
|
|
102
|
-
__metadata("design:paramtypes", [LoginDto, Object]),
|
|
103
|
-
__metadata("design:returntype", Object)
|
|
104
|
-
], AuthController.prototype, "login", null);
|
|
105
|
-
__decorate([
|
|
106
|
-
(0, swagger_1.ApiOperation)({ operationId: 'AUTH.LOGOUT', summary: 'Logout and clear session cookie' }),
|
|
107
|
-
(0, common_1.Post)('logout'),
|
|
108
|
-
(0, common_1.HttpCode)(200),
|
|
109
|
-
__param(0, (0, common_1.Res)({ passthrough: true })),
|
|
110
|
-
__metadata("design:type", Function),
|
|
111
|
-
__metadata("design:paramtypes", [Object]),
|
|
112
|
-
__metadata("design:returntype", Object)
|
|
113
|
-
], AuthController.prototype, "logout", null);
|
|
114
|
-
exports.AuthController = AuthController = AuthController_1 = __decorate([
|
|
115
|
-
(0, swagger_1.ApiTags)('auth'),
|
|
116
|
-
(0, common_1.Controller)('auth'),
|
|
117
|
-
__param(0, (0, common_1.Inject)(mcp_constants_js_1.MCP_TOKEN)),
|
|
118
|
-
__param(1, (0, common_1.Inject)(auth_constants_js_1.AUTH_CREDENTIALS)),
|
|
119
|
-
__metadata("design:paramtypes", [Object, Object])
|
|
120
|
-
], AuthController);
|
|
@@ -1,47 +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.AuthModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const core_1 = require("@nestjs/core");
|
|
12
|
-
const config_1 = require("@nestjs/config");
|
|
13
|
-
const mcp_module_js_1 = require("../mcp/mcp.module.js");
|
|
14
|
-
const mcp_constants_js_1 = require("../mcp/mcp.constants.js");
|
|
15
|
-
const auth_constants_js_1 = require("./auth.constants.js");
|
|
16
|
-
const auth_controller_js_1 = require("./auth.controller.js");
|
|
17
|
-
const base_auth_guard_js_1 = require("./guards/base-auth.guard.js");
|
|
18
|
-
let AuthModule = class AuthModule {
|
|
19
|
-
};
|
|
20
|
-
exports.AuthModule = AuthModule;
|
|
21
|
-
exports.AuthModule = AuthModule = __decorate([
|
|
22
|
-
(0, common_1.Module)({
|
|
23
|
-
imports: [mcp_module_js_1.McpModule],
|
|
24
|
-
controllers: [auth_controller_js_1.AuthController],
|
|
25
|
-
providers: [
|
|
26
|
-
{
|
|
27
|
-
provide: auth_constants_js_1.AUTH_CREDENTIALS,
|
|
28
|
-
useFactory: (config, mcpToken) => {
|
|
29
|
-
const username = config.get('AUTH_USERNAME') || 'admin';
|
|
30
|
-
const envPassword = config.get('AUTH_PASSWORD');
|
|
31
|
-
if (envPassword) {
|
|
32
|
-
return { username, password: envPassword, source: 'env' };
|
|
33
|
-
}
|
|
34
|
-
// Fallback to MCP token (env-set or auto-generated)
|
|
35
|
-
const source = mcpToken.source === 'env' ? 'mcp-fallback' : 'auto-generated';
|
|
36
|
-
return { username, password: mcpToken.token, source };
|
|
37
|
-
},
|
|
38
|
-
inject: [config_1.ConfigService, mcp_constants_js_1.MCP_TOKEN],
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
provide: core_1.APP_GUARD,
|
|
42
|
-
useClass: base_auth_guard_js_1.BaseAuthGuard,
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
exports: [auth_constants_js_1.AUTH_CREDENTIALS],
|
|
46
|
-
})
|
|
47
|
-
], AuthModule);
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Public = exports.IS_PUBLIC_KEY = void 0;
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
exports.IS_PUBLIC_KEY = 'isPublic';
|
|
6
|
-
const Public = () => (0, common_1.SetMetadata)(exports.IS_PUBLIC_KEY, true);
|
|
7
|
-
exports.Public = Public;
|
|
@@ -1,62 +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.BaseAuthGuard = void 0;
|
|
16
|
-
const common_1 = require("@nestjs/common");
|
|
17
|
-
const core_1 = require("@nestjs/core");
|
|
18
|
-
const mcp_constants_js_1 = require("../../mcp/mcp.constants.js");
|
|
19
|
-
const public_decorator_js_1 = require("../decorators/public.decorator.js");
|
|
20
|
-
const ip_utils_js_1 = require("../utils/ip.utils.js");
|
|
21
|
-
let BaseAuthGuard = class BaseAuthGuard {
|
|
22
|
-
reflector;
|
|
23
|
-
mcpToken;
|
|
24
|
-
constructor(reflector, mcpToken) {
|
|
25
|
-
this.reflector = reflector;
|
|
26
|
-
this.mcpToken = mcpToken;
|
|
27
|
-
}
|
|
28
|
-
canActivate(context) {
|
|
29
|
-
const isPublic = this.reflector.getAllAndOverride(public_decorator_js_1.IS_PUBLIC_KEY, [
|
|
30
|
-
context.getHandler(),
|
|
31
|
-
context.getClass(),
|
|
32
|
-
]);
|
|
33
|
-
if (isPublic)
|
|
34
|
-
return true;
|
|
35
|
-
const req = context.switchToHttp().getRequest();
|
|
36
|
-
if (this.isLocalRequest(req))
|
|
37
|
-
return true;
|
|
38
|
-
return this.validateToken(req);
|
|
39
|
-
}
|
|
40
|
-
isLocalRequest(req) {
|
|
41
|
-
// TCP-level remoteAddress only — unforgeable (no header checks)
|
|
42
|
-
const ip = req.socket?.remoteAddress;
|
|
43
|
-
return (0, ip_utils_js_1.isLoopback)(ip);
|
|
44
|
-
}
|
|
45
|
-
validateToken(req) {
|
|
46
|
-
const cookieToken = req.cookies?.['crewx_token'];
|
|
47
|
-
const bearerToken = (0, ip_utils_js_1.extractBearerToken)(req);
|
|
48
|
-
const token = cookieToken || bearerToken;
|
|
49
|
-
if (!token)
|
|
50
|
-
throw new common_1.UnauthorizedException('Authentication required');
|
|
51
|
-
if (!(0, ip_utils_js_1.safeCompare)(token, this.mcpToken.token)) {
|
|
52
|
-
throw new common_1.UnauthorizedException('Invalid token');
|
|
53
|
-
}
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
exports.BaseAuthGuard = BaseAuthGuard;
|
|
58
|
-
exports.BaseAuthGuard = BaseAuthGuard = __decorate([
|
|
59
|
-
(0, common_1.Injectable)(),
|
|
60
|
-
__param(1, (0, common_1.Inject)(mcp_constants_js_1.MCP_TOKEN)),
|
|
61
|
-
__metadata("design:paramtypes", [core_1.Reflector, Object])
|
|
62
|
-
], BaseAuthGuard);
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isLoopback = isLoopback;
|
|
4
|
-
exports.safeCompare = safeCompare;
|
|
5
|
-
exports.extractBearerToken = extractBearerToken;
|
|
6
|
-
exports.maskPassword = maskPassword;
|
|
7
|
-
const crypto_1 = require("crypto");
|
|
8
|
-
function isLoopback(ip) {
|
|
9
|
-
if (!ip)
|
|
10
|
-
return false;
|
|
11
|
-
return ip === '127.0.0.1' || ip === '::1' || ip === '::ffff:127.0.0.1';
|
|
12
|
-
}
|
|
13
|
-
function safeCompare(a, b) {
|
|
14
|
-
if (a.length !== b.length)
|
|
15
|
-
return false;
|
|
16
|
-
return (0, crypto_1.timingSafeEqual)(Buffer.from(a), Buffer.from(b));
|
|
17
|
-
}
|
|
18
|
-
function extractBearerToken(req) {
|
|
19
|
-
const authHeader = req.headers['authorization'];
|
|
20
|
-
if (!authHeader || typeof authHeader !== 'string')
|
|
21
|
-
return null;
|
|
22
|
-
if (!authHeader.startsWith('Bearer '))
|
|
23
|
-
return null;
|
|
24
|
-
const token = authHeader.slice(7).trim();
|
|
25
|
-
return token || null;
|
|
26
|
-
}
|
|
27
|
-
function maskPassword(pw) {
|
|
28
|
-
if (pw.length <= 4)
|
|
29
|
-
return '****';
|
|
30
|
-
return pw.slice(0, 4) + '****' + pw.slice(-4);
|
|
31
|
-
}
|
|
@@ -1,77 +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.BoxController = void 0;
|
|
16
|
-
const common_1 = require("@nestjs/common");
|
|
17
|
-
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
-
const box_service_js_1 = require("./box.service.js");
|
|
19
|
-
const create_box_dto_js_1 = require("./dto/create-box.dto.js");
|
|
20
|
-
const workspace_decorator_js_1 = require("../../common/decorators/workspace.decorator.js");
|
|
21
|
-
let BoxController = class BoxController {
|
|
22
|
-
boxService;
|
|
23
|
-
constructor(boxService) {
|
|
24
|
-
this.boxService = boxService;
|
|
25
|
-
}
|
|
26
|
-
// BOX.LIST: List boxes for a thread (seq ASC)
|
|
27
|
-
listBoxes(threadId, ws) {
|
|
28
|
-
const data = this.boxService.listBoxes(threadId, ws.id);
|
|
29
|
-
return { success: true, data };
|
|
30
|
-
}
|
|
31
|
-
// BOX.GET: Get box detail with previews
|
|
32
|
-
getBox(threadId, boxId, ws) {
|
|
33
|
-
const data = this.boxService.getBox(threadId, boxId, ws.id);
|
|
34
|
-
return { success: true, data };
|
|
35
|
-
}
|
|
36
|
-
// BOX.CREATE: Create an immutable box (INSERT only)
|
|
37
|
-
createBox(threadId, body, ws) {
|
|
38
|
-
const data = this.boxService.createBox(threadId, body, ws.id);
|
|
39
|
-
return { success: true, data };
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
exports.BoxController = BoxController;
|
|
43
|
-
__decorate([
|
|
44
|
-
(0, swagger_1.ApiOperation)({ operationId: 'BOX.LIST', summary: 'List boxes for a thread' }),
|
|
45
|
-
(0, common_1.Get)(),
|
|
46
|
-
__param(0, (0, common_1.Param)('threadId')),
|
|
47
|
-
__param(1, (0, workspace_decorator_js_1.Workspace)()),
|
|
48
|
-
__metadata("design:type", Function),
|
|
49
|
-
__metadata("design:paramtypes", [String, Object]),
|
|
50
|
-
__metadata("design:returntype", void 0)
|
|
51
|
-
], BoxController.prototype, "listBoxes", null);
|
|
52
|
-
__decorate([
|
|
53
|
-
(0, swagger_1.ApiOperation)({ operationId: 'BOX.GET', summary: 'Get box detail with previews' }),
|
|
54
|
-
(0, common_1.Get)(':boxId'),
|
|
55
|
-
__param(0, (0, common_1.Param)('threadId')),
|
|
56
|
-
__param(1, (0, common_1.Param)('boxId')),
|
|
57
|
-
__param(2, (0, workspace_decorator_js_1.Workspace)()),
|
|
58
|
-
__metadata("design:type", Function),
|
|
59
|
-
__metadata("design:paramtypes", [String, String, Object]),
|
|
60
|
-
__metadata("design:returntype", void 0)
|
|
61
|
-
], BoxController.prototype, "getBox", null);
|
|
62
|
-
__decorate([
|
|
63
|
-
(0, swagger_1.ApiOperation)({ operationId: 'BOX.CREATE', summary: 'Create an immutable box' }),
|
|
64
|
-
(0, common_1.Post)(),
|
|
65
|
-
(0, common_1.HttpCode)(201),
|
|
66
|
-
__param(0, (0, common_1.Param)('threadId')),
|
|
67
|
-
__param(1, (0, common_1.Body)()),
|
|
68
|
-
__param(2, (0, workspace_decorator_js_1.Workspace)()),
|
|
69
|
-
__metadata("design:type", Function),
|
|
70
|
-
__metadata("design:paramtypes", [String, create_box_dto_js_1.CreateBoxDto, Object]),
|
|
71
|
-
__metadata("design:returntype", void 0)
|
|
72
|
-
], BoxController.prototype, "createBox", null);
|
|
73
|
-
exports.BoxController = BoxController = __decorate([
|
|
74
|
-
(0, swagger_1.ApiTags)('boxes'),
|
|
75
|
-
(0, common_1.Controller)('threads/:threadId/boxes'),
|
|
76
|
-
__metadata("design:paramtypes", [box_service_js_1.BoxService])
|
|
77
|
-
], BoxController);
|
|
@@ -1,21 +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.BoxModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const box_controller_js_1 = require("./box.controller.js");
|
|
12
|
-
const box_service_js_1 = require("./box.service.js");
|
|
13
|
-
let BoxModule = class BoxModule {
|
|
14
|
-
};
|
|
15
|
-
exports.BoxModule = BoxModule;
|
|
16
|
-
exports.BoxModule = BoxModule = __decorate([
|
|
17
|
-
(0, common_1.Module)({
|
|
18
|
-
controllers: [box_controller_js_1.BoxController],
|
|
19
|
-
providers: [box_service_js_1.BoxService],
|
|
20
|
-
})
|
|
21
|
-
], BoxModule);
|
|
@@ -1,97 +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.BoxService = void 0;
|
|
13
|
-
const common_1 = require("@nestjs/common");
|
|
14
|
-
const box_repository_js_1 = require("../../repository/box.repository.js");
|
|
15
|
-
const sdk_1 = require("@crewx/sdk");
|
|
16
|
-
let BoxService = class BoxService {
|
|
17
|
-
boxRepo;
|
|
18
|
-
constructor(boxRepo) {
|
|
19
|
-
this.boxRepo = boxRepo;
|
|
20
|
-
}
|
|
21
|
-
// BOX.LIST: List boxes for a thread (seq ASC)
|
|
22
|
-
listBoxes(threadId, workspaceId) {
|
|
23
|
-
const sdk = this.createSdkService(workspaceId);
|
|
24
|
-
return this.wrapSdkCall(() => sdk.listBoxes(threadId));
|
|
25
|
-
}
|
|
26
|
-
// BOX.GET: Get single box detail with previews
|
|
27
|
-
getBox(threadId, boxId, workspaceId) {
|
|
28
|
-
const sdk = this.createSdkService(workspaceId);
|
|
29
|
-
const result = this.wrapSdkCall(() => sdk.getBox(threadId, boxId));
|
|
30
|
-
if (!result) {
|
|
31
|
-
throw new common_1.NotFoundException(`Box not found: ${boxId} in thread: ${threadId}`);
|
|
32
|
-
}
|
|
33
|
-
return result;
|
|
34
|
-
}
|
|
35
|
-
// BOX.CREATE: Insert an immutable box (no UPDATE allowed)
|
|
36
|
-
createBox(threadId, dto, workspaceId) {
|
|
37
|
-
const sdk = this.createSdkService(workspaceId);
|
|
38
|
-
return this.wrapSdkCall(() => sdk.createBox(threadId, {
|
|
39
|
-
seq: dto.seq,
|
|
40
|
-
firstTaskId: dto.firstTaskId,
|
|
41
|
-
midTaskId: dto.midTaskId,
|
|
42
|
-
lastTaskId: dto.lastTaskId,
|
|
43
|
-
taskCount: dto.taskCount,
|
|
44
|
-
summary: dto.summary ?? null,
|
|
45
|
-
sourceTokens: dto.sourceTokens,
|
|
46
|
-
summaryTokens: dto.summaryTokens ?? null,
|
|
47
|
-
}));
|
|
48
|
-
}
|
|
49
|
-
// --- Private helpers ---
|
|
50
|
-
/** Convert SDK validation errors to NestJS BadRequestException */
|
|
51
|
-
wrapSdkCall(fn) {
|
|
52
|
-
try {
|
|
53
|
-
return fn();
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
if (error instanceof Error && error.message.startsWith('Invalid ID format:')) {
|
|
57
|
-
throw new common_1.BadRequestException(error.message);
|
|
58
|
-
}
|
|
59
|
-
throw error;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/** Create SDK service with workspace-scoped storage adapter */
|
|
63
|
-
createSdkService(workspaceId) {
|
|
64
|
-
return new sdk_1.SdkBoxService(this.createStorageAdapter(workspaceId));
|
|
65
|
-
}
|
|
66
|
-
/** Adapt BoxRepository to IBoxStorage, handling workspace scope internally */
|
|
67
|
-
createStorageAdapter(workspaceId) {
|
|
68
|
-
const repo = this.boxRepo;
|
|
69
|
-
return {
|
|
70
|
-
listBoxes(threadId) {
|
|
71
|
-
return repo.findBoxesByThread(threadId, workspaceId);
|
|
72
|
-
},
|
|
73
|
-
findBox(threadId, boxId) {
|
|
74
|
-
try {
|
|
75
|
-
return repo.findBoxById(threadId, boxId, workspaceId);
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
if (error instanceof common_1.NotFoundException)
|
|
79
|
-
return null;
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
insertBox(threadId, data) {
|
|
84
|
-
return repo.insertBox(threadId, data, workspaceId);
|
|
85
|
-
},
|
|
86
|
-
getTaskPreview(taskId, maxLen) {
|
|
87
|
-
const dbPath = repo.resolveDbPath();
|
|
88
|
-
return repo.getTaskPromptPreview(dbPath, taskId, maxLen, workspaceId);
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
exports.BoxService = BoxService;
|
|
94
|
-
exports.BoxService = BoxService = __decorate([
|
|
95
|
-
(0, common_1.Injectable)(),
|
|
96
|
-
__metadata("design:paramtypes", [box_repository_js_1.BoxRepository])
|
|
97
|
-
], BoxService);
|
|
@@ -1,74 +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.CreateBoxDto = void 0;
|
|
13
|
-
const swagger_1 = require("@nestjs/swagger");
|
|
14
|
-
const class_validator_1 = require("class-validator");
|
|
15
|
-
// BOX.CREATE: Body for creating an immutable box
|
|
16
|
-
class CreateBoxDto {
|
|
17
|
-
firstTaskId;
|
|
18
|
-
midTaskId;
|
|
19
|
-
lastTaskId;
|
|
20
|
-
seq;
|
|
21
|
-
taskCount;
|
|
22
|
-
sourceTokens;
|
|
23
|
-
summaryTokens;
|
|
24
|
-
summary;
|
|
25
|
-
}
|
|
26
|
-
exports.CreateBoxDto = CreateBoxDto;
|
|
27
|
-
__decorate([
|
|
28
|
-
(0, swagger_1.ApiProperty)({ description: 'First task ID in the box range' }),
|
|
29
|
-
(0, class_validator_1.IsString)(),
|
|
30
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
31
|
-
__metadata("design:type", String)
|
|
32
|
-
], CreateBoxDto.prototype, "firstTaskId", void 0);
|
|
33
|
-
__decorate([
|
|
34
|
-
(0, swagger_1.ApiProperty)({ description: 'Middle task ID for preview (Math.floor(taskCount/2))' }),
|
|
35
|
-
(0, class_validator_1.IsString)(),
|
|
36
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
37
|
-
__metadata("design:type", String)
|
|
38
|
-
], CreateBoxDto.prototype, "midTaskId", void 0);
|
|
39
|
-
__decorate([
|
|
40
|
-
(0, swagger_1.ApiProperty)({ description: 'Last task ID in the box range' }),
|
|
41
|
-
(0, class_validator_1.IsString)(),
|
|
42
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
43
|
-
__metadata("design:type", String)
|
|
44
|
-
], CreateBoxDto.prototype, "lastTaskId", void 0);
|
|
45
|
-
__decorate([
|
|
46
|
-
(0, swagger_1.ApiProperty)({ description: 'Sequence number within the thread (1-based)' }),
|
|
47
|
-
(0, class_validator_1.IsNumber)(),
|
|
48
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
49
|
-
__metadata("design:type", Number)
|
|
50
|
-
], CreateBoxDto.prototype, "seq", void 0);
|
|
51
|
-
__decorate([
|
|
52
|
-
(0, swagger_1.ApiProperty)({ description: 'Number of tasks in the box' }),
|
|
53
|
-
(0, class_validator_1.IsNumber)(),
|
|
54
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
55
|
-
__metadata("design:type", Number)
|
|
56
|
-
], CreateBoxDto.prototype, "taskCount", void 0);
|
|
57
|
-
__decorate([
|
|
58
|
-
(0, swagger_1.ApiProperty)({ description: 'Sum of rendering tokens for all tasks' }),
|
|
59
|
-
(0, class_validator_1.IsNumber)(),
|
|
60
|
-
(0, class_validator_1.IsNotEmpty)(),
|
|
61
|
-
__metadata("design:type", Number)
|
|
62
|
-
], CreateBoxDto.prototype, "sourceTokens", void 0);
|
|
63
|
-
__decorate([
|
|
64
|
-
(0, swagger_1.ApiPropertyOptional)({ description: 'Summary tokens (null if no summary)' }),
|
|
65
|
-
(0, class_validator_1.IsOptional)(),
|
|
66
|
-
(0, class_validator_1.IsNumber)(),
|
|
67
|
-
__metadata("design:type", Object)
|
|
68
|
-
], CreateBoxDto.prototype, "summaryTokens", void 0);
|
|
69
|
-
__decorate([
|
|
70
|
-
(0, swagger_1.ApiPropertyOptional)({ description: 'AI-generated summary (null in Phase 1)' }),
|
|
71
|
-
(0, class_validator_1.IsOptional)(),
|
|
72
|
-
(0, class_validator_1.IsString)(),
|
|
73
|
-
__metadata("design:type", Object)
|
|
74
|
-
], CreateBoxDto.prototype, "summary", void 0);
|