@inbrowser/agent 0.1.0 → 0.3.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 (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -2
  3. package/dist/cli/commands/run.js.map +1 -1
  4. package/dist/cli/fixtures.d.ts +2 -2
  5. package/dist/cli/fixtures.d.ts.map +1 -1
  6. package/dist/cli/fixtures.js +7 -16
  7. package/dist/cli/fixtures.js.map +1 -1
  8. package/dist/cli/llm/openrouter.d.ts +4 -4
  9. package/dist/cli/llm/openrouter.d.ts.map +1 -1
  10. package/dist/cli/llm/openrouter.js +20 -31
  11. package/dist/cli/llm/openrouter.js.map +1 -1
  12. package/dist/diagnostics/index.d.ts +5 -0
  13. package/dist/diagnostics/index.d.ts.map +1 -0
  14. package/dist/diagnostics/index.js +3 -0
  15. package/dist/diagnostics/index.js.map +1 -0
  16. package/dist/diagnostics/timing.d.ts +48 -0
  17. package/dist/diagnostics/timing.d.ts.map +1 -0
  18. package/dist/diagnostics/timing.js +85 -0
  19. package/dist/diagnostics/timing.js.map +1 -0
  20. package/dist/diagnostics/truthfulness.d.ts +36 -0
  21. package/dist/diagnostics/truthfulness.d.ts.map +1 -0
  22. package/dist/diagnostics/truthfulness.js +180 -0
  23. package/dist/diagnostics/truthfulness.js.map +1 -0
  24. package/dist/dispatch-memoization.d.ts +84 -0
  25. package/dist/dispatch-memoization.d.ts.map +1 -0
  26. package/dist/dispatch-memoization.js +197 -0
  27. package/dist/dispatch-memoization.js.map +1 -0
  28. package/dist/eval/comparison-report.d.ts +164 -0
  29. package/dist/eval/comparison-report.d.ts.map +1 -0
  30. package/dist/eval/comparison-report.js +316 -0
  31. package/dist/eval/comparison-report.js.map +1 -0
  32. package/dist/eval/fixture.d.ts +74 -0
  33. package/dist/eval/fixture.d.ts.map +1 -0
  34. package/dist/eval/fixture.js +217 -0
  35. package/dist/eval/fixture.js.map +1 -0
  36. package/dist/eval/index.d.ts +13 -0
  37. package/dist/eval/index.d.ts.map +1 -0
  38. package/dist/eval/index.js +7 -0
  39. package/dist/eval/index.js.map +1 -0
  40. package/dist/eval/load-node.d.ts +16 -0
  41. package/dist/eval/load-node.d.ts.map +1 -0
  42. package/dist/eval/load-node.js +58 -0
  43. package/dist/eval/load-node.js.map +1 -0
  44. package/dist/eval/metric-collector.d.ts +209 -0
  45. package/dist/eval/metric-collector.d.ts.map +1 -0
  46. package/dist/eval/metric-collector.js +293 -0
  47. package/dist/eval/metric-collector.js.map +1 -0
  48. package/dist/eval/run-record.d.ts +76 -0
  49. package/dist/eval/run-record.d.ts.map +1 -0
  50. package/dist/eval/run-record.js +32 -0
  51. package/dist/eval/run-record.js.map +1 -0
  52. package/dist/eval/runner.d.ts +140 -0
  53. package/dist/eval/runner.d.ts.map +1 -0
  54. package/dist/eval/runner.js +310 -0
  55. package/dist/eval/runner.js.map +1 -0
  56. package/dist/eval/spec-framework.d.ts +113 -0
  57. package/dist/eval/spec-framework.d.ts.map +1 -0
  58. package/dist/eval/spec-framework.js +100 -0
  59. package/dist/eval/spec-framework.js.map +1 -0
  60. package/dist/eval/spec-helpers.d.ts +245 -0
  61. package/dist/eval/spec-helpers.d.ts.map +1 -0
  62. package/dist/eval/spec-helpers.js +605 -0
  63. package/dist/eval/spec-helpers.js.map +1 -0
  64. package/dist/index.d.ts +32 -8
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +14 -3
  67. package/dist/index.js.map +1 -1
  68. package/dist/llm-adapter.d.ts +30 -34
  69. package/dist/llm-adapter.d.ts.map +1 -1
  70. package/dist/llm-adapter.js +61 -51
  71. package/dist/llm-adapter.js.map +1 -1
  72. package/dist/mcp/connect.d.ts +68 -0
  73. package/dist/mcp/connect.d.ts.map +1 -0
  74. package/dist/mcp/connect.js +111 -0
  75. package/dist/mcp/connect.js.map +1 -0
  76. package/dist/metrics.js +4 -4
  77. package/dist/metrics.js.map +1 -1
  78. package/dist/node.d.ts +3 -0
  79. package/dist/node.d.ts.map +1 -1
  80. package/dist/node.js +2 -0
  81. package/dist/node.js.map +1 -1
  82. package/dist/planner-executor.d.ts +132 -0
  83. package/dist/planner-executor.d.ts.map +1 -0
  84. package/dist/planner-executor.js +274 -0
  85. package/dist/planner-executor.js.map +1 -0
  86. package/dist/retrieval.d.ts +74 -0
  87. package/dist/retrieval.d.ts.map +1 -0
  88. package/dist/retrieval.js +287 -0
  89. package/dist/retrieval.js.map +1 -0
  90. package/dist/session.d.ts.map +1 -1
  91. package/dist/session.js +8 -2
  92. package/dist/session.js.map +1 -1
  93. package/dist/skill-catalog.d.ts +81 -0
  94. package/dist/skill-catalog.d.ts.map +1 -0
  95. package/dist/skill-catalog.js +388 -0
  96. package/dist/skill-catalog.js.map +1 -0
  97. package/dist/skill-router.d.ts +95 -0
  98. package/dist/skill-router.d.ts.map +1 -0
  99. package/dist/skill-router.js +130 -0
  100. package/dist/skill-router.js.map +1 -0
  101. package/dist/strategy.d.ts +22 -2
  102. package/dist/strategy.d.ts.map +1 -1
  103. package/dist/strategy.js +358 -28
  104. package/dist/strategy.js.map +1 -1
  105. package/dist/tools.d.ts +15 -1
  106. package/dist/tools.d.ts.map +1 -1
  107. package/dist/tools.js +18 -0
  108. package/dist/tools.js.map +1 -1
  109. package/dist/types/agent.d.ts +2 -3
  110. package/dist/types/agent.d.ts.map +1 -1
  111. package/dist/types/agent.js +1 -1
  112. package/dist/types/chat.d.ts +0 -15
  113. package/dist/types/chat.d.ts.map +1 -1
  114. package/dist/types/llm.d.ts +11 -64
  115. package/dist/types/llm.d.ts.map +1 -1
  116. package/dist/types/llm.js +7 -8
  117. package/dist/types/llm.js.map +1 -1
  118. package/dist/types/metrics.d.ts +2 -2
  119. package/dist/types/metrics.d.ts.map +1 -1
  120. package/dist/types/session.d.ts +2 -2
  121. package/dist/types/session.d.ts.map +1 -1
  122. package/dist/types/strategy.d.ts +60 -3
  123. package/dist/types/strategy.d.ts.map +1 -1
  124. package/dist/types/tools.d.ts +18 -0
  125. package/dist/types/tools.d.ts.map +1 -1
  126. package/dist/types/trace.d.ts +67 -15
  127. package/dist/types/trace.d.ts.map +1 -1
  128. package/dist/types/trace.js +5 -3
  129. package/dist/types/trace.js.map +1 -1
  130. package/package.json +3 -2
@@ -10,16 +10,36 @@
10
10
  * 4. When the LLM produces tool calls, dispatch each one, append
11
11
  * the result message, and loop back to step 2.
12
12
  * 5. When the LLM produces no tool calls in a turn, emit
13
- * `turn_complete` and finish.
13
+ * `turn_complete` (synthesized from the model `usage` event +
14
+ * the client id) and finish.
14
15
  *
15
16
  * Future strategies (planner-executor, graph-of-thoughts,
16
17
  * parallel-branch ensembling) sit alongside this one — same
17
18
  * `AgentStrategy` interface, different control flow.
18
19
  */
19
- import type { AgentStrategy } from './types/strategy.js';
20
+ import type { AgentStrategy, ReflexionConfig } from './types/strategy.js';
20
21
  interface ReactLoopOptions {
21
22
  /** Cap on loop iterations to avoid runaway tool-call ping-pong. Default 24. */
22
23
  maxTurns?: number;
24
+ /**
25
+ * Opt-in: when `true`, tool calls produced in a single turn are partitioned
26
+ * by the handler's `parallelSafe` tag. Parallel-safe calls run concurrently
27
+ * with `Promise.all`; the remaining (mutation) calls run sequentially after
28
+ * the parallel group settles. Result yield order and `messages` order are
29
+ * preserved in the original input order, so the trace and next-turn prompt
30
+ * are byte-for-byte identical to a sequential run — the only observable
31
+ * difference is wall-clock.
32
+ *
33
+ * Defaults to `false` (current behavior: every call serialised).
34
+ */
35
+ parallelDispatch?: boolean;
36
+ /**
37
+ * Opt-in critique-and-retry pass after a candidate final-answer turn.
38
+ * See `ReflexionConfig` for the verdict shape and the retry/exhaust
39
+ * semantics. When absent or `enabled: false`, behavior is byte-for-byte
40
+ * identical to the pre-reflexion loop.
41
+ */
42
+ reflexion?: ReflexionConfig;
23
43
  }
24
44
  export declare function createReactLoopStrategy(options?: ReactLoopOptions): AgentStrategy;
25
45
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../src/strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAmC,MAAM,qBAAqB,CAAC;AAG1F,UAAU,gBAAgB;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,gBAAqB,GAAG,aAAa,CAoIrF"}
1
+ {"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../src/strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EAGhB,MAAM,qBAAqB,CAAC;AAG7B,UAAU,gBAAgB;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAKD,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,gBAAqB,GAAG,aAAa,CAgbrF"}
package/dist/strategy.js CHANGED
@@ -10,32 +10,50 @@
10
10
  * 4. When the LLM produces tool calls, dispatch each one, append
11
11
  * the result message, and loop back to step 2.
12
12
  * 5. When the LLM produces no tool calls in a turn, emit
13
- * `turn_complete` and finish.
13
+ * `turn_complete` (synthesized from the model `usage` event +
14
+ * the client id) and finish.
14
15
  *
15
16
  * Future strategies (planner-executor, graph-of-thoughts,
16
17
  * parallel-branch ensembling) sit alongside this one — same
17
18
  * `AgentStrategy` interface, different control flow.
18
19
  */
20
+ import { isParallelSafe } from './tools.js';
21
+ const DEFAULT_CRITIQUE_SYSTEM_PROMPT = 'You are reviewing the assistant\'s most recent reply for consistency with the tool results visible earlier in this conversation. Reply with a single JSON object of the form {"ok": boolean, "feedback"?: string}. Set ok=true when the reply is supported by the tool results and follows the user\'s request. Set ok=false and supply a one-sentence feedback string when the reply contains a claim not grounded in the prior tool results, contradicts a prior tool result, or fails to answer the user\'s request. Do not include any other prose.';
19
22
  export function createReactLoopStrategy(options = {}) {
20
23
  const maxTurns = options.maxTurns ?? 24;
24
+ const parallelDispatch = options.parallelDispatch === true;
25
+ const reflexionEnabled = options.reflexion?.enabled === true;
26
+ const reflexionMaxRetries = Math.max(0, options.reflexion?.maxRetries ?? 1);
27
+ const critiqueSystemPrompt = options.reflexion?.critiqueSystemPrompt ?? DEFAULT_CRITIQUE_SYSTEM_PROMPT;
21
28
  return {
22
29
  id: 'react-loop',
23
30
  async *run(input, signal) {
24
31
  const messages = buildMessages(input);
32
+ // Per-call retry budget for the critique-and-retry pass. Only
33
+ // consulted when `reflexionEnabled` is true; otherwise the
34
+ // critique branch is skipped entirely and the strategy returns
35
+ // on the first no-tool-calls turn exactly as before.
36
+ let reflexionRetriesRemaining = reflexionMaxRetries;
25
37
  for (let turn = 0; turn < maxTurns; turn++) {
26
38
  if (signal.aborted) {
27
39
  yield { kind: 'error', message: 'aborted' };
28
40
  return;
29
41
  }
42
+ // Flat pre-provider view, captured verbatim in the trace.
30
43
  const toolDecls = input.toolList.map((h) => ({
31
44
  name: h.name,
32
45
  description: h.description,
33
46
  parameters: h.parameters,
34
47
  }));
48
+ // Nested OAI `ToolSpec` shape the contract requires on the wire.
49
+ const tools = toolDecls.map((t) => ({
50
+ type: 'function',
51
+ function: { name: t.name, description: t.description, parameters: t.parameters },
52
+ }));
35
53
  const chatRequest = {
36
54
  messages,
37
- tools: toolDecls,
38
- toolUseEnabled: toolDecls.length > 0 && input.llm.supportsTools,
55
+ tools,
56
+ toolUseEnabled: tools.length > 0 && input.llm.supportsTools,
39
57
  };
40
58
  // Emit the trace BEFORE dispatch. Captures the request as the
41
59
  // strategy assembled it — agent-layer view, not provider-
@@ -43,12 +61,13 @@ export function createReactLoopStrategy(options = {}) {
43
61
  // when the session passed a `turnId`; otherwise we synthesize
44
62
  // a per-iteration id so the trace stays consistent for
45
63
  // standalone strategy callers (CLI, eval harness).
64
+ const turnIdForReq = input.turnId ?? 'turn-anon';
65
+ const requestId = `${turnIdForReq}#${turn}`;
46
66
  if (input.tracer) {
47
- const turnIdForReq = input.turnId ?? 'turn-anon';
48
67
  input.tracer.emit({
49
68
  kind: 'llm_request',
50
69
  data: {
51
- requestId: `${turnIdForReq}#${turn}`,
70
+ requestId,
52
71
  turnId: turnIdForReq,
53
72
  iteration: turn,
54
73
  ts: Date.now(),
@@ -65,16 +84,22 @@ export function createReactLoopStrategy(options = {}) {
65
84
  }
66
85
  const pendingToolCalls = [];
67
86
  let turnUsage;
68
- let turnDetails;
87
+ // The model stream no longer carries provider details; the
88
+ // turn's `details` is synthesized locally from the client id.
89
+ const turnDetails = { requestedModel: input.llm.id };
69
90
  let assistantText = '';
70
- // Stream the model's reply.
91
+ let assistantThinking = '';
92
+ // Stream the model's reply. The turn ends when this iterable
93
+ // returns; the final accounting arrives as a `usage` event
94
+ // shortly before that — there is no separate terminal event.
71
95
  for await (const ev of input.llm.chat(chatRequest, signal)) {
72
96
  if (ev.kind === 'text') {
73
- assistantText += ev.chunk;
74
- yield { kind: 'text', chunk: ev.chunk };
97
+ assistantText += ev.text;
98
+ yield { kind: 'text', chunk: ev.text };
75
99
  }
76
100
  else if (ev.kind === 'thinking') {
77
- yield { kind: 'thinking', chunk: ev.chunk };
101
+ assistantThinking += ev.text;
102
+ yield { kind: 'thinking', chunk: ev.text };
78
103
  }
79
104
  else if (ev.kind === 'tool_call') {
80
105
  pendingToolCalls.push({
@@ -91,46 +116,303 @@ export function createReactLoopStrategy(options = {}) {
91
116
  ...(ev.signature ? { signature: ev.signature } : {}),
92
117
  };
93
118
  }
94
- else if (ev.kind === 'turn_complete') {
119
+ else if (ev.kind === 'usage') {
95
120
  turnUsage = ev.usage;
96
- turnDetails = ev.details;
97
121
  }
98
122
  else if (ev.kind === 'error') {
99
123
  yield { kind: 'error', message: ev.message };
100
124
  return;
101
125
  }
102
126
  }
103
- // No tool calls final assistant turn, emit turn_complete + done.
127
+ // Pair with the `llm_request` emitted above. Captures the
128
+ // moment the chat() iterator drained — the closing endpoint
129
+ // of this iteration's language-model wall-clock segment.
130
+ if (input.tracer) {
131
+ input.tracer.emit({
132
+ kind: 'llm_response',
133
+ data: {
134
+ requestId,
135
+ ts: Date.now(),
136
+ text: assistantText,
137
+ thinking: assistantThinking,
138
+ toolCalls: pendingToolCalls.map((tc) => ({
139
+ id: tc.id,
140
+ name: tc.name,
141
+ args: tc.args,
142
+ ...(tc.signature ? { signature: tc.signature } : {}),
143
+ })),
144
+ ...(turnUsage
145
+ ? {
146
+ usage: {
147
+ promptTokens: turnUsage.promptTokens,
148
+ outputTokens: turnUsage.outputTokens,
149
+ ...(turnUsage.cachedTokens !== undefined
150
+ ? { cachedTokens: turnUsage.cachedTokens }
151
+ : {}),
152
+ },
153
+ }
154
+ : {}),
155
+ },
156
+ });
157
+ }
158
+ // No tool calls → final assistant turn. Without reflexion we
159
+ // emit turn_complete and return immediately. With reflexion
160
+ // enabled we issue a critique call against the model, parse a
161
+ // verdict, and either return (ok / exhausted) or inject the
162
+ // critique feedback as a synthetic user message and loop into
163
+ // a fresh ReAct iteration.
104
164
  if (pendingToolCalls.length === 0) {
105
- if (turnUsage && turnDetails) {
165
+ if (!reflexionEnabled) {
166
+ if (turnUsage) {
167
+ yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
168
+ }
169
+ return;
170
+ }
171
+ // Append the candidate final-answer assistant turn to the
172
+ // conversation so the critique call (and any retry) sees it.
173
+ // We only do this when reflexion is enabled — the
174
+ // pre-reflexion path returns without ever appending the
175
+ // final assistant turn, and we must not change that byte for
176
+ // byte when reflexion is disabled.
177
+ messages.push({ role: 'assistant', text: assistantText });
178
+ const critiqueMessages = [
179
+ { role: 'system', text: critiqueSystemPrompt },
180
+ // Skip the original system prompt — the critique system
181
+ // prompt replaces it. Everything else (history + user
182
+ // prompt + assistant turns + tool results) is included so
183
+ // the critic can evaluate the reply in context.
184
+ ...messages.filter((m) => m.role !== 'system'),
185
+ {
186
+ role: 'user',
187
+ text: "Evaluate the assistant's most recent reply. Reply with the JSON verdict only.",
188
+ },
189
+ ];
190
+ const critiqueRequest = {
191
+ messages: critiqueMessages,
192
+ tools: [],
193
+ toolUseEnabled: false,
194
+ };
195
+ const critiqueRequestId = `${requestId}#critique`;
196
+ if (input.tracer) {
197
+ input.tracer.emit({
198
+ kind: 'llm_request',
199
+ data: {
200
+ requestId: critiqueRequestId,
201
+ turnId: turnIdForReq,
202
+ iteration: turn,
203
+ ts: Date.now(),
204
+ systemPrompt: critiqueSystemPrompt,
205
+ messages: critiqueMessages.map((m) => ({ ...m })),
206
+ tools: [],
207
+ llm: { id: input.llm.id, supportsTools: input.llm.supportsTools },
208
+ },
209
+ });
210
+ }
211
+ let critiqueText = '';
212
+ let critiqueUsage;
213
+ for await (const ev of input.llm.chat(critiqueRequest, signal)) {
214
+ if (ev.kind === 'text') {
215
+ critiqueText += ev.text;
216
+ }
217
+ else if (ev.kind === 'usage') {
218
+ critiqueUsage = ev.usage;
219
+ }
220
+ else if (ev.kind === 'error') {
221
+ // Critique errored — fail open, return the candidate
222
+ // final-answer turn as-is. Never block completion on a
223
+ // critique failure.
224
+ if (input.tracer) {
225
+ input.tracer.emit({
226
+ kind: 'llm_response',
227
+ data: {
228
+ requestId: critiqueRequestId,
229
+ ts: Date.now(),
230
+ text: critiqueText,
231
+ thinking: '',
232
+ toolCalls: [],
233
+ },
234
+ });
235
+ }
236
+ if (turnUsage) {
237
+ yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
238
+ }
239
+ return;
240
+ }
241
+ // Tool calls / thinking events on the critique call are
242
+ // ignored — the critique request sets toolUseEnabled:false
243
+ // and asks for a JSON reply, so a well-behaved stub never
244
+ // emits them. Real providers may still stream thinking;
245
+ // we do not surface it to the caller.
246
+ }
247
+ if (input.tracer) {
248
+ input.tracer.emit({
249
+ kind: 'llm_response',
250
+ data: {
251
+ requestId: critiqueRequestId,
252
+ ts: Date.now(),
253
+ text: critiqueText,
254
+ thinking: '',
255
+ toolCalls: [],
256
+ ...(critiqueUsage
257
+ ? {
258
+ usage: {
259
+ promptTokens: critiqueUsage.promptTokens,
260
+ outputTokens: critiqueUsage.outputTokens,
261
+ ...(critiqueUsage.cachedTokens !== undefined
262
+ ? { cachedTokens: critiqueUsage.cachedTokens }
263
+ : {}),
264
+ },
265
+ }
266
+ : {}),
267
+ },
268
+ });
269
+ }
270
+ const verdict = parseCritiqueVerdict(critiqueText);
271
+ if (verdict.ok) {
272
+ yield {
273
+ kind: 'custom',
274
+ name: 'reflexion_critique',
275
+ data: { verdict: 'ok', text: critiqueText },
276
+ };
277
+ if (turnUsage) {
278
+ yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
279
+ }
280
+ return;
281
+ }
282
+ if (reflexionRetriesRemaining <= 0) {
283
+ yield {
284
+ kind: 'custom',
285
+ name: 'reflexion_critique',
286
+ data: {
287
+ verdict: 'exhausted',
288
+ text: critiqueText,
289
+ ...(verdict.feedback ? { feedback: verdict.feedback } : {}),
290
+ },
291
+ };
292
+ if (turnUsage) {
293
+ yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
294
+ }
295
+ return;
296
+ }
297
+ yield {
298
+ kind: 'custom',
299
+ name: 'reflexion_critique',
300
+ data: {
301
+ verdict: 'retry',
302
+ text: critiqueText,
303
+ ...(verdict.feedback ? { feedback: verdict.feedback } : {}),
304
+ },
305
+ };
306
+ if (turnUsage) {
106
307
  yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
107
308
  }
108
- return;
309
+ const feedback = verdict.feedback ?? 'Your previous response needs revision.';
310
+ messages.push({
311
+ role: 'user',
312
+ text: `Reviewer feedback: ${feedback}. Please revise your response.`,
313
+ });
314
+ reflexionRetriesRemaining -= 1;
315
+ continue;
109
316
  }
110
317
  // Tool calls → run each, append result message, loop.
111
318
  messages.push({
112
319
  role: 'assistant',
113
320
  text: assistantText,
114
321
  toolCalls: pendingToolCalls.map((tc) => ({
115
- callId: tc.id,
322
+ id: tc.id,
116
323
  name: tc.name,
117
324
  args: tc.args,
118
325
  ...(tc.signature ? { signature: tc.signature } : {}),
119
326
  })),
120
327
  });
121
- for (const call of pendingToolCalls) {
122
- const result = await input.tools.execute({ id: call.id, name: call.name, args: call.args }, input.toolContext());
123
- yield { kind: 'tool_result', id: call.id, result };
124
- messages.push({
125
- role: 'tool',
126
- callId: call.id,
127
- name: call.name,
128
- resultJson: JSON.stringify(safeSerializable(result)),
129
- text: '',
328
+ if (parallelDispatch) {
329
+ // Resolve each call's handler so we can ask `isParallelSafe`.
330
+ // Missing handler (defensive — shouldn't happen) treated as
331
+ // not parallel-safe, so it falls into the sequential group.
332
+ const handlersByName = new Map();
333
+ for (const h of input.toolList)
334
+ handlersByName.set(h.name, h);
335
+ const parallelIndices = [];
336
+ const sequentialIndices = [];
337
+ for (let i = 0; i < pendingToolCalls.length; i++) {
338
+ const c = pendingToolCalls[i];
339
+ const h = handlersByName.get(c.name);
340
+ if (h && isParallelSafe(h))
341
+ parallelIndices.push(i);
342
+ else
343
+ sequentialIndices.push(i);
344
+ }
345
+ // Pre-allocate result slots so even when the parallel group
346
+ // settles out of order, we yield + push messages in the
347
+ // original input order. The trace and next-turn prompt must
348
+ // be identical to the sequential mode — only wall-clock
349
+ // differs.
350
+ const results = new Array(pendingToolCalls.length);
351
+ // Parallel-safe group: run concurrently. Handler errors are
352
+ // already normalised into `{ ok: false }` results by the
353
+ // dispatch layer, so Promise.all never rejects in practice.
354
+ if (parallelIndices.length > 0) {
355
+ await Promise.all(parallelIndices.map(async (i) => {
356
+ const call = pendingToolCalls[i];
357
+ results[i] = await input.tools.execute({ id: call.id, name: call.name, args: call.args }, input.toolContext());
358
+ }));
359
+ }
360
+ // Mutation group: still sequential, in original relative order.
361
+ for (const i of sequentialIndices) {
362
+ if (signal.aborted) {
363
+ yield { kind: 'error', message: 'aborted' };
364
+ return;
365
+ }
366
+ const call = pendingToolCalls[i];
367
+ results[i] = await input.tools.execute({ id: call.id, name: call.name, args: call.args }, input.toolContext());
368
+ }
369
+ // Yield + append in original input order.
370
+ for (let i = 0; i < pendingToolCalls.length; i++) {
371
+ const call = pendingToolCalls[i];
372
+ const result = results[i];
373
+ yield { kind: 'tool_result', id: call.id, result };
374
+ messages.push({
375
+ role: 'tool',
376
+ toolCallId: call.id,
377
+ name: call.name,
378
+ resultJson: JSON.stringify(safeSerializable(result)),
379
+ text: '',
380
+ });
381
+ }
382
+ }
383
+ else {
384
+ // Default behavior: byte-for-byte identical to the pre-change
385
+ // sequential loop — dispatch, yield, push, in order, one at a
386
+ // time.
387
+ for (const call of pendingToolCalls) {
388
+ const result = await input.tools.execute({ id: call.id, name: call.name, args: call.args }, input.toolContext());
389
+ yield { kind: 'tool_result', id: call.id, result };
390
+ messages.push({
391
+ role: 'tool',
392
+ toolCallId: call.id,
393
+ name: call.name,
394
+ resultJson: JSON.stringify(safeSerializable(result)),
395
+ text: '',
396
+ });
397
+ }
398
+ }
399
+ // Close the tool-dispatch segment for this iteration. Pair
400
+ // with the `llm_response` emitted above; `ts` delta is the
401
+ // dispatch wall-clock the eval harness consumes.
402
+ if (input.tracer) {
403
+ input.tracer.emit({
404
+ kind: 'turn_dispatch_complete',
405
+ data: {
406
+ requestId,
407
+ turnId: turnIdForReq,
408
+ iteration: turn,
409
+ ts: Date.now(),
410
+ toolCallCount: pendingToolCalls.length,
411
+ },
130
412
  });
131
413
  }
132
414
  // Loop to next turn.
133
- if (turnUsage && turnDetails) {
415
+ if (turnUsage) {
134
416
  yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
135
417
  }
136
418
  }
@@ -149,7 +431,7 @@ function buildMessages(input) {
149
431
  continue; // already emitted
150
432
  if (m.role === 'assistant') {
151
433
  const tc = m.toolCalls?.map((c) => ({
152
- callId: c.id,
434
+ id: c.id,
153
435
  name: c.name,
154
436
  args: safeParse(c.argsJson),
155
437
  ...(c.signature ? { signature: c.signature } : {}),
@@ -163,7 +445,7 @@ function buildMessages(input) {
163
445
  if (c.resultJson !== undefined) {
164
446
  out.push({
165
447
  role: 'tool',
166
- callId: c.id,
448
+ toolCallId: c.id,
167
449
  name: c.name,
168
450
  resultJson: c.resultJson,
169
451
  text: '',
@@ -197,4 +479,52 @@ function safeSerializable(value) {
197
479
  return { ok: value.ok, summary: value.summary };
198
480
  }
199
481
  }
482
+ /**
483
+ * Extract the reflexion verdict from a critique LLM reply. Returns
484
+ * `{ ok: true }` on any parse failure (fail-open: the strategy must
485
+ * not block completion on a malformed critique). Handles three shapes
486
+ * the model commonly emits:
487
+ *
488
+ * - a bare JSON object: `{"ok": false, "feedback": "..."}`
489
+ * - a JSON object inside a ```json fenced code block
490
+ * - a JSON object embedded in prose; we regex-extract the first
491
+ * `{...}` substring and try to parse it
492
+ *
493
+ * Anything else — no braces, broken JSON, JSON missing the `ok`
494
+ * field — falls open.
495
+ */
496
+ function parseCritiqueVerdict(text) {
497
+ if (!text || typeof text !== 'string')
498
+ return { ok: true };
499
+ // Strip ```json ... ``` fences (and bare ``` fences) before regex
500
+ // hunting for the JSON object. Models often wrap the verdict in a
501
+ // fence even when asked not to.
502
+ let candidate = text.trim();
503
+ const fenceMatch = candidate.match(/```(?:json)?\s*([\s\S]*?)```/i);
504
+ if (fenceMatch?.[1]) {
505
+ candidate = fenceMatch[1].trim();
506
+ }
507
+ // Greedy match: take everything from the first `{` to the last `}`
508
+ // so nested braces survive. JSON.parse will reject malformed input.
509
+ const objectMatch = candidate.match(/\{[\s\S]*\}/);
510
+ if (!objectMatch)
511
+ return { ok: true };
512
+ let parsed;
513
+ try {
514
+ parsed = JSON.parse(objectMatch[0]);
515
+ }
516
+ catch {
517
+ return { ok: true };
518
+ }
519
+ if (!parsed || typeof parsed !== 'object')
520
+ return { ok: true };
521
+ const obj = parsed;
522
+ if (typeof obj.ok !== 'boolean')
523
+ return { ok: true };
524
+ const out = { ok: obj.ok };
525
+ if (typeof obj.feedback === 'string' && obj.feedback.length > 0) {
526
+ out.feedback = obj.feedback;
527
+ }
528
+ return out;
529
+ }
200
530
  //# sourceMappingURL=strategy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"strategy.js","sourceRoot":"","sources":["../src/strategy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"strategy.js","sourceRoot":"","sources":["../src/strategy.ts"],"names":[],"mappings":"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"}
package/dist/tools.d.ts CHANGED
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * Both are pure-TS — no React, no stores, no localStorage.
12
12
  */
13
- import type { ToolDispatch, ToolRegistry } from './types/tools.js';
13
+ import type { ToolDispatch, ToolHandler, ToolRegistry } from './types/tools.js';
14
14
  export declare function createToolRegistry(): ToolRegistry;
15
15
  /**
16
16
  * Create a stateless dispatcher over a registry. The dispatcher
@@ -23,4 +23,18 @@ export declare function createToolRegistry(): ToolRegistry;
23
23
  * stringified into the summary.
24
24
  */
25
25
  export declare function createDispatch(registry: ToolRegistry): ToolDispatch;
26
+ /**
27
+ * Read `handler.parallelSafe` with the conservative default. The default
28
+ * when the field is absent or `false` is `false` — callers must opt in
29
+ * explicitly. Centralised so parallel-dispatch and any future scheduler
30
+ * apply the same rule.
31
+ */
32
+ export declare function isParallelSafe(handler: ToolHandler): boolean;
33
+ /**
34
+ * Read `handler.pure` with the conservative default. The default when
35
+ * the field is absent or `false` is `false` — callers must opt in. The
36
+ * memoization layer reads this through here so a future change to the
37
+ * default (not in this branch) lands in a single spot.
38
+ */
39
+ export declare function isPure(handler: ToolHandler): boolean;
26
40
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAGV,YAAY,EAEZ,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAE1B,wBAAgB,kBAAkB,IAAI,YAAY,CA8DjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,CA0BnE"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAGV,YAAY,EACZ,WAAW,EACX,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAE1B,wBAAgB,kBAAkB,IAAI,YAAY,CA8DjD;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,CA0BnE;AAgBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAEpD"}
package/dist/tools.js CHANGED
@@ -122,6 +122,24 @@ function findByName(registry, name) {
122
122
  const all = registry.list();
123
123
  return all.find((h) => h.name === name);
124
124
  }
125
+ /**
126
+ * Read `handler.parallelSafe` with the conservative default. The default
127
+ * when the field is absent or `false` is `false` — callers must opt in
128
+ * explicitly. Centralised so parallel-dispatch and any future scheduler
129
+ * apply the same rule.
130
+ */
131
+ export function isParallelSafe(handler) {
132
+ return handler.parallelSafe === true;
133
+ }
134
+ /**
135
+ * Read `handler.pure` with the conservative default. The default when
136
+ * the field is absent or `false` is `false` — callers must opt in. The
137
+ * memoization layer reads this through here so a future change to the
138
+ * default (not in this branch) lands in a single spot.
139
+ */
140
+ export function isPure(handler) {
141
+ return handler.pure === true;
142
+ }
125
143
  /** Trim a string to `max` chars with an ellipsis marker. */
126
144
  function truncate(s, max) {
127
145
  return s.length <= max ? s : `${s.slice(0, max)}…`;