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.
- package/dist/assets/{MarketPage-aY16UW1_.js → MarketPage-lLBtAENs.js} +10 -15
- package/dist/assets/{PromptTab-C3aTJS6u.js → PromptTab-Daq54dMi.js} +1 -1
- package/dist/assets/_baseUniq-BJDqmZBO.js +1 -0
- package/dist/assets/{arc-BCQAokB1.js → arc-ByjRIa5p.js} +1 -1
- package/dist/assets/{architectureDiagram-UYN6MBPD-Bc87ujv2.js → architectureDiagram-UYN6MBPD-DcKpqSFb.js} +1 -1
- package/dist/assets/{blockDiagram-ZHA2E4KO-wC9uH8Lb.js → blockDiagram-ZHA2E4KO-YvUeULT5.js} +1 -1
- package/dist/assets/{c4Diagram-6F5ED5ID-CqB7lqni.js → c4Diagram-6F5ED5ID-vggzH2N5.js} +1 -1
- package/dist/assets/channel-1Y6YooBb.js +1 -0
- package/dist/assets/{chunk-5HRBRIJM-Cc1L17Eh.js → chunk-5HRBRIJM-BbaQwJkn.js} +1 -1
- package/dist/assets/{chunk-7U56Z5CX-Df3nu_7G.js → chunk-7U56Z5CX-DVYVpFaa.js} +1 -1
- package/dist/assets/{chunk-ASOPGD6M-DIXslLG-.js → chunk-ASOPGD6M-CXEvWb-8.js} +1 -1
- package/dist/assets/{chunk-KFBOBJHC-FytVljyP.js → chunk-KFBOBJHC-CadVXFV3.js} +1 -1
- package/dist/assets/{chunk-T2TOU4HS-CU5z-cXq.js → chunk-T2TOU4HS-lDZr1sVF.js} +1 -1
- package/dist/assets/{chunk-TMUBEWPD-CWo1AFyn.js → chunk-TMUBEWPD-D5A0MrFD.js} +1 -1
- package/dist/assets/classDiagram-LNE6IOMH-CDxkV2JV.js +1 -0
- package/dist/assets/classDiagram-v2-MQ7JQ4JX-CDxkV2JV.js +1 -0
- package/dist/assets/clone-6xznz_9G.js +1 -0
- package/dist/assets/{dagre-4EVJKHTY-CgZW5tg4.js → dagre-4EVJKHTY-Bncx7Ijq.js} +1 -1
- package/dist/assets/{diagram-QW4FP2JN-CJAng8RC.js → diagram-QW4FP2JN-RkxVNs99.js} +1 -1
- package/dist/assets/{erDiagram-6RL3IURR-C1uHztHX.js → erDiagram-6RL3IURR-DIiKqQdx.js} +1 -1
- package/dist/assets/{flowDiagram-7ASYPVHJ-Yiu2odO-.js → flowDiagram-7ASYPVHJ-DQ5PN7v6.js} +1 -1
- package/dist/assets/{ganttDiagram-NTVNEXSI-tutc0dJP.js → ganttDiagram-NTVNEXSI-BeNWGpB6.js} +1 -1
- package/dist/assets/{gitGraph-YCYPL57B-C3jM6T4G.js → gitGraph-YCYPL57B-CdMe059q.js} +1 -1
- package/dist/assets/{gitGraphDiagram-NRZ2UAAF-0aqHEKzz.js → gitGraphDiagram-NRZ2UAAF-BEke5TyK.js} +1 -1
- package/dist/assets/{graph-DC224ILV.js → graph-DyQIwWJd.js} +1 -1
- package/dist/assets/{infoDiagram-A4XQUW5V-Do7Mpzkx.js → infoDiagram-A4XQUW5V-CUcC8I_5.js} +1 -1
- package/dist/assets/{journeyDiagram-G5WM74LC-DAruEJc7.js → journeyDiagram-G5WM74LC-CQ5DqAH5.js} +1 -1
- package/dist/assets/{kanban-definition-QRCXZQQD-DB63vLR0.js → kanban-definition-QRCXZQQD-BBsgOii7.js} +1 -1
- package/dist/assets/{layout-BiYH5x6Q.js → layout-D7vBs_Wy.js} +1 -1
- package/dist/assets/{linear-CLyGW2s0.js → linear-CEOF9oJz.js} +1 -1
- package/dist/assets/{main-CEKkUqZb.js → main-Bx1nZ7_p.js} +278 -273
- package/dist/assets/main-C4ebvOIJ.css +10 -0
- package/dist/assets/{min-ChJMFU2N.js → min-RK9J5Utn.js} +1 -1
- package/dist/assets/{mindmap-definition-GWI6TPTV-CtADqQgd.js → mindmap-definition-GWI6TPTV-BXvEU7qC.js} +1 -1
- package/dist/assets/{pieDiagram-YF2LJOPJ-BSOfzo3O.js → pieDiagram-YF2LJOPJ-TrXqcpni.js} +1 -1
- package/dist/assets/{quadrantDiagram-OS5C2QUG-BLBQNFVb.js → quadrantDiagram-OS5C2QUG-B-chTEU4.js} +1 -1
- package/dist/assets/{requirementDiagram-MIRIMTAZ-DqorvuS6.js → requirementDiagram-MIRIMTAZ-BgJhNLp_.js} +1 -1
- package/dist/assets/{sankeyDiagram-Y46BX6SQ-4NDcrLkB.js → sankeyDiagram-Y46BX6SQ-BVsgYKK7.js} +1 -1
- package/dist/assets/{sequenceDiagram-G6AWOVSC-yha6BxK2.js → sequenceDiagram-G6AWOVSC-ByJOpkq3.js} +1 -1
- package/dist/assets/{stateDiagram-MAYHULR4-XJ_I41ez.js → stateDiagram-MAYHULR4-Dw7lUL1B.js} +1 -1
- package/dist/assets/stateDiagram-v2-4JROLMXI-DYJiM3bF.js +1 -0
- package/dist/assets/{timeline-definition-U7ZMHBDA-DCNrmvE7.js → timeline-definition-U7ZMHBDA-CSoEYs60.js} +1 -1
- package/dist/assets/{xychartDiagram-6QU3TZC5-9N-Ohhdp.js → xychartDiagram-6QU3TZC5-0_rG7p3L.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +8 -8
- package/packages/cli/package.json +1 -1
- package/dist/assets/_baseUniq-DxEFlwNt.js +0 -1
- package/dist/assets/channel-DNLHkiNp.js +0 -1
- package/dist/assets/classDiagram-LNE6IOMH-B430Onym.js +0 -1
- package/dist/assets/classDiagram-v2-MQ7JQ4JX-B430Onym.js +0 -1
- package/dist/assets/clone-B9O3E3P1.js +0 -1
- package/dist/assets/main-D3YeRndF.css +0 -10
- package/dist/assets/stateDiagram-v2-4JROLMXI-CxcyPJO2.js +0 -1
- package/dist-server/adapters/adapter.module.js +0 -35
- package/dist-server/adapters/adapter.service.js +0 -79
- package/dist-server/adapters/http-router.service.js +0 -91
- package/dist-server/app.module.js +0 -111
- package/dist-server/bootstrap/crewx-server.js +0 -80
- package/dist-server/bootstrap/tls.js +0 -138
- package/dist-server/common/analytics.client.js +0 -180
- package/dist-server/common/analytics.module.js +0 -21
- package/dist-server/common/cors.js +0 -15
- package/dist-server/common/decorators/project.decorator.js +0 -21
- package/dist-server/common/decorators/workspace.decorator.js +0 -24
- package/dist-server/common/device-id.js +0 -33
- package/dist-server/common/interceptor/api-id-header.interceptor.js +0 -53
- package/dist-server/common/interceptor/http-logging.interceptor.js +0 -124
- package/dist-server/common/limits/defaults.js +0 -13
- package/dist-server/common/limits/limits-provider.js +0 -6
- package/dist-server/common/limits/limits.controller.js +0 -38
- package/dist-server/common/limits/limits.module.js +0 -24
- package/dist-server/common/limits/local-limits.provider.js +0 -27
- package/dist-server/common/middleware/workspace.middleware.js +0 -210
- package/dist-server/common/repository.exception-filter.js +0 -48
- package/dist-server/common/workspace-context.store.js +0 -25
- package/dist-server/domain/agent/agent.controller.js +0 -96
- package/dist-server/domain/agent/agent.module.js +0 -27
- package/dist-server/domain/agent/agent.service.js +0 -335
- package/dist-server/domain/agent/agent.types.js +0 -3
- package/dist-server/domain/agent/dto/create-agent.dto.js +0 -80
- package/dist-server/domain/agent/dto/preview-prompt.dto.js +0 -77
- package/dist-server/domain/agent/dto/provider-meta.dto.js +0 -2
- package/dist-server/domain/agent/dto/update-agent.dto.js +0 -92
- package/dist-server/domain/agent/provider.controller.js +0 -38
- package/dist-server/domain/agent/template-processor.service.js +0 -71
- package/dist-server/domain/auth/auth.constants.js +0 -4
- package/dist-server/domain/auth/auth.controller.js +0 -123
- package/dist-server/domain/auth/auth.module.js +0 -47
- package/dist-server/domain/auth/decorators/public.decorator.js +0 -7
- package/dist-server/domain/auth/guards/base-auth.guard.js +0 -66
- package/dist-server/domain/auth/session-store.js +0 -26
- package/dist-server/domain/auth/utils/ip.utils.js +0 -31
- package/dist-server/domain/box/box.controller.js +0 -77
- package/dist-server/domain/box/box.module.js +0 -21
- package/dist-server/domain/box/box.service.js +0 -97
- package/dist-server/domain/box/dto/create-box.dto.js +0 -74
- package/dist-server/domain/cli/cli.controller.js +0 -136
- package/dist-server/domain/cli/cli.module.js +0 -21
- package/dist-server/domain/cli/cli.service.js +0 -598
- package/dist-server/domain/cli/dto/login-cli.dto.js +0 -25
- package/dist-server/domain/cli/dto/update-cli.dto.js +0 -31
- package/dist-server/domain/doc/doc.controller.js +0 -95
- package/dist-server/domain/doc/doc.module.js +0 -21
- package/dist-server/domain/doc/doc.service.js +0 -368
- package/dist-server/domain/doc/dto/doc.dto.js +0 -64
- package/dist-server/domain/document/document.controller.js +0 -57
- package/dist-server/domain/document/document.module.js +0 -22
- package/dist-server/domain/document/document.service.js +0 -274
- package/dist-server/domain/document/dto/register-document.dto.js +0 -24
- package/dist-server/domain/fs/dto/mkdir-request.dto.js +0 -47
- package/dist-server/domain/fs/dto/mkdir-response.dto.js +0 -2
- package/dist-server/domain/fs/dto/quick-access.dto.js +0 -2
- package/dist-server/domain/fs/dto/tree-node.dto.js +0 -2
- package/dist-server/domain/fs/dto/tree-query.dto.js +0 -35
- package/dist-server/domain/fs/fs.controller.js +0 -63
- package/dist-server/domain/fs/fs.module.js +0 -22
- package/dist-server/domain/fs/fs.service.js +0 -303
- package/dist-server/domain/git/git.module.js +0 -20
- package/dist-server/domain/git/git.service.js +0 -222
- package/dist-server/domain/goal/dto/goal.dto.js +0 -49
- package/dist-server/domain/goal/goal.controller.js +0 -86
- package/dist-server/domain/goal/goal.module.js +0 -22
- package/dist-server/domain/goal/goal.service.js +0 -197
- package/dist-server/domain/goal/parser/goal-md-parser.js +0 -166
- package/dist-server/domain/goal/parser/goal-md-serializer.js +0 -110
- package/dist-server/domain/health/health.controller.js +0 -57
- package/dist-server/domain/health/health.module.js +0 -19
- package/dist-server/domain/knowledge/dto/graph-knowledge.dto.js +0 -27
- package/dist-server/domain/knowledge/dto/knowledge.dto.js +0 -71
- package/dist-server/domain/knowledge/knowledge.controller.js +0 -122
- package/dist-server/domain/knowledge/knowledge.module.js +0 -21
- package/dist-server/domain/knowledge/knowledge.service.js +0 -538
- package/dist-server/domain/market/dto/add-registry.dto.js +0 -32
- package/dist-server/domain/market/dto/install-market.dto.js +0 -30
- package/dist-server/domain/market/market.controller.js +0 -163
- package/dist-server/domain/market/market.module.js +0 -22
- package/dist-server/domain/market/market.service.js +0 -1447
- package/dist-server/domain/mcp/browser-session.store.js +0 -247
- package/dist-server/domain/mcp/crewx-tool.factory.js +0 -119
- package/dist-server/domain/mcp/mcp-auth.guard.js +0 -61
- package/dist-server/domain/mcp/mcp.constants.js +0 -4
- package/dist-server/domain/mcp/mcp.controller.js +0 -125
- package/dist-server/domain/mcp/mcp.dto.js +0 -12
- package/dist-server/domain/mcp/mcp.module.js +0 -49
- package/dist-server/domain/mcp/mcp.service.js +0 -684
- package/dist-server/domain/mcp/tool-router.service.js +0 -120
- package/dist-server/domain/message/dto/list-messages.dto.js +0 -57
- package/dist-server/domain/message/dto/send-message.dto.js +0 -45
- package/dist-server/domain/message/message.controller.js +0 -73
- package/dist-server/domain/message/message.module.js +0 -25
- package/dist-server/domain/message/message.service.js +0 -160
- package/dist-server/domain/onboarding/onboarding.controller.js +0 -97
- package/dist-server/domain/onboarding/onboarding.module.js +0 -23
- package/dist-server/domain/onboarding/onboarding.service.js +0 -106
- package/dist-server/domain/onboarding/onboarding.types.js +0 -2
- package/dist-server/domain/onboarding/presets/custom.js +0 -10
- package/dist-server/domain/onboarding/presets/dev-team.js +0 -41
- package/dist-server/domain/onboarding/presets/index.js +0 -15
- package/dist-server/domain/onboarding/presets/marketing-team.js +0 -29
- package/dist-server/domain/onboarding/presets/planning-team.js +0 -29
- package/dist-server/domain/onboarding/presets/solo.js +0 -17
- package/dist-server/domain/planner/dto/planner.dto.js +0 -58
- package/dist-server/domain/planner/planner.controller.js +0 -74
- package/dist-server/domain/planner/planner.module.js +0 -22
- package/dist-server/domain/planner/planner.service.js +0 -269
- package/dist-server/domain/project/dto/create-project.dto.js +0 -46
- package/dist-server/domain/project/dto/update-project.dto.js +0 -60
- package/dist-server/domain/project/project.controller.js +0 -129
- package/dist-server/domain/project/project.module.js +0 -22
- package/dist-server/domain/project/project.service.js +0 -173
- package/dist-server/domain/settings/settings.controller.js +0 -52
- package/dist-server/domain/settings/settings.module.js +0 -22
- package/dist-server/domain/settings/settings.service.js +0 -105
- package/dist-server/domain/task/dto/all-tasks.dto.js +0 -55
- package/dist-server/domain/task/dto/list-tasks.dto.js +0 -69
- package/dist-server/domain/task/dto/search-tasks.dto.js +0 -66
- package/dist-server/domain/task/dto/send-message.dto.js +0 -31
- package/dist-server/domain/task/dto/task-status.dto.js +0 -34
- package/dist-server/domain/task/dto/workspace-usage.dto.js +0 -38
- package/dist-server/domain/task/task.constants.js +0 -5
- package/dist-server/domain/task/task.controller.js +0 -169
- package/dist-server/domain/task/task.module.js +0 -23
- package/dist-server/domain/task/task.service.js +0 -775
- package/dist-server/domain/thread/dto/build-context.dto.js +0 -42
- package/dist-server/domain/thread/dto/list-messages.dto.js +0 -49
- package/dist-server/domain/thread/dto/list-threads.dto.js +0 -70
- package/dist-server/domain/thread/dto/search-threads.dto.js +0 -13
- package/dist-server/domain/thread/dto/update-thread.dto.js +0 -23
- package/dist-server/domain/thread/thread.controller.js +0 -160
- package/dist-server/domain/thread/thread.module.js +0 -23
- package/dist-server/domain/thread/thread.service.js +0 -419
- package/dist-server/domain/usage/usage.controller.js +0 -118
- package/dist-server/domain/usage/usage.module.js +0 -21
- package/dist-server/domain/usage/usage.service.js +0 -358
- package/dist-server/domain/usage/usage.types.js +0 -4
- package/dist-server/domain/wbs/wbs.controller.js +0 -51
- package/dist-server/domain/wbs/wbs.module.js +0 -21
- package/dist-server/domain/wbs/wbs.service.js +0 -94
- package/dist-server/domain/workflow/workflow.controller.js +0 -53
- package/dist-server/domain/workflow/workflow.module.js +0 -21
- package/dist-server/domain/workflow/workflow.service.js +0 -209
- package/dist-server/domain/workspace/dto/create-workspace.dto.js +0 -45
- package/dist-server/domain/workspace/dto/switch-workspace.dto.js +0 -32
- package/dist-server/domain/workspace/dto/workspace-info.dto.js +0 -2
- package/dist-server/domain/workspace/workspace.controller.js +0 -98
- package/dist-server/domain/workspace/workspace.module.js +0 -22
- package/dist-server/domain/workspace/workspace.service.js +0 -198
- package/dist-server/main.js +0 -204
- package/dist-server/modules/crewx-pool.service.js +0 -75
- package/dist-server/modules/crewx.module.js +0 -47
- package/dist-server/repository/base-sqlite.repository.js +0 -18
- package/dist-server/repository/box.repository.js +0 -99
- package/dist-server/repository/message.repository.js +0 -22
- package/dist-server/repository/project.repository.js +0 -51
- package/dist-server/repository/repository.module.js +0 -34
- package/dist-server/repository/request-log.repository.js +0 -96
- package/dist-server/repository/task.repository.js +0 -105
- package/dist-server/repository/thread.repository.js +0 -165
- package/dist-server/shared/crewx-home.js +0 -58
- package/dist-server/shared/crewx-state.js +0 -66
- package/dist-server/test-utils/compat-database.js +0 -30
- package/dist-server/utils/tokenizer.js +0 -8
|
@@ -1,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);
|