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,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "MarkdownParserService", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return MarkdownParserService;
9
+ }
10
+ });
11
+ const _common = require("@nestjs/common");
12
+ const _graymatter = /*#__PURE__*/ _interop_require_default(require("gray-matter"));
13
+ const _promises = /*#__PURE__*/ _interop_require_wildcard(require("node:fs/promises"));
14
+ const _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
15
+ const _glob = require("glob");
16
+ function _interop_require_default(obj) {
17
+ return obj && obj.__esModule ? obj : {
18
+ default: obj
19
+ };
20
+ }
21
+ function _getRequireWildcardCache(nodeInterop) {
22
+ if (typeof WeakMap !== "function") return null;
23
+ var cacheBabelInterop = new WeakMap();
24
+ var cacheNodeInterop = new WeakMap();
25
+ return (_getRequireWildcardCache = function(nodeInterop) {
26
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
27
+ })(nodeInterop);
28
+ }
29
+ function _interop_require_wildcard(obj, nodeInterop) {
30
+ if (!nodeInterop && obj && obj.__esModule) {
31
+ return obj;
32
+ }
33
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
34
+ return {
35
+ default: obj
36
+ };
37
+ }
38
+ var cache = _getRequireWildcardCache(nodeInterop);
39
+ if (cache && cache.has(obj)) {
40
+ return cache.get(obj);
41
+ }
42
+ var newObj = {
43
+ __proto__: null
44
+ };
45
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
46
+ for(var key in obj){
47
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
48
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
49
+ if (desc && (desc.get || desc.set)) {
50
+ Object.defineProperty(newObj, key, desc);
51
+ } else {
52
+ newObj[key] = obj[key];
53
+ }
54
+ }
55
+ }
56
+ newObj.default = obj;
57
+ if (cache) {
58
+ cache.set(obj, newObj);
59
+ }
60
+ return newObj;
61
+ }
62
+ function _ts_decorate(decorators, target, key, desc) {
63
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
64
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
65
+ 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;
66
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
67
+ }
68
+ let MarkdownParserService = class MarkdownParserService {
69
+ async parse(filePath) {
70
+ const content = await _promises.readFile(filePath, 'utf-8');
71
+ const { data, content: markdownContent } = (0, _graymatter.default)(content);
72
+ return {
73
+ frontmatter: data,
74
+ content: markdownContent.trim()
75
+ };
76
+ }
77
+ async parseAll(directory, pattern = '**/*.md') {
78
+ const files = await (0, _glob.glob)(_path.join(directory, pattern));
79
+ const results = new Map();
80
+ for (const file of files){
81
+ const relativePath = _path.relative(directory, file);
82
+ const name = relativePath.replace(/\.md$/, '');
83
+ const parsed = await this.parse(file);
84
+ results.set(name, parsed);
85
+ }
86
+ return results;
87
+ }
88
+ async exists(filePath) {
89
+ try {
90
+ await _promises.access(filePath);
91
+ return true;
92
+ } catch {
93
+ return false;
94
+ }
95
+ }
96
+ };
97
+ MarkdownParserService = _ts_decorate([
98
+ (0, _common.Injectable)()
99
+ ], MarkdownParserService);
100
+
101
+ //# sourceMappingURL=markdown-parser.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/common/services/markdown-parser.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport matter from 'gray-matter';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { glob } from 'glob';\nimport { ParsedMarkdown } from '../types';\n\n@Injectable()\nexport class MarkdownParserService {\n async parse<T>(filePath: string): Promise<ParsedMarkdown<T>> {\n const content = await fs.readFile(filePath, 'utf-8');\n const { data, content: markdownContent } = matter(content);\n\n return {\n frontmatter: data as T,\n content: markdownContent.trim(),\n };\n }\n\n async parseAll<T>(directory: string, pattern = '**/*.md'): Promise<Map<string, ParsedMarkdown<T>>> {\n const files = await glob(path.join(directory, pattern));\n const results = new Map<string, ParsedMarkdown<T>>();\n\n for (const file of files) {\n const relativePath = path.relative(directory, file);\n const name = relativePath.replace(/\\.md$/, '');\n const parsed = await this.parse<T>(file);\n results.set(name, parsed);\n }\n\n return results;\n }\n\n async exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n}\n"],"names":["MarkdownParserService","parse","filePath","content","fs","readFile","data","markdownContent","matter","frontmatter","trim","parseAll","directory","pattern","files","glob","path","join","results","Map","file","relativePath","relative","name","replace","parsed","set","exists","access"],"mappings":";;;;+BAQaA;;;eAAAA;;;wBARc;mEACR;kEACC;8DACE;sBACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAId,IAAA,AAAMA,wBAAN,MAAMA;IACX,MAAMC,MAASC,QAAgB,EAA8B;QAC3D,MAAMC,UAAU,MAAMC,UAAGC,QAAQ,CAACH,UAAU;QAC5C,MAAM,EAAEI,IAAI,EAAEH,SAASI,eAAe,EAAE,GAAGC,IAAAA,mBAAM,EAACL;QAElD,OAAO;YACLM,aAAaH;YACbH,SAASI,gBAAgBG,IAAI;QAC/B;IACF;IAEA,MAAMC,SAAYC,SAAiB,EAAEC,UAAU,SAAS,EAA2C;QACjG,MAAMC,QAAQ,MAAMC,IAAAA,UAAI,EAACC,MAAKC,IAAI,CAACL,WAAWC;QAC9C,MAAMK,UAAU,IAAIC;QAEpB,KAAK,MAAMC,QAAQN,MAAO;YACxB,MAAMO,eAAeL,MAAKM,QAAQ,CAACV,WAAWQ;YAC9C,MAAMG,OAAOF,aAAaG,OAAO,CAAC,SAAS;YAC3C,MAAMC,SAAS,MAAM,IAAI,CAACxB,KAAK,CAAImB;YACnCF,QAAQQ,GAAG,CAACH,MAAME;QACpB;QAEA,OAAOP;IACT;IAEA,MAAMS,OAAOzB,QAAgB,EAAoB;QAC/C,IAAI;YACF,MAAME,UAAGwB,MAAM,CAAC1B;YAChB,OAAO;QACT,EAAE,OAAM;YACN,OAAO;QACT;IACF;AACF"}
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "MarkdownRendererService", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return MarkdownRendererService;
9
+ }
10
+ });
11
+ const _common = require("@nestjs/common");
12
+ const _theme = require("../../modules/repl/utils/theme");
13
+ function _ts_decorate(decorators, target, key, desc) {
14
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
15
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
16
+ 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;
17
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
18
+ }
19
+ let MarkdownRendererService = class MarkdownRendererService {
20
+ render(markdown, options = {}) {
21
+ this.maxWidth = options.maxWidth || process.stdout.columns || 80;
22
+ let text = markdown;
23
+ // Headers (process before other elements)
24
+ text = this.renderHeaders(text);
25
+ // Code blocks
26
+ text = this.renderCodeBlocks(text);
27
+ // Inline code
28
+ text = this.renderInlineCode(text);
29
+ // Bold
30
+ text = this.renderBold(text);
31
+ // Italic
32
+ text = this.renderItalic(text);
33
+ // Blockquotes
34
+ text = this.renderBlockquotes(text);
35
+ // Lists
36
+ text = this.renderLists(text);
37
+ // Horizontal rules
38
+ text = this.renderHorizontalRules(text);
39
+ // Links
40
+ text = this.renderLinks(text);
41
+ // Tables
42
+ text = this.renderTables(text);
43
+ return text;
44
+ }
45
+ renderHeaders(text) {
46
+ // H1: # Title
47
+ text = text.replace(/^# (.+)$/gm, (match, content)=>{
48
+ return `\n${_theme.Colors.cyan}${_theme.Colors.bold}${'─'.repeat(this.maxWidth)}${_theme.Colors.reset}\n${_theme.Colors.cyan}${_theme.Colors.bold}${this.center(content.trim(), this.maxWidth)}${_theme.Colors.reset}\n${_theme.Colors.cyan}${_theme.Colors.bold}${'─'.repeat(this.maxWidth)}${_theme.Colors.reset}\n`;
49
+ });
50
+ // H2: ## Title
51
+ text = text.replace(/^## (.+)$/gm, (match, content)=>{
52
+ return `\n${_theme.Colors.cyan}${_theme.Colors.bold}${content.trim()}${_theme.Colors.reset}\n${_theme.Colors.dim}${'─'.repeat(content.trim().length)}${_theme.Colors.reset}\n`;
53
+ });
54
+ // H3: ### Title
55
+ text = text.replace(/^### (.+)$/gm, (match, content)=>{
56
+ return `\n${_theme.Colors.cyan}${_theme.Colors.bold}${_theme.Icons.arrow} ${content.trim()}${_theme.Colors.reset}\n`;
57
+ });
58
+ // H4-H6: #### Title
59
+ text = text.replace(/^####+ (.+)$/gm, (match, content)=>{
60
+ return `\n${_theme.Colors.bold}${content.trim()}${_theme.Colors.reset}\n`;
61
+ });
62
+ return text;
63
+ }
64
+ renderCodeBlocks(text) {
65
+ return text.replace(/```(\w+)?\n([\s\S]*?)```/g, (match, lang, code)=>{
66
+ const lines = code.trim().split('\n');
67
+ const maxLineLength = Math.max(...lines.map((l)=>l.length), 20);
68
+ const width = Math.min(maxLineLength + 2, this.maxWidth - 4);
69
+ let result = `\n${_theme.Colors.gray}${'┌' + '─'.repeat(width) + (lang ? ` ${lang} ` : '') + '─'.repeat(Math.max(0, width - (lang?.length || 0) - 2))}${_theme.Colors.reset}\n`;
70
+ for (const line of lines.slice(0, 20)){
71
+ const truncated = line.length > width ? line.slice(0, width - 3) + '...' : line;
72
+ result += `${_theme.Colors.gray}│${_theme.Colors.reset} ${_theme.Colors.dim}${truncated}${' '.repeat(Math.max(0, width - truncated.length - 1))}${_theme.Colors.gray}│${_theme.Colors.reset}\n`;
73
+ }
74
+ if (lines.length > 20) {
75
+ result += `${_theme.Colors.gray}│${_theme.Colors.reset} ${_theme.Colors.dim}... (${lines.length - 20} more lines)${' '.repeat(Math.max(0, width - 25))}${_theme.Colors.gray}│${_theme.Colors.reset}\n`;
76
+ }
77
+ result += `${_theme.Colors.gray}${'└' + '─'.repeat(width + 1)}${_theme.Colors.reset}\n`;
78
+ return result;
79
+ });
80
+ }
81
+ renderInlineCode(text) {
82
+ return text.replace(/`([^`]+)`/g, (match, code)=>{
83
+ return `${_theme.Colors.gray}░${_theme.Colors.reset}${_theme.Colors.dim}${code.trim()}${_theme.Colors.reset}${_theme.Colors.gray}░${_theme.Colors.reset}`;
84
+ });
85
+ }
86
+ renderBold(text) {
87
+ // **text** or __text__
88
+ return text.replace(/(\*\*|__)(.+?)\1/g, (match, markers, content)=>{
89
+ return `${_theme.Colors.bold}${_theme.Colors.white}${content.trim()}${_theme.Colors.reset}`;
90
+ });
91
+ }
92
+ renderItalic(text) {
93
+ // *text* or _text_ (but not **)
94
+ return text.replace(/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g, (match, content)=>{
95
+ return `${_theme.Colors.italic}${content.trim()}${_theme.Colors.reset}`;
96
+ });
97
+ }
98
+ renderBlockquotes(text) {
99
+ return text.replace(/^> (.+)$/gm, (match, content)=>{
100
+ return `${_theme.Colors.blue}┃${_theme.Colors.reset} ${_theme.Colors.dim}${content.trim()}${_theme.Colors.reset}`;
101
+ });
102
+ }
103
+ renderLists(text) {
104
+ // Unordered lists
105
+ text = text.replace(/^(\s*)[-*] (.+)$/gm, (match, indent, content)=>{
106
+ const level = indent.length / 2;
107
+ const bullet = level === 0 ? _theme.Icons.bullet : ' ' + _theme.Icons.bullet;
108
+ return `${_theme.Colors.cyan}${bullet}${_theme.Colors.reset} ${content.trim()}`;
109
+ });
110
+ // Ordered lists
111
+ text = text.replace(/^(\s*)(\d+)\. (.+)$/gm, (match, indent, num, content)=>{
112
+ return `${_theme.Colors.cyan}${num}.${_theme.Colors.reset} ${content.trim()}`;
113
+ });
114
+ return text;
115
+ }
116
+ renderHorizontalRules(text) {
117
+ return text.replace(/^(---+|===+|___+|\*\*\*+)$/gm, ()=>{
118
+ return `${_theme.Colors.dim}${'─'.repeat(this.maxWidth)}${_theme.Colors.reset}`;
119
+ });
120
+ }
121
+ renderLinks(text) {
122
+ // [text](url)
123
+ return text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (match, label, url)=>{
124
+ return `${_theme.Colors.underline}${_theme.Colors.blue}${label.trim()}${_theme.Colors.reset} ${_theme.Colors.dim}(${url})${_theme.Colors.reset}`;
125
+ });
126
+ }
127
+ renderTables(text) {
128
+ // Simple table rendering
129
+ const tableRegex = /\|(.+)\|\n\|[-:| ]+\|\n((?:\|.+\|\n?)+)/g;
130
+ return text.replace(tableRegex, (match, headerRow, bodyRows)=>{
131
+ const headers = headerRow.split('|').map((h)=>h.trim()).filter(Boolean);
132
+ const rows = bodyRows.trim().split('\n').map((row)=>row.split('|').map((c)=>c.trim()).filter(Boolean));
133
+ if (headers.length === 0) return match;
134
+ const colWidth = Math.floor((this.maxWidth - 10) / headers.length);
135
+ let result = '\n';
136
+ // Header
137
+ result += `${_theme.Colors.cyan}┌${'─'.repeat(colWidth + 2)}┬${('─'.repeat(colWidth + 2) + '┬').repeat(headers.length - 1)}┐${_theme.Colors.reset}\n`;
138
+ result += `${_theme.Colors.cyan}│${_theme.Colors.reset}`;
139
+ for (const h of headers){
140
+ const padded = this.truncate(h, colWidth).padEnd(colWidth);
141
+ result += ` ${_theme.Colors.bold}${padded}${_theme.Colors.reset} ${_theme.Colors.cyan}│${_theme.Colors.reset}`;
142
+ }
143
+ result += '\n';
144
+ // Separator
145
+ result += `${_theme.Colors.cyan}├${'─'.repeat(colWidth + 2)}┼${('─'.repeat(colWidth + 2) + '┼').repeat(headers.length - 1)}┤${_theme.Colors.reset}\n`;
146
+ // Rows
147
+ for (const row of rows.slice(0, 10)){
148
+ result += `${_theme.Colors.cyan}│${_theme.Colors.reset}`;
149
+ for(let i = 0; i < headers.length; i++){
150
+ const cell = row[i] || '';
151
+ const padded = this.truncate(cell, colWidth).padEnd(colWidth);
152
+ result += ` ${_theme.Colors.dim}${padded}${_theme.Colors.reset} ${_theme.Colors.cyan}│${_theme.Colors.reset}`;
153
+ }
154
+ result += '\n';
155
+ }
156
+ // Footer
157
+ result += `${_theme.Colors.cyan}└${'─'.repeat(colWidth + 2)}┴${('─'.repeat(colWidth + 2) + '┴').repeat(headers.length - 1)}┘${_theme.Colors.reset}\n`;
158
+ return result;
159
+ });
160
+ }
161
+ center(text, width) {
162
+ const padding = Math.max(0, width - text.length);
163
+ const leftPad = Math.floor(padding / 2);
164
+ const rightPad = padding - leftPad;
165
+ return ' '.repeat(leftPad) + text + ' '.repeat(rightPad);
166
+ }
167
+ truncate(text, maxLength) {
168
+ if (text.length <= maxLength) return text;
169
+ return text.slice(0, maxLength - 3) + '...';
170
+ }
171
+ // Helper to create a box around content
172
+ createBox(content, title) {
173
+ const lines = content.split('\n');
174
+ const maxLength = Math.max(...lines.map((l)=>l.replace(/\x1b\[\d+m/g, '').length), 20);
175
+ const width = Math.min(maxLength + 4, this.maxWidth);
176
+ let result = '';
177
+ // Top border
178
+ if (title) {
179
+ const titleLen = title.length;
180
+ const leftPad = Math.floor((width - titleLen - 2) / 2);
181
+ const rightPad = width - titleLen - 2 - leftPad;
182
+ result += `${_theme.Colors.cyan}╭${'─'.repeat(leftPad)} ${title} ${'─'.repeat(rightPad)}╮${_theme.Colors.reset}\n`;
183
+ } else {
184
+ result += `${_theme.Colors.cyan}╭${'─'.repeat(width)}╮${_theme.Colors.reset}\n`;
185
+ }
186
+ // Content
187
+ for (const line of lines){
188
+ const visibleLen = line.replace(/\x1b\[\d+m/g, '').length;
189
+ const padding = Math.max(0, width - 2 - visibleLen);
190
+ result += `${_theme.Colors.cyan}│${_theme.Colors.reset} ${line}${' '.repeat(padding)} ${_theme.Colors.cyan}│${_theme.Colors.reset}\n`;
191
+ }
192
+ // Bottom border
193
+ result += `${_theme.Colors.cyan}╰${'─'.repeat(width)}╯${_theme.Colors.reset}\n`;
194
+ return result;
195
+ }
196
+ // Helper to create a section with header
197
+ createSection(title, content) {
198
+ return `\n${_theme.Colors.cyan}${_theme.Colors.bold}${_theme.Icons.arrow} ${title}${_theme.Colors.reset}\n${_theme.Colors.dim}${'─'.repeat(title.length + 4)}${_theme.Colors.reset}\n${content}\n`;
199
+ }
200
+ // Helper to format tool usage
201
+ formatToolCall(toolName, input) {
202
+ const inputStr = Object.entries(input).map(([k, v])=>`${k}=${JSON.stringify(v).slice(0, 50)}`).join(', ');
203
+ return `${_theme.Colors.dim} ${_theme.Colors.cyan}⎿${_theme.Colors.reset}${_theme.Colors.dim} ${toolName} ${inputStr}${_theme.Colors.reset}`;
204
+ }
205
+ // Helper to format tool result
206
+ formatToolResult(output, maxLines = 5) {
207
+ const lines = output.split('\n');
208
+ const preview = lines.slice(0, maxLines).map((l)=>` ${_theme.Colors.dim}${l.slice(0, 100)}${_theme.Colors.reset}`).join('\n');
209
+ const more = lines.length > maxLines ? `\n ${_theme.Colors.dim}... (${lines.length - maxLines} more lines)${_theme.Colors.reset}` : '';
210
+ return preview + more;
211
+ }
212
+ constructor(){
213
+ this.maxWidth = 80;
214
+ }
215
+ };
216
+ MarkdownRendererService = _ts_decorate([
217
+ (0, _common.Injectable)()
218
+ ], MarkdownRendererService);
219
+
220
+ //# sourceMappingURL=markdown-renderer.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/common/services/markdown-renderer.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { Colors, Icons } from '../../modules/repl/utils/theme';\n\ninterface RenderOptions {\n maxWidth?: number;\n codeTheme?: 'dark' | 'light';\n}\n\n@Injectable()\nexport class MarkdownRendererService {\n private maxWidth = 80;\n\n render(markdown: string, options: RenderOptions = {}): string {\n this.maxWidth = options.maxWidth || process.stdout.columns || 80;\n \n let text = markdown;\n \n // Headers (process before other elements)\n text = this.renderHeaders(text);\n \n // Code blocks\n text = this.renderCodeBlocks(text);\n \n // Inline code\n text = this.renderInlineCode(text);\n \n // Bold\n text = this.renderBold(text);\n \n // Italic\n text = this.renderItalic(text);\n \n // Blockquotes\n text = this.renderBlockquotes(text);\n \n // Lists\n text = this.renderLists(text);\n \n // Horizontal rules\n text = this.renderHorizontalRules(text);\n \n // Links\n text = this.renderLinks(text);\n \n // Tables\n text = this.renderTables(text);\n \n return text;\n }\n\n private renderHeaders(text: string): string {\n // H1: # Title\n text = text.replace(/^# (.+)$/gm, (match, content) => {\n return `\\n${Colors.cyan}${Colors.bold}${'─'.repeat(this.maxWidth)}${Colors.reset}\\n${Colors.cyan}${Colors.bold}${this.center(content.trim(), this.maxWidth)}${Colors.reset}\\n${Colors.cyan}${Colors.bold}${'─'.repeat(this.maxWidth)}${Colors.reset}\\n`;\n });\n \n // H2: ## Title\n text = text.replace(/^## (.+)$/gm, (match, content) => {\n return `\\n${Colors.cyan}${Colors.bold}${content.trim()}${Colors.reset}\\n${Colors.dim}${'─'.repeat(content.trim().length)}${Colors.reset}\\n`;\n });\n \n // H3: ### Title\n text = text.replace(/^### (.+)$/gm, (match, content) => {\n return `\\n${Colors.cyan}${Colors.bold}${Icons.arrow} ${content.trim()}${Colors.reset}\\n`;\n });\n \n // H4-H6: #### Title\n text = text.replace(/^####+ (.+)$/gm, (match, content) => {\n return `\\n${Colors.bold}${content.trim()}${Colors.reset}\\n`;\n });\n \n return text;\n }\n\n private renderCodeBlocks(text: string): string {\n return text.replace(/```(\\w+)?\\n([\\s\\S]*?)```/g, (match, lang, code) => {\n const lines = code.trim().split('\\n');\n const maxLineLength = Math.max(...lines.map(l => l.length), 20);\n const width = Math.min(maxLineLength + 2, this.maxWidth - 4);\n \n let result = `\\n${Colors.gray}${'┌' + '─'.repeat(width) + (lang ? ` ${lang} ` : '') + '─'.repeat(Math.max(0, width - (lang?.length || 0) - 2))}${Colors.reset}\\n`;\n \n for (const line of lines.slice(0, 20)) {\n const truncated = line.length > width ? line.slice(0, width - 3) + '...' : line;\n result += `${Colors.gray}│${Colors.reset} ${Colors.dim}${truncated}${' '.repeat(Math.max(0, width - truncated.length - 1))}${Colors.gray}│${Colors.reset}\\n`;\n }\n \n if (lines.length > 20) {\n result += `${Colors.gray}│${Colors.reset} ${Colors.dim}... (${lines.length - 20} more lines)${' '.repeat(Math.max(0, width - 25))}${Colors.gray}│${Colors.reset}\\n`;\n }\n \n result += `${Colors.gray}${'└' + '─'.repeat(width + 1)}${Colors.reset}\\n`;\n return result;\n });\n }\n\n private renderInlineCode(text: string): string {\n return text.replace(/`([^`]+)`/g, (match, code) => {\n return `${Colors.gray}░${Colors.reset}${Colors.dim}${code.trim()}${Colors.reset}${Colors.gray}░${Colors.reset}`;\n });\n }\n\n private renderBold(text: string): string {\n // **text** or __text__\n return text.replace(/(\\*\\*|__)(.+?)\\1/g, (match, markers, content) => {\n return `${Colors.bold}${Colors.white}${content.trim()}${Colors.reset}`;\n });\n }\n\n private renderItalic(text: string): string {\n // *text* or _text_ (but not **)\n return text.replace(/(?<!\\*)\\*(?!\\*)(.+?)(?<!\\*)\\*(?!\\*)/g, (match, content) => {\n return `${Colors.italic}${content.trim()}${Colors.reset}`;\n });\n }\n\n private renderBlockquotes(text: string): string {\n return text.replace(/^> (.+)$/gm, (match, content) => {\n return `${Colors.blue}┃${Colors.reset} ${Colors.dim}${content.trim()}${Colors.reset}`;\n });\n }\n\n private renderLists(text: string): string {\n // Unordered lists\n text = text.replace(/^(\\s*)[-*] (.+)$/gm, (match, indent, content) => {\n const level = indent.length / 2;\n const bullet = level === 0 ? Icons.bullet : ' ' + Icons.bullet;\n return `${Colors.cyan}${bullet}${Colors.reset} ${content.trim()}`;\n });\n \n // Ordered lists\n text = text.replace(/^(\\s*)(\\d+)\\. (.+)$/gm, (match, indent, num, content) => {\n return `${Colors.cyan}${num}.${Colors.reset} ${content.trim()}`;\n });\n \n return text;\n }\n\n private renderHorizontalRules(text: string): string {\n return text.replace(/^(---+|===+|___+|\\*\\*\\*+)$/gm, () => {\n return `${Colors.dim}${'─'.repeat(this.maxWidth)}${Colors.reset}`;\n });\n }\n\n private renderLinks(text: string): string {\n // [text](url)\n return text.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (match, label, url) => {\n return `${Colors.underline}${Colors.blue}${label.trim()}${Colors.reset} ${Colors.dim}(${url})${Colors.reset}`;\n });\n }\n\n private renderTables(text: string): string {\n // Simple table rendering\n const tableRegex = /\\|(.+)\\|\\n\\|[-:| ]+\\|\\n((?:\\|.+\\|\\n?)+)/g;\n \n return text.replace(tableRegex, (match, headerRow, bodyRows) => {\n const headers = headerRow.split('|').map((h: string) => h.trim()).filter(Boolean);\n const rows = bodyRows.trim().split('\\n').map((row: string) => \n row.split('|').map((c: string) => c.trim()).filter(Boolean)\n );\n \n if (headers.length === 0) return match;\n \n const colWidth = Math.floor((this.maxWidth - 10) / headers.length);\n \n let result = '\\n';\n \n // Header\n result += `${Colors.cyan}┌${'─'.repeat(colWidth + 2)}┬${('─'.repeat(colWidth + 2) + '┬').repeat(headers.length - 1)}┐${Colors.reset}\\n`;\n result += `${Colors.cyan}│${Colors.reset}`;\n for (const h of headers) {\n const padded = this.truncate(h, colWidth).padEnd(colWidth);\n result += ` ${Colors.bold}${padded}${Colors.reset} ${Colors.cyan}│${Colors.reset}`;\n }\n result += '\\n';\n \n // Separator\n result += `${Colors.cyan}├${'─'.repeat(colWidth + 2)}┼${('─'.repeat(colWidth + 2) + '┼').repeat(headers.length - 1)}┤${Colors.reset}\\n`;\n \n // Rows\n for (const row of rows.slice(0, 10)) {\n result += `${Colors.cyan}│${Colors.reset}`;\n for (let i = 0; i < headers.length; i++) {\n const cell = row[i] || '';\n const padded = this.truncate(cell, colWidth).padEnd(colWidth);\n result += ` ${Colors.dim}${padded}${Colors.reset} ${Colors.cyan}│${Colors.reset}`;\n }\n result += '\\n';\n }\n \n // Footer\n result += `${Colors.cyan}└${'─'.repeat(colWidth + 2)}┴${('─'.repeat(colWidth + 2) + '┴').repeat(headers.length - 1)}┘${Colors.reset}\\n`;\n \n return result;\n });\n }\n\n private center(text: string, width: number): string {\n const padding = Math.max(0, width - text.length);\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n return ' '.repeat(leftPad) + text + ' '.repeat(rightPad);\n }\n\n private truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - 3) + '...';\n }\n\n // Helper to create a box around content\n createBox(content: string, title?: string): string {\n const lines = content.split('\\n');\n const maxLength = Math.max(...lines.map(l => l.replace(/\\x1b\\[\\d+m/g, '').length), 20);\n const width = Math.min(maxLength + 4, this.maxWidth);\n \n let result = '';\n \n // Top border\n if (title) {\n const titleLen = title.length;\n const leftPad = Math.floor((width - titleLen - 2) / 2);\n const rightPad = width - titleLen - 2 - leftPad;\n result += `${Colors.cyan}╭${'─'.repeat(leftPad)} ${title} ${'─'.repeat(rightPad)}╮${Colors.reset}\\n`;\n } else {\n result += `${Colors.cyan}╭${'─'.repeat(width)}╮${Colors.reset}\\n`;\n }\n \n // Content\n for (const line of lines) {\n const visibleLen = line.replace(/\\x1b\\[\\d+m/g, '').length;\n const padding = Math.max(0, width - 2 - visibleLen);\n result += `${Colors.cyan}│${Colors.reset} ${line}${' '.repeat(padding)} ${Colors.cyan}│${Colors.reset}\\n`;\n }\n \n // Bottom border\n result += `${Colors.cyan}╰${'─'.repeat(width)}╯${Colors.reset}\\n`;\n \n return result;\n }\n\n // Helper to create a section with header\n createSection(title: string, content: string): string {\n return `\\n${Colors.cyan}${Colors.bold}${Icons.arrow} ${title}${Colors.reset}\\n${Colors.dim}${'─'.repeat(title.length + 4)}${Colors.reset}\\n${content}\\n`;\n }\n\n // Helper to format tool usage\n formatToolCall(toolName: string, input: Record<string, any>): string {\n const inputStr = Object.entries(input)\n .map(([k, v]) => `${k}=${JSON.stringify(v).slice(0, 50)}`)\n .join(', ');\n \n return `${Colors.dim} ${Colors.cyan}⎿${Colors.reset}${Colors.dim} ${toolName} ${inputStr}${Colors.reset}`;\n }\n\n // Helper to format tool result\n formatToolResult(output: string, maxLines = 5): string {\n const lines = output.split('\\n');\n const preview = lines.slice(0, maxLines).map(l => ` ${Colors.dim}${l.slice(0, 100)}${Colors.reset}`).join('\\n');\n const more = lines.length > maxLines ? `\\n ${Colors.dim}... (${lines.length - maxLines} more lines)${Colors.reset}` : '';\n return preview + more;\n }\n}\n"],"names":["MarkdownRendererService","render","markdown","options","maxWidth","process","stdout","columns","text","renderHeaders","renderCodeBlocks","renderInlineCode","renderBold","renderItalic","renderBlockquotes","renderLists","renderHorizontalRules","renderLinks","renderTables","replace","match","content","Colors","cyan","bold","repeat","reset","center","trim","dim","length","Icons","arrow","lang","code","lines","split","maxLineLength","Math","max","map","l","width","min","result","gray","line","slice","truncated","markers","white","italic","blue","indent","level","bullet","num","label","url","underline","tableRegex","headerRow","bodyRows","headers","h","filter","Boolean","rows","row","c","colWidth","floor","padded","truncate","padEnd","i","cell","padding","leftPad","rightPad","maxLength","createBox","title","titleLen","visibleLen","createSection","formatToolCall","toolName","input","inputStr","Object","entries","k","v","JSON","stringify","join","formatToolResult","output","maxLines","preview","more"],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "MultiLlmService", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return MultiLlmService;
9
+ }
10
+ });
11
+ const _common = require("@nestjs/common");
12
+ const _openai = require("@langchain/openai");
13
+ const _ollama = require("@langchain/ollama");
14
+ const _anthropic = require("@langchain/anthropic");
15
+ const _googlegenai = require("@langchain/google-genai");
16
+ const _configmanagerservice = require("../../modules/config/services/config-manager.service");
17
+ function _ts_decorate(decorators, target, key, desc) {
18
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
19
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
20
+ 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;
21
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
22
+ }
23
+ function _ts_metadata(k, v) {
24
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
25
+ }
26
+ let MultiLlmService = class MultiLlmService {
27
+ createModel(purpose = 'default', streaming = false) {
28
+ const modelConfig = this.configManager.getModelConfig(purpose);
29
+ if (!modelConfig) {
30
+ throw new Error(`No model configured for purpose "${purpose}". ` + 'Run "cast config init" to configure.');
31
+ }
32
+ const { provider, model, temperature } = modelConfig;
33
+ const providerConfig = this.configManager.getProviderConfig(provider);
34
+ if (!providerConfig) {
35
+ throw new Error(`Provider "${provider}" is not configured. ` + 'Run "cast config init" to configure.');
36
+ }
37
+ return this.createModelForProvider(provider, providerConfig, model, temperature, streaming);
38
+ }
39
+ createStreamingModel(purpose = 'default') {
40
+ return this.createModel(purpose, true);
41
+ }
42
+ createModelForProvider(provider, config, model, temperature, streaming) {
43
+ switch(provider){
44
+ case 'openai':
45
+ case 'deepseek':
46
+ case 'openrouter':
47
+ return new _openai.ChatOpenAI({
48
+ modelName: model,
49
+ ...temperature !== undefined ? {
50
+ temperature
51
+ } : {},
52
+ openAIApiKey: config.apiKey,
53
+ configuration: {
54
+ baseURL: config.baseUrl
55
+ },
56
+ streaming,
57
+ streamUsage: streaming
58
+ });
59
+ case 'anthropic':
60
+ return new _anthropic.ChatAnthropic({
61
+ modelName: model,
62
+ ...temperature !== undefined ? {
63
+ temperature
64
+ } : {},
65
+ anthropicApiKey: config.apiKey,
66
+ anthropicApiUrl: config.baseUrl,
67
+ streaming
68
+ });
69
+ case 'gemini':
70
+ return new _googlegenai.ChatGoogleGenerativeAI({
71
+ modelName: model,
72
+ ...temperature !== undefined ? {
73
+ temperature
74
+ } : {},
75
+ apiKey: config.apiKey,
76
+ streaming
77
+ });
78
+ case 'kimi':
79
+ return new _openai.ChatOpenAI({
80
+ modelName: model,
81
+ ...temperature !== undefined ? {
82
+ temperature
83
+ } : {},
84
+ openAIApiKey: config.apiKey,
85
+ configuration: {
86
+ baseURL: config.baseUrl || 'https://api.moonshot.cn/v1'
87
+ },
88
+ streaming,
89
+ streamUsage: streaming
90
+ });
91
+ case 'ollama':
92
+ return new _ollama.ChatOllama({
93
+ model,
94
+ ...temperature !== undefined ? {
95
+ temperature
96
+ } : {},
97
+ baseUrl: config.baseUrl || 'http://localhost:11434'
98
+ });
99
+ default:
100
+ throw new Error(`Unsupported provider: ${provider}`);
101
+ }
102
+ }
103
+ constructor(configManager){
104
+ this.configManager = configManager;
105
+ }
106
+ };
107
+ MultiLlmService = _ts_decorate([
108
+ (0, _common.Injectable)(),
109
+ _ts_metadata("design:type", Function),
110
+ _ts_metadata("design:paramtypes", [
111
+ typeof _configmanagerservice.ConfigManagerService === "undefined" ? Object : _configmanagerservice.ConfigManagerService
112
+ ])
113
+ ], MultiLlmService);
114
+
115
+ //# sourceMappingURL=multi-llm.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/common/services/multi-llm.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { ChatOpenAI } from '@langchain/openai';\nimport { ChatOllama } from '@langchain/ollama';\nimport { ChatAnthropic } from '@langchain/anthropic';\nimport { ChatGoogleGenerativeAI } from '@langchain/google-genai';\nimport { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport { ConfigManagerService } from '../../modules/config/services/config-manager.service';\nimport {\n ModelPurpose,\n ProviderType,\n} from '../../modules/config/types/config.types';\n\n@Injectable()\nexport class MultiLlmService {\n constructor(private readonly configManager: ConfigManagerService) {}\n\n createModel(purpose: ModelPurpose = 'default', streaming = false): BaseChatModel {\n const modelConfig = this.configManager.getModelConfig(purpose);\n\n if (!modelConfig) {\n throw new Error(\n `No model configured for purpose \"${purpose}\". ` +\n 'Run \"cast config init\" to configure.'\n );\n }\n\n const { provider, model, temperature } = modelConfig;\n const providerConfig = this.configManager.getProviderConfig(provider);\n\n if (!providerConfig) {\n throw new Error(\n `Provider \"${provider}\" is not configured. ` +\n 'Run \"cast config init\" to configure.'\n );\n }\n\n return this.createModelForProvider(\n provider,\n providerConfig,\n model,\n temperature,\n streaming\n );\n }\n\n createStreamingModel(purpose: ModelPurpose = 'default'): BaseChatModel {\n return this.createModel(purpose, true);\n }\n\n private createModelForProvider(\n provider: ProviderType,\n config: { apiKey?: string; baseUrl?: string },\n model: string,\n temperature: number | undefined,\n streaming: boolean\n ): BaseChatModel {\n switch (provider) {\n case 'openai':\n case 'deepseek':\n case 'openrouter':\n return new ChatOpenAI({\n modelName: model,\n ...(temperature !== undefined ? { temperature } : {}),\n openAIApiKey: config.apiKey,\n configuration: {\n baseURL: config.baseUrl,\n },\n streaming,\n streamUsage: streaming,\n });\n\n case 'anthropic':\n return new ChatAnthropic({\n modelName: model,\n ...(temperature !== undefined ? { temperature } : {}),\n anthropicApiKey: config.apiKey,\n anthropicApiUrl: config.baseUrl,\n streaming,\n });\n\n case 'gemini':\n return new ChatGoogleGenerativeAI({\n modelName: model,\n ...(temperature !== undefined ? { temperature } : {}),\n apiKey: config.apiKey,\n streaming,\n });\n\n case 'kimi':\n return new ChatOpenAI({\n modelName: model,\n ...(temperature !== undefined ? { temperature } : {}),\n openAIApiKey: config.apiKey,\n configuration: {\n baseURL: config.baseUrl || 'https://api.moonshot.cn/v1',\n },\n streaming,\n streamUsage: streaming,\n });\n\n case 'ollama':\n return new ChatOllama({\n model,\n ...(temperature !== undefined ? { temperature } : {}),\n baseUrl: config.baseUrl || 'http://localhost:11434',\n });\n\n default:\n throw new Error(`Unsupported provider: ${provider}`);\n }\n }\n}\n"],"names":["MultiLlmService","createModel","purpose","streaming","modelConfig","configManager","getModelConfig","Error","provider","model","temperature","providerConfig","getProviderConfig","createModelForProvider","createStreamingModel","config","ChatOpenAI","modelName","undefined","openAIApiKey","apiKey","configuration","baseURL","baseUrl","streamUsage","ChatAnthropic","anthropicApiKey","anthropicApiUrl","ChatGoogleGenerativeAI","ChatOllama"],"mappings":";;;;+BAaaA;;;eAAAA;;;wBAbc;wBACA;wBACA;2BACG;6BACS;sCAEF;;;;;;;;;;AAO9B,IAAA,AAAMA,kBAAN,MAAMA;IAGXC,YAAYC,UAAwB,SAAS,EAAEC,YAAY,KAAK,EAAiB;QAC/E,MAAMC,cAAc,IAAI,CAACC,aAAa,CAACC,cAAc,CAACJ;QAEtD,IAAI,CAACE,aAAa;YAChB,MAAM,IAAIG,MACR,CAAC,iCAAiC,EAAEL,QAAQ,GAAG,CAAC,GAC9C;QAEN;QAEA,MAAM,EAAEM,QAAQ,EAAEC,KAAK,EAAEC,WAAW,EAAE,GAAGN;QACzC,MAAMO,iBAAiB,IAAI,CAACN,aAAa,CAACO,iBAAiB,CAACJ;QAE5D,IAAI,CAACG,gBAAgB;YACnB,MAAM,IAAIJ,MACR,CAAC,UAAU,EAAEC,SAAS,qBAAqB,CAAC,GAC1C;QAEN;QAEA,OAAO,IAAI,CAACK,sBAAsB,CAChCL,UACAG,gBACAF,OACAC,aACAP;IAEJ;IAEAW,qBAAqBZ,UAAwB,SAAS,EAAiB;QACrE,OAAO,IAAI,CAACD,WAAW,CAACC,SAAS;IACnC;IAEQW,uBACNL,QAAsB,EACtBO,MAA6C,EAC7CN,KAAa,EACbC,WAA+B,EAC/BP,SAAkB,EACH;QACf,OAAQK;YACN,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAO,IAAIQ,kBAAU,CAAC;oBACpBC,WAAWR;oBACX,GAAIC,gBAAgBQ,YAAY;wBAAER;oBAAY,IAAI,CAAC,CAAC;oBACpDS,cAAcJ,OAAOK,MAAM;oBAC3BC,eAAe;wBACbC,SAASP,OAAOQ,OAAO;oBACzB;oBACApB;oBACAqB,aAAarB;gBACf;YAEF,KAAK;gBACH,OAAO,IAAIsB,wBAAa,CAAC;oBACvBR,WAAWR;oBACX,GAAIC,gBAAgBQ,YAAY;wBAAER;oBAAY,IAAI,CAAC,CAAC;oBACpDgB,iBAAiBX,OAAOK,MAAM;oBAC9BO,iBAAiBZ,OAAOQ,OAAO;oBAC/BpB;gBACF;YAEF,KAAK;gBACH,OAAO,IAAIyB,mCAAsB,CAAC;oBAChCX,WAAWR;oBACX,GAAIC,gBAAgBQ,YAAY;wBAAER;oBAAY,IAAI,CAAC,CAAC;oBACpDU,QAAQL,OAAOK,MAAM;oBACrBjB;gBACF;YAEF,KAAK;gBACH,OAAO,IAAIa,kBAAU,CAAC;oBACpBC,WAAWR;oBACX,GAAIC,gBAAgBQ,YAAY;wBAAER;oBAAY,IAAI,CAAC,CAAC;oBACpDS,cAAcJ,OAAOK,MAAM;oBAC3BC,eAAe;wBACbC,SAASP,OAAOQ,OAAO,IAAI;oBAC7B;oBACApB;oBACAqB,aAAarB;gBACf;YAEF,KAAK;gBACH,OAAO,IAAI0B,kBAAU,CAAC;oBACpBpB;oBACA,GAAIC,gBAAgBQ,YAAY;wBAAER;oBAAY,IAAI,CAAC,CAAC;oBACpDa,SAASR,OAAOQ,OAAO,IAAI;gBAC7B;YAEF;gBACE,MAAM,IAAIhB,MAAM,CAAC,sBAAsB,EAAEC,UAAU;QACvD;IACF;IAhGA,YAAY,AAAiBH,aAAmC,CAAE;aAArCA,gBAAAA;IAAsC;AAiGrE"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _export_star(require("./markdown.types"), exports);
6
+ function _export_star(from, to) {
7
+ Object.keys(from).forEach(function(k) {
8
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
9
+ Object.defineProperty(to, k, {
10
+ enumerable: true,
11
+ get: function() {
12
+ return from[k];
13
+ }
14
+ });
15
+ }
16
+ });
17
+ return from;
18
+ }
19
+
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/common/types/index.ts"],"sourcesContent":["export * from './markdown.types';\n"],"names":[],"mappings":";;;;qBAAc"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+
6
+ //# sourceMappingURL=markdown.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/common/types/markdown.types.ts"],"names":[],"mappings":""}
package/dist/main.js ADDED
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ require("reflect-metadata");
7
+ const _dotenv = require("dotenv");
8
+ const _core = require("@nestjs/core");
9
+ const _appmodule = require("./app.module");
10
+ const _replservice = require("./modules/repl/services/repl.service");
11
+ const _configmanagerservice = require("./modules/config/services/config-manager.service");
12
+ const _initconfigservice = require("./modules/config/services/init-config.service");
13
+ (0, _dotenv.config)();
14
+ async function checkAndRunSetup(configManager, initService) {
15
+ const hasConfig = await configManager.configExists();
16
+ if (!hasConfig) {
17
+ console.log('\n👋 Bem-vindo ao Cast Code!\n');
18
+ console.log('Parece que esta é a primeira vez que você executa o Cast.');
19
+ console.log('Vamos fazer a configuração inicial agora.\n');
20
+ try {
21
+ await initService.runInitialSetup();
22
+ } catch (error) {
23
+ const message = error instanceof Error ? error.message : String(error);
24
+ console.error(`\n❌ Falha na configuração inicial: ${message}\n`);
25
+ return false;
26
+ }
27
+ const created = await configManager.configExists();
28
+ if (!created) {
29
+ console.log('\n⚠️ Configuração não concluída. Rode: cast config init\n');
30
+ return false;
31
+ }
32
+ return true;
33
+ }
34
+ return true;
35
+ }
36
+ async function bootstrap() {
37
+ const args = process.argv.slice(2);
38
+ const command = args[0];
39
+ if (command === 'config' || command === 'init') {
40
+ const app = await _core.NestFactory.createApplicationContext(_appmodule.AppModule, {
41
+ logger: false
42
+ });
43
+ const configCommands = app.get(_initconfigservice.InitConfigService);
44
+ try {
45
+ await configCommands.runInitialSetup();
46
+ } catch (error) {
47
+ const message = error instanceof Error ? error.stack || error.message : String(error);
48
+ console.error('\nFailed to run initial setup:\n', message);
49
+ process.exitCode = 1;
50
+ }
51
+ await app.close();
52
+ return;
53
+ }
54
+ const app = await _core.NestFactory.createApplicationContext(_appmodule.AppModule, {
55
+ logger: false
56
+ });
57
+ const configManager = app.get(_configmanagerservice.ConfigManagerService);
58
+ const initService = app.get(_initconfigservice.InitConfigService);
59
+ const ready = await checkAndRunSetup(configManager, initService);
60
+ if (!ready) {
61
+ await app.close();
62
+ process.exit(1);
63
+ }
64
+ await configManager.loadConfig();
65
+ const repl = app.get(_replservice.ReplService);
66
+ process.on('SIGINT', ()=>{
67
+ repl.stop();
68
+ app.close();
69
+ process.exit(0);
70
+ });
71
+ try {
72
+ await repl.start();
73
+ } catch (error) {
74
+ console.error('Failed to start:', error.message);
75
+ process.exit(1);
76
+ }
77
+ }
78
+ bootstrap().catch((error)=>{
79
+ const message = error instanceof Error ? error.stack || error.message : String(error);
80
+ console.error('\nFatal bootstrap error:\n', message);
81
+ process.exit(1);
82
+ });
83
+
84
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/main.ts"],"sourcesContent":["#!/usr/bin/env node\nimport 'reflect-metadata';\nimport { config } from 'dotenv';\nimport { NestFactory } from '@nestjs/core';\nimport { AppModule } from './app.module';\nimport { ReplService } from './modules/repl/services/repl.service';\nimport { ConfigManagerService } from './modules/config/services/config-manager.service';\nimport { InitConfigService } from './modules/config/services/init-config.service';\n\nconfig();\n\nasync function checkAndRunSetup(configManager: ConfigManagerService, initService: InitConfigService): Promise<boolean> {\n const hasConfig = await configManager.configExists();\n \n if (!hasConfig) {\n console.log('\\n👋 Bem-vindo ao Cast Code!\\n');\n console.log('Parece que esta é a primeira vez que você executa o Cast.');\n console.log('Vamos fazer a configuração inicial agora.\\n');\n\n try {\n await initService.runInitialSetup();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`\\n❌ Falha na configuração inicial: ${message}\\n`);\n return false;\n }\n\n const created = await configManager.configExists();\n if (!created) {\n console.log('\\n⚠️ Configuração não concluída. Rode: cast config init\\n');\n return false;\n }\n\n return true;\n }\n \n return true;\n}\n\nasync function bootstrap() {\n const args = process.argv.slice(2);\n const command = args[0];\n \n if (command === 'config' || command === 'init') {\n const app = await NestFactory.createApplicationContext(AppModule, {\n logger: false,\n });\n \n const configCommands = app.get(InitConfigService);\n try {\n await configCommands.runInitialSetup();\n } catch (error) {\n const message = error instanceof Error ? error.stack || error.message : String(error);\n console.error('\\nFailed to run initial setup:\\n', message);\n process.exitCode = 1;\n }\n await app.close();\n return;\n }\n\n const app = await NestFactory.createApplicationContext(AppModule, {\n logger: false,\n });\n\n const configManager = app.get(ConfigManagerService);\n const initService = app.get(InitConfigService);\n \n const ready = await checkAndRunSetup(configManager, initService);\n \n if (!ready) {\n await app.close();\n process.exit(1);\n }\n\n await configManager.loadConfig();\n\n const repl = app.get(ReplService);\n\n process.on('SIGINT', () => {\n repl.stop();\n app.close();\n process.exit(0);\n });\n\n try {\n await repl.start();\n } catch (error) {\n console.error('Failed to start:', (error as Error).message);\n process.exit(1);\n }\n}\n\nbootstrap().catch((error) => {\n const message = error instanceof Error ? error.stack || error.message : String(error);\n console.error('\\nFatal bootstrap error:\\n', message);\n process.exit(1);\n});\n"],"names":["config","checkAndRunSetup","configManager","initService","hasConfig","configExists","console","log","runInitialSetup","error","message","Error","String","created","bootstrap","args","process","argv","slice","command","app","NestFactory","createApplicationContext","AppModule","logger","configCommands","get","InitConfigService","stack","exitCode","close","ConfigManagerService","ready","exit","loadConfig","repl","ReplService","on","stop","start","catch"],"mappings":";;;;;QACO;wBACgB;sBACK;2BACF;6BACE;sCACS;mCACH;AAElCA,IAAAA,cAAM;AAEN,eAAeC,iBAAiBC,aAAmC,EAAEC,WAA8B;IACjG,MAAMC,YAAY,MAAMF,cAAcG,YAAY;IAElD,IAAI,CAACD,WAAW;QACdE,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QAEZ,IAAI;YACF,MAAMJ,YAAYK,eAAe;QACnC,EAAE,OAAOC,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChEH,QAAQG,KAAK,CAAC,CAAC,mCAAmC,EAAEC,QAAQ,EAAE,CAAC;YAC/D,OAAO;QACT;QAEA,MAAMG,UAAU,MAAMX,cAAcG,YAAY;QAChD,IAAI,CAACQ,SAAS;YACZP,QAAQC,GAAG,CAAC;YACZ,OAAO;QACT;QAEA,OAAO;IACT;IAEA,OAAO;AACT;AAEA,eAAeO;IACb,MAAMC,OAAOC,QAAQC,IAAI,CAACC,KAAK,CAAC;IAChC,MAAMC,UAAUJ,IAAI,CAAC,EAAE;IAEvB,IAAII,YAAY,YAAYA,YAAY,QAAQ;QAC9C,MAAMC,MAAM,MAAMC,iBAAW,CAACC,wBAAwB,CAACC,oBAAS,EAAE;YAChEC,QAAQ;QACV;QAEA,MAAMC,iBAAiBL,IAAIM,GAAG,CAACC,oCAAiB;QAChD,IAAI;YACF,MAAMF,eAAejB,eAAe;QACtC,EAAE,OAAOC,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMmB,KAAK,IAAInB,MAAMC,OAAO,GAAGE,OAAOH;YAC/EH,QAAQG,KAAK,CAAC,oCAAoCC;YAClDM,QAAQa,QAAQ,GAAG;QACrB;QACA,MAAMT,IAAIU,KAAK;QACf;IACF;IAEA,MAAMV,MAAM,MAAMC,iBAAW,CAACC,wBAAwB,CAACC,oBAAS,EAAE;QAChEC,QAAQ;IACV;IAEA,MAAMtB,gBAAgBkB,IAAIM,GAAG,CAACK,0CAAoB;IAClD,MAAM5B,cAAciB,IAAIM,GAAG,CAACC,oCAAiB;IAE7C,MAAMK,QAAQ,MAAM/B,iBAAiBC,eAAeC;IAEpD,IAAI,CAAC6B,OAAO;QACV,MAAMZ,IAAIU,KAAK;QACfd,QAAQiB,IAAI,CAAC;IACf;IAEA,MAAM/B,cAAcgC,UAAU;IAE9B,MAAMC,OAAOf,IAAIM,GAAG,CAACU,wBAAW;IAEhCpB,QAAQqB,EAAE,CAAC,UAAU;QACnBF,KAAKG,IAAI;QACTlB,IAAIU,KAAK;QACTd,QAAQiB,IAAI,CAAC;IACf;IAEA,IAAI;QACF,MAAME,KAAKI,KAAK;IAClB,EAAE,OAAO9B,OAAO;QACdH,QAAQG,KAAK,CAAC,oBAAoB,AAACA,MAAgBC,OAAO;QAC1DM,QAAQiB,IAAI,CAAC;IACf;AACF;AAEAnB,YAAY0B,KAAK,CAAC,CAAC/B;IACjB,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMmB,KAAK,IAAInB,MAAMC,OAAO,GAAGE,OAAOH;IAC/EH,QAAQG,KAAK,CAAC,8BAA8BC;IAC5CM,QAAQiB,IAAI,CAAC;AACf"}