@zelari/core 0.7.9

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 (202) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agents/advancedTools.d.ts +7 -0
  3. package/dist/agents/advancedTools.d.ts.map +1 -0
  4. package/dist/agents/advancedTools.js +115 -0
  5. package/dist/agents/advancedTools.js.map +1 -0
  6. package/dist/agents/councilApi.d.ts +328 -0
  7. package/dist/agents/councilApi.d.ts.map +1 -0
  8. package/dist/agents/councilApi.js +952 -0
  9. package/dist/agents/councilApi.js.map +1 -0
  10. package/dist/agents/councilDirectives.d.ts +26 -0
  11. package/dist/agents/councilDirectives.d.ts.map +1 -0
  12. package/dist/agents/councilDirectives.js +98 -0
  13. package/dist/agents/councilDirectives.js.map +1 -0
  14. package/dist/agents/harnessToolBridge.d.ts +26 -0
  15. package/dist/agents/harnessToolBridge.d.ts.map +1 -0
  16. package/dist/agents/harnessToolBridge.js +60 -0
  17. package/dist/agents/harnessToolBridge.js.map +1 -0
  18. package/dist/agents/promoteMember.d.ts +77 -0
  19. package/dist/agents/promoteMember.d.ts.map +1 -0
  20. package/dist/agents/promoteMember.js +210 -0
  21. package/dist/agents/promoteMember.js.map +1 -0
  22. package/dist/agents/promptModules.d.ts +20 -0
  23. package/dist/agents/promptModules.d.ts.map +1 -0
  24. package/dist/agents/promptModules.js +139 -0
  25. package/dist/agents/promptModules.js.map +1 -0
  26. package/dist/agents/roles.d.ts +40 -0
  27. package/dist/agents/roles.d.ts.map +1 -0
  28. package/dist/agents/roles.js +352 -0
  29. package/dist/agents/roles.js.map +1 -0
  30. package/dist/agents/skills/builtin/debugging.d.ts +2 -0
  31. package/dist/agents/skills/builtin/debugging.d.ts.map +1 -0
  32. package/dist/agents/skills/builtin/debugging.js +248 -0
  33. package/dist/agents/skills/builtin/debugging.js.map +1 -0
  34. package/dist/agents/skills/builtin/docs.d.ts +2 -0
  35. package/dist/agents/skills/builtin/docs.d.ts.map +1 -0
  36. package/dist/agents/skills/builtin/docs.js +291 -0
  37. package/dist/agents/skills/builtin/docs.js.map +1 -0
  38. package/dist/agents/skills/builtin/git-ops.d.ts +2 -0
  39. package/dist/agents/skills/builtin/git-ops.d.ts.map +1 -0
  40. package/dist/agents/skills/builtin/git-ops.js +301 -0
  41. package/dist/agents/skills/builtin/git-ops.js.map +1 -0
  42. package/dist/agents/skills/builtin/planning.d.ts +2 -0
  43. package/dist/agents/skills/builtin/planning.d.ts.map +1 -0
  44. package/dist/agents/skills/builtin/planning.js +335 -0
  45. package/dist/agents/skills/builtin/planning.js.map +1 -0
  46. package/dist/agents/skills/builtin/refactoring.d.ts +2 -0
  47. package/dist/agents/skills/builtin/refactoring.d.ts.map +1 -0
  48. package/dist/agents/skills/builtin/refactoring.js +261 -0
  49. package/dist/agents/skills/builtin/refactoring.js.map +1 -0
  50. package/dist/agents/skills/builtin/review.d.ts +2 -0
  51. package/dist/agents/skills/builtin/review.d.ts.map +1 -0
  52. package/dist/agents/skills/builtin/review.js +302 -0
  53. package/dist/agents/skills/builtin/review.js.map +1 -0
  54. package/dist/agents/skills/builtin/testing.d.ts +2 -0
  55. package/dist/agents/skills/builtin/testing.d.ts.map +1 -0
  56. package/dist/agents/skills/builtin/testing.js +245 -0
  57. package/dist/agents/skills/builtin/testing.js.map +1 -0
  58. package/dist/agents/skills.d.ts +138 -0
  59. package/dist/agents/skills.d.ts.map +1 -0
  60. package/dist/agents/skills.js +277 -0
  61. package/dist/agents/skills.js.map +1 -0
  62. package/dist/agents/systemPromptBuilder.d.ts +45 -0
  63. package/dist/agents/systemPromptBuilder.d.ts.map +1 -0
  64. package/dist/agents/systemPromptBuilder.js +159 -0
  65. package/dist/agents/systemPromptBuilder.js.map +1 -0
  66. package/dist/agents/toolSchemas.d.ts +55 -0
  67. package/dist/agents/toolSchemas.d.ts.map +1 -0
  68. package/dist/agents/toolSchemas.js +316 -0
  69. package/dist/agents/toolSchemas.js.map +1 -0
  70. package/dist/agents/tools.d.ts +67 -0
  71. package/dist/agents/tools.d.ts.map +1 -0
  72. package/dist/agents/tools.js +225 -0
  73. package/dist/agents/tools.js.map +1 -0
  74. package/dist/agents/vaultTools.d.ts +9 -0
  75. package/dist/agents/vaultTools.d.ts.map +1 -0
  76. package/dist/agents/vaultTools.js +134 -0
  77. package/dist/agents/vaultTools.js.map +1 -0
  78. package/dist/core/AgentHarness.d.ts +250 -0
  79. package/dist/core/AgentHarness.d.ts.map +1 -0
  80. package/dist/core/AgentHarness.js +614 -0
  81. package/dist/core/AgentHarness.js.map +1 -0
  82. package/dist/core/providerStream.d.ts +61 -0
  83. package/dist/core/providerStream.d.ts.map +1 -0
  84. package/dist/core/providerStream.js +99 -0
  85. package/dist/core/providerStream.js.map +1 -0
  86. package/dist/core/sessionJsonl.d.ts +50 -0
  87. package/dist/core/sessionJsonl.d.ts.map +1 -0
  88. package/dist/core/sessionJsonl.js +99 -0
  89. package/dist/core/sessionJsonl.js.map +1 -0
  90. package/dist/core/tools/auditLog.d.ts +14 -0
  91. package/dist/core/tools/auditLog.d.ts.map +1 -0
  92. package/dist/core/tools/auditLog.js +26 -0
  93. package/dist/core/tools/auditLog.js.map +1 -0
  94. package/dist/core/tools/builtin/_walk.d.ts +40 -0
  95. package/dist/core/tools/builtin/_walk.d.ts.map +1 -0
  96. package/dist/core/tools/builtin/_walk.js +129 -0
  97. package/dist/core/tools/builtin/_walk.js.map +1 -0
  98. package/dist/core/tools/builtin/diff.d.ts +45 -0
  99. package/dist/core/tools/builtin/diff.d.ts.map +1 -0
  100. package/dist/core/tools/builtin/diff.js +477 -0
  101. package/dist/core/tools/builtin/diff.js.map +1 -0
  102. package/dist/core/tools/builtin/filesystem.d.ts +45 -0
  103. package/dist/core/tools/builtin/filesystem.d.ts.map +1 -0
  104. package/dist/core/tools/builtin/filesystem.js +110 -0
  105. package/dist/core/tools/builtin/filesystem.js.map +1 -0
  106. package/dist/core/tools/builtin/listFiles.d.ts +18 -0
  107. package/dist/core/tools/builtin/listFiles.d.ts.map +1 -0
  108. package/dist/core/tools/builtin/listFiles.js +48 -0
  109. package/dist/core/tools/builtin/listFiles.js.map +1 -0
  110. package/dist/core/tools/builtin/search.d.ts +49 -0
  111. package/dist/core/tools/builtin/search.d.ts.map +1 -0
  112. package/dist/core/tools/builtin/search.js +148 -0
  113. package/dist/core/tools/builtin/search.js.map +1 -0
  114. package/dist/core/tools/builtin/shell.d.ts +27 -0
  115. package/dist/core/tools/builtin/shell.d.ts.map +1 -0
  116. package/dist/core/tools/builtin/shell.js +98 -0
  117. package/dist/core/tools/builtin/shell.js.map +1 -0
  118. package/dist/core/tools/builtin/shellResolver.d.ts +25 -0
  119. package/dist/core/tools/builtin/shellResolver.d.ts.map +1 -0
  120. package/dist/core/tools/builtin/shellResolver.js +117 -0
  121. package/dist/core/tools/builtin/shellResolver.js.map +1 -0
  122. package/dist/core/tools/builtin/web.d.ts +43 -0
  123. package/dist/core/tools/builtin/web.d.ts.map +1 -0
  124. package/dist/core/tools/builtin/web.js +208 -0
  125. package/dist/core/tools/builtin/web.js.map +1 -0
  126. package/dist/core/tools/registry.d.ts +31 -0
  127. package/dist/core/tools/registry.d.ts.map +1 -0
  128. package/dist/core/tools/registry.js +115 -0
  129. package/dist/core/tools/registry.js.map +1 -0
  130. package/dist/core/tools/toolTypes.d.ts +60 -0
  131. package/dist/core/tools/toolTypes.d.ts.map +1 -0
  132. package/dist/core/tools/toolTypes.js +8 -0
  133. package/dist/core/tools/toolTypes.js.map +1 -0
  134. package/dist/core/tools/zodBridge.d.ts +6 -0
  135. package/dist/core/tools/zodBridge.d.ts.map +1 -0
  136. package/dist/core/tools/zodBridge.js +56 -0
  137. package/dist/core/tools/zodBridge.js.map +1 -0
  138. package/dist/council/index.d.ts +14 -0
  139. package/dist/council/index.d.ts.map +1 -0
  140. package/dist/council/index.js +14 -0
  141. package/dist/council/index.js.map +1 -0
  142. package/dist/council/modeBanners.d.ts +5 -0
  143. package/dist/council/modeBanners.d.ts.map +1 -0
  144. package/dist/council/modeBanners.js +10 -0
  145. package/dist/council/modeBanners.js.map +1 -0
  146. package/dist/council/runMode.d.ts +25 -0
  147. package/dist/council/runMode.d.ts.map +1 -0
  148. package/dist/council/runMode.js +41 -0
  149. package/dist/council/runMode.js.map +1 -0
  150. package/dist/events/index.d.ts +6 -0
  151. package/dist/events/index.d.ts.map +1 -0
  152. package/dist/events/index.js +6 -0
  153. package/dist/events/index.js.map +1 -0
  154. package/dist/harness/index.d.ts +9 -0
  155. package/dist/harness/index.d.ts.map +1 -0
  156. package/dist/harness/index.js +9 -0
  157. package/dist/harness/index.js.map +1 -0
  158. package/dist/harness/tools/index.d.ts +20 -0
  159. package/dist/harness/tools/index.d.ts.map +1 -0
  160. package/dist/harness/tools/index.js +19 -0
  161. package/dist/harness/tools/index.js.map +1 -0
  162. package/dist/index.d.ts +13 -0
  163. package/dist/index.d.ts.map +1 -0
  164. package/dist/index.js +18 -0
  165. package/dist/index.js.map +1 -0
  166. package/dist/shared/eventBus.d.ts +58 -0
  167. package/dist/shared/eventBus.d.ts.map +1 -0
  168. package/dist/shared/eventBus.js +104 -0
  169. package/dist/shared/eventBus.js.map +1 -0
  170. package/dist/shared/events.d.ts +230 -0
  171. package/dist/shared/events.d.ts.map +1 -0
  172. package/dist/shared/events.js +76 -0
  173. package/dist/shared/events.js.map +1 -0
  174. package/dist/shared/index.d.ts +8 -0
  175. package/dist/shared/index.d.ts.map +1 -0
  176. package/dist/shared/index.js +8 -0
  177. package/dist/shared/index.js.map +1 -0
  178. package/dist/skills/index.d.ts +10 -0
  179. package/dist/skills/index.d.ts.map +1 -0
  180. package/dist/skills/index.js +10 -0
  181. package/dist/skills/index.js.map +1 -0
  182. package/dist/types/context.d.ts +54 -0
  183. package/dist/types/context.d.ts.map +1 -0
  184. package/dist/types/context.js +3 -0
  185. package/dist/types/context.js.map +1 -0
  186. package/dist/types/index.d.ts +13 -0
  187. package/dist/types/index.d.ts.map +1 -0
  188. package/dist/types/index.js +12 -0
  189. package/dist/types/index.js.map +1 -0
  190. package/dist/types/knowledge.d.ts +79 -0
  191. package/dist/types/knowledge.d.ts.map +1 -0
  192. package/dist/types/knowledge.js +5 -0
  193. package/dist/types/knowledge.js.map +1 -0
  194. package/dist/types/legacy.d.ts +466 -0
  195. package/dist/types/legacy.d.ts.map +1 -0
  196. package/dist/types/legacy.js +2 -0
  197. package/dist/types/legacy.js.map +1 -0
  198. package/dist/types/systemTypes.d.ts +113 -0
  199. package/dist/types/systemTypes.d.ts.map +1 -0
  200. package/dist/types/systemTypes.js +10 -0
  201. package/dist/types/systemTypes.js.map +1 -0
  202. package/package.json +151 -0
@@ -0,0 +1,614 @@
1
+ /**
2
+ * AgentHarness — provider-neutral agent loop.
3
+ *
4
+ * Encapsulates a single agent turn: given a (model, provider, messages, tools)
5
+ * configuration and a provider streaming function, it drives the stream and
6
+ * yields the full {@link BrainEvent} lifecycle as an `AsyncIterable<BrainEvent>`.
7
+ *
8
+ * Electron-free: this module imports ONLY from `electron/shared/` (the event
9
+ * contract + bus) and `electron/main/core/tools/` (the tool registry). It has
10
+ * zero coupling to `llm.ts` or any main-process IPC, so it can run in the
11
+ * Electron main process today and be reused from the Ink CLI in Phase 14.
12
+ *
13
+ * When `toolRegistry` is provided, tool_call deltas trigger real tool
14
+ * execution and emit a matching `tool_execution_end` event. Without it, the
15
+ * harness only emits `tool_execution_start` (legacy behavior, useful for
16
+ * streaming-only consumers).
17
+ *
18
+ * @see docs/plans/2026-06-28-zelari-code.md (Task 12.1 + 14.8)
19
+ */
20
+ import { createBrainEvent, } from '../shared/events.js';
21
+ // --- Harness ----------------------------------------------------------------
22
+ export class AgentHarness {
23
+ config;
24
+ eventBus;
25
+ sessionId;
26
+ maxQueuedIterations;
27
+ cancelled = false;
28
+ activeController = null;
29
+ queue = [];
30
+ /**
31
+ * Per-run cache of executed tool calls keyed by `hash(toolName + canonical
32
+ * args)`. v0.7.1 (A2): when the model re-issues an identical call (a
33
+ * observed failure mode where read_file hit the same path ×3 / cat the
34
+ * same file ×3), the cached result is replayed with a "duplicate call"
35
+ * prefix instead of re-executing — preserving the iteration budget for
36
+ * real progress. Reset on every `run()` so it does not leak across turns.
37
+ */
38
+ toolCallCache = new Map();
39
+ constructor(config) {
40
+ this.config = config;
41
+ this.eventBus = config.eventBus;
42
+ this.sessionId = config.sessionId ?? crypto.randomUUID();
43
+ this.maxQueuedIterations = config.maxQueuedIterations ?? 3;
44
+ }
45
+ /**
46
+ * Member identity fields (memberId + memberName) to merge into every
47
+ * event payload. Returns an empty object when the run is a direct
48
+ * user prompt (no member context), so call sites can spread it
49
+ * unconditionally.
50
+ *
51
+ * @since 0.5.0
52
+ */
53
+ memberFields() {
54
+ return {
55
+ ...(this.config.memberId ? { memberId: this.config.memberId } : {}),
56
+ ...(this.config.memberName ? { memberName: this.config.memberName } : {}),
57
+ };
58
+ }
59
+ /**
60
+ * Cancel the in-flight run. Events drain until end of stream.
61
+ *
62
+ * Idempotent: calling cancel() multiple times is safe — the cancelled
63
+ * flag stays true and AbortController.abort() is itself a no-op on
64
+ * already-aborted controllers. If no turn is running, this is a
65
+ * no-op (the next run() invocation will check the cancelled flag
66
+ * and emit `agent_end` with `reason: 'cancelled'` before any work).
67
+ *
68
+ * After cancel() returns, the harness should be discarded by the
69
+ * caller (the run() generator finishes after the current turn ends).
70
+ * For mid-stream interrupt + new-prompt injection, see Task C.3.2.
71
+ */
72
+ cancel() {
73
+ if (this.cancelled)
74
+ return; // idempotent — don't re-abort
75
+ this.cancelled = true;
76
+ this.activeController?.abort();
77
+ }
78
+ /** Current size of the queued user-prompt buffer. */
79
+ get queueLength() {
80
+ return this.queue.length;
81
+ }
82
+ /**
83
+ * Enqueue a user prompt to be processed at the next opportunity.
84
+ * The next prompt in the queue will be appended to the conversation
85
+ * transcript and re-enter the provider stream loop after the current
86
+ * turn finishes. Emits a `queue_update` event so UIs can refresh
87
+ * the displayed counter.
88
+ *
89
+ * If `run()` has already returned (no active loop), the queued
90
+ * prompt will be picked up on the *next* run() call — note this
91
+ * helper does NOT itself trigger a run. Callers wire the
92
+ * dequeue step inside `run()` (Task 18.1).
93
+ */
94
+ enqueue(userText) {
95
+ this.queue.push(userText);
96
+ const queueEvent = createBrainEvent('queue_update', this.sessionId, {
97
+ queuedCount: this.queue.length,
98
+ });
99
+ this.emit(queueEvent);
100
+ }
101
+ /**
102
+ * Dequeue the next queued prompt, or `null` if the queue is empty.
103
+ * Emits a `queue_update` event with the new length so UIs can
104
+ * decrement the counter.
105
+ */
106
+ dequeueNext() {
107
+ const next = this.queue.shift() ?? null;
108
+ const queueEvent = createBrainEvent('queue_update', this.sessionId, {
109
+ queuedCount: this.queue.length,
110
+ });
111
+ this.emit(queueEvent);
112
+ return next;
113
+ }
114
+ /**
115
+ * Run a single agent turn and yield provider-neutral BrainEvents.
116
+ * The returned AsyncIterable emits all BrainEvents for the run, then completes.
117
+ * Callers can subscribe via eventBus AND iterate the returned iterable.
118
+ */
119
+ async *run() {
120
+ const startTime = Date.now();
121
+ this.activeController = new AbortController();
122
+ // Reset the per-run duplicate-call cache (v0.7.1 A2).
123
+ this.toolCallCache = new Map();
124
+ // Emit agent_start
125
+ const startEvent = createBrainEvent('agent_start', this.sessionId, {
126
+ model: this.config.model,
127
+ provider: this.config.provider,
128
+ ...this.memberFields(),
129
+ });
130
+ this.emit(startEvent);
131
+ yield startEvent;
132
+ // === Initial turn (always runs to preserve Phase 12.x behavior) ===
133
+ // The harness processes the messages buffer that was provided in
134
+ // the config. Backward compat: existing callers expect a single
135
+ // provider call here even when the queue is empty.
136
+ const initialMessageId = crypto.randomUUID();
137
+ let totalLength = 0;
138
+ let hadError = false;
139
+ const initialMsgStart = createBrainEvent('message_start', this.sessionId, { messageId: initialMessageId, role: 'assistant', ...this.memberFields() });
140
+ this.emit(initialMsgStart);
141
+ yield initialMsgStart;
142
+ let initialTurnLength = 0;
143
+ const initialFinishRef = { value: 'stop' };
144
+ // Task G.4.3 — capture real provider usage for this turn. The ref
145
+ // is read after runSingleTurn returns and attached to message_end.
146
+ const initialUsageRef = { value: null };
147
+ for await (const ev of this.runSingleTurn(initialMessageId, initialFinishRef, initialUsageRef)) {
148
+ if (ev.type === 'message_delta') {
149
+ initialTurnLength += ev.delta.length;
150
+ }
151
+ else if (ev.type === 'error') {
152
+ // Cancellations are emitted as error events with severity='cancelled'
153
+ // (Task C.3.1) — they must NOT set hadError, otherwise the final
154
+ // agent_end would emit reason='error' instead of 'cancelled'.
155
+ if (ev.severity !== 'cancelled') {
156
+ hadError = true;
157
+ }
158
+ }
159
+ yield ev;
160
+ }
161
+ totalLength += initialTurnLength;
162
+ const initialMsgEnd = createBrainEvent('message_end', this.sessionId, {
163
+ messageId: initialMessageId,
164
+ totalLength: initialTurnLength,
165
+ finishReason: initialFinishRef.value,
166
+ ...this.memberFields(),
167
+ ...(initialUsageRef.value ? { usage: initialUsageRef.value } : {}),
168
+ });
169
+ this.emit(initialMsgEnd);
170
+ yield initialMsgEnd;
171
+ // === Agentic tool-call loop ===
172
+ // When the model's finish reason is 'tool_calls', the turn produced tool
173
+ // invocations whose results are now in the transcript (appended by
174
+ // runSingleTurn). Re-enter the provider so the model can consume those
175
+ // results and continue — this is the core agent loop (reason → act →
176
+ // observe → reason). Bounded by MAX_TOOL_LOOP_ITERATIONS to prevent runaway.
177
+ const MAX_TOOL_LOOP_ITERATIONS = 12;
178
+ let toolLoopTurns = 0;
179
+ while (!this.cancelled &&
180
+ !hadError &&
181
+ toolLoopTurns < MAX_TOOL_LOOP_ITERATIONS &&
182
+ initialFinishRef.value === 'tool_calls') {
183
+ toolLoopTurns++;
184
+ const turnMessageId = crypto.randomUUID();
185
+ const msgStart = createBrainEvent('message_start', this.sessionId, { messageId: turnMessageId, role: 'assistant', ...this.memberFields() });
186
+ this.emit(msgStart);
187
+ yield msgStart;
188
+ let turnLength = 0;
189
+ const turnFinishRef = { value: 'stop' };
190
+ const turnUsageRef = { value: null };
191
+ for await (const ev of this.runSingleTurn(turnMessageId, turnFinishRef, turnUsageRef)) {
192
+ if (ev.type === 'message_delta') {
193
+ turnLength += ev.delta.length;
194
+ }
195
+ else if (ev.type === 'error') {
196
+ if (ev.severity !== 'cancelled')
197
+ hadError = true;
198
+ }
199
+ yield ev;
200
+ }
201
+ totalLength += turnLength;
202
+ const msgEnd = createBrainEvent('message_end', this.sessionId, {
203
+ messageId: turnMessageId,
204
+ totalLength: turnLength,
205
+ finishReason: turnFinishRef.value,
206
+ ...this.memberFields(),
207
+ ...(turnUsageRef.value ? { usage: turnUsageRef.value } : {}),
208
+ });
209
+ this.emit(msgEnd);
210
+ yield msgEnd;
211
+ // Drive the loop: keep going only if this turn again requested tool calls.
212
+ initialFinishRef.value = turnFinishRef.value;
213
+ if (hadError || this.cancelled)
214
+ break;
215
+ }
216
+ // === Final-answer guarantee (v0.7.1 A2) ===
217
+ // When the tool-call loop exits because it hit the iteration cap (or the
218
+ // per-turn tool-call limit keeps producing tool_calls finish reasons) the
219
+ // run would otherwise end with tool noise and NO assistant answer — the
220
+ // user sees silence after the last tool box. Detect that terminal state
221
+ // and make ONE more provider call with tools OMITTED + a synthetic system
222
+ // nudge so the turn always ends with assistant text answering with what
223
+ // the model has gathered. Skipped on cancel/error (the loop already set
224
+ // hadError or this.cancelled) and when the loop ended on a non-tool finish.
225
+ const hitIterationCap = toolLoopTurns >= MAX_TOOL_LOOP_ITERATIONS;
226
+ if (!this.cancelled &&
227
+ !hadError &&
228
+ initialFinishRef.value === 'tool_calls' &&
229
+ hitIterationCap) {
230
+ yield* this.runFinalAnswerTurn();
231
+ }
232
+ // === Queue drain (Task 18.1) ===
233
+ // After the initial turn, drain queued user prompts up to
234
+ // maxQueuedIterations. Each iteration appends the next dequeued
235
+ // user prompt to messages, then re-enters the provider stream.
236
+ // Loop terminates on cancel, error, empty queue, or max iterations.
237
+ let turns = 0;
238
+ while (turns < this.maxQueuedIterations) {
239
+ if (this.cancelled)
240
+ break;
241
+ if (this.queue.length === 0)
242
+ break;
243
+ const queuedPrompt = this.dequeueNext();
244
+ if (queuedPrompt === null)
245
+ break;
246
+ // Append to conversation transcript for this turn
247
+ this.config.messages.push({ role: 'user', content: queuedPrompt });
248
+ const turnMessageId = crypto.randomUUID();
249
+ const msgStart = createBrainEvent('message_start', this.sessionId, {
250
+ messageId: turnMessageId,
251
+ role: 'assistant',
252
+ ...this.memberFields(),
253
+ });
254
+ this.emit(msgStart);
255
+ yield msgStart;
256
+ let turnLength = 0;
257
+ const turnFinishRef = { value: 'stop' };
258
+ const turnUsageRef = { value: null };
259
+ for await (const ev of this.runSingleTurn(turnMessageId, turnFinishRef, turnUsageRef)) {
260
+ if (ev.type === 'message_delta') {
261
+ turnLength += ev.delta.length;
262
+ }
263
+ else if (ev.type === 'error') {
264
+ hadError = true;
265
+ }
266
+ yield ev;
267
+ }
268
+ totalLength += turnLength;
269
+ const msgEnd = createBrainEvent('message_end', this.sessionId, {
270
+ messageId: turnMessageId,
271
+ totalLength: turnLength,
272
+ finishReason: turnFinishRef.value,
273
+ ...this.memberFields(),
274
+ ...(turnUsageRef.value ? { usage: turnUsageRef.value } : {}),
275
+ });
276
+ this.emit(msgEnd);
277
+ yield msgEnd;
278
+ turns++;
279
+ }
280
+ // Emit agent_end
281
+ const agentEnd = createBrainEvent('agent_end', this.sessionId, {
282
+ reason: hadError ? 'error' : this.cancelled ? 'cancelled' : 'completed',
283
+ durationMs: Date.now() - startTime,
284
+ ...this.memberFields(),
285
+ });
286
+ this.emit(agentEnd);
287
+ yield agentEnd;
288
+ this.activeController = null;
289
+ }
290
+ /**
291
+ * Run a single provider turn for the current message buffer.
292
+ * Streams from the provider, dispatches deltas to events, executes
293
+ * any tool calls (if a registry was provided). Yields each
294
+ * `BrainEvent` it produces so the caller can re-emit them in
295
+ * the outer generator.
296
+ *
297
+ * Does NOT emit `message_start` / `message_end` — those are the
298
+ * caller's responsibility (so the outer generator can wrap them
299
+ * around the yielded event stream and compute the right
300
+ * `totalLength` from observed deltas).
301
+ *
302
+ * Extracted from the original monolithic `run()` body to enable
303
+ * the queue-draining loop in Task 18.1.
304
+ */
305
+ async *runSingleTurn(messageId, finishRef, usageRef) {
306
+ try {
307
+ const stream = this.config.providerStream({
308
+ messages: this.config.messages,
309
+ model: this.config.model,
310
+ provider: this.config.provider,
311
+ tools: this.config.tools,
312
+ signal: this.activeController?.signal,
313
+ });
314
+ // Per-turn tool call counter (Task G.2). Reset on every turn so
315
+ // queue-drained turns don't accumulate across prompts.
316
+ let toolCallsThisTurn = 0;
317
+ const maxToolCalls = this.config.maxToolCallsPerTurn;
318
+ // Accumulate this turn's text + tool calls so we can append an assistant
319
+ // message (with tool_calls) to the transcript before re-entering the
320
+ // provider. Without this, tool results would arrive at the API with no
321
+ // preceding assistant tool_calls message → HTTP 400.
322
+ let turnText = '';
323
+ const turnToolCalls = [];
324
+ for await (const delta of stream) {
325
+ if (this.cancelled) {
326
+ // Emit a cancellation error event so consumers (CLI, tests) can
327
+ // observe the mid-stream interrupt (Task C.3.1).
328
+ const cancelEvent = createBrainEvent('error', this.sessionId, {
329
+ severity: 'cancelled',
330
+ message: 'Run cancelled by user.',
331
+ code: 'cancelled',
332
+ });
333
+ this.emit(cancelEvent);
334
+ yield cancelEvent;
335
+ break;
336
+ }
337
+ if (delta.kind === 'text') {
338
+ turnText += delta.delta;
339
+ const deltaEvent = createBrainEvent('message_delta', this.sessionId, { messageId, delta: delta.delta, ...this.memberFields() });
340
+ this.emit(deltaEvent);
341
+ yield deltaEvent;
342
+ }
343
+ else if (delta.kind === 'thinking') {
344
+ const thinkEvent = createBrainEvent('thinking_delta', this.sessionId, {
345
+ messageId,
346
+ delta: delta.delta,
347
+ });
348
+ this.emit(thinkEvent);
349
+ yield thinkEvent;
350
+ }
351
+ else if (delta.kind === 'tool_call') {
352
+ toolCallsThisTurn++;
353
+ // Record this tool call so the assistant message (appended after the
354
+ // turn) carries the full tool_calls list the model emitted.
355
+ turnToolCalls.push({ id: delta.toolCallId, name: delta.toolName, args: delta.args });
356
+ const toolStartEvent = createBrainEvent('tool_execution_start', this.sessionId, {
357
+ toolCallId: delta.toolCallId,
358
+ toolName: delta.toolName,
359
+ args: delta.args,
360
+ });
361
+ this.emit(toolStartEvent);
362
+ yield toolStartEvent;
363
+ // Skip registry execution if we've exceeded the per-turn limit
364
+ // (Task G.2, carryover from v3-C C.1.5). Emit a synthetic
365
+ // `tool_execution_end` so the UI can still render the attempt
366
+ // and downstream consumers (e.g. the LLM context) see a clean
367
+ // closure. Without this guard, a council member could fire 50
368
+ // read_file calls in one turn and blow the message context.
369
+ const skipped = typeof maxToolCalls === 'number' && toolCallsThisTurn > maxToolCalls;
370
+ if (this.config.toolRegistry && !skipped) {
371
+ // v0.7.1 (A2): duplicate-call short-circuit. If the model re-issues
372
+ // an identical tool call (same name + same args) within this run,
373
+ // replay the cached result instead of re-executing. Feed it back
374
+ // with a prefix so the model learns not to repeat the call. This
375
+ // preserves the iteration budget for real progress instead of
376
+ // burning it on read_file(same path) ×3.
377
+ const callKey = hashToolCall(delta.toolName, delta.args);
378
+ const cached = this.toolCallCache.get(callKey);
379
+ if (cached !== undefined) {
380
+ const dupResult = `[duplicate call — result repeated; do not call this tool again with the same arguments]\n${cached}`;
381
+ const endEvent = createBrainEvent('tool_execution_end', this.sessionId, {
382
+ toolCallId: delta.toolCallId,
383
+ result: dupResult,
384
+ isError: false,
385
+ durationMs: 0,
386
+ });
387
+ this.emit(endEvent);
388
+ yield endEvent;
389
+ this.config.messages.push({
390
+ role: 'tool',
391
+ toolCallId: delta.toolCallId,
392
+ content: dupResult,
393
+ });
394
+ }
395
+ else {
396
+ const startMs = Date.now();
397
+ const result = await this.config.toolRegistry.invoke(delta.toolName, delta.args, {
398
+ cwd: this.config.cwd,
399
+ sessionId: this.sessionId,
400
+ signal: this.activeController?.signal,
401
+ });
402
+ let resultStr = '';
403
+ if (result.ok) {
404
+ if (typeof result.value === 'string') {
405
+ resultStr = result.value;
406
+ }
407
+ else if (typeof result.value === 'object' && result.value !== null) {
408
+ resultStr = JSON.stringify(result.value, null, 2);
409
+ }
410
+ else {
411
+ resultStr = String(result.value);
412
+ }
413
+ }
414
+ else {
415
+ resultStr = result.error;
416
+ }
417
+ const endEvent = createBrainEvent('tool_execution_end', this.sessionId, {
418
+ toolCallId: delta.toolCallId,
419
+ result: resultStr,
420
+ isError: !result.ok,
421
+ durationMs: Date.now() - startMs,
422
+ });
423
+ this.emit(endEvent);
424
+ yield endEvent;
425
+ // Append the tool result to the transcript so the next provider
426
+ // turn can see what the tool returned (OpenAI role:'tool' message).
427
+ this.config.messages.push({
428
+ role: 'tool',
429
+ toolCallId: delta.toolCallId,
430
+ content: resultStr,
431
+ });
432
+ // v0.7.1 (A2): cache the result so an identical re-issue is
433
+ // short-circuited above instead of re-executed.
434
+ this.toolCallCache.set(callKey, resultStr);
435
+ }
436
+ }
437
+ else if (skipped) {
438
+ // Synthetic end event — no registry call, just close out the
439
+ // tool_execution_start with an explicit skip reason. The LLM
440
+ // can see in the next provider turn that this tool didn't run.
441
+ const endEvent = createBrainEvent('tool_execution_end', this.sessionId, {
442
+ toolCallId: delta.toolCallId,
443
+ result: `[skipped] maxToolCallsPerTurn reached (limit=${maxToolCalls})`,
444
+ isError: true,
445
+ durationMs: 0,
446
+ });
447
+ this.emit(endEvent);
448
+ yield endEvent;
449
+ this.config.messages.push({
450
+ role: 'tool',
451
+ toolCallId: delta.toolCallId,
452
+ content: `[skipped] maxToolCallsPerTurn reached (limit=${maxToolCalls})`,
453
+ });
454
+ }
455
+ }
456
+ else if (delta.kind === 'finish') {
457
+ // Capture the finish reason via the shared ref so the caller
458
+ // can synthesize the matching `message_end`.
459
+ finishRef.value = delta.reason;
460
+ // Append the assistant turn (text + any tool_calls) to the transcript.
461
+ // This MUST happen before the loop re-enters the provider (either via
462
+ // queue drain or a follow-up tool-result turn) so the conversation
463
+ // history stays valid: every role:'tool' message needs a preceding
464
+ // assistant message that declared the matching tool_calls.
465
+ if (turnToolCalls.length > 0 || turnText.length > 0) {
466
+ this.config.messages.push({
467
+ role: 'assistant',
468
+ content: turnText,
469
+ ...(turnToolCalls.length > 0 ? { toolCalls: turnToolCalls } : {}),
470
+ });
471
+ }
472
+ break;
473
+ }
474
+ else if (delta.kind === 'error') {
475
+ const errEvent = createBrainEvent('error', this.sessionId, {
476
+ severity: 'recoverable',
477
+ message: delta.message,
478
+ });
479
+ this.emit(errEvent);
480
+ yield errEvent;
481
+ }
482
+ else if (delta.kind === 'usage') {
483
+ // Provider-reported token usage (Task G.4). The breakdown is
484
+ // captured in the shared ref so the caller's `message_end`
485
+ // synthesis can attach it. The delta itself does not become a
486
+ // standalone BrainEvent (it would be noise in the chat stream);
487
+ // consumers wanting real-time token counts hook the message_end
488
+ // and read `event.usage`.
489
+ usageRef.value = delta.usage;
490
+ }
491
+ }
492
+ }
493
+ catch (err) {
494
+ const errorMessage = err instanceof Error ? err.message : String(err);
495
+ const errEvent = createBrainEvent('error', this.sessionId, {
496
+ severity: 'recoverable',
497
+ message: errorMessage,
498
+ });
499
+ this.emit(errEvent);
500
+ yield errEvent;
501
+ }
502
+ }
503
+ emit(event) {
504
+ if (this.eventBus) {
505
+ try {
506
+ this.eventBus.emit(event);
507
+ }
508
+ catch (err) {
509
+ console.error('[AgentHarness] eventBus.emit failed:', err);
510
+ }
511
+ }
512
+ }
513
+ /**
514
+ * Final-answer turn (v0.7.1 A2). Called when the tool-call loop hit its
515
+ * iteration cap without the model producing a non-tool finish. Makes ONE
516
+ * provider call with `tools` OMITTED and a synthetic system nudge appended,
517
+ * so the run always ends with assistant text answering the user with what
518
+ * has been gathered — instead of trailing off after the last tool box.
519
+ *
520
+ * Yields the full message lifecycle (start/deltas/end) so the UI renders
521
+ * the closing answer like any other assistant turn. Errors are swallowed
522
+ * into a recoverable error event (best-effort: the guarantee must never
523
+ * turn a near-success into a hard failure).
524
+ */
525
+ async *runFinalAnswerTurn() {
526
+ const messageId = crypto.randomUUID();
527
+ const msgStart = createBrainEvent('message_start', this.sessionId, {
528
+ messageId,
529
+ role: 'assistant',
530
+ ...this.memberFields(),
531
+ });
532
+ this.emit(msgStart);
533
+ yield msgStart;
534
+ // Append a synthetic system nudge telling the model to answer now, and
535
+ // run with NO tools so it cannot start another tool chain.
536
+ this.config.messages.push({
537
+ role: 'user',
538
+ content: '[system] Tool iteration budget exhausted. Stop calling tools and answer the original request now using the information you have already gathered. Do not apologize for the tools.',
539
+ });
540
+ let totalLength = 0;
541
+ const finishRef = { value: 'stop' };
542
+ const usageRef = { value: null };
543
+ // Temporarily drop tools for this call by building a no-tools provider
544
+ // invocation. We re-enter runSingleTurn but with an empty tools list via
545
+ // a throwaway config override is not possible (config is readonly), so we
546
+ // call the providerStream directly with tools: [].
547
+ try {
548
+ const stream = this.config.providerStream({
549
+ messages: this.config.messages,
550
+ model: this.config.model,
551
+ provider: this.config.provider,
552
+ tools: [],
553
+ signal: this.activeController?.signal,
554
+ });
555
+ for await (const delta of stream) {
556
+ if (this.cancelled)
557
+ break;
558
+ if (delta.kind === 'text') {
559
+ totalLength += delta.delta.length;
560
+ const deltaEvent = createBrainEvent('message_delta', this.sessionId, { messageId, delta: delta.delta, ...this.memberFields() });
561
+ this.emit(deltaEvent);
562
+ yield deltaEvent;
563
+ }
564
+ else if (delta.kind === 'usage') {
565
+ usageRef.value = delta.usage;
566
+ }
567
+ else if (delta.kind === 'finish') {
568
+ finishRef.value = delta.reason;
569
+ }
570
+ }
571
+ }
572
+ catch (err) {
573
+ const errorMessage = err instanceof Error ? err.message : String(err);
574
+ const errEvent = createBrainEvent('error', this.sessionId, {
575
+ severity: 'recoverable',
576
+ message: `final-answer turn failed: ${errorMessage}`,
577
+ });
578
+ this.emit(errEvent);
579
+ yield errEvent;
580
+ }
581
+ const msgEnd = createBrainEvent('message_end', this.sessionId, {
582
+ messageId,
583
+ totalLength: totalLength,
584
+ finishReason: finishRef.value,
585
+ ...this.memberFields(),
586
+ ...(usageRef.value ? { usage: usageRef.value } : {}),
587
+ });
588
+ this.emit(msgEnd);
589
+ yield msgEnd;
590
+ }
591
+ }
592
+ /**
593
+ * Stable hash key for a tool call (v0.7.1 A2). Canonicalizes args via a sorted
594
+ * JSON.stringify so `{a:1,b:2}` and `{b:2,a:1}` collide (same logical call).
595
+ * Exported for unit tests.
596
+ */
597
+ export function hashToolCall(toolName, args) {
598
+ const canonical = stableStringify(args);
599
+ return `${toolName}::${canonical}`;
600
+ }
601
+ /** Deterministic JSON stringify (object keys sorted ascending). */
602
+ function stableStringify(value) {
603
+ return JSON.stringify(value, (_k, v) => {
604
+ if (v && typeof v === 'object' && !Array.isArray(v)) {
605
+ const sorted = {};
606
+ for (const key of Object.keys(v).sort()) {
607
+ sorted[key] = v[key];
608
+ }
609
+ return sorted;
610
+ }
611
+ return v;
612
+ });
613
+ }
614
+ //# sourceMappingURL=AgentHarness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentHarness.js","sourceRoot":"","sources":["../../src/core/AgentHarness.ts"],"names":[],"mappings":"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"}