cast-code 1.0.0

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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/dist/app.module.js +45 -0
  4. package/dist/app.module.js.map +1 -0
  5. package/dist/common/common.module.js +49 -0
  6. package/dist/common/common.module.js.map +1 -0
  7. package/dist/common/constants/index.js +105 -0
  8. package/dist/common/constants/index.js.map +1 -0
  9. package/dist/common/index.js +24 -0
  10. package/dist/common/index.js.map +1 -0
  11. package/dist/common/services/config.service.js +119 -0
  12. package/dist/common/services/config.service.js.map +1 -0
  13. package/dist/common/services/llm.service.js +56 -0
  14. package/dist/common/services/llm.service.js.map +1 -0
  15. package/dist/common/services/markdown-parser.service.js +101 -0
  16. package/dist/common/services/markdown-parser.service.js.map +1 -0
  17. package/dist/common/services/markdown-renderer.service.js +220 -0
  18. package/dist/common/services/markdown-renderer.service.js.map +1 -0
  19. package/dist/common/services/multi-llm.service.js +115 -0
  20. package/dist/common/services/multi-llm.service.js.map +1 -0
  21. package/dist/common/types/index.js +20 -0
  22. package/dist/common/types/index.js.map +1 -0
  23. package/dist/common/types/markdown.types.js +6 -0
  24. package/dist/common/types/markdown.types.js.map +1 -0
  25. package/dist/main.js +84 -0
  26. package/dist/main.js.map +1 -0
  27. package/dist/modules/agents/agents.module.js +43 -0
  28. package/dist/modules/agents/agents.module.js.map +1 -0
  29. package/dist/modules/agents/definitions/architect.md +35 -0
  30. package/dist/modules/agents/definitions/backend.md +43 -0
  31. package/dist/modules/agents/definitions/coder.md +34 -0
  32. package/dist/modules/agents/definitions/devops.md +42 -0
  33. package/dist/modules/agents/definitions/frontend.md +46 -0
  34. package/dist/modules/agents/definitions/reviewer.md +35 -0
  35. package/dist/modules/agents/definitions/tester.md +41 -0
  36. package/dist/modules/agents/index.js +23 -0
  37. package/dist/modules/agents/index.js.map +1 -0
  38. package/dist/modules/agents/services/agent-loader.service.js +150 -0
  39. package/dist/modules/agents/services/agent-loader.service.js.map +1 -0
  40. package/dist/modules/agents/services/agent-registry.service.js +108 -0
  41. package/dist/modules/agents/services/agent-registry.service.js.map +1 -0
  42. package/dist/modules/agents/types/agent.types.js +6 -0
  43. package/dist/modules/agents/types/agent.types.js.map +1 -0
  44. package/dist/modules/agents/types/index.js +20 -0
  45. package/dist/modules/agents/types/index.js.map +1 -0
  46. package/dist/modules/config/config.module.js +38 -0
  47. package/dist/modules/config/config.module.js.map +1 -0
  48. package/dist/modules/config/index.js +24 -0
  49. package/dist/modules/config/index.js.map +1 -0
  50. package/dist/modules/config/services/config-commands.service.js +405 -0
  51. package/dist/modules/config/services/config-commands.service.js.map +1 -0
  52. package/dist/modules/config/services/config-manager.service.js +175 -0
  53. package/dist/modules/config/services/config-manager.service.js.map +1 -0
  54. package/dist/modules/config/services/init-config.service.js +238 -0
  55. package/dist/modules/config/services/init-config.service.js.map +1 -0
  56. package/dist/modules/config/types/config.types.js +163 -0
  57. package/dist/modules/config/types/config.types.js.map +1 -0
  58. package/dist/modules/config/types/index.js +20 -0
  59. package/dist/modules/config/types/index.js.map +1 -0
  60. package/dist/modules/core/core.module.js +60 -0
  61. package/dist/modules/core/core.module.js.map +1 -0
  62. package/dist/modules/core/index.js +22 -0
  63. package/dist/modules/core/index.js.map +1 -0
  64. package/dist/modules/core/services/deep-agent.service.js +575 -0
  65. package/dist/modules/core/services/deep-agent.service.js.map +1 -0
  66. package/dist/modules/core/services/plan-mode.service.js +225 -0
  67. package/dist/modules/core/services/plan-mode.service.js.map +1 -0
  68. package/dist/modules/git/git.module.js +48 -0
  69. package/dist/modules/git/git.module.js.map +1 -0
  70. package/dist/modules/git/index.js +23 -0
  71. package/dist/modules/git/index.js.map +1 -0
  72. package/dist/modules/git/services/code-review.service.js +330 -0
  73. package/dist/modules/git/services/code-review.service.js.map +1 -0
  74. package/dist/modules/git/services/commit-generator.service.js +403 -0
  75. package/dist/modules/git/services/commit-generator.service.js.map +1 -0
  76. package/dist/modules/git/services/index.js +21 -0
  77. package/dist/modules/git/services/index.js.map +1 -0
  78. package/dist/modules/git/services/monorepo-detector.service.js +338 -0
  79. package/dist/modules/git/services/monorepo-detector.service.js.map +1 -0
  80. package/dist/modules/git/services/pr-generator.service.js +429 -0
  81. package/dist/modules/git/services/pr-generator.service.js.map +1 -0
  82. package/dist/modules/git/services/release-notes.service.js +426 -0
  83. package/dist/modules/git/services/release-notes.service.js.map +1 -0
  84. package/dist/modules/git/types/git.types.js +6 -0
  85. package/dist/modules/git/types/git.types.js.map +1 -0
  86. package/dist/modules/git/types/index.js +20 -0
  87. package/dist/modules/git/types/index.js.map +1 -0
  88. package/dist/modules/mcp/catalog/mcp-templates.js +606 -0
  89. package/dist/modules/mcp/catalog/mcp-templates.js.map +1 -0
  90. package/dist/modules/mcp/index.js +23 -0
  91. package/dist/modules/mcp/index.js.map +1 -0
  92. package/dist/modules/mcp/mcp.module.js +35 -0
  93. package/dist/modules/mcp/mcp.module.js.map +1 -0
  94. package/dist/modules/mcp/services/mcp-client.service.js +289 -0
  95. package/dist/modules/mcp/services/mcp-client.service.js.map +1 -0
  96. package/dist/modules/mcp/services/mcp-registry.service.js +197 -0
  97. package/dist/modules/mcp/services/mcp-registry.service.js.map +1 -0
  98. package/dist/modules/mcp/types/index.js +20 -0
  99. package/dist/modules/mcp/types/index.js.map +1 -0
  100. package/dist/modules/mcp/types/mcp.types.js +6 -0
  101. package/dist/modules/mcp/types/mcp.types.js.map +1 -0
  102. package/dist/modules/memory/index.js +23 -0
  103. package/dist/modules/memory/index.js.map +1 -0
  104. package/dist/modules/memory/memory.module.js +35 -0
  105. package/dist/modules/memory/memory.module.js.map +1 -0
  106. package/dist/modules/memory/services/memory-tools.service.js +78 -0
  107. package/dist/modules/memory/services/memory-tools.service.js.map +1 -0
  108. package/dist/modules/memory/services/memory.service.js +169 -0
  109. package/dist/modules/memory/services/memory.service.js.map +1 -0
  110. package/dist/modules/memory/types/index.js +20 -0
  111. package/dist/modules/memory/types/index.js.map +1 -0
  112. package/dist/modules/memory/types/memory.types.js +6 -0
  113. package/dist/modules/memory/types/memory.types.js.map +1 -0
  114. package/dist/modules/mentions/index.js +22 -0
  115. package/dist/modules/mentions/index.js.map +1 -0
  116. package/dist/modules/mentions/mentions.module.js +32 -0
  117. package/dist/modules/mentions/mentions.module.js.map +1 -0
  118. package/dist/modules/mentions/services/mentions.service.js +336 -0
  119. package/dist/modules/mentions/services/mentions.service.js.map +1 -0
  120. package/dist/modules/mentions/types/index.js +20 -0
  121. package/dist/modules/mentions/types/index.js.map +1 -0
  122. package/dist/modules/mentions/types/mention.types.js +19 -0
  123. package/dist/modules/mentions/types/mention.types.js.map +1 -0
  124. package/dist/modules/permissions/index.js +23 -0
  125. package/dist/modules/permissions/index.js.map +1 -0
  126. package/dist/modules/permissions/permissions.module.js +35 -0
  127. package/dist/modules/permissions/permissions.module.js.map +1 -0
  128. package/dist/modules/permissions/services/permission.service.js +269 -0
  129. package/dist/modules/permissions/services/permission.service.js.map +1 -0
  130. package/dist/modules/permissions/services/prompt.service.js +116 -0
  131. package/dist/modules/permissions/services/prompt.service.js.map +1 -0
  132. package/dist/modules/permissions/types/permission.types.js +32 -0
  133. package/dist/modules/permissions/types/permission.types.js.map +1 -0
  134. package/dist/modules/project/index.js +24 -0
  135. package/dist/modules/project/index.js.map +1 -0
  136. package/dist/modules/project/project.module.js +38 -0
  137. package/dist/modules/project/project.module.js.map +1 -0
  138. package/dist/modules/project/services/project-analyzer.service.js +1063 -0
  139. package/dist/modules/project/services/project-analyzer.service.js.map +1 -0
  140. package/dist/modules/project/services/project-context.service.js +62 -0
  141. package/dist/modules/project/services/project-context.service.js.map +1 -0
  142. package/dist/modules/project/services/project-loader.service.js +147 -0
  143. package/dist/modules/project/services/project-loader.service.js.map +1 -0
  144. package/dist/modules/project/types/index.js +20 -0
  145. package/dist/modules/project/types/index.js.map +1 -0
  146. package/dist/modules/project/types/project.types.js +6 -0
  147. package/dist/modules/project/types/project.types.js.map +1 -0
  148. package/dist/modules/repl/index.js +21 -0
  149. package/dist/modules/repl/index.js.map +1 -0
  150. package/dist/modules/repl/repl.module.js +66 -0
  151. package/dist/modules/repl/repl.module.js.map +1 -0
  152. package/dist/modules/repl/services/commands/agent-commands.service.js +196 -0
  153. package/dist/modules/repl/services/commands/agent-commands.service.js.map +1 -0
  154. package/dist/modules/repl/services/commands/git-commands.service.js +500 -0
  155. package/dist/modules/repl/services/commands/git-commands.service.js.map +1 -0
  156. package/dist/modules/repl/services/commands/mcp-commands.service.js +579 -0
  157. package/dist/modules/repl/services/commands/mcp-commands.service.js.map +1 -0
  158. package/dist/modules/repl/services/commands/project-commands.service.js +226 -0
  159. package/dist/modules/repl/services/commands/project-commands.service.js.map +1 -0
  160. package/dist/modules/repl/services/commands/repl-commands.service.js +254 -0
  161. package/dist/modules/repl/services/commands/repl-commands.service.js.map +1 -0
  162. package/dist/modules/repl/services/repl.service.js +647 -0
  163. package/dist/modules/repl/services/repl.service.js.map +1 -0
  164. package/dist/modules/repl/services/smart-input.js +544 -0
  165. package/dist/modules/repl/services/smart-input.js.map +1 -0
  166. package/dist/modules/repl/services/welcome-screen.service.js +117 -0
  167. package/dist/modules/repl/services/welcome-screen.service.js.map +1 -0
  168. package/dist/modules/repl/utils/prompts-with-esc.js +187 -0
  169. package/dist/modules/repl/utils/prompts-with-esc.js.map +1 -0
  170. package/dist/modules/repl/utils/theme.js +185 -0
  171. package/dist/modules/repl/utils/theme.js.map +1 -0
  172. package/dist/modules/skills/definitions/general/file-operations.md +60 -0
  173. package/dist/modules/skills/definitions/general/git-operations.md +59 -0
  174. package/dist/modules/skills/definitions/general/planning.md +86 -0
  175. package/dist/modules/skills/definitions/general/search.md +59 -0
  176. package/dist/modules/skills/definitions/specialized/api-design.md +85 -0
  177. package/dist/modules/skills/definitions/specialized/database-operations.md +78 -0
  178. package/dist/modules/skills/definitions/specialized/frontend-bootstrap.md +71 -0
  179. package/dist/modules/skills/definitions/specialized/react-patterns.md +77 -0
  180. package/dist/modules/skills/definitions/specialized/testing-strategies.md +79 -0
  181. package/dist/modules/skills/index.js +23 -0
  182. package/dist/modules/skills/index.js.map +1 -0
  183. package/dist/modules/skills/services/skill-loader.service.js +130 -0
  184. package/dist/modules/skills/services/skill-loader.service.js.map +1 -0
  185. package/dist/modules/skills/services/skill-registry.service.js +96 -0
  186. package/dist/modules/skills/services/skill-registry.service.js.map +1 -0
  187. package/dist/modules/skills/skills.module.js +38 -0
  188. package/dist/modules/skills/skills.module.js.map +1 -0
  189. package/dist/modules/skills/types/index.js +20 -0
  190. package/dist/modules/skills/types/index.js.map +1 -0
  191. package/dist/modules/skills/types/skill.types.js +6 -0
  192. package/dist/modules/skills/types/skill.types.js.map +1 -0
  193. package/dist/modules/tasks/index.js +24 -0
  194. package/dist/modules/tasks/index.js.map +1 -0
  195. package/dist/modules/tasks/services/plan-executor.service.js +199 -0
  196. package/dist/modules/tasks/services/plan-executor.service.js.map +1 -0
  197. package/dist/modules/tasks/services/plan-mode.service.js +118 -0
  198. package/dist/modules/tasks/services/plan-mode.service.js.map +1 -0
  199. package/dist/modules/tasks/services/plan-persistence.service.js +148 -0
  200. package/dist/modules/tasks/services/plan-persistence.service.js.map +1 -0
  201. package/dist/modules/tasks/services/task-management.service.js +255 -0
  202. package/dist/modules/tasks/services/task-management.service.js.map +1 -0
  203. package/dist/modules/tasks/services/task-tools.service.js +270 -0
  204. package/dist/modules/tasks/services/task-tools.service.js.map +1 -0
  205. package/dist/modules/tasks/tasks.module.js +49 -0
  206. package/dist/modules/tasks/tasks.module.js.map +1 -0
  207. package/dist/modules/tasks/types/task.types.js +21 -0
  208. package/dist/modules/tasks/types/task.types.js.map +1 -0
  209. package/dist/modules/tools/index.js +24 -0
  210. package/dist/modules/tools/index.js.map +1 -0
  211. package/dist/modules/tools/services/filesystem-tools.service.js +450 -0
  212. package/dist/modules/tools/services/filesystem-tools.service.js.map +1 -0
  213. package/dist/modules/tools/services/search-tools.service.js +63 -0
  214. package/dist/modules/tools/services/search-tools.service.js.map +1 -0
  215. package/dist/modules/tools/services/shell-tools.service.js +194 -0
  216. package/dist/modules/tools/services/shell-tools.service.js.map +1 -0
  217. package/dist/modules/tools/services/tools-registry.service.js +83 -0
  218. package/dist/modules/tools/services/tools-registry.service.js.map +1 -0
  219. package/dist/modules/tools/tools.module.js +46 -0
  220. package/dist/modules/tools/tools.module.js.map +1 -0
  221. package/package.json +74 -0
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "PermissionService", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return PermissionService;
9
+ }
10
+ });
11
+ const _common = require("@nestjs/common");
12
+ const _promises = /*#__PURE__*/ _interop_require_wildcard(require("node:fs/promises"));
13
+ const _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
14
+ const _os = /*#__PURE__*/ _interop_require_wildcard(require("os"));
15
+ const _permissiontypes = require("../types/permission.types");
16
+ const _promptservice = require("./prompt.service");
17
+ function _getRequireWildcardCache(nodeInterop) {
18
+ if (typeof WeakMap !== "function") return null;
19
+ var cacheBabelInterop = new WeakMap();
20
+ var cacheNodeInterop = new WeakMap();
21
+ return (_getRequireWildcardCache = function(nodeInterop) {
22
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
23
+ })(nodeInterop);
24
+ }
25
+ function _interop_require_wildcard(obj, nodeInterop) {
26
+ if (!nodeInterop && obj && obj.__esModule) {
27
+ return obj;
28
+ }
29
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
30
+ return {
31
+ default: obj
32
+ };
33
+ }
34
+ var cache = _getRequireWildcardCache(nodeInterop);
35
+ if (cache && cache.has(obj)) {
36
+ return cache.get(obj);
37
+ }
38
+ var newObj = {
39
+ __proto__: null
40
+ };
41
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
42
+ for(var key in obj){
43
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
44
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
45
+ if (desc && (desc.get || desc.set)) {
46
+ Object.defineProperty(newObj, key, desc);
47
+ } else {
48
+ newObj[key] = obj[key];
49
+ }
50
+ }
51
+ }
52
+ newObj.default = obj;
53
+ if (cache) {
54
+ cache.set(obj, newObj);
55
+ }
56
+ return newObj;
57
+ }
58
+ function _ts_decorate(decorators, target, key, desc) {
59
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
60
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
61
+ 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;
62
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
63
+ }
64
+ function _ts_metadata(k, v) {
65
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
66
+ }
67
+ let PermissionService = class PermissionService {
68
+ async initialize() {
69
+ try {
70
+ const configDir = _path.dirname(this.configPath);
71
+ await _promises.mkdir(configDir, {
72
+ recursive: true
73
+ });
74
+ try {
75
+ const content = await _promises.readFile(this.configPath, 'utf-8');
76
+ const saved = JSON.parse(content);
77
+ this.config.rules = saved.rules || [];
78
+ } catch {
79
+ // Arquivo não existe ainda, usar config padrão
80
+ }
81
+ } catch (error) {
82
+ console.error('Error initializing permissions:', error);
83
+ }
84
+ }
85
+ async checkPermission(command) {
86
+ const dangerLevel = this.getDangerLevel(command);
87
+ if (dangerLevel === _permissiontypes.DangerLevel.SAFE) {
88
+ return true;
89
+ }
90
+ const existingRule = this.findMatchingRule(command);
91
+ if (existingRule && existingRule.allowed) {
92
+ return true;
93
+ }
94
+ if (existingRule && !existingRule.allowed) {
95
+ this.promptService.error('Command denied by saved rule');
96
+ return false;
97
+ }
98
+ const response = await this.requestPermission(command, dangerLevel);
99
+ if (response.scope !== _permissiontypes.PermissionScope.ONCE) {
100
+ await this.saveRule(command, response);
101
+ }
102
+ return response.allowed;
103
+ }
104
+ getDangerLevel(command) {
105
+ for (const pattern of this.DANGER_PATTERNS[_permissiontypes.DangerLevel.DANGEROUS]){
106
+ if (pattern.test(command)) {
107
+ return _permissiontypes.DangerLevel.DANGEROUS;
108
+ }
109
+ }
110
+ for (const pattern of this.DANGER_PATTERNS[_permissiontypes.DangerLevel.CAUTIOUS]){
111
+ if (pattern.test(command)) {
112
+ return _permissiontypes.DangerLevel.CAUTIOUS;
113
+ }
114
+ }
115
+ return _permissiontypes.DangerLevel.SAFE;
116
+ }
117
+ findMatchingRule(command) {
118
+ const sessionRule = this.sessionRules.get(command);
119
+ if (sessionRule) return sessionRule;
120
+ for (const rule of this.config.rules){
121
+ if (this.matchesPattern(command, rule.pattern)) {
122
+ return rule;
123
+ }
124
+ }
125
+ return null;
126
+ }
127
+ matchesPattern(command, pattern) {
128
+ if (pattern.startsWith('/') && pattern.endsWith('/')) {
129
+ const regex = new RegExp(pattern.slice(1, -1));
130
+ return regex.test(command);
131
+ }
132
+ return command === pattern;
133
+ }
134
+ async requestPermission(command, dangerLevel) {
135
+ console.log('');
136
+ this.promptService.warn(`Permission required to execute command:`);
137
+ console.log(` ${command}`);
138
+ console.log('');
139
+ if (dangerLevel === _permissiontypes.DangerLevel.DANGEROUS) {
140
+ this.promptService.error('⚠️ WARNING: This command is potentially DANGEROUS!');
141
+ }
142
+ const choices = [
143
+ {
144
+ key: 'allow-once',
145
+ label: 'Allow once',
146
+ description: 'Execute just this time'
147
+ },
148
+ {
149
+ key: 'allow-session',
150
+ label: 'Allow for session',
151
+ description: 'Allow during this session'
152
+ },
153
+ ...dangerLevel !== _permissiontypes.DangerLevel.DANGEROUS ? [
154
+ {
155
+ key: 'allow-always',
156
+ label: 'Always allow',
157
+ description: 'Never ask again for this command'
158
+ }
159
+ ] : [],
160
+ {
161
+ key: 'deny',
162
+ label: 'Deny',
163
+ description: 'Do not execute'
164
+ }
165
+ ];
166
+ const choice = await this.promptService.choice('What do you want to do?', choices);
167
+ switch(choice){
168
+ case 'allow-once':
169
+ return {
170
+ allowed: true,
171
+ scope: _permissiontypes.PermissionScope.ONCE
172
+ };
173
+ case 'allow-session':
174
+ return {
175
+ allowed: true,
176
+ scope: _permissiontypes.PermissionScope.SESSION
177
+ };
178
+ case 'allow-always':
179
+ return {
180
+ allowed: true,
181
+ scope: _permissiontypes.PermissionScope.ALWAYS
182
+ };
183
+ case 'deny':
184
+ return {
185
+ allowed: false,
186
+ scope: _permissiontypes.PermissionScope.ONCE
187
+ };
188
+ default:
189
+ return {
190
+ allowed: false,
191
+ scope: _permissiontypes.PermissionScope.ONCE
192
+ };
193
+ }
194
+ }
195
+ async saveRule(command, response) {
196
+ const rule = {
197
+ pattern: command,
198
+ allowed: response.allowed,
199
+ scope: response.scope,
200
+ createdAt: Date.now()
201
+ };
202
+ if (response.scope === _permissiontypes.PermissionScope.SESSION) {
203
+ this.sessionRules.set(command, rule);
204
+ } else if (response.scope === _permissiontypes.PermissionScope.ALWAYS) {
205
+ this.config.rules.push(rule);
206
+ await this.persistConfig();
207
+ }
208
+ }
209
+ async persistConfig() {
210
+ try {
211
+ await _promises.writeFile(this.configPath, JSON.stringify(this.config, null, 2), 'utf-8');
212
+ } catch (error) {
213
+ this.promptService.error('Failed to save permissions config: ' + error.message);
214
+ }
215
+ }
216
+ clearSession() {
217
+ this.sessionRules.clear();
218
+ }
219
+ async removeRule(pattern) {
220
+ this.config.rules = this.config.rules.filter((r)=>r.pattern !== pattern);
221
+ await this.persistConfig();
222
+ }
223
+ listRules() {
224
+ return [
225
+ ...this.config.rules
226
+ ];
227
+ }
228
+ constructor(promptService){
229
+ this.promptService = promptService;
230
+ this.sessionRules = new Map();
231
+ this.DANGER_PATTERNS = {
232
+ [_permissiontypes.DangerLevel.DANGEROUS]: [
233
+ /rm\s+(-rf|--recursive\s+--force)/,
234
+ /dd\s+if=.*of=/,
235
+ /mkfs/,
236
+ /:(){ :|:& };:/,
237
+ /curl.*\|\s*(bash|sh)/,
238
+ /wget.*\|\s*(bash|sh)/,
239
+ />\s*\/dev\/sd[a-z]/
240
+ ],
241
+ [_permissiontypes.DangerLevel.CAUTIOUS]: [
242
+ /^rm\s/,
243
+ /^mv\s/,
244
+ /^chmod\s/,
245
+ /^chown\s/,
246
+ /npm\s+install.*-g/,
247
+ /sudo\s/,
248
+ /git\s+push.*--force/,
249
+ /git\s+reset.*--hard/
250
+ ],
251
+ [_permissiontypes.DangerLevel.SAFE]: []
252
+ };
253
+ this.configPath = _path.join(_os.homedir(), '.cast', 'permissions.json');
254
+ this.config = {
255
+ rules: [],
256
+ sessionRules: [],
257
+ dangerPatterns: this.DANGER_PATTERNS
258
+ };
259
+ }
260
+ };
261
+ PermissionService = _ts_decorate([
262
+ (0, _common.Injectable)(),
263
+ _ts_metadata("design:type", Function),
264
+ _ts_metadata("design:paramtypes", [
265
+ typeof _promptservice.PromptService === "undefined" ? Object : _promptservice.PromptService
266
+ ])
267
+ ], PermissionService);
268
+
269
+ //# sourceMappingURL=permission.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/permissions/services/permission.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\nimport {\n PermissionScope,\n PermissionResponse,\n PermissionRule,\n PermissionsConfig,\n DangerLevel,\n} from '../types/permission.types';\nimport { PromptService } from './prompt.service';\n\n@Injectable()\nexport class PermissionService {\n private config: PermissionsConfig;\n private configPath: string;\n private sessionRules: Map<string, PermissionRule> = new Map();\n\n private readonly DANGER_PATTERNS = {\n [DangerLevel.DANGEROUS]: [\n /rm\\s+(-rf|--recursive\\s+--force)/,\n /dd\\s+if=.*of=/,\n /mkfs/,\n /:(){ :|:& };:/,\n /curl.*\\|\\s*(bash|sh)/,\n /wget.*\\|\\s*(bash|sh)/,\n />\\s*\\/dev\\/sd[a-z]/, \n ],\n [DangerLevel.CAUTIOUS]: [\n /^rm\\s/,\n /^mv\\s/,\n /^chmod\\s/,\n /^chown\\s/, \n /npm\\s+install.*-g/,\n /sudo\\s/,\n /git\\s+push.*--force/,\n /git\\s+reset.*--hard/,\n ],\n [DangerLevel.SAFE]: [],\n };\n\n constructor(private promptService: PromptService) {\n this.configPath = path.join(os.homedir(), '.cast', 'permissions.json');\n this.config = {\n rules: [],\n sessionRules: [],\n dangerPatterns: this.DANGER_PATTERNS,\n };\n }\n\n async initialize(): Promise<void> {\n try {\n const configDir = path.dirname(this.configPath);\n await fs.mkdir(configDir, { recursive: true });\n\n try {\n const content = await fs.readFile(this.configPath, 'utf-8');\n const saved = JSON.parse(content);\n this.config.rules = saved.rules || [];\n } catch {\n // Arquivo não existe ainda, usar config padrão\n }\n } catch (error) {\n console.error('Error initializing permissions:', error);\n }\n }\n async checkPermission(command: string): Promise<boolean> {\n const dangerLevel = this.getDangerLevel(command);\n\n if (dangerLevel === DangerLevel.SAFE) {\n return true;\n }\n\n const existingRule = this.findMatchingRule(command);\n if (existingRule && existingRule.allowed) {\n return true;\n }\n if (existingRule && !existingRule.allowed) {\n this.promptService.error('Command denied by saved rule');\n return false;\n }\n\n const response = await this.requestPermission(command, dangerLevel);\n\n if (response.scope !== PermissionScope.ONCE) {\n await this.saveRule(command, response);\n }\n\n return response.allowed;\n }\n\n private getDangerLevel(command: string): DangerLevel {\n for (const pattern of this.DANGER_PATTERNS[DangerLevel.DANGEROUS]) {\n if (pattern.test(command)) {\n return DangerLevel.DANGEROUS;\n }\n }\n\n for (const pattern of this.DANGER_PATTERNS[DangerLevel.CAUTIOUS]) {\n if (pattern.test(command)) {\n return DangerLevel.CAUTIOUS;\n }\n }\n\n return DangerLevel.SAFE;\n }\n\n private findMatchingRule(command: string): PermissionRule | null {\n const sessionRule = this.sessionRules.get(command);\n if (sessionRule) return sessionRule;\n\n for (const rule of this.config.rules) {\n if (this.matchesPattern(command, rule.pattern)) {\n return rule;\n }\n }\n\n return null;\n }\n\n private matchesPattern(command: string, pattern: string): boolean {\n if (pattern.startsWith('/') && pattern.endsWith('/')) {\n const regex = new RegExp(pattern.slice(1, -1));\n return regex.test(command);\n }\n\n return command === pattern;\n }\n\n private async requestPermission(\n command: string,\n dangerLevel: DangerLevel,\n ): Promise<PermissionResponse> {\n console.log('');\n this.promptService.warn(`Permission required to execute command:`);\n console.log(` ${command}`);\n console.log('');\n\n if (dangerLevel === DangerLevel.DANGEROUS) {\n this.promptService.error('⚠️ WARNING: This command is potentially DANGEROUS!');\n }\n\n const choices = [\n { key: 'allow-once', label: 'Allow once', description: 'Execute just this time' },\n {\n key: 'allow-session',\n label: 'Allow for session',\n description: 'Allow during this session',\n },\n ...(dangerLevel !== DangerLevel.DANGEROUS\n ? [\n {\n key: 'allow-always',\n label: 'Always allow',\n description: 'Never ask again for this command',\n },\n ]\n : []),\n { key: 'deny', label: 'Deny', description: 'Do not execute' },\n ];\n\n const choice = await this.promptService.choice('What do you want to do?', choices);\n\n switch (choice) {\n case 'allow-once':\n return { allowed: true, scope: PermissionScope.ONCE };\n case 'allow-session':\n return { allowed: true, scope: PermissionScope.SESSION };\n case 'allow-always':\n return { allowed: true, scope: PermissionScope.ALWAYS };\n case 'deny':\n return { allowed: false, scope: PermissionScope.ONCE };\n default:\n return { allowed: false, scope: PermissionScope.ONCE };\n }\n }\n\n private async saveRule(command: string, response: PermissionResponse): Promise<void> {\n const rule: PermissionRule = {\n pattern: command,\n allowed: response.allowed,\n scope: response.scope,\n createdAt: Date.now(),\n };\n\n if (response.scope === PermissionScope.SESSION) {\n this.sessionRules.set(command, rule);\n } else if (response.scope === PermissionScope.ALWAYS) {\n this.config.rules.push(rule);\n await this.persistConfig();\n }\n }\n\n private async persistConfig(): Promise<void> {\n try {\n await fs.writeFile(this.configPath, JSON.stringify(this.config, null, 2), 'utf-8');\n } catch (error) {\n this.promptService.error('Failed to save permissions config: ' + (error as Error).message);\n }\n }\n\n clearSession(): void {\n this.sessionRules.clear();\n }\n\n async removeRule(pattern: string): Promise<void> {\n this.config.rules = this.config.rules.filter((r) => r.pattern !== pattern);\n await this.persistConfig();\n }\n\n listRules(): PermissionRule[] {\n return [...this.config.rules];\n }\n}\n"],"names":["PermissionService","initialize","configDir","path","dirname","configPath","fs","mkdir","recursive","content","readFile","saved","JSON","parse","config","rules","error","console","checkPermission","command","dangerLevel","getDangerLevel","DangerLevel","SAFE","existingRule","findMatchingRule","allowed","promptService","response","requestPermission","scope","PermissionScope","ONCE","saveRule","pattern","DANGER_PATTERNS","DANGEROUS","test","CAUTIOUS","sessionRule","sessionRules","get","rule","matchesPattern","startsWith","endsWith","regex","RegExp","slice","log","warn","choices","key","label","description","choice","SESSION","ALWAYS","createdAt","Date","now","set","push","persistConfig","writeFile","stringify","message","clearSession","clear","removeRule","filter","r","listRules","Map","join","os","homedir","dangerPatterns"],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "PromptService", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return PromptService;
9
+ }
10
+ });
11
+ const _common = require("@nestjs/common");
12
+ const _readline = /*#__PURE__*/ _interop_require_wildcard(require("readline"));
13
+ const _theme = require("../../repl/utils/theme");
14
+ function _getRequireWildcardCache(nodeInterop) {
15
+ if (typeof WeakMap !== "function") return null;
16
+ var cacheBabelInterop = new WeakMap();
17
+ var cacheNodeInterop = new WeakMap();
18
+ return (_getRequireWildcardCache = function(nodeInterop) {
19
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
20
+ })(nodeInterop);
21
+ }
22
+ function _interop_require_wildcard(obj, nodeInterop) {
23
+ if (!nodeInterop && obj && obj.__esModule) {
24
+ return obj;
25
+ }
26
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
27
+ return {
28
+ default: obj
29
+ };
30
+ }
31
+ var cache = _getRequireWildcardCache(nodeInterop);
32
+ if (cache && cache.has(obj)) {
33
+ return cache.get(obj);
34
+ }
35
+ var newObj = {
36
+ __proto__: null
37
+ };
38
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
39
+ for(var key in obj){
40
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
41
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
42
+ if (desc && (desc.get || desc.set)) {
43
+ Object.defineProperty(newObj, key, desc);
44
+ } else {
45
+ newObj[key] = obj[key];
46
+ }
47
+ }
48
+ }
49
+ newObj.default = obj;
50
+ if (cache) {
51
+ cache.set(obj, newObj);
52
+ }
53
+ return newObj;
54
+ }
55
+ function _ts_decorate(decorators, target, key, desc) {
56
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
57
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
58
+ 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;
59
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
60
+ }
61
+ let PromptService = class PromptService {
62
+ async question(query) {
63
+ return new Promise((resolve)=>{
64
+ const rl = _readline.createInterface({
65
+ input: process.stdin,
66
+ output: process.stdout,
67
+ terminal: false
68
+ });
69
+ rl.question(query + ' ', (answer)=>{
70
+ rl.close();
71
+ resolve(answer);
72
+ });
73
+ });
74
+ }
75
+ async confirm(message, defaultValue = false) {
76
+ const suffix = defaultValue ? ' [Y/n]' : ' [y/N]';
77
+ const answer = await this.question(`${_theme.Colors.yellow}${message}${suffix}${_theme.Colors.reset}`);
78
+ if (!answer.trim()) return defaultValue;
79
+ return answer.toLowerCase().startsWith('y');
80
+ }
81
+ async choice(message, choices) {
82
+ console.log(`\n${_theme.Colors.cyan}${message}${_theme.Colors.reset}`);
83
+ console.log('');
84
+ choices.forEach((choice, index)=>{
85
+ const desc = choice.description ? `${_theme.Colors.dim} - ${choice.description}${_theme.Colors.reset}` : '';
86
+ console.log(` ${_theme.Colors.white}${index + 1}.${_theme.Colors.reset} ${_theme.Colors.bold}${choice.label}${_theme.Colors.reset}${desc}`);
87
+ });
88
+ console.log('');
89
+ while(true){
90
+ const answer = await this.question(`${_theme.Colors.yellow}Choose (1-${choices.length}):${_theme.Colors.reset}`);
91
+ const index = parseInt(answer) - 1;
92
+ if (index >= 0 && index < choices.length) {
93
+ return choices[index].key;
94
+ }
95
+ console.log(`${_theme.Colors.red}Invalid choice. Please try again.${_theme.Colors.reset}`);
96
+ }
97
+ }
98
+ warn(message) {
99
+ console.log(`${_theme.Colors.yellow} ${message}${_theme.Colors.reset}`);
100
+ }
101
+ error(message) {
102
+ console.log(`${_theme.Colors.red} ${message}${_theme.Colors.reset}`);
103
+ }
104
+ success(message) {
105
+ console.log(`${_theme.Colors.green} ${message}${_theme.Colors.reset}`);
106
+ }
107
+ info(message) {
108
+ console.log(`${_theme.Colors.blue} ${message}${_theme.Colors.reset}`);
109
+ }
110
+ close() {}
111
+ };
112
+ PromptService = _ts_decorate([
113
+ (0, _common.Injectable)()
114
+ ], PromptService);
115
+
116
+ //# sourceMappingURL=prompt.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/permissions/services/prompt.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport * as readline from 'readline';\nimport { Colors } from '../../repl/utils/theme';\n\n@Injectable()\nexport class PromptService {\n async question(query: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: false,\n });\n\n rl.question(query + ' ', (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n }\n\n async confirm(message: string, defaultValue = false): Promise<boolean> {\n const suffix = defaultValue ? ' [Y/n]' : ' [y/N]';\n const answer = await this.question(\n `${Colors.yellow}${message}${suffix}${Colors.reset}`,\n );\n\n if (!answer.trim()) return defaultValue;\n\n return answer.toLowerCase().startsWith('y');\n }\n\n async choice<T extends string>(\n message: string,\n choices: { key: T; label: string; description?: string }[],\n ): Promise<T> {\n console.log(`\\n${Colors.cyan}${message}${Colors.reset}`);\n console.log('');\n\n choices.forEach((choice, index) => {\n const desc = choice.description\n ? `${Colors.dim} - ${choice.description}${Colors.reset}`\n : '';\n console.log(\n ` ${Colors.white}${index + 1}.${Colors.reset} ${Colors.bold}${choice.label}${Colors.reset}${desc}`,\n );\n });\n\n console.log('');\n\n while (true) {\n const answer = await this.question(\n `${Colors.yellow}Choose (1-${choices.length}):${Colors.reset}`,\n );\n const index = parseInt(answer) - 1;\n\n if (index >= 0 && index < choices.length) {\n return choices[index].key;\n }\n\n console.log(\n `${Colors.red}Invalid choice. Please try again.${Colors.reset}`,\n );\n }\n }\n\n warn(message: string): void {\n console.log(`${Colors.yellow} ${message}${Colors.reset}`);\n }\n\n error(message: string): void {\n console.log(`${Colors.red} ${message}${Colors.reset}`);\n }\n\n success(message: string): void {\n console.log(`${Colors.green} ${message}${Colors.reset}`);\n }\n\n info(message: string): void {\n console.log(`${Colors.blue} ${message}${Colors.reset}`);\n }\n\n close(): void {}\n}\n"],"names":["PromptService","question","query","Promise","resolve","rl","readline","createInterface","input","process","stdin","output","stdout","terminal","answer","close","confirm","message","defaultValue","suffix","Colors","yellow","reset","trim","toLowerCase","startsWith","choice","choices","console","log","cyan","forEach","index","desc","description","dim","white","bold","label","length","parseInt","key","red","warn","error","success","green","info","blue"],"mappings":";;;;+BAKaA;;;eAAAA;;;wBALc;kEACD;uBACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGhB,IAAA,AAAMA,gBAAN,MAAMA;IACX,MAAMC,SAASC,KAAa,EAAmB;QAC7C,OAAO,IAAIC,QAAQ,CAACC;YAClB,MAAMC,KAAKC,UAASC,eAAe,CAAC;gBAClCC,OAAOC,QAAQC,KAAK;gBACpBC,QAAQF,QAAQG,MAAM;gBACtBC,UAAU;YACZ;YAEAR,GAAGJ,QAAQ,CAACC,QAAQ,KAAK,CAACY;gBACxBT,GAAGU,KAAK;gBACRX,QAAQU;YACV;QACF;IACF;IAEA,MAAME,QAAQC,OAAe,EAAEC,eAAe,KAAK,EAAoB;QACrE,MAAMC,SAASD,eAAe,WAAW;QACzC,MAAMJ,SAAS,MAAM,IAAI,CAACb,QAAQ,CAChC,GAAGmB,aAAM,CAACC,MAAM,GAAGJ,UAAUE,SAASC,aAAM,CAACE,KAAK,EAAE;QAGtD,IAAI,CAACR,OAAOS,IAAI,IAAI,OAAOL;QAE3B,OAAOJ,OAAOU,WAAW,GAAGC,UAAU,CAAC;IACzC;IAEA,MAAMC,OACJT,OAAe,EACfU,OAA0D,EAC9C;QACZC,QAAQC,GAAG,CAAC,CAAC,EAAE,EAAET,aAAM,CAACU,IAAI,GAAGb,UAAUG,aAAM,CAACE,KAAK,EAAE;QACvDM,QAAQC,GAAG,CAAC;QAEZF,QAAQI,OAAO,CAAC,CAACL,QAAQM;YACvB,MAAMC,OAAOP,OAAOQ,WAAW,GAC3B,GAAGd,aAAM,CAACe,GAAG,CAAC,GAAG,EAAET,OAAOQ,WAAW,GAAGd,aAAM,CAACE,KAAK,EAAE,GACtD;YACJM,QAAQC,GAAG,CACT,CAAC,EAAE,EAAET,aAAM,CAACgB,KAAK,GAAGJ,QAAQ,EAAE,CAAC,EAAEZ,aAAM,CAACE,KAAK,CAAC,CAAC,EAAEF,aAAM,CAACiB,IAAI,GAAGX,OAAOY,KAAK,GAAGlB,aAAM,CAACE,KAAK,GAAGW,MAAM;QAEvG;QAEAL,QAAQC,GAAG,CAAC;QAEZ,MAAO,KAAM;YACX,MAAMf,SAAS,MAAM,IAAI,CAACb,QAAQ,CAChC,GAAGmB,aAAM,CAACC,MAAM,CAAC,UAAU,EAAEM,QAAQY,MAAM,CAAC,EAAE,EAAEnB,aAAM,CAACE,KAAK,EAAE;YAEhE,MAAMU,QAAQQ,SAAS1B,UAAU;YAEjC,IAAIkB,SAAS,KAAKA,QAAQL,QAAQY,MAAM,EAAE;gBACxC,OAAOZ,OAAO,CAACK,MAAM,CAACS,GAAG;YAC3B;YAEAb,QAAQC,GAAG,CACT,GAAGT,aAAM,CAACsB,GAAG,CAAC,iCAAiC,EAAEtB,aAAM,CAACE,KAAK,EAAE;QAEnE;IACF;IAEAqB,KAAK1B,OAAe,EAAQ;QAC1BW,QAAQC,GAAG,CAAC,GAAGT,aAAM,CAACC,MAAM,CAAC,EAAE,EAAEJ,UAAUG,aAAM,CAACE,KAAK,EAAE;IAC3D;IAEAsB,MAAM3B,OAAe,EAAQ;QAC3BW,QAAQC,GAAG,CAAC,GAAGT,aAAM,CAACsB,GAAG,CAAC,EAAE,EAAEzB,UAAUG,aAAM,CAACE,KAAK,EAAE;IACxD;IAEAuB,QAAQ5B,OAAe,EAAQ;QAC7BW,QAAQC,GAAG,CAAC,GAAGT,aAAM,CAAC0B,KAAK,CAAC,EAAE,EAAE7B,UAAUG,aAAM,CAACE,KAAK,EAAE;IAC1D;IAEAyB,KAAK9B,OAAe,EAAQ;QAC1BW,QAAQC,GAAG,CAAC,GAAGT,aAAM,CAAC4B,IAAI,CAAC,EAAE,EAAE/B,UAAUG,aAAM,CAACE,KAAK,EAAE;IACzD;IAEAP,QAAc,CAAC;AACjB"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get DangerLevel () {
13
+ return DangerLevel;
14
+ },
15
+ get PermissionScope () {
16
+ return PermissionScope;
17
+ }
18
+ });
19
+ var PermissionScope = /*#__PURE__*/ function(PermissionScope) {
20
+ PermissionScope["ONCE"] = "once";
21
+ PermissionScope["SESSION"] = "session";
22
+ PermissionScope["ALWAYS"] = "always";
23
+ return PermissionScope;
24
+ }({});
25
+ var DangerLevel = /*#__PURE__*/ function(DangerLevel) {
26
+ DangerLevel["SAFE"] = "safe";
27
+ DangerLevel["CAUTIOUS"] = "cautious";
28
+ DangerLevel["DANGEROUS"] = "dangerous";
29
+ return DangerLevel;
30
+ }({});
31
+
32
+ //# sourceMappingURL=permission.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/permissions/types/permission.types.ts"],"sourcesContent":["export enum PermissionScope {\n ONCE = 'once',\n SESSION = 'session',\n ALWAYS = 'always',\n}\n\nexport interface PermissionResponse {\n allowed: boolean;\n scope: PermissionScope;\n remember?: boolean;\n}\n\nexport interface PermissionRule {\n pattern: string;\n allowed: boolean;\n scope: PermissionScope;\n createdAt: number;\n}\n\nexport enum DangerLevel {\n SAFE = 'safe',\n CAUTIOUS = 'cautious',\n DANGEROUS = 'dangerous',\n}\n\nexport interface PermissionsConfig {\n rules: PermissionRule[];\n sessionRules: PermissionRule[];\n dangerPatterns: {\n [key in DangerLevel]: RegExp[];\n };\n}\n"],"names":["DangerLevel","PermissionScope"],"mappings":";;;;;;;;;;;QAmBYA;eAAAA;;QAnBAC;eAAAA;;;AAAL,IAAA,AAAKA,yCAAAA;;;;WAAAA;;AAmBL,IAAA,AAAKD,qCAAAA;;;;WAAAA"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _export_star(require("./project.module"), exports);
6
+ _export_star(require("./services/project-loader.service"), exports);
7
+ _export_star(require("./services/project-context.service"), exports);
8
+ _export_star(require("./services/project-analyzer.service"), exports);
9
+ _export_star(require("./types"), exports);
10
+ function _export_star(from, to) {
11
+ Object.keys(from).forEach(function(k) {
12
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
13
+ Object.defineProperty(to, k, {
14
+ enumerable: true,
15
+ get: function() {
16
+ return from[k];
17
+ }
18
+ });
19
+ }
20
+ });
21
+ return from;
22
+ }
23
+
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/project/index.ts"],"sourcesContent":["export * from './project.module';\nexport * from './services/project-loader.service';\nexport * from './services/project-context.service';\nexport * from './services/project-analyzer.service';\nexport * from './types';\n"],"names":[],"mappings":";;;;qBAAc;qBACA;qBACA;qBACA;qBACA"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "ProjectModule", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return ProjectModule;
9
+ }
10
+ });
11
+ const _common = require("@nestjs/common");
12
+ const _projectloaderservice = require("./services/project-loader.service");
13
+ const _projectcontextservice = require("./services/project-context.service");
14
+ const _projectanalyzerservice = require("./services/project-analyzer.service");
15
+ function _ts_decorate(decorators, target, key, desc) {
16
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
17
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
18
+ 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;
19
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
20
+ }
21
+ let ProjectModule = class ProjectModule {
22
+ };
23
+ ProjectModule = _ts_decorate([
24
+ (0, _common.Module)({
25
+ providers: [
26
+ _projectloaderservice.ProjectLoaderService,
27
+ _projectcontextservice.ProjectContextService,
28
+ _projectanalyzerservice.ProjectAnalyzerService
29
+ ],
30
+ exports: [
31
+ _projectloaderservice.ProjectLoaderService,
32
+ _projectcontextservice.ProjectContextService,
33
+ _projectanalyzerservice.ProjectAnalyzerService
34
+ ]
35
+ })
36
+ ], ProjectModule);
37
+
38
+ //# sourceMappingURL=project.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/project/project.module.ts"],"sourcesContent":["import { Module } from '@nestjs/common';\nimport { ProjectLoaderService } from './services/project-loader.service';\nimport { ProjectContextService } from './services/project-context.service';\nimport { ProjectAnalyzerService } from './services/project-analyzer.service';\n\n@Module({\n providers: [ProjectLoaderService, ProjectContextService, ProjectAnalyzerService],\n exports: [ProjectLoaderService, ProjectContextService, ProjectAnalyzerService],\n})\nexport class ProjectModule {}\n"],"names":["ProjectModule","providers","ProjectLoaderService","ProjectContextService","ProjectAnalyzerService","exports"],"mappings":";;;;+BASaA;;;eAAAA;;;wBATU;sCACc;uCACC;wCACC;;;;;;;AAMhC,IAAA,AAAMA,gBAAN,MAAMA;AAAe;;;QAH1BC,WAAW;YAACC,0CAAoB;YAAEC,4CAAqB;YAAEC,8CAAsB;SAAC;QAChFC,SAAS;YAACH,0CAAoB;YAAEC,4CAAqB;YAAEC,8CAAsB;SAAC"}