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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/assets/{MarketPage-aY16UW1_.js → MarketPage-lLBtAENs.js} +10 -15
  2. package/dist/assets/{PromptTab-C3aTJS6u.js → PromptTab-Daq54dMi.js} +1 -1
  3. package/dist/assets/_baseUniq-BJDqmZBO.js +1 -0
  4. package/dist/assets/{arc-BCQAokB1.js → arc-ByjRIa5p.js} +1 -1
  5. package/dist/assets/{architectureDiagram-UYN6MBPD-Bc87ujv2.js → architectureDiagram-UYN6MBPD-DcKpqSFb.js} +1 -1
  6. package/dist/assets/{blockDiagram-ZHA2E4KO-wC9uH8Lb.js → blockDiagram-ZHA2E4KO-YvUeULT5.js} +1 -1
  7. package/dist/assets/{c4Diagram-6F5ED5ID-CqB7lqni.js → c4Diagram-6F5ED5ID-vggzH2N5.js} +1 -1
  8. package/dist/assets/channel-1Y6YooBb.js +1 -0
  9. package/dist/assets/{chunk-5HRBRIJM-Cc1L17Eh.js → chunk-5HRBRIJM-BbaQwJkn.js} +1 -1
  10. package/dist/assets/{chunk-7U56Z5CX-Df3nu_7G.js → chunk-7U56Z5CX-DVYVpFaa.js} +1 -1
  11. package/dist/assets/{chunk-ASOPGD6M-DIXslLG-.js → chunk-ASOPGD6M-CXEvWb-8.js} +1 -1
  12. package/dist/assets/{chunk-KFBOBJHC-FytVljyP.js → chunk-KFBOBJHC-CadVXFV3.js} +1 -1
  13. package/dist/assets/{chunk-T2TOU4HS-CU5z-cXq.js → chunk-T2TOU4HS-lDZr1sVF.js} +1 -1
  14. package/dist/assets/{chunk-TMUBEWPD-CWo1AFyn.js → chunk-TMUBEWPD-D5A0MrFD.js} +1 -1
  15. package/dist/assets/classDiagram-LNE6IOMH-CDxkV2JV.js +1 -0
  16. package/dist/assets/classDiagram-v2-MQ7JQ4JX-CDxkV2JV.js +1 -0
  17. package/dist/assets/clone-6xznz_9G.js +1 -0
  18. package/dist/assets/{dagre-4EVJKHTY-CgZW5tg4.js → dagre-4EVJKHTY-Bncx7Ijq.js} +1 -1
  19. package/dist/assets/{diagram-QW4FP2JN-CJAng8RC.js → diagram-QW4FP2JN-RkxVNs99.js} +1 -1
  20. package/dist/assets/{erDiagram-6RL3IURR-C1uHztHX.js → erDiagram-6RL3IURR-DIiKqQdx.js} +1 -1
  21. package/dist/assets/{flowDiagram-7ASYPVHJ-Yiu2odO-.js → flowDiagram-7ASYPVHJ-DQ5PN7v6.js} +1 -1
  22. package/dist/assets/{ganttDiagram-NTVNEXSI-tutc0dJP.js → ganttDiagram-NTVNEXSI-BeNWGpB6.js} +1 -1
  23. package/dist/assets/{gitGraph-YCYPL57B-C3jM6T4G.js → gitGraph-YCYPL57B-CdMe059q.js} +1 -1
  24. package/dist/assets/{gitGraphDiagram-NRZ2UAAF-0aqHEKzz.js → gitGraphDiagram-NRZ2UAAF-BEke5TyK.js} +1 -1
  25. package/dist/assets/{graph-DC224ILV.js → graph-DyQIwWJd.js} +1 -1
  26. package/dist/assets/{infoDiagram-A4XQUW5V-Do7Mpzkx.js → infoDiagram-A4XQUW5V-CUcC8I_5.js} +1 -1
  27. package/dist/assets/{journeyDiagram-G5WM74LC-DAruEJc7.js → journeyDiagram-G5WM74LC-CQ5DqAH5.js} +1 -1
  28. package/dist/assets/{kanban-definition-QRCXZQQD-DB63vLR0.js → kanban-definition-QRCXZQQD-BBsgOii7.js} +1 -1
  29. package/dist/assets/{layout-BiYH5x6Q.js → layout-D7vBs_Wy.js} +1 -1
  30. package/dist/assets/{linear-CLyGW2s0.js → linear-CEOF9oJz.js} +1 -1
  31. package/dist/assets/{main-CEKkUqZb.js → main-Bx1nZ7_p.js} +278 -273
  32. package/dist/assets/main-C4ebvOIJ.css +10 -0
  33. package/dist/assets/{min-ChJMFU2N.js → min-RK9J5Utn.js} +1 -1
  34. package/dist/assets/{mindmap-definition-GWI6TPTV-CtADqQgd.js → mindmap-definition-GWI6TPTV-BXvEU7qC.js} +1 -1
  35. package/dist/assets/{pieDiagram-YF2LJOPJ-BSOfzo3O.js → pieDiagram-YF2LJOPJ-TrXqcpni.js} +1 -1
  36. package/dist/assets/{quadrantDiagram-OS5C2QUG-BLBQNFVb.js → quadrantDiagram-OS5C2QUG-B-chTEU4.js} +1 -1
  37. package/dist/assets/{requirementDiagram-MIRIMTAZ-DqorvuS6.js → requirementDiagram-MIRIMTAZ-BgJhNLp_.js} +1 -1
  38. package/dist/assets/{sankeyDiagram-Y46BX6SQ-4NDcrLkB.js → sankeyDiagram-Y46BX6SQ-BVsgYKK7.js} +1 -1
  39. package/dist/assets/{sequenceDiagram-G6AWOVSC-yha6BxK2.js → sequenceDiagram-G6AWOVSC-ByJOpkq3.js} +1 -1
  40. package/dist/assets/{stateDiagram-MAYHULR4-XJ_I41ez.js → stateDiagram-MAYHULR4-Dw7lUL1B.js} +1 -1
  41. package/dist/assets/stateDiagram-v2-4JROLMXI-DYJiM3bF.js +1 -0
  42. package/dist/assets/{timeline-definition-U7ZMHBDA-DCNrmvE7.js → timeline-definition-U7ZMHBDA-CSoEYs60.js} +1 -1
  43. package/dist/assets/{xychartDiagram-6QU3TZC5-9N-Ohhdp.js → xychartDiagram-6QU3TZC5-0_rG7p3L.js} +1 -1
  44. package/dist/index.html +2 -2
  45. package/package.json +8 -8
  46. package/packages/cli/package.json +1 -1
  47. package/dist/assets/_baseUniq-DxEFlwNt.js +0 -1
  48. package/dist/assets/channel-DNLHkiNp.js +0 -1
  49. package/dist/assets/classDiagram-LNE6IOMH-B430Onym.js +0 -1
  50. package/dist/assets/classDiagram-v2-MQ7JQ4JX-B430Onym.js +0 -1
  51. package/dist/assets/clone-B9O3E3P1.js +0 -1
  52. package/dist/assets/main-D3YeRndF.css +0 -10
  53. package/dist/assets/stateDiagram-v2-4JROLMXI-CxcyPJO2.js +0 -1
  54. package/dist-server/adapters/adapter.module.js +0 -35
  55. package/dist-server/adapters/adapter.service.js +0 -79
  56. package/dist-server/adapters/http-router.service.js +0 -91
  57. package/dist-server/app.module.js +0 -111
  58. package/dist-server/bootstrap/crewx-server.js +0 -80
  59. package/dist-server/bootstrap/tls.js +0 -138
  60. package/dist-server/common/analytics.client.js +0 -180
  61. package/dist-server/common/analytics.module.js +0 -21
  62. package/dist-server/common/cors.js +0 -15
  63. package/dist-server/common/decorators/project.decorator.js +0 -21
  64. package/dist-server/common/decorators/workspace.decorator.js +0 -24
  65. package/dist-server/common/device-id.js +0 -33
  66. package/dist-server/common/interceptor/api-id-header.interceptor.js +0 -53
  67. package/dist-server/common/interceptor/http-logging.interceptor.js +0 -124
  68. package/dist-server/common/limits/defaults.js +0 -13
  69. package/dist-server/common/limits/limits-provider.js +0 -6
  70. package/dist-server/common/limits/limits.controller.js +0 -38
  71. package/dist-server/common/limits/limits.module.js +0 -24
  72. package/dist-server/common/limits/local-limits.provider.js +0 -27
  73. package/dist-server/common/middleware/workspace.middleware.js +0 -210
  74. package/dist-server/common/repository.exception-filter.js +0 -48
  75. package/dist-server/common/workspace-context.store.js +0 -25
  76. package/dist-server/domain/agent/agent.controller.js +0 -96
  77. package/dist-server/domain/agent/agent.module.js +0 -27
  78. package/dist-server/domain/agent/agent.service.js +0 -335
  79. package/dist-server/domain/agent/agent.types.js +0 -3
  80. package/dist-server/domain/agent/dto/create-agent.dto.js +0 -80
  81. package/dist-server/domain/agent/dto/preview-prompt.dto.js +0 -77
  82. package/dist-server/domain/agent/dto/provider-meta.dto.js +0 -2
  83. package/dist-server/domain/agent/dto/update-agent.dto.js +0 -92
  84. package/dist-server/domain/agent/provider.controller.js +0 -38
  85. package/dist-server/domain/agent/template-processor.service.js +0 -71
  86. package/dist-server/domain/auth/auth.constants.js +0 -4
  87. package/dist-server/domain/auth/auth.controller.js +0 -123
  88. package/dist-server/domain/auth/auth.module.js +0 -47
  89. package/dist-server/domain/auth/decorators/public.decorator.js +0 -7
  90. package/dist-server/domain/auth/guards/base-auth.guard.js +0 -66
  91. package/dist-server/domain/auth/session-store.js +0 -26
  92. package/dist-server/domain/auth/utils/ip.utils.js +0 -31
  93. package/dist-server/domain/box/box.controller.js +0 -77
  94. package/dist-server/domain/box/box.module.js +0 -21
  95. package/dist-server/domain/box/box.service.js +0 -97
  96. package/dist-server/domain/box/dto/create-box.dto.js +0 -74
  97. package/dist-server/domain/cli/cli.controller.js +0 -136
  98. package/dist-server/domain/cli/cli.module.js +0 -21
  99. package/dist-server/domain/cli/cli.service.js +0 -598
  100. package/dist-server/domain/cli/dto/login-cli.dto.js +0 -25
  101. package/dist-server/domain/cli/dto/update-cli.dto.js +0 -31
  102. package/dist-server/domain/doc/doc.controller.js +0 -95
  103. package/dist-server/domain/doc/doc.module.js +0 -21
  104. package/dist-server/domain/doc/doc.service.js +0 -368
  105. package/dist-server/domain/doc/dto/doc.dto.js +0 -64
  106. package/dist-server/domain/document/document.controller.js +0 -57
  107. package/dist-server/domain/document/document.module.js +0 -22
  108. package/dist-server/domain/document/document.service.js +0 -274
  109. package/dist-server/domain/document/dto/register-document.dto.js +0 -24
  110. package/dist-server/domain/fs/dto/mkdir-request.dto.js +0 -47
  111. package/dist-server/domain/fs/dto/mkdir-response.dto.js +0 -2
  112. package/dist-server/domain/fs/dto/quick-access.dto.js +0 -2
  113. package/dist-server/domain/fs/dto/tree-node.dto.js +0 -2
  114. package/dist-server/domain/fs/dto/tree-query.dto.js +0 -35
  115. package/dist-server/domain/fs/fs.controller.js +0 -63
  116. package/dist-server/domain/fs/fs.module.js +0 -22
  117. package/dist-server/domain/fs/fs.service.js +0 -303
  118. package/dist-server/domain/git/git.module.js +0 -20
  119. package/dist-server/domain/git/git.service.js +0 -222
  120. package/dist-server/domain/goal/dto/goal.dto.js +0 -49
  121. package/dist-server/domain/goal/goal.controller.js +0 -86
  122. package/dist-server/domain/goal/goal.module.js +0 -22
  123. package/dist-server/domain/goal/goal.service.js +0 -197
  124. package/dist-server/domain/goal/parser/goal-md-parser.js +0 -166
  125. package/dist-server/domain/goal/parser/goal-md-serializer.js +0 -110
  126. package/dist-server/domain/health/health.controller.js +0 -57
  127. package/dist-server/domain/health/health.module.js +0 -19
  128. package/dist-server/domain/knowledge/dto/graph-knowledge.dto.js +0 -27
  129. package/dist-server/domain/knowledge/dto/knowledge.dto.js +0 -71
  130. package/dist-server/domain/knowledge/knowledge.controller.js +0 -122
  131. package/dist-server/domain/knowledge/knowledge.module.js +0 -21
  132. package/dist-server/domain/knowledge/knowledge.service.js +0 -538
  133. package/dist-server/domain/market/dto/add-registry.dto.js +0 -32
  134. package/dist-server/domain/market/dto/install-market.dto.js +0 -30
  135. package/dist-server/domain/market/market.controller.js +0 -163
  136. package/dist-server/domain/market/market.module.js +0 -22
  137. package/dist-server/domain/market/market.service.js +0 -1447
  138. package/dist-server/domain/mcp/browser-session.store.js +0 -247
  139. package/dist-server/domain/mcp/crewx-tool.factory.js +0 -119
  140. package/dist-server/domain/mcp/mcp-auth.guard.js +0 -61
  141. package/dist-server/domain/mcp/mcp.constants.js +0 -4
  142. package/dist-server/domain/mcp/mcp.controller.js +0 -125
  143. package/dist-server/domain/mcp/mcp.dto.js +0 -12
  144. package/dist-server/domain/mcp/mcp.module.js +0 -49
  145. package/dist-server/domain/mcp/mcp.service.js +0 -684
  146. package/dist-server/domain/mcp/tool-router.service.js +0 -120
  147. package/dist-server/domain/message/dto/list-messages.dto.js +0 -57
  148. package/dist-server/domain/message/dto/send-message.dto.js +0 -45
  149. package/dist-server/domain/message/message.controller.js +0 -73
  150. package/dist-server/domain/message/message.module.js +0 -25
  151. package/dist-server/domain/message/message.service.js +0 -160
  152. package/dist-server/domain/onboarding/onboarding.controller.js +0 -97
  153. package/dist-server/domain/onboarding/onboarding.module.js +0 -23
  154. package/dist-server/domain/onboarding/onboarding.service.js +0 -106
  155. package/dist-server/domain/onboarding/onboarding.types.js +0 -2
  156. package/dist-server/domain/onboarding/presets/custom.js +0 -10
  157. package/dist-server/domain/onboarding/presets/dev-team.js +0 -41
  158. package/dist-server/domain/onboarding/presets/index.js +0 -15
  159. package/dist-server/domain/onboarding/presets/marketing-team.js +0 -29
  160. package/dist-server/domain/onboarding/presets/planning-team.js +0 -29
  161. package/dist-server/domain/onboarding/presets/solo.js +0 -17
  162. package/dist-server/domain/planner/dto/planner.dto.js +0 -58
  163. package/dist-server/domain/planner/planner.controller.js +0 -74
  164. package/dist-server/domain/planner/planner.module.js +0 -22
  165. package/dist-server/domain/planner/planner.service.js +0 -269
  166. package/dist-server/domain/project/dto/create-project.dto.js +0 -46
  167. package/dist-server/domain/project/dto/update-project.dto.js +0 -60
  168. package/dist-server/domain/project/project.controller.js +0 -129
  169. package/dist-server/domain/project/project.module.js +0 -22
  170. package/dist-server/domain/project/project.service.js +0 -173
  171. package/dist-server/domain/settings/settings.controller.js +0 -52
  172. package/dist-server/domain/settings/settings.module.js +0 -22
  173. package/dist-server/domain/settings/settings.service.js +0 -105
  174. package/dist-server/domain/task/dto/all-tasks.dto.js +0 -55
  175. package/dist-server/domain/task/dto/list-tasks.dto.js +0 -69
  176. package/dist-server/domain/task/dto/search-tasks.dto.js +0 -66
  177. package/dist-server/domain/task/dto/send-message.dto.js +0 -31
  178. package/dist-server/domain/task/dto/task-status.dto.js +0 -34
  179. package/dist-server/domain/task/dto/workspace-usage.dto.js +0 -38
  180. package/dist-server/domain/task/task.constants.js +0 -5
  181. package/dist-server/domain/task/task.controller.js +0 -169
  182. package/dist-server/domain/task/task.module.js +0 -23
  183. package/dist-server/domain/task/task.service.js +0 -775
  184. package/dist-server/domain/thread/dto/build-context.dto.js +0 -42
  185. package/dist-server/domain/thread/dto/list-messages.dto.js +0 -49
  186. package/dist-server/domain/thread/dto/list-threads.dto.js +0 -70
  187. package/dist-server/domain/thread/dto/search-threads.dto.js +0 -13
  188. package/dist-server/domain/thread/dto/update-thread.dto.js +0 -23
  189. package/dist-server/domain/thread/thread.controller.js +0 -160
  190. package/dist-server/domain/thread/thread.module.js +0 -23
  191. package/dist-server/domain/thread/thread.service.js +0 -419
  192. package/dist-server/domain/usage/usage.controller.js +0 -118
  193. package/dist-server/domain/usage/usage.module.js +0 -21
  194. package/dist-server/domain/usage/usage.service.js +0 -358
  195. package/dist-server/domain/usage/usage.types.js +0 -4
  196. package/dist-server/domain/wbs/wbs.controller.js +0 -51
  197. package/dist-server/domain/wbs/wbs.module.js +0 -21
  198. package/dist-server/domain/wbs/wbs.service.js +0 -94
  199. package/dist-server/domain/workflow/workflow.controller.js +0 -53
  200. package/dist-server/domain/workflow/workflow.module.js +0 -21
  201. package/dist-server/domain/workflow/workflow.service.js +0 -209
  202. package/dist-server/domain/workspace/dto/create-workspace.dto.js +0 -45
  203. package/dist-server/domain/workspace/dto/switch-workspace.dto.js +0 -32
  204. package/dist-server/domain/workspace/dto/workspace-info.dto.js +0 -2
  205. package/dist-server/domain/workspace/workspace.controller.js +0 -98
  206. package/dist-server/domain/workspace/workspace.module.js +0 -22
  207. package/dist-server/domain/workspace/workspace.service.js +0 -198
  208. package/dist-server/main.js +0 -204
  209. package/dist-server/modules/crewx-pool.service.js +0 -75
  210. package/dist-server/modules/crewx.module.js +0 -47
  211. package/dist-server/repository/base-sqlite.repository.js +0 -18
  212. package/dist-server/repository/box.repository.js +0 -99
  213. package/dist-server/repository/message.repository.js +0 -22
  214. package/dist-server/repository/project.repository.js +0 -51
  215. package/dist-server/repository/repository.module.js +0 -34
  216. package/dist-server/repository/request-log.repository.js +0 -96
  217. package/dist-server/repository/task.repository.js +0 -105
  218. package/dist-server/repository/thread.repository.js +0 -165
  219. package/dist-server/shared/crewx-home.js +0 -58
  220. package/dist-server/shared/crewx-state.js +0 -66
  221. package/dist-server/test-utils/compat-database.js +0 -30
  222. package/dist-server/utils/tokenizer.js +0 -8
@@ -1,95 +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.DocController = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const swagger_1 = require("@nestjs/swagger");
18
- const doc_service_js_1 = require("./doc.service.js");
19
- const doc_dto_js_1 = require("./dto/doc.dto.js");
20
- let DocController = class DocController {
21
- docService;
22
- constructor(docService) {
23
- this.docService = docService;
24
- }
25
- // DOC.TREE: Document file tree
26
- getTree(q) {
27
- const data = this.docService.getDocTree(q?.trim() || undefined);
28
- return { success: true, data };
29
- }
30
- // DOC.TOC: Table of contents for a markdown file
31
- getToc(query) {
32
- const data = this.docService.getToc(query.path);
33
- return { success: true, data };
34
- }
35
- // DOC.GET: File content (full or section)
36
- getContent(query) {
37
- const data = this.docService.getContent(query.path, query.section);
38
- return { success: true, data };
39
- }
40
- // DOC.STATUS: Implementation status matrix (spec × pencil × code)
41
- getImplStatus() {
42
- const data = this.docService.getImplStatus();
43
- return { success: true, data };
44
- }
45
- // DOC.SAVE: Save document content
46
- async saveContent(body) {
47
- const data = await this.docService.saveContent(body.path, body.content, body.mtime);
48
- return { success: true, data };
49
- }
50
- };
51
- exports.DocController = DocController;
52
- __decorate([
53
- (0, swagger_1.ApiOperation)({ operationId: 'DOC.TREE', summary: 'Get document file tree' }),
54
- (0, common_1.Get)('tree'),
55
- __param(0, (0, common_1.Query)('q')),
56
- __metadata("design:type", Function),
57
- __metadata("design:paramtypes", [String]),
58
- __metadata("design:returntype", void 0)
59
- ], DocController.prototype, "getTree", null);
60
- __decorate([
61
- (0, swagger_1.ApiOperation)({ operationId: 'DOC.TOC', summary: 'Get table of contents for a document' }),
62
- (0, common_1.Get)('toc'),
63
- __param(0, (0, common_1.Query)()),
64
- __metadata("design:type", Function),
65
- __metadata("design:paramtypes", [doc_dto_js_1.GetTocDto]),
66
- __metadata("design:returntype", void 0)
67
- ], DocController.prototype, "getToc", null);
68
- __decorate([
69
- (0, swagger_1.ApiOperation)({ operationId: 'DOC.GET', summary: 'Get document content' }),
70
- (0, common_1.Get)('content'),
71
- __param(0, (0, common_1.Query)()),
72
- __metadata("design:type", Function),
73
- __metadata("design:paramtypes", [doc_dto_js_1.GetContentDto]),
74
- __metadata("design:returntype", void 0)
75
- ], DocController.prototype, "getContent", null);
76
- __decorate([
77
- (0, swagger_1.ApiOperation)({ operationId: 'DOC.STATUS', summary: 'Get implementation status matrix' }),
78
- (0, common_1.Get)('impl-status'),
79
- __metadata("design:type", Function),
80
- __metadata("design:paramtypes", []),
81
- __metadata("design:returntype", void 0)
82
- ], DocController.prototype, "getImplStatus", null);
83
- __decorate([
84
- (0, swagger_1.ApiOperation)({ operationId: 'DOC.SAVE', summary: 'Save document content' }),
85
- (0, common_1.Put)('content'),
86
- __param(0, (0, common_1.Body)()),
87
- __metadata("design:type", Function),
88
- __metadata("design:paramtypes", [doc_dto_js_1.SaveContentDto]),
89
- __metadata("design:returntype", Promise)
90
- ], DocController.prototype, "saveContent", null);
91
- exports.DocController = DocController = __decorate([
92
- (0, swagger_1.ApiTags)('docs'),
93
- (0, common_1.Controller)('ws/:slug/docs'),
94
- __metadata("design:paramtypes", [doc_service_js_1.DocService])
95
- ], DocController);
@@ -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.DocModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const doc_controller_js_1 = require("./doc.controller.js");
12
- const doc_service_js_1 = require("./doc.service.js");
13
- let DocModule = class DocModule {
14
- };
15
- exports.DocModule = DocModule;
16
- exports.DocModule = DocModule = __decorate([
17
- (0, common_1.Module)({
18
- controllers: [doc_controller_js_1.DocController],
19
- providers: [doc_service_js_1.DocService],
20
- })
21
- ], DocModule);
@@ -1,368 +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.DocService = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const fs_1 = require("fs");
12
- const path_1 = require("path");
13
- const node_crypto_1 = require("node:crypto");
14
- const doc_1 = require("@crewx/doc");
15
- const knowledge_core_1 = require("@crewx/knowledge-core");
16
- const workspace_context_store_js_1 = require("../../common/workspace-context.store.js");
17
- // Screen ID → page directory mapping for code existence check
18
- const SCREEN_CODE_PATHS = {
19
- NAVUI: 'src/ui/components/layout',
20
- TSKUI: 'src/ui/pages/tasks',
21
- AGTUI: 'src/ui/pages/agents',
22
- USGUI: 'src/ui/pages/usage',
23
- CLIVUI: 'src/ui/pages/cli-manager',
24
- STGUI: 'src/ui/pages/settings',
25
- KNWUI: 'src/ui/pages/knowledge',
26
- MEMUI: 'src/ui/pages/memory',
27
- GRPHUI: 'src/ui/pages/graph',
28
- DOCUI: 'src/ui/pages/doc',
29
- MKTUI: 'src/ui/pages/marketplace',
30
- };
31
- /** Parse implementation status from leading emoji in text */
32
- function parseImplStatus(text) {
33
- if (text.includes('✅'))
34
- return 'done';
35
- if (text.includes('🔲'))
36
- return 'pending';
37
- if (text.includes('🗑️') || text.includes('🗑'))
38
- return 'removed';
39
- return null;
40
- }
41
- let DocService = class DocService {
42
- get projectRoot() {
43
- return (0, workspace_context_store_js_1.getWorkspacePath)();
44
- }
45
- docEngine = new doc_1.DocEngine(true);
46
- // ── DOC.TREE: File tree ──────────────────────────────────
47
- /**
48
- * Build a tree node for a single .md file.
49
- */
50
- fileNode(absPath) {
51
- const rel = (0, path_1.relative)(this.projectRoot, absPath).replace(/\\/g, '/');
52
- const name = (0, path_1.basename)(absPath);
53
- // Read first ~512 bytes to detect impl status emoji
54
- let implStatus = null;
55
- try {
56
- const content = (0, fs_1.readFileSync)(absPath, 'utf-8').slice(0, 512);
57
- implStatus = parseImplStatus(content);
58
- }
59
- catch {
60
- // ignore read errors
61
- }
62
- return { name, path: rel, type: 'file', implStatus };
63
- }
64
- /**
65
- * Recursively scan a directory and return a dir TreeNode.
66
- * Only includes .md files; excludes directories in the exclude set.
67
- */
68
- scanDir(absDir, excludeDirs) {
69
- const rel = (0, path_1.relative)(this.projectRoot, absDir).replace(/\\/g, '/');
70
- const name = (0, path_1.basename)(absDir);
71
- const children = [];
72
- let entries;
73
- try {
74
- entries = (0, fs_1.readdirSync)(absDir, { withFileTypes: true });
75
- }
76
- catch {
77
- return null;
78
- }
79
- // Directories first, then alphabetical by name
80
- entries.sort((a, b) => {
81
- const aIsDir = a.isDirectory();
82
- const bIsDir = b.isDirectory();
83
- if (aIsDir !== bIsDir)
84
- return aIsDir ? -1 : 1;
85
- return a.name.localeCompare(b.name);
86
- });
87
- for (const entry of entries) {
88
- if (excludeDirs.has(entry.name))
89
- continue;
90
- const entryAbs = (0, path_1.join)(absDir, entry.name);
91
- if (entry.isDirectory()) {
92
- const child = this.scanDir(entryAbs, excludeDirs);
93
- if (child && (child.children?.length ?? 0) > 0) {
94
- children.push(child);
95
- }
96
- }
97
- else if (entry.isFile() && entry.name.endsWith('.md')) {
98
- children.push(this.fileNode(entryAbs));
99
- }
100
- }
101
- return { name, path: rel, type: 'dir', children };
102
- }
103
- /**
104
- * DOC.TREE: Return document file tree.
105
- * Reads scan paths from crewx.yaml settings.docs, falls back to defaults.
106
- */
107
- getDocTree(query) {
108
- const config = (0, knowledge_core_1.loadDocsConfig)(this.projectRoot);
109
- const result = [];
110
- // Scan root-level .md files
111
- for (const filename of config.rootFiles) {
112
- const abs = (0, path_1.join)(this.projectRoot, filename);
113
- if ((0, fs_1.existsSync)(abs)) {
114
- result.push(this.fileNode(abs));
115
- }
116
- }
117
- // Scan each doc root directory
118
- for (const rootDir of config.roots) {
119
- const abs = (0, path_1.join)(this.projectRoot, rootDir);
120
- if (!(0, fs_1.existsSync)(abs))
121
- continue;
122
- const node = this.scanDir(abs, config.exclude);
123
- if (node)
124
- result.push(node);
125
- }
126
- // Directories first, then alphabetical by name
127
- result.sort((a, b) => {
128
- const aIsDir = a.type === 'dir';
129
- const bIsDir = b.type === 'dir';
130
- if (aIsDir !== bIsDir)
131
- return aIsDir ? -1 : 1;
132
- return a.name.localeCompare(b.name);
133
- });
134
- if (query) {
135
- return this.filterTree(result, query.toLowerCase());
136
- }
137
- return result;
138
- }
139
- /** Filter tree to files whose name matches q; dirs are kept only as parents of matched files. */
140
- filterTree(nodes, q) {
141
- return nodes.reduce((acc, node) => {
142
- if (node.type === 'file') {
143
- if (node.name.toLowerCase().includes(q))
144
- acc.push(node);
145
- }
146
- else {
147
- const filtered = this.filterTree(node.children ?? [], q);
148
- if (filtered.length > 0) {
149
- acc.push({ ...node, children: filtered });
150
- }
151
- }
152
- return acc;
153
- }, []);
154
- }
155
- // ── DOC.TOC: Table of contents ─────────────────────────
156
- /**
157
- * DOC.TOC: Parse TOC from a markdown file.
158
- * Validates path and prevents traversal.
159
- */
160
- getToc(filePath) {
161
- this.validatePath(filePath);
162
- const absPath = (0, path_1.resolve)(this.projectRoot, filePath);
163
- const content = (0, fs_1.readFileSync)(absPath, 'utf-8');
164
- const headings = this.docEngine.extractHeadings(content);
165
- const anchorCounts = new Map();
166
- return headings.map((h) => {
167
- const implStatus = parseImplStatus(h.text);
168
- const text = h.text.replace(/[✅🔲🗑️🗑⚠️]/gu, '').trim();
169
- // Deduplicate anchors with suffix (-1, -2, ...)
170
- const base = h.id;
171
- const count = anchorCounts.get(base) ?? 0;
172
- anchorCounts.set(base, count + 1);
173
- const anchor = count === 0 ? base : `${base}-${count}`;
174
- return { level: h.depth, text, anchor, implStatus };
175
- });
176
- }
177
- // ── DOC.GET: File content ───────────────────────────────
178
- /**
179
- * DOC.GET: Return full file content or a specific section.
180
- */
181
- getContent(filePath, section) {
182
- this.validatePath(filePath);
183
- const absPath = (0, path_1.resolve)(this.projectRoot, filePath);
184
- const content = (0, fs_1.readFileSync)(absPath, 'utf-8');
185
- const stat = (0, fs_1.statSync)(absPath);
186
- if (!section) {
187
- return { content, mtime: stat.mtimeMs };
188
- }
189
- return { content: this.extractSection(content, section), mtime: stat.mtimeMs };
190
- }
191
- /**
192
- * Extract a section by heading text.
193
- * Returns content from the matching heading until the next heading of the same or higher level.
194
- */
195
- extractSection(content, sectionHeading) {
196
- const lines = content.split('\n');
197
- let startIdx = -1;
198
- let startLevel = 0;
199
- // Find the target heading (case-insensitive, ignore emojis)
200
- const normalizeHeading = (s) => s.replace(/[✅🔲🗑️🗑⚠️#\s]/gu, '').toLowerCase();
201
- const target = normalizeHeading(sectionHeading);
202
- for (let i = 0; i < lines.length; i++) {
203
- const match = /^(#{1,6})\s+(.+)$/.exec(lines[i]);
204
- if (!match)
205
- continue;
206
- const text = match[2].trim();
207
- if (normalizeHeading(text) === target) {
208
- startIdx = i;
209
- startLevel = match[1].length;
210
- break;
211
- }
212
- }
213
- if (startIdx === -1) {
214
- return '';
215
- }
216
- // Collect lines until next heading of same or higher level
217
- const result = [lines[startIdx]];
218
- for (let i = startIdx + 1; i < lines.length; i++) {
219
- const match = /^(#{1,6})\s+/.exec(lines[i]);
220
- if (match && match[1].length <= startLevel) {
221
- break;
222
- }
223
- result.push(lines[i]);
224
- }
225
- return result.join('\n');
226
- }
227
- // ── DOC.STATUS: Implementation status matrix ───────────────
228
- /**
229
- * DOC.STATUS: Return screen ID × spec/pencil/code existence matrix.
230
- * Extends/mirrors KNW.SYNC getSyncStatus with more granular data.
231
- */
232
- getImplStatus() {
233
- const specPath = (0, path_1.join)(this.projectRoot, 'docs', '설계서.md');
234
- const pencilPath = (0, path_1.join)(this.projectRoot, 'docs', 'design-shadcn.pen');
235
- const pencilExists = (0, fs_1.existsSync)(pencilPath);
236
- const screens = (0, fs_1.existsSync)(specPath) ? this.parseScreenIds(specPath) : [];
237
- const items = screens.map(({ id, name }) => {
238
- const spec = true; // sourced directly from spec
239
- const pencil = pencilExists;
240
- const code = this.checkCodeExists(id);
241
- return { id, name, spec, pencil, code, synced: spec && pencil && code };
242
- });
243
- const synced = items.filter((i) => i.synced).length;
244
- return {
245
- summary: {
246
- total: items.length,
247
- synced,
248
- mismatched: items.length - synced,
249
- },
250
- items,
251
- };
252
- }
253
- /**
254
- * Parse screen ID sections from docs/설계서.md.
255
- * Handles both single IDs (TSKUI001) and ranges (KNWUI001~003).
256
- */
257
- parseScreenIds(specPath) {
258
- const content = (0, fs_1.readFileSync)(specPath, 'utf-8');
259
- const results = [];
260
- const headingRe = /^###\s+([A-Z]+UI\d+(?:~\d+)?)\.\s+(.+?)(?:\s*[✅🔲⚠️].*)?$/gm;
261
- let match;
262
- while ((match = headingRe.exec(content)) !== null) {
263
- const rawId = match[1];
264
- const name = match[2].trim();
265
- const rangeMatch = /^([A-Z]+UI)(\d+)~(\d+)$/.exec(rawId);
266
- if (rangeMatch) {
267
- const prefix = rangeMatch[1];
268
- const start = parseInt(rangeMatch[2], 10);
269
- const end = parseInt(rangeMatch[3], 10);
270
- for (let n = start; n <= end; n++) {
271
- results.push({ id: `${prefix}${String(n).padStart(3, '0')}`, name });
272
- }
273
- }
274
- else {
275
- results.push({ id: rawId, name });
276
- }
277
- }
278
- return results;
279
- }
280
- /**
281
- * Check if a code component exists for the given screen ID.
282
- */
283
- checkCodeExists(screenId) {
284
- const prefixMatch = /^([A-Z]+UI)/.exec(screenId);
285
- if (!prefixMatch)
286
- return false;
287
- const prefix = prefixMatch[1];
288
- const relDir = SCREEN_CODE_PATHS[prefix];
289
- if (!relDir)
290
- return false;
291
- const absDir = (0, path_1.join)(this.projectRoot, relDir);
292
- if (!(0, fs_1.existsSync)(absDir))
293
- return false;
294
- try {
295
- const files = (0, fs_1.readdirSync)(absDir);
296
- return files.some((f) => f.endsWith('.tsx') || f.endsWith('.ts'));
297
- }
298
- catch {
299
- return false;
300
- }
301
- }
302
- // ── Path validation ───────────────────────────────────────
303
- /**
304
- * Prevent path traversal attacks by rejecting paths containing '..'.
305
- * Also ensures the resolved path stays within the project root.
306
- */
307
- validatePath(filePath) {
308
- if (filePath.includes('..')) {
309
- throw new common_1.BadRequestException('Path traversal is not allowed');
310
- }
311
- const abs = (0, path_1.resolve)(this.projectRoot, filePath);
312
- // Normalize both sides to forward-slash + lower-case for Windows:
313
- // path.resolve() returns backslash with uppercase drive (C:\…) while
314
- // projectRoot may already be normalized (c:/…). Naive startsWith fails.
315
- const absCmp = abs.replace(/\\/g, '/').toLowerCase();
316
- const rootCmp = this.projectRoot.replace(/\\/g, '/').toLowerCase();
317
- if (!absCmp.startsWith(rootCmp)) {
318
- throw new common_1.BadRequestException('Path is outside project root');
319
- }
320
- if (!(0, fs_1.existsSync)(abs)) {
321
- throw new common_1.BadRequestException(`File not found: ${filePath}`);
322
- }
323
- }
324
- validateEditable(filePath) {
325
- const lower = filePath.toLowerCase();
326
- if (!lower.endsWith('.md')) {
327
- throw new common_1.BadRequestException('Only .md files are allowed');
328
- }
329
- const config = (0, knowledge_core_1.loadDocsConfig)(this.projectRoot);
330
- const normalized = filePath.replace(/\\/g, '/');
331
- const isRootFile = config.rootFiles.some((f) => normalized === f);
332
- const isUnderRoot = config.roots.some((r) => normalized.startsWith(r + '/'));
333
- if (!isRootFile && !isUnderRoot) {
334
- throw new common_1.BadRequestException('Path is not in an editable location');
335
- }
336
- }
337
- validateContent(content) {
338
- if (content === '') {
339
- throw new common_1.BadRequestException('Empty content not allowed');
340
- }
341
- if (content.length > 2 * 1024 * 1024) {
342
- throw new common_1.BadRequestException('Content exceeds 2MB limit');
343
- }
344
- }
345
- async saveContent(relativePath, content, expectedMtime) {
346
- this.validatePath(relativePath);
347
- this.validateEditable(relativePath);
348
- this.validateContent(content);
349
- const absPath = (0, path_1.resolve)(this.projectRoot, relativePath);
350
- const stat = await fs_1.promises.stat(absPath).catch(() => null);
351
- if (stat && stat.mtimeMs !== expectedMtime) {
352
- throw new common_1.ConflictException({
353
- error: 'CONFLICT',
354
- message: 'File modified externally since last load',
355
- currentMtime: stat.mtimeMs,
356
- });
357
- }
358
- const tempPath = `${absPath}.${(0, node_crypto_1.randomBytes)(6).toString('hex')}.tmp`;
359
- await fs_1.promises.writeFile(tempPath, content, 'utf8');
360
- await fs_1.promises.rename(tempPath, absPath);
361
- const newStat = await fs_1.promises.stat(absPath);
362
- return { path: relativePath, mtime: newStat.mtimeMs };
363
- }
364
- };
365
- exports.DocService = DocService;
366
- exports.DocService = DocService = __decorate([
367
- (0, common_1.Injectable)()
368
- ], DocService);
@@ -1,64 +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.SaveContentDto = exports.GetContentDto = exports.GetTocDto = void 0;
13
- const swagger_1 = require("@nestjs/swagger");
14
- const class_validator_1 = require("class-validator");
15
- // Query DTOs
16
- class GetTocDto {
17
- path;
18
- }
19
- exports.GetTocDto = GetTocDto;
20
- __decorate([
21
- (0, swagger_1.ApiProperty)({ description: 'Document path' }),
22
- (0, class_validator_1.IsString)(),
23
- (0, class_validator_1.IsNotEmpty)(),
24
- __metadata("design:type", String)
25
- ], GetTocDto.prototype, "path", void 0);
26
- class GetContentDto {
27
- path;
28
- section;
29
- }
30
- exports.GetContentDto = GetContentDto;
31
- __decorate([
32
- (0, swagger_1.ApiProperty)({ description: 'Document path' }),
33
- (0, class_validator_1.IsString)(),
34
- (0, class_validator_1.IsNotEmpty)(),
35
- __metadata("design:type", String)
36
- ], GetContentDto.prototype, "path", void 0);
37
- __decorate([
38
- (0, swagger_1.ApiPropertyOptional)({ description: 'Section name to extract' }),
39
- (0, class_validator_1.IsOptional)(),
40
- (0, class_validator_1.IsString)(),
41
- __metadata("design:type", String)
42
- ], GetContentDto.prototype, "section", void 0);
43
- class SaveContentDto {
44
- path;
45
- content;
46
- mtime;
47
- }
48
- exports.SaveContentDto = SaveContentDto;
49
- __decorate([
50
- (0, swagger_1.ApiProperty)({ description: 'Document path' }),
51
- (0, class_validator_1.IsString)(),
52
- (0, class_validator_1.IsNotEmpty)(),
53
- __metadata("design:type", String)
54
- ], SaveContentDto.prototype, "path", void 0);
55
- __decorate([
56
- (0, swagger_1.ApiProperty)({ description: 'File content (markdown)' }),
57
- (0, class_validator_1.IsString)(),
58
- __metadata("design:type", String)
59
- ], SaveContentDto.prototype, "content", void 0);
60
- __decorate([
61
- (0, swagger_1.ApiProperty)({ description: 'Expected file mtime (ms) for conflict detection' }),
62
- (0, class_validator_1.IsNumber)(),
63
- __metadata("design:type", Number)
64
- ], SaveContentDto.prototype, "mtime", void 0);
@@ -1,57 +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.DocumentController = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const swagger_1 = require("@nestjs/swagger");
18
- const register_document_dto_js_1 = require("./dto/register-document.dto.js");
19
- const document_service_js_1 = require("./document.service.js");
20
- let DocumentController = class DocumentController {
21
- documentService;
22
- constructor(documentService) {
23
- this.documentService = documentService;
24
- }
25
- // DOC_LIST: List documents registered in crewx.yaml
26
- getDocuments() {
27
- const documents = this.documentService.getDocumentItems();
28
- return { success: true, data: { documents } };
29
- }
30
- // DOC_REGISTER: Register a new file-based document in crewx.yaml (idempotent)
31
- registerDocument(dto) {
32
- const result = this.documentService.registerDocument(dto.path);
33
- return { success: true, data: result };
34
- }
35
- };
36
- exports.DocumentController = DocumentController;
37
- __decorate([
38
- (0, swagger_1.ApiOperation)({ operationId: 'DOC_LIST', summary: 'List documents from crewx.yaml' }),
39
- (0, common_1.Get)(),
40
- __metadata("design:type", Function),
41
- __metadata("design:paramtypes", []),
42
- __metadata("design:returntype", void 0)
43
- ], DocumentController.prototype, "getDocuments", null);
44
- __decorate([
45
- (0, swagger_1.ApiOperation)({ operationId: 'DOC_REGISTER', summary: 'Register a .md file as a document in crewx.yaml' }),
46
- (0, common_1.Post)(),
47
- (0, common_1.HttpCode)(200),
48
- __param(0, (0, common_1.Body)()),
49
- __metadata("design:type", Function),
50
- __metadata("design:paramtypes", [register_document_dto_js_1.RegisterDocumentDto]),
51
- __metadata("design:returntype", void 0)
52
- ], DocumentController.prototype, "registerDocument", null);
53
- exports.DocumentController = DocumentController = __decorate([
54
- (0, swagger_1.ApiTags)('documents'),
55
- (0, common_1.Controller)('ws/:slug/documents'),
56
- __metadata("design:paramtypes", [document_service_js_1.DocumentService])
57
- ], DocumentController);
@@ -1,22 +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.DocumentModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const document_controller_js_1 = require("./document.controller.js");
12
- const document_service_js_1 = require("./document.service.js");
13
- let DocumentModule = class DocumentModule {
14
- };
15
- exports.DocumentModule = DocumentModule;
16
- exports.DocumentModule = DocumentModule = __decorate([
17
- (0, common_1.Module)({
18
- controllers: [document_controller_js_1.DocumentController],
19
- providers: [document_service_js_1.DocumentService],
20
- exports: [document_service_js_1.DocumentService],
21
- })
22
- ], DocumentModule);