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,303 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
- return c > 3 && r && Object.defineProperty(target, key, r), r;
23
- };
24
- var __importStar = (this && this.__importStar) || (function () {
25
- var ownKeys = function(o) {
26
- ownKeys = Object.getOwnPropertyNames || function (o) {
27
- var ar = [];
28
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
- return ar;
30
- };
31
- return ownKeys(o);
32
- };
33
- return function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- })();
41
- var __metadata = (this && this.__metadata) || function (k, v) {
42
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
- };
44
- var FsService_1;
45
- Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.FsService = void 0;
47
- const common_1 = require("@nestjs/common");
48
- const fs_1 = require("fs");
49
- const os = __importStar(require("os"));
50
- const nodePath = __importStar(require("path"));
51
- const project_repository_js_1 = require("../../repository/project.repository.js");
52
- let FsService = class FsService {
53
- static { FsService_1 = this; }
54
- projectRepo;
55
- logger = new common_1.Logger(FsService_1.name);
56
- /** Hard cap regardless of what caller requests. */
57
- static MAX_DEPTH = 5;
58
- /**
59
- * Prefixes that are unconditionally blocked for security (POSIX).
60
- * Checked against the resolved (real) absolute path.
61
- */
62
- static BLOCKED_PREFIXES = [
63
- '/etc',
64
- '/private',
65
- '/var',
66
- '/System',
67
- '/usr',
68
- '/bin',
69
- '/sbin',
70
- '/dev',
71
- ];
72
- /**
73
- * Prefixes blocked on Windows.
74
- * security_reviewer High-2: Win32 전용 BLOCKED_PREFIXES 분리.
75
- */
76
- static BLOCKED_PREFIXES_WIN = [
77
- 'C:\\Windows',
78
- 'C:\\Program Files',
79
- 'C:\\Program Files (x86)',
80
- 'C:\\System Volume Information',
81
- 'C:\\ProgramData',
82
- 'C:\\Recovery',
83
- ];
84
- constructor(projectRepo) {
85
- this.projectRepo = projectRepo;
86
- }
87
- resolveQuickAccess() {
88
- const home = os.homedir();
89
- const crewxWorkspaces = nodePath.join(home, 'crewx');
90
- return [
91
- { key: 'home', path: home, exists: (0, fs_1.existsSync)(home) },
92
- { key: 'workspaces', path: crewxWorkspaces, exists: (0, fs_1.existsSync)(crewxWorkspaces) },
93
- ];
94
- }
95
- async getTree(rawPath, maxDepth) {
96
- // 1. Reject relative paths immediately
97
- if (!nodePath.isAbsolute(rawPath)) {
98
- throw new common_1.BadRequestException({ code: 'PATH_NOT_ABSOLUTE', message: 'path must be absolute' });
99
- }
100
- // 2. Normalize (resolves .., ., and trailing slashes) without following symlinks
101
- const absPath = nodePath.resolve(rawPath);
102
- // 3. Reject system/protected directories
103
- if (FsService_1.BLOCKED_PREFIXES.some((prefix) => absPath === prefix || absPath.startsWith(prefix + '/'))) {
104
- this.logger.warn(`Blocked path access attempt: ${absPath}`);
105
- throw new common_1.ForbiddenException({ code: 'PATH_BLOCKED', message: 'access to this path is not allowed' });
106
- }
107
- // 4. Check existence
108
- if (!(0, fs_1.existsSync)(absPath)) {
109
- throw new common_1.NotFoundException({ code: 'PATH_NOT_FOUND', message: 'path does not exist' });
110
- }
111
- // 5. Clamp depth
112
- const clampedDepth = Math.min(Math.max(1, maxDepth), FsService_1.MAX_DEPTH);
113
- // 6. Pre-load registered workspace paths (N+1 prevention)
114
- const registeredPaths = new Set(this.projectRepo
115
- .listProjects({ isActive: true, limit: 1000, offset: 0 })
116
- .rows.map((r) => r.workspace_path)
117
- .filter((p) => !!p));
118
- // 7. Recursive walk with symlink-loop detection via visited real paths
119
- return this.walk(absPath, clampedDepth, 0, registeredPaths, new Set());
120
- }
121
- /**
122
- * Creates a new directory at parentPath/name.
123
- *
124
- * security_reviewer 2026-05-07 권고 반영:
125
- * - High-1: realpathSync로 symlink traversal 방어
126
- * - High-2: Win32 BLOCKED_PREFIXES 분기 + UNC path 차단
127
- * - Medium-3: name에 ':' 차단 (NTFS ADS)
128
- * - Medium-4: Windows reserved device name 차단
129
- * - Medium-5: name.trim() === '' 차단
130
- * - Info-9: 성공 시 audit log
131
- */
132
- async mkdir(parentPath, name) {
133
- // 1. Validate parent path is absolute
134
- if (!nodePath.isAbsolute(parentPath)) {
135
- throw new common_1.BadRequestException({ code: 'PATH_NOT_ABSOLUTE', message: 'parentPath must be absolute' });
136
- }
137
- const absParent = nodePath.resolve(parentPath);
138
- // High-1: resolve symlinks BEFORE blocked-prefix check (parent may be a symlink to /etc, etc.)
139
- let realParent;
140
- try {
141
- realParent = (0, fs_1.realpathSync)(absParent);
142
- }
143
- catch {
144
- throw new common_1.NotFoundException({ code: 'PARENT_NOT_FOUND', message: 'parent directory does not exist' });
145
- }
146
- // Verify the resolved parent is actually a directory (catches files on all platforms)
147
- if (!(0, fs_1.statSync)(realParent).isDirectory()) {
148
- throw new common_1.BadRequestException({ code: 'NOT_A_DIRECTORY', message: 'parent is not a directory' });
149
- }
150
- this.assertPathAllowed(realParent);
151
- // 2. Validate name (defense-in-depth — DTO already validates, but server-side recheck)
152
- if (name === '' || name === '.' || name === '..') {
153
- throw new common_1.BadRequestException({ code: 'NAME_INVALID', message: 'name must not be empty, "." or ".."' });
154
- }
155
- if (name.trim() === '') {
156
- // Medium-5: blank-only (spaces/tabs only)
157
- throw new common_1.BadRequestException({ code: 'NAME_INVALID', message: 'name must not be blank' });
158
- }
159
- if (name.includes('/') || name.includes('\\') || /[\x00-\x1f]/.test(name)) {
160
- throw new common_1.BadRequestException({ code: 'NAME_INVALID', message: 'name must not contain separators or control chars' });
161
- }
162
- if (process.platform === 'win32') {
163
- if (name.includes(':')) {
164
- // Medium-3: NTFS Alternate Data Streams
165
- throw new common_1.BadRequestException({ code: 'NAME_INVALID', message: 'name must not contain colon on Windows' });
166
- }
167
- if (/^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\.|$)/i.test(name)) {
168
- // Medium-4: reserved device names
169
- throw new common_1.BadRequestException({ code: 'NAME_INVALID', message: 'reserved device name on Windows' });
170
- }
171
- }
172
- // 3. Resolve target against real parent and verify containment
173
- const target = nodePath.join(realParent, name);
174
- if (!target.startsWith(realParent + nodePath.sep) && target !== realParent) {
175
- throw new common_1.BadRequestException({ code: 'PATH_ESCAPE', message: 'resolved target escapes parent' });
176
- }
177
- // Re-check blocked prefixes against the resolved target
178
- this.assertPathAllowed(target);
179
- // 4. Attempt mkdir (NOT recursive — parent must already exist)
180
- try {
181
- (0, fs_1.mkdirSync)(target); // recursive not specified: ENOENT if parent missing, EEXIST if already present
182
- this.logger.log(`[FS.MKDIR] created: ${target}`); // Info-9: audit log
183
- return { path: target, created: true };
184
- }
185
- catch (err) {
186
- const code = err.code;
187
- if (code === 'EEXIST') {
188
- // Idempotent: if it already exists AND is a directory, return created: false
189
- const stat = (0, fs_1.statSync)(target);
190
- if (stat.isDirectory()) {
191
- return { path: target, created: false };
192
- }
193
- throw new common_1.ConflictException({ code: 'NOT_A_DIRECTORY', message: 'target exists but is not a directory' });
194
- }
195
- if (code === 'EACCES' || code === 'EPERM') {
196
- throw new common_1.ForbiddenException({ code: 'PERMISSION_DENIED', message: 'permission denied' });
197
- }
198
- if (code === 'ENOENT') {
199
- throw new common_1.NotFoundException({ code: 'PARENT_NOT_FOUND', message: 'parent directory does not exist' });
200
- }
201
- if (code === 'ENOTDIR') {
202
- throw new common_1.BadRequestException({ code: 'NOT_A_DIRECTORY', message: 'parent is not a directory' });
203
- }
204
- if (code === 'EROFS') {
205
- throw new common_1.ForbiddenException({ code: 'READ_ONLY_FS', message: 'filesystem is read-only' });
206
- }
207
- if (code === 'ENAMETOOLONG') {
208
- throw new common_1.BadRequestException({ code: 'NAME_TOO_LONG', message: 'path or name too long' });
209
- }
210
- this.logger.error(`mkdir failed: ${err}`);
211
- throw new common_1.InternalServerErrorException({ code: 'MKDIR_FAILED', message: 'failed to create directory' });
212
- }
213
- }
214
- /**
215
- * Asserts that the given absolute path is not in a blocked system prefix.
216
- * Used by both getTree and mkdir.
217
- *
218
- * security_reviewer High-2/High-3:
219
- * - OS-specific BLOCKED_PREFIXES (Win32 vs POSIX)
220
- * - UNC path block on Windows
221
- * - Uses nodePath.sep for correct separator per OS
222
- */
223
- assertPathAllowed(absPath) {
224
- if (process.platform === 'win32' && absPath.startsWith('\\\\')) {
225
- throw new common_1.ForbiddenException({ code: 'PATH_BLOCKED', message: 'UNC paths are not allowed' });
226
- }
227
- const prefixes = process.platform === 'win32' ? FsService_1.BLOCKED_PREFIXES_WIN : FsService_1.BLOCKED_PREFIXES;
228
- if (prefixes.some((p) => absPath === p || absPath.startsWith(p + nodePath.sep))) {
229
- this.logger.warn(`Blocked path access attempt: ${absPath}`);
230
- throw new common_1.ForbiddenException({ code: 'PATH_BLOCKED', message: 'access to this path is not allowed' });
231
- }
232
- }
233
- walk(dir, maxDepth, depth, registered, visited) {
234
- if (depth >= maxDepth)
235
- return [];
236
- // Resolve real path to detect symlink loops
237
- let realDir;
238
- try {
239
- realDir = (0, fs_1.realpathSync)(dir);
240
- }
241
- catch {
242
- return []; // dangling symlink or permission error
243
- }
244
- if (visited.has(realDir)) {
245
- this.logger.warn(`Symlink loop detected at: ${dir} → ${realDir}`);
246
- return [];
247
- }
248
- // Clone visited set so sibling branches don't share loop state
249
- const branchVisited = new Set(visited);
250
- branchVisited.add(realDir);
251
- let entries;
252
- try {
253
- entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
254
- }
255
- catch {
256
- return []; // permission denied or other I/O error
257
- }
258
- const nodes = [];
259
- for (const entry of entries) {
260
- // Skip hidden directories (.git, .claude, etc.)
261
- if (entry.name.startsWith('.'))
262
- continue;
263
- // Directory picker — files are excluded
264
- if (!entry.isDirectory() && !entry.isSymbolicLink())
265
- continue;
266
- const childPath = nodePath.join(dir, entry.name);
267
- // For symlinks: resolve real path, verify it's a directory, and check for loops
268
- if (entry.isSymbolicLink()) {
269
- let realChild;
270
- try {
271
- realChild = (0, fs_1.realpathSync)(childPath);
272
- (0, fs_1.readdirSync)(realChild, { withFileTypes: true }); // throws if not a directory
273
- }
274
- catch {
275
- continue; // broken symlink or target is not a directory
276
- }
277
- // Skip if the symlink target is already on this branch (loop prevention)
278
- if (branchVisited.has(realChild)) {
279
- this.logger.warn(`Symlink loop detected at: ${childPath} → ${realChild}`);
280
- continue;
281
- }
282
- }
283
- const hasCrewxYaml = (0, fs_1.existsSync)(nodePath.join(childPath, 'crewx.yaml')) ||
284
- (0, fs_1.existsSync)(nodePath.join(childPath, 'crewx.yml'));
285
- const children = this.walk(childPath, maxDepth, depth + 1, registered, branchVisited);
286
- nodes.push({
287
- name: entry.name,
288
- path: childPath,
289
- isDirectory: true,
290
- children,
291
- hasCrewxYaml,
292
- isRegistered: registered.has(childPath),
293
- });
294
- }
295
- // Sort alphabetically for deterministic output
296
- return nodes.sort((a, b) => a.name.localeCompare(b.name));
297
- }
298
- };
299
- exports.FsService = FsService;
300
- exports.FsService = FsService = FsService_1 = __decorate([
301
- (0, common_1.Injectable)(),
302
- __metadata("design:paramtypes", [project_repository_js_1.ProjectRepository])
303
- ], FsService);
@@ -1,20 +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.GitModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const git_service_js_1 = require("./git.service.js");
12
- let GitModule = class GitModule {
13
- };
14
- exports.GitModule = GitModule;
15
- exports.GitModule = GitModule = __decorate([
16
- (0, common_1.Module)({
17
- providers: [git_service_js_1.GitService],
18
- exports: [git_service_js_1.GitService],
19
- })
20
- ], GitModule);
@@ -1,222 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
- return c > 3 && r && Object.defineProperty(target, key, r), r;
23
- };
24
- var __importStar = (this && this.__importStar) || (function () {
25
- var ownKeys = function(o) {
26
- ownKeys = Object.getOwnPropertyNames || function (o) {
27
- var ar = [];
28
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
- return ar;
30
- };
31
- return ownKeys(o);
32
- };
33
- return function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- })();
41
- var GitService_1;
42
- Object.defineProperty(exports, "__esModule", { value: true });
43
- exports.GitService = void 0;
44
- const common_1 = require("@nestjs/common");
45
- const path_1 = require("path");
46
- const fs = __importStar(require("fs"));
47
- const git = __importStar(require("isomorphic-git"));
48
- const workspace_context_store_js_1 = require("../../common/workspace-context.store.js");
49
- const AUTHOR = { name: 'CrewX', email: 'crewx@local' };
50
- let GitService = GitService_1 = class GitService {
51
- logger = new common_1.Logger(GitService_1.name);
52
- // Reuse cache object per isomorphic-git recommendation
53
- cache = {};
54
- get dir() {
55
- return (0, workspace_context_store_js_1.getWorkspacePath)();
56
- }
57
- /**
58
- * Stage a file and create a commit. Returns the commit SHA.
59
- */
60
- async commitFile(filepath, message) {
61
- await git.add({ fs, dir: this.dir, filepath, cache: this.cache });
62
- const sha = await git.commit({
63
- fs,
64
- dir: this.dir,
65
- message,
66
- author: AUTHOR,
67
- cache: this.cache,
68
- });
69
- return sha;
70
- }
71
- /**
72
- * Return commit history, optionally filtered by filepath.
73
- */
74
- async getHistory(filepath, depth = 50) {
75
- const commits = await git.log({
76
- fs,
77
- dir: this.dir,
78
- depth,
79
- filepath,
80
- cache: this.cache,
81
- });
82
- return commits.map((c) => ({
83
- sha: c.oid,
84
- message: c.commit.message.trim(),
85
- timestamp: c.commit.committer.timestamp * 1000,
86
- author: c.commit.author.name,
87
- }));
88
- }
89
- /**
90
- * Restore a file to its state at the given commit SHA.
91
- */
92
- async rollbackFile(filepath, commitSha) {
93
- // Read file blob at that commit
94
- const { blob } = await git.readBlob({
95
- fs,
96
- dir: this.dir,
97
- oid: commitSha,
98
- filepath,
99
- cache: this.cache,
100
- });
101
- const absPath = (0, path_1.join)(this.dir, filepath);
102
- fs.writeFileSync(absPath, new Uint8Array(Buffer.from(blob)));
103
- // Commit the rollback
104
- await this.commitFile(filepath, `revert: restore ${filepath} to ${commitSha.slice(0, 7)}`);
105
- }
106
- /**
107
- * Return diff entries for the given commit compared to its parent.
108
- * If filepath is provided, only include that file.
109
- */
110
- async getFileDiff(commitSha, filepath) {
111
- const commits = await git.log({
112
- fs,
113
- dir: this.dir,
114
- depth: 2,
115
- ref: commitSha,
116
- cache: this.cache,
117
- });
118
- const currentCommit = commits[0];
119
- const parentCommit = commits[1];
120
- if (!currentCommit)
121
- return [];
122
- const currentTree = currentCommit.commit.tree;
123
- const parentTree = parentCommit?.commit.tree;
124
- const results = [];
125
- const walkerTrees = parentTree
126
- ? [git.TREE({ ref: parentTree }), git.TREE({ ref: currentTree })]
127
- : [git.TREE({ ref: currentTree })];
128
- const changes = await git.walk({
129
- fs,
130
- dir: this.dir,
131
- trees: walkerTrees,
132
- map: async (path, entries) => {
133
- if (filepath && path !== filepath)
134
- return null;
135
- // When no parent: single walker entry means all files are "add"
136
- if (!parentTree) {
137
- const [current] = entries;
138
- if (!current)
139
- return null;
140
- const entryType = await current.type();
141
- if (entryType === 'tree')
142
- return null;
143
- const oid = await current.oid();
144
- let afterContent;
145
- try {
146
- const { blob } = await git.readBlob({
147
- fs,
148
- dir: this.dir,
149
- oid,
150
- cache: this.cache,
151
- });
152
- afterContent = Buffer.from(blob).toString('utf-8');
153
- }
154
- catch (e) {
155
- this.logger.warn(`Failed to read blob for ${path}: ${e}`);
156
- }
157
- return { filepath: path, type: 'add', after: afterContent };
158
- }
159
- const [before, after] = entries;
160
- const beforeType = await before?.type();
161
- const afterType = await after?.type();
162
- // Skip directories
163
- if (beforeType === 'tree' || afterType === 'tree')
164
- return null;
165
- const beforeOid = await before?.oid();
166
- const afterOid = await after?.oid();
167
- if (beforeOid === afterOid)
168
- return null; // No change
169
- let type;
170
- if (!before || beforeType === undefined) {
171
- type = 'add';
172
- }
173
- else if (!after || afterType === undefined) {
174
- type = 'delete';
175
- }
176
- else {
177
- type = 'modify';
178
- }
179
- let beforeContent;
180
- let afterContent;
181
- try {
182
- if (type !== 'add' && beforeOid) {
183
- const { blob } = await git.readBlob({
184
- fs,
185
- dir: this.dir,
186
- oid: beforeOid,
187
- cache: this.cache,
188
- });
189
- beforeContent = Buffer.from(blob).toString('utf-8');
190
- }
191
- if (type !== 'delete' && afterOid) {
192
- const { blob } = await git.readBlob({
193
- fs,
194
- dir: this.dir,
195
- oid: afterOid,
196
- cache: this.cache,
197
- });
198
- afterContent = Buffer.from(blob).toString('utf-8');
199
- }
200
- }
201
- catch (e) {
202
- this.logger.warn(`Failed to read blob for ${path}: ${e}`);
203
- }
204
- return {
205
- filepath: path,
206
- type,
207
- before: beforeContent,
208
- after: afterContent,
209
- };
210
- },
211
- });
212
- for (const entry of changes) {
213
- if (entry)
214
- results.push(entry);
215
- }
216
- return results;
217
- }
218
- };
219
- exports.GitService = GitService;
220
- exports.GitService = GitService = GitService_1 = __decorate([
221
- (0, common_1.Injectable)()
222
- ], GitService);
@@ -1,49 +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.UpdateGoalDto = void 0;
13
- const class_validator_1 = require("class-validator");
14
- class UpdateGoalDto {
15
- title;
16
- period;
17
- objective;
18
- keyResults;
19
- notes;
20
- reflection;
21
- }
22
- exports.UpdateGoalDto = UpdateGoalDto;
23
- __decorate([
24
- (0, class_validator_1.IsString)(),
25
- __metadata("design:type", String)
26
- ], UpdateGoalDto.prototype, "title", void 0);
27
- __decorate([
28
- (0, class_validator_1.IsOptional)(),
29
- __metadata("design:type", Object)
30
- ], UpdateGoalDto.prototype, "period", void 0);
31
- __decorate([
32
- (0, class_validator_1.IsOptional)(),
33
- __metadata("design:type", Object)
34
- ], UpdateGoalDto.prototype, "objective", void 0);
35
- __decorate([
36
- (0, class_validator_1.IsOptional)(),
37
- (0, class_validator_1.IsArray)(),
38
- __metadata("design:type", Array)
39
- ], UpdateGoalDto.prototype, "keyResults", void 0);
40
- __decorate([
41
- (0, class_validator_1.IsOptional)(),
42
- (0, class_validator_1.IsString)(),
43
- __metadata("design:type", String)
44
- ], UpdateGoalDto.prototype, "notes", void 0);
45
- __decorate([
46
- (0, class_validator_1.IsOptional)(),
47
- (0, class_validator_1.IsString)(),
48
- __metadata("design:type", String)
49
- ], UpdateGoalDto.prototype, "reflection", void 0);
@@ -1,86 +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.GoalController = void 0;
16
- const common_1 = require("@nestjs/common");
17
- const swagger_1 = require("@nestjs/swagger");
18
- const goal_service_js_1 = require("./goal.service.js");
19
- const goal_dto_js_1 = require("./dto/goal.dto.js");
20
- const workspace_decorator_js_1 = require("../../common/decorators/workspace.decorator.js");
21
- let GoalController = class GoalController {
22
- goalService;
23
- constructor(goalService) {
24
- this.goalService = goalService;
25
- }
26
- listGoals(ws, status) {
27
- const data = this.goalService.listGoals(ws.path, status);
28
- return { success: true, data };
29
- }
30
- getGoal(goalId, ws) {
31
- const data = this.goalService.getGoal(ws.path, goalId);
32
- return { success: true, data };
33
- }
34
- putGoal(goalId, dto, ws, createOnly) {
35
- const data = this.goalService.putGoal(ws.path, goalId, dto, createOnly === 'true');
36
- return { success: true, data };
37
- }
38
- deleteGoal(goalId, ws) {
39
- const data = this.goalService.deleteGoal(ws.path, goalId);
40
- return { success: true, data };
41
- }
42
- };
43
- exports.GoalController = GoalController;
44
- __decorate([
45
- (0, swagger_1.ApiOperation)({ operationId: 'GOAL.LIST', summary: 'List goals' }),
46
- (0, common_1.Get)(),
47
- __param(0, (0, workspace_decorator_js_1.Workspace)()),
48
- __param(1, (0, common_1.Query)('status')),
49
- __metadata("design:type", Function),
50
- __metadata("design:paramtypes", [Object, String]),
51
- __metadata("design:returntype", void 0)
52
- ], GoalController.prototype, "listGoals", null);
53
- __decorate([
54
- (0, swagger_1.ApiOperation)({ operationId: 'GOAL.GET', summary: 'Get goal detail' }),
55
- (0, common_1.Get)(':goalId'),
56
- __param(0, (0, common_1.Param)('goalId')),
57
- __param(1, (0, workspace_decorator_js_1.Workspace)()),
58
- __metadata("design:type", Function),
59
- __metadata("design:paramtypes", [String, Object]),
60
- __metadata("design:returntype", void 0)
61
- ], GoalController.prototype, "getGoal", null);
62
- __decorate([
63
- (0, swagger_1.ApiOperation)({ operationId: 'GOAL.PUT', summary: 'Create or update goal' }),
64
- (0, common_1.Put)(':goalId'),
65
- __param(0, (0, common_1.Param)('goalId')),
66
- __param(1, (0, common_1.Body)()),
67
- __param(2, (0, workspace_decorator_js_1.Workspace)()),
68
- __param(3, (0, common_1.Query)('createOnly')),
69
- __metadata("design:type", Function),
70
- __metadata("design:paramtypes", [String, goal_dto_js_1.UpdateGoalDto, Object, String]),
71
- __metadata("design:returntype", void 0)
72
- ], GoalController.prototype, "putGoal", null);
73
- __decorate([
74
- (0, swagger_1.ApiOperation)({ operationId: 'GOAL.DELETE', summary: 'Delete goal' }),
75
- (0, common_1.Delete)(':goalId'),
76
- __param(0, (0, common_1.Param)('goalId')),
77
- __param(1, (0, workspace_decorator_js_1.Workspace)()),
78
- __metadata("design:type", Function),
79
- __metadata("design:paramtypes", [String, Object]),
80
- __metadata("design:returntype", void 0)
81
- ], GoalController.prototype, "deleteGoal", null);
82
- exports.GoalController = GoalController = __decorate([
83
- (0, swagger_1.ApiTags)('goals'),
84
- (0, common_1.Controller)('ws/:slug/goals'),
85
- __metadata("design:paramtypes", [goal_service_js_1.GoalService])
86
- ], GoalController);