@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,247 @@
1
+ /**
2
+ * @module context-manager
3
+ * @description 컨텍스트 윈도우 관리.
4
+ * 메시지 히스토리 관리, 토큰 카운팅 (근사), 컨텍스트 압축.
5
+ */
6
+ import { TOOL_RESULT_LIMITS, HISTORY_COMPACTION } from "./constants.js";
7
+ import { ContextOverflowError } from "./errors.js";
8
+ /**
9
+ * ContextManager — 컨텍스트 윈도우 크기를 관리.
10
+ *
11
+ * 역할:
12
+ * - 메시지 히스토리를 관리하고 토큰 수를 추적
13
+ * - 도구 결과가 너무 크면 자동 압축
14
+ * - 오래된 메시지를 요약으로 교체하여 컨텍스트 내에 유지
15
+ */
16
+ export class ContextManager {
17
+ messages = [];
18
+ maxTokens;
19
+ outputReserve;
20
+ recentWindow;
21
+ summaryWindow;
22
+ constructor(config) {
23
+ this.maxTokens = config.maxContextTokens;
24
+ this.outputReserve = config.outputReserveTokens ?? 4096;
25
+ this.recentWindow =
26
+ config.compaction?.recentWindow ?? HISTORY_COMPACTION.recentWindow;
27
+ this.summaryWindow =
28
+ config.compaction?.summaryWindow ?? HISTORY_COMPACTION.summaryWindow;
29
+ }
30
+ /**
31
+ * 메시지를 히스토리에 추가.
32
+ * @param message 추가할 메시지
33
+ */
34
+ addMessage(message) {
35
+ this.messages.push(message);
36
+ }
37
+ /**
38
+ * 여러 메시지를 한 번에 추가.
39
+ * @param messages 추가할 메시지 목록
40
+ */
41
+ addMessages(messages) {
42
+ this.messages.push(...messages);
43
+ }
44
+ /**
45
+ * 현재 메시지 히스토리 반환.
46
+ * 컨텍스트 윈도우 내에 맞도록 자동 압축.
47
+ */
48
+ getMessages() {
49
+ return [...this.messages];
50
+ }
51
+ /**
52
+ * LLM에 보낼 메시지를 준비.
53
+ * 필요 시 압축하여 컨텍스트 윈도우 내에 맞춤.
54
+ */
55
+ prepareForLLM() {
56
+ const availableTokens = this.maxTokens - this.outputReserve;
57
+ let currentTokens = this.estimateTokens(this.messages);
58
+ if (currentTokens <= availableTokens) {
59
+ return [...this.messages];
60
+ }
61
+ // 압축 필요
62
+ const compacted = this.compactHistory(availableTokens);
63
+ currentTokens = this.estimateTokens(compacted);
64
+ if (currentTokens > availableTokens) {
65
+ throw new ContextOverflowError(currentTokens, availableTokens);
66
+ }
67
+ return compacted;
68
+ }
69
+ /**
70
+ * 메시지 목록의 대략적인 토큰 수를 추정.
71
+ * tiktoken 없이 근사치 사용 (영어 ~4자/토큰, 한국어 ~2자/토큰).
72
+ * @param messages 토큰 수를 추정할 메시지 목록
73
+ */
74
+ estimateTokens(messages) {
75
+ let total = 0;
76
+ for (const msg of messages) {
77
+ // 메시지 오버헤드 (~4 토큰)
78
+ total += 4;
79
+ if (msg.content) {
80
+ total += this.estimateStringTokens(msg.content);
81
+ }
82
+ if (msg.tool_calls) {
83
+ for (const tc of msg.tool_calls) {
84
+ total += this.estimateStringTokens(tc.name) + 4;
85
+ const argsStr = typeof tc.arguments === "string"
86
+ ? tc.arguments
87
+ : JSON.stringify(tc.arguments);
88
+ total += this.estimateStringTokens(argsStr);
89
+ }
90
+ }
91
+ }
92
+ return total;
93
+ }
94
+ /**
95
+ * 도구 결과를 크기 제한에 맞게 압축.
96
+ * @param toolName 도구 이름
97
+ * @param result 도구 결과 문자열
98
+ * @returns 압축된 결과 (제한 내이면 원본 반환)
99
+ */
100
+ compressToolResult(toolName, result) {
101
+ const limit = TOOL_RESULT_LIMITS[toolName] ?? 10_000;
102
+ if (result.length <= limit)
103
+ return result;
104
+ const headSize = Math.floor(limit * 0.3);
105
+ const tailSize = Math.floor(limit * 0.3);
106
+ const truncated = result.length - headSize - tailSize;
107
+ return (result.slice(0, headSize) +
108
+ `\n\n... (${truncated} chars truncated) ...\n\n` +
109
+ result.slice(-tailSize));
110
+ }
111
+ /**
112
+ * 현재 총 토큰 수 추정치를 반환.
113
+ */
114
+ getCurrentTokenCount() {
115
+ return this.estimateTokens(this.messages);
116
+ }
117
+ /**
118
+ * 히스토리를 초기화.
119
+ */
120
+ clear() {
121
+ this.messages = [];
122
+ }
123
+ /**
124
+ * 히스토리 메시지 수를 반환.
125
+ */
126
+ get messageCount() {
127
+ return this.messages.length;
128
+ }
129
+ // ─── Private ───
130
+ /**
131
+ * 히스토리를 압축하여 토큰 예산 내에 맞춤.
132
+ *
133
+ * 전략:
134
+ * 1. system 메시지는 항상 유지
135
+ * 2. 최근 recentWindow개 메시지는 원본 유지
136
+ * 3. summaryWindow 범위: 도구 결과만 요약으로 교체
137
+ * 4. 그 이전: 전체를 1줄 요약으로 압축
138
+ */
139
+ compactHistory(targetTokens) {
140
+ const result = [];
141
+ // 1. system 메시지 추출
142
+ const systemMessages = this.messages.filter((m) => m.role === "system");
143
+ const nonSystemMessages = this.messages.filter((m) => m.role !== "system");
144
+ result.push(...systemMessages);
145
+ const total = nonSystemMessages.length;
146
+ const recentStart = Math.max(0, total - this.recentWindow);
147
+ const summaryStart = Math.max(0, recentStart - this.summaryWindow);
148
+ // 4. 아주 오래된 메시지 (summaryStart 이전) → 전체 요약
149
+ if (summaryStart > 0) {
150
+ const oldMessages = nonSystemMessages.slice(0, summaryStart);
151
+ const summary = this.summarizeMessages(oldMessages);
152
+ result.push({
153
+ role: "system",
154
+ content: `[Previous conversation summary]\n${summary}`,
155
+ });
156
+ }
157
+ // 3. 중간 메시지 (summaryStart ~ recentStart) → 도구 결과 압축
158
+ for (let i = summaryStart; i < recentStart; i++) {
159
+ const msg = nonSystemMessages[i];
160
+ if (msg.role === "tool" && msg.content) {
161
+ result.push({
162
+ ...msg,
163
+ content: this.truncateToolResult(msg.content),
164
+ });
165
+ }
166
+ else {
167
+ result.push(msg);
168
+ }
169
+ }
170
+ // 2. 최근 메시지 → 원본 유지
171
+ for (let i = recentStart; i < total; i++) {
172
+ result.push(nonSystemMessages[i]);
173
+ }
174
+ // 토큰 초과 시 중간 메시지도 추가 요약
175
+ let tokens = this.estimateTokens(result);
176
+ if (tokens > targetTokens && result.length > systemMessages.length + this.recentWindow) {
177
+ // 중간 메시지 제거하고 더 짧은 요약으로 교체
178
+ const keep = systemMessages.length + 1 + this.recentWindow; // system + summary + recent
179
+ while (result.length > keep && tokens > targetTokens) {
180
+ result.splice(systemMessages.length + 1, 1);
181
+ tokens = this.estimateTokens(result);
182
+ }
183
+ }
184
+ return result;
185
+ }
186
+ summarizeMessages(messages) {
187
+ const actions = [];
188
+ let userMsgCount = 0;
189
+ let toolCallCount = 0;
190
+ for (const msg of messages) {
191
+ if (msg.role === "user") {
192
+ userMsgCount++;
193
+ if (msg.content) {
194
+ const preview = msg.content.slice(0, 100);
195
+ actions.push(`User: ${preview}${msg.content.length > 100 ? "..." : ""}`);
196
+ }
197
+ }
198
+ else if (msg.role === "assistant" && msg.tool_calls) {
199
+ toolCallCount += msg.tool_calls.length;
200
+ for (const tc of msg.tool_calls) {
201
+ actions.push(`Tool: ${tc.name}`);
202
+ }
203
+ }
204
+ }
205
+ return [
206
+ `${userMsgCount} user messages, ${toolCallCount} tool calls.`,
207
+ ...actions.slice(0, 10),
208
+ actions.length > 10
209
+ ? `... and ${actions.length - 10} more actions`
210
+ : "",
211
+ ]
212
+ .filter(Boolean)
213
+ .join("\n");
214
+ }
215
+ truncateToolResult(content) {
216
+ const MAX = 500;
217
+ if (content.length <= MAX)
218
+ return content;
219
+ return content.slice(0, 200) + "\n...(truncated)...\n" + content.slice(-200);
220
+ }
221
+ /**
222
+ * 문자열의 대략적인 토큰 수를 추정 (근사치).
223
+ *
224
+ * **추정 방식:**
225
+ * - 영어/ASCII 텍스트: ~4 characters per token
226
+ * - CJK/한국어 텍스트 (U+3000–U+9FFF, U+AC00–U+D7AF): ~2 characters per token
227
+ * - 혼합 텍스트는 각 범위의 문자 수를 분리하여 합산
228
+ *
229
+ * **오차 범위:**
230
+ * - 영어: 실제 토큰 대비 ~±20% 오차 (서브워드 분할 특성상 변동)
231
+ * - CJK/한국어: ~±20% 이상 오차 가능 (모델별 토크나이저 차이가 큼)
232
+ * - 코드, 특수문자, 긴 단어 등에서 오차가 더 커질 수 있음
233
+ *
234
+ * **의도적 설계:**
235
+ * BYOK 환경에서는 사용자가 다양한 모델(Claude, GPT, Gemini 등)을
236
+ * 자유롭게 선택하므로 모델별 토크나이저에 접근할 수 없다.
237
+ * 따라서 정확한 토큰 카운팅 대신 범용 근사치를 사용하며,
238
+ * 컨텍스트 오버플로우는 outputReserve 마진으로 방어한다.
239
+ */
240
+ estimateStringTokens(str) {
241
+ // CJK 문자 비율 체크
242
+ const cjkCount = (str.match(/[\u3000-\u9fff\uac00-\ud7af]/g) ?? []).length;
243
+ const nonCjkCount = str.length - cjkCount;
244
+ return Math.ceil(nonCjkCount / 4 + cjkCount / 2);
245
+ }
246
+ }
247
+ //# sourceMappingURL=context-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../src/context-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * @module continuous-reflection
3
+ * @description Continuous Reflection — 설계 문서 섹션 20.2 구현.
4
+ *
5
+ * 1분 간격으로 3가지 자율 점검을 수행한다:
6
+ *
7
+ * 1. **Checkpoint**: 현재 상태를 SessionPersistence에 저장
8
+ * 2. **Self-Verify**: 경량 LLM 호출(~200 토큰)로 방향 검증
9
+ * 3. **Context Monitor**: 컨텍스트 사용량 체크, 80%→비상 체크포인트, 95%→새 세션 스폰
10
+ *
11
+ * ESC로 토글 가능 (pause/resume). 순수 실행 모드.
12
+ * EventEmitter를 확장하여 reflection 이벤트를 외부에 전파.
13
+ */
14
+ import { EventEmitter } from "node:events";
15
+ import type { ContinuationCheckpoint } from "./types.js";
16
+ /**
17
+ * 자기 검증 프롬프트 템플릿.
18
+ *
19
+ * 플레이스홀더는 실행 시 실제 값으로 치환된다:
20
+ * - {goal}: 현재 에이전트 목표
21
+ * - {iteration}: 현재 iteration 수
22
+ * - {maxIteration}: 최대 iteration 수
23
+ * - {changedFiles}: 변경된 파일 목록
24
+ * - {recentToolCalls}: 최근 3개 도구 호출
25
+ * - {errors}: 발생한 에러 목록
26
+ */
27
+ export declare const SELF_VERIFY_PROMPT = "\uB2F9\uC2E0\uC740 \uD604\uC7AC \uC2E4\uD589 \uC911\uC778 \uC5D0\uC774\uC804\uD2B8\uC758 \uC9C4\uD589 \uC0C1\uD669\uC744 \uAC80\uC99D\uD558\uB294 \uC5ED\uD560\uC785\uB2C8\uB2E4.\n\n\uD604\uC7AC \uC0C1\uD0DC:\n- \uBAA9\uD45C: {goal}\n- \uC644\uB8CC\uB41C \uC774\uD130\uB808\uC774\uC158: {iteration}/{maxIteration}\n- \uBCC0\uACBD\uB41C \uD30C\uC77C: {changedFiles}\n- \uCD5C\uADFC 3\uAC1C \uB3C4\uAD6C \uD638\uCD9C: {recentToolCalls}\n- \uC5D0\uB7EC \uBC1C\uC0DD: {errors}\n\n\uB2E4\uC74C\uC744 \uD310\uB2E8\uD558\uC138\uC694:\n1. \uC62C\uBC14\uB978 \uBC29\uD5A5\uC73C\uB85C \uC9C4\uD589 \uC911\uC778\uAC00? (yes/no)\n2. \uC0BD\uC9C8 \uD328\uD134\uC774 \uBCF4\uC774\uB294\uAC00? (\uAC19\uC740 \uD30C\uC77C \uBC18\uBCF5 \uC218\uC815, \uAC19\uC740 \uC5D0\uB7EC \uBC18\uBCF5 \uB4F1)\n3. \uBC29\uD5A5 \uC804\uD658\uC774 \uD544\uC694\uD55C\uAC00?\n\nJSON\uC73C\uB85C \uC751\uB2F5:\n{\n \"onTrack\": true/false,\n \"needsCorrection\": true/false,\n \"issue\": \"\uBB38\uC81C \uC124\uBA85 (\uC788\uC73C\uBA74)\",\n \"suggestion\": \"\uC81C\uC548 (\uC788\uC73C\uBA74)\",\n \"confidence\": 0.0~1.0\n}";
28
+ /** Reflection 설정 */
29
+ export interface ReflectionConfig {
30
+ /** 체크 간격 (ms). 기본 60_000 (1분). */
31
+ intervalMs: number;
32
+ /** Reflection 활성화 여부. ESC로 토글. */
33
+ enabled: boolean;
34
+ /** 체크포인트 저장 활성화 */
35
+ checkpointEnabled: boolean;
36
+ /** 자기 검증 (LLM 호출) 활성화 */
37
+ selfVerifyEnabled: boolean;
38
+ /** 컨텍스트 사용량 모니터 활성화 */
39
+ contextMonitorEnabled: boolean;
40
+ }
41
+ /** 자기 검증 LLM 응답 */
42
+ export interface SelfVerifyVerdict {
43
+ /** 올바른 방향인가 */
44
+ onTrack: boolean;
45
+ /** 방향 전환이 필요한가 */
46
+ needsCorrection: boolean;
47
+ /** 문제 설명 (있으면) */
48
+ issue: string;
49
+ /** 수정 제안 (있으면) */
50
+ suggestion: string;
51
+ /** 판단 확신도 (0.0~1.0) */
52
+ confidence: number;
53
+ }
54
+ /** 에이전트 상태 스냅샷 — reflection이 접근하는 읽기 전용 정보 */
55
+ export interface AgentStateSnapshot {
56
+ /** 현재 목표 */
57
+ goal: string;
58
+ /** 현재 iteration */
59
+ iteration: number;
60
+ /** 최대 iteration */
61
+ maxIteration: number;
62
+ /** 변경된 파일 목록 */
63
+ changedFiles: string[];
64
+ /** 최근 도구 호출 (최대 3개) */
65
+ recentToolCalls: Array<{
66
+ tool: string;
67
+ input: string;
68
+ output: string;
69
+ }>;
70
+ /** 발생한 에러 목록 */
71
+ errors: string[];
72
+ /** 컨텍스트 사용률 (0.0~1.0) */
73
+ contextUsagePercent: number;
74
+ /** 세션 ID */
75
+ sessionId: string;
76
+ /** 사용된 총 토큰 */
77
+ totalTokensUsed: number;
78
+ /** 작업 메모리 (압축 요약) */
79
+ workingMemory: string;
80
+ /** 완료된 태스크 목록 */
81
+ completedTasks: string[];
82
+ /** 현재 태스크 */
83
+ currentTask: string;
84
+ /** 남은 태스크 목록 */
85
+ remainingTasks: string[];
86
+ }
87
+ /**
88
+ * 자기 검증 LLM 호출 콜백.
89
+ *
90
+ * LLMClient를 직접 import하지 않고 의존성 주입으로 받는다.
91
+ * 호출 측에서 경량 모델(~200 토큰)로 호출하도록 구현한다.
92
+ *
93
+ * @param prompt - 치환된 검증 프롬프트
94
+ * @returns 검증 결과 JSON
95
+ */
96
+ export type SelfVerifyFn = (prompt: string) => Promise<SelfVerifyVerdict>;
97
+ /**
98
+ * 체크포인트 저장 콜백.
99
+ *
100
+ * SessionPersistence를 직접 import하지 않고 의존성 주입으로 받는다.
101
+ *
102
+ * @param state - 현재 에이전트 상태 스냅샷
103
+ * @param emergency - 비상 체크포인트 여부 (80%+ 컨텍스트)
104
+ */
105
+ export type CheckpointFn = (state: AgentStateSnapshot, emergency: boolean) => Promise<void>;
106
+ /**
107
+ * 에이전트 상태 제공 콜백.
108
+ *
109
+ * AgentLoop의 현재 상태를 읽기 전용으로 가져온다.
110
+ */
111
+ export type GetStateFn = () => AgentStateSnapshot;
112
+ /** ContinuousReflection 생성자 옵션 */
113
+ export interface ContinuousReflectionOptions {
114
+ /** Reflection 설정 */
115
+ config?: Partial<ReflectionConfig>;
116
+ /** 자기 검증 LLM 호출 콜백 (DI) */
117
+ selfVerify?: SelfVerifyFn;
118
+ /** 체크포인트 저장 콜백 (DI) */
119
+ checkpoint?: CheckpointFn;
120
+ /** 에이전트 상태 제공 콜백 (DI) */
121
+ getState: GetStateFn;
122
+ }
123
+ /** ContinuousReflection이 발행하는 이벤트 맵 */
124
+ export interface ReflectionEvents {
125
+ /** 체크포인트 저장 완료 */
126
+ "reflection:checkpoint": [state: AgentStateSnapshot];
127
+ /** 자기 검증 완료 */
128
+ "reflection:self_verify": [verdict: SelfVerifyVerdict];
129
+ /** 피드백 주입 요청 (방향 전환 필요 시) */
130
+ "reflection:feedback": [feedback: string];
131
+ /** 컨텍스트 80% 도달 — 비상 체크포인트 */
132
+ "reflection:context_warning": [usagePercent: number];
133
+ /** 컨텍스트 95% 도달 — 새 세션 스폰 요청 */
134
+ "reflection:context_overflow": [checkpoint: ContinuationCheckpoint];
135
+ /** Reflection 일시 정지 (ESC) */
136
+ "reflection:paused": [];
137
+ /** Reflection 재개 */
138
+ "reflection:resumed": [];
139
+ /** Reflection 에러 (비치명적, 다음 tick에서 재시도) */
140
+ "reflection:error": [error: Error];
141
+ }
142
+ /**
143
+ * Continuous Reflection.
144
+ *
145
+ * 1분 간격으로 체크포인트 저장, 자기 검증, 컨텍스트 모니터를 수행한다.
146
+ * ESC로 토글 가능 (pause/resume).
147
+ *
148
+ * LLM 호출과 체크포인트 저장은 의존성 주입으로 받아 결합도를 낮춘다.
149
+ * 컨텍스트 95% 도달 시 `reflection:context_overflow` 이벤트를 발행하며,
150
+ * 실제 세션 스폰은 부모(AgentRunner)가 처리한다.
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * const reflection = new ContinuousReflection({
155
+ * getState: () => agentLoop.getStateSnapshot(),
156
+ * selfVerify: async (prompt) => llm.complete(prompt, { maxTokens: 200 }),
157
+ * checkpoint: async (state, emergency) => persistence.save(state, emergency),
158
+ * });
159
+ *
160
+ * reflection.on("reflection:context_overflow", (cp) => {
161
+ * agentRunner.spawnContinuation(cp);
162
+ * });
163
+ *
164
+ * reflection.on("reflection:feedback", (feedback) => {
165
+ * agentLoop.injectFeedback(feedback);
166
+ * });
167
+ *
168
+ * reflection.start();
169
+ * // ... agent loop runs ...
170
+ * reflection.stop();
171
+ * ```
172
+ */
173
+ export declare class ContinuousReflection extends EventEmitter {
174
+ /** 주기적 타이머 */
175
+ private timer;
176
+ /** 현재 설정 */
177
+ private config;
178
+ /** 자기 검증 LLM 호출 콜백 */
179
+ private readonly selfVerifyFn;
180
+ /** 체크포인트 저장 콜백 */
181
+ private readonly checkpointFn;
182
+ /** 에이전트 상태 제공 콜백 */
183
+ private readonly getStateFn;
184
+ /** tick 실행 중 여부 (중복 방지) */
185
+ private ticking;
186
+ /** 컨텍스트 overflow가 이미 트리거됐는지 (중복 스폰 방지) */
187
+ private overflowTriggered;
188
+ constructor(options: ContinuousReflectionOptions);
189
+ /**
190
+ * Reflection 루프를 시작한다.
191
+ *
192
+ * config.intervalMs 간격으로 체크포인트, 자기 검증, 컨텍스트 모니터를 수행.
193
+ */
194
+ start(): void;
195
+ /**
196
+ * Reflection을 일시 정지한다 (ESC 토글).
197
+ *
198
+ * 타이머는 유지되지만 tick 내부에서 enabled=false이면 스킵.
199
+ */
200
+ pause(): void;
201
+ /**
202
+ * Reflection을 재개한다.
203
+ */
204
+ resume(): void;
205
+ /**
206
+ * Reflection 루프를 완전히 중지한다.
207
+ *
208
+ * 세션 종료 시 호출.
209
+ */
210
+ stop(): void;
211
+ /**
212
+ * Reflection이 현재 활성 상태인지 반환한다.
213
+ */
214
+ isEnabled(): boolean;
215
+ /**
216
+ * Reflection 루프가 실행 중인지 반환한다 (타이머 존재 여부).
217
+ */
218
+ isRunning(): boolean;
219
+ /**
220
+ * 비상 체크포인트를 즉시 수행한다.
221
+ *
222
+ * Hard interrupt 시 InterruptManager가 호출한다.
223
+ */
224
+ emergencyCheckpoint(): Promise<void>;
225
+ /**
226
+ * 현재 설정을 반환한다.
227
+ */
228
+ getConfig(): Readonly<ReflectionConfig>;
229
+ /**
230
+ * 설정을 부분 업데이트한다.
231
+ */
232
+ updateConfig(partial: Partial<ReflectionConfig>): void;
233
+ /**
234
+ * 1회 tick 실행.
235
+ *
236
+ * 중복 실행 방지 (이전 tick이 아직 진행 중이면 스킵).
237
+ * 각 단계에서 에러가 발생해도 다음 단계는 실행한다 (비치명적).
238
+ */
239
+ private tick;
240
+ /**
241
+ * [1] 체크포인트 저장.
242
+ *
243
+ * 현재 상태를 SessionPersistence에 저장한다.
244
+ */
245
+ private performCheckpoint;
246
+ /**
247
+ * [2] 자기 검증.
248
+ *
249
+ * 경량 LLM 호출(~200 토큰)로 현재 방향을 검증한다.
250
+ * 방향 전환이 필요하면 피드백을 에이전트 루프에 주입한다.
251
+ */
252
+ private performSelfVerify;
253
+ /**
254
+ * [3] 컨텍스트 사용량 모니터.
255
+ *
256
+ * - 80%: 비상 체크포인트
257
+ * - 95%: 새 세션 스폰 요청 (1회만)
258
+ */
259
+ private performContextMonitor;
260
+ /**
261
+ * 자기 검증 프롬프트를 빌드한다.
262
+ *
263
+ * SELF_VERIFY_PROMPT 템플릿의 플레이스홀더를 실제 값으로 치환한다.
264
+ */
265
+ private buildSelfVerifyPrompt;
266
+ }
267
+ //# sourceMappingURL=continuous-reflection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continuous-reflection.d.ts","sourceRoot":"","sources":["../src/continuous-reflection.ts"],"names":[],"mappings":"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"}