@ghostmind-dev/agent 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +141 -0
  3. package/dist/budget.d.ts +39 -0
  4. package/dist/budget.d.ts.map +1 -0
  5. package/dist/budget.js +34 -0
  6. package/dist/budget.js.map +1 -0
  7. package/dist/consult.d.ts +25 -0
  8. package/dist/consult.d.ts.map +1 -0
  9. package/dist/consult.js +80 -0
  10. package/dist/consult.js.map +1 -0
  11. package/dist/events.d.ts +119 -0
  12. package/dist/events.d.ts.map +1 -0
  13. package/dist/events.js +24 -0
  14. package/dist/events.js.map +1 -0
  15. package/dist/guide.d.ts +103 -0
  16. package/dist/guide.d.ts.map +1 -0
  17. package/dist/guide.js +268 -0
  18. package/dist/guide.js.map +1 -0
  19. package/dist/hooks.d.ts +80 -0
  20. package/dist/hooks.d.ts.map +1 -0
  21. package/dist/hooks.js +56 -0
  22. package/dist/hooks.js.map +1 -0
  23. package/dist/index.d.ts +33 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +21 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/jev.d.ts +74 -0
  28. package/dist/jev.d.ts.map +1 -0
  29. package/dist/jev.js +82 -0
  30. package/dist/jev.js.map +1 -0
  31. package/dist/loop.d.ts +142 -0
  32. package/dist/loop.d.ts.map +1 -0
  33. package/dist/loop.js +550 -0
  34. package/dist/loop.js.map +1 -0
  35. package/dist/model.d.ts +173 -0
  36. package/dist/model.d.ts.map +1 -0
  37. package/dist/model.js +205 -0
  38. package/dist/model.js.map +1 -0
  39. package/dist/seams.d.ts +137 -0
  40. package/dist/seams.d.ts.map +1 -0
  41. package/dist/seams.js +45 -0
  42. package/dist/seams.js.map +1 -0
  43. package/dist/skills.d.ts +36 -0
  44. package/dist/skills.d.ts.map +1 -0
  45. package/dist/skills.js +168 -0
  46. package/dist/skills.js.map +1 -0
  47. package/dist/testing.d.ts +36 -0
  48. package/dist/testing.d.ts.map +1 -0
  49. package/dist/testing.js +60 -0
  50. package/dist/testing.js.map +1 -0
  51. package/dist/tools.d.ts +114 -0
  52. package/dist/tools.d.ts.map +1 -0
  53. package/dist/tools.js +136 -0
  54. package/dist/tools.js.map +1 -0
  55. package/package.json +50 -0
package/dist/loop.js ADDED
@@ -0,0 +1,550 @@
1
+ /**
2
+ * The loop — the hard part every app's agent shares.
3
+ *
4
+ * One worker model does the work; the loop keeps it honest and bounded. Ported from Potion's Talk,
5
+ * where each guard answers a failure its evaluation found:
6
+ *
7
+ * [opening] greeting ─► the app's welcome, no worker · small talk ─► one short reply, no tools · task ─┐
8
+ * │
9
+ * ┌─► [step] budget? beforeStep hook? ─► the worker, offered EVERY tool ◄──────────────────────────┘
10
+ * │ │ (a router offering only some was how a model came to say
11
+ * │ │ "I have no tool for that" about a tool it had — Pi's lesson)
12
+ * │ ▼
13
+ * │ tool calls? ──yes──► toolGate · approval for changes · duplicate guard · run · rewriteOutput ─┐
14
+ * │ │ no, it stopped │
15
+ * │ ▼ │
16
+ * │ post-processors ─► stopCheck: accept (done) · pause (needs_person) · go (nudge, back) ──┐ │
17
+ * └───────────────────────────────────────────────────────────────────────────────────────┴─────┘
18
+ *
19
+ * The guards: step and tool-call caps (the last step answers with tools shown but not callable — how
20
+ * a model is made to answer without it writing tool markup instead), a USD cap, nudges, a transient
21
+ * reminder at the END of the context (weak models hold the thread better from there — Aider), leaked
22
+ * tool-call markup read back into real calls, an empty reply sent back twice then reported, identical
23
+ * reads run once (OpenCode's doom-loop guard), a "you may have enough" note every few reads (Gemini
24
+ * CLI), long results capped, guide reads that give their step back, and a declined change that ends
25
+ * the run on the person's move rather than being retried.
26
+ *
27
+ * Two models, two jobs. The WORKER writes, plans and calls tools. JEV decides: it answers typed
28
+ * questions with calibrated probabilities, never prose, at a fraction of a cent — so the loop asks it
29
+ * wherever a step is a judgement rather than a generation: is there a task at all ([opening]), which
30
+ * skills does it need, and — offered to the worker at every step as `ask_jev` — which existing option
31
+ * fits, is this a duplicate, how relevant is this. An app can put Jev behind the hooks too
32
+ * (`jevStopCheck`, `jevToolGate` in jev.ts). With a provider that cannot decide, all of that is
33
+ * skipped and the loop still runs.
34
+ *
35
+ * By default nothing judges the worker after it stops (Pi: the model decides). What can send it
36
+ * back is a `stopCheck` hook — a code check an app owns ("every id linked in the answer came from a
37
+ * tool"), or Jev's checks.
38
+ */
39
+ import { limits, overBudget } from "./budget.js";
40
+ import { askJevTool } from "./consult.js";
41
+ import { createGuide } from "./guide.js";
42
+ import { readVerdict } from "./hooks.js";
43
+ import { defaultPrompts, } from "./seams.js";
44
+ import { pickSkills, SKILL_TOOLS, skillsToolset } from "./skills.js";
45
+ import { stableJson } from "./tools.js";
46
+ // ── leaked tool calls ───────────────────────────────────────────────────────
47
+ // GLM's variant is `<arg_key>…</arg_key><arg_value>…</arg_value>`: seen as a whole answer in Potion's benchmark.
48
+ export const LEAKED_CALL = /<[||]{1,2}\s*(DSML|tool[▁_ ]?calls?)|<tool_call>|<\/?arg_(key|value)>|<\|tool_call|<\/?[||]{0,2}\s*(invoke|parameter)\s+name="|(^|\n)\s*(invoke|parameter)\s+name="[^"]*"(\s+string="(true|false)")?\s*>/i;
49
+ /**
50
+ * Some models (DeepSeek through some providers) write their tool calls as their own markup in the
51
+ * text instead of as structured calls:
52
+ * <||DSML|| invoke name="search"> <||DSML|| parameter name="query" string="true">…</…parameter> </…invoke>
53
+ * That is read back into real calls, so the model still does what it meant; nothing of it is shown.
54
+ */
55
+ export function parseLeakedCalls(text) {
56
+ const calls = [];
57
+ const invoke = /<[||]{1,2}\s*DSML\s*[||]{1,2}\s*invoke\s+name="([^"]+)"\s*>([\s\S]*?)<\/[||]{1,2}\s*DSML\s*[||]{1,2}\s*invoke\s*>/gi;
58
+ const param = /<[||]{1,2}\s*DSML\s*[||]{1,2}\s*parameter\s+name="([^"]+)"(?:\s+string="(true|false)")?\s*>([\s\S]*?)<\/[||]{1,2}\s*DSML\s*[||]{1,2}\s*parameter\s*>/gi;
59
+ let m;
60
+ while ((m = invoke.exec(text))) {
61
+ const args = {};
62
+ let p;
63
+ param.lastIndex = 0;
64
+ while ((p = param.exec(m[2] ?? ''))) {
65
+ const key = p[1] ?? '';
66
+ const raw = (p[3] ?? '').trim();
67
+ if (p[2] === 'true')
68
+ args[key] = raw;
69
+ else {
70
+ try {
71
+ args[key] = JSON.parse(raw);
72
+ }
73
+ catch {
74
+ args[key] = raw;
75
+ }
76
+ }
77
+ }
78
+ calls.push({ id: `leaked_${Date.now().toString(36)}_${calls.length}`, type: 'function', function: { name: m[1] ?? '', arguments: JSON.stringify(args) } });
79
+ }
80
+ return calls;
81
+ }
82
+ /**
83
+ * Streams text through, but holds back anything that may be the start of tool-call markup until it
84
+ * is clear either way. Once markup is seen, nothing more of this step is shown.
85
+ */
86
+ export function leakFilter(emit) {
87
+ let held = '';
88
+ let leaked = false;
89
+ return {
90
+ push(text) {
91
+ if (leaked)
92
+ return;
93
+ held += text;
94
+ const at = held.search(LEAKED_CALL);
95
+ if (at >= 0) {
96
+ if (at > 0)
97
+ emit(held.slice(0, at));
98
+ leaked = true;
99
+ held = '';
100
+ return;
101
+ }
102
+ const lt = held.lastIndexOf('<');
103
+ if (lt === -1 || held.length - lt > 24) {
104
+ emit(held);
105
+ held = '';
106
+ }
107
+ else {
108
+ if (lt > 0)
109
+ emit(held.slice(0, lt));
110
+ held = held.slice(lt);
111
+ }
112
+ },
113
+ end() {
114
+ if (!leaked && held)
115
+ emit(held);
116
+ held = '';
117
+ },
118
+ };
119
+ }
120
+ export async function passNode(provider, node, state, signal) {
121
+ if (!provider.decide)
122
+ throw new Error('This provider cannot decide');
123
+ const { answers, cost } = await provider.decide(state, { node: { type: 'choice', instructions: node.question, criteria: node.paths } }, signal);
124
+ const a = answers.node;
125
+ if (a.type !== 'choice' || !(a.choice in node.paths))
126
+ throw new Error('The decision node returned no path');
127
+ const ranked = Object.entries(a.probabilities).sort((x, y) => y[1] - x[1]).map(([path, p]) => ({ path, p }));
128
+ return { path: a.choice, ranked, confidence: a.confidence, cost };
129
+ }
130
+ // ── the loop ────────────────────────────────────────────────────────────────
131
+ function asText(value, cap) {
132
+ const text = typeof value === 'string' ? value : (JSON.stringify(value ?? null) ?? 'null');
133
+ return text.length > cap ? `${text.slice(0, cap)}\n…(truncated, ${text.length} characters)` : text;
134
+ }
135
+ function modelNotes(notes, model) {
136
+ const m = (model ?? '').toLowerCase();
137
+ if (!m)
138
+ return [];
139
+ return Object.entries(notes)
140
+ .filter(([family]) => family.split('|').some(f => f && m.includes(f)))
141
+ .flatMap(([, lines]) => lines);
142
+ }
143
+ const errorText = (error) => (error instanceof Error ? error.message : String(error));
144
+ export async function runAgent(options) {
145
+ const { provider, task, stream = false, hooks = {}, onEvent, log } = options;
146
+ const P = { ...defaultPrompts, ...options.prompts, opening: { ...defaultPrompts.opening, ...options.prompts?.opening } };
147
+ const L = limits(options.budget);
148
+ const signal = options.signal ?? new AbortController().signal;
149
+ const model = options.model ?? provider.defaultModel;
150
+ const guides = new Set(options.guideTools ?? SKILL_TOOLS);
151
+ const always = [...(options.alwaysTools ?? [])];
152
+ if ((options.askJev ?? true) && provider.decide && !always.some(t => t.name === 'ask_jev'))
153
+ always.push(askJevTool(provider));
154
+ const emit = (event) => {
155
+ log?.append(event);
156
+ onEvent?.(event);
157
+ };
158
+ let cost = 0;
159
+ let toolCalls = 0;
160
+ let nudges = 0;
161
+ let empties = 0;
162
+ let reads = 0;
163
+ let limit = L.maxSteps;
164
+ // The person declined a change: that is their answer. The worker replies once, without tools, and
165
+ // the run ends — it is never sent back to try the same change again.
166
+ let declined = false;
167
+ let answer = null;
168
+ // Identical reads in this run (tool + arguments): run once, never again.
169
+ const ran = new Map();
170
+ const messages = [];
171
+ const spend = (usd, on) => {
172
+ if (!usd)
173
+ return;
174
+ cost += usd;
175
+ emit({ type: 'spend', usd, total: cost, on });
176
+ };
177
+ /** Add a message to the conversation; the model will see it, so it is logged. */
178
+ const see = (message) => {
179
+ messages.push(message);
180
+ emit({ type: 'context', message, transient: false });
181
+ };
182
+ const ctx = (step) => ({ step, spent: cost, toolCalls, nudges, task, messages, spend });
183
+ // Post-processing runs once per distinct answer, however many times it is asked for.
184
+ let processedFor;
185
+ let processed = null;
186
+ const finalAnswer = async () => {
187
+ if (processedFor !== answer || processedFor === undefined) {
188
+ processedFor = answer;
189
+ let out = answer;
190
+ for (const post of options.postProcessors ?? [])
191
+ out = await post(out, { messages, task });
192
+ processed = out;
193
+ }
194
+ return processed;
195
+ };
196
+ const finish = async (status, steps, reason = null) => {
197
+ const result = { status, reason, answer: await finalAnswer(), steps, toolCalls, cost, messages };
198
+ await guide.finish(status);
199
+ if (options.session)
200
+ await options.session.store.save(options.session.id, messages.filter(m => m.role !== 'system'));
201
+ emit({ type: 'finished', result });
202
+ return result;
203
+ };
204
+ emit({ type: 'run_start', task, model: model ?? null });
205
+ const guide = createGuide({ ...options.guide, guidance: options.guidance }, { provider, model, task, signal, emit, spend, affordable: () => !overBudget(cost, L.maxUsd) });
206
+ await guide.start();
207
+ // A steer from the guide rides with the next model call only, like the reminder.
208
+ let steer = null;
209
+ const addSteer = (text) => {
210
+ if (text)
211
+ steer = steer ? `${steer}\n${text}` : text;
212
+ };
213
+ // ── the context ──
214
+ const history = (options.history ?? (options.session ? await options.session.store.load(options.session.id) : [])).filter(m => m.role !== 'system');
215
+ const earlier = history.filter(m => m.role === 'user').slice(-3).map(m => String(m.content).slice(0, 300));
216
+ let toolsets = options.toolsets ?? [];
217
+ let skillLines = [];
218
+ if (options.skills && !signal.aborted) {
219
+ const all = await options.skills.list();
220
+ const picked = await pickSkills(provider, all, task.goal, { earlier, signal });
221
+ spend(picked.cost, 'skills');
222
+ emit({ type: 'skills', names: picked.names });
223
+ const set = skillsToolset(options.skills, picked.names);
224
+ if (set) {
225
+ toolsets = [...toolsets, set];
226
+ skillLines = [P.skills, ...all.filter(s => picked.names.includes(s.name)).map(s => `- ${s.name}: ${s.description.slice(0, 300)}`)];
227
+ }
228
+ }
229
+ const offered = [...toolsets.flatMap(s => s.tools), ...always];
230
+ const tools = [...new Map(offered.map(t => [t.name, t])).values()];
231
+ const toolByName = new Map(tools.map(t => [t.name, t]));
232
+ const facts = options.memory ? await options.memory.recall({ signal, task }) : [];
233
+ see({
234
+ role: 'system',
235
+ content: [
236
+ ...P.system,
237
+ ...(toolByName.has('ask_jev') ? [P.judgement] : []),
238
+ ...modelNotes(P.modelNotes, model),
239
+ ...(facts.length ? [P.memory, ...facts.map(f => `- ${f}`)] : []),
240
+ ...(options.instructions ? [`${P.instructions}\n${options.instructions}`] : []),
241
+ ...skillLines,
242
+ ].join('\n'),
243
+ });
244
+ for (const m of history)
245
+ see(m);
246
+ see({
247
+ role: 'user',
248
+ content: [`Task: ${task.goal}`, task.context !== undefined ? `Context: ${asText(task.context, L.resultCap)}` : null, `Expected output: ${task.expectation}`]
249
+ .filter(Boolean)
250
+ .join('\n\n'),
251
+ });
252
+ // ── [opening]: is there a task at all? A greeting or a thank-you must not pay for the loop. ──
253
+ if ((options.opening ?? true) && provider.decide && !signal.aborted && !overBudget(cost, L.maxUsd)) {
254
+ const out = await passNode(provider, { question: P.opening.question, paths: { task: P.opening.task, greeting: P.opening.greeting, small_talk: P.opening.small_talk } }, { message: task.goal, earlier }, signal).catch(() => null);
255
+ if (out) {
256
+ spend(out.cost, 'opening');
257
+ // Only a clear call skips the work: a real request mistaken for chit-chat would go unanswered.
258
+ const path = out.path !== 'task' && (out.ranked[0]?.p ?? 0) >= 0.7 ? out.path : 'task';
259
+ emit({ type: 'opening', path, confidence: out.confidence });
260
+ if (path === 'greeting' && task.welcome) {
261
+ answer = task.welcome;
262
+ if (stream)
263
+ emit({ type: 'delta', text: answer });
264
+ emit({ type: 'message', text: answer });
265
+ see({ role: 'assistant', content: answer });
266
+ return finish('greeted', 0);
267
+ }
268
+ if (path !== 'task') {
269
+ const note = { role: 'user', content: P.notATask };
270
+ messages.push(note);
271
+ emit({ type: 'context', message: note, transient: true });
272
+ try {
273
+ const reply = await provider.chat({ model, messages, signal, maxTokens: 300, onDelta: stream ? text => emit({ type: 'delta', text }) : undefined });
274
+ messages.pop();
275
+ spend(reply.cost, 'worker');
276
+ delete reply.message.tool_calls;
277
+ see(reply.message);
278
+ answer = reply.message.content;
279
+ if (answer)
280
+ emit({ type: 'message', text: answer });
281
+ return finish('chatted', 1);
282
+ }
283
+ catch (error) {
284
+ messages.pop();
285
+ if (signal.aborted)
286
+ return finish('stopped', 0, 'Aborted.');
287
+ throw error;
288
+ }
289
+ }
290
+ }
291
+ }
292
+ const runCall = async (call, step) => {
293
+ const name = call.function.name;
294
+ let args = {};
295
+ try {
296
+ const parsed = call.function.arguments ? JSON.parse(call.function.arguments) : {};
297
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
298
+ throw new Error('The arguments must be a JSON object.');
299
+ args = parsed;
300
+ const tool = toolByName.get(name);
301
+ if (!tool)
302
+ throw new Error(`There is no tool named "${name}". The tools are: ${[...toolByName.keys()].join(', ')}.`);
303
+ emit({ type: 'tool_call', id: call.id, name, args });
304
+ let change = tool.write ? await tool.write.describe(args) : null;
305
+ if (hooks.toolGate) {
306
+ const d = readVerdict(await hooks.toolGate({ ...ctx(step), tool: name, args, callId: call.id, change }));
307
+ if (d.verdict !== 'go') {
308
+ const reason = d.reason ?? `toolGate said ${d.verdict} before ${name}.`;
309
+ emit({ type: 'hook', hook: 'toolGate', verdict: d.verdict, reason });
310
+ return { name, args, ok: false, result: `Not run: ${reason}`, halt: { status: d.verdict === 'pause' ? 'paused' : 'stopped', reason } };
311
+ }
312
+ if (d.args) {
313
+ args = d.args;
314
+ change = tool.write ? await tool.write.describe(args) : null;
315
+ }
316
+ if (d.result !== undefined) {
317
+ emit({ type: 'hook', hook: 'toolGate', verdict: 'go', reason: d.reason ?? 'result given instead of running' });
318
+ return { name, args, ok: true, result: asText(d.result, L.resultCap) };
319
+ }
320
+ }
321
+ const key = `${name}:${stableJson(args)}`;
322
+ if (change !== null && !declined) {
323
+ const held = await guide.beforeWrite(name, args, change, key);
324
+ if (held)
325
+ return { name, args, ok: false, result: held };
326
+ }
327
+ if (change !== null) {
328
+ if (declined)
329
+ throw new Error(P.afterDecline);
330
+ if (!options.approve)
331
+ throw new Error(P.cannotApprove);
332
+ const request = { id: call.id, tool: name, summary: change, args };
333
+ emit({ type: 'approval', ...request });
334
+ const approved = await options.approve(request);
335
+ emit({ type: 'approval_result', id: call.id, approved });
336
+ if (!approved) {
337
+ declined = true;
338
+ throw new Error(P.declined);
339
+ }
340
+ }
341
+ const isGuide = guides.has(name);
342
+ let result;
343
+ let repeated = false;
344
+ if (change === null && ran.has(key)) {
345
+ result = P.repeated.replace('{tool}', name);
346
+ repeated = true;
347
+ }
348
+ else {
349
+ result = asText(await tool.run(args, { signal, callId: call.id, spend: usd => spend(usd, name) }), L.resultCap);
350
+ ran.set(key, result);
351
+ }
352
+ if (change === null && !isGuide && ++reads >= L.readNudgeAt && reads % L.readNudgeAt === 0) {
353
+ result += `\n\n${P.readNudge.replace('{n}', String(reads))}`;
354
+ }
355
+ return { name, args, ok: true, result, repeated };
356
+ }
357
+ catch (error) {
358
+ return { name, args, ok: false, result: `Error: ${errorText(error)}` };
359
+ }
360
+ };
361
+ /** Every call must have a result, or the conversation cannot be sent again (a resume, a follow-up). */
362
+ const skipRest = (calls, from, why) => {
363
+ for (const call of calls.slice(from)) {
364
+ emit({ type: 'tool_result', id: call.id, name: call.function.name, ok: false, result: why });
365
+ see({ role: 'tool', tool_call_id: call.id, content: why });
366
+ }
367
+ };
368
+ // ── the steps ──
369
+ for (let step = 1; step <= limit; step++) {
370
+ if (signal.aborted)
371
+ return finish('stopped', step - 1, 'Aborted.');
372
+ const broke = overBudget(cost, L.maxUsd);
373
+ if (broke)
374
+ return finish('limit', step - 1, broke);
375
+ if (hooks.beforeStep) {
376
+ const d = readVerdict(await hooks.beforeStep(ctx(step)));
377
+ if (d.verdict !== 'go') {
378
+ const reason = d.reason ?? `beforeStep said ${d.verdict}.`;
379
+ emit({ type: 'hook', hook: 'beforeStep', verdict: d.verdict, reason });
380
+ return finish(d.verdict === 'pause' ? 'paused' : 'stopped', step - 1, reason);
381
+ }
382
+ }
383
+ // Out of steps or out of tool calls, or a change was declined: answer now, with what it has.
384
+ const hard = step >= limit || toolCalls >= L.maxToolCalls || declined;
385
+ emit({ type: 'step', step, answerNow: hard });
386
+ // A last line at the END of the context, for this call only: it never stays in the conversation.
387
+ const transient = [];
388
+ if (steer && !hard)
389
+ transient.push({ role: 'user', content: steer });
390
+ steer = null;
391
+ transient.push({ role: 'user', content: hard ? P.answerNow : P.reminder.replace('{goal}', task.goal.slice(0, 300)) });
392
+ for (const message of transient) {
393
+ messages.push(message);
394
+ emit({ type: 'context', message, transient: true });
395
+ }
396
+ let reply;
397
+ try {
398
+ const filter = leakFilter(text => emit({ type: 'delta', text }));
399
+ reply = await provider.chat({
400
+ model,
401
+ messages,
402
+ // A hard stop shows every tool but allows none.
403
+ ...(tools.length ? { tools, toolChoice: hard ? 'none' : 'auto' } : {}),
404
+ signal,
405
+ onDelta: stream ? text => filter.push(text) : undefined,
406
+ });
407
+ filter.end();
408
+ }
409
+ catch (error) {
410
+ messages.splice(messages.length - transient.length, transient.length);
411
+ if (signal.aborted)
412
+ return finish('stopped', step - 1, 'Aborted.');
413
+ throw error;
414
+ }
415
+ messages.splice(messages.length - transient.length, transient.length);
416
+ spend(reply.cost, 'worker');
417
+ // Tool calls written as text: read them back into real calls (unless this step was for answering).
418
+ const content = reply.message.content;
419
+ if (content && LEAKED_CALL.test(content)) {
420
+ const before = content.slice(0, content.search(LEAKED_CALL)).trim();
421
+ const recovered = hard ? [] : parseLeakedCalls(content);
422
+ reply.message.content = before || null;
423
+ if (recovered.length && !reply.message.tool_calls?.length)
424
+ reply.message.tool_calls = recovered;
425
+ else if (!hard && !reply.message.tool_calls?.length)
426
+ addSteer(await guide.hesitation('leaked_call', content.slice(0, 1200), tools));
427
+ }
428
+ // A model that calls a tool anyway is not obeyed: this step was for answering.
429
+ if (hard)
430
+ delete reply.message.tool_calls;
431
+ see(reply.message);
432
+ if (reply.message.content) {
433
+ // The answer is what the model says when it is done, not the line it writes before a lookup.
434
+ if (!reply.message.tool_calls?.length || !answer)
435
+ answer = reply.message.content;
436
+ emit({ type: 'message', text: reply.message.content });
437
+ }
438
+ const calls = reply.message.tool_calls ?? [];
439
+ // An empty reply — no words, no call — is not an answer: back twice, then the run ends saying so.
440
+ if (!calls.length && !String(reply.message.content ?? '').trim()) {
441
+ empties++;
442
+ if (empties <= 2 && step < limit) {
443
+ see({ role: 'user', content: P.emptyReply });
444
+ const lastResult = [...messages].reverse().find(m => m.role === 'tool');
445
+ addSteer(await guide.hesitation('empty_reply', lastResult ? String(lastResult.content) : task.goal, tools));
446
+ continue;
447
+ }
448
+ answer = answer || P.gaveUp;
449
+ return finish('unfinished', step, 'The model kept replying with nothing.');
450
+ }
451
+ if (calls.length) {
452
+ if (calls.every(c => guides.has(c.function.name)))
453
+ limit = Math.min(limit + 1, L.maxSteps + L.guideSteps);
454
+ const batch = [];
455
+ let repeatedCall = null;
456
+ for (let i = 0; i < calls.length; i++) {
457
+ const call = calls[i];
458
+ if (signal.aborted) {
459
+ skipRest(calls, i, 'Not run: the run was stopped.');
460
+ return finish('stopped', step, 'Aborted.');
461
+ }
462
+ const over = overBudget(cost, L.maxUsd);
463
+ if (over) {
464
+ skipRest(calls, i, `Not run: ${over}`);
465
+ break;
466
+ }
467
+ if (!guides.has(call.function.name))
468
+ toolCalls++;
469
+ const out = await runCall(call, step);
470
+ let result = out.result;
471
+ if (hooks.rewriteOutput && !out.halt) {
472
+ const next = await hooks.rewriteOutput({ ...ctx(step), tool: out.name, args: out.args, callId: call.id, ok: out.ok, result });
473
+ if (typeof next === 'string')
474
+ result = next;
475
+ }
476
+ emit({ type: 'tool_result', id: call.id, name: out.name, ok: out.ok, result });
477
+ see({ role: 'tool', tool_call_id: call.id, content: result });
478
+ if (out.halt) {
479
+ skipRest(calls, i + 1, `Not run: ${out.halt.reason}`);
480
+ return finish(out.halt.status, step, out.halt.reason);
481
+ }
482
+ if (out.repeated)
483
+ repeatedCall = `${out.name}(${JSON.stringify(out.args)})`;
484
+ else if (!guides.has(out.name))
485
+ batch.push({ tool: out.name, args: out.args, result, ok: out.ok });
486
+ }
487
+ addSteer(await guide.afterTools(batch));
488
+ if (repeatedCall)
489
+ addSteer(await guide.hesitation('repeated_call', `Repeated ${repeatedCall}`, tools));
490
+ continue;
491
+ }
492
+ // After a decline, the reply is the end of the run: the next move is the person's.
493
+ if (declined)
494
+ return finish('needs_person', step, 'The person declined a change.');
495
+ // The model stopped. The guide, then a stopCheck, can send it back.
496
+ if (step < limit && toolCalls < L.maxToolCalls && nudges < L.maxNudges) {
497
+ const doubt = await guide.beforeAnswer(await finalAnswer());
498
+ if (doubt) {
499
+ nudges++;
500
+ emit({ type: 'nudge', reason: doubt });
501
+ see({ role: 'user', content: doubt });
502
+ continue;
503
+ }
504
+ }
505
+ if (hooks.stopCheck) {
506
+ const reply = await hooks.stopCheck({ ...ctx(step), answer: await finalAnswer() });
507
+ if (reply) {
508
+ const d = readVerdict(reply);
509
+ const verdict = d.verdict;
510
+ if (verdict !== 'stop') {
511
+ const reason = d.reason ?? (verdict === 'go' ? 'Not done yet: continue.' : 'stopCheck paused the run.');
512
+ emit({ type: 'hook', hook: 'stopCheck', verdict, reason });
513
+ if (verdict === 'pause')
514
+ return finish('needs_person', step, reason);
515
+ if (nudges < L.maxNudges) {
516
+ nudges++;
517
+ emit({ type: 'nudge', reason });
518
+ see({ role: 'user', content: reason });
519
+ continue;
520
+ }
521
+ return finish('done', step, `Accepted after ${L.maxNudges} nudges; the check still says: ${reason}`);
522
+ }
523
+ }
524
+ }
525
+ return finish('done', step);
526
+ }
527
+ return finish('limit', limit, `Out of steps (${limit}).`);
528
+ }
529
+ /**
530
+ * A whole agent as one tool. Its transcript is isolated — the parent sees only the status and the
531
+ * answer, never the sub-agent's tool results — and what it spent is added to the parent's total, so
532
+ * the parent's USD cap covers it.
533
+ */
534
+ export function subagentTool(spec) {
535
+ return {
536
+ name: spec.name,
537
+ description: spec.description,
538
+ parameters: {
539
+ type: 'object',
540
+ properties: { goal: { type: 'string', description: 'The task, self-contained: the sub-agent sees nothing else.' }, context: { description: 'Anything it needs to know' } },
541
+ required: ['goal'],
542
+ },
543
+ run: async (args, ctx) => {
544
+ const result = await runAgent({ ...spec.options, task: { goal: String(args.goal ?? ''), context: args.context, expectation: spec.expectation }, signal: ctx.signal });
545
+ ctx.spend(result.cost);
546
+ return { status: result.status, answer: result.answer, ...(result.reason ? { reason: result.reason } : {}) };
547
+ },
548
+ };
549
+ }
550
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../src/loop.ts"],"names":[],"mappings":"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"}