crewx 0.8.4-rc.7 → 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.
Files changed (153) hide show
  1. package/bin/crewx-ui.js +0 -0
  2. package/package.json +45 -44
  3. package/packages/cli/package.json +1 -1
  4. package/dist-server/adapters/adapter.module.js +0 -35
  5. package/dist-server/adapters/adapter.service.js +0 -79
  6. package/dist-server/adapters/http-router.service.js +0 -91
  7. package/dist-server/app.module.js +0 -102
  8. package/dist-server/bootstrap/crewx-server.js +0 -79
  9. package/dist-server/common/cors.js +0 -15
  10. package/dist-server/common/decorators/project.decorator.js +0 -21
  11. package/dist-server/common/decorators/workspace.decorator.js +0 -24
  12. package/dist-server/common/interceptor/api-id-header.interceptor.js +0 -53
  13. package/dist-server/common/interceptor/http-logging.interceptor.js +0 -124
  14. package/dist-server/common/limits/defaults.js +0 -13
  15. package/dist-server/common/limits/limits-provider.js +0 -6
  16. package/dist-server/common/limits/limits.controller.js +0 -38
  17. package/dist-server/common/limits/limits.module.js +0 -24
  18. package/dist-server/common/limits/local-limits.provider.js +0 -27
  19. package/dist-server/common/middleware/workspace.middleware.js +0 -210
  20. package/dist-server/common/repository.exception-filter.js +0 -48
  21. package/dist-server/common/workspace-context.store.js +0 -25
  22. package/dist-server/domain/agent/agent.controller.js +0 -96
  23. package/dist-server/domain/agent/agent.module.js +0 -26
  24. package/dist-server/domain/agent/agent.service.js +0 -317
  25. package/dist-server/domain/agent/agent.types.js +0 -3
  26. package/dist-server/domain/agent/dto/create-agent.dto.js +0 -80
  27. package/dist-server/domain/agent/dto/preview-prompt.dto.js +0 -77
  28. package/dist-server/domain/agent/dto/provider-meta.dto.js +0 -2
  29. package/dist-server/domain/agent/dto/update-agent.dto.js +0 -92
  30. package/dist-server/domain/agent/provider.controller.js +0 -38
  31. package/dist-server/domain/agent/template-processor.service.js +0 -71
  32. package/dist-server/domain/auth/auth.constants.js +0 -4
  33. package/dist-server/domain/auth/auth.controller.js +0 -120
  34. package/dist-server/domain/auth/auth.module.js +0 -47
  35. package/dist-server/domain/auth/decorators/public.decorator.js +0 -7
  36. package/dist-server/domain/auth/guards/base-auth.guard.js +0 -62
  37. package/dist-server/domain/auth/utils/ip.utils.js +0 -31
  38. package/dist-server/domain/box/box.controller.js +0 -77
  39. package/dist-server/domain/box/box.module.js +0 -21
  40. package/dist-server/domain/box/box.service.js +0 -97
  41. package/dist-server/domain/box/dto/create-box.dto.js +0 -74
  42. package/dist-server/domain/cli/cli.controller.js +0 -88
  43. package/dist-server/domain/cli/cli.module.js +0 -21
  44. package/dist-server/domain/cli/cli.service.js +0 -435
  45. package/dist-server/domain/cli/dto/update-cli.dto.js +0 -31
  46. package/dist-server/domain/doc/doc.controller.js +0 -95
  47. package/dist-server/domain/doc/doc.module.js +0 -21
  48. package/dist-server/domain/doc/doc.service.js +0 -368
  49. package/dist-server/domain/doc/dto/doc.dto.js +0 -64
  50. package/dist-server/domain/document/document.controller.js +0 -57
  51. package/dist-server/domain/document/document.module.js +0 -22
  52. package/dist-server/domain/document/document.service.js +0 -271
  53. package/dist-server/domain/document/dto/register-document.dto.js +0 -24
  54. package/dist-server/domain/fs/dto/mkdir-request.dto.js +0 -47
  55. package/dist-server/domain/fs/dto/mkdir-response.dto.js +0 -2
  56. package/dist-server/domain/fs/dto/quick-access.dto.js +0 -2
  57. package/dist-server/domain/fs/dto/tree-node.dto.js +0 -2
  58. package/dist-server/domain/fs/dto/tree-query.dto.js +0 -35
  59. package/dist-server/domain/fs/fs.controller.js +0 -63
  60. package/dist-server/domain/fs/fs.module.js +0 -22
  61. package/dist-server/domain/fs/fs.service.js +0 -303
  62. package/dist-server/domain/git/git.module.js +0 -20
  63. package/dist-server/domain/git/git.service.js +0 -222
  64. package/dist-server/domain/health/health.controller.js +0 -57
  65. package/dist-server/domain/health/health.module.js +0 -19
  66. package/dist-server/domain/knowledge/dto/graph-knowledge.dto.js +0 -27
  67. package/dist-server/domain/knowledge/dto/knowledge.dto.js +0 -71
  68. package/dist-server/domain/knowledge/knowledge.controller.js +0 -122
  69. package/dist-server/domain/knowledge/knowledge.module.js +0 -21
  70. package/dist-server/domain/knowledge/knowledge.service.js +0 -538
  71. package/dist-server/domain/mcp/browser-session.store.js +0 -247
  72. package/dist-server/domain/mcp/crewx-tool.factory.js +0 -117
  73. package/dist-server/domain/mcp/mcp-auth.guard.js +0 -61
  74. package/dist-server/domain/mcp/mcp.constants.js +0 -4
  75. package/dist-server/domain/mcp/mcp.controller.js +0 -125
  76. package/dist-server/domain/mcp/mcp.dto.js +0 -12
  77. package/dist-server/domain/mcp/mcp.module.js +0 -49
  78. package/dist-server/domain/mcp/mcp.service.js +0 -682
  79. package/dist-server/domain/mcp/tool-router.service.js +0 -120
  80. package/dist-server/domain/message/dto/list-messages.dto.js +0 -57
  81. package/dist-server/domain/message/dto/send-message.dto.js +0 -45
  82. package/dist-server/domain/message/message.controller.js +0 -73
  83. package/dist-server/domain/message/message.module.js +0 -25
  84. package/dist-server/domain/message/message.service.js +0 -158
  85. package/dist-server/domain/onboarding/onboarding.controller.js +0 -97
  86. package/dist-server/domain/onboarding/onboarding.module.js +0 -23
  87. package/dist-server/domain/onboarding/onboarding.service.js +0 -106
  88. package/dist-server/domain/onboarding/onboarding.types.js +0 -2
  89. package/dist-server/domain/onboarding/presets/custom.js +0 -10
  90. package/dist-server/domain/onboarding/presets/dev-team.js +0 -41
  91. package/dist-server/domain/onboarding/presets/index.js +0 -15
  92. package/dist-server/domain/onboarding/presets/marketing-team.js +0 -29
  93. package/dist-server/domain/onboarding/presets/planning-team.js +0 -29
  94. package/dist-server/domain/onboarding/presets/solo.js +0 -17
  95. package/dist-server/domain/project/dto/create-project.dto.js +0 -46
  96. package/dist-server/domain/project/dto/update-project.dto.js +0 -60
  97. package/dist-server/domain/project/project.controller.js +0 -129
  98. package/dist-server/domain/project/project.module.js +0 -22
  99. package/dist-server/domain/project/project.service.js +0 -173
  100. package/dist-server/domain/skill/dto/add-registry.dto.js +0 -23
  101. package/dist-server/domain/skill/dto/install-skill.dto.js +0 -30
  102. package/dist-server/domain/skill/skill.controller.js +0 -136
  103. package/dist-server/domain/skill/skill.module.js +0 -22
  104. package/dist-server/domain/skill/skill.service.js +0 -632
  105. package/dist-server/domain/task/dto/all-tasks.dto.js +0 -55
  106. package/dist-server/domain/task/dto/list-tasks.dto.js +0 -69
  107. package/dist-server/domain/task/dto/search-tasks.dto.js +0 -66
  108. package/dist-server/domain/task/dto/send-message.dto.js +0 -31
  109. package/dist-server/domain/task/dto/task-status.dto.js +0 -34
  110. package/dist-server/domain/task/dto/workspace-usage.dto.js +0 -38
  111. package/dist-server/domain/task/task.constants.js +0 -5
  112. package/dist-server/domain/task/task.controller.js +0 -169
  113. package/dist-server/domain/task/task.module.js +0 -23
  114. package/dist-server/domain/task/task.service.js +0 -722
  115. package/dist-server/domain/thread/dto/build-context.dto.js +0 -42
  116. package/dist-server/domain/thread/dto/list-messages.dto.js +0 -49
  117. package/dist-server/domain/thread/dto/list-threads.dto.js +0 -70
  118. package/dist-server/domain/thread/dto/search-threads.dto.js +0 -13
  119. package/dist-server/domain/thread/dto/update-thread.dto.js +0 -23
  120. package/dist-server/domain/thread/thread.controller.js +0 -132
  121. package/dist-server/domain/thread/thread.module.js +0 -23
  122. package/dist-server/domain/thread/thread.service.js +0 -399
  123. package/dist-server/domain/usage/usage.controller.js +0 -118
  124. package/dist-server/domain/usage/usage.module.js +0 -21
  125. package/dist-server/domain/usage/usage.service.js +0 -343
  126. package/dist-server/domain/usage/usage.types.js +0 -4
  127. package/dist-server/domain/wbs/wbs.controller.js +0 -51
  128. package/dist-server/domain/wbs/wbs.module.js +0 -21
  129. package/dist-server/domain/wbs/wbs.service.js +0 -94
  130. package/dist-server/domain/workflow/workflow.controller.js +0 -53
  131. package/dist-server/domain/workflow/workflow.module.js +0 -21
  132. package/dist-server/domain/workflow/workflow.service.js +0 -209
  133. package/dist-server/domain/workspace/dto/create-workspace.dto.js +0 -45
  134. package/dist-server/domain/workspace/dto/switch-workspace.dto.js +0 -32
  135. package/dist-server/domain/workspace/dto/workspace-info.dto.js +0 -2
  136. package/dist-server/domain/workspace/workspace.controller.js +0 -98
  137. package/dist-server/domain/workspace/workspace.module.js +0 -22
  138. package/dist-server/domain/workspace/workspace.service.js +0 -216
  139. package/dist-server/main.js +0 -175
  140. package/dist-server/modules/crewx-pool.service.js +0 -70
  141. package/dist-server/modules/crewx.module.js +0 -47
  142. package/dist-server/repository/base-sqlite.repository.js +0 -18
  143. package/dist-server/repository/box.repository.js +0 -99
  144. package/dist-server/repository/message.repository.js +0 -22
  145. package/dist-server/repository/project.repository.js +0 -48
  146. package/dist-server/repository/repository.module.js +0 -34
  147. package/dist-server/repository/request-log.repository.js +0 -96
  148. package/dist-server/repository/task.repository.js +0 -102
  149. package/dist-server/repository/thread.repository.js +0 -143
  150. package/dist-server/shared/crewx-home.js +0 -58
  151. package/dist-server/shared/crewx-state.js +0 -66
  152. package/dist-server/test-utils/compat-database.js +0 -30
  153. package/dist-server/utils/tokenizer.js +0 -8
package/bin/crewx-ui.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crewx",
3
- "version": "0.8.4-rc.7",
3
+ "version": "0.8.5-rc.0",
4
4
  "description": "CrewX — AI agent team dashboard with Electron UI and CLI (Web + Electron + Global CLI)",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -24,7 +24,49 @@
24
24
  "email": "doha.park@sowonlabs.com"
25
25
  },
26
26
  "license": "UNLICENSED",
27
+ "packageManager": "pnpm@9.15.0",
28
+ "scripts": {
29
+ "dev": "pm2 start ecosystem.dev.config.cjs",
30
+ "dev:stop": "pm2 stop crewx-server crewx-ui",
31
+ "dev:restart": "pm2 restart crewx-server crewx-ui",
32
+ "dev:logs": "pm2 logs crewx-server crewx-ui",
33
+ "dev:status": "pm2 list | grep crewx",
34
+ "dev:server": "nest start --watch",
35
+ "dev:ui": "vite",
36
+ "dev:electron": "ELECTRON=true vite",
37
+ "build:sdk": "pnpm -F @crewx/sdk run build",
38
+ "db:generate": "pnpm -F @crewx/sdk run db:generate",
39
+ "db:check": "pnpm -F @crewx/sdk run db:check",
40
+ "build:built-in": "pnpm -r --filter './packages/built-in/*' run build",
41
+ "build": "pnpm run build:sdk && pnpm run build:built-in && pnpm run build:cli && pnpm run build:server && pnpm run build:ui",
42
+ "build:cli": "cd packages/cli && npm run build",
43
+ "build:server": "tsc -p tsconfig.server.json && node scripts/emit-dist-server-package-json.mjs",
44
+ "build:ui": "vite build",
45
+ "build:chrome-x": "pnpm -F @crewx/chrome-x run build",
46
+ "build:web": "npm run build",
47
+ "build:electron": "ELECTRON=true vite build && npm run build:server && electron-builder",
48
+ "preview": "vite preview",
49
+ "lint": "eslint src --ext .ts,.tsx",
50
+ "test": "vitest run --config vitest.packages.config.ts && vitest run --config vitest.server.config.ts",
51
+ "test:all": "vitest run && vitest run --config vitest.server.config.ts",
52
+ "test:watch": "vitest",
53
+ "test:ui": "vitest run",
54
+ "test:server": "vitest run --config vitest.server.config.ts",
55
+ "type-check": "tsc --noEmit",
56
+ "build:manual": "node scripts/build-manual.mjs"
57
+ },
27
58
  "dependencies": {
59
+ "@crewx/cli": "workspace:*",
60
+ "@crewx/cron": "workspace:*",
61
+ "@crewx/doc": "workspace:*",
62
+ "@crewx/knowledge-core": "workspace:*",
63
+ "@crewx/memory": "workspace:*",
64
+ "@crewx/sdk": "workspace:*",
65
+ "@crewx/search": "workspace:*",
66
+ "@crewx/shared": "workspace:*",
67
+ "@crewx/skill": "workspace:*",
68
+ "@crewx/wbs": "workspace:*",
69
+ "@crewx/workflow": "workspace:*",
28
70
  "@modelcontextprotocol/sdk": "^1.0.0",
29
71
  "@nestjs/common": "^11.0.0",
30
72
  "@nestjs/config": "^4.0.3",
@@ -66,18 +108,7 @@
66
108
  "wink-bm25-text-search": "^3.1.2",
67
109
  "wink-nlp-utils": "^2.1.0",
68
110
  "yargs": "^17.7.0",
69
- "zod": "^3.22.0",
70
- "@crewx/cli": "0.8.4-rc.7",
71
- "@crewx/cron": "0.1.8",
72
- "@crewx/doc": "0.1.8",
73
- "@crewx/sdk": "0.8.4-rc.4",
74
- "@crewx/knowledge-core": "0.1.6",
75
- "@crewx/memory": "0.1.10",
76
- "@crewx/search": "0.1.9",
77
- "@crewx/skill": "0.1.8",
78
- "@crewx/workflow": "0.3.18",
79
- "@crewx/shared": "0.0.5",
80
- "@crewx/wbs": "0.1.9"
111
+ "zod": "^3.22.0"
81
112
  },
82
113
  "devDependencies": {
83
114
  "@ccusage/codex": "^0.0.1",
@@ -186,35 +217,5 @@
186
217
  "portable"
187
218
  ]
188
219
  }
189
- },
190
- "scripts": {
191
- "dev": "pm2 start ecosystem.dev.config.cjs",
192
- "dev:stop": "pm2 stop crewx-server crewx-ui",
193
- "dev:restart": "pm2 restart crewx-server crewx-ui",
194
- "dev:logs": "pm2 logs crewx-server crewx-ui",
195
- "dev:status": "pm2 list | grep crewx",
196
- "dev:server": "nest start --watch",
197
- "dev:ui": "vite",
198
- "dev:electron": "ELECTRON=true vite",
199
- "build:sdk": "pnpm -F @crewx/sdk run build",
200
- "db:generate": "pnpm -F @crewx/sdk run db:generate",
201
- "db:check": "pnpm -F @crewx/sdk run db:check",
202
- "build:built-in": "pnpm -r --filter './packages/built-in/*' run build",
203
- "build": "pnpm run build:sdk && pnpm run build:built-in && pnpm run build:cli && pnpm run build:server && pnpm run build:ui",
204
- "build:cli": "cd packages/cli && npm run build",
205
- "build:server": "tsc -p tsconfig.server.json && node scripts/emit-dist-server-package-json.mjs",
206
- "build:ui": "vite build",
207
- "build:chrome-x": "pnpm -F @crewx/chrome-x run build",
208
- "build:web": "npm run build",
209
- "build:electron": "ELECTRON=true vite build && npm run build:server && electron-builder",
210
- "preview": "vite preview",
211
- "lint": "eslint src --ext .ts,.tsx",
212
- "test": "vitest run --config vitest.packages.config.ts && vitest run --config vitest.server.config.ts",
213
- "test:all": "vitest run && vitest run --config vitest.server.config.ts",
214
- "test:watch": "vitest",
215
- "test:ui": "vitest run",
216
- "test:server": "vitest run --config vitest.server.config.ts",
217
- "type-check": "tsc --noEmit",
218
- "build:manual": "node scripts/build-manual.mjs"
219
220
  }
220
- }
221
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewx/cli",
3
- "version": "0.8.4-rc.7",
3
+ "version": "0.8.5-rc.0",
4
4
  "license": "UNLICENSED",
5
5
  "engines": {
6
6
  "node": ">=20.19.0"
@@ -1,35 +0,0 @@
1
- "use strict";
2
- /**
3
- * AdapterModule — NestJS module for adapter lifecycle management.
4
- *
5
- * Implements OnApplicationBootstrap (start adapters from yaml)
6
- * and OnApplicationShutdown (stop all adapters with timeout).
7
- */
8
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
9
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
11
- 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;
12
- return c > 3 && r && Object.defineProperty(target, key, r), r;
13
- };
14
- var AdapterModule_1;
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.AdapterModule = void 0;
17
- const common_1 = require("@nestjs/common");
18
- const adapter_service_js_1 = require("./adapter.service.js");
19
- const http_router_service_js_1 = require("./http-router.service.js");
20
- let AdapterModule = AdapterModule_1 = class AdapterModule {
21
- logger = new common_1.Logger(AdapterModule_1.name);
22
- onApplicationBootstrap() {
23
- this.logger.log('AdapterModule bootstrap — adapters will be loaded lazily via AdapterService');
24
- }
25
- async onApplicationShutdown() {
26
- this.logger.log('AdapterModule shutdown — stopping all adapters');
27
- }
28
- };
29
- exports.AdapterModule = AdapterModule;
30
- exports.AdapterModule = AdapterModule = AdapterModule_1 = __decorate([
31
- (0, common_1.Module)({
32
- providers: [adapter_service_js_1.AdapterService, http_router_service_js_1.AdapterHttpRouterService],
33
- exports: [adapter_service_js_1.AdapterService, http_router_service_js_1.AdapterHttpRouterService],
34
- })
35
- ], AdapterModule);
@@ -1,79 +0,0 @@
1
- "use strict";
2
- /**
3
- * AdapterService — loads adapter configs from crewx.yaml and registers them.
4
- *
5
- * V1: yaml auto-load model. Reads `adapters:` section from crewx config.
6
- */
7
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
- if (k2 === undefined) k2 = k;
9
- var desc = Object.getOwnPropertyDescriptor(m, k);
10
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
- desc = { enumerable: true, get: function() { return m[k]; } };
12
- }
13
- Object.defineProperty(o, k2, desc);
14
- }) : (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- o[k2] = m[k];
17
- }));
18
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
- Object.defineProperty(o, "default", { enumerable: true, value: v });
20
- }) : function(o, v) {
21
- o["default"] = v;
22
- });
23
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
24
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
25
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
26
- 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;
27
- return c > 3 && r && Object.defineProperty(target, key, r), r;
28
- };
29
- var __importStar = (this && this.__importStar) || (function () {
30
- var ownKeys = function(o) {
31
- ownKeys = Object.getOwnPropertyNames || function (o) {
32
- var ar = [];
33
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
- return ar;
35
- };
36
- return ownKeys(o);
37
- };
38
- return function (mod) {
39
- if (mod && mod.__esModule) return mod;
40
- var result = {};
41
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
- __setModuleDefault(result, mod);
43
- return result;
44
- };
45
- })();
46
- var AdapterService_1;
47
- Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.AdapterService = void 0;
49
- const common_1 = require("@nestjs/common");
50
- let AdapterService = AdapterService_1 = class AdapterService {
51
- logger = new common_1.Logger(AdapterService_1.name);
52
- async loadFromYaml(crewx, adapters) {
53
- for (const adapterConf of adapters) {
54
- try {
55
- const instanceId = adapterConf.instanceId ?? adapterConf.id;
56
- this.logger.log(`Loading adapter: ${adapterConf.id} (instance: ${instanceId})`);
57
- const adapterModule = await Promise.resolve(`${adapterConf.module}`).then(s => __importStar(require(s)));
58
- const adapter = adapterModule.default ?? adapterModule.adapter;
59
- if (!adapter) {
60
- this.logger.error(`Adapter module ${adapterConf.module} has no default export`);
61
- continue;
62
- }
63
- await crewx.registerChannelAdapter({
64
- adapter,
65
- instanceId,
66
- config: adapterConf.config ?? {},
67
- });
68
- this.logger.log(`Adapter ${adapterConf.id} started successfully`);
69
- }
70
- catch (err) {
71
- this.logger.error(`Failed to load adapter ${adapterConf.id}: ${err instanceof Error ? err.message : String(err)}`);
72
- }
73
- }
74
- }
75
- };
76
- exports.AdapterService = AdapterService;
77
- exports.AdapterService = AdapterService = AdapterService_1 = __decorate([
78
- (0, common_1.Injectable)()
79
- ], AdapterService);
@@ -1,91 +0,0 @@
1
- "use strict";
2
- /**
3
- * AdapterHttpRouterService — implements HttpRouter.registerRoute for NestJS.
4
- *
5
- * M2: raw body handling with bodyParser:false,
6
- * requireSignature for webhook signature verification,
7
- * rateLimit per route, timeout handling.
8
- *
9
- * Route prefix: /adapters/:adapterId/* (enforced)
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.AdapterHttpRouterService = void 0;
13
- class AdapterHttpRouterService {
14
- routes = [];
15
- rateLimitCounters = new Map();
16
- registerRoute(adapterId, path, handler, opts) {
17
- const fullPath = `/adapters/${adapterId}${path}`;
18
- this.routes.push({ adapterId, path, fullPath, handler, opts });
19
- }
20
- getRoutes() {
21
- return this.routes;
22
- }
23
- findRoute(_method, url) {
24
- for (const route of this.routes) {
25
- if (url === route.fullPath || url.startsWith(route.fullPath)) {
26
- return route;
27
- }
28
- }
29
- return undefined;
30
- }
31
- clearRoutes() {
32
- this.routes.length = 0;
33
- this.rateLimitCounters.clear();
34
- }
35
- async handleRequest(route, req, res) {
36
- if (!req.url.startsWith('/adapters/')) {
37
- res.status(403).json({ error: 'route_prefix_violation' });
38
- return;
39
- }
40
- if (route.opts?.requireSignature) {
41
- const sig = req.headers[route.opts.requireSignature.headerName];
42
- const sigStr = Array.isArray(sig) ? sig[0] : sig;
43
- if (!sigStr || !route.opts.requireSignature.verify(req.body, sigStr)) {
44
- res.status(401).json({ error: 'invalid_signature' });
45
- return;
46
- }
47
- }
48
- if (route.opts?.rateLimit) {
49
- const key = `${route.adapterId}:${route.path}`;
50
- const now = Date.now();
51
- const entry = this.rateLimitCounters.get(key);
52
- const windowMs = 60_000;
53
- if (!entry || now >= entry.resetAt) {
54
- this.rateLimitCounters.set(key, { count: 1, resetAt: now + windowMs });
55
- }
56
- else if (entry.count >= route.opts.rateLimit.requestsPerMin) {
57
- res.status(429).json({ error: 'rate_limit_exceeded' });
58
- return;
59
- }
60
- else {
61
- entry.count++;
62
- }
63
- }
64
- const timeoutMs = route.opts?.timeoutMs ?? 30_000;
65
- let settled = false;
66
- const timeout = setTimeout(() => {
67
- if (!settled) {
68
- settled = true;
69
- res.status(504).json({ error: 'timeout' });
70
- }
71
- }, timeoutMs);
72
- try {
73
- await route.handler(req, res);
74
- if (!settled) {
75
- settled = true;
76
- clearTimeout(timeout);
77
- }
78
- }
79
- catch (err) {
80
- if (!settled) {
81
- settled = true;
82
- clearTimeout(timeout);
83
- res.status(500).json({
84
- error: 'handler_error',
85
- message: err instanceof Error ? err.message : String(err),
86
- });
87
- }
88
- }
89
- }
90
- }
91
- exports.AdapterHttpRouterService = AdapterHttpRouterService;
@@ -1,102 +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.AppModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const core_1 = require("@nestjs/core");
12
- const throttler_1 = require("@nestjs/throttler");
13
- const repository_exception_filter_js_1 = require("./common/repository.exception-filter.js");
14
- const workspace_middleware_js_1 = require("./common/middleware/workspace.middleware.js");
15
- const config_1 = require("@nestjs/config");
16
- const cli_module_js_1 = require("./domain/cli/cli.module.js");
17
- const usage_module_js_1 = require("./domain/usage/usage.module.js");
18
- const task_module_js_1 = require("./domain/task/task.module.js");
19
- const mcp_module_js_1 = require("./domain/mcp/mcp.module.js");
20
- const agent_module_js_1 = require("./domain/agent/agent.module.js");
21
- const git_module_js_1 = require("./domain/git/git.module.js");
22
- const knowledge_module_js_1 = require("./domain/knowledge/knowledge.module.js");
23
- const wbs_module_js_1 = require("./domain/wbs/wbs.module.js");
24
- const thread_module_js_1 = require("./domain/thread/thread.module.js");
25
- const doc_module_js_1 = require("./domain/doc/doc.module.js");
26
- const document_module_js_1 = require("./domain/document/document.module.js");
27
- const project_module_js_1 = require("./domain/project/project.module.js");
28
- const onboarding_module_js_1 = require("./domain/onboarding/onboarding.module.js");
29
- const box_module_js_1 = require("./domain/box/box.module.js");
30
- const message_module_js_1 = require("./domain/message/message.module.js");
31
- const skill_module_js_1 = require("./domain/skill/skill.module.js");
32
- const workflow_module_js_1 = require("./domain/workflow/workflow.module.js");
33
- const workspace_module_js_1 = require("./domain/workspace/workspace.module.js");
34
- const health_module_js_1 = require("./domain/health/health.module.js");
35
- const http_logging_interceptor_js_1 = require("./common/interceptor/http-logging.interceptor.js");
36
- const api_id_header_interceptor_js_1 = require("./common/interceptor/api-id-header.interceptor.js");
37
- const repository_module_js_1 = require("./repository/repository.module.js");
38
- const crewx_module_js_1 = require("./modules/crewx.module.js");
39
- const limits_module_js_1 = require("./common/limits/limits.module.js");
40
- const fs_module_js_1 = require("./domain/fs/fs.module.js");
41
- const auth_module_js_1 = require("./domain/auth/auth.module.js");
42
- let AppModule = class AppModule {
43
- configure(consumer) {
44
- consumer
45
- .apply(workspace_middleware_js_1.WorkspaceMiddleware)
46
- .forRoutes({ path: 'ws/:slug/(.*)', method: common_1.RequestMethod.ALL });
47
- }
48
- };
49
- exports.AppModule = AppModule;
50
- exports.AppModule = AppModule = __decorate([
51
- (0, common_1.Module)({
52
- imports: [
53
- config_1.ConfigModule.forRoot({ isGlobal: true }),
54
- throttler_1.ThrottlerModule.forRoot([{ ttl: 60000, limit: 100 }]),
55
- repository_module_js_1.RepositoryModule,
56
- crewx_module_js_1.CrewxModule,
57
- // Workspace-scoped modules (controllers use ws/:slug/* prefix directly)
58
- thread_module_js_1.ThreadModule,
59
- message_module_js_1.MessageModule,
60
- task_module_js_1.TaskModule,
61
- agent_module_js_1.AgentModule,
62
- usage_module_js_1.UsageModule,
63
- document_module_js_1.DocumentModule,
64
- doc_module_js_1.DocModule,
65
- knowledge_module_js_1.KnowledgeModule,
66
- onboarding_module_js_1.OnboardingModule,
67
- project_module_js_1.ProjectModule,
68
- fs_module_js_1.FsModule,
69
- skill_module_js_1.SkillModule,
70
- wbs_module_js_1.WbsModule,
71
- workflow_module_js_1.WorkflowModule,
72
- limits_module_js_1.LimitsModule,
73
- // Global modules (no workspace prefix)
74
- cli_module_js_1.CliModule,
75
- mcp_module_js_1.McpModule,
76
- auth_module_js_1.AuthModule,
77
- git_module_js_1.GitModule,
78
- box_module_js_1.BoxModule,
79
- workspace_module_js_1.WorkspaceModule,
80
- health_module_js_1.HealthModule,
81
- ],
82
- controllers: [],
83
- providers: [
84
- {
85
- provide: core_1.APP_FILTER,
86
- useClass: repository_exception_filter_js_1.RepositoryExceptionFilter,
87
- },
88
- {
89
- provide: core_1.APP_GUARD,
90
- useClass: throttler_1.ThrottlerGuard,
91
- },
92
- {
93
- provide: core_1.APP_INTERCEPTOR,
94
- useClass: api_id_header_interceptor_js_1.ApiIdHeaderInterceptor,
95
- },
96
- {
97
- provide: core_1.APP_INTERCEPTOR,
98
- useClass: http_logging_interceptor_js_1.HttpLoggingInterceptor,
99
- },
100
- ],
101
- })
102
- ], AppModule);
@@ -1,79 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createServerCrewx = createServerCrewx;
4
- const fs_1 = require("fs");
5
- const path_1 = require("path");
6
- const os_1 = require("os");
7
- const sdk_1 = require("@crewx/sdk");
8
- const plugins_1 = require("@crewx/sdk/plugins");
9
- const repository_1 = require("@crewx/sdk/repository");
10
- const node_1 = require("@crewx/sdk/tools/node");
11
- const SERVER_VERSION = (() => {
12
- try {
13
- const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../package.json'), 'utf8'));
14
- return pkg.version ?? '0.0.0';
15
- }
16
- catch {
17
- return '0.0.0';
18
- }
19
- })();
20
- /**
21
- * Build a Crewx instance for the NestJS server with standard plugins
22
- * (FileLogger + SqliteTracing) plus built-in node tools registration.
23
- * Passes itself as remoteFactory so that file:// remote agent delegation
24
- * inherits the same plugin/tool environment in the target Crewx instance
25
- * (identical semantics to CLI's createCliCrewx).
26
- *
27
- * Behavior mirrors createCliCrewx:
28
- * - If configPath resolves to an existing file → load it (with built-ins merged)
29
- * - If configPath is NOT set via CREWX_CONFIG env AND the file doesn't exist →
30
- * fall back to built-in-only mode so `crewx` can launch from any cwd
31
- * - If CREWX_CONFIG is explicitly set AND the file doesn't exist → throw
32
- *
33
- * workspaceRoot used by FileLoggerPlugin: directory of the yaml when present,
34
- * otherwise process.cwd() so logs land in the launch directory.
35
- */
36
- async function createServerCrewx(configPath) {
37
- let yamlPath;
38
- let workspaceRoot;
39
- if (configPath !== undefined) {
40
- // Caller explicitly provided a path — trust it directly without existsSync
41
- const absConfigPath = (0, path_1.resolve)(configPath);
42
- yamlPath = absConfigPath;
43
- workspaceRoot = (0, path_1.dirname)(absConfigPath);
44
- }
45
- else {
46
- // No explicit path — use env/default with existsSync fallback
47
- const defaultPath = (0, path_1.resolve)(process.env.CREWX_CONFIG ?? 'crewx.yaml');
48
- const isExplicitConfig = Boolean(process.env.CREWX_CONFIG);
49
- const fileExists = (0, fs_1.existsSync)(defaultPath);
50
- if (fileExists) {
51
- yamlPath = defaultPath;
52
- workspaceRoot = (0, path_1.dirname)(defaultPath);
53
- }
54
- else if (isExplicitConfig) {
55
- throw new Error(`[crewx] Config file not found: ${defaultPath} (set via CREWX_CONFIG)`);
56
- }
57
- else {
58
- yamlPath = undefined;
59
- workspaceRoot = process.cwd();
60
- }
61
- }
62
- const dbDir = (0, path_1.join)((0, os_1.homedir)(), '.crewx');
63
- (0, fs_1.mkdirSync)(dbDir, { recursive: true });
64
- const dbPath = (0, path_1.join)(dbDir, 'crewx.db');
65
- const handle = (0, repository_1.openDrizzleDb)(dbPath);
66
- try {
67
- (0, repository_1.runMigrations)(handle.db);
68
- }
69
- finally {
70
- handle.close();
71
- }
72
- const crewx = await sdk_1.Crewx.loadYaml(yamlPath, {
73
- remoteFactory: createServerCrewx,
74
- });
75
- (0, node_1.registerBuiltinTools)(crewx);
76
- await crewx.use(new plugins_1.FileLoggerPlugin({ workspaceRoot, version: SERVER_VERSION }));
77
- await crewx.use(new plugins_1.SqliteTracingPlugin({ version: SERVER_VERSION }));
78
- return crewx;
79
- }
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isAllowedOrigin = isAllowedOrigin;
4
- function isAllowedOrigin(origin, allowedExtensionIds) {
5
- if (!origin)
6
- return true;
7
- if (origin === 'http://localhost:8200')
8
- return true;
9
- if (origin.startsWith('chrome-extension://') &&
10
- (allowedExtensionIds.length === 0 ||
11
- allowedExtensionIds.some((id) => origin === `chrome-extension://${id}`))) {
12
- return true;
13
- }
14
- return false;
15
- }
@@ -1,21 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Project = void 0;
4
- const common_1 = require("@nestjs/common");
5
- /**
6
- * Extract project identifier:
7
- * 1. X-CrewX-Project header
8
- * 2. ?project query param (backward compat)
9
- * 3. process.cwd() (server working directory = default project)
10
- *
11
- * @deprecated Use `@Workspace()` decorator from `workspace.decorator.ts` instead.
12
- * This decorator returns a raw string; `@Workspace()` returns a full
13
- * `WorkspaceContext` ({ id, path, name }) populated by `WorkspaceMiddleware`.
14
- */
15
- exports.Project = (0, common_1.createParamDecorator)((_data, ctx) => {
16
- const req = ctx.switchToHttp().getRequest();
17
- const header = req.headers['x-crewx-project'];
18
- const headerValue = Array.isArray(header) ? header[0] : header;
19
- const queryValue = req.query['project'];
20
- return headerValue || queryValue || process.cwd();
21
- });
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Workspace = void 0;
4
- const common_1 = require("@nestjs/common");
5
- /**
6
- * Parameter decorator that extracts `WorkspaceContext` from the current request.
7
- *
8
- * The context is populated by `WorkspaceMiddleware` (global) and contains:
9
- * - `id` — SHA-256 hex (64 chars), used as `workspace_id` in DB queries
10
- * - `path` — Normalized absolute directory path
11
- * - `name` — Directory basename (human-readable)
12
- *
13
- * @example
14
- * ```ts
15
- * @Get()
16
- * findAll(@Workspace() ws: WorkspaceContext) {
17
- * return this.service.findAll(ws.id);
18
- * }
19
- * ```
20
- */
21
- exports.Workspace = (0, common_1.createParamDecorator)((_data, ctx) => {
22
- const req = ctx.switchToHttp().getRequest();
23
- return req.workspace;
24
- });
@@ -1,53 +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.ApiIdHeaderInterceptor = void 0;
13
- const common_1 = require("@nestjs/common");
14
- const core_1 = require("@nestjs/core");
15
- const HEADER_NAME = 'X-CrewX-ApiId';
16
- const SWAGGER_API_OPERATION = 'swagger/apiOperation';
17
- let ApiIdHeaderInterceptor = class ApiIdHeaderInterceptor {
18
- reflector;
19
- constructor(reflector) {
20
- this.reflector = reflector;
21
- }
22
- intercept(context, next) {
23
- // Guard: skip for non-controller contexts (e.g. static file serving)
24
- if (!this.reflector) {
25
- return next.handle();
26
- }
27
- let handler;
28
- try {
29
- handler = context.getHandler();
30
- }
31
- catch {
32
- return next.handle();
33
- }
34
- if (!handler) {
35
- return next.handle();
36
- }
37
- const metadata = this.reflector.get(SWAGGER_API_OPERATION, handler);
38
- const operationId = metadata?.operationId;
39
- if (!operationId) {
40
- return next.handle();
41
- }
42
- const res = context.switchToHttp().getResponse();
43
- if (!res.headersSent) {
44
- res.setHeader(HEADER_NAME, operationId);
45
- }
46
- return next.handle();
47
- }
48
- };
49
- exports.ApiIdHeaderInterceptor = ApiIdHeaderInterceptor;
50
- exports.ApiIdHeaderInterceptor = ApiIdHeaderInterceptor = __decorate([
51
- (0, common_1.Injectable)(),
52
- __metadata("design:paramtypes", [core_1.Reflector])
53
- ], ApiIdHeaderInterceptor);