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,274 +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 __importDefault = (this && this.__importDefault) || function (mod) {
9
- return (mod && mod.__esModule) ? mod : { "default": mod };
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.DocumentService = void 0;
13
- const common_1 = require("@nestjs/common");
14
- const fs_1 = require("fs");
15
- const path_1 = require("path");
16
- const js_yaml_1 = require("js-yaml");
17
- const unified_1 = require("unified");
18
- const remark_parse_1 = __importDefault(require("remark-parse"));
19
- const unist_util_visit_1 = require("unist-util-visit");
20
- const workspace_context_store_js_1 = require("../../common/workspace-context.store.js");
21
- const ALLOWED_EXTENSIONS = new Set(['.md', '.mdx']);
22
- let DocumentService = class DocumentService {
23
- get projectRoot() {
24
- return (0, workspace_context_store_js_1.getWorkspacePath)();
25
- }
26
- /** Parse crewx.yaml and return metadata list (no file I/O for inline docs). */
27
- getDocumentItems() {
28
- const raw = this.loadRawDocuments();
29
- if (!raw)
30
- return [];
31
- const items = [];
32
- for (const [key, source] of Object.entries(raw)) {
33
- if (typeof source === 'string') {
34
- items.push({ key, type: 'inline' });
35
- }
36
- else if (source && typeof source === 'object') {
37
- if ('path' in source && typeof source.path === 'string') {
38
- // Return project-relative POSIX path (forward slashes) for cross-platform safety
39
- const relPath = source.path.replace(/\\/g, '/').replace(/^\.?\//, '');
40
- items.push({
41
- key,
42
- type: 'file',
43
- path: relPath,
44
- summary: source.summary,
45
- });
46
- }
47
- else {
48
- // { content: "..." } form — inline object
49
- items.push({ key, type: 'inline', summary: source.summary });
50
- }
51
- }
52
- }
53
- return items;
54
- }
55
- /**
56
- * Register a new file-based document entry in crewx.yaml.
57
- * Idempotent: if the path is already registered, returns the existing key.
58
- * Uses text-level append to preserve YAML comments and formatting.
59
- */
60
- registerDocument(filePath) {
61
- // Validate: no path traversal
62
- if (filePath.includes('..')) {
63
- throw new common_1.BadRequestException('Path traversal is not allowed');
64
- }
65
- // Validate: must be relative
66
- if ((0, path_1.isAbsolute)(filePath)) {
67
- throw new common_1.BadRequestException('Absolute paths are not allowed; use a project-relative path');
68
- }
69
- // Validate: only .md / .mdx
70
- const ext = (0, path_1.extname)(filePath).toLowerCase();
71
- if (!ALLOWED_EXTENSIONS.has(ext)) {
72
- throw new common_1.BadRequestException(`Extension "${ext}" is not allowed; only .md and .mdx files are supported`);
73
- }
74
- // Validate: file must exist
75
- const absPath = this.resolveDocPath(filePath);
76
- if (!(0, fs_1.existsSync)(absPath)) {
77
- throw new common_1.BadRequestException(`File not found: ${filePath}`);
78
- }
79
- // Idempotency: check if already registered
80
- const existing = this.findRegisteredKey(filePath);
81
- if (existing) {
82
- return { key: existing, type: 'file', path: filePath.replace(/\\/g, '/').replace(/^\.?\//, '') };
83
- }
84
- // Find crewx.yaml
85
- const configPath = this.resolveCrewxConfigPath();
86
- if (!configPath) {
87
- throw new common_1.BadRequestException('crewx.yaml not found in project root');
88
- }
89
- // Generate a unique key
90
- const key = this.generateDocumentKey(filePath);
91
- // Append to crewx.yaml using text-level manipulation (preserves comments/formatting)
92
- this.appendToCrewxYaml(configPath, key, filePath);
93
- return { key, type: 'file', path: filePath.replace(/\\/g, '/').replace(/^\.?\//, '') };
94
- }
95
- /** Load documents with their content for template rendering. */
96
- loadDocumentEntries() {
97
- const raw = this.loadRawDocuments();
98
- const result = new Map();
99
- if (!raw)
100
- return result;
101
- for (const [key, source] of Object.entries(raw)) {
102
- try {
103
- if (typeof source === 'string') {
104
- result.set(key, { key, type: 'inline', content: source });
105
- }
106
- else if (source && typeof source === 'object') {
107
- if ('path' in source && typeof source.path === 'string') {
108
- const absPath = this.resolveDocPath(source.path);
109
- if ((0, fs_1.existsSync)(absPath)) {
110
- const content = (0, fs_1.readFileSync)(absPath, 'utf-8');
111
- result.set(key, {
112
- key,
113
- type: 'file',
114
- path: absPath,
115
- summary: source.summary,
116
- content,
117
- });
118
- }
119
- }
120
- else if ('content' in source && typeof source.content === 'string') {
121
- result.set(key, {
122
- key,
123
- type: 'inline',
124
- summary: source.summary,
125
- content: source.content,
126
- });
127
- }
128
- }
129
- }
130
- catch {
131
- // Skip unloadable documents silently
132
- }
133
- }
134
- return result;
135
- }
136
- /** Extract TOC from markdown content as indented markdown list. */
137
- extractToc(content) {
138
- try {
139
- // Strip YAML frontmatter (--- ... ---) before parsing to prevent
140
- // frontmatter fields from being misinterpreted as setext headings
141
- const stripped = content.replace(/^---[\r\n][\s\S]*?[\r\n]---[\r\n]?/, '');
142
- const tree = (0, unified_1.unified)().use(remark_parse_1.default).parse(stripped);
143
- const headings = [];
144
- (0, unist_util_visit_1.visit)(tree, 'heading', (node) => {
145
- const text = node.children
146
- .map((child) => {
147
- if (child.type === 'text')
148
- return child.value;
149
- if (child.type === 'inlineCode')
150
- return child.value;
151
- if ('children' in child) {
152
- return child.children
153
- .map((c) => c.value ?? '')
154
- .join('');
155
- }
156
- return '';
157
- })
158
- .join('');
159
- headings.push({ depth: node.depth, text: text.trim() });
160
- });
161
- if (headings.length === 0)
162
- return '';
163
- return headings.map(({ depth, text }) => `${' '.repeat(depth - 1)}- ${text}`).join('\n');
164
- }
165
- catch {
166
- return '';
167
- }
168
- }
169
- // ── Private helpers ──────────────────────────────────────
170
- /** Check if a relative path is already registered; returns the key or undefined. */
171
- findRegisteredKey(relPath) {
172
- const items = this.getDocumentItems();
173
- const normalizedRel = relPath.replace(/\\/g, '/').replace(/^\.?\//, '');
174
- const absPath = this.resolveDocPath(relPath);
175
- for (const item of items) {
176
- if (item.type !== 'file' || !item.path)
177
- continue;
178
- const itemNorm = item.path.replace(/\\/g, '/').replace(/^\.?\//, '');
179
- const absNorm = absPath.replace(/\\/g, '/');
180
- if (itemNorm === absNorm
181
- || itemNorm.endsWith('/' + normalizedRel)
182
- || itemNorm === normalizedRel) {
183
- return item.key;
184
- }
185
- }
186
- return undefined;
187
- }
188
- /**
189
- * Generate a unique YAML key from the file basename (no extension).
190
- * Appends -2, -3, ... if the key already exists.
191
- */
192
- generateDocumentKey(filePath) {
193
- const base = (0, path_1.basename)(filePath, (0, path_1.extname)(filePath));
194
- const existingKeys = new Set(this.getDocumentItems().map((d) => d.key));
195
- if (!existingKeys.has(base))
196
- return base;
197
- let n = 2;
198
- while (existingKeys.has(`${base}-${n}`)) {
199
- n++;
200
- }
201
- return `${base}-${n}`;
202
- }
203
- /**
204
- * Append a new file-based document entry to crewx.yaml using text-level manipulation.
205
- * Preserves all existing comments and formatting.
206
- */
207
- appendToCrewxYaml(yamlPath, key, relPath) {
208
- const raw = (0, fs_1.readFileSync)(yamlPath, 'utf-8');
209
- // Locate the documents: top-level key (allow inline comments)
210
- const docsMatch = /^documents:\s*(#.*)?$/m.exec(raw);
211
- if (!docsMatch || docsMatch.index === undefined) {
212
- const separator = raw.endsWith('\n') ? '' : '\n';
213
- const newEntry = `${separator}\ndocuments:\n ${key}:\n path: ${relPath}\n`;
214
- (0, fs_1.writeFileSync)(yamlPath, raw + newEntry, 'utf-8');
215
- return;
216
- }
217
- // Content starts right after "documents:\n"
218
- const docsContentStart = docsMatch.index + docsMatch[0].length + 1; // +1 for '\n'
219
- // Find the next top-level key (starts at column 0, letter/underscore, followed by ':')
220
- const afterDocsContent = raw.slice(docsContentStart);
221
- const nextTopLevelMatch = /^[a-zA-Z_][a-zA-Z0-9_-]*\s*:/m.exec(afterDocsContent);
222
- // Insertion point is either before the next top-level key or at end of file
223
- const sectionEnd = nextTopLevelMatch && nextTopLevelMatch.index !== undefined
224
- ? docsContentStart + nextTopLevelMatch.index
225
- : raw.length;
226
- // Detect indentation from the first indented entry in the section
227
- const sectionText = raw.slice(docsContentStart, sectionEnd);
228
- const indentMatch = /^(\s+)\S/m.exec(sectionText);
229
- const indent = indentMatch ? indentMatch[1] : ' ';
230
- const newEntry = `${indent}${key}:\n${indent} path: ${relPath}\n`;
231
- // Insert just before sectionEnd (preserving any trailing content/newlines of the section)
232
- const newRaw = raw.slice(0, sectionEnd) + newEntry + raw.slice(sectionEnd);
233
- (0, fs_1.writeFileSync)(yamlPath, newRaw, 'utf-8');
234
- }
235
- loadRawDocuments() {
236
- const configPath = this.resolveCrewxConfigPath();
237
- if (!configPath)
238
- return null;
239
- try {
240
- const raw = (0, fs_1.readFileSync)(configPath, 'utf-8');
241
- const config = (0, js_yaml_1.load)(raw);
242
- if (!config || typeof config !== 'object')
243
- return null;
244
- const docs = config.documents;
245
- if (!docs || typeof docs !== 'object')
246
- return null;
247
- return docs;
248
- }
249
- catch {
250
- return null;
251
- }
252
- }
253
- resolveDocPath(filePath) {
254
- if ((0, path_1.isAbsolute)(filePath))
255
- return (0, path_1.resolve)(filePath);
256
- return (0, path_1.resolve)((0, path_1.join)(this.projectRoot, filePath));
257
- }
258
- resolveCrewxConfigPath() {
259
- const envPath = process.env.CREWX_CONFIG;
260
- if (envPath && (0, fs_1.existsSync)(envPath))
261
- return envPath;
262
- const base = this.projectRoot;
263
- for (const name of ['crewx.yaml', 'crewx.yml']) {
264
- const p = (0, path_1.join)(base, name);
265
- if ((0, fs_1.existsSync)(p))
266
- return p;
267
- }
268
- return null;
269
- }
270
- };
271
- exports.DocumentService = DocumentService;
272
- exports.DocumentService = DocumentService = __decorate([
273
- (0, common_1.Injectable)()
274
- ], DocumentService);
@@ -1,24 +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.RegisterDocumentDto = void 0;
13
- const swagger_1 = require("@nestjs/swagger");
14
- const class_validator_1 = require("class-validator");
15
- class RegisterDocumentDto {
16
- path;
17
- }
18
- exports.RegisterDocumentDto = RegisterDocumentDto;
19
- __decorate([
20
- (0, swagger_1.ApiProperty)({ description: 'Project-relative path to the .md file (e.g. docs/guide.md)' }),
21
- (0, class_validator_1.IsString)(),
22
- (0, class_validator_1.IsNotEmpty)(),
23
- __metadata("design:type", String)
24
- ], RegisterDocumentDto.prototype, "path", void 0);
@@ -1,47 +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.MkdirRequestDto = void 0;
13
- const class_validator_1 = require("class-validator");
14
- /**
15
- * Filesystem MKDIR request body.
16
- *
17
- * Security model:
18
- * - parentPath must be absolute and pass FsService.assertPathAllowed (BLOCKED_PREFIXES)
19
- * - name must NOT contain path separators ('/' or '\\'), '..', null bytes, or control chars
20
- * - Recursive parent creation is NOT supported — parent must already exist
21
- */
22
- class MkdirRequestDto {
23
- /** Absolute path of the parent directory under which the new folder is created. */
24
- parentPath;
25
- /**
26
- * New folder name (no path separators, no '..', no control chars).
27
- * Length: 1–255. Disallows: '/', '\\', ':', null bytes, control chars (0x00–0x1f).
28
- * security_reviewer Medium-3: ':' 차단 (NTFS ADS, cross-platform regex로 강화)
29
- */
30
- name;
31
- }
32
- exports.MkdirRequestDto = MkdirRequestDto;
33
- __decorate([
34
- (0, class_validator_1.IsString)(),
35
- (0, class_validator_1.IsNotEmpty)(),
36
- (0, class_validator_1.MaxLength)(4096),
37
- __metadata("design:type", String)
38
- ], MkdirRequestDto.prototype, "parentPath", void 0);
39
- __decorate([
40
- (0, class_validator_1.IsString)(),
41
- (0, class_validator_1.IsNotEmpty)(),
42
- (0, class_validator_1.MaxLength)(255),
43
- (0, class_validator_1.Matches)(/^[^\\/:\x00-\x1f]+$/, {
44
- message: 'name must not contain path separators, colon, or control characters',
45
- }),
46
- __metadata("design:type", String)
47
- ], MkdirRequestDto.prototype, "name", void 0);
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,35 +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.TreeQueryDto = void 0;
13
- const class_validator_1 = require("class-validator");
14
- const class_transformer_1 = require("class-transformer");
15
- const swagger_1 = require("@nestjs/swagger");
16
- class TreeQueryDto {
17
- path;
18
- maxDepth;
19
- }
20
- exports.TreeQueryDto = TreeQueryDto;
21
- __decorate([
22
- (0, swagger_1.ApiProperty)({ description: 'Absolute path to list (must be absolute)' }),
23
- (0, class_validator_1.IsString)(),
24
- (0, class_validator_1.IsNotEmpty)(),
25
- __metadata("design:type", String)
26
- ], TreeQueryDto.prototype, "path", void 0);
27
- __decorate([
28
- (0, swagger_1.ApiPropertyOptional)({ description: 'Max depth to traverse (1–5, default 3)', minimum: 1, maximum: 5 }),
29
- (0, class_validator_1.IsOptional)(),
30
- (0, class_transformer_1.Type)(() => Number),
31
- (0, class_validator_1.IsInt)(),
32
- (0, class_validator_1.Min)(1),
33
- (0, class_validator_1.Max)(5),
34
- __metadata("design:type", Number)
35
- ], TreeQueryDto.prototype, "maxDepth", void 0);
@@ -1,63 +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.FsController = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const swagger_1 = require("@nestjs/swagger");
18
- const throttler_1 = require("@nestjs/throttler");
19
- const fs_service_js_1 = require("./fs.service.js");
20
- const mkdir_request_dto_js_1 = require("./dto/mkdir-request.dto.js");
21
- const tree_query_dto_js_1 = require("./dto/tree-query.dto.js");
22
- let FsController = class FsController {
23
- fsService;
24
- constructor(fsService) {
25
- this.fsService = fsService;
26
- }
27
- // FS.TREE: Filesystem directory tree
28
- async getTree(query) {
29
- const data = await this.fsService.getTree(query.path, query.maxDepth ?? 3);
30
- const quickAccess = this.fsService.resolveQuickAccess();
31
- return { success: true, data, quickAccess };
32
- }
33
- // FS.MKDIR: Create a new directory
34
- async mkdir(dto) {
35
- const data = await this.fsService.mkdir(dto.parentPath, dto.name);
36
- return { success: true, data };
37
- }
38
- };
39
- exports.FsController = FsController;
40
- __decorate([
41
- (0, swagger_1.ApiOperation)({ operationId: 'FS.TREE', summary: 'List filesystem tree under path' }),
42
- (0, common_1.Get)('tree'),
43
- __param(0, (0, common_1.Query)()),
44
- __metadata("design:type", Function),
45
- __metadata("design:paramtypes", [tree_query_dto_js_1.TreeQueryDto]),
46
- __metadata("design:returntype", Promise)
47
- ], FsController.prototype, "getTree", null);
48
- __decorate([
49
- (0, swagger_1.ApiOperation)({ operationId: 'FS.MKDIR', summary: 'Create a new directory under parentPath' }),
50
- (0, throttler_1.Throttle)({ default: { ttl: 60000, limit: 20 } }) // security_reviewer Medium-6: write API용 낮은 한도
51
- ,
52
- (0, common_1.Post)('mkdir'),
53
- (0, common_1.HttpCode)(201),
54
- __param(0, (0, common_1.Body)()),
55
- __metadata("design:type", Function),
56
- __metadata("design:paramtypes", [mkdir_request_dto_js_1.MkdirRequestDto]),
57
- __metadata("design:returntype", Promise)
58
- ], FsController.prototype, "mkdir", null);
59
- exports.FsController = FsController = __decorate([
60
- (0, swagger_1.ApiTags)('fs'),
61
- (0, common_1.Controller)('fs'),
62
- __metadata("design:paramtypes", [fs_service_js_1.FsService])
63
- ], FsController);
@@ -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.FsModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const fs_controller_js_1 = require("./fs.controller.js");
12
- const fs_service_js_1 = require("./fs.service.js");
13
- let FsModule = class FsModule {
14
- };
15
- exports.FsModule = FsModule;
16
- exports.FsModule = FsModule = __decorate([
17
- (0, common_1.Module)({
18
- controllers: [fs_controller_js_1.FsController],
19
- providers: [fs_service_js_1.FsService],
20
- exports: [fs_service_js_1.FsService],
21
- })
22
- ], FsModule);