crewx 0.8.5-rc.0 → 0.8.5
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/bin/crewx-ui.js +0 -0
- package/dist-server/adapters/adapter.module.js +35 -0
- package/dist-server/adapters/adapter.service.js +79 -0
- package/dist-server/adapters/http-router.service.js +91 -0
- package/dist-server/app.module.js +102 -0
- package/dist-server/bootstrap/crewx-server.js +79 -0
- package/dist-server/common/cors.js +15 -0
- package/dist-server/common/decorators/project.decorator.js +21 -0
- package/dist-server/common/decorators/workspace.decorator.js +24 -0
- package/dist-server/common/interceptor/api-id-header.interceptor.js +53 -0
- package/dist-server/common/interceptor/http-logging.interceptor.js +124 -0
- package/dist-server/common/limits/defaults.js +13 -0
- package/dist-server/common/limits/limits-provider.js +6 -0
- package/dist-server/common/limits/limits.controller.js +38 -0
- package/dist-server/common/limits/limits.module.js +24 -0
- package/dist-server/common/limits/local-limits.provider.js +27 -0
- package/dist-server/common/middleware/workspace.middleware.js +210 -0
- package/dist-server/common/repository.exception-filter.js +48 -0
- package/dist-server/common/workspace-context.store.js +25 -0
- package/dist-server/domain/agent/agent.controller.js +96 -0
- package/dist-server/domain/agent/agent.module.js +26 -0
- package/dist-server/domain/agent/agent.service.js +317 -0
- package/dist-server/domain/agent/agent.types.js +3 -0
- package/dist-server/domain/agent/dto/create-agent.dto.js +80 -0
- package/dist-server/domain/agent/dto/preview-prompt.dto.js +77 -0
- package/dist-server/domain/agent/dto/provider-meta.dto.js +2 -0
- package/dist-server/domain/agent/dto/update-agent.dto.js +92 -0
- package/dist-server/domain/agent/provider.controller.js +38 -0
- package/dist-server/domain/agent/template-processor.service.js +71 -0
- package/dist-server/domain/auth/auth.constants.js +4 -0
- package/dist-server/domain/auth/auth.controller.js +120 -0
- package/dist-server/domain/auth/auth.module.js +47 -0
- package/dist-server/domain/auth/decorators/public.decorator.js +7 -0
- package/dist-server/domain/auth/guards/base-auth.guard.js +62 -0
- package/dist-server/domain/auth/utils/ip.utils.js +31 -0
- package/dist-server/domain/box/box.controller.js +77 -0
- package/dist-server/domain/box/box.module.js +21 -0
- package/dist-server/domain/box/box.service.js +97 -0
- package/dist-server/domain/box/dto/create-box.dto.js +74 -0
- package/dist-server/domain/cli/cli.controller.js +88 -0
- package/dist-server/domain/cli/cli.module.js +21 -0
- package/dist-server/domain/cli/cli.service.js +435 -0
- package/dist-server/domain/cli/dto/update-cli.dto.js +31 -0
- package/dist-server/domain/doc/doc.controller.js +95 -0
- package/dist-server/domain/doc/doc.module.js +21 -0
- package/dist-server/domain/doc/doc.service.js +368 -0
- package/dist-server/domain/doc/dto/doc.dto.js +64 -0
- package/dist-server/domain/document/document.controller.js +57 -0
- package/dist-server/domain/document/document.module.js +22 -0
- package/dist-server/domain/document/document.service.js +271 -0
- package/dist-server/domain/document/dto/register-document.dto.js +24 -0
- package/dist-server/domain/fs/dto/mkdir-request.dto.js +47 -0
- package/dist-server/domain/fs/dto/mkdir-response.dto.js +2 -0
- package/dist-server/domain/fs/dto/quick-access.dto.js +2 -0
- package/dist-server/domain/fs/dto/tree-node.dto.js +2 -0
- package/dist-server/domain/fs/dto/tree-query.dto.js +35 -0
- package/dist-server/domain/fs/fs.controller.js +63 -0
- package/dist-server/domain/fs/fs.module.js +22 -0
- package/dist-server/domain/fs/fs.service.js +303 -0
- package/dist-server/domain/git/git.module.js +20 -0
- package/dist-server/domain/git/git.service.js +222 -0
- package/dist-server/domain/health/health.controller.js +57 -0
- package/dist-server/domain/health/health.module.js +19 -0
- package/dist-server/domain/knowledge/dto/graph-knowledge.dto.js +27 -0
- package/dist-server/domain/knowledge/dto/knowledge.dto.js +71 -0
- package/dist-server/domain/knowledge/knowledge.controller.js +122 -0
- package/dist-server/domain/knowledge/knowledge.module.js +21 -0
- package/dist-server/domain/knowledge/knowledge.service.js +538 -0
- package/dist-server/domain/mcp/browser-session.store.js +247 -0
- package/dist-server/domain/mcp/crewx-tool.factory.js +117 -0
- package/dist-server/domain/mcp/mcp-auth.guard.js +61 -0
- package/dist-server/domain/mcp/mcp.constants.js +4 -0
- package/dist-server/domain/mcp/mcp.controller.js +125 -0
- package/dist-server/domain/mcp/mcp.dto.js +12 -0
- package/dist-server/domain/mcp/mcp.module.js +49 -0
- package/dist-server/domain/mcp/mcp.service.js +682 -0
- package/dist-server/domain/mcp/tool-router.service.js +120 -0
- package/dist-server/domain/message/dto/list-messages.dto.js +57 -0
- package/dist-server/domain/message/dto/send-message.dto.js +45 -0
- package/dist-server/domain/message/message.controller.js +73 -0
- package/dist-server/domain/message/message.module.js +25 -0
- package/dist-server/domain/message/message.service.js +158 -0
- package/dist-server/domain/onboarding/onboarding.controller.js +97 -0
- package/dist-server/domain/onboarding/onboarding.module.js +23 -0
- package/dist-server/domain/onboarding/onboarding.service.js +106 -0
- package/dist-server/domain/onboarding/onboarding.types.js +2 -0
- package/dist-server/domain/onboarding/presets/custom.js +10 -0
- package/dist-server/domain/onboarding/presets/dev-team.js +41 -0
- package/dist-server/domain/onboarding/presets/index.js +15 -0
- package/dist-server/domain/onboarding/presets/marketing-team.js +29 -0
- package/dist-server/domain/onboarding/presets/planning-team.js +29 -0
- package/dist-server/domain/onboarding/presets/solo.js +17 -0
- package/dist-server/domain/project/dto/create-project.dto.js +46 -0
- package/dist-server/domain/project/dto/update-project.dto.js +60 -0
- package/dist-server/domain/project/project.controller.js +129 -0
- package/dist-server/domain/project/project.module.js +22 -0
- package/dist-server/domain/project/project.service.js +173 -0
- package/dist-server/domain/skill/dto/add-registry.dto.js +23 -0
- package/dist-server/domain/skill/dto/install-skill.dto.js +30 -0
- package/dist-server/domain/skill/skill.controller.js +136 -0
- package/dist-server/domain/skill/skill.module.js +22 -0
- package/dist-server/domain/skill/skill.service.js +632 -0
- package/dist-server/domain/task/dto/all-tasks.dto.js +55 -0
- package/dist-server/domain/task/dto/list-tasks.dto.js +69 -0
- package/dist-server/domain/task/dto/search-tasks.dto.js +66 -0
- package/dist-server/domain/task/dto/send-message.dto.js +31 -0
- package/dist-server/domain/task/dto/task-status.dto.js +34 -0
- package/dist-server/domain/task/dto/workspace-usage.dto.js +38 -0
- package/dist-server/domain/task/task.constants.js +5 -0
- package/dist-server/domain/task/task.controller.js +169 -0
- package/dist-server/domain/task/task.module.js +23 -0
- package/dist-server/domain/task/task.service.js +722 -0
- package/dist-server/domain/thread/dto/build-context.dto.js +42 -0
- package/dist-server/domain/thread/dto/list-messages.dto.js +49 -0
- package/dist-server/domain/thread/dto/list-threads.dto.js +70 -0
- package/dist-server/domain/thread/dto/search-threads.dto.js +13 -0
- package/dist-server/domain/thread/dto/update-thread.dto.js +23 -0
- package/dist-server/domain/thread/thread.controller.js +132 -0
- package/dist-server/domain/thread/thread.module.js +23 -0
- package/dist-server/domain/thread/thread.service.js +399 -0
- package/dist-server/domain/usage/usage.controller.js +118 -0
- package/dist-server/domain/usage/usage.module.js +21 -0
- package/dist-server/domain/usage/usage.service.js +343 -0
- package/dist-server/domain/usage/usage.types.js +4 -0
- package/dist-server/domain/wbs/wbs.controller.js +51 -0
- package/dist-server/domain/wbs/wbs.module.js +21 -0
- package/dist-server/domain/wbs/wbs.service.js +94 -0
- package/dist-server/domain/workflow/workflow.controller.js +53 -0
- package/dist-server/domain/workflow/workflow.module.js +21 -0
- package/dist-server/domain/workflow/workflow.service.js +209 -0
- package/dist-server/domain/workspace/dto/create-workspace.dto.js +45 -0
- package/dist-server/domain/workspace/dto/switch-workspace.dto.js +32 -0
- package/dist-server/domain/workspace/dto/workspace-info.dto.js +2 -0
- package/dist-server/domain/workspace/workspace.controller.js +98 -0
- package/dist-server/domain/workspace/workspace.module.js +22 -0
- package/dist-server/domain/workspace/workspace.service.js +216 -0
- package/dist-server/main.js +175 -0
- package/dist-server/modules/crewx-pool.service.js +70 -0
- package/dist-server/modules/crewx.module.js +47 -0
- package/dist-server/package.json +3 -0
- package/dist-server/repository/base-sqlite.repository.js +18 -0
- package/dist-server/repository/box.repository.js +99 -0
- package/dist-server/repository/message.repository.js +22 -0
- package/dist-server/repository/project.repository.js +48 -0
- package/dist-server/repository/repository.module.js +34 -0
- package/dist-server/repository/request-log.repository.js +96 -0
- package/dist-server/repository/task.repository.js +102 -0
- package/dist-server/repository/thread.repository.js +143 -0
- package/dist-server/shared/crewx-home.js +58 -0
- package/dist-server/shared/crewx-state.js +66 -0
- package/dist-server/test-utils/compat-database.js +30 -0
- package/dist-server/utils/tokenizer.js +8 -0
- package/package.json +44 -45
- package/packages/cli/package.json +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
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.LimitsController = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
15
|
+
const limits_provider_js_1 = require("./limits-provider.js");
|
|
16
|
+
let LimitsController = class LimitsController {
|
|
17
|
+
limits;
|
|
18
|
+
constructor(limits) {
|
|
19
|
+
this.limits = limits;
|
|
20
|
+
}
|
|
21
|
+
async get() {
|
|
22
|
+
const data = await this.limits.resolve();
|
|
23
|
+
return { success: true, data };
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.LimitsController = LimitsController;
|
|
27
|
+
__decorate([
|
|
28
|
+
(0, swagger_1.ApiOperation)({ operationId: 'LMT.GET', summary: 'Get current plan limits' }),
|
|
29
|
+
(0, common_1.Get)(),
|
|
30
|
+
__metadata("design:type", Function),
|
|
31
|
+
__metadata("design:paramtypes", []),
|
|
32
|
+
__metadata("design:returntype", Promise)
|
|
33
|
+
], LimitsController.prototype, "get", null);
|
|
34
|
+
exports.LimitsController = LimitsController = __decorate([
|
|
35
|
+
(0, swagger_1.ApiTags)('limits'),
|
|
36
|
+
(0, common_1.Controller)('ws/:slug/limits'),
|
|
37
|
+
__metadata("design:paramtypes", [limits_provider_js_1.LimitsProvider])
|
|
38
|
+
], LimitsController);
|
|
@@ -0,0 +1,24 @@
|
|
|
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.LimitsModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const limits_provider_js_1 = require("./limits-provider.js");
|
|
12
|
+
const local_limits_provider_js_1 = require("./local-limits.provider.js");
|
|
13
|
+
const limits_controller_js_1 = require("./limits.controller.js");
|
|
14
|
+
let LimitsModule = class LimitsModule {
|
|
15
|
+
};
|
|
16
|
+
exports.LimitsModule = LimitsModule;
|
|
17
|
+
exports.LimitsModule = LimitsModule = __decorate([
|
|
18
|
+
(0, common_1.Global)(),
|
|
19
|
+
(0, common_1.Module)({
|
|
20
|
+
controllers: [limits_controller_js_1.LimitsController],
|
|
21
|
+
providers: [{ provide: limits_provider_js_1.LimitsProvider, useClass: local_limits_provider_js_1.LocalLimitsProvider }],
|
|
22
|
+
exports: [limits_provider_js_1.LimitsProvider],
|
|
23
|
+
})
|
|
24
|
+
], LimitsModule);
|
|
@@ -0,0 +1,27 @@
|
|
|
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.LocalLimitsProvider = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const limits_provider_js_1 = require("./limits-provider.js");
|
|
12
|
+
const defaults_js_1 = require("./defaults.js");
|
|
13
|
+
let LocalLimitsProvider = class LocalLimitsProvider extends limits_provider_js_1.LimitsProvider {
|
|
14
|
+
resolve() {
|
|
15
|
+
// Dev mode: unlimited for local development convenience.
|
|
16
|
+
// Deployment entry points (bin/crewx.js, bin/crewx-ui.js) force NODE_ENV=production
|
|
17
|
+
// on spawned child processes, so end users cannot reach this branch.
|
|
18
|
+
if (process.env.NODE_ENV === 'development') {
|
|
19
|
+
return defaults_js_1.UNLIMITED_LIMITS;
|
|
20
|
+
}
|
|
21
|
+
return defaults_js_1.FREE_TIER_LIMITS;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
exports.LocalLimitsProvider = LocalLimitsProvider;
|
|
25
|
+
exports.LocalLimitsProvider = LocalLimitsProvider = __decorate([
|
|
26
|
+
(0, common_1.Injectable)()
|
|
27
|
+
], LocalLimitsProvider);
|
|
@@ -0,0 +1,210 @@
|
|
|
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 __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
45
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.WorkspaceMiddleware = void 0;
|
|
49
|
+
const common_1 = require("@nestjs/common");
|
|
50
|
+
const sdk_1 = require("@crewx/sdk");
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const project_repository_js_1 = require("../../repository/project.repository.js");
|
|
53
|
+
const workspace_context_store_js_1 = require("../workspace-context.store.js");
|
|
54
|
+
/** 64-character lowercase hex string (SHA-256 hash). */
|
|
55
|
+
const HEX_64_RE = /^[0-9a-f]{64}$/;
|
|
56
|
+
/**
|
|
57
|
+
* Workspace-scoped middleware that resolves the current workspace from the
|
|
58
|
+
* URL path variable and attaches a `WorkspaceContext` to the request.
|
|
59
|
+
*
|
|
60
|
+
* Applied only to routes matching `/api/v1/ws/:slug/*`.
|
|
61
|
+
*
|
|
62
|
+
* Resolution order:
|
|
63
|
+
* 1. `:slug` URL path variable → DB lookup by slug
|
|
64
|
+
* 2. `X-CrewX-Workspace` header fallback (deprecated, transition period only)
|
|
65
|
+
*
|
|
66
|
+
* Returns 404 when the slug is present but not found in the DB.
|
|
67
|
+
*/
|
|
68
|
+
let WorkspaceMiddleware = class WorkspaceMiddleware {
|
|
69
|
+
projectRepo;
|
|
70
|
+
defaultWorkspace;
|
|
71
|
+
constructor(projectRepo) {
|
|
72
|
+
this.projectRepo = projectRepo;
|
|
73
|
+
const base = process.env.CREWX_WORKSPACE || process.cwd();
|
|
74
|
+
this.defaultWorkspace = this.resolveWorkspace(base);
|
|
75
|
+
}
|
|
76
|
+
use(req, res, next) {
|
|
77
|
+
// Primary: extract slug from URL path variable (/ws/:slug/...)
|
|
78
|
+
const slug = req.params?.slug ?? this.extractSlugFromPath(req.path);
|
|
79
|
+
if (slug) {
|
|
80
|
+
const workspace = this.resolveFromSlugStrict(slug);
|
|
81
|
+
if (!workspace) {
|
|
82
|
+
res.status(404).json({ statusCode: 404, message: `Workspace '${slug}' not found`, error: 'Not Found' });
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
req.workspace = workspace;
|
|
86
|
+
workspace_context_store_js_1.workspaceStore.run(req.workspace, () => next());
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Transition fallback: X-CrewX-Workspace header (deprecated)
|
|
90
|
+
const workspaceHeader = this.extractHeader(req, 'x-crewx-workspace');
|
|
91
|
+
if (workspaceHeader) {
|
|
92
|
+
console.warn(`[DEPRECATED] X-CrewX-Workspace header detected on ${req.path} — migrate to /api/v1/ws/:slug/ URL pattern`);
|
|
93
|
+
req.workspace = this.resolveWorkspace(workspaceHeader);
|
|
94
|
+
workspace_context_store_js_1.workspaceStore.run(req.workspace, () => next());
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
req.workspace = this.defaultWorkspace;
|
|
98
|
+
workspace_context_store_js_1.workspaceStore.run(req.workspace, () => next());
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Extracts the workspace slug from a URL path of the form `/...ws/<slug>/...`.
|
|
102
|
+
* Used as fallback when req.params.slug is not populated by the router.
|
|
103
|
+
*/
|
|
104
|
+
extractSlugFromPath(urlPath) {
|
|
105
|
+
const match = urlPath.match(/\/ws\/([^/?]+)/);
|
|
106
|
+
return match?.[1] || undefined;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolves workspace from slug via DB lookup.
|
|
110
|
+
* Returns null when slug is not found (triggers 404).
|
|
111
|
+
* Falls back to path-based resolution when DB is unavailable.
|
|
112
|
+
*/
|
|
113
|
+
resolveFromSlugStrict(slug) {
|
|
114
|
+
if (this.projectRepo) {
|
|
115
|
+
try {
|
|
116
|
+
const row = this.projectRepo.findBySlug(slug);
|
|
117
|
+
if (row) {
|
|
118
|
+
const wsPath = row.workspace_path ? (0, sdk_1.normalizeWorkspacePath)(row.workspace_path) : '';
|
|
119
|
+
return {
|
|
120
|
+
id: row.id,
|
|
121
|
+
path: wsPath,
|
|
122
|
+
name: wsPath ? path.basename(wsPath) : row.name,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// DB available, slug not found → 404
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// DB error — fall through to path-based fallback
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// No DB: treat slug as a relative path (legacy / test environment)
|
|
133
|
+
return this.resolveFromPath(slug);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Resolves workspace from multi-format input (used for header fallback).
|
|
137
|
+
* - 64-char hex → hash lookup
|
|
138
|
+
* - /path → filesystem path
|
|
139
|
+
* - other → slug (with DB fallback)
|
|
140
|
+
*/
|
|
141
|
+
resolveWorkspace(raw) {
|
|
142
|
+
if (HEX_64_RE.test(raw)) {
|
|
143
|
+
return this.resolveFromHash(raw);
|
|
144
|
+
}
|
|
145
|
+
if (raw.startsWith('/')) {
|
|
146
|
+
return this.resolveFromPath(raw);
|
|
147
|
+
}
|
|
148
|
+
// On Windows, detect drive-letter paths (e.g. C:\...)
|
|
149
|
+
if (/^[A-Za-z]:/.test(raw)) {
|
|
150
|
+
return this.resolveFromPath(raw);
|
|
151
|
+
}
|
|
152
|
+
return this.resolveFromSlugLenient(raw);
|
|
153
|
+
}
|
|
154
|
+
resolveFromPath(rawPath) {
|
|
155
|
+
const normalized = (0, sdk_1.normalizeWorkspacePath)(rawPath);
|
|
156
|
+
return {
|
|
157
|
+
id: (0, sdk_1.hashWorkspaceId)(rawPath),
|
|
158
|
+
path: normalized,
|
|
159
|
+
name: path.basename(normalized),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
resolveFromHash(hash) {
|
|
163
|
+
if (this.projectRepo) {
|
|
164
|
+
try {
|
|
165
|
+
const row = this.projectRepo.findById(hash);
|
|
166
|
+
if (row?.workspace_path) {
|
|
167
|
+
const normalized = (0, sdk_1.normalizeWorkspacePath)(row.workspace_path);
|
|
168
|
+
return { id: hash, path: normalized, name: path.basename(normalized) };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// DB not available — fall through to fallback
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Fallback: hash is valid but path is unknown
|
|
176
|
+
return { id: hash, path: '', name: '' };
|
|
177
|
+
}
|
|
178
|
+
/** Lenient slug resolution — falls back to path if not in DB (used for header values). */
|
|
179
|
+
resolveFromSlugLenient(slug) {
|
|
180
|
+
if (this.projectRepo) {
|
|
181
|
+
try {
|
|
182
|
+
const row = this.projectRepo.findBySlug(slug);
|
|
183
|
+
if (row) {
|
|
184
|
+
const wsPath = row.workspace_path ? (0, sdk_1.normalizeWorkspacePath)(row.workspace_path) : '';
|
|
185
|
+
return {
|
|
186
|
+
id: row.id,
|
|
187
|
+
path: wsPath,
|
|
188
|
+
name: wsPath ? path.basename(wsPath) : row.name,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// DB not available
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return this.resolveFromPath(slug);
|
|
197
|
+
}
|
|
198
|
+
extractHeader(req, name) {
|
|
199
|
+
const value = req.headers[name];
|
|
200
|
+
if (!value)
|
|
201
|
+
return undefined;
|
|
202
|
+
return Array.isArray(value) ? value[0] : value;
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
exports.WorkspaceMiddleware = WorkspaceMiddleware;
|
|
206
|
+
exports.WorkspaceMiddleware = WorkspaceMiddleware = __decorate([
|
|
207
|
+
(0, common_1.Injectable)(),
|
|
208
|
+
__param(0, (0, common_1.Optional)()),
|
|
209
|
+
__metadata("design:paramtypes", [project_repository_js_1.ProjectRepository])
|
|
210
|
+
], WorkspaceMiddleware);
|
|
@@ -0,0 +1,48 @@
|
|
|
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.RepositoryExceptionFilter = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const repository_1 = require("@crewx/sdk/repository");
|
|
12
|
+
let RepositoryExceptionFilter = class RepositoryExceptionFilter {
|
|
13
|
+
catch(exception, host) {
|
|
14
|
+
const ctx = host.switchToHttp();
|
|
15
|
+
const response = ctx.getResponse();
|
|
16
|
+
const { statusCode, message } = this.mapError(exception);
|
|
17
|
+
response.status(statusCode).json({
|
|
18
|
+
statusCode,
|
|
19
|
+
message,
|
|
20
|
+
error: this.codeToHttpError(exception.code),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
mapError(exception) {
|
|
24
|
+
switch (exception.code) {
|
|
25
|
+
case 'VALIDATION':
|
|
26
|
+
return { statusCode: 400, message: exception.message };
|
|
27
|
+
case 'NOT_FOUND':
|
|
28
|
+
return { statusCode: 404, message: exception.message };
|
|
29
|
+
case 'CONFLICT':
|
|
30
|
+
return { statusCode: 409, message: exception.message };
|
|
31
|
+
case 'DB_ERROR':
|
|
32
|
+
// Never expose SQLite internals (SQLITE_CONSTRAINT, no such column, etc.)
|
|
33
|
+
return { statusCode: 500, message: 'Internal server error' };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
codeToHttpError(code) {
|
|
37
|
+
switch (code) {
|
|
38
|
+
case 'VALIDATION': return 'Bad Request';
|
|
39
|
+
case 'NOT_FOUND': return 'Not Found';
|
|
40
|
+
case 'CONFLICT': return 'Conflict';
|
|
41
|
+
default: return 'Internal Server Error';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
exports.RepositoryExceptionFilter = RepositoryExceptionFilter;
|
|
46
|
+
exports.RepositoryExceptionFilter = RepositoryExceptionFilter = __decorate([
|
|
47
|
+
(0, common_1.Catch)(repository_1.RepositoryError)
|
|
48
|
+
], RepositoryExceptionFilter);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.workspaceStore = void 0;
|
|
4
|
+
exports.getWorkspacePath = getWorkspacePath;
|
|
5
|
+
exports.getWorkspaceId = getWorkspaceId;
|
|
6
|
+
const async_hooks_1 = require("async_hooks");
|
|
7
|
+
/**
|
|
8
|
+
* Process-wide AsyncLocalStorage instance that holds the current request's
|
|
9
|
+
* WorkspaceContext. WorkspaceMiddleware calls `workspaceStore.run()` so
|
|
10
|
+
* every downstream service can read the workspace without constructor injection.
|
|
11
|
+
*/
|
|
12
|
+
exports.workspaceStore = new async_hooks_1.AsyncLocalStorage();
|
|
13
|
+
/**
|
|
14
|
+
* Return the workspace path for the current request.
|
|
15
|
+
* Fallback order: AsyncLocalStorage store -> CREWX_WORKSPACE env -> process.cwd()
|
|
16
|
+
*/
|
|
17
|
+
function getWorkspacePath() {
|
|
18
|
+
return exports.workspaceStore.getStore()?.path || process.env.CREWX_WORKSPACE || process.cwd();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Return the workspace id for the current request, or empty string if unavailable.
|
|
22
|
+
*/
|
|
23
|
+
function getWorkspaceId() {
|
|
24
|
+
return exports.workspaceStore.getStore()?.id ?? '';
|
|
25
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
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.AgentController = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
+
const agent_service_js_1 = require("./agent.service.js");
|
|
19
|
+
const create_agent_dto_js_1 = require("./dto/create-agent.dto.js");
|
|
20
|
+
const update_agent_dto_js_1 = require("./dto/update-agent.dto.js");
|
|
21
|
+
const preview_prompt_dto_js_1 = require("./dto/preview-prompt.dto.js");
|
|
22
|
+
let AgentController = class AgentController {
|
|
23
|
+
agentService;
|
|
24
|
+
constructor(agentService) {
|
|
25
|
+
this.agentService = agentService;
|
|
26
|
+
}
|
|
27
|
+
// AGT.LIST: List all agents
|
|
28
|
+
getAgents() {
|
|
29
|
+
const data = this.agentService.getAgents();
|
|
30
|
+
return { success: true, data };
|
|
31
|
+
}
|
|
32
|
+
// POST /api/v1/agents/prompt/preview — render HBS template with document context
|
|
33
|
+
async previewPrompt(dto) {
|
|
34
|
+
const data = await this.agentService.previewPrompt(dto);
|
|
35
|
+
return { success: true, data };
|
|
36
|
+
}
|
|
37
|
+
// POST /api/v1/agents — create agent
|
|
38
|
+
createAgent(dto) {
|
|
39
|
+
const data = this.agentService.createAgent(dto);
|
|
40
|
+
return { success: true, data };
|
|
41
|
+
}
|
|
42
|
+
// PUT /api/v1/agents/:id — update agent
|
|
43
|
+
updateAgent(id, dto) {
|
|
44
|
+
const data = this.agentService.updateAgent(id, dto);
|
|
45
|
+
return { success: true, data };
|
|
46
|
+
}
|
|
47
|
+
// DELETE /api/v1/agents/:id — delete agent
|
|
48
|
+
deleteAgent(id) {
|
|
49
|
+
this.agentService.deleteAgent(id);
|
|
50
|
+
return { success: true };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
exports.AgentController = AgentController;
|
|
54
|
+
__decorate([
|
|
55
|
+
(0, swagger_1.ApiOperation)({ operationId: 'AGT.LIST', summary: 'List all agents' }),
|
|
56
|
+
(0, common_1.Get)(),
|
|
57
|
+
__metadata("design:type", Function),
|
|
58
|
+
__metadata("design:paramtypes", []),
|
|
59
|
+
__metadata("design:returntype", void 0)
|
|
60
|
+
], AgentController.prototype, "getAgents", null);
|
|
61
|
+
__decorate([
|
|
62
|
+
(0, swagger_1.ApiOperation)({ operationId: 'AGT.PROMPT.PREVIEW', summary: 'Preview rendered prompt template' }),
|
|
63
|
+
(0, common_1.Post)('prompt/preview'),
|
|
64
|
+
__param(0, (0, common_1.Body)()),
|
|
65
|
+
__metadata("design:type", Function),
|
|
66
|
+
__metadata("design:paramtypes", [preview_prompt_dto_js_1.PreviewPromptDto]),
|
|
67
|
+
__metadata("design:returntype", Promise)
|
|
68
|
+
], AgentController.prototype, "previewPrompt", null);
|
|
69
|
+
__decorate([
|
|
70
|
+
(0, common_1.Post)(),
|
|
71
|
+
__param(0, (0, common_1.Body)()),
|
|
72
|
+
__metadata("design:type", Function),
|
|
73
|
+
__metadata("design:paramtypes", [create_agent_dto_js_1.CreateAgentDto]),
|
|
74
|
+
__metadata("design:returntype", void 0)
|
|
75
|
+
], AgentController.prototype, "createAgent", null);
|
|
76
|
+
__decorate([
|
|
77
|
+
(0, common_1.Put)(':id'),
|
|
78
|
+
__param(0, (0, common_1.Param)('id')),
|
|
79
|
+
__param(1, (0, common_1.Body)()),
|
|
80
|
+
__metadata("design:type", Function),
|
|
81
|
+
__metadata("design:paramtypes", [String, update_agent_dto_js_1.UpdateAgentDto]),
|
|
82
|
+
__metadata("design:returntype", void 0)
|
|
83
|
+
], AgentController.prototype, "updateAgent", null);
|
|
84
|
+
__decorate([
|
|
85
|
+
(0, common_1.Delete)(':id'),
|
|
86
|
+
(0, common_1.HttpCode)(common_1.HttpStatus.OK),
|
|
87
|
+
__param(0, (0, common_1.Param)('id')),
|
|
88
|
+
__metadata("design:type", Function),
|
|
89
|
+
__metadata("design:paramtypes", [String]),
|
|
90
|
+
__metadata("design:returntype", void 0)
|
|
91
|
+
], AgentController.prototype, "deleteAgent", null);
|
|
92
|
+
exports.AgentController = AgentController = __decorate([
|
|
93
|
+
(0, swagger_1.ApiTags)('agents'),
|
|
94
|
+
(0, common_1.Controller)('ws/:slug/agents'),
|
|
95
|
+
__metadata("design:paramtypes", [agent_service_js_1.AgentService])
|
|
96
|
+
], AgentController);
|
|
@@ -0,0 +1,26 @@
|
|
|
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.AgentModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const agent_controller_js_1 = require("./agent.controller.js");
|
|
12
|
+
const provider_controller_js_1 = require("./provider.controller.js");
|
|
13
|
+
const agent_service_js_1 = require("./agent.service.js");
|
|
14
|
+
const template_processor_service_js_1 = require("./template-processor.service.js");
|
|
15
|
+
const document_module_js_1 = require("../document/document.module.js");
|
|
16
|
+
let AgentModule = class AgentModule {
|
|
17
|
+
};
|
|
18
|
+
exports.AgentModule = AgentModule;
|
|
19
|
+
exports.AgentModule = AgentModule = __decorate([
|
|
20
|
+
(0, common_1.Module)({
|
|
21
|
+
imports: [document_module_js_1.DocumentModule],
|
|
22
|
+
controllers: [agent_controller_js_1.AgentController, provider_controller_js_1.ProviderController],
|
|
23
|
+
providers: [agent_service_js_1.AgentService, template_processor_service_js_1.TemplateProcessorService],
|
|
24
|
+
exports: [agent_service_js_1.AgentService],
|
|
25
|
+
})
|
|
26
|
+
], AgentModule);
|