crewx 0.8.7-rc.21 → 0.8.7-rc.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/assets/{MarketPage-aY16UW1_.js → MarketPage-lLBtAENs.js} +10 -15
  2. package/dist/assets/{PromptTab-C3aTJS6u.js → PromptTab-Daq54dMi.js} +1 -1
  3. package/dist/assets/_baseUniq-BJDqmZBO.js +1 -0
  4. package/dist/assets/{arc-BCQAokB1.js → arc-ByjRIa5p.js} +1 -1
  5. package/dist/assets/{architectureDiagram-UYN6MBPD-Bc87ujv2.js → architectureDiagram-UYN6MBPD-DcKpqSFb.js} +1 -1
  6. package/dist/assets/{blockDiagram-ZHA2E4KO-wC9uH8Lb.js → blockDiagram-ZHA2E4KO-YvUeULT5.js} +1 -1
  7. package/dist/assets/{c4Diagram-6F5ED5ID-CqB7lqni.js → c4Diagram-6F5ED5ID-vggzH2N5.js} +1 -1
  8. package/dist/assets/channel-1Y6YooBb.js +1 -0
  9. package/dist/assets/{chunk-5HRBRIJM-Cc1L17Eh.js → chunk-5HRBRIJM-BbaQwJkn.js} +1 -1
  10. package/dist/assets/{chunk-7U56Z5CX-Df3nu_7G.js → chunk-7U56Z5CX-DVYVpFaa.js} +1 -1
  11. package/dist/assets/{chunk-ASOPGD6M-DIXslLG-.js → chunk-ASOPGD6M-CXEvWb-8.js} +1 -1
  12. package/dist/assets/{chunk-KFBOBJHC-FytVljyP.js → chunk-KFBOBJHC-CadVXFV3.js} +1 -1
  13. package/dist/assets/{chunk-T2TOU4HS-CU5z-cXq.js → chunk-T2TOU4HS-lDZr1sVF.js} +1 -1
  14. package/dist/assets/{chunk-TMUBEWPD-CWo1AFyn.js → chunk-TMUBEWPD-D5A0MrFD.js} +1 -1
  15. package/dist/assets/classDiagram-LNE6IOMH-CDxkV2JV.js +1 -0
  16. package/dist/assets/classDiagram-v2-MQ7JQ4JX-CDxkV2JV.js +1 -0
  17. package/dist/assets/clone-6xznz_9G.js +1 -0
  18. package/dist/assets/{dagre-4EVJKHTY-CgZW5tg4.js → dagre-4EVJKHTY-Bncx7Ijq.js} +1 -1
  19. package/dist/assets/{diagram-QW4FP2JN-CJAng8RC.js → diagram-QW4FP2JN-RkxVNs99.js} +1 -1
  20. package/dist/assets/{erDiagram-6RL3IURR-C1uHztHX.js → erDiagram-6RL3IURR-DIiKqQdx.js} +1 -1
  21. package/dist/assets/{flowDiagram-7ASYPVHJ-Yiu2odO-.js → flowDiagram-7ASYPVHJ-DQ5PN7v6.js} +1 -1
  22. package/dist/assets/{ganttDiagram-NTVNEXSI-tutc0dJP.js → ganttDiagram-NTVNEXSI-BeNWGpB6.js} +1 -1
  23. package/dist/assets/{gitGraph-YCYPL57B-C3jM6T4G.js → gitGraph-YCYPL57B-CdMe059q.js} +1 -1
  24. package/dist/assets/{gitGraphDiagram-NRZ2UAAF-0aqHEKzz.js → gitGraphDiagram-NRZ2UAAF-BEke5TyK.js} +1 -1
  25. package/dist/assets/{graph-DC224ILV.js → graph-DyQIwWJd.js} +1 -1
  26. package/dist/assets/{infoDiagram-A4XQUW5V-Do7Mpzkx.js → infoDiagram-A4XQUW5V-CUcC8I_5.js} +1 -1
  27. package/dist/assets/{journeyDiagram-G5WM74LC-DAruEJc7.js → journeyDiagram-G5WM74LC-CQ5DqAH5.js} +1 -1
  28. package/dist/assets/{kanban-definition-QRCXZQQD-DB63vLR0.js → kanban-definition-QRCXZQQD-BBsgOii7.js} +1 -1
  29. package/dist/assets/{layout-BiYH5x6Q.js → layout-D7vBs_Wy.js} +1 -1
  30. package/dist/assets/{linear-CLyGW2s0.js → linear-CEOF9oJz.js} +1 -1
  31. package/dist/assets/{main-CEKkUqZb.js → main-Bx1nZ7_p.js} +278 -273
  32. package/dist/assets/main-C4ebvOIJ.css +10 -0
  33. package/dist/assets/{min-ChJMFU2N.js → min-RK9J5Utn.js} +1 -1
  34. package/dist/assets/{mindmap-definition-GWI6TPTV-CtADqQgd.js → mindmap-definition-GWI6TPTV-BXvEU7qC.js} +1 -1
  35. package/dist/assets/{pieDiagram-YF2LJOPJ-BSOfzo3O.js → pieDiagram-YF2LJOPJ-TrXqcpni.js} +1 -1
  36. package/dist/assets/{quadrantDiagram-OS5C2QUG-BLBQNFVb.js → quadrantDiagram-OS5C2QUG-B-chTEU4.js} +1 -1
  37. package/dist/assets/{requirementDiagram-MIRIMTAZ-DqorvuS6.js → requirementDiagram-MIRIMTAZ-BgJhNLp_.js} +1 -1
  38. package/dist/assets/{sankeyDiagram-Y46BX6SQ-4NDcrLkB.js → sankeyDiagram-Y46BX6SQ-BVsgYKK7.js} +1 -1
  39. package/dist/assets/{sequenceDiagram-G6AWOVSC-yha6BxK2.js → sequenceDiagram-G6AWOVSC-ByJOpkq3.js} +1 -1
  40. package/dist/assets/{stateDiagram-MAYHULR4-XJ_I41ez.js → stateDiagram-MAYHULR4-Dw7lUL1B.js} +1 -1
  41. package/dist/assets/stateDiagram-v2-4JROLMXI-DYJiM3bF.js +1 -0
  42. package/dist/assets/{timeline-definition-U7ZMHBDA-DCNrmvE7.js → timeline-definition-U7ZMHBDA-CSoEYs60.js} +1 -1
  43. package/dist/assets/{xychartDiagram-6QU3TZC5-9N-Ohhdp.js → xychartDiagram-6QU3TZC5-0_rG7p3L.js} +1 -1
  44. package/dist/index.html +2 -2
  45. package/package.json +8 -8
  46. package/packages/cli/package.json +1 -1
  47. package/dist/assets/_baseUniq-DxEFlwNt.js +0 -1
  48. package/dist/assets/channel-DNLHkiNp.js +0 -1
  49. package/dist/assets/classDiagram-LNE6IOMH-B430Onym.js +0 -1
  50. package/dist/assets/classDiagram-v2-MQ7JQ4JX-B430Onym.js +0 -1
  51. package/dist/assets/clone-B9O3E3P1.js +0 -1
  52. package/dist/assets/main-D3YeRndF.css +0 -10
  53. package/dist/assets/stateDiagram-v2-4JROLMXI-CxcyPJO2.js +0 -1
  54. package/dist-server/adapters/adapter.module.js +0 -35
  55. package/dist-server/adapters/adapter.service.js +0 -79
  56. package/dist-server/adapters/http-router.service.js +0 -91
  57. package/dist-server/app.module.js +0 -111
  58. package/dist-server/bootstrap/crewx-server.js +0 -80
  59. package/dist-server/bootstrap/tls.js +0 -138
  60. package/dist-server/common/analytics.client.js +0 -180
  61. package/dist-server/common/analytics.module.js +0 -21
  62. package/dist-server/common/cors.js +0 -15
  63. package/dist-server/common/decorators/project.decorator.js +0 -21
  64. package/dist-server/common/decorators/workspace.decorator.js +0 -24
  65. package/dist-server/common/device-id.js +0 -33
  66. package/dist-server/common/interceptor/api-id-header.interceptor.js +0 -53
  67. package/dist-server/common/interceptor/http-logging.interceptor.js +0 -124
  68. package/dist-server/common/limits/defaults.js +0 -13
  69. package/dist-server/common/limits/limits-provider.js +0 -6
  70. package/dist-server/common/limits/limits.controller.js +0 -38
  71. package/dist-server/common/limits/limits.module.js +0 -24
  72. package/dist-server/common/limits/local-limits.provider.js +0 -27
  73. package/dist-server/common/middleware/workspace.middleware.js +0 -210
  74. package/dist-server/common/repository.exception-filter.js +0 -48
  75. package/dist-server/common/workspace-context.store.js +0 -25
  76. package/dist-server/domain/agent/agent.controller.js +0 -96
  77. package/dist-server/domain/agent/agent.module.js +0 -27
  78. package/dist-server/domain/agent/agent.service.js +0 -335
  79. package/dist-server/domain/agent/agent.types.js +0 -3
  80. package/dist-server/domain/agent/dto/create-agent.dto.js +0 -80
  81. package/dist-server/domain/agent/dto/preview-prompt.dto.js +0 -77
  82. package/dist-server/domain/agent/dto/provider-meta.dto.js +0 -2
  83. package/dist-server/domain/agent/dto/update-agent.dto.js +0 -92
  84. package/dist-server/domain/agent/provider.controller.js +0 -38
  85. package/dist-server/domain/agent/template-processor.service.js +0 -71
  86. package/dist-server/domain/auth/auth.constants.js +0 -4
  87. package/dist-server/domain/auth/auth.controller.js +0 -123
  88. package/dist-server/domain/auth/auth.module.js +0 -47
  89. package/dist-server/domain/auth/decorators/public.decorator.js +0 -7
  90. package/dist-server/domain/auth/guards/base-auth.guard.js +0 -66
  91. package/dist-server/domain/auth/session-store.js +0 -26
  92. package/dist-server/domain/auth/utils/ip.utils.js +0 -31
  93. package/dist-server/domain/box/box.controller.js +0 -77
  94. package/dist-server/domain/box/box.module.js +0 -21
  95. package/dist-server/domain/box/box.service.js +0 -97
  96. package/dist-server/domain/box/dto/create-box.dto.js +0 -74
  97. package/dist-server/domain/cli/cli.controller.js +0 -136
  98. package/dist-server/domain/cli/cli.module.js +0 -21
  99. package/dist-server/domain/cli/cli.service.js +0 -598
  100. package/dist-server/domain/cli/dto/login-cli.dto.js +0 -25
  101. package/dist-server/domain/cli/dto/update-cli.dto.js +0 -31
  102. package/dist-server/domain/doc/doc.controller.js +0 -95
  103. package/dist-server/domain/doc/doc.module.js +0 -21
  104. package/dist-server/domain/doc/doc.service.js +0 -368
  105. package/dist-server/domain/doc/dto/doc.dto.js +0 -64
  106. package/dist-server/domain/document/document.controller.js +0 -57
  107. package/dist-server/domain/document/document.module.js +0 -22
  108. package/dist-server/domain/document/document.service.js +0 -274
  109. package/dist-server/domain/document/dto/register-document.dto.js +0 -24
  110. package/dist-server/domain/fs/dto/mkdir-request.dto.js +0 -47
  111. package/dist-server/domain/fs/dto/mkdir-response.dto.js +0 -2
  112. package/dist-server/domain/fs/dto/quick-access.dto.js +0 -2
  113. package/dist-server/domain/fs/dto/tree-node.dto.js +0 -2
  114. package/dist-server/domain/fs/dto/tree-query.dto.js +0 -35
  115. package/dist-server/domain/fs/fs.controller.js +0 -63
  116. package/dist-server/domain/fs/fs.module.js +0 -22
  117. package/dist-server/domain/fs/fs.service.js +0 -303
  118. package/dist-server/domain/git/git.module.js +0 -20
  119. package/dist-server/domain/git/git.service.js +0 -222
  120. package/dist-server/domain/goal/dto/goal.dto.js +0 -49
  121. package/dist-server/domain/goal/goal.controller.js +0 -86
  122. package/dist-server/domain/goal/goal.module.js +0 -22
  123. package/dist-server/domain/goal/goal.service.js +0 -197
  124. package/dist-server/domain/goal/parser/goal-md-parser.js +0 -166
  125. package/dist-server/domain/goal/parser/goal-md-serializer.js +0 -110
  126. package/dist-server/domain/health/health.controller.js +0 -57
  127. package/dist-server/domain/health/health.module.js +0 -19
  128. package/dist-server/domain/knowledge/dto/graph-knowledge.dto.js +0 -27
  129. package/dist-server/domain/knowledge/dto/knowledge.dto.js +0 -71
  130. package/dist-server/domain/knowledge/knowledge.controller.js +0 -122
  131. package/dist-server/domain/knowledge/knowledge.module.js +0 -21
  132. package/dist-server/domain/knowledge/knowledge.service.js +0 -538
  133. package/dist-server/domain/market/dto/add-registry.dto.js +0 -32
  134. package/dist-server/domain/market/dto/install-market.dto.js +0 -30
  135. package/dist-server/domain/market/market.controller.js +0 -163
  136. package/dist-server/domain/market/market.module.js +0 -22
  137. package/dist-server/domain/market/market.service.js +0 -1447
  138. package/dist-server/domain/mcp/browser-session.store.js +0 -247
  139. package/dist-server/domain/mcp/crewx-tool.factory.js +0 -119
  140. package/dist-server/domain/mcp/mcp-auth.guard.js +0 -61
  141. package/dist-server/domain/mcp/mcp.constants.js +0 -4
  142. package/dist-server/domain/mcp/mcp.controller.js +0 -125
  143. package/dist-server/domain/mcp/mcp.dto.js +0 -12
  144. package/dist-server/domain/mcp/mcp.module.js +0 -49
  145. package/dist-server/domain/mcp/mcp.service.js +0 -684
  146. package/dist-server/domain/mcp/tool-router.service.js +0 -120
  147. package/dist-server/domain/message/dto/list-messages.dto.js +0 -57
  148. package/dist-server/domain/message/dto/send-message.dto.js +0 -45
  149. package/dist-server/domain/message/message.controller.js +0 -73
  150. package/dist-server/domain/message/message.module.js +0 -25
  151. package/dist-server/domain/message/message.service.js +0 -160
  152. package/dist-server/domain/onboarding/onboarding.controller.js +0 -97
  153. package/dist-server/domain/onboarding/onboarding.module.js +0 -23
  154. package/dist-server/domain/onboarding/onboarding.service.js +0 -106
  155. package/dist-server/domain/onboarding/onboarding.types.js +0 -2
  156. package/dist-server/domain/onboarding/presets/custom.js +0 -10
  157. package/dist-server/domain/onboarding/presets/dev-team.js +0 -41
  158. package/dist-server/domain/onboarding/presets/index.js +0 -15
  159. package/dist-server/domain/onboarding/presets/marketing-team.js +0 -29
  160. package/dist-server/domain/onboarding/presets/planning-team.js +0 -29
  161. package/dist-server/domain/onboarding/presets/solo.js +0 -17
  162. package/dist-server/domain/planner/dto/planner.dto.js +0 -58
  163. package/dist-server/domain/planner/planner.controller.js +0 -74
  164. package/dist-server/domain/planner/planner.module.js +0 -22
  165. package/dist-server/domain/planner/planner.service.js +0 -269
  166. package/dist-server/domain/project/dto/create-project.dto.js +0 -46
  167. package/dist-server/domain/project/dto/update-project.dto.js +0 -60
  168. package/dist-server/domain/project/project.controller.js +0 -129
  169. package/dist-server/domain/project/project.module.js +0 -22
  170. package/dist-server/domain/project/project.service.js +0 -173
  171. package/dist-server/domain/settings/settings.controller.js +0 -52
  172. package/dist-server/domain/settings/settings.module.js +0 -22
  173. package/dist-server/domain/settings/settings.service.js +0 -105
  174. package/dist-server/domain/task/dto/all-tasks.dto.js +0 -55
  175. package/dist-server/domain/task/dto/list-tasks.dto.js +0 -69
  176. package/dist-server/domain/task/dto/search-tasks.dto.js +0 -66
  177. package/dist-server/domain/task/dto/send-message.dto.js +0 -31
  178. package/dist-server/domain/task/dto/task-status.dto.js +0 -34
  179. package/dist-server/domain/task/dto/workspace-usage.dto.js +0 -38
  180. package/dist-server/domain/task/task.constants.js +0 -5
  181. package/dist-server/domain/task/task.controller.js +0 -169
  182. package/dist-server/domain/task/task.module.js +0 -23
  183. package/dist-server/domain/task/task.service.js +0 -775
  184. package/dist-server/domain/thread/dto/build-context.dto.js +0 -42
  185. package/dist-server/domain/thread/dto/list-messages.dto.js +0 -49
  186. package/dist-server/domain/thread/dto/list-threads.dto.js +0 -70
  187. package/dist-server/domain/thread/dto/search-threads.dto.js +0 -13
  188. package/dist-server/domain/thread/dto/update-thread.dto.js +0 -23
  189. package/dist-server/domain/thread/thread.controller.js +0 -160
  190. package/dist-server/domain/thread/thread.module.js +0 -23
  191. package/dist-server/domain/thread/thread.service.js +0 -419
  192. package/dist-server/domain/usage/usage.controller.js +0 -118
  193. package/dist-server/domain/usage/usage.module.js +0 -21
  194. package/dist-server/domain/usage/usage.service.js +0 -358
  195. package/dist-server/domain/usage/usage.types.js +0 -4
  196. package/dist-server/domain/wbs/wbs.controller.js +0 -51
  197. package/dist-server/domain/wbs/wbs.module.js +0 -21
  198. package/dist-server/domain/wbs/wbs.service.js +0 -94
  199. package/dist-server/domain/workflow/workflow.controller.js +0 -53
  200. package/dist-server/domain/workflow/workflow.module.js +0 -21
  201. package/dist-server/domain/workflow/workflow.service.js +0 -209
  202. package/dist-server/domain/workspace/dto/create-workspace.dto.js +0 -45
  203. package/dist-server/domain/workspace/dto/switch-workspace.dto.js +0 -32
  204. package/dist-server/domain/workspace/dto/workspace-info.dto.js +0 -2
  205. package/dist-server/domain/workspace/workspace.controller.js +0 -98
  206. package/dist-server/domain/workspace/workspace.module.js +0 -22
  207. package/dist-server/domain/workspace/workspace.service.js +0 -198
  208. package/dist-server/main.js +0 -204
  209. package/dist-server/modules/crewx-pool.service.js +0 -75
  210. package/dist-server/modules/crewx.module.js +0 -47
  211. package/dist-server/repository/base-sqlite.repository.js +0 -18
  212. package/dist-server/repository/box.repository.js +0 -99
  213. package/dist-server/repository/message.repository.js +0 -22
  214. package/dist-server/repository/project.repository.js +0 -51
  215. package/dist-server/repository/repository.module.js +0 -34
  216. package/dist-server/repository/request-log.repository.js +0 -96
  217. package/dist-server/repository/task.repository.js +0 -105
  218. package/dist-server/repository/thread.repository.js +0 -165
  219. package/dist-server/shared/crewx-home.js +0 -58
  220. package/dist-server/shared/crewx-state.js +0 -66
  221. package/dist-server/test-utils/compat-database.js +0 -30
  222. package/dist-server/utils/tokenizer.js +0 -8
@@ -1,80 +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
- await crewx.use(new plugins_1.ConversationPlugin());
79
- return crewx;
80
- }
@@ -1,138 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.CERT_PATH = void 0;
7
- exports.resolveHttpsOptions = resolveHttpsOptions;
8
- const fs_1 = require("fs");
9
- const path_1 = require("path");
10
- const os_1 = require("os");
11
- const child_process_1 = require("child_process");
12
- const node_forge_1 = __importDefault(require("node-forge"));
13
- const TLS_DIR = (0, path_1.join)((0, os_1.homedir)(), '.crewx', 'tls');
14
- const CA_CERT_PATH = (0, path_1.join)(TLS_DIR, 'ca.pem');
15
- const CA_KEY_PATH = (0, path_1.join)(TLS_DIR, 'ca-key.pem');
16
- const CERT_PATH = (0, path_1.join)(TLS_DIR, 'cert.pem');
17
- exports.CERT_PATH = CERT_PATH;
18
- const KEY_PATH = (0, path_1.join)(TLS_DIR, 'key.pem');
19
- async function resolveHttpsOptions() {
20
- if (process.env.CREWX_HTTPS !== 'true') {
21
- return null;
22
- }
23
- if (process.env.TLS_CERT && process.env.TLS_KEY) {
24
- return {
25
- cert: (0, fs_1.readFileSync)(process.env.TLS_CERT),
26
- key: (0, fs_1.readFileSync)(process.env.TLS_KEY),
27
- };
28
- }
29
- if ((0, fs_1.existsSync)(CA_CERT_PATH) && (0, fs_1.existsSync)(CERT_PATH) && (0, fs_1.existsSync)(KEY_PATH)) {
30
- return {
31
- cert: (0, fs_1.readFileSync)(CERT_PATH),
32
- key: (0, fs_1.readFileSync)(KEY_PATH),
33
- };
34
- }
35
- // Generate CA (or reuse existing) + server cert signed by CA
36
- const ca = ensureCACert();
37
- const server = generateServerCert(ca.cert, ca.key);
38
- (0, fs_1.writeFileSync)(CERT_PATH, server.certPem, { mode: 0o644 });
39
- (0, fs_1.writeFileSync)(KEY_PATH, server.keyPem, { mode: 0o600 });
40
- if (ca.isNew && process.env.CREWX_TRUST_CA === 'true') {
41
- installCA(CA_CERT_PATH);
42
- }
43
- return {
44
- cert: Buffer.from(server.certPem),
45
- key: Buffer.from(server.keyPem),
46
- };
47
- }
48
- function ensureCACert() {
49
- if ((0, fs_1.existsSync)(CA_CERT_PATH) && (0, fs_1.existsSync)(CA_KEY_PATH)) {
50
- return {
51
- cert: node_forge_1.default.pki.certificateFromPem((0, fs_1.readFileSync)(CA_CERT_PATH, 'utf8')),
52
- key: node_forge_1.default.pki.privateKeyFromPem((0, fs_1.readFileSync)(CA_KEY_PATH, 'utf8')),
53
- isNew: false,
54
- };
55
- }
56
- const keys = node_forge_1.default.pki.rsa.generateKeyPair(2048);
57
- const cert = node_forge_1.default.pki.createCertificate();
58
- cert.publicKey = keys.publicKey;
59
- cert.serialNumber = randomSerialNumber();
60
- cert.validity.notBefore = new Date();
61
- cert.validity.notAfter = new Date();
62
- cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 10);
63
- const attrs = [
64
- { name: 'commonName', value: 'SowonLabs CrewX Local CA' },
65
- { name: 'organizationName', value: 'SowonLabs' },
66
- ];
67
- cert.setSubject(attrs);
68
- cert.setIssuer(attrs);
69
- cert.setExtensions([
70
- { name: 'basicConstraints', cA: true },
71
- { name: 'keyUsage', keyCertSign: true, cRLSign: true },
72
- ]);
73
- cert.sign(keys.privateKey, node_forge_1.default.md.sha256.create());
74
- (0, fs_1.mkdirSync)(TLS_DIR, { recursive: true });
75
- (0, fs_1.writeFileSync)(CA_CERT_PATH, node_forge_1.default.pki.certificateToPem(cert), { mode: 0o644 });
76
- (0, fs_1.writeFileSync)(CA_KEY_PATH, node_forge_1.default.pki.privateKeyToPem(keys.privateKey), {
77
- mode: 0o600,
78
- });
79
- console.log('🏛️ SowonLabs CrewX Local CA created: ~/.crewx/tls/ca.pem');
80
- return { cert, key: keys.privateKey, isNew: true };
81
- }
82
- function generateServerCert(caCert, caKey) {
83
- const host = (0, os_1.hostname)();
84
- const keys = node_forge_1.default.pki.rsa.generateKeyPair(2048);
85
- const cert = node_forge_1.default.pki.createCertificate();
86
- cert.publicKey = keys.publicKey;
87
- cert.serialNumber = randomSerialNumber();
88
- cert.validity.notBefore = new Date();
89
- cert.validity.notAfter = new Date();
90
- cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1);
91
- cert.setSubject([{ name: 'commonName', value: host }]);
92
- cert.setIssuer(caCert.subject.attributes);
93
- cert.setExtensions([
94
- {
95
- name: 'subjectAltName',
96
- altNames: [
97
- { type: 2, value: 'localhost' },
98
- { type: 2, value: host },
99
- { type: 7, ip: '127.0.0.1' },
100
- { type: 7, ip: '::1' },
101
- ],
102
- },
103
- ]);
104
- cert.sign(caKey, node_forge_1.default.md.sha256.create());
105
- console.log('🔒 Server certificate issued by SowonLabs CA: ~/.crewx/tls/cert.pem');
106
- return {
107
- certPem: node_forge_1.default.pki.certificateToPem(cert),
108
- keyPem: node_forge_1.default.pki.privateKeyToPem(keys.privateKey),
109
- };
110
- }
111
- function installCA(caCertPath) {
112
- const platform = process.platform;
113
- console.log('');
114
- console.log('🔐 Installing CA certificate to system trust store...');
115
- console.log('');
116
- try {
117
- if (platform === 'win32') {
118
- (0, child_process_1.execSync)(`powershell -Command "Import-Certificate -FilePath '${caCertPath}' -CertStoreLocation Cert:\\CurrentUser\\Root"`, { stdio: 'inherit' });
119
- }
120
- else if (platform === 'darwin') {
121
- (0, child_process_1.execSync)(`security add-trusted-cert -r trustRoot -k ~/Library/Keychains/login.keychain-db "${caCertPath}"`, { stdio: 'inherit' });
122
- }
123
- else {
124
- console.log(' Manual installation required on Linux:');
125
- console.log(` sudo cp ${caCertPath} /usr/local/share/ca-certificates/crewx-ca.crt`);
126
- console.log(' sudo update-ca-certificates');
127
- return;
128
- }
129
- console.log('✅ SowonLabs CA installed. HTTPS will work without browser warnings.');
130
- }
131
- catch {
132
- console.log('⚠️ CA installation failed. HTTPS still works, but browser will show a warning.');
133
- console.log(` Manual install: ${caCertPath}`);
134
- }
135
- }
136
- function randomSerialNumber() {
137
- return node_forge_1.default.util.bytesToHex(node_forge_1.default.random.getBytesSync(16));
138
- }
@@ -1,180 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
- return c > 3 && r && Object.defineProperty(target, key, r), r;
23
- };
24
- var __importStar = (this && this.__importStar) || (function () {
25
- var ownKeys = function(o) {
26
- ownKeys = Object.getOwnPropertyNames || function (o) {
27
- var ar = [];
28
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
- return ar;
30
- };
31
- return ownKeys(o);
32
- };
33
- return function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- })();
41
- var __metadata = (this && this.__metadata) || function (k, v) {
42
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
- };
44
- var AnalyticsService_1;
45
- Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.AnalyticsService = void 0;
47
- const fs_1 = require("fs");
48
- const os_1 = require("os");
49
- const path_1 = require("path");
50
- const common_1 = require("@nestjs/common");
51
- const yaml = __importStar(require("js-yaml"));
52
- const device_id_js_1 = require("./device-id.js");
53
- const ENDPOINT = 'https://analytics.sowonai.com/api/v1/events';
54
- const FLUSH_INTERVAL_MS = 60_000;
55
- const MAX_RETRIES = 3;
56
- const MAX_QUEUE_SIZE = 100;
57
- const APP_VERSION = (() => {
58
- try {
59
- const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../../package.json'), 'utf8'));
60
- return pkg.version ?? '0.0.0';
61
- }
62
- catch {
63
- return '0.0.0';
64
- }
65
- })();
66
- let AnalyticsService = AnalyticsService_1 = class AnalyticsService {
67
- logger = new common_1.Logger(AnalyticsService_1.name);
68
- queue = [];
69
- timer = null;
70
- disabled = false;
71
- constructor() {
72
- this.disabled = this.checkOptOut();
73
- if (!this.disabled) {
74
- this.timer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);
75
- this.timer.unref();
76
- }
77
- }
78
- track(event, props = {}) {
79
- if (this.disabled)
80
- return;
81
- this.queue.push({
82
- event: {
83
- app_id: 'crewx',
84
- app_version: APP_VERSION,
85
- device_id: (0, device_id_js_1.getDeviceId)(),
86
- os: (0, os_1.platform)(),
87
- arch: (0, os_1.arch)(),
88
- node_version: process.versions.node,
89
- source: 'web_ui',
90
- event,
91
- props,
92
- ts: new Date().toISOString(),
93
- },
94
- retries: 0,
95
- });
96
- if (this.queue.length >= MAX_QUEUE_SIZE) {
97
- this.flush();
98
- }
99
- }
100
- async flush() {
101
- if (this.queue.length === 0)
102
- return;
103
- const batch = this.queue.splice(0);
104
- const events = batch.map((e) => e.event);
105
- try {
106
- const res = await fetch(ENDPOINT, {
107
- method: 'POST',
108
- headers: { 'Content-Type': 'application/json' },
109
- body: JSON.stringify({ events }),
110
- signal: AbortSignal.timeout(10_000),
111
- });
112
- if (!res.ok)
113
- throw new Error(`HTTP ${res.status}`);
114
- }
115
- catch (err) {
116
- const retryable = batch.filter((e) => e.retries < MAX_RETRIES);
117
- for (const entry of retryable)
118
- entry.retries++;
119
- this.queue.push(...retryable);
120
- if (retryable.length > 0) {
121
- this.logger.warn(`Analytics flush failed (${retryable.length} events queued for retry): ${err}`);
122
- }
123
- }
124
- }
125
- async fetchInstallStats(items) {
126
- if (items.length === 0)
127
- return {};
128
- try {
129
- const params = new URLSearchParams({ items: items.join(',') });
130
- const res = await fetch(`https://analytics.sowonai.com/api/v1/stats/installs?${params}`, { signal: AbortSignal.timeout(5_000) });
131
- if (!res.ok)
132
- return {};
133
- const body = (await res.json());
134
- return body.data ?? {};
135
- }
136
- catch {
137
- return {};
138
- }
139
- }
140
- setEnabled(enabled) {
141
- this.disabled = !enabled;
142
- if (this.disabled && this.timer) {
143
- clearInterval(this.timer);
144
- this.timer = null;
145
- }
146
- else if (!this.disabled && !this.timer) {
147
- this.timer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);
148
- this.timer.unref();
149
- }
150
- }
151
- isEnabled() {
152
- return !this.disabled;
153
- }
154
- onModuleDestroy() {
155
- if (this.timer) {
156
- clearInterval(this.timer);
157
- this.timer = null;
158
- }
159
- this.flush();
160
- }
161
- checkOptOut() {
162
- try {
163
- const configPath = process.env.CREWX_CONFIG || 'crewx.yaml';
164
- if (!(0, fs_1.existsSync)(configPath))
165
- return false;
166
- const raw = (0, fs_1.readFileSync)(configPath, 'utf-8');
167
- const config = yaml.load(raw);
168
- const settings = (config?.settings ?? {});
169
- return settings.analytics === false;
170
- }
171
- catch {
172
- return false;
173
- }
174
- }
175
- };
176
- exports.AnalyticsService = AnalyticsService;
177
- exports.AnalyticsService = AnalyticsService = AnalyticsService_1 = __decorate([
178
- (0, common_1.Injectable)(),
179
- __metadata("design:paramtypes", [])
180
- ], AnalyticsService);
@@ -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.AnalyticsModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const analytics_client_js_1 = require("./analytics.client.js");
12
- let AnalyticsModule = class AnalyticsModule {
13
- };
14
- exports.AnalyticsModule = AnalyticsModule;
15
- exports.AnalyticsModule = AnalyticsModule = __decorate([
16
- (0, common_1.Global)(),
17
- (0, common_1.Module)({
18
- providers: [analytics_client_js_1.AnalyticsService],
19
- exports: [analytics_client_js_1.AnalyticsService],
20
- })
21
- ], AnalyticsModule);
@@ -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,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getDeviceId = getDeviceId;
4
- const fs_1 = require("fs");
5
- const path_1 = require("path");
6
- const os_1 = require("os");
7
- const crypto_1 = require("crypto");
8
- const DEVICE_ID_PATH = (0, path_1.join)((0, os_1.homedir)(), '.crewx', 'device-id');
9
- let cached = null;
10
- function getDeviceId() {
11
- if (cached)
12
- return cached;
13
- try {
14
- if ((0, fs_1.existsSync)(DEVICE_ID_PATH)) {
15
- const id = (0, fs_1.readFileSync)(DEVICE_ID_PATH, 'utf-8').trim();
16
- if (id) {
17
- cached = id;
18
- return id;
19
- }
20
- }
21
- const id = (0, crypto_1.randomUUID)();
22
- (0, fs_1.mkdirSync)((0, path_1.join)((0, os_1.homedir)(), '.crewx'), { recursive: true });
23
- (0, fs_1.writeFileSync)(DEVICE_ID_PATH, id, 'utf-8');
24
- cached = id;
25
- return id;
26
- }
27
- catch {
28
- // Fallback: per-session temporary UUID
29
- const id = (0, crypto_1.randomUUID)();
30
- cached = id;
31
- return id;
32
- }
33
- }
@@ -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);