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,122 +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.KnowledgeController = void 0;
|
|
16
|
-
const common_1 = require("@nestjs/common");
|
|
17
|
-
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
-
const knowledge_service_js_1 = require("./knowledge.service.js");
|
|
19
|
-
const knowledge_dto_js_1 = require("./dto/knowledge.dto.js");
|
|
20
|
-
const graph_knowledge_dto_js_1 = require("./dto/graph-knowledge.dto.js");
|
|
21
|
-
let KnowledgeController = class KnowledgeController {
|
|
22
|
-
knowledgeService;
|
|
23
|
-
constructor(knowledgeService) {
|
|
24
|
-
this.knowledgeService = knowledgeService;
|
|
25
|
-
}
|
|
26
|
-
// KNW007: List available agents (must be before :id to avoid route conflict)
|
|
27
|
-
listAgents() {
|
|
28
|
-
const agents = this.knowledgeService.listAgents();
|
|
29
|
-
return { success: true, data: agents };
|
|
30
|
-
}
|
|
31
|
-
// KNW.SEARCH: Search (must be before :id to avoid route conflict)
|
|
32
|
-
async searchEntries(query) {
|
|
33
|
-
const data = await this.knowledgeService.searchEntries(query);
|
|
34
|
-
return { success: true, data };
|
|
35
|
-
}
|
|
36
|
-
// KNW.GRAPH: Graph data (must be before :id to avoid route conflict)
|
|
37
|
-
getGraph(query) {
|
|
38
|
-
const data = this.knowledgeService.getGraph(query);
|
|
39
|
-
return { success: true, data };
|
|
40
|
-
}
|
|
41
|
-
// KNW.SYNC: Sync status (must be before :id to avoid route conflict)
|
|
42
|
-
getSyncStatus() {
|
|
43
|
-
const data = this.knowledgeService.getSyncStatus();
|
|
44
|
-
return { success: true, data };
|
|
45
|
-
}
|
|
46
|
-
// KNW.SUMMARY: Agent summary (must be before :id to avoid route conflict)
|
|
47
|
-
getAgentSummary(query) {
|
|
48
|
-
const data = this.knowledgeService.getAgentSummary(query);
|
|
49
|
-
return { success: true, data };
|
|
50
|
-
}
|
|
51
|
-
// KNW.LIST: List entries
|
|
52
|
-
listEntries(query) {
|
|
53
|
-
const data = this.knowledgeService.listEntries(query);
|
|
54
|
-
return { success: true, data };
|
|
55
|
-
}
|
|
56
|
-
// KNW.GET: Get entry detail
|
|
57
|
-
getEntry(id, query) {
|
|
58
|
-
const data = this.knowledgeService.getEntry(id, query);
|
|
59
|
-
return { success: true, data };
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
exports.KnowledgeController = KnowledgeController;
|
|
63
|
-
__decorate([
|
|
64
|
-
(0, swagger_1.ApiOperation)({ operationId: 'KNW.AGENTS', summary: 'List available agents for knowledge' }),
|
|
65
|
-
(0, common_1.Get)('agents'),
|
|
66
|
-
__metadata("design:type", Function),
|
|
67
|
-
__metadata("design:paramtypes", []),
|
|
68
|
-
__metadata("design:returntype", void 0)
|
|
69
|
-
], KnowledgeController.prototype, "listAgents", null);
|
|
70
|
-
__decorate([
|
|
71
|
-
(0, swagger_1.ApiOperation)({ operationId: 'KNW.SEARCH', summary: 'Search knowledge entries' }),
|
|
72
|
-
(0, common_1.Get)('search'),
|
|
73
|
-
__param(0, (0, common_1.Query)()),
|
|
74
|
-
__metadata("design:type", Function),
|
|
75
|
-
__metadata("design:paramtypes", [knowledge_dto_js_1.SearchKnowledgeDto]),
|
|
76
|
-
__metadata("design:returntype", Promise)
|
|
77
|
-
], KnowledgeController.prototype, "searchEntries", null);
|
|
78
|
-
__decorate([
|
|
79
|
-
(0, swagger_1.ApiOperation)({ operationId: 'KNW.GRAPH', summary: 'Get knowledge graph data' }),
|
|
80
|
-
(0, common_1.Get)('graph'),
|
|
81
|
-
__param(0, (0, common_1.Query)()),
|
|
82
|
-
__metadata("design:type", Function),
|
|
83
|
-
__metadata("design:paramtypes", [graph_knowledge_dto_js_1.GraphKnowledgeDto]),
|
|
84
|
-
__metadata("design:returntype", void 0)
|
|
85
|
-
], KnowledgeController.prototype, "getGraph", null);
|
|
86
|
-
__decorate([
|
|
87
|
-
(0, swagger_1.ApiOperation)({ operationId: 'KNW.SYNC', summary: 'Get knowledge sync status' }),
|
|
88
|
-
(0, common_1.Get)('sync-status'),
|
|
89
|
-
__metadata("design:type", Function),
|
|
90
|
-
__metadata("design:paramtypes", []),
|
|
91
|
-
__metadata("design:returntype", void 0)
|
|
92
|
-
], KnowledgeController.prototype, "getSyncStatus", null);
|
|
93
|
-
__decorate([
|
|
94
|
-
(0, swagger_1.ApiOperation)({ operationId: 'KNW.SUMMARY', summary: 'Get agent knowledge summary' }),
|
|
95
|
-
(0, common_1.Get)('summary'),
|
|
96
|
-
__param(0, (0, common_1.Query)()),
|
|
97
|
-
__metadata("design:type", Function),
|
|
98
|
-
__metadata("design:paramtypes", [knowledge_dto_js_1.SummaryKnowledgeDto]),
|
|
99
|
-
__metadata("design:returntype", void 0)
|
|
100
|
-
], KnowledgeController.prototype, "getAgentSummary", null);
|
|
101
|
-
__decorate([
|
|
102
|
-
(0, swagger_1.ApiOperation)({ operationId: 'KNW.LIST', summary: 'List knowledge entries' }),
|
|
103
|
-
(0, common_1.Get)(),
|
|
104
|
-
__param(0, (0, common_1.Query)()),
|
|
105
|
-
__metadata("design:type", Function),
|
|
106
|
-
__metadata("design:paramtypes", [knowledge_dto_js_1.ListKnowledgeDto]),
|
|
107
|
-
__metadata("design:returntype", void 0)
|
|
108
|
-
], KnowledgeController.prototype, "listEntries", null);
|
|
109
|
-
__decorate([
|
|
110
|
-
(0, swagger_1.ApiOperation)({ operationId: 'KNW.GET', summary: 'Get knowledge entry detail' }),
|
|
111
|
-
(0, common_1.Get)(':id'),
|
|
112
|
-
__param(0, (0, common_1.Param)('id')),
|
|
113
|
-
__param(1, (0, common_1.Query)()),
|
|
114
|
-
__metadata("design:type", Function),
|
|
115
|
-
__metadata("design:paramtypes", [String, knowledge_dto_js_1.GetKnowledgeDto]),
|
|
116
|
-
__metadata("design:returntype", void 0)
|
|
117
|
-
], KnowledgeController.prototype, "getEntry", null);
|
|
118
|
-
exports.KnowledgeController = KnowledgeController = __decorate([
|
|
119
|
-
(0, swagger_1.ApiTags)('knowledge'),
|
|
120
|
-
(0, common_1.Controller)('ws/:slug/knowledge'),
|
|
121
|
-
__metadata("design:paramtypes", [knowledge_service_js_1.KnowledgeService])
|
|
122
|
-
], KnowledgeController);
|
|
@@ -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.KnowledgeModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const knowledge_controller_js_1 = require("./knowledge.controller.js");
|
|
12
|
-
const knowledge_service_js_1 = require("./knowledge.service.js");
|
|
13
|
-
let KnowledgeModule = class KnowledgeModule {
|
|
14
|
-
};
|
|
15
|
-
exports.KnowledgeModule = KnowledgeModule;
|
|
16
|
-
exports.KnowledgeModule = KnowledgeModule = __decorate([
|
|
17
|
-
(0, common_1.Module)({
|
|
18
|
-
controllers: [knowledge_controller_js_1.KnowledgeController],
|
|
19
|
-
providers: [knowledge_service_js_1.KnowledgeService],
|
|
20
|
-
})
|
|
21
|
-
], KnowledgeModule);
|
|
@@ -1,538 +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.KnowledgeService = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const fs_1 = require("fs");
|
|
12
|
-
const path_1 = require("path");
|
|
13
|
-
const knowledge_core_1 = require("@crewx/knowledge-core");
|
|
14
|
-
const search_1 = require("@crewx/search");
|
|
15
|
-
const workspace_context_store_js_1 = require("../../common/workspace-context.store.js");
|
|
16
|
-
/** Screen ID → page directory/component path mapping for code existence check */
|
|
17
|
-
const SCREEN_CODE_PATHS = {
|
|
18
|
-
NAVUI: 'src/ui/components/layout',
|
|
19
|
-
TSKUI: 'src/ui/pages/tasks',
|
|
20
|
-
AGTUI: 'src/ui/pages/agents',
|
|
21
|
-
USGUI: 'src/ui/pages/usage',
|
|
22
|
-
CLIVUI: 'src/ui/pages/cli-manager',
|
|
23
|
-
STGUI: 'src/ui/pages/settings',
|
|
24
|
-
KNWUI: 'src/ui/pages/knowledge',
|
|
25
|
-
};
|
|
26
|
-
let KnowledgeService = class KnowledgeService {
|
|
27
|
-
searchEngine = new search_1.SearchEngine();
|
|
28
|
-
// TTL memory cache for searchEntries results (WI-20260407-006, externalized via WI-008)
|
|
29
|
-
searchCache = new Map();
|
|
30
|
-
searchConfig = null;
|
|
31
|
-
get projectRoot() {
|
|
32
|
-
return (0, workspace_context_store_js_1.getWorkspacePath)();
|
|
33
|
-
}
|
|
34
|
-
getSearchConfig() {
|
|
35
|
-
if (!this.searchConfig) {
|
|
36
|
-
this.searchConfig = (0, knowledge_core_1.loadSearchConfig)(this.projectRoot);
|
|
37
|
-
}
|
|
38
|
-
return this.searchConfig;
|
|
39
|
-
}
|
|
40
|
-
get dataDir() {
|
|
41
|
-
return (0, path_1.resolve)(this.projectRoot, process.env['MEMORY_DATA_DIR'] ?? 'memory');
|
|
42
|
-
}
|
|
43
|
-
// ── Helpers ───────────────────────────────────────────────
|
|
44
|
-
getEntriesDir(agentId) {
|
|
45
|
-
return (0, path_1.join)(this.dataDir, agentId, 'entries');
|
|
46
|
-
}
|
|
47
|
-
getSummaryPath(agentId) {
|
|
48
|
-
return (0, path_1.join)(this.dataDir, agentId, 'summary.md');
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Parse frontmatter from a markdown file via knowledge-core.
|
|
52
|
-
*/
|
|
53
|
-
parseFrontmatter(raw) {
|
|
54
|
-
const { data, content } = (0, knowledge_core_1.parseFrontmatter)(raw);
|
|
55
|
-
return { frontmatter: data, body: content.trim() };
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Extract the markdown body (skipping the H1 title line if present).
|
|
59
|
-
*/
|
|
60
|
-
extractBody(rawBody) {
|
|
61
|
-
return rawBody.replace(/^#[^\n]*\n*/m, '').trim();
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Load all entries for an agent, sorted by date desc.
|
|
65
|
-
*/
|
|
66
|
-
loadEntries(agentId) {
|
|
67
|
-
const entriesDir = this.getEntriesDir(agentId);
|
|
68
|
-
if (!(0, fs_1.existsSync)(entriesDir))
|
|
69
|
-
return [];
|
|
70
|
-
const files = (0, fs_1.readdirSync)(entriesDir).filter((f) => f.endsWith('.md'));
|
|
71
|
-
const entries = [];
|
|
72
|
-
for (const file of files) {
|
|
73
|
-
const raw = (0, fs_1.readFileSync)((0, path_1.join)(entriesDir, file), 'utf-8');
|
|
74
|
-
const { frontmatter, body } = this.parseFrontmatter(raw);
|
|
75
|
-
entries.push({ ...frontmatter, _body: this.extractBody(body) });
|
|
76
|
-
}
|
|
77
|
-
// Sort by date desc
|
|
78
|
-
entries.sort((a, b) => {
|
|
79
|
-
const aTs = String(a.date ?? '');
|
|
80
|
-
const bTs = String(b.date ?? '');
|
|
81
|
-
return bTs.localeCompare(aTs);
|
|
82
|
-
});
|
|
83
|
-
return entries;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Convert loaded entry to KnowledgeEntry for knowledge-core functions.
|
|
87
|
-
*/
|
|
88
|
-
toKnowledgeEntry(entry, type = 'memory') {
|
|
89
|
-
return {
|
|
90
|
-
id: String(entry.id ?? ''),
|
|
91
|
-
type,
|
|
92
|
-
category: String(entry.category ?? 'general'),
|
|
93
|
-
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
|
94
|
-
date: String(entry.date ?? ''),
|
|
95
|
-
summary: String(entry.summary ?? ''),
|
|
96
|
-
body: entry._body,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
toListItem(entry, agentId) {
|
|
100
|
-
return {
|
|
101
|
-
id: String(entry.id ?? ''),
|
|
102
|
-
title: String(entry.summary ?? ''),
|
|
103
|
-
category: String(entry.category ?? 'general'),
|
|
104
|
-
tags: Array.isArray(entry.tags) ? entry.tags : [],
|
|
105
|
-
agent: agentId,
|
|
106
|
-
createdAt: String(entry.date ?? ''),
|
|
107
|
-
updatedAt: String(entry.updated ?? entry.date ?? ''),
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Get agents that have a data directory.
|
|
112
|
-
*/
|
|
113
|
-
listAgentIds() {
|
|
114
|
-
if (!(0, fs_1.existsSync)(this.dataDir))
|
|
115
|
-
return [];
|
|
116
|
-
return (0, fs_1.readdirSync)(this.dataDir).filter((name) => (0, fs_1.existsSync)((0, path_1.join)(this.dataDir, name, 'entries')));
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Load document entries from docs/ directory.
|
|
120
|
-
* Returns KnowledgeEntry[] with type='document'.
|
|
121
|
-
*/
|
|
122
|
-
loadDocEntries() {
|
|
123
|
-
const docsDir = (0, path_1.join)(this.projectRoot, 'docs');
|
|
124
|
-
if (!(0, fs_1.existsSync)(docsDir))
|
|
125
|
-
return [];
|
|
126
|
-
const entries = [];
|
|
127
|
-
const files = this.collectMdFiles(docsDir);
|
|
128
|
-
for (const file of files) {
|
|
129
|
-
const raw = (0, fs_1.readFileSync)(file, 'utf-8');
|
|
130
|
-
const { data, content } = (0, knowledge_core_1.parseFrontmatter)(raw);
|
|
131
|
-
// Skip files without meaningful frontmatter
|
|
132
|
-
if (!data['type'] && !data['summary'])
|
|
133
|
-
continue;
|
|
134
|
-
const relative = file.substring(docsDir.length + 1).replace(/\.md$/, '');
|
|
135
|
-
entries.push({
|
|
136
|
-
id: `doc:${relative}`,
|
|
137
|
-
type: 'document',
|
|
138
|
-
category: data['category'] || 'general',
|
|
139
|
-
tags: Array.isArray(data['tags']) ? data['tags'] : [],
|
|
140
|
-
date: data['date'] || '',
|
|
141
|
-
summary: data['summary'] || '',
|
|
142
|
-
body: content.trim(),
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
return entries;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Recursively collect .md files from a directory.
|
|
149
|
-
*/
|
|
150
|
-
collectMdFiles(dir) {
|
|
151
|
-
const results = [];
|
|
152
|
-
if (!(0, fs_1.existsSync)(dir))
|
|
153
|
-
return results;
|
|
154
|
-
const items = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
155
|
-
for (const item of items) {
|
|
156
|
-
const fullPath = (0, path_1.join)(dir, item.name);
|
|
157
|
-
if (item.isDirectory()) {
|
|
158
|
-
results.push(...this.collectMdFiles(fullPath));
|
|
159
|
-
}
|
|
160
|
-
else if (item.isFile() && item.name.endsWith('.md')) {
|
|
161
|
-
results.push(fullPath);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
return results;
|
|
165
|
-
}
|
|
166
|
-
// ── Snippet extraction ────────────────────────────────────
|
|
167
|
-
extractSnippet(body, query, maxLen = 120) {
|
|
168
|
-
const lower = body.toLowerCase();
|
|
169
|
-
const word = query.toLowerCase().split(/\s+/)[0] ?? '';
|
|
170
|
-
const idx = word ? lower.indexOf(word) : -1;
|
|
171
|
-
if (idx === -1)
|
|
172
|
-
return body.slice(0, maxLen) + (body.length > maxLen ? '...' : '');
|
|
173
|
-
const start = Math.max(0, idx - 40);
|
|
174
|
-
const end = Math.min(body.length, idx + 80);
|
|
175
|
-
const snippet = body.slice(start, end);
|
|
176
|
-
return (start > 0 ? '...' : '') + snippet + (end < body.length ? '...' : '');
|
|
177
|
-
}
|
|
178
|
-
// ── Sync status helpers ───────────────────────────────────
|
|
179
|
-
/**
|
|
180
|
-
* Parse screen ID sections from docs/설계서.md.
|
|
181
|
-
* Handles both single IDs (TSKUI001) and ranges (KNWUI001~003).
|
|
182
|
-
* Returns array of { id, name } objects.
|
|
183
|
-
*/
|
|
184
|
-
parseScreenIds(specPath) {
|
|
185
|
-
const content = (0, fs_1.readFileSync)(specPath, 'utf-8');
|
|
186
|
-
const results = [];
|
|
187
|
-
// Pattern: ### XXXUI001. 화면명 or ### XXXUI001~003. 화면명
|
|
188
|
-
const headingRe = /^###\s+([A-Z]+UI\d+(?:~\d+)?)\.\s+(.+?)(?:\s*[✅🔲⚠️].*)?$/gm;
|
|
189
|
-
let match;
|
|
190
|
-
while ((match = headingRe.exec(content)) !== null) {
|
|
191
|
-
const rawId = match[1];
|
|
192
|
-
const name = match[2].trim();
|
|
193
|
-
// Expand ranges like KNWUI001~003
|
|
194
|
-
const rangeMatch = /^([A-Z]+UI)(\d+)~(\d+)$/.exec(rawId);
|
|
195
|
-
if (rangeMatch) {
|
|
196
|
-
const prefix = rangeMatch[1];
|
|
197
|
-
const start = parseInt(rangeMatch[2], 10);
|
|
198
|
-
const end = parseInt(rangeMatch[3], 10);
|
|
199
|
-
for (let n = start; n <= end; n++) {
|
|
200
|
-
results.push({ id: `${prefix}${String(n).padStart(3, '0')}`, name });
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
results.push({ id: rawId, name });
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return results;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Check if a code component exists for the given screen ID.
|
|
211
|
-
* Maps ID prefix to a pages directory and checks for TSX files.
|
|
212
|
-
*/
|
|
213
|
-
checkCodeExists(screenId) {
|
|
214
|
-
// Extract prefix (e.g., "TSKUI" from "TSKUI001")
|
|
215
|
-
const prefixMatch = /^([A-Z]+UI)/.exec(screenId);
|
|
216
|
-
if (!prefixMatch)
|
|
217
|
-
return false;
|
|
218
|
-
const prefix = prefixMatch[1];
|
|
219
|
-
const relDir = SCREEN_CODE_PATHS[prefix];
|
|
220
|
-
if (!relDir)
|
|
221
|
-
return false;
|
|
222
|
-
const absDir = (0, path_1.join)(this.projectRoot, relDir);
|
|
223
|
-
if (!(0, fs_1.existsSync)(absDir))
|
|
224
|
-
return false;
|
|
225
|
-
// Check if directory contains any TSX files
|
|
226
|
-
try {
|
|
227
|
-
const files = (0, fs_1.readdirSync)(absDir);
|
|
228
|
-
return files.some((f) => f.endsWith('.tsx') || f.endsWith('.ts'));
|
|
229
|
-
}
|
|
230
|
-
catch {
|
|
231
|
-
return false;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
// ── Public API methods ─────────────────────────────────────
|
|
235
|
-
/**
|
|
236
|
-
* KNW.LIST: List knowledge entries with optional agent/category filter.
|
|
237
|
-
*/
|
|
238
|
-
listEntries(dto) {
|
|
239
|
-
const agentIds = dto.agent ? [dto.agent] : this.listAgentIds();
|
|
240
|
-
const all = [];
|
|
241
|
-
for (const agentId of agentIds) {
|
|
242
|
-
let entries = this.loadEntries(agentId);
|
|
243
|
-
if (dto.category) {
|
|
244
|
-
entries = entries.filter((e) => e.category === dto.category);
|
|
245
|
-
}
|
|
246
|
-
all.push(...entries.map((e) => this.toListItem(e, agentId)));
|
|
247
|
-
}
|
|
248
|
-
return {
|
|
249
|
-
data: all,
|
|
250
|
-
meta: { total: all.length, agent: dto.agent },
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* KNW.GET: Get a single knowledge entry by ID.
|
|
255
|
-
*/
|
|
256
|
-
getEntry(id, dto) {
|
|
257
|
-
const agentIds = dto.agent ? [dto.agent] : this.listAgentIds();
|
|
258
|
-
for (const agentId of agentIds) {
|
|
259
|
-
const entriesDir = this.getEntriesDir(agentId);
|
|
260
|
-
if (!(0, fs_1.existsSync)(entriesDir))
|
|
261
|
-
continue;
|
|
262
|
-
const files = (0, fs_1.readdirSync)(entriesDir).filter((f) => f.endsWith('.md'));
|
|
263
|
-
for (const file of files) {
|
|
264
|
-
const raw = (0, fs_1.readFileSync)((0, path_1.join)(entriesDir, file), 'utf-8');
|
|
265
|
-
const { frontmatter, body } = this.parseFrontmatter(raw);
|
|
266
|
-
if (String(frontmatter.id) === id) {
|
|
267
|
-
const item = this.toListItem({ ...frontmatter, _body: this.extractBody(body) }, agentId);
|
|
268
|
-
return { ...item, body: this.extractBody(body) };
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
throw new common_1.NotFoundException(`Knowledge entry '${id}' not found`);
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* KNW.SEARCH: Search knowledge entries using knowledge-core BM25.
|
|
276
|
-
* Memory search uses per-agent entries via knowledge-core directly.
|
|
277
|
-
* Document search delegates to @crewx/search SearchEngine for CLI parity.
|
|
278
|
-
*/
|
|
279
|
-
async searchEntries(dto) {
|
|
280
|
-
if (!dto.q || dto.q.trim().length === 0) {
|
|
281
|
-
throw new common_1.BadRequestException('Query parameter q is required');
|
|
282
|
-
}
|
|
283
|
-
const cfg = this.getSearchConfig();
|
|
284
|
-
const cacheTtlMs = cfg.cache.ttl * 1000;
|
|
285
|
-
// Cache lookup (TTL-based, lazy eviction) — skip entirely when ttl=0
|
|
286
|
-
const cacheKey = `${dto.q.trim().toLowerCase()}|${dto.agent ?? ''}`;
|
|
287
|
-
const now = Date.now();
|
|
288
|
-
if (cacheTtlMs > 0) {
|
|
289
|
-
const cached = this.searchCache.get(cacheKey);
|
|
290
|
-
if (cached && cached.expires > now)
|
|
291
|
-
return cached.data;
|
|
292
|
-
if (cached)
|
|
293
|
-
this.searchCache.delete(cacheKey);
|
|
294
|
-
}
|
|
295
|
-
const agentIds = dto.agent ? [dto.agent] : this.listAgentIds();
|
|
296
|
-
const results = [];
|
|
297
|
-
// Memory search: per-agent, using knowledge-core directly (agent isolation)
|
|
298
|
-
for (const agentId of agentIds) {
|
|
299
|
-
const entries = this.loadEntries(agentId);
|
|
300
|
-
const kcEntries = entries.map((e) => this.toKnowledgeEntry(e));
|
|
301
|
-
if (kcEntries.length < 3)
|
|
302
|
-
continue; // BM25 requires minimum 3 docs for consolidation
|
|
303
|
-
const scored = (0, knowledge_core_1.searchEntries)(kcEntries, dto.q, { summary: 3, tags: 2, body: 1 });
|
|
304
|
-
for (const entry of scored) {
|
|
305
|
-
results.push({
|
|
306
|
-
id: entry.id,
|
|
307
|
-
title: entry.summary,
|
|
308
|
-
category: entry.category,
|
|
309
|
-
score: entry._score,
|
|
310
|
-
snippet: this.extractSnippet(entry.body ?? '', dto.q),
|
|
311
|
-
agent: agentId,
|
|
312
|
-
source: 'memory',
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
// Document search: delegate to SearchEngine (same as CLI `npx crewx search`)
|
|
317
|
-
if (!dto.agent) {
|
|
318
|
-
const docResults = await this.searchEngine.searchAndReturn({
|
|
319
|
-
query: dto.q,
|
|
320
|
-
searchPath: this.projectRoot,
|
|
321
|
-
glob: '**/*.md',
|
|
322
|
-
limit: 50,
|
|
323
|
-
});
|
|
324
|
-
for (const r of docResults) {
|
|
325
|
-
// Exclude memory entries (memory/<agent>/entries/) — handled above
|
|
326
|
-
if (r.file.startsWith('memory/') || r.file.startsWith('memory\\'))
|
|
327
|
-
continue;
|
|
328
|
-
const docId = r.file.replace(/\.md$/, '').replace(/\\/g, '/');
|
|
329
|
-
results.push({
|
|
330
|
-
id: `doc:${docId}`,
|
|
331
|
-
path: r.file,
|
|
332
|
-
title: r.title || docId,
|
|
333
|
-
category: 'general',
|
|
334
|
-
score: r.score,
|
|
335
|
-
snippet: this.extractSnippet(r.body ?? '', dto.q),
|
|
336
|
-
agent: 'docs',
|
|
337
|
-
source: 'docs',
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
// Sort by score desc across agents
|
|
342
|
-
results.sort((a, b) => b.score - a.score);
|
|
343
|
-
// Populate cache (skip when ttl=0 — cache disabled)
|
|
344
|
-
if (cacheTtlMs > 0) {
|
|
345
|
-
if (this.searchCache.size >= cfg.cache.max) {
|
|
346
|
-
const firstKey = this.searchCache.keys().next().value;
|
|
347
|
-
if (firstKey !== undefined)
|
|
348
|
-
this.searchCache.delete(firstKey);
|
|
349
|
-
}
|
|
350
|
-
this.searchCache.set(cacheKey, { data: results, expires: now + cacheTtlMs });
|
|
351
|
-
}
|
|
352
|
-
return results;
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* KNW.SYNC: Get synchronization status between spec, design, and code.
|
|
356
|
-
* - spec: section exists in docs/설계서.md
|
|
357
|
-
* - pencil: docs/design-shadcn.pen file exists (file-level check only)
|
|
358
|
-
* - code: route component exists in src/ui/pages/
|
|
359
|
-
*/
|
|
360
|
-
getSyncStatus() {
|
|
361
|
-
const specPath = (0, path_1.join)(this.projectRoot, 'docs', '설계서.md');
|
|
362
|
-
const pencilPath = (0, path_1.join)(this.projectRoot, 'docs', 'design-shadcn.pen');
|
|
363
|
-
const pencilExists = (0, fs_1.existsSync)(pencilPath);
|
|
364
|
-
const screens = (0, fs_1.existsSync)(specPath) ? this.parseScreenIds(specPath) : [];
|
|
365
|
-
const items = screens.map(({ id, name }) => {
|
|
366
|
-
const spec = true; // always true — we parsed it from the spec
|
|
367
|
-
const pencil = pencilExists;
|
|
368
|
-
const code = this.checkCodeExists(id);
|
|
369
|
-
return { id, name, spec, pencil, code, synced: spec && pencil && code };
|
|
370
|
-
});
|
|
371
|
-
const synced = items.filter((i) => i.synced).length;
|
|
372
|
-
return {
|
|
373
|
-
summary: {
|
|
374
|
-
total: items.length,
|
|
375
|
-
synced,
|
|
376
|
-
mismatched: items.length - synced,
|
|
377
|
-
},
|
|
378
|
-
items,
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
|
-
/**
|
|
382
|
-
* KNW.SUMMARY: Get agent memory summary.
|
|
383
|
-
*/
|
|
384
|
-
getAgentSummary(dto) {
|
|
385
|
-
if (!dto.agent) {
|
|
386
|
-
throw new common_1.BadRequestException('Query parameter agent is required');
|
|
387
|
-
}
|
|
388
|
-
const agentId = dto.agent;
|
|
389
|
-
const entries = this.loadEntries(agentId);
|
|
390
|
-
// Parse summary.md for topic summaries
|
|
391
|
-
const summaryPath = this.getSummaryPath(agentId);
|
|
392
|
-
let lastUpdated = '';
|
|
393
|
-
let summaryBody = '';
|
|
394
|
-
if ((0, fs_1.existsSync)(summaryPath)) {
|
|
395
|
-
const raw = (0, fs_1.readFileSync)(summaryPath, 'utf-8');
|
|
396
|
-
const { frontmatter, body } = this.parseFrontmatter(raw);
|
|
397
|
-
const fm = frontmatter;
|
|
398
|
-
lastUpdated = String(fm.last_updated ?? '');
|
|
399
|
-
summaryBody = body;
|
|
400
|
-
}
|
|
401
|
-
// Build tag stats from entries (group by primary tag = tags[0])
|
|
402
|
-
const topicMap = new Map();
|
|
403
|
-
for (const entry of entries) {
|
|
404
|
-
const tags = Array.isArray(entry.tags) ? entry.tags : [];
|
|
405
|
-
const primaryTag = tags[0] ?? 'general';
|
|
406
|
-
const date = String(entry.date ?? '');
|
|
407
|
-
if (!topicMap.has(primaryTag)) {
|
|
408
|
-
topicMap.set(primaryTag, { count: 0, dates: [] });
|
|
409
|
-
}
|
|
410
|
-
const t = topicMap.get(primaryTag);
|
|
411
|
-
t.count += 1;
|
|
412
|
-
if (date)
|
|
413
|
-
t.dates.push(date);
|
|
414
|
-
}
|
|
415
|
-
// Parse topic summaries from summary.md body
|
|
416
|
-
const topicSummaries = this.parseTopicSummaries(summaryBody);
|
|
417
|
-
const topics = [];
|
|
418
|
-
for (const [name, stats] of topicMap.entries()) {
|
|
419
|
-
const sortedDates = [...stats.dates].sort();
|
|
420
|
-
const oldest = sortedDates[0] ?? '';
|
|
421
|
-
const newest = sortedDates[sortedDates.length - 1] ?? '';
|
|
422
|
-
const toMD = (d) => {
|
|
423
|
-
const dt = new Date(d + 'T00:00:00Z');
|
|
424
|
-
if (isNaN(dt.getTime()))
|
|
425
|
-
return d;
|
|
426
|
-
return `${String(dt.getMonth() + 1).padStart(2, '0')}/${String(dt.getDate()).padStart(2, '0')}`;
|
|
427
|
-
};
|
|
428
|
-
const dateRange = oldest === newest ? toMD(oldest) : `${toMD(oldest)}~${toMD(newest)}`;
|
|
429
|
-
topics.push({
|
|
430
|
-
name,
|
|
431
|
-
count: stats.count,
|
|
432
|
-
dateRange,
|
|
433
|
-
summary: topicSummaries[name] ?? '',
|
|
434
|
-
});
|
|
435
|
-
}
|
|
436
|
-
// Sort topics by count desc
|
|
437
|
-
topics.sort((a, b) => b.count - a.count);
|
|
438
|
-
return {
|
|
439
|
-
agent: agentId,
|
|
440
|
-
entryCount: entries.length,
|
|
441
|
-
topicCount: topicMap.size,
|
|
442
|
-
lastUpdated,
|
|
443
|
-
topics,
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
|
-
/**
|
|
447
|
-
* KNW007: List agent IDs that have knowledge entries.
|
|
448
|
-
*/
|
|
449
|
-
listAgents() {
|
|
450
|
-
return this.listAgentIds();
|
|
451
|
-
}
|
|
452
|
-
/**
|
|
453
|
-
* KNW.GRAPH: Get knowledge graph data for an agent (or all agents).
|
|
454
|
-
* Uses knowledge-core buildGraph() for runtime graph generation.
|
|
455
|
-
* Includes both memory entries and doc entries.
|
|
456
|
-
*/
|
|
457
|
-
getGraph(dto) {
|
|
458
|
-
const agentIds = dto.agent ? [dto.agent] : this.listAgentIds();
|
|
459
|
-
// Load memory entries and track agent mapping
|
|
460
|
-
const agentMap = new Map(); // entryId → agentId
|
|
461
|
-
const allKCEntries = [];
|
|
462
|
-
for (const agentId of agentIds) {
|
|
463
|
-
const entries = this.loadEntries(agentId);
|
|
464
|
-
for (const entry of entries) {
|
|
465
|
-
const kcEntry = this.toKnowledgeEntry(entry);
|
|
466
|
-
if (kcEntry.id) {
|
|
467
|
-
agentMap.set(kcEntry.id, agentId);
|
|
468
|
-
allKCEntries.push(kcEntry);
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
// Load doc entries
|
|
473
|
-
const docEntries = this.loadDocEntries();
|
|
474
|
-
for (const docEntry of docEntries) {
|
|
475
|
-
agentMap.set(docEntry.id, 'docs');
|
|
476
|
-
allKCEntries.push(docEntry);
|
|
477
|
-
}
|
|
478
|
-
// Build graph via knowledge-core (runtime, no graph.json dependency)
|
|
479
|
-
const graph = (0, knowledge_core_1.buildGraph)(allKCEntries, { edgeThreshold: 0.2 });
|
|
480
|
-
// Transform knowledge-core Graph → backend DTO GraphData
|
|
481
|
-
const nodes = graph.nodes.map((node) => {
|
|
482
|
-
const kcEntry = allKCEntries.find((e) => e.id === node.id);
|
|
483
|
-
return {
|
|
484
|
-
id: node.id,
|
|
485
|
-
title: node.summary,
|
|
486
|
-
category: kcEntry?.type === 'document' ? 'docs' : (kcEntry?.category ?? 'general'),
|
|
487
|
-
agent: agentMap.get(node.id) ?? 'unknown',
|
|
488
|
-
tags: node.tags,
|
|
489
|
-
edgeCount: 0, // will be updated below
|
|
490
|
-
};
|
|
491
|
-
});
|
|
492
|
-
// Transform edges: knowledge-core uses from/to, backend uses source/target
|
|
493
|
-
const edges = graph.edges.map((edge) => ({
|
|
494
|
-
source: edge.from,
|
|
495
|
-
target: edge.to,
|
|
496
|
-
relation: edge.type,
|
|
497
|
-
weight: edge.weight,
|
|
498
|
-
}));
|
|
499
|
-
// Count edgeCount per node
|
|
500
|
-
const edgeCountMap = new Map();
|
|
501
|
-
for (const edge of edges) {
|
|
502
|
-
edgeCountMap.set(edge.source, (edgeCountMap.get(edge.source) ?? 0) + 1);
|
|
503
|
-
edgeCountMap.set(edge.target, (edgeCountMap.get(edge.target) ?? 0) + 1);
|
|
504
|
-
}
|
|
505
|
-
for (const node of nodes) {
|
|
506
|
-
node.edgeCount = edgeCountMap.get(node.id) ?? 0;
|
|
507
|
-
}
|
|
508
|
-
return { nodes, edges };
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* Parse topic summary sections from summary.md body.
|
|
512
|
-
* Pattern: ## topicName (Ncases)\n\nSummary text
|
|
513
|
-
*/
|
|
514
|
-
parseTopicSummaries(body) {
|
|
515
|
-
const result = {};
|
|
516
|
-
const sections = body.split(/\n## /);
|
|
517
|
-
for (const section of sections.slice(1)) {
|
|
518
|
-
const lines = section.split('\n');
|
|
519
|
-
const header = lines[0] ?? '';
|
|
520
|
-
// Remove count suffix e.g. "topic-name (3건)"
|
|
521
|
-
const topicName = header.replace(/\s*\(\d+건\).*$/, '').trim();
|
|
522
|
-
// Find first non-empty paragraph after header
|
|
523
|
-
const paragraphs = section
|
|
524
|
-
.split(/\n\n+/)
|
|
525
|
-
.slice(1)
|
|
526
|
-
.map((p) => p.replace(/→.*$/s, '').trim())
|
|
527
|
-
.filter((p) => p.length > 0);
|
|
528
|
-
if (topicName) {
|
|
529
|
-
result[topicName] = paragraphs[0] ?? '';
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
return result;
|
|
533
|
-
}
|
|
534
|
-
};
|
|
535
|
-
exports.KnowledgeService = KnowledgeService;
|
|
536
|
-
exports.KnowledgeService = KnowledgeService = __decorate([
|
|
537
|
-
(0, common_1.Injectable)()
|
|
538
|
-
], KnowledgeService);
|