@inbrowser/agent 0.0.0-placeholder → 0.2.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.
- package/AGENTS.md +270 -0
- package/LICENSE +21 -0
- package/README.md +117 -2
- package/bin/agent.ts +10 -0
- package/dist/cli/commands/describe.d.ts +14 -0
- package/dist/cli/commands/describe.d.ts.map +1 -0
- package/dist/cli/commands/describe.js +179 -0
- package/dist/cli/commands/describe.js.map +1 -0
- package/dist/cli/commands/events.d.ts +21 -0
- package/dist/cli/commands/events.d.ts.map +1 -0
- package/dist/cli/commands/events.js +59 -0
- package/dist/cli/commands/events.js.map +1 -0
- package/dist/cli/commands/fleet.d.ts +15 -0
- package/dist/cli/commands/fleet.d.ts.map +1 -0
- package/dist/cli/commands/fleet.js +149 -0
- package/dist/cli/commands/fleet.js.map +1 -0
- package/dist/cli/commands/help.d.ts +15 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +93 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +27 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +109 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/run.d.ts +38 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +535 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/schema.d.ts +8 -0
- package/dist/cli/commands/schema.d.ts.map +1 -0
- package/dist/cli/commands/schema.js +12 -0
- package/dist/cli/commands/schema.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +39 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +65 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/undo.d.ts +36 -0
- package/dist/cli/commands/undo.d.ts.map +1 -0
- package/dist/cli/commands/undo.js +132 -0
- package/dist/cli/commands/undo.js.map +1 -0
- package/dist/cli/fixtures.d.ts +17 -0
- package/dist/cli/fixtures.d.ts.map +1 -0
- package/dist/cli/fixtures.js +107 -0
- package/dist/cli/fixtures.js.map +1 -0
- package/dist/cli/hardening.d.ts +39 -0
- package/dist/cli/hardening.d.ts.map +1 -0
- package/dist/cli/hardening.js +68 -0
- package/dist/cli/hardening.js.map +1 -0
- package/dist/cli/index.d.ts +28 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/llm/openrouter.d.ts +33 -0
- package/dist/cli/llm/openrouter.d.ts.map +1 -0
- package/dist/cli/llm/openrouter.js +285 -0
- package/dist/cli/llm/openrouter.js.map +1 -0
- package/dist/cli/main.d.ts +32 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +106 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.d.ts +36 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +95 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/parse.d.ts +26 -0
- package/dist/cli/parse.d.ts.map +1 -0
- package/dist/cli/parse.js +160 -0
- package/dist/cli/parse.js.map +1 -0
- package/dist/cli/session-log.d.ts +34 -0
- package/dist/cli/session-log.d.ts.map +1 -0
- package/dist/cli/session-log.js +52 -0
- package/dist/cli/session-log.js.map +1 -0
- package/dist/cli/spec.d.ts +62 -0
- package/dist/cli/spec.d.ts.map +1 -0
- package/dist/cli/spec.js +510 -0
- package/dist/cli/spec.js.map +1 -0
- package/dist/cli/ui/RunView.d.ts +134 -0
- package/dist/cli/ui/RunView.d.ts.map +1 -0
- package/dist/cli/ui/RunView.js +341 -0
- package/dist/cli/ui/RunView.js.map +1 -0
- package/dist/diagnostics/index.d.ts +5 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +3 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/diagnostics/timing.d.ts +48 -0
- package/dist/diagnostics/timing.d.ts.map +1 -0
- package/dist/diagnostics/timing.js +85 -0
- package/dist/diagnostics/timing.js.map +1 -0
- package/dist/diagnostics/truthfulness.d.ts +36 -0
- package/dist/diagnostics/truthfulness.d.ts.map +1 -0
- package/dist/diagnostics/truthfulness.js +180 -0
- package/dist/diagnostics/truthfulness.js.map +1 -0
- package/dist/dispatch-memoization.d.ts +84 -0
- package/dist/dispatch-memoization.d.ts.map +1 -0
- package/dist/dispatch-memoization.js +197 -0
- package/dist/dispatch-memoization.js.map +1 -0
- package/dist/eval/comparison-report.d.ts +164 -0
- package/dist/eval/comparison-report.d.ts.map +1 -0
- package/dist/eval/comparison-report.js +316 -0
- package/dist/eval/comparison-report.js.map +1 -0
- package/dist/eval/fixture.d.ts +74 -0
- package/dist/eval/fixture.d.ts.map +1 -0
- package/dist/eval/fixture.js +217 -0
- package/dist/eval/fixture.js.map +1 -0
- package/dist/eval/index.d.ts +13 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +7 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/load-node.d.ts +16 -0
- package/dist/eval/load-node.d.ts.map +1 -0
- package/dist/eval/load-node.js +58 -0
- package/dist/eval/load-node.js.map +1 -0
- package/dist/eval/metric-collector.d.ts +209 -0
- package/dist/eval/metric-collector.d.ts.map +1 -0
- package/dist/eval/metric-collector.js +293 -0
- package/dist/eval/metric-collector.js.map +1 -0
- package/dist/eval/run-record.d.ts +76 -0
- package/dist/eval/run-record.d.ts.map +1 -0
- package/dist/eval/run-record.js +32 -0
- package/dist/eval/run-record.js.map +1 -0
- package/dist/eval/runner.d.ts +140 -0
- package/dist/eval/runner.d.ts.map +1 -0
- package/dist/eval/runner.js +310 -0
- package/dist/eval/runner.js.map +1 -0
- package/dist/eval/spec-framework.d.ts +113 -0
- package/dist/eval/spec-framework.d.ts.map +1 -0
- package/dist/eval/spec-framework.js +100 -0
- package/dist/eval/spec-framework.js.map +1 -0
- package/dist/eval/spec-helpers.d.ts +245 -0
- package/dist/eval/spec-helpers.d.ts.map +1 -0
- package/dist/eval/spec-helpers.js +605 -0
- package/dist/eval/spec-helpers.js.map +1 -0
- package/dist/events/codec.d.ts +79 -0
- package/dist/events/codec.d.ts.map +1 -0
- package/dist/events/codec.js +142 -0
- package/dist/events/codec.js.map +1 -0
- package/dist/events/log-core.d.ts +76 -0
- package/dist/events/log-core.d.ts.map +1 -0
- package/dist/events/log-core.js +73 -0
- package/dist/events/log-core.js.map +1 -0
- package/dist/events/log.d.ts +60 -0
- package/dist/events/log.d.ts.map +1 -0
- package/dist/events/log.js +193 -0
- package/dist/events/log.js.map +1 -0
- package/dist/events/replay.d.ts +106 -0
- package/dist/events/replay.d.ts.map +1 -0
- package/dist/events/replay.js +137 -0
- package/dist/events/replay.js.map +1 -0
- package/dist/events/wrap.d.ts +100 -0
- package/dist/events/wrap.d.ts.map +1 -0
- package/dist/events/wrap.js +141 -0
- package/dist/events/wrap.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-adapter.d.ts +96 -0
- package/dist/llm-adapter.d.ts.map +1 -0
- package/dist/llm-adapter.js +132 -0
- package/dist/llm-adapter.js.map +1 -0
- package/dist/mcp/serve.d.ts +70 -0
- package/dist/mcp/serve.d.ts.map +1 -0
- package/dist/mcp/serve.js +154 -0
- package/dist/mcp/serve.js.map +1 -0
- package/dist/metrics/runs.d.ts +58 -0
- package/dist/metrics/runs.d.ts.map +1 -0
- package/dist/metrics/runs.js +99 -0
- package/dist/metrics/runs.js.map +1 -0
- package/dist/metrics.d.ts +38 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +123 -0
- package/dist/metrics.js.map +1 -0
- package/dist/node.d.ts +23 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +23 -0
- package/dist/node.js.map +1 -0
- package/dist/planner-executor.d.ts +132 -0
- package/dist/planner-executor.d.ts.map +1 -0
- package/dist/planner-executor.js +274 -0
- package/dist/planner-executor.js.map +1 -0
- package/dist/session.d.ts +10 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +179 -0
- package/dist/session.js.map +1 -0
- package/dist/skill-catalog.d.ts +81 -0
- package/dist/skill-catalog.d.ts.map +1 -0
- package/dist/skill-catalog.js +388 -0
- package/dist/skill-catalog.js.map +1 -0
- package/dist/skill-router.d.ts +95 -0
- package/dist/skill-router.d.ts.map +1 -0
- package/dist/skill-router.js +130 -0
- package/dist/skill-router.js.map +1 -0
- package/dist/storage.d.ts +14 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +58 -0
- package/dist/storage.js.map +1 -0
- package/dist/strategy.d.ts +45 -0
- package/dist/strategy.d.ts.map +1 -0
- package/dist/strategy.js +520 -0
- package/dist/strategy.js.map +1 -0
- package/dist/tools.d.ts +40 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +147 -0
- package/dist/tools.js.map +1 -0
- package/dist/types/agent.d.ts +94 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +17 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/capabilities.d.ts +17 -0
- package/dist/types/capabilities.d.ts.map +1 -0
- package/dist/types/capabilities.js +13 -0
- package/dist/types/capabilities.js.map +1 -0
- package/dist/types/chat.d.ts +74 -0
- package/dist/types/chat.d.ts.map +1 -0
- package/dist/types/chat.js +10 -0
- package/dist/types/chat.js.map +1 -0
- package/dist/types/events.d.ts +115 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +30 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/llm.d.ts +89 -0
- package/dist/types/llm.d.ts.map +1 -0
- package/dist/types/llm.js +12 -0
- package/dist/types/llm.js.map +1 -0
- package/dist/types/metrics.d.ts +34 -0
- package/dist/types/metrics.d.ts.map +1 -0
- package/dist/types/metrics.js +10 -0
- package/dist/types/metrics.js.map +1 -0
- package/dist/types/observer.d.ts +41 -0
- package/dist/types/observer.d.ts.map +1 -0
- package/dist/types/observer.js +41 -0
- package/dist/types/observer.js.map +1 -0
- package/dist/types/project-context.d.ts +18 -0
- package/dist/types/project-context.d.ts.map +1 -0
- package/dist/types/project-context.js +11 -0
- package/dist/types/project-context.js.map +1 -0
- package/dist/types/runtime.d.ts +71 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +21 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/session.d.ts +103 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +11 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/storage.d.ts +20 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +41 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/types/strategy.d.ts +124 -0
- package/dist/types/strategy.d.ts.map +1 -0
- package/dist/types/strategy.js +10 -0
- package/dist/types/strategy.js.map +1 -0
- package/dist/types/tools.d.ts +154 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +11 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/types/trace.d.ts +175 -0
- package/dist/types/trace.d.ts.map +1 -0
- package/dist/types/trace.js +26 -0
- package/dist/types/trace.js.map +1 -0
- package/dist/types/workspace.d.ts +29 -0
- package/dist/types/workspace.d.ts.map +1 -0
- package/dist/types/workspace.js +18 -0
- package/dist/types/workspace.js.map +1 -0
- package/package.json +45 -14
- package/skills/agent-cli.md +218 -0
- package/index.js +0 -2
package/dist/strategy.js
ADDED
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createReactLoopStrategy()` — the default `AgentStrategy`.
|
|
3
|
+
*
|
|
4
|
+
* Implements the playground's current ReAct-style behavior:
|
|
5
|
+
*
|
|
6
|
+
* 1. Compose `[system, ...history, user(prompt)]` as the message
|
|
7
|
+
* array.
|
|
8
|
+
* 2. Issue one chat call against the LLM with the tool list.
|
|
9
|
+
* 3. Stream `text` / `thinking` / `tool_call` events through.
|
|
10
|
+
* 4. When the LLM produces tool calls, dispatch each one, append
|
|
11
|
+
* the result message, and loop back to step 2.
|
|
12
|
+
* 5. When the LLM produces no tool calls in a turn, emit
|
|
13
|
+
* `turn_complete` and finish.
|
|
14
|
+
*
|
|
15
|
+
* Future strategies (planner-executor, graph-of-thoughts,
|
|
16
|
+
* parallel-branch ensembling) sit alongside this one — same
|
|
17
|
+
* `AgentStrategy` interface, different control flow.
|
|
18
|
+
*/
|
|
19
|
+
import { isParallelSafe } from './tools.js';
|
|
20
|
+
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.';
|
|
21
|
+
export function createReactLoopStrategy(options = {}) {
|
|
22
|
+
const maxTurns = options.maxTurns ?? 24;
|
|
23
|
+
const parallelDispatch = options.parallelDispatch === true;
|
|
24
|
+
const reflexionEnabled = options.reflexion?.enabled === true;
|
|
25
|
+
const reflexionMaxRetries = Math.max(0, options.reflexion?.maxRetries ?? 1);
|
|
26
|
+
const critiqueSystemPrompt = options.reflexion?.critiqueSystemPrompt ?? DEFAULT_CRITIQUE_SYSTEM_PROMPT;
|
|
27
|
+
return {
|
|
28
|
+
id: 'react-loop',
|
|
29
|
+
async *run(input, signal) {
|
|
30
|
+
const messages = buildMessages(input);
|
|
31
|
+
// Per-call retry budget for the critique-and-retry pass. Only
|
|
32
|
+
// consulted when `reflexionEnabled` is true; otherwise the
|
|
33
|
+
// critique branch is skipped entirely and the strategy returns
|
|
34
|
+
// on the first no-tool-calls turn exactly as before.
|
|
35
|
+
let reflexionRetriesRemaining = reflexionMaxRetries;
|
|
36
|
+
for (let turn = 0; turn < maxTurns; turn++) {
|
|
37
|
+
if (signal.aborted) {
|
|
38
|
+
yield { kind: 'error', message: 'aborted' };
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const toolDecls = input.toolList.map((h) => ({
|
|
42
|
+
name: h.name,
|
|
43
|
+
description: h.description,
|
|
44
|
+
parameters: h.parameters,
|
|
45
|
+
}));
|
|
46
|
+
const chatRequest = {
|
|
47
|
+
messages,
|
|
48
|
+
tools: toolDecls,
|
|
49
|
+
toolUseEnabled: toolDecls.length > 0 && input.llm.supportsTools,
|
|
50
|
+
};
|
|
51
|
+
// Emit the trace BEFORE dispatch. Captures the request as the
|
|
52
|
+
// strategy assembled it — agent-layer view, not provider-
|
|
53
|
+
// specific. The `requestId` is `${turnId}#${iteration}`
|
|
54
|
+
// when the session passed a `turnId`; otherwise we synthesize
|
|
55
|
+
// a per-iteration id so the trace stays consistent for
|
|
56
|
+
// standalone strategy callers (CLI, eval harness).
|
|
57
|
+
const turnIdForReq = input.turnId ?? 'turn-anon';
|
|
58
|
+
const requestId = `${turnIdForReq}#${turn}`;
|
|
59
|
+
if (input.tracer) {
|
|
60
|
+
input.tracer.emit({
|
|
61
|
+
kind: 'llm_request',
|
|
62
|
+
data: {
|
|
63
|
+
requestId,
|
|
64
|
+
turnId: turnIdForReq,
|
|
65
|
+
iteration: turn,
|
|
66
|
+
ts: Date.now(),
|
|
67
|
+
systemPrompt: input.systemPrompt,
|
|
68
|
+
// Shallow-clone arrays to detach the captured view from
|
|
69
|
+
// the in-loop `messages` array that grows under our
|
|
70
|
+
// feet on each ReAct iteration. Each iteration's trace
|
|
71
|
+
// must reflect the messages AS-SENT at that iteration.
|
|
72
|
+
messages: messages.map((m) => ({ ...m })),
|
|
73
|
+
tools: toolDecls.map((t) => ({ ...t })),
|
|
74
|
+
llm: { id: input.llm.id, supportsTools: input.llm.supportsTools },
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const pendingToolCalls = [];
|
|
79
|
+
let turnUsage;
|
|
80
|
+
let turnDetails;
|
|
81
|
+
let assistantText = '';
|
|
82
|
+
let assistantThinking = '';
|
|
83
|
+
// Stream the model's reply.
|
|
84
|
+
for await (const ev of input.llm.chat(chatRequest, signal)) {
|
|
85
|
+
if (ev.kind === 'text') {
|
|
86
|
+
assistantText += ev.chunk;
|
|
87
|
+
yield { kind: 'text', chunk: ev.chunk };
|
|
88
|
+
}
|
|
89
|
+
else if (ev.kind === 'thinking') {
|
|
90
|
+
assistantThinking += ev.chunk;
|
|
91
|
+
yield { kind: 'thinking', chunk: ev.chunk };
|
|
92
|
+
}
|
|
93
|
+
else if (ev.kind === 'tool_call') {
|
|
94
|
+
pendingToolCalls.push({
|
|
95
|
+
id: ev.id,
|
|
96
|
+
name: ev.name,
|
|
97
|
+
args: ev.args,
|
|
98
|
+
...(ev.signature ? { signature: ev.signature } : {}),
|
|
99
|
+
});
|
|
100
|
+
yield {
|
|
101
|
+
kind: 'tool_call',
|
|
102
|
+
id: ev.id,
|
|
103
|
+
name: ev.name,
|
|
104
|
+
args: ev.args,
|
|
105
|
+
...(ev.signature ? { signature: ev.signature } : {}),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
else if (ev.kind === 'turn_complete') {
|
|
109
|
+
turnUsage = ev.usage;
|
|
110
|
+
turnDetails = ev.details;
|
|
111
|
+
}
|
|
112
|
+
else if (ev.kind === 'error') {
|
|
113
|
+
yield { kind: 'error', message: ev.message };
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Pair with the `llm_request` emitted above. Captures the
|
|
118
|
+
// moment the chat() iterator drained — the closing endpoint
|
|
119
|
+
// of this iteration's language-model wall-clock segment.
|
|
120
|
+
if (input.tracer) {
|
|
121
|
+
input.tracer.emit({
|
|
122
|
+
kind: 'llm_response',
|
|
123
|
+
data: {
|
|
124
|
+
requestId,
|
|
125
|
+
ts: Date.now(),
|
|
126
|
+
text: assistantText,
|
|
127
|
+
thinking: assistantThinking,
|
|
128
|
+
toolCalls: pendingToolCalls.map((tc) => ({
|
|
129
|
+
id: tc.id,
|
|
130
|
+
name: tc.name,
|
|
131
|
+
args: tc.args,
|
|
132
|
+
...(tc.signature ? { signature: tc.signature } : {}),
|
|
133
|
+
})),
|
|
134
|
+
...(turnUsage
|
|
135
|
+
? {
|
|
136
|
+
usage: {
|
|
137
|
+
promptTokens: turnUsage.promptTokens,
|
|
138
|
+
outputTokens: turnUsage.completionTokens,
|
|
139
|
+
...(turnUsage.cachedTokens !== undefined
|
|
140
|
+
? { cachedTokens: turnUsage.cachedTokens }
|
|
141
|
+
: {}),
|
|
142
|
+
},
|
|
143
|
+
}
|
|
144
|
+
: {}),
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
// No tool calls → final assistant turn. Without reflexion we
|
|
149
|
+
// emit turn_complete and return immediately. With reflexion
|
|
150
|
+
// enabled we issue a critique call against the model, parse a
|
|
151
|
+
// verdict, and either return (ok / exhausted) or inject the
|
|
152
|
+
// critique feedback as a synthetic user message and loop into
|
|
153
|
+
// a fresh ReAct iteration.
|
|
154
|
+
if (pendingToolCalls.length === 0) {
|
|
155
|
+
if (!reflexionEnabled) {
|
|
156
|
+
if (turnUsage && turnDetails) {
|
|
157
|
+
yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
|
|
158
|
+
}
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
// Append the candidate final-answer assistant turn to the
|
|
162
|
+
// conversation so the critique call (and any retry) sees it.
|
|
163
|
+
// We only do this when reflexion is enabled — the
|
|
164
|
+
// pre-reflexion path returns without ever appending the
|
|
165
|
+
// final assistant turn, and we must not change that byte for
|
|
166
|
+
// byte when reflexion is disabled.
|
|
167
|
+
messages.push({ role: 'assistant', text: assistantText });
|
|
168
|
+
const critiqueMessages = [
|
|
169
|
+
{ role: 'system', text: critiqueSystemPrompt },
|
|
170
|
+
// Skip the original system prompt — the critique system
|
|
171
|
+
// prompt replaces it. Everything else (history + user
|
|
172
|
+
// prompt + assistant turns + tool results) is included so
|
|
173
|
+
// the critic can evaluate the reply in context.
|
|
174
|
+
...messages.filter((m) => m.role !== 'system'),
|
|
175
|
+
{
|
|
176
|
+
role: 'user',
|
|
177
|
+
text: "Evaluate the assistant's most recent reply. Reply with the JSON verdict only.",
|
|
178
|
+
},
|
|
179
|
+
];
|
|
180
|
+
const critiqueRequest = {
|
|
181
|
+
messages: critiqueMessages,
|
|
182
|
+
tools: [],
|
|
183
|
+
toolUseEnabled: false,
|
|
184
|
+
};
|
|
185
|
+
const critiqueRequestId = `${requestId}#critique`;
|
|
186
|
+
if (input.tracer) {
|
|
187
|
+
input.tracer.emit({
|
|
188
|
+
kind: 'llm_request',
|
|
189
|
+
data: {
|
|
190
|
+
requestId: critiqueRequestId,
|
|
191
|
+
turnId: turnIdForReq,
|
|
192
|
+
iteration: turn,
|
|
193
|
+
ts: Date.now(),
|
|
194
|
+
systemPrompt: critiqueSystemPrompt,
|
|
195
|
+
messages: critiqueMessages.map((m) => ({ ...m })),
|
|
196
|
+
tools: [],
|
|
197
|
+
llm: { id: input.llm.id, supportsTools: input.llm.supportsTools },
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
let critiqueText = '';
|
|
202
|
+
let critiqueUsage;
|
|
203
|
+
for await (const ev of input.llm.chat(critiqueRequest, signal)) {
|
|
204
|
+
if (ev.kind === 'text') {
|
|
205
|
+
critiqueText += ev.chunk;
|
|
206
|
+
}
|
|
207
|
+
else if (ev.kind === 'turn_complete') {
|
|
208
|
+
critiqueUsage = ev.usage;
|
|
209
|
+
}
|
|
210
|
+
else if (ev.kind === 'error') {
|
|
211
|
+
// Critique errored — fail open, return the candidate
|
|
212
|
+
// final-answer turn as-is. Never block completion on a
|
|
213
|
+
// critique failure.
|
|
214
|
+
if (input.tracer) {
|
|
215
|
+
input.tracer.emit({
|
|
216
|
+
kind: 'llm_response',
|
|
217
|
+
data: {
|
|
218
|
+
requestId: critiqueRequestId,
|
|
219
|
+
ts: Date.now(),
|
|
220
|
+
text: critiqueText,
|
|
221
|
+
thinking: '',
|
|
222
|
+
toolCalls: [],
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
if (turnUsage && turnDetails) {
|
|
227
|
+
yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
|
|
228
|
+
}
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
// Tool calls / thinking events on the critique call are
|
|
232
|
+
// ignored — the critique request sets toolUseEnabled:false
|
|
233
|
+
// and asks for a JSON reply, so a well-behaved stub never
|
|
234
|
+
// emits them. Real providers may still stream thinking;
|
|
235
|
+
// we do not surface it to the caller.
|
|
236
|
+
}
|
|
237
|
+
if (input.tracer) {
|
|
238
|
+
input.tracer.emit({
|
|
239
|
+
kind: 'llm_response',
|
|
240
|
+
data: {
|
|
241
|
+
requestId: critiqueRequestId,
|
|
242
|
+
ts: Date.now(),
|
|
243
|
+
text: critiqueText,
|
|
244
|
+
thinking: '',
|
|
245
|
+
toolCalls: [],
|
|
246
|
+
...(critiqueUsage
|
|
247
|
+
? {
|
|
248
|
+
usage: {
|
|
249
|
+
promptTokens: critiqueUsage.promptTokens,
|
|
250
|
+
outputTokens: critiqueUsage.completionTokens,
|
|
251
|
+
...(critiqueUsage.cachedTokens !== undefined
|
|
252
|
+
? { cachedTokens: critiqueUsage.cachedTokens }
|
|
253
|
+
: {}),
|
|
254
|
+
},
|
|
255
|
+
}
|
|
256
|
+
: {}),
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
const verdict = parseCritiqueVerdict(critiqueText);
|
|
261
|
+
if (verdict.ok) {
|
|
262
|
+
yield {
|
|
263
|
+
kind: 'custom',
|
|
264
|
+
name: 'reflexion_critique',
|
|
265
|
+
data: { verdict: 'ok', text: critiqueText },
|
|
266
|
+
};
|
|
267
|
+
if (turnUsage && turnDetails) {
|
|
268
|
+
yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
|
|
269
|
+
}
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (reflexionRetriesRemaining <= 0) {
|
|
273
|
+
yield {
|
|
274
|
+
kind: 'custom',
|
|
275
|
+
name: 'reflexion_critique',
|
|
276
|
+
data: {
|
|
277
|
+
verdict: 'exhausted',
|
|
278
|
+
text: critiqueText,
|
|
279
|
+
...(verdict.feedback ? { feedback: verdict.feedback } : {}),
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
if (turnUsage && turnDetails) {
|
|
283
|
+
yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
|
|
284
|
+
}
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
yield {
|
|
288
|
+
kind: 'custom',
|
|
289
|
+
name: 'reflexion_critique',
|
|
290
|
+
data: {
|
|
291
|
+
verdict: 'retry',
|
|
292
|
+
text: critiqueText,
|
|
293
|
+
...(verdict.feedback ? { feedback: verdict.feedback } : {}),
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
if (turnUsage && turnDetails) {
|
|
297
|
+
yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
|
|
298
|
+
}
|
|
299
|
+
const feedback = verdict.feedback ?? 'Your previous response needs revision.';
|
|
300
|
+
messages.push({
|
|
301
|
+
role: 'user',
|
|
302
|
+
text: `Reviewer feedback: ${feedback}. Please revise your response.`,
|
|
303
|
+
});
|
|
304
|
+
reflexionRetriesRemaining -= 1;
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
// Tool calls → run each, append result message, loop.
|
|
308
|
+
messages.push({
|
|
309
|
+
role: 'assistant',
|
|
310
|
+
text: assistantText,
|
|
311
|
+
toolCalls: pendingToolCalls.map((tc) => ({
|
|
312
|
+
callId: tc.id,
|
|
313
|
+
name: tc.name,
|
|
314
|
+
args: tc.args,
|
|
315
|
+
...(tc.signature ? { signature: tc.signature } : {}),
|
|
316
|
+
})),
|
|
317
|
+
});
|
|
318
|
+
if (parallelDispatch) {
|
|
319
|
+
// Resolve each call's handler so we can ask `isParallelSafe`.
|
|
320
|
+
// Missing handler (defensive — shouldn't happen) → treated as
|
|
321
|
+
// not parallel-safe, so it falls into the sequential group.
|
|
322
|
+
const handlersByName = new Map();
|
|
323
|
+
for (const h of input.toolList)
|
|
324
|
+
handlersByName.set(h.name, h);
|
|
325
|
+
const parallelIndices = [];
|
|
326
|
+
const sequentialIndices = [];
|
|
327
|
+
for (let i = 0; i < pendingToolCalls.length; i++) {
|
|
328
|
+
const c = pendingToolCalls[i];
|
|
329
|
+
const h = handlersByName.get(c.name);
|
|
330
|
+
if (h && isParallelSafe(h))
|
|
331
|
+
parallelIndices.push(i);
|
|
332
|
+
else
|
|
333
|
+
sequentialIndices.push(i);
|
|
334
|
+
}
|
|
335
|
+
// Pre-allocate result slots so even when the parallel group
|
|
336
|
+
// settles out of order, we yield + push messages in the
|
|
337
|
+
// original input order. The trace and next-turn prompt must
|
|
338
|
+
// be identical to the sequential mode — only wall-clock
|
|
339
|
+
// differs.
|
|
340
|
+
const results = new Array(pendingToolCalls.length);
|
|
341
|
+
// Parallel-safe group: run concurrently. Handler errors are
|
|
342
|
+
// already normalised into `{ ok: false }` results by the
|
|
343
|
+
// dispatch layer, so Promise.all never rejects in practice.
|
|
344
|
+
if (parallelIndices.length > 0) {
|
|
345
|
+
await Promise.all(parallelIndices.map(async (i) => {
|
|
346
|
+
const call = pendingToolCalls[i];
|
|
347
|
+
results[i] = await input.tools.execute({ id: call.id, name: call.name, args: call.args }, input.toolContext());
|
|
348
|
+
}));
|
|
349
|
+
}
|
|
350
|
+
// Mutation group: still sequential, in original relative order.
|
|
351
|
+
for (const i of sequentialIndices) {
|
|
352
|
+
if (signal.aborted) {
|
|
353
|
+
yield { kind: 'error', message: 'aborted' };
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
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
|
+
// Yield + append in original input order.
|
|
360
|
+
for (let i = 0; i < pendingToolCalls.length; i++) {
|
|
361
|
+
const call = pendingToolCalls[i];
|
|
362
|
+
const result = results[i];
|
|
363
|
+
yield { kind: 'tool_result', id: call.id, result };
|
|
364
|
+
messages.push({
|
|
365
|
+
role: 'tool',
|
|
366
|
+
callId: call.id,
|
|
367
|
+
name: call.name,
|
|
368
|
+
resultJson: JSON.stringify(safeSerializable(result)),
|
|
369
|
+
text: '',
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
// Default behavior: byte-for-byte identical to the pre-change
|
|
375
|
+
// sequential loop — dispatch, yield, push, in order, one at a
|
|
376
|
+
// time.
|
|
377
|
+
for (const call of pendingToolCalls) {
|
|
378
|
+
const result = await input.tools.execute({ id: call.id, name: call.name, args: call.args }, input.toolContext());
|
|
379
|
+
yield { kind: 'tool_result', id: call.id, result };
|
|
380
|
+
messages.push({
|
|
381
|
+
role: 'tool',
|
|
382
|
+
callId: call.id,
|
|
383
|
+
name: call.name,
|
|
384
|
+
resultJson: JSON.stringify(safeSerializable(result)),
|
|
385
|
+
text: '',
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
// Close the tool-dispatch segment for this iteration. Pair
|
|
390
|
+
// with the `llm_response` emitted above; `ts` delta is the
|
|
391
|
+
// dispatch wall-clock the eval harness consumes.
|
|
392
|
+
if (input.tracer) {
|
|
393
|
+
input.tracer.emit({
|
|
394
|
+
kind: 'turn_dispatch_complete',
|
|
395
|
+
data: {
|
|
396
|
+
requestId,
|
|
397
|
+
turnId: turnIdForReq,
|
|
398
|
+
iteration: turn,
|
|
399
|
+
ts: Date.now(),
|
|
400
|
+
toolCallCount: pendingToolCalls.length,
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
// Loop to next turn.
|
|
405
|
+
if (turnUsage && turnDetails) {
|
|
406
|
+
yield { kind: 'turn_complete', usage: turnUsage, details: turnDetails };
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
yield {
|
|
410
|
+
kind: 'error',
|
|
411
|
+
message: `react-loop: exceeded maxTurns (${maxTurns}) without settling`,
|
|
412
|
+
};
|
|
413
|
+
},
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
function buildMessages(input) {
|
|
417
|
+
const out = [];
|
|
418
|
+
out.push({ role: 'system', text: input.systemPrompt });
|
|
419
|
+
for (const m of input.history) {
|
|
420
|
+
if (m.role === 'system')
|
|
421
|
+
continue; // already emitted
|
|
422
|
+
if (m.role === 'assistant') {
|
|
423
|
+
const tc = m.toolCalls?.map((c) => ({
|
|
424
|
+
callId: c.id,
|
|
425
|
+
name: c.name,
|
|
426
|
+
args: safeParse(c.argsJson),
|
|
427
|
+
...(c.signature ? { signature: c.signature } : {}),
|
|
428
|
+
})) ?? [];
|
|
429
|
+
out.push({
|
|
430
|
+
role: 'assistant',
|
|
431
|
+
text: m.text,
|
|
432
|
+
...(tc.length > 0 ? { toolCalls: tc } : {}),
|
|
433
|
+
});
|
|
434
|
+
for (const c of m.toolCalls ?? []) {
|
|
435
|
+
if (c.resultJson !== undefined) {
|
|
436
|
+
out.push({
|
|
437
|
+
role: 'tool',
|
|
438
|
+
callId: c.id,
|
|
439
|
+
name: c.name,
|
|
440
|
+
resultJson: c.resultJson,
|
|
441
|
+
text: '',
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
out.push({ role: m.role, text: m.text });
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
out.push({ role: 'user', text: input.prompt });
|
|
451
|
+
return out;
|
|
452
|
+
}
|
|
453
|
+
function safeParse(s) {
|
|
454
|
+
try {
|
|
455
|
+
return JSON.parse(s);
|
|
456
|
+
}
|
|
457
|
+
catch {
|
|
458
|
+
return s;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
function safeSerializable(value) {
|
|
462
|
+
// Strip non-serializable fields (functions, symbols) that might
|
|
463
|
+
// sneak into ToolResult.data. Most handlers return plain objects;
|
|
464
|
+
// this is belt-and-suspenders.
|
|
465
|
+
try {
|
|
466
|
+
return JSON.parse(JSON.stringify(value));
|
|
467
|
+
}
|
|
468
|
+
catch {
|
|
469
|
+
return { ok: value.ok, summary: value.summary };
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Extract the reflexion verdict from a critique LLM reply. Returns
|
|
474
|
+
* `{ ok: true }` on any parse failure (fail-open: the strategy must
|
|
475
|
+
* not block completion on a malformed critique). Handles three shapes
|
|
476
|
+
* the model commonly emits:
|
|
477
|
+
*
|
|
478
|
+
* - a bare JSON object: `{"ok": false, "feedback": "..."}`
|
|
479
|
+
* - a JSON object inside a ```json fenced code block
|
|
480
|
+
* - a JSON object embedded in prose; we regex-extract the first
|
|
481
|
+
* `{...}` substring and try to parse it
|
|
482
|
+
*
|
|
483
|
+
* Anything else — no braces, broken JSON, JSON missing the `ok`
|
|
484
|
+
* field — falls open.
|
|
485
|
+
*/
|
|
486
|
+
function parseCritiqueVerdict(text) {
|
|
487
|
+
if (!text || typeof text !== 'string')
|
|
488
|
+
return { ok: true };
|
|
489
|
+
// Strip ```json ... ``` fences (and bare ``` fences) before regex
|
|
490
|
+
// hunting for the JSON object. Models often wrap the verdict in a
|
|
491
|
+
// fence even when asked not to.
|
|
492
|
+
let candidate = text.trim();
|
|
493
|
+
const fenceMatch = candidate.match(/```(?:json)?\s*([\s\S]*?)```/i);
|
|
494
|
+
if (fenceMatch?.[1]) {
|
|
495
|
+
candidate = fenceMatch[1].trim();
|
|
496
|
+
}
|
|
497
|
+
// Greedy match: take everything from the first `{` to the last `}`
|
|
498
|
+
// so nested braces survive. JSON.parse will reject malformed input.
|
|
499
|
+
const objectMatch = candidate.match(/\{[\s\S]*\}/);
|
|
500
|
+
if (!objectMatch)
|
|
501
|
+
return { ok: true };
|
|
502
|
+
let parsed;
|
|
503
|
+
try {
|
|
504
|
+
parsed = JSON.parse(objectMatch[0]);
|
|
505
|
+
}
|
|
506
|
+
catch {
|
|
507
|
+
return { ok: true };
|
|
508
|
+
}
|
|
509
|
+
if (!parsed || typeof parsed !== 'object')
|
|
510
|
+
return { ok: true };
|
|
511
|
+
const obj = parsed;
|
|
512
|
+
if (typeof obj.ok !== 'boolean')
|
|
513
|
+
return { ok: true };
|
|
514
|
+
const out = { ok: obj.ok };
|
|
515
|
+
if (typeof obj.feedback === 'string' && obj.feedback.length > 0) {
|
|
516
|
+
out.feedback = obj.feedback;
|
|
517
|
+
}
|
|
518
|
+
return out;
|
|
519
|
+
}
|
|
520
|
+
//# sourceMappingURL=strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.js","sourceRoot":"","sources":["../src/strategy.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ToolRegistry` + `ToolDispatch` runtime implementations.
|
|
3
|
+
*
|
|
4
|
+
* The interfaces ship in slice 1 (`./types/tools.ts`). This module
|
|
5
|
+
* provides:
|
|
6
|
+
*
|
|
7
|
+
* - `createToolRegistry()` — the basic in-memory registry.
|
|
8
|
+
* - `createDispatch(registry)` — stateless executor that looks up
|
|
9
|
+
* by name and invokes the handler with the supplied `ToolContext`.
|
|
10
|
+
*
|
|
11
|
+
* Both are pure-TS — no React, no stores, no localStorage.
|
|
12
|
+
*/
|
|
13
|
+
import type { ToolDispatch, ToolHandler, ToolRegistry } from './types/tools.js';
|
|
14
|
+
export declare function createToolRegistry(): ToolRegistry;
|
|
15
|
+
/**
|
|
16
|
+
* Create a stateless dispatcher over a registry. The dispatcher
|
|
17
|
+
* holds a reference to the registry — list/register/unregister calls
|
|
18
|
+
* on the registry are seen by the dispatcher on the next `execute`.
|
|
19
|
+
*
|
|
20
|
+
* Error shape: handlers that throw turn into `{ ok: false, summary:
|
|
21
|
+
* <message> }` results so the caller's `for await` loop doesn't have
|
|
22
|
+
* to wrap every tool invocation in a try/catch. The thrown value is
|
|
23
|
+
* stringified into the summary.
|
|
24
|
+
*/
|
|
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;
|
|
40
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|