@yuaone/core 0.1.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 (235) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +15 -0
  3. package/dist/__tests__/context-manager.test.d.ts +6 -0
  4. package/dist/__tests__/context-manager.test.d.ts.map +1 -0
  5. package/dist/__tests__/context-manager.test.js +220 -0
  6. package/dist/__tests__/context-manager.test.js.map +1 -0
  7. package/dist/__tests__/governor.test.d.ts +6 -0
  8. package/dist/__tests__/governor.test.d.ts.map +1 -0
  9. package/dist/__tests__/governor.test.js +210 -0
  10. package/dist/__tests__/governor.test.js.map +1 -0
  11. package/dist/__tests__/model-router.test.d.ts +6 -0
  12. package/dist/__tests__/model-router.test.d.ts.map +1 -0
  13. package/dist/__tests__/model-router.test.js +329 -0
  14. package/dist/__tests__/model-router.test.js.map +1 -0
  15. package/dist/agent-logger.d.ts +384 -0
  16. package/dist/agent-logger.d.ts.map +1 -0
  17. package/dist/agent-logger.js +820 -0
  18. package/dist/agent-logger.js.map +1 -0
  19. package/dist/agent-loop.d.ts +163 -0
  20. package/dist/agent-loop.d.ts.map +1 -0
  21. package/dist/agent-loop.js +609 -0
  22. package/dist/agent-loop.js.map +1 -0
  23. package/dist/agent-modes.d.ts +85 -0
  24. package/dist/agent-modes.d.ts.map +1 -0
  25. package/dist/agent-modes.js +418 -0
  26. package/dist/agent-modes.js.map +1 -0
  27. package/dist/approval.d.ts +137 -0
  28. package/dist/approval.d.ts.map +1 -0
  29. package/dist/approval.js +299 -0
  30. package/dist/approval.js.map +1 -0
  31. package/dist/async-completion-queue.d.ts +56 -0
  32. package/dist/async-completion-queue.d.ts.map +1 -0
  33. package/dist/async-completion-queue.js +77 -0
  34. package/dist/async-completion-queue.js.map +1 -0
  35. package/dist/auto-fix.d.ts +174 -0
  36. package/dist/auto-fix.d.ts.map +1 -0
  37. package/dist/auto-fix.js +319 -0
  38. package/dist/auto-fix.js.map +1 -0
  39. package/dist/codebase-context.d.ts +396 -0
  40. package/dist/codebase-context.d.ts.map +1 -0
  41. package/dist/codebase-context.js +1260 -0
  42. package/dist/codebase-context.js.map +1 -0
  43. package/dist/conflict-resolver.d.ts +191 -0
  44. package/dist/conflict-resolver.d.ts.map +1 -0
  45. package/dist/conflict-resolver.js +524 -0
  46. package/dist/conflict-resolver.js.map +1 -0
  47. package/dist/constants.d.ts +52 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +141 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/context-budget.d.ts +435 -0
  52. package/dist/context-budget.d.ts.map +1 -0
  53. package/dist/context-budget.js +903 -0
  54. package/dist/context-budget.js.map +1 -0
  55. package/dist/context-compressor.d.ts +143 -0
  56. package/dist/context-compressor.d.ts.map +1 -0
  57. package/dist/context-compressor.js +511 -0
  58. package/dist/context-compressor.js.map +1 -0
  59. package/dist/context-manager.d.ts +112 -0
  60. package/dist/context-manager.d.ts.map +1 -0
  61. package/dist/context-manager.js +247 -0
  62. package/dist/context-manager.js.map +1 -0
  63. package/dist/continuous-reflection.d.ts +267 -0
  64. package/dist/continuous-reflection.d.ts.map +1 -0
  65. package/dist/continuous-reflection.js +338 -0
  66. package/dist/continuous-reflection.js.map +1 -0
  67. package/dist/cross-file-refactor.d.ts +352 -0
  68. package/dist/cross-file-refactor.d.ts.map +1 -0
  69. package/dist/cross-file-refactor.js +1544 -0
  70. package/dist/cross-file-refactor.js.map +1 -0
  71. package/dist/dag-orchestrator.d.ts +138 -0
  72. package/dist/dag-orchestrator.d.ts.map +1 -0
  73. package/dist/dag-orchestrator.js +379 -0
  74. package/dist/dag-orchestrator.js.map +1 -0
  75. package/dist/debate-orchestrator.d.ts +301 -0
  76. package/dist/debate-orchestrator.d.ts.map +1 -0
  77. package/dist/debate-orchestrator.js +719 -0
  78. package/dist/debate-orchestrator.js.map +1 -0
  79. package/dist/dependency-analyzer.d.ts +113 -0
  80. package/dist/dependency-analyzer.d.ts.map +1 -0
  81. package/dist/dependency-analyzer.js +444 -0
  82. package/dist/dependency-analyzer.js.map +1 -0
  83. package/dist/design-loop.d.ts +59 -0
  84. package/dist/design-loop.d.ts.map +1 -0
  85. package/dist/design-loop.js +344 -0
  86. package/dist/design-loop.js.map +1 -0
  87. package/dist/doc-intelligence.d.ts +383 -0
  88. package/dist/doc-intelligence.d.ts.map +1 -0
  89. package/dist/doc-intelligence.js +1307 -0
  90. package/dist/doc-intelligence.js.map +1 -0
  91. package/dist/dynamic-role-generator.d.ts +76 -0
  92. package/dist/dynamic-role-generator.d.ts.map +1 -0
  93. package/dist/dynamic-role-generator.js +194 -0
  94. package/dist/dynamic-role-generator.js.map +1 -0
  95. package/dist/errors.d.ts +69 -0
  96. package/dist/errors.d.ts.map +1 -0
  97. package/dist/errors.js +102 -0
  98. package/dist/errors.js.map +1 -0
  99. package/dist/event-bus.d.ts +159 -0
  100. package/dist/event-bus.d.ts.map +1 -0
  101. package/dist/event-bus.js +305 -0
  102. package/dist/event-bus.js.map +1 -0
  103. package/dist/execution-engine.d.ts +425 -0
  104. package/dist/execution-engine.d.ts.map +1 -0
  105. package/dist/execution-engine.js +1555 -0
  106. package/dist/execution-engine.js.map +1 -0
  107. package/dist/git-intelligence.d.ts +306 -0
  108. package/dist/git-intelligence.d.ts.map +1 -0
  109. package/dist/git-intelligence.js +1099 -0
  110. package/dist/git-intelligence.js.map +1 -0
  111. package/dist/governor.d.ts +77 -0
  112. package/dist/governor.d.ts.map +1 -0
  113. package/dist/governor.js +161 -0
  114. package/dist/governor.js.map +1 -0
  115. package/dist/hierarchical-planner.d.ts +313 -0
  116. package/dist/hierarchical-planner.d.ts.map +1 -0
  117. package/dist/hierarchical-planner.js +981 -0
  118. package/dist/hierarchical-planner.js.map +1 -0
  119. package/dist/index.d.ts +121 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +123 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/intent-inference.d.ts +103 -0
  124. package/dist/intent-inference.d.ts.map +1 -0
  125. package/dist/intent-inference.js +605 -0
  126. package/dist/intent-inference.js.map +1 -0
  127. package/dist/interrupt-manager.d.ts +143 -0
  128. package/dist/interrupt-manager.d.ts.map +1 -0
  129. package/dist/interrupt-manager.js +196 -0
  130. package/dist/interrupt-manager.js.map +1 -0
  131. package/dist/kernel.d.ts +564 -0
  132. package/dist/kernel.d.ts.map +1 -0
  133. package/dist/kernel.js +1419 -0
  134. package/dist/kernel.js.map +1 -0
  135. package/dist/language-support.d.ts +232 -0
  136. package/dist/language-support.d.ts.map +1 -0
  137. package/dist/language-support.js +1134 -0
  138. package/dist/language-support.js.map +1 -0
  139. package/dist/llm-client.d.ts +82 -0
  140. package/dist/llm-client.d.ts.map +1 -0
  141. package/dist/llm-client.js +475 -0
  142. package/dist/llm-client.js.map +1 -0
  143. package/dist/mcp-client.d.ts +232 -0
  144. package/dist/mcp-client.d.ts.map +1 -0
  145. package/dist/mcp-client.js +718 -0
  146. package/dist/mcp-client.js.map +1 -0
  147. package/dist/memory-manager.d.ts +200 -0
  148. package/dist/memory-manager.d.ts.map +1 -0
  149. package/dist/memory-manager.js +568 -0
  150. package/dist/memory-manager.js.map +1 -0
  151. package/dist/memory.d.ts +87 -0
  152. package/dist/memory.d.ts.map +1 -0
  153. package/dist/memory.js +341 -0
  154. package/dist/memory.js.map +1 -0
  155. package/dist/model-router.d.ts +245 -0
  156. package/dist/model-router.d.ts.map +1 -0
  157. package/dist/model-router.js +632 -0
  158. package/dist/model-router.js.map +1 -0
  159. package/dist/parallel-executor.d.ts +125 -0
  160. package/dist/parallel-executor.d.ts.map +1 -0
  161. package/dist/parallel-executor.js +201 -0
  162. package/dist/parallel-executor.js.map +1 -0
  163. package/dist/perf-optimizer.d.ts +212 -0
  164. package/dist/perf-optimizer.d.ts.map +1 -0
  165. package/dist/perf-optimizer.js +721 -0
  166. package/dist/perf-optimizer.js.map +1 -0
  167. package/dist/persona.d.ts +305 -0
  168. package/dist/persona.d.ts.map +1 -0
  169. package/dist/persona.js +887 -0
  170. package/dist/persona.js.map +1 -0
  171. package/dist/planner.d.ts +70 -0
  172. package/dist/planner.d.ts.map +1 -0
  173. package/dist/planner.js +264 -0
  174. package/dist/planner.js.map +1 -0
  175. package/dist/qa-pipeline.d.ts +365 -0
  176. package/dist/qa-pipeline.d.ts.map +1 -0
  177. package/dist/qa-pipeline.js +1352 -0
  178. package/dist/qa-pipeline.js.map +1 -0
  179. package/dist/reasoning-adapter.d.ts +116 -0
  180. package/dist/reasoning-adapter.d.ts.map +1 -0
  181. package/dist/reasoning-adapter.js +187 -0
  182. package/dist/reasoning-adapter.js.map +1 -0
  183. package/dist/role-registry.d.ts +55 -0
  184. package/dist/role-registry.d.ts.map +1 -0
  185. package/dist/role-registry.js +192 -0
  186. package/dist/role-registry.js.map +1 -0
  187. package/dist/sandbox-tiers.d.ts +327 -0
  188. package/dist/sandbox-tiers.d.ts.map +1 -0
  189. package/dist/sandbox-tiers.js +928 -0
  190. package/dist/sandbox-tiers.js.map +1 -0
  191. package/dist/security-scanner.d.ts +222 -0
  192. package/dist/security-scanner.d.ts.map +1 -0
  193. package/dist/security-scanner.js +1129 -0
  194. package/dist/security-scanner.js.map +1 -0
  195. package/dist/security.d.ts +93 -0
  196. package/dist/security.d.ts.map +1 -0
  197. package/dist/security.js +393 -0
  198. package/dist/security.js.map +1 -0
  199. package/dist/self-reflection.d.ts +397 -0
  200. package/dist/self-reflection.d.ts.map +1 -0
  201. package/dist/self-reflection.js +908 -0
  202. package/dist/self-reflection.js.map +1 -0
  203. package/dist/session-persistence.d.ts +191 -0
  204. package/dist/session-persistence.d.ts.map +1 -0
  205. package/dist/session-persistence.js +395 -0
  206. package/dist/session-persistence.js.map +1 -0
  207. package/dist/speculative-executor.d.ts +210 -0
  208. package/dist/speculative-executor.d.ts.map +1 -0
  209. package/dist/speculative-executor.js +618 -0
  210. package/dist/speculative-executor.js.map +1 -0
  211. package/dist/state-machine.d.ts +289 -0
  212. package/dist/state-machine.d.ts.map +1 -0
  213. package/dist/state-machine.js +695 -0
  214. package/dist/state-machine.js.map +1 -0
  215. package/dist/sub-agent.d.ts +177 -0
  216. package/dist/sub-agent.d.ts.map +1 -0
  217. package/dist/sub-agent.js +303 -0
  218. package/dist/sub-agent.js.map +1 -0
  219. package/dist/system-prompt.d.ts +26 -0
  220. package/dist/system-prompt.d.ts.map +1 -0
  221. package/dist/system-prompt.js +84 -0
  222. package/dist/system-prompt.js.map +1 -0
  223. package/dist/test-intelligence.d.ts +439 -0
  224. package/dist/test-intelligence.d.ts.map +1 -0
  225. package/dist/test-intelligence.js +1165 -0
  226. package/dist/test-intelligence.js.map +1 -0
  227. package/dist/types.d.ts +632 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +6 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/vector-index.d.ts +314 -0
  232. package/dist/vector-index.d.ts.map +1 -0
  233. package/dist/vector-index.js +618 -0
  234. package/dist/vector-index.js.map +1 -0
  235. package/package.json +41 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,oBAAoB;AACpB,MAAM,WAAW,cAAc;IAC7B,YAAY;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,oBAAoB;AACpB,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,gBAAgB,CAAiC;gBAE7C,WAAW,EAAE,MAAM;IAI/B;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAqB5C;;OAEG;IACH,SAAS,IAAI,cAAc,GAAG,IAAI;IAIlC;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAsBjD;;;;OAIG;IACG,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAuBhB;;OAEG;IACH,cAAc,IAAI,MAAM;IAYxB;;OAEG;IACH,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,kBAAkB;YAQZ,cAAc;YAqBd,eAAe;YA2Bf,oBAAoB;YAkBpB,gBAAgB;IAmC9B;;OAEG;YACW,aAAa;IA0D3B;;OAEG;YACW,UAAU;YA8BV,UAAU;CAQzB"}
package/dist/memory.js ADDED
@@ -0,0 +1,341 @@
1
+ /**
2
+ * @module memory
3
+ * @description YUAN.md 프로젝트 메모리 관리.
4
+ * 프로젝트 루트의 YUAN.md를 읽고/쓰고/파싱하여 에이전트에 컨텍스트를 제공.
5
+ */
6
+ import { readFile, writeFile, access, readdir } from "node:fs/promises";
7
+ import { join } from "node:path";
8
+ import { YUAN_MD_SEARCH_PATHS } from "./constants.js";
9
+ /**
10
+ * YuanMemory — YUAN.md 기반 프로젝트 메모리.
11
+ *
12
+ * 역할:
13
+ * - YUAN.md 자동 탐색 및 읽기
14
+ * - 프로젝트 구조 자동 감지 (package.json, tsconfig 등)
15
+ * - 메모리 업데이트/쓰기
16
+ */
17
+ export class YuanMemory {
18
+ projectPath;
19
+ memoryData = null;
20
+ projectStructure = null;
21
+ constructor(projectPath) {
22
+ this.projectPath = projectPath;
23
+ }
24
+ /**
25
+ * YUAN.md를 탐색하고 읽는다.
26
+ * 우선순위: YUAN.md > .yuan/config.md > .yuan/YUAN.md > docs/YUAN.md
27
+ * @returns 파싱된 메모리 데이터 (없으면 null)
28
+ */
29
+ async load() {
30
+ for (const searchPath of YUAN_MD_SEARCH_PATHS) {
31
+ const fullPath = join(this.projectPath, searchPath);
32
+ try {
33
+ await access(fullPath);
34
+ const content = await readFile(fullPath, "utf-8");
35
+ this.memoryData = {
36
+ raw: content,
37
+ filePath: fullPath,
38
+ sections: this.parseSections(content),
39
+ };
40
+ return this.memoryData;
41
+ }
42
+ catch {
43
+ // 파일 없으면 다음 경로 시도
44
+ continue;
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ /**
50
+ * 현재 로드된 메모리를 반환.
51
+ */
52
+ getMemory() {
53
+ return this.memoryData;
54
+ }
55
+ /**
56
+ * 프로젝트 구조를 자동 감지.
57
+ * package.json, tsconfig.json, Cargo.toml 등을 분석.
58
+ */
59
+ async analyzeProject() {
60
+ if (this.projectStructure)
61
+ return this.projectStructure;
62
+ const language = await this.detectLanguage();
63
+ const framework = await this.detectFramework();
64
+ const packageManager = await this.detectPackageManager();
65
+ const entryPoint = await this.detectEntryPoint();
66
+ const treeView = await this.buildTreeView(this.projectPath, 3);
67
+ const fileCount = await this.countFiles(this.projectPath);
68
+ this.projectStructure = {
69
+ primaryLanguage: language,
70
+ framework,
71
+ packageManager,
72
+ entryPoint,
73
+ treeView,
74
+ fileCount,
75
+ };
76
+ return this.projectStructure;
77
+ }
78
+ /**
79
+ * YUAN.md에 섹션을 추가하거나 업데이트.
80
+ * @param sectionName 섹션 이름 (## 헤더)
81
+ * @param content 섹션 내용
82
+ */
83
+ async updateSection(sectionName, content) {
84
+ if (!this.memoryData) {
85
+ // YUAN.md 없으면 새로 생성
86
+ const filePath = join(this.projectPath, "YUAN.md");
87
+ const newContent = `# YUAN Project Memory\n\n## ${sectionName}\n${content}\n`;
88
+ await writeFile(filePath, newContent, "utf-8");
89
+ this.memoryData = {
90
+ raw: newContent,
91
+ filePath,
92
+ sections: this.parseSections(newContent),
93
+ };
94
+ return;
95
+ }
96
+ // 기존 섹션이 있으면 교체, 없으면 추가
97
+ const sections = this.memoryData.sections;
98
+ sections.set(sectionName, content);
99
+ const newRaw = this.sectionsToMarkdown(sections);
100
+ await writeFile(this.memoryData.filePath, newRaw, "utf-8");
101
+ this.memoryData.raw = newRaw;
102
+ }
103
+ /**
104
+ * 시스템 프롬프트에 포함할 메모리 문자열 생성.
105
+ */
106
+ toPromptString() {
107
+ if (!this.memoryData)
108
+ return "";
109
+ return [
110
+ "## YUAN.md (Project Memory)",
111
+ "",
112
+ this.memoryData.raw,
113
+ ].join("\n");
114
+ }
115
+ // ─── Private ───
116
+ /**
117
+ * 마크다운 ## 헤더 기준으로 섹션 분리.
118
+ */
119
+ parseSections(content) {
120
+ const sections = new Map();
121
+ const lines = content.split("\n");
122
+ let currentSection = "";
123
+ let currentContent = [];
124
+ for (const line of lines) {
125
+ const headerMatch = line.match(/^##\s+(.+)$/);
126
+ if (headerMatch) {
127
+ if (currentSection) {
128
+ sections.set(currentSection, currentContent.join("\n").trim());
129
+ }
130
+ currentSection = headerMatch[1];
131
+ currentContent = [];
132
+ }
133
+ else {
134
+ currentContent.push(line);
135
+ }
136
+ }
137
+ if (currentSection) {
138
+ sections.set(currentSection, currentContent.join("\n").trim());
139
+ }
140
+ return sections;
141
+ }
142
+ sectionsToMarkdown(sections) {
143
+ const parts = ["# YUAN Project Memory\n"];
144
+ for (const [name, content] of sections) {
145
+ parts.push(`## ${name}\n${content}\n`);
146
+ }
147
+ return parts.join("\n");
148
+ }
149
+ async detectLanguage() {
150
+ const indicators = {
151
+ "tsconfig.json": "TypeScript",
152
+ "package.json": "JavaScript",
153
+ "Cargo.toml": "Rust",
154
+ "go.mod": "Go",
155
+ "pyproject.toml": "Python",
156
+ "setup.py": "Python",
157
+ "requirements.txt": "Python",
158
+ "build.gradle": "Java",
159
+ "pom.xml": "Java",
160
+ };
161
+ for (const [file, lang] of Object.entries(indicators)) {
162
+ if (await this.fileExists(join(this.projectPath, file))) {
163
+ return lang;
164
+ }
165
+ }
166
+ return "Unknown";
167
+ }
168
+ async detectFramework() {
169
+ try {
170
+ const pkgPath = join(this.projectPath, "package.json");
171
+ const content = await readFile(pkgPath, "utf-8");
172
+ const pkg = JSON.parse(content);
173
+ const deps = {
174
+ ...pkg.dependencies,
175
+ ...pkg.devDependencies,
176
+ };
177
+ if (deps.next)
178
+ return "Next.js";
179
+ if (deps.react)
180
+ return "React";
181
+ if (deps.vue)
182
+ return "Vue";
183
+ if (deps.svelte)
184
+ return "Svelte";
185
+ if (deps.express)
186
+ return "Express";
187
+ if (deps.fastify)
188
+ return "Fastify";
189
+ if (deps["@nestjs/core"])
190
+ return "NestJS";
191
+ return "Node.js";
192
+ }
193
+ catch {
194
+ // Rust
195
+ if (await this.fileExists(join(this.projectPath, "Cargo.toml"))) {
196
+ return "Cargo";
197
+ }
198
+ return "Unknown";
199
+ }
200
+ }
201
+ async detectPackageManager() {
202
+ if (await this.fileExists(join(this.projectPath, "pnpm-lock.yaml")))
203
+ return "pnpm";
204
+ if (await this.fileExists(join(this.projectPath, "yarn.lock")))
205
+ return "yarn";
206
+ if (await this.fileExists(join(this.projectPath, "package-lock.json")))
207
+ return "npm";
208
+ if (await this.fileExists(join(this.projectPath, "Cargo.lock")))
209
+ return "cargo";
210
+ if (await this.fileExists(join(this.projectPath, "go.sum")))
211
+ return "go";
212
+ if (await this.fileExists(join(this.projectPath, "requirements.txt")))
213
+ return "pip";
214
+ return "Unknown";
215
+ }
216
+ async detectEntryPoint() {
217
+ try {
218
+ const pkgPath = join(this.projectPath, "package.json");
219
+ const content = await readFile(pkgPath, "utf-8");
220
+ const pkg = JSON.parse(content);
221
+ if (pkg.main)
222
+ return pkg.main;
223
+ if (pkg.scripts?.start)
224
+ return "npm start";
225
+ }
226
+ catch {
227
+ // not a JS project
228
+ }
229
+ // Common entry points
230
+ const candidates = [
231
+ "src/index.ts",
232
+ "src/main.ts",
233
+ "src/index.js",
234
+ "index.ts",
235
+ "index.js",
236
+ "main.py",
237
+ "app.py",
238
+ "src/main.rs",
239
+ "main.go",
240
+ ];
241
+ for (const candidate of candidates) {
242
+ if (await this.fileExists(join(this.projectPath, candidate))) {
243
+ return candidate;
244
+ }
245
+ }
246
+ return "Unknown";
247
+ }
248
+ /**
249
+ * 디렉토리 트리를 문자열로 생성 (depth 제한).
250
+ */
251
+ async buildTreeView(dirPath, maxDepth, prefix = "", currentDepth = 0) {
252
+ if (currentDepth >= maxDepth)
253
+ return "";
254
+ const SKIP = new Set([
255
+ "node_modules",
256
+ ".git",
257
+ "dist",
258
+ "build",
259
+ ".next",
260
+ "__pycache__",
261
+ "target",
262
+ ".cache",
263
+ "coverage",
264
+ ]);
265
+ try {
266
+ const entries = await readdir(dirPath, { withFileTypes: true });
267
+ const filtered = entries
268
+ .filter((e) => !SKIP.has(e.name) && !e.name.startsWith("."))
269
+ .sort((a, b) => {
270
+ // dirs first
271
+ if (a.isDirectory() && !b.isDirectory())
272
+ return -1;
273
+ if (!a.isDirectory() && b.isDirectory())
274
+ return 1;
275
+ return a.name.localeCompare(b.name);
276
+ });
277
+ const lines = [];
278
+ for (let i = 0; i < filtered.length; i++) {
279
+ const entry = filtered[i];
280
+ const isLast = i === filtered.length - 1;
281
+ const connector = isLast ? "└── " : "├── ";
282
+ const childPrefix = isLast ? " " : "│ ";
283
+ if (entry.isDirectory()) {
284
+ lines.push(`${prefix}${connector}${entry.name}/`);
285
+ const subtree = await this.buildTreeView(join(dirPath, entry.name), maxDepth, prefix + childPrefix, currentDepth + 1);
286
+ if (subtree)
287
+ lines.push(subtree);
288
+ }
289
+ else {
290
+ lines.push(`${prefix}${connector}${entry.name}`);
291
+ }
292
+ }
293
+ return lines.join("\n");
294
+ }
295
+ catch {
296
+ return "";
297
+ }
298
+ }
299
+ /**
300
+ * 프로젝트 내 파일 수 카운팅 (node_modules 등 제외).
301
+ */
302
+ async countFiles(dirPath) {
303
+ const SKIP = new Set([
304
+ "node_modules",
305
+ ".git",
306
+ "dist",
307
+ "build",
308
+ ".next",
309
+ "__pycache__",
310
+ "target",
311
+ ]);
312
+ try {
313
+ const entries = await readdir(dirPath, { withFileTypes: true });
314
+ let count = 0;
315
+ for (const entry of entries) {
316
+ if (SKIP.has(entry.name))
317
+ continue;
318
+ if (entry.isDirectory()) {
319
+ count += await this.countFiles(join(dirPath, entry.name));
320
+ }
321
+ else {
322
+ count++;
323
+ }
324
+ }
325
+ return count;
326
+ }
327
+ catch {
328
+ return 0;
329
+ }
330
+ }
331
+ async fileExists(filePath) {
332
+ try {
333
+ await access(filePath);
334
+ return true;
335
+ }
336
+ catch {
337
+ return false;
338
+ }
339
+ }
340
+ }
341
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAQ,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAqB,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AA4BtD;;;;;;;GAOG;AACH,MAAM,OAAO,UAAU;IACb,WAAW,CAAS;IACpB,UAAU,GAA0B,IAAI,CAAC;IACzC,gBAAgB,GAA4B,IAAI,CAAC;IAEzD,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACR,KAAK,MAAM,UAAU,IAAI,oBAAoB,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,UAAU,GAAG;oBAChB,GAAG,EAAE,OAAO;oBACZ,QAAQ,EAAE,QAAQ;oBAClB,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;iBACtC,CAAC;gBACF,OAAO,IAAI,CAAC,UAAU,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;gBAClB,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC;QAExD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE1D,IAAI,CAAC,gBAAgB,GAAG;YACtB,eAAe,EAAE,QAAQ;YACzB,SAAS;YACT,cAAc;YACd,UAAU;YACV,QAAQ;YACR,SAAS;SACV,CAAC;QAEF,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CACjB,WAAmB,EACnB,OAAe;QAEf,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,oBAAoB;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,+BAA+B,WAAW,KAAK,OAAO,IAAI,CAAC;YAC9E,MAAM,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,UAAU,GAAG;gBAChB,GAAG,EAAE,UAAU;gBACf,QAAQ;gBACR,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;aACzC,CAAC;YACF,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC1C,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAEhC,OAAO;YACL,6BAA6B;YAC7B,EAAE;YACF,IAAI,CAAC,UAAU,CAAC,GAAG;SACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,kBAAkB;IAElB;;OAEG;IACK,aAAa,CAAC,OAAe;QACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,cAAc,GAAa,EAAE,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC9C,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,cAAc,EAAE,CAAC;oBACnB,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjE,CAAC;gBACD,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAChC,cAAc,GAAG,EAAE,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,kBAAkB,CAAC,QAA6B;QACtD,MAAM,KAAK,GAAa,CAAC,yBAAyB,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,UAAU,GAA2B;YACzC,eAAe,EAAE,YAAY;YAC7B,cAAc,EAAE,YAAY;YAC5B,YAAY,EAAE,MAAM;YACpB,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,QAAQ;YAC1B,UAAU,EAAE,QAAQ;YACpB,kBAAkB,EAAE,QAAQ;YAC5B,cAAc,EAAE,MAAM;YACtB,SAAS,EAAE,MAAM;SAClB,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAC3D,MAAM,IAAI,GAAG;gBACX,GAAI,GAAG,CAAC,YAAmD;gBAC3D,GAAI,GAAG,CAAC,eAAsD;aAC/D,CAAC;YAEF,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,SAAS,CAAC;YAChC,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,OAAO,CAAC;YAC/B,IAAI,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAC;YAC3B,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO,QAAQ,CAAC;YACjC,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAC;YACnC,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,SAAS,CAAC;YACnC,IAAI,IAAI,CAAC,cAAc,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAC1C,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;YACP,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;gBAChE,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;YACjE,OAAO,MAAM,CAAC;QAChB,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAC5D,OAAO,MAAM,CAAC;QAChB,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC7D,OAAO,OAAO,CAAC;QACjB,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,IACE,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;YAEjE,OAAO,KAAK,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAC3D,IAAI,GAAG,CAAC,IAAI;gBAAE,OAAO,GAAG,CAAC,IAAc,CAAC;YACxC,IAAK,GAAG,CAAC,OAA8C,EAAE,KAAK;gBAAE,OAAO,WAAW,CAAC;QACrF,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;QAED,sBAAsB;QACtB,MAAM,UAAU,GAAG;YACjB,cAAc;YACd,aAAa;YACb,cAAc;YACd,UAAU;YACV,UAAU;YACV,SAAS;YACT,QAAQ;YACR,aAAa;YACb,SAAS;SACV,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IACE,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,EACxD,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CACzB,OAAe,EACf,QAAgB,EAChB,MAAM,GAAG,EAAE,EACX,YAAY,GAAG,CAAC;QAEhB,IAAI,YAAY,IAAI,QAAQ;YAAE,OAAO,EAAE,CAAC;QAExC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC;YACnB,cAAc;YACd,MAAM;YACN,MAAM;YACN,OAAO;YACP,OAAO;YACP,aAAa;YACb,QAAQ;YACR,QAAQ;YACR,UAAU;SACX,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,MAAM,QAAQ,GAAG,OAAO;iBACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBAC3D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACb,aAAa;gBACb,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;oBAAE,OAAO,CAAC,CAAC,CAAC;gBACnD,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE;oBAAE,OAAO,CAAC,CAAC;gBAClD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEL,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC1B,MAAM,MAAM,GAAG,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;oBAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CACtC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EACzB,QAAQ,EACR,MAAM,GAAG,WAAW,EACpB,YAAY,GAAG,CAAC,CACjB,CAAC;oBACF,IAAI,OAAO;wBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,OAAe;QACtC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC;YACnB,cAAc;YACd,MAAM;YACN,MAAM;YACN,OAAO;YACP,OAAO;YACP,aAAa;YACb,QAAQ;SACT,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,IAAI,KAAK,GAAG,CAAC,CAAC;YAEd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,KAAK,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC5D,CAAC;qBAAM,CAAC;oBACN,KAAK,EAAE,CAAC;gBACV,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,QAAgB;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * @module model-router
3
+ * @description ModelRouter — 태스크·역할·복잡도·API 키 조합으로 최적 LLM 모델을 결정하는 라우터.
4
+ *
5
+ * 라우팅 알고리즘:
6
+ * 1. 태스크 유형에서 필요 역량(strengths) 추출
7
+ * 2. 사용 가능한 프로바이더(API 키 보유)로 모델 필터링
8
+ * 3. 역량 매칭·비용·성능 통계·복잡도 적합성을 가중 합산하여 스코어링
9
+ * 4. 최고 스코어 모델을 primary로, 차순위 2개를 fallback으로 반환
10
+ *
11
+ * 통합 지점:
12
+ * - ParallelExecutor: 태스크별 모델 할당
13
+ * - Planner: PlannedTask에 추천 모델 주석
14
+ * - AgentLoop: 단일 에이전트 모드 기본 모델 선택
15
+ */
16
+ import type { LLMProvider, BYOKConfig, AgentRole, TaskContract } from "./types.js";
17
+ /** 태스크 복잡도 수준 */
18
+ export type TaskComplexityLevel = "trivial" | "simple" | "moderate" | "complex" | "critical";
19
+ /** 모델 티어 — 비용/품질 트레이드오프 */
20
+ export type ModelTierLevel = "economy" | "standard" | "premium" | "flagship";
21
+ /** 라우팅 결정 결과 */
22
+ export interface RoutingDecision {
23
+ /** 선택된 프로바이더 */
24
+ provider: LLMProvider;
25
+ /** 선택된 모델 ID */
26
+ model: string;
27
+ /** 모델 티어 */
28
+ tier: ModelTierLevel;
29
+ /** 선택 사유 (디버깅/로깅용) */
30
+ reason: string;
31
+ /** 대체 모델 목록 (최대 2개) */
32
+ fallbacks: Array<{
33
+ provider: LLMProvider;
34
+ model: string;
35
+ }>;
36
+ /** 1K 토큰당 예상 비용 (input+output 평균, USD) */
37
+ estimatedCostPer1kTokens: number;
38
+ }
39
+ /** 사용 가능한 프로바이더 API 키 설정 */
40
+ export interface AvailableProviders {
41
+ anthropic?: {
42
+ apiKey: string;
43
+ baseUrl?: string;
44
+ };
45
+ openai?: {
46
+ apiKey: string;
47
+ baseUrl?: string;
48
+ };
49
+ google?: {
50
+ apiKey: string;
51
+ baseUrl?: string;
52
+ };
53
+ yua?: {
54
+ apiKey: string;
55
+ baseUrl?: string;
56
+ };
57
+ deepseek?: {
58
+ apiKey: string;
59
+ baseUrl?: string;
60
+ };
61
+ }
62
+ /** 모델 성능 통계 (적응형 라우팅용) */
63
+ export interface ModelStats {
64
+ provider: LLMProvider;
65
+ model: string;
66
+ avgLatencyMs: number;
67
+ successRate: number;
68
+ avgTokensPerTask: number;
69
+ totalCalls: number;
70
+ lastError?: string;
71
+ lastUsed: number;
72
+ }
73
+ /** 라우터 설정 */
74
+ export interface ModelRouterConfig {
75
+ /** 사용 가능한 프로바이더 API 키 */
76
+ providers: AvailableProviders;
77
+ /** 비용 최적화 전략: "quality"는 최고 모델 선호, "balanced", "economy"는 최저 비용 선호 */
78
+ costStrategy: "quality" | "balanced" | "economy";
79
+ /** 세션당 최대 비용 (USD, 근사치) */
80
+ maxSessionCostUsd?: number;
81
+ /** 모든 태스크에 특정 프로바이더 강제 (라우팅 오버라이드) */
82
+ forceProvider?: LLMProvider;
83
+ /** 모든 태스크에 특정 모델 강제 */
84
+ forceModel?: string;
85
+ }
86
+ /** 모델 카탈로그 엔트리 */
87
+ export interface ModelEntry {
88
+ provider: LLMProvider;
89
+ model: string;
90
+ tier: ModelTierLevel;
91
+ costPer1kInput: number;
92
+ costPer1kOutput: number;
93
+ strengths: string[];
94
+ maxContext: number;
95
+ }
96
+ /**
97
+ * ModelRouter — 태스크·역할·복잡도·API 키 조합으로 최적 LLM 모델을 선택하는 라우터.
98
+ *
99
+ * 동일한 입력에 대해 항상 동일한 결과를 반환한다 (결정론적).
100
+ * 단, `recordStats()`로 축적된 성능 통계가 변하면 스코어가 달라질 수 있다.
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * const router = new ModelRouter({
105
+ * providers: { anthropic: { apiKey: "sk-..." } },
106
+ * costStrategy: "balanced",
107
+ * });
108
+ *
109
+ * const decision = router.route("coding", "coder", "moderate");
110
+ * const config = router.toBYOKConfig(decision);
111
+ * ```
112
+ */
113
+ export declare class ModelRouter {
114
+ private readonly config;
115
+ private readonly stats;
116
+ private readonly roleRegistry;
117
+ private accumulatedCostUsd;
118
+ constructor(config: ModelRouterConfig);
119
+ /**
120
+ * 태스크를 최적 모델로 라우팅한다.
121
+ *
122
+ * @param taskType - 태스크 유형 (TASK_STRENGTH_MAP 키 또는 임의 문자열)
123
+ * @param role - 에이전트 역할 (선택적, 역할에서 태스크 유형을 추론할 수 있음)
124
+ * @param complexity - 태스크 복잡도 (선택적, 기본 "moderate")
125
+ * @returns 라우팅 결정 (모델, 티어, fallback, 예상 비용 포함)
126
+ * @throws 사용 가능한 프로바이더가 없으면 Error
127
+ */
128
+ route(taskType: string, role?: AgentRole, complexity?: TaskComplexityLevel): RoutingDecision;
129
+ /**
130
+ * TaskContract를 기반으로 최적 모델을 라우팅한다.
131
+ * 계약의 목표, 역할, 파일 수, 예상 반복 횟수에서 복잡도를 자동 추정한다.
132
+ *
133
+ * @param contract - 태스크 계약
134
+ * @returns 라우팅 결정
135
+ */
136
+ routeForContract(contract: TaskContract): RoutingDecision;
137
+ /**
138
+ * 태스크 설명·파일 수·예상 반복 횟수에서 복잡도를 추정한다.
139
+ *
140
+ * 우선순위:
141
+ * 1. fileCount / estimatedIterations 기반 범위 판정
142
+ * 2. description 키워드 매칭
143
+ * 3. 기본값 "moderate"
144
+ *
145
+ * @param description - 태스크 설명
146
+ * @param fileCount - 관련 파일 수 (선택적)
147
+ * @param estimatedIterations - 예상 반복 횟수 (선택적)
148
+ * @returns 추정된 복잡도 수준
149
+ */
150
+ estimateComplexity(description: string, fileCount?: number, estimatedIterations?: number): TaskComplexityLevel;
151
+ /**
152
+ * 라우팅 결정을 BYOKConfig로 변환한다.
153
+ *
154
+ * @param decision - 라우팅 결정
155
+ * @returns BYOKConfig (BYOKClient 생성자에 전달 가능)
156
+ * @throws 해당 프로바이더의 API 키가 없으면 Error
157
+ */
158
+ toBYOKConfig(decision: RoutingDecision): BYOKConfig;
159
+ /**
160
+ * 모델 성능 통계를 기록한다 (적응형 라우팅용).
161
+ * 호출 수, 평균 레이턴시, 성공률, 평균 토큰을 누적 평균으로 갱신한다.
162
+ *
163
+ * @param provider - 프로바이더
164
+ * @param model - 모델 ID
165
+ * @param latencyMs - 응답 레이턴시 (ms)
166
+ * @param success - 성공 여부
167
+ * @param tokensUsed - 사용된 토큰 수
168
+ */
169
+ recordStats(provider: LLMProvider, model: string, latencyMs: number, success: boolean, tokensUsed: number): void;
170
+ /**
171
+ * 축적된 모델 성능 통계를 반환한다.
172
+ *
173
+ * @returns 모든 모델의 성능 통계 배열
174
+ */
175
+ getStats(): ModelStats[];
176
+ /**
177
+ * 사용 가능한 모델 목록을 반환한다 (API 키가 설정된 프로바이더만 필터링).
178
+ *
179
+ * @returns 사용 가능한 모델 카탈로그 엔트리 배열
180
+ */
181
+ getAvailableModels(): ModelEntry[];
182
+ /**
183
+ * 최소 하나의 프로바이더가 설정되어 있는지 확인한다.
184
+ *
185
+ * @returns true면 사용 가능한 프로바이더가 있음
186
+ */
187
+ hasProvider(): boolean;
188
+ /**
189
+ * 누적 비용을 추가한다 (세션 예산 추적용).
190
+ *
191
+ * @param costUsd - 추가할 비용 (USD)
192
+ */
193
+ addCost(costUsd: number): void;
194
+ /**
195
+ * 현재 누적 비용을 반환한다.
196
+ *
197
+ * @returns 누적 비용 (USD)
198
+ */
199
+ getAccumulatedCost(): number;
200
+ /**
201
+ * 사용 가능한 모든 모델에 대해 스코어를 계산하고 내림차순 정렬한다.
202
+ *
203
+ * 스코어 공식:
204
+ * finalScore = strengthMatch * 0.4 + costScore * 0.2 + performanceScore * 0.2 + complexityFit * 0.2
205
+ */
206
+ private scoreModels;
207
+ /**
208
+ * 비용 전략에 따른 비용 스코어 계산.
209
+ * - economy: 저비용일수록 높은 스코어
210
+ * - quality: 고티어일수록 높은 스코어
211
+ * - balanced: 비용과 티어의 균형
212
+ */
213
+ private computeCostScore;
214
+ /**
215
+ * 축적된 성능 통계에서 성능 스코어를 계산한다.
216
+ * 통계가 없으면 중립값 0.5를 반환한다.
217
+ */
218
+ private computePerformanceScore;
219
+ /**
220
+ * 모델 티어가 태스크 복잡도에 적합한지 평가한다 (0..1).
221
+ * 정확히 매칭하면 1.0, 한 단계 차이면 0.7, 그 이상이면 감소.
222
+ */
223
+ private computeComplexityFit;
224
+ /** 파일 수·반복 횟수에서 복잡도 추정 */
225
+ private complexityFromMetrics;
226
+ /** 설명 키워드에서 복잡도 추정 */
227
+ private complexityFromKeywords;
228
+ /** 프로바이더에 API 키가 설정되어 있는지 확인 */
229
+ private isProviderAvailable;
230
+ /** 모델의 평균 비용 (input + output) / 2 per 1K tokens */
231
+ private avgCostPer1k;
232
+ /** 세션 예산이 소진되었는지 확인 */
233
+ private isBudgetExhausted;
234
+ /** role에서 taskType 추론 */
235
+ private taskTypeFromRole;
236
+ /** taskType과 role 조합에서 유효한 taskType 결정 */
237
+ private resolveTaskType;
238
+ /**
239
+ * forceProvider/forceModel 설정 시 강제 결정 생성.
240
+ * 강제된 모델이 카탈로그에 있으면 해당 엔트리 사용,
241
+ * 없으면 기본값으로 구성하되 fallback은 정상 스코어링으로 계산.
242
+ */
243
+ private buildForcedDecision;
244
+ }
245
+ //# sourceMappingURL=model-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../src/model-router.ts"],"names":[],"mappings":"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"}