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,358 +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 UsageService_1;
|
|
45
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.UsageService = void 0;
|
|
47
|
-
const common_1 = require("@nestjs/common");
|
|
48
|
-
const data_loader_1 = require("ccusage/data-loader");
|
|
49
|
-
const task_repository_js_1 = require("../../repository/task.repository.js");
|
|
50
|
-
const project_repository_js_1 = require("../../repository/project.repository.js");
|
|
51
|
-
const CACHE_TTL = 5 * 60 * 1000; // 5분
|
|
52
|
-
const CACHE_MAX_SIZE = 10;
|
|
53
|
-
const CACHE_CLEANUP_INTERVAL = 5 * 60 * 1000; // 5분
|
|
54
|
-
let UsageService = UsageService_1 = class UsageService {
|
|
55
|
-
taskRepository;
|
|
56
|
-
projectRepository;
|
|
57
|
-
logger = new common_1.Logger(UsageService_1.name);
|
|
58
|
-
cache = new Map();
|
|
59
|
-
cleanupInterval;
|
|
60
|
-
constructor(taskRepository, projectRepository) {
|
|
61
|
-
this.taskRepository = taskRepository;
|
|
62
|
-
this.projectRepository = projectRepository;
|
|
63
|
-
this.cleanupInterval = setInterval(() => this.evictExpired(), CACHE_CLEANUP_INTERVAL);
|
|
64
|
-
}
|
|
65
|
-
onModuleDestroy() {
|
|
66
|
-
clearInterval(this.cleanupInterval);
|
|
67
|
-
}
|
|
68
|
-
async getDailyUsage(provider, force) {
|
|
69
|
-
const cacheKey = `daily:${provider}`;
|
|
70
|
-
if (!force) {
|
|
71
|
-
const cached = this.getFromCache(cacheKey);
|
|
72
|
-
if (cached)
|
|
73
|
-
return { data: cached, cached: true };
|
|
74
|
-
}
|
|
75
|
-
const data = await this.loadDaily(provider);
|
|
76
|
-
this.setCache(cacheKey, data);
|
|
77
|
-
return { data, cached: false };
|
|
78
|
-
}
|
|
79
|
-
async getMonthlyUsage(provider, force) {
|
|
80
|
-
const cacheKey = `monthly:${provider}`;
|
|
81
|
-
if (!force) {
|
|
82
|
-
const cached = this.getFromCache(cacheKey);
|
|
83
|
-
if (cached)
|
|
84
|
-
return { data: cached, cached: true };
|
|
85
|
-
}
|
|
86
|
-
const data = await this.loadMonthly(provider);
|
|
87
|
-
this.setCache(cacheKey, data);
|
|
88
|
-
return { data, cached: false };
|
|
89
|
-
}
|
|
90
|
-
async loadDaily(provider) {
|
|
91
|
-
const warnings = [];
|
|
92
|
-
if (provider === 'all') {
|
|
93
|
-
const [claude, codex] = await Promise.all([
|
|
94
|
-
this.loadClaudeDailyData(warnings),
|
|
95
|
-
this.loadCodexDailyData(warnings),
|
|
96
|
-
]);
|
|
97
|
-
const daily = [
|
|
98
|
-
...claude.map((d) => this.mapDailyUsage(d, 'claude')),
|
|
99
|
-
...codex.map((d) => this.mapDailyUsage(d, 'codex')),
|
|
100
|
-
];
|
|
101
|
-
return { provider: 'all', daily, totals: this.calculateTotals(daily), warnings };
|
|
102
|
-
}
|
|
103
|
-
const loader = provider === 'claude' ? this.loadClaudeDailyData(warnings) : this.loadCodexDailyData(warnings);
|
|
104
|
-
const raw = await loader;
|
|
105
|
-
const daily = raw.map((d) => this.mapDailyUsage(d, provider));
|
|
106
|
-
return { provider, daily, totals: this.calculateTotals(daily), warnings };
|
|
107
|
-
}
|
|
108
|
-
async loadMonthly(provider) {
|
|
109
|
-
const warnings = [];
|
|
110
|
-
if (provider === 'all') {
|
|
111
|
-
const [claude, codex] = await Promise.all([
|
|
112
|
-
this.loadClaudeMonthlyData(warnings),
|
|
113
|
-
this.loadCodexMonthlyData(warnings),
|
|
114
|
-
]);
|
|
115
|
-
const monthly = [
|
|
116
|
-
...claude.map((m) => this.mapMonthlyUsage(m, 'claude')),
|
|
117
|
-
...codex.map((m) => this.mapMonthlyUsage(m, 'codex')),
|
|
118
|
-
];
|
|
119
|
-
return { provider: 'all', monthly, totals: this.calculateTotals(monthly), warnings };
|
|
120
|
-
}
|
|
121
|
-
const loader = provider === 'claude' ? this.loadClaudeMonthlyData(warnings) : this.loadCodexMonthlyData(warnings);
|
|
122
|
-
const raw = await loader;
|
|
123
|
-
const monthly = raw.map((m) => this.mapMonthlyUsage(m, provider));
|
|
124
|
-
return { provider, monthly, totals: this.calculateTotals(monthly), warnings };
|
|
125
|
-
}
|
|
126
|
-
// --- USG.AGENT: Agent usage aggregation ---
|
|
127
|
-
getAgentUsage(from, to, workspace) {
|
|
128
|
-
const rows = this.taskRepository.getAgentUsage(from, to, workspace);
|
|
129
|
-
const wsNameMap = this.resolveWorkspaceNames(rows.map((r) => r.workspace_id).filter((id) => id !== null));
|
|
130
|
-
const grandTotalTokens = rows.reduce((sum, r) => sum + r.total_tokens, 0);
|
|
131
|
-
const agents = rows.map((r) => ({
|
|
132
|
-
agentId: r.agent_id,
|
|
133
|
-
workspaceId: r.workspace_id,
|
|
134
|
-
workspaceName: r.workspace_id ? (wsNameMap.get(r.workspace_id) ?? null) : null,
|
|
135
|
-
provider: r.provider,
|
|
136
|
-
totalTokens: r.total_tokens,
|
|
137
|
-
inputTokens: r.input_tokens,
|
|
138
|
-
outputTokens: r.output_tokens,
|
|
139
|
-
totalCost: r.total_cost,
|
|
140
|
-
taskCount: r.task_count,
|
|
141
|
-
activeDurationMs: r.active_duration_ms,
|
|
142
|
-
sharePercent: grandTotalTokens > 0
|
|
143
|
-
? Math.round((r.total_tokens / grandTotalTokens) * 10000) / 100
|
|
144
|
-
: 0,
|
|
145
|
-
lastActiveAt: r.last_active_at,
|
|
146
|
-
}));
|
|
147
|
-
const totals = {
|
|
148
|
-
totalTokens: grandTotalTokens,
|
|
149
|
-
totalCost: rows.reduce((sum, r) => sum + r.total_cost, 0),
|
|
150
|
-
totalTasks: rows.reduce((sum, r) => sum + r.task_count, 0),
|
|
151
|
-
totalActiveDurationMs: rows.reduce((sum, r) => sum + r.active_duration_ms, 0),
|
|
152
|
-
};
|
|
153
|
-
return { from, to, agents, totals };
|
|
154
|
-
}
|
|
155
|
-
// --- USG.AGENT.TREND: Agent daily trend ---
|
|
156
|
-
getAgentUsageTrend(from, to, tz, workspace) {
|
|
157
|
-
const rows = this.taskRepository.getAgentUsageTrendRaw(from, to, workspace);
|
|
158
|
-
// Group by local date (tz-converted) × agent_id
|
|
159
|
-
const dailyMap = new Map();
|
|
160
|
-
for (const row of rows) {
|
|
161
|
-
const localDate = this.utcToLocalDate(row.started_at, tz);
|
|
162
|
-
let agentMap = dailyMap.get(localDate);
|
|
163
|
-
if (!agentMap) {
|
|
164
|
-
agentMap = new Map();
|
|
165
|
-
dailyMap.set(localDate, agentMap);
|
|
166
|
-
}
|
|
167
|
-
const existing = agentMap.get(row.agent_id);
|
|
168
|
-
const tokens = row.input_tokens + row.output_tokens;
|
|
169
|
-
if (existing) {
|
|
170
|
-
existing.totalTokens += tokens;
|
|
171
|
-
existing.taskCount += 1;
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
agentMap.set(row.agent_id, { totalTokens: tokens, taskCount: 1 });
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
// Convert to sorted array
|
|
178
|
-
const daily = Array.from(dailyMap.entries())
|
|
179
|
-
.sort(([a], [b]) => a.localeCompare(b))
|
|
180
|
-
.map(([date, agentMap]) => ({
|
|
181
|
-
date,
|
|
182
|
-
agents: Array.from(agentMap.entries())
|
|
183
|
-
.map(([agentId, data]) => ({
|
|
184
|
-
agentId,
|
|
185
|
-
totalTokens: data.totalTokens,
|
|
186
|
-
taskCount: data.taskCount,
|
|
187
|
-
}))
|
|
188
|
-
.sort((a, b) => b.totalTokens - a.totalTokens),
|
|
189
|
-
}));
|
|
190
|
-
return { from, to, timezone: tz, daily };
|
|
191
|
-
}
|
|
192
|
-
/** Convert UTC ISO string to local date string (YYYY-MM-DD) using timezone. */
|
|
193
|
-
utcToLocalDate(utcIso, tz) {
|
|
194
|
-
try {
|
|
195
|
-
const date = new Date(utcIso);
|
|
196
|
-
// Intl.DateTimeFormat gives locale-aware date parts
|
|
197
|
-
const formatter = new Intl.DateTimeFormat('en-CA', {
|
|
198
|
-
timeZone: tz,
|
|
199
|
-
year: 'numeric',
|
|
200
|
-
month: '2-digit',
|
|
201
|
-
day: '2-digit',
|
|
202
|
-
});
|
|
203
|
-
return formatter.format(date); // "YYYY-MM-DD" in en-CA locale
|
|
204
|
-
}
|
|
205
|
-
catch {
|
|
206
|
-
// Fallback: just extract date part from UTC
|
|
207
|
-
return utcIso.slice(0, 10);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
// --- Data mapping: ccusage → DTO ---
|
|
211
|
-
mapDailyUsage(raw, provider) {
|
|
212
|
-
return {
|
|
213
|
-
date: raw.date,
|
|
214
|
-
provider,
|
|
215
|
-
inputTokens: raw.inputTokens ?? 0,
|
|
216
|
-
outputTokens: raw.outputTokens ?? 0,
|
|
217
|
-
cacheCreationTokens: raw.cacheCreationTokens ?? 0,
|
|
218
|
-
cacheReadTokens: raw.cacheReadTokens ?? 0,
|
|
219
|
-
totalTokens: (raw.inputTokens ?? 0) + (raw.outputTokens ?? 0) + (raw.cacheCreationTokens ?? 0) + (raw.cacheReadTokens ?? 0),
|
|
220
|
-
totalCost: raw.totalCost ?? 0,
|
|
221
|
-
modelsUsed: raw.modelsUsed ?? [],
|
|
222
|
-
modelBreakdowns: (raw.modelBreakdowns ?? []).map(this.mapModelBreakdown),
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
mapMonthlyUsage(raw, provider) {
|
|
226
|
-
return {
|
|
227
|
-
month: raw.month,
|
|
228
|
-
provider,
|
|
229
|
-
inputTokens: raw.inputTokens ?? 0,
|
|
230
|
-
outputTokens: raw.outputTokens ?? 0,
|
|
231
|
-
cacheCreationTokens: raw.cacheCreationTokens ?? 0,
|
|
232
|
-
cacheReadTokens: raw.cacheReadTokens ?? 0,
|
|
233
|
-
totalTokens: (raw.inputTokens ?? 0) + (raw.outputTokens ?? 0) + (raw.cacheCreationTokens ?? 0) + (raw.cacheReadTokens ?? 0),
|
|
234
|
-
totalCost: raw.totalCost ?? 0,
|
|
235
|
-
modelBreakdowns: (raw.modelBreakdowns ?? []).map(this.mapModelBreakdown),
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
mapModelBreakdown(raw) {
|
|
239
|
-
return {
|
|
240
|
-
modelName: raw.modelName ?? '',
|
|
241
|
-
inputTokens: raw.inputTokens ?? 0,
|
|
242
|
-
outputTokens: raw.outputTokens ?? 0,
|
|
243
|
-
cacheCreationTokens: raw.cacheCreationTokens ?? 0,
|
|
244
|
-
cacheReadTokens: raw.cacheReadTokens ?? 0,
|
|
245
|
-
cost: raw.cost ?? 0,
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
// --- Data loaders with warnings ---
|
|
249
|
-
async loadClaudeDailyData(warnings) {
|
|
250
|
-
try {
|
|
251
|
-
return await (0, data_loader_1.loadDailyUsageData)();
|
|
252
|
-
}
|
|
253
|
-
catch (error) {
|
|
254
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
255
|
-
this.logger.warn(`Failed to load claude daily data: ${message}`);
|
|
256
|
-
warnings.push(`Failed to load claude data: ${message}`);
|
|
257
|
-
return [];
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
async loadCodexDailyData(warnings) {
|
|
261
|
-
try {
|
|
262
|
-
const { loadDailyUsageData } = await Promise.resolve().then(() => __importStar(require('@ccusage/codex')));
|
|
263
|
-
return await loadDailyUsageData();
|
|
264
|
-
}
|
|
265
|
-
catch (error) {
|
|
266
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
267
|
-
this.logger.debug(`Failed to load codex daily data: ${message}`);
|
|
268
|
-
warnings.push(`Failed to load codex data: ${message}`);
|
|
269
|
-
return [];
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
async loadClaudeMonthlyData(warnings) {
|
|
273
|
-
try {
|
|
274
|
-
return await (0, data_loader_1.loadMonthlyUsageData)();
|
|
275
|
-
}
|
|
276
|
-
catch (error) {
|
|
277
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
278
|
-
this.logger.warn(`Failed to load claude monthly data: ${message}`);
|
|
279
|
-
warnings.push(`Failed to load claude data: ${message}`);
|
|
280
|
-
return [];
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
async loadCodexMonthlyData(warnings) {
|
|
284
|
-
try {
|
|
285
|
-
const { loadMonthlyUsageData } = await Promise.resolve().then(() => __importStar(require('@ccusage/codex')));
|
|
286
|
-
return await loadMonthlyUsageData();
|
|
287
|
-
}
|
|
288
|
-
catch (error) {
|
|
289
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
290
|
-
this.logger.debug(`Failed to load codex monthly data: ${message}`);
|
|
291
|
-
warnings.push(`Failed to load codex data: ${message}`);
|
|
292
|
-
return [];
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
// --- Totals calculation ---
|
|
296
|
-
calculateTotals(items) {
|
|
297
|
-
return items.reduce((acc, d) => ({
|
|
298
|
-
totalCost: acc.totalCost + d.totalCost,
|
|
299
|
-
totalTokens: acc.totalTokens + d.inputTokens + d.outputTokens,
|
|
300
|
-
totalInputTokens: acc.totalInputTokens + d.inputTokens,
|
|
301
|
-
totalOutputTokens: acc.totalOutputTokens + d.outputTokens,
|
|
302
|
-
}), { totalCost: 0, totalTokens: 0, totalInputTokens: 0, totalOutputTokens: 0 });
|
|
303
|
-
}
|
|
304
|
-
// --- Workspace name resolution ---
|
|
305
|
-
resolveWorkspaceNames(workspaceIds) {
|
|
306
|
-
const unique = [...new Set(workspaceIds)];
|
|
307
|
-
const map = new Map();
|
|
308
|
-
for (const id of unique) {
|
|
309
|
-
const row = this.projectRepository.findById(id);
|
|
310
|
-
map.set(id, row?.name ?? id);
|
|
311
|
-
}
|
|
312
|
-
return map;
|
|
313
|
-
}
|
|
314
|
-
// --- Cache with size limit ---
|
|
315
|
-
getFromCache(key) {
|
|
316
|
-
const entry = this.cache.get(key);
|
|
317
|
-
if (!entry)
|
|
318
|
-
return null;
|
|
319
|
-
if (Date.now() - entry.timestamp > CACHE_TTL) {
|
|
320
|
-
this.cache.delete(key);
|
|
321
|
-
return null;
|
|
322
|
-
}
|
|
323
|
-
return entry.data;
|
|
324
|
-
}
|
|
325
|
-
setCache(key, data) {
|
|
326
|
-
if (this.cache.size >= CACHE_MAX_SIZE && !this.cache.has(key)) {
|
|
327
|
-
const oldestKey = this.findOldestKey();
|
|
328
|
-
if (oldestKey)
|
|
329
|
-
this.cache.delete(oldestKey);
|
|
330
|
-
}
|
|
331
|
-
this.cache.set(key, { data, timestamp: Date.now() });
|
|
332
|
-
}
|
|
333
|
-
findOldestKey() {
|
|
334
|
-
let oldestKey = null;
|
|
335
|
-
let oldestTime = Infinity;
|
|
336
|
-
for (const [key, entry] of this.cache) {
|
|
337
|
-
if (entry.timestamp < oldestTime) {
|
|
338
|
-
oldestTime = entry.timestamp;
|
|
339
|
-
oldestKey = key;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
return oldestKey;
|
|
343
|
-
}
|
|
344
|
-
evictExpired() {
|
|
345
|
-
const now = Date.now();
|
|
346
|
-
for (const [key, entry] of this.cache) {
|
|
347
|
-
if (now - entry.timestamp > CACHE_TTL) {
|
|
348
|
-
this.cache.delete(key);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
};
|
|
353
|
-
exports.UsageService = UsageService;
|
|
354
|
-
exports.UsageService = UsageService = UsageService_1 = __decorate([
|
|
355
|
-
(0, common_1.Injectable)(),
|
|
356
|
-
__metadata("design:paramtypes", [task_repository_js_1.TaskRepository,
|
|
357
|
-
project_repository_js_1.ProjectRepository])
|
|
358
|
-
], UsageService);
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.WbsController = void 0;
|
|
16
|
-
const common_1 = require("@nestjs/common");
|
|
17
|
-
const wbs_service_js_1 = require("./wbs.service.js");
|
|
18
|
-
let WbsController = class WbsController {
|
|
19
|
-
wbsService;
|
|
20
|
-
constructor(wbsService) {
|
|
21
|
-
this.wbsService = wbsService;
|
|
22
|
-
}
|
|
23
|
-
// WBS001: List all WBS projects with status summary
|
|
24
|
-
async listProjects() {
|
|
25
|
-
const data = await this.wbsService.listProjects();
|
|
26
|
-
return { success: true, data };
|
|
27
|
-
}
|
|
28
|
-
// WBS002: Get WBS project detail with jobs
|
|
29
|
-
async getProject(id) {
|
|
30
|
-
const data = await this.wbsService.getProject(id);
|
|
31
|
-
return { success: true, data };
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
exports.WbsController = WbsController;
|
|
35
|
-
__decorate([
|
|
36
|
-
(0, common_1.Get)(),
|
|
37
|
-
__metadata("design:type", Function),
|
|
38
|
-
__metadata("design:paramtypes", []),
|
|
39
|
-
__metadata("design:returntype", Promise)
|
|
40
|
-
], WbsController.prototype, "listProjects", null);
|
|
41
|
-
__decorate([
|
|
42
|
-
(0, common_1.Get)(':id'),
|
|
43
|
-
__param(0, (0, common_1.Param)('id')),
|
|
44
|
-
__metadata("design:type", Function),
|
|
45
|
-
__metadata("design:paramtypes", [String]),
|
|
46
|
-
__metadata("design:returntype", Promise)
|
|
47
|
-
], WbsController.prototype, "getProject", null);
|
|
48
|
-
exports.WbsController = WbsController = __decorate([
|
|
49
|
-
(0, common_1.Controller)('ws/:slug/wbs'),
|
|
50
|
-
__metadata("design:paramtypes", [wbs_service_js_1.WbsService])
|
|
51
|
-
], WbsController);
|
|
@@ -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.WbsModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const wbs_controller_js_1 = require("./wbs.controller.js");
|
|
12
|
-
const wbs_service_js_1 = require("./wbs.service.js");
|
|
13
|
-
let WbsModule = class WbsModule {
|
|
14
|
-
};
|
|
15
|
-
exports.WbsModule = WbsModule;
|
|
16
|
-
exports.WbsModule = WbsModule = __decorate([
|
|
17
|
-
(0, common_1.Module)({
|
|
18
|
-
controllers: [wbs_controller_js_1.WbsController],
|
|
19
|
-
providers: [wbs_service_js_1.WbsService],
|
|
20
|
-
})
|
|
21
|
-
], WbsModule);
|
|
@@ -1,94 +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 WbsService_1;
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.WbsService = void 0;
|
|
11
|
-
const common_1 = require("@nestjs/common");
|
|
12
|
-
const promises_1 = require("fs/promises");
|
|
13
|
-
const fs_1 = require("fs");
|
|
14
|
-
const path_1 = require("path");
|
|
15
|
-
const workspace_context_store_js_1 = require("../../common/workspace-context.store.js");
|
|
16
|
-
let WbsService = WbsService_1 = class WbsService {
|
|
17
|
-
logger = new common_1.Logger(WbsService_1.name);
|
|
18
|
-
get dataPath() {
|
|
19
|
-
return (0, path_1.join)((0, workspace_context_store_js_1.getWorkspacePath)(), '.crewx', '.wbs-data.json');
|
|
20
|
-
}
|
|
21
|
-
async readData() {
|
|
22
|
-
this.logger.debug(`Reading WBS data from: ${this.dataPath}`);
|
|
23
|
-
if (!(0, fs_1.existsSync)(this.dataPath)) {
|
|
24
|
-
this.logger.debug('WBS data file not found');
|
|
25
|
-
return { wbs: [], jobs: [], executions: [] };
|
|
26
|
-
}
|
|
27
|
-
try {
|
|
28
|
-
const raw = await (0, promises_1.readFile)(this.dataPath, 'utf-8');
|
|
29
|
-
const data = JSON.parse(raw);
|
|
30
|
-
this.logger.debug(`WBS data loaded: ${data.wbs?.length} projects, ${data.jobs?.length} jobs`);
|
|
31
|
-
return data;
|
|
32
|
-
}
|
|
33
|
-
catch (err) {
|
|
34
|
-
this.logger.error(`Failed to read WBS data: ${err}`);
|
|
35
|
-
return { wbs: [], jobs: [], executions: [] };
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
computeSummary(jobs) {
|
|
39
|
-
const total = jobs.length;
|
|
40
|
-
const pending = jobs.filter((j) => j.status === 'pending').length;
|
|
41
|
-
const running = jobs.filter((j) => j.status === 'running').length;
|
|
42
|
-
const completed = jobs.filter((j) => j.status === 'completed').length;
|
|
43
|
-
const failed = jobs.filter((j) => j.status === 'failed').length;
|
|
44
|
-
const progress = total > 0 ? Math.round((completed / total) * 100) : 0;
|
|
45
|
-
return { total, pending, running, completed, failed, progress };
|
|
46
|
-
}
|
|
47
|
-
// jobs 상태 기반으로 프로젝트 상태 자동 계산
|
|
48
|
-
deriveProjectStatus(project, summary) {
|
|
49
|
-
if (project.status === 'on_hold')
|
|
50
|
-
return 'on_hold'; // 수동 설정은 존중
|
|
51
|
-
if (summary.total === 0)
|
|
52
|
-
return 'planning';
|
|
53
|
-
if (summary.completed === summary.total)
|
|
54
|
-
return 'completed';
|
|
55
|
-
if (summary.running > 0)
|
|
56
|
-
return 'running';
|
|
57
|
-
if (summary.failed > 0 && summary.completed > 0)
|
|
58
|
-
return 'partial';
|
|
59
|
-
if (summary.failed > 0)
|
|
60
|
-
return 'partial';
|
|
61
|
-
if (summary.completed > 0 && summary.pending > 0)
|
|
62
|
-
return 'partial';
|
|
63
|
-
return project.status;
|
|
64
|
-
}
|
|
65
|
-
async listProjects() {
|
|
66
|
-
const data = await this.readData();
|
|
67
|
-
const projects = data.wbs.map((project) => {
|
|
68
|
-
const jobs = data.jobs.filter((j) => j.wbs_id === project.id);
|
|
69
|
-
const summary = this.computeSummary(jobs);
|
|
70
|
-
const status = this.deriveProjectStatus(project, summary);
|
|
71
|
-
return { ...project, status, summary };
|
|
72
|
-
});
|
|
73
|
-
return { projects, total: projects.length };
|
|
74
|
-
}
|
|
75
|
-
async getProject(id) {
|
|
76
|
-
const data = await this.readData();
|
|
77
|
-
const project = data.wbs.find((p) => p.id === id);
|
|
78
|
-
if (!project) {
|
|
79
|
-
throw new common_1.NotFoundException(`WBS project '${id}' not found`);
|
|
80
|
-
}
|
|
81
|
-
const jobs = data.jobs
|
|
82
|
-
.filter((j) => j.wbs_id === id)
|
|
83
|
-
.sort((a, b) => a.seq - b.seq);
|
|
84
|
-
const jobIds = new Set(jobs.map((j) => j.id));
|
|
85
|
-
const executions = data.executions.filter((e) => jobIds.has(e.job_id));
|
|
86
|
-
const summary = this.computeSummary(jobs);
|
|
87
|
-
const status = this.deriveProjectStatus(project, summary);
|
|
88
|
-
return { project: { ...project, status }, jobs, executions, summary };
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
exports.WbsService = WbsService;
|
|
92
|
-
exports.WbsService = WbsService = WbsService_1 = __decorate([
|
|
93
|
-
(0, common_1.Injectable)()
|
|
94
|
-
], WbsService);
|
|
@@ -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
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.WorkflowController = void 0;
|
|
16
|
-
const common_1 = require("@nestjs/common");
|
|
17
|
-
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
-
const workflow_service_js_1 = require("./workflow.service.js");
|
|
19
|
-
let WorkflowController = class WorkflowController {
|
|
20
|
-
workflowService;
|
|
21
|
-
constructor(workflowService) {
|
|
22
|
-
this.workflowService = workflowService;
|
|
23
|
-
}
|
|
24
|
-
async listWorkflows() {
|
|
25
|
-
const data = await this.workflowService.listWorkflows();
|
|
26
|
-
return { success: true, data };
|
|
27
|
-
}
|
|
28
|
-
async getWorkflow(id) {
|
|
29
|
-
const data = await this.workflowService.getWorkflow(id);
|
|
30
|
-
return { success: true, data };
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
exports.WorkflowController = WorkflowController;
|
|
34
|
-
__decorate([
|
|
35
|
-
(0, swagger_1.ApiOperation)({ operationId: 'WFL.LIST', summary: 'List all workflows' }),
|
|
36
|
-
(0, common_1.Get)(),
|
|
37
|
-
__metadata("design:type", Function),
|
|
38
|
-
__metadata("design:paramtypes", []),
|
|
39
|
-
__metadata("design:returntype", Promise)
|
|
40
|
-
], WorkflowController.prototype, "listWorkflows", null);
|
|
41
|
-
__decorate([
|
|
42
|
-
(0, swagger_1.ApiOperation)({ operationId: 'WFL.GET', summary: 'Get workflow detail with mermaid diagram' }),
|
|
43
|
-
(0, common_1.Get)(':id'),
|
|
44
|
-
__param(0, (0, common_1.Param)('id')),
|
|
45
|
-
__metadata("design:type", Function),
|
|
46
|
-
__metadata("design:paramtypes", [String]),
|
|
47
|
-
__metadata("design:returntype", Promise)
|
|
48
|
-
], WorkflowController.prototype, "getWorkflow", null);
|
|
49
|
-
exports.WorkflowController = WorkflowController = __decorate([
|
|
50
|
-
(0, swagger_1.ApiTags)('workflows'),
|
|
51
|
-
(0, common_1.Controller)('ws/:slug/workflows'),
|
|
52
|
-
__metadata("design:paramtypes", [workflow_service_js_1.WorkflowService])
|
|
53
|
-
], WorkflowController);
|
|
@@ -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.WorkflowModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const workflow_controller_js_1 = require("./workflow.controller.js");
|
|
12
|
-
const workflow_service_js_1 = require("./workflow.service.js");
|
|
13
|
-
let WorkflowModule = class WorkflowModule {
|
|
14
|
-
};
|
|
15
|
-
exports.WorkflowModule = WorkflowModule;
|
|
16
|
-
exports.WorkflowModule = WorkflowModule = __decorate([
|
|
17
|
-
(0, common_1.Module)({
|
|
18
|
-
controllers: [workflow_controller_js_1.WorkflowController],
|
|
19
|
-
providers: [workflow_service_js_1.WorkflowService],
|
|
20
|
-
})
|
|
21
|
-
], WorkflowModule);
|