@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,609 @@
1
+ /**
2
+ * @module agent-loop
3
+ * @description 메인 Agent Loop — LLM ↔ Tool 반복 실행 엔진.
4
+ *
5
+ * while 루프로 LLM 호출 → tool_use 파싱 → tool 실행 → 결과 피드백을 반복.
6
+ * Governor가 반복 제한/안전 검증을 담당하고,
7
+ * ContextManager가 컨텍스트 윈도우를 관리한다.
8
+ */
9
+ import { EventEmitter } from "node:events";
10
+ import { BYOKClient } from "./llm-client.js";
11
+ import { Governor } from "./governor.js";
12
+ import { ContextManager } from "./context-manager.js";
13
+ import { LLMError, PlanLimitError, ApprovalRequiredError, } from "./errors.js";
14
+ import { ApprovalManager, } from "./approval.js";
15
+ import { AutoFixLoop, } from "./auto-fix.js";
16
+ import { InterruptManager } from "./interrupt-manager.js";
17
+ /**
18
+ * AgentLoop — YUAN 에이전트의 핵심 실행 루프.
19
+ *
20
+ * 동작 흐름:
21
+ * 1. 사용자 메시지 수신
22
+ * 2. 시스템 프롬프트 + 히스토리로 LLM 호출
23
+ * 3. LLM 응답에서 tool_call 파싱
24
+ * 4. Governor가 안전성 검증
25
+ * 5. 도구 실행 → 결과를 히스토리에 추가
26
+ * 6. LLM에 결과 피드백 → 2번으로 반복
27
+ * 7. 종료 조건 충족 시 결과 반환
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const loop = new AgentLoop({
32
+ * config: agentConfig,
33
+ * toolExecutor: executor,
34
+ * governorConfig: { planTier: "PRO" },
35
+ * });
36
+ *
37
+ * loop.on("event", (event: AgentEvent) => {
38
+ * // SSE 스트리밍
39
+ * });
40
+ *
41
+ * const result = await loop.run("모든 console.log를 제거해줘");
42
+ * ```
43
+ */
44
+ export class AgentLoop extends EventEmitter {
45
+ llmClient;
46
+ governor;
47
+ contextManager;
48
+ toolExecutor;
49
+ config;
50
+ approvalManager;
51
+ autoFixLoop;
52
+ interruptManager;
53
+ aborted = false;
54
+ tokenUsage = {
55
+ input: 0,
56
+ output: 0,
57
+ reasoning: 0,
58
+ total: 0,
59
+ };
60
+ constructor(options) {
61
+ super();
62
+ this.config = options.config;
63
+ this.toolExecutor = options.toolExecutor;
64
+ // BYOK LLM 클라이언트 생성
65
+ this.llmClient = new BYOKClient(options.config.byok);
66
+ // Governor 생성
67
+ this.governor = new Governor(options.governorConfig);
68
+ // ContextManager 생성
69
+ this.contextManager = new ContextManager({
70
+ maxContextTokens: options.contextConfig?.maxContextTokens ??
71
+ options.config.loop.totalTokenBudget,
72
+ outputReserveTokens: options.contextConfig?.outputReserveTokens ?? 4096,
73
+ ...options.contextConfig,
74
+ });
75
+ // ApprovalManager 생성
76
+ this.approvalManager = new ApprovalManager(options.approvalConfig);
77
+ if (options.approvalHandler) {
78
+ this.approvalManager.setHandler(options.approvalHandler);
79
+ }
80
+ // AutoFixLoop 생성
81
+ this.autoFixLoop = new AutoFixLoop(options.autoFixConfig);
82
+ // InterruptManager 설정 (외부 주입 또는 내부 생성)
83
+ this.interruptManager = options.interruptManager ?? new InterruptManager();
84
+ this.setupInterruptListeners();
85
+ // 시스템 프롬프트 추가
86
+ this.contextManager.addMessage({
87
+ role: "system",
88
+ content: this.config.loop.systemPrompt,
89
+ });
90
+ }
91
+ /**
92
+ * 에이전트 루프를 실행.
93
+ * @param userMessage 사용자의 요청 메시지
94
+ * @returns 종료 사유 및 결과
95
+ */
96
+ async run(userMessage) {
97
+ this.aborted = false;
98
+ // 사용자 메시지 추가
99
+ this.contextManager.addMessage({
100
+ role: "user",
101
+ content: userMessage,
102
+ });
103
+ this.emitEvent({ kind: "agent:start", goal: userMessage });
104
+ try {
105
+ return await this.executeLoop();
106
+ }
107
+ catch (err) {
108
+ return this.handleFatalError(err);
109
+ }
110
+ }
111
+ /**
112
+ * 실행 중인 루프를 중단.
113
+ */
114
+ abort() {
115
+ this.aborted = true;
116
+ }
117
+ /**
118
+ * 에이전트에 인터럽트 시그널을 전달한다.
119
+ * InterruptManager로 위임하며, 관련 이벤트를 발행한다.
120
+ *
121
+ * @param signal - 인터럽트 시그널
122
+ */
123
+ interrupt(signal) {
124
+ this.interruptManager.interrupt(signal);
125
+ // Emit as agent:error for external listeners (backward-compatible)
126
+ this.emitEvent({
127
+ kind: "agent:error",
128
+ message: `Interrupt received: ${signal.type}${signal.feedback ? ` — ${signal.feedback}` : ""}`,
129
+ retryable: signal.type === "soft",
130
+ });
131
+ // Also emit raw interrupt event on the EventEmitter for specialized listeners
132
+ this.emit("interrupt", signal);
133
+ }
134
+ /**
135
+ * InterruptManager 인스턴스를 반환한다.
136
+ * 외부에서 직접 인터럽트를 전달하거나 이벤트를 구독할 때 사용.
137
+ */
138
+ getInterruptManager() {
139
+ return this.interruptManager;
140
+ }
141
+ /**
142
+ * 현재 토큰 사용량을 반환.
143
+ */
144
+ getTokenUsage() {
145
+ return { ...this.tokenUsage };
146
+ }
147
+ /**
148
+ * 대화 히스토리를 반환.
149
+ */
150
+ getHistory() {
151
+ return this.contextManager.getMessages();
152
+ }
153
+ /**
154
+ * ApprovalManager 인스턴스를 반환.
155
+ * CLI/UI에서 핸들러를 등록하거나 설정을 변경할 때 사용.
156
+ */
157
+ getApprovalManager() {
158
+ return this.approvalManager;
159
+ }
160
+ /**
161
+ * AutoFixLoop 인스턴스를 반환.
162
+ * 수정 시도 기록 등을 조회할 때 사용.
163
+ */
164
+ getAutoFixLoop() {
165
+ return this.autoFixLoop;
166
+ }
167
+ // ─── Core Loop ───
168
+ async executeLoop() {
169
+ let iteration = 0;
170
+ while (!this.aborted) {
171
+ // Interrupt: pause 상태이면 resume될 때까지 대기
172
+ if (this.interruptManager.isPaused()) {
173
+ await this.waitForResume();
174
+ // hard interrupt로 paused된 경우 aborted일 수 있음
175
+ if (this.aborted)
176
+ break;
177
+ }
178
+ // Governor: iteration 검증
179
+ try {
180
+ this.governor.checkIteration();
181
+ }
182
+ catch (err) {
183
+ if (err instanceof PlanLimitError) {
184
+ return {
185
+ reason: "MAX_ITERATIONS",
186
+ lastState: `Stopped at iteration ${iteration}: ${err.message}`,
187
+ };
188
+ }
189
+ throw err;
190
+ }
191
+ iteration++;
192
+ const iterationStart = Date.now();
193
+ // 1. 컨텍스트 준비
194
+ const messages = this.contextManager.prepareForLLM();
195
+ // 2. LLM 호출 (streaming)
196
+ this.emitEvent({
197
+ kind: "agent:thinking",
198
+ content: `Iteration ${iteration}...`,
199
+ });
200
+ let response;
201
+ try {
202
+ response = await this.callLLMStreaming(messages);
203
+ }
204
+ catch (err) {
205
+ if (err instanceof LLMError) {
206
+ return { reason: "ERROR", error: err.message };
207
+ }
208
+ throw err;
209
+ }
210
+ // 토큰 추적
211
+ this.tokenUsage.input += response.usage.input;
212
+ this.tokenUsage.output += response.usage.output;
213
+ this.tokenUsage.total += response.usage.input + response.usage.output;
214
+ this.governor.recordIteration(response.usage.input, response.usage.output);
215
+ this.emitEvent({
216
+ kind: "agent:token_usage",
217
+ input: this.tokenUsage.input,
218
+ output: this.tokenUsage.output,
219
+ });
220
+ // 3. 응답 처리
221
+ if (response.toolCalls.length === 0) {
222
+ // 도구 호출 없음 — but the LLM might be asking a question or
223
+ // expressing inability rather than signaling completion.
224
+ // Check for question/uncertainty patterns before assuming GOAL_ACHIEVED.
225
+ // NOTE: There is no NEEDS_INPUT termination reason in AgentTermination.
226
+ // If the LLM is uncertain, we continue the loop so it can self-correct
227
+ // or the iteration limit will eventually stop it.
228
+ const content = response.content ?? "";
229
+ const looksLikeQuestion = content.includes("?") ||
230
+ /\b(cannot|can't|need|unclear|please|could you)\b/i.test(content);
231
+ if (looksLikeQuestion) {
232
+ // LLM seems uncertain or asking for input — add as assistant message
233
+ // and continue the loop rather than declaring success.
234
+ if (content) {
235
+ this.contextManager.addMessage({
236
+ role: "assistant",
237
+ content,
238
+ });
239
+ }
240
+ this.emitEvent({
241
+ kind: "agent:thinking",
242
+ content: `LLM responded without tool calls (possible question/uncertainty). Continuing loop.`,
243
+ });
244
+ continue;
245
+ }
246
+ if (content) {
247
+ this.contextManager.addMessage({
248
+ role: "assistant",
249
+ content,
250
+ });
251
+ }
252
+ this.emitEvent({
253
+ kind: "agent:completed",
254
+ summary: content || "Task completed.",
255
+ filesChanged: [],
256
+ });
257
+ return {
258
+ reason: "GOAL_ACHIEVED",
259
+ summary: content || "Task completed.",
260
+ };
261
+ }
262
+ // 어시스턴트 메시지 저장 (tool_calls 포함)
263
+ this.contextManager.addMessage({
264
+ role: "assistant",
265
+ content: response.content,
266
+ tool_calls: response.toolCalls,
267
+ });
268
+ if (response.content) {
269
+ this.emitEvent({
270
+ kind: "agent:thinking",
271
+ content: response.content,
272
+ });
273
+ }
274
+ // 4. 도구 실행
275
+ const toolResults = await this.executeTools(response.toolCalls);
276
+ // 5. 도구 결과를 히스토리에 추가
277
+ for (const result of toolResults) {
278
+ // 큰 결과는 압축
279
+ const compressedOutput = this.contextManager.compressToolResult(result.name, result.output);
280
+ this.contextManager.addMessage({
281
+ role: "tool",
282
+ content: compressedOutput,
283
+ tool_call_id: result.tool_call_id,
284
+ });
285
+ }
286
+ // iteration 이벤트
287
+ const durationMs = Date.now() - iterationStart;
288
+ this.emitEvent({
289
+ kind: "agent:iteration",
290
+ index: iteration,
291
+ tokensUsed: response.usage.input + response.usage.output,
292
+ });
293
+ // 예산 초과 체크
294
+ if (this.tokenUsage.total >= this.config.loop.totalTokenBudget) {
295
+ return {
296
+ reason: "BUDGET_EXHAUSTED",
297
+ tokensUsed: this.tokenUsage.total,
298
+ };
299
+ }
300
+ }
301
+ // abort된 경우
302
+ return { reason: "USER_CANCELLED" };
303
+ }
304
+ /**
305
+ * LLM을 스트리밍 모드로 호출하여 text delta를 실시간 emit.
306
+ * 텍스트 청크는 `agent:text_delta` 이벤트로, tool_call은 누적 후 완료 시 반환.
307
+ */
308
+ async callLLMStreaming(messages) {
309
+ let content = "";
310
+ const toolCalls = [];
311
+ let usage = { input: 0, output: 0 };
312
+ let finishReason = "stop";
313
+ const stream = this.llmClient.chatStream(messages, this.config.loop.tools);
314
+ for await (const chunk of stream) {
315
+ if (this.aborted)
316
+ break;
317
+ switch (chunk.type) {
318
+ case "text":
319
+ if (chunk.text) {
320
+ content += chunk.text;
321
+ this.emitEvent({
322
+ kind: "agent:text_delta",
323
+ text: chunk.text,
324
+ });
325
+ }
326
+ break;
327
+ case "tool_call":
328
+ if (chunk.toolCall) {
329
+ toolCalls.push(chunk.toolCall);
330
+ this.emitEvent({
331
+ kind: "agent:tool_call",
332
+ tool: chunk.toolCall.name,
333
+ input: chunk.toolCall.arguments,
334
+ });
335
+ }
336
+ break;
337
+ case "done":
338
+ if (chunk.usage) {
339
+ usage = chunk.usage;
340
+ }
341
+ break;
342
+ }
343
+ }
344
+ return {
345
+ content: content || null,
346
+ toolCalls,
347
+ usage,
348
+ finishReason,
349
+ };
350
+ }
351
+ /**
352
+ * 도구 호출 목록을 실행.
353
+ * 각 도구 호출에 대해:
354
+ * 1. Governor 안전성 검증
355
+ * 2. ApprovalManager 승인 체크 → 필요 시 대기
356
+ * 3. 도구 실행
357
+ * 4. AutoFixLoop 결과 검증 → 실패 시 에러 피드백 메시지 추가
358
+ */
359
+ async executeTools(toolCalls) {
360
+ const results = [];
361
+ for (const toolCall of toolCalls) {
362
+ // Governor: 안전성 검증
363
+ try {
364
+ this.governor.validateToolCall(toolCall);
365
+ }
366
+ catch (err) {
367
+ if (err instanceof ApprovalRequiredError) {
368
+ // Governor가 위험 감지 → ApprovalManager로 승인 프로세스 위임
369
+ const args = this.parseToolArgs(toolCall.arguments);
370
+ const approvalResult = await this.handleApproval(toolCall, args, err);
371
+ if (approvalResult) {
372
+ results.push(approvalResult);
373
+ continue;
374
+ }
375
+ // 승인됨 → 계속 실행
376
+ }
377
+ else {
378
+ throw err;
379
+ }
380
+ }
381
+ // ApprovalManager: 추가 승인 체크 (Governor가 못 잡은 규칙)
382
+ const args = this.parseToolArgs(toolCall.arguments);
383
+ const approvalRequest = this.approvalManager.checkApproval(toolCall.name, args);
384
+ if (approvalRequest) {
385
+ const approvalResult = await this.handleApprovalRequest(toolCall, approvalRequest);
386
+ if (approvalResult) {
387
+ results.push(approvalResult);
388
+ continue;
389
+ }
390
+ // 승인됨 → 계속 실행
391
+ }
392
+ // 도구 실행 — AbortController를 InterruptManager에 등록
393
+ const startTime = Date.now();
394
+ const toolAbort = new AbortController();
395
+ this.interruptManager.registerToolAbort(toolAbort);
396
+ try {
397
+ const result = await this.toolExecutor.execute(toolCall, toolAbort.signal);
398
+ this.interruptManager.clearToolAbort();
399
+ results.push(result);
400
+ this.emitEvent({
401
+ kind: "agent:tool_result",
402
+ tool: toolCall.name,
403
+ output: result.output.length > 200
404
+ ? result.output.slice(0, 200) + "..."
405
+ : result.output,
406
+ durationMs: result.durationMs,
407
+ });
408
+ // 파일 변경 이벤트
409
+ if (["file_write", "file_edit"].includes(toolCall.name) &&
410
+ result.success) {
411
+ const filePath = args.path ??
412
+ args.file ??
413
+ "unknown";
414
+ this.emitEvent({
415
+ kind: "agent:file_change",
416
+ path: String(filePath),
417
+ diff: result.output,
418
+ });
419
+ }
420
+ // AutoFixLoop: 결과 검증
421
+ await this.validateAndFeedback(toolCall.name, result);
422
+ }
423
+ catch (err) {
424
+ this.interruptManager.clearToolAbort();
425
+ const durationMs = Date.now() - startTime;
426
+ // AbortError인 경우 (인터럽트로 취소됨)
427
+ if (toolAbort.signal.aborted) {
428
+ results.push({
429
+ tool_call_id: toolCall.id,
430
+ name: toolCall.name,
431
+ output: `[INTERRUPTED] Tool execution was cancelled by user interrupt.`,
432
+ success: false,
433
+ durationMs,
434
+ });
435
+ this.emitEvent({
436
+ kind: "agent:error",
437
+ message: `Tool ${toolCall.name} cancelled by interrupt`,
438
+ retryable: false,
439
+ });
440
+ // soft interrupt: 남은 tool calls 건너뛰고 루프 계속
441
+ // hard interrupt: aborted=true로 루프 종료됨
442
+ break;
443
+ }
444
+ const errorMessage = err instanceof Error ? err.message : String(err);
445
+ results.push({
446
+ tool_call_id: toolCall.id,
447
+ name: toolCall.name,
448
+ output: `Error: ${errorMessage}`,
449
+ success: false,
450
+ durationMs,
451
+ });
452
+ this.emitEvent({
453
+ kind: "agent:error",
454
+ message: `Tool ${toolCall.name} failed: ${errorMessage}`,
455
+ retryable: true,
456
+ });
457
+ }
458
+ }
459
+ return results;
460
+ }
461
+ /**
462
+ * Governor의 ApprovalRequiredError를 ApprovalManager로 처리.
463
+ * 승인되면 null 반환 (실행 계속), 거부되면 ToolResult 반환 (실행 차단).
464
+ */
465
+ async handleApproval(toolCall, args, err) {
466
+ const request = {
467
+ id: crypto.randomUUID(),
468
+ toolName: toolCall.name,
469
+ arguments: args,
470
+ riskLevel: "high",
471
+ reason: err.description,
472
+ timeout: 120_000,
473
+ };
474
+ return this.handleApprovalRequest(toolCall, request);
475
+ }
476
+ /**
477
+ * ApprovalRequest를 처리하고 승인/거부 결과를 반환.
478
+ * 승인되면 null (실행 계속), 거부되면 ToolResult (차단).
479
+ */
480
+ async handleApprovalRequest(toolCall, request) {
481
+ const pendingAction = this.approvalManager.buildPendingAction(toolCall, request);
482
+ this.emitEvent({
483
+ kind: "agent:approval_needed",
484
+ action: pendingAction,
485
+ });
486
+ const response = await this.approvalManager.requestApproval(request);
487
+ if (response === "reject") {
488
+ return {
489
+ tool_call_id: toolCall.id,
490
+ name: toolCall.name,
491
+ output: `[REJECTED] User denied approval: ${request.reason}`,
492
+ success: false,
493
+ durationMs: 0,
494
+ };
495
+ }
496
+ // approve 또는 always_approve → 실행 허가
497
+ return null;
498
+ }
499
+ /**
500
+ * 도구 실행 결과를 AutoFixLoop으로 검증하고,
501
+ * 실패 시 수정 프롬프트를 대화 히스토리에 추가.
502
+ */
503
+ async validateAndFeedback(toolName, result) {
504
+ // file_write/file_edit만 검증 (다른 도구는 스킵)
505
+ if (!["file_write", "file_edit"].includes(toolName)) {
506
+ return;
507
+ }
508
+ const validation = await this.autoFixLoop.validateResult(toolName, result.output, result.success, this.config.loop.projectPath);
509
+ if (validation.passed) {
510
+ // 검증 통과 → 수정 시도 기록 초기화
511
+ this.autoFixLoop.resetAttempts();
512
+ return;
513
+ }
514
+ // 검증 실패 → 에러 피드백
515
+ if (!this.autoFixLoop.canRetry()) {
516
+ // 재시도 한도 초과 → 에러 이벤트만 emit
517
+ this.emitEvent({
518
+ kind: "agent:error",
519
+ message: `Auto-fix exhausted (${this.autoFixLoop.getAttempts().length} attempts): ${validation.failures[0]?.message ?? "Unknown error"}`,
520
+ retryable: false,
521
+ });
522
+ return;
523
+ }
524
+ // 수정 프롬프트 생성 → 대화 히스토리에 user 메시지로 추가
525
+ const errorMsg = validation.failures
526
+ .map((f) => `[${f.type}] ${f.message}\n${f.rawOutput}`)
527
+ .join("\n\n");
528
+ const fixPrompt = this.autoFixLoop.buildFixPrompt(errorMsg, `After ${toolName} execution on project at ${this.config.loop.projectPath}`);
529
+ // 수정 시도 기록
530
+ this.autoFixLoop.recordAttempt(errorMsg, "Requesting LLM fix", false, 0);
531
+ // 피드백을 히스토리에 추가 (다음 LLM 호출에서 수정 시도)
532
+ this.contextManager.addMessage({
533
+ role: "user",
534
+ content: fixPrompt,
535
+ });
536
+ }
537
+ /**
538
+ * 도구 인자를 파싱하는 헬퍼.
539
+ */
540
+ parseToolArgs(args) {
541
+ if (typeof args === "string") {
542
+ try {
543
+ return JSON.parse(args);
544
+ }
545
+ catch {
546
+ return { raw: args };
547
+ }
548
+ }
549
+ return args;
550
+ }
551
+ // ─── Interrupt Helpers ───
552
+ /**
553
+ * InterruptManager 이벤트를 AgentLoop에 연결한다.
554
+ * - soft interrupt: 피드백을 user 메시지로 주입
555
+ * - hard interrupt: 루프 즉시 중단
556
+ */
557
+ setupInterruptListeners() {
558
+ // soft interrupt: 피드백을 대화 히스토리에 주입
559
+ this.interruptManager.on("interrupt:feedback", (feedback) => {
560
+ this.contextManager.addMessage({
561
+ role: "user",
562
+ content: feedback,
563
+ });
564
+ });
565
+ // hard interrupt: 루프 중단
566
+ this.interruptManager.on("interrupt:hard", () => {
567
+ this.aborted = true;
568
+ });
569
+ }
570
+ /**
571
+ * pause 상태일 때 resume 시그널을 대기한다.
572
+ * resume 또는 hard interrupt가 올 때까지 블로킹.
573
+ */
574
+ waitForResume() {
575
+ return new Promise((resolve) => {
576
+ // 이미 resume 상태이면 즉시 반환
577
+ if (!this.interruptManager.isPaused()) {
578
+ resolve();
579
+ return;
580
+ }
581
+ const onResume = () => {
582
+ this.interruptManager.removeListener("interrupt:resume", onResume);
583
+ this.interruptManager.removeListener("interrupt:hard", onHard);
584
+ resolve();
585
+ };
586
+ const onHard = () => {
587
+ this.interruptManager.removeListener("interrupt:resume", onResume);
588
+ this.interruptManager.removeListener("interrupt:hard", onHard);
589
+ resolve();
590
+ };
591
+ this.interruptManager.on("interrupt:resume", onResume);
592
+ this.interruptManager.on("interrupt:hard", onHard);
593
+ });
594
+ }
595
+ // ─── Helpers ───
596
+ emitEvent(event) {
597
+ this.emit("event", event);
598
+ }
599
+ handleFatalError(err) {
600
+ const message = err instanceof Error ? err.message : String(err);
601
+ this.emitEvent({
602
+ kind: "agent:error",
603
+ message,
604
+ retryable: false,
605
+ });
606
+ return { reason: "ERROR", error: message };
607
+ }
608
+ }
609
+ //# sourceMappingURL=agent-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"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"}