@tangle-network/agent-runtime 0.45.0 → 0.47.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/README.md +3 -3
- package/dist/agent.d.ts +5 -5
- package/dist/agent.js +2 -2
- package/dist/agent.js.map +1 -1
- package/dist/analyst-loop.d.ts +5 -40
- package/dist/analyst-loop.js +2 -4
- package/dist/{chunk-IJ6FGOPO.js → chunk-5YDS7BLC.js} +12 -7
- package/dist/chunk-5YDS7BLC.js.map +1 -0
- package/dist/{chunk-KEWO4KI6.js → chunk-72JQCHOZ.js} +850 -131
- package/dist/chunk-72JQCHOZ.js.map +1 -0
- package/dist/{chunk-PRX45WE2.js → chunk-GSUO5QS6.js} +1 -119
- package/dist/chunk-GSUO5QS6.js.map +1 -0
- package/dist/{chunk-FK53TXOP.js → chunk-HNUXAZIJ.js} +4 -27
- package/dist/chunk-HNUXAZIJ.js.map +1 -0
- package/dist/{chunk-IJGS6J7X.js → chunk-JNPK46YH.js} +2 -2
- package/dist/{chunk-QR4UUC5P.js → chunk-KADIJAD4.js} +33 -19
- package/dist/chunk-KADIJAD4.js.map +1 -0
- package/dist/{chunk-NYN5RTLP.js → chunk-MGFEUYOH.js} +7 -7
- package/dist/chunk-MGFEUYOH.js.map +1 -0
- package/dist/{chunk-Z2QXVBA6.js → chunk-T4OQQEE3.js} +4 -4
- package/dist/chunk-T4OQQEE3.js.map +1 -0
- package/dist/{chunk-KSMX62JF.js → chunk-VR4JIC5H.js} +2 -2
- package/dist/{coder-CczgMqFx.d.ts → coder-CVZNGbyg.d.ts} +1 -1
- package/dist/{dynamic-BvllHV6M.d.ts → driver-DYU2sgHr.d.ts} +6 -6
- package/dist/{improvement-adapter-CWegd3vw.d.ts → improvement-adapter-BC4HhuAR.d.ts} +1 -1
- package/dist/improvement.d.ts +2 -2
- package/dist/index.d.ts +8 -8
- package/dist/index.js +8 -8
- package/dist/{kb-gate-D9GBocLN.d.ts → kb-gate-51BlLlVM.d.ts} +13 -7
- package/dist/{loop-runner-bin-CPrCoKqC.d.ts → loop-runner-bin-DEm4roYF.d.ts} +11 -11
- package/dist/loop-runner-bin.d.ts +6 -6
- package/dist/loop-runner-bin.js +6 -6
- package/dist/loops.d.ts +5 -5
- package/dist/loops.js +18 -10
- package/dist/mcp/bin.js +6 -6
- package/dist/mcp/bin.js.map +1 -1
- package/dist/mcp/index.d.ts +75 -74
- package/dist/mcp/index.js +203 -31
- package/dist/mcp/index.js.map +1 -1
- package/dist/{otel-export-Dy2DyUCU.d.ts → otel-export-EzfsVUhh.d.ts} +1 -1
- package/dist/profiles.d.ts +8 -8
- package/dist/profiles.js +1 -1
- package/dist/profiles.js.map +1 -1
- package/dist/{run-loop--hSoIknW.d.ts → run-loop-DvD4aGiE.d.ts} +2 -2
- package/dist/runtime.d.ts +244 -57
- package/dist/runtime.js +18 -10
- package/dist/{types-1HbsFa7H.d.ts → types-Cbx3dNK5.d.ts} +23 -23
- package/dist/{types-DdzkffAm.d.ts → types-nBMuollC.d.ts} +34 -5
- package/dist/{types-BtRLF2U3.d.ts → types-p8dWBIXL.d.ts} +1 -1
- package/dist/workflow.d.ts +3 -3
- package/dist/workflow.js +2 -2
- package/dist/workflow.js.map +1 -1
- package/package.json +1 -1
- package/skills/agent-runtime-adoption/SKILL.md +3 -3
- package/skills/generate-eval/SKILL.md +60 -0
- package/skills/loop-writer/SKILL.md +163 -0
- package/dist/chunk-FK53TXOP.js.map +0 -1
- package/dist/chunk-IJ6FGOPO.js.map +0 -1
- package/dist/chunk-KEWO4KI6.js.map +0 -1
- package/dist/chunk-NYN5RTLP.js.map +0 -1
- package/dist/chunk-PRX45WE2.js.map +0 -1
- package/dist/chunk-QR4UUC5P.js.map +0 -1
- package/dist/chunk-Z2QXVBA6.js.map +0 -1
- /package/dist/{chunk-IJGS6J7X.js.map → chunk-JNPK46YH.js.map} +0 -0
- /package/dist/{chunk-KSMX62JF.js.map → chunk-VR4JIC5H.js.map} +0 -0
package/dist/mcp/index.js
CHANGED
|
@@ -14,12 +14,12 @@ import {
|
|
|
14
14
|
removeWorktree,
|
|
15
15
|
traceContextToEnv,
|
|
16
16
|
validateDelegateUiAuditArgs
|
|
17
|
-
} from "../chunk-
|
|
17
|
+
} from "../chunk-T4OQQEE3.js";
|
|
18
18
|
import "../chunk-WIR4HOOJ.js";
|
|
19
19
|
import {
|
|
20
20
|
mcpToolsForRuntimeMcp,
|
|
21
21
|
mcpToolsForRuntimeMcpSubset
|
|
22
|
-
} from "../chunk-
|
|
22
|
+
} from "../chunk-VR4JIC5H.js";
|
|
23
23
|
import {
|
|
24
24
|
DELEGATE_CODE_DESCRIPTION,
|
|
25
25
|
DELEGATE_CODE_INPUT_SCHEMA,
|
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
validateDelegateResearchArgs,
|
|
51
51
|
validateDelegationHistoryArgs,
|
|
52
52
|
validateDelegationStatusArgs
|
|
53
|
-
} from "../chunk-
|
|
53
|
+
} from "../chunk-JNPK46YH.js";
|
|
54
54
|
import {
|
|
55
55
|
createKbGate
|
|
56
56
|
} from "../chunk-FNMGYYSS.js";
|
|
@@ -58,8 +58,8 @@ import {
|
|
|
58
58
|
createDefaultCoderDelegate,
|
|
59
59
|
createFleetWorkspaceExecutor,
|
|
60
60
|
createSiblingSandboxExecutor
|
|
61
|
-
} from "../chunk-
|
|
62
|
-
import "../chunk-
|
|
61
|
+
} from "../chunk-5YDS7BLC.js";
|
|
62
|
+
import "../chunk-KADIJAD4.js";
|
|
63
63
|
import {
|
|
64
64
|
runLocalHarness
|
|
65
65
|
} from "../chunk-GLR25NG7.js";
|
|
@@ -70,8 +70,8 @@ import {
|
|
|
70
70
|
} from "../chunk-7JITYN6T.js";
|
|
71
71
|
import {
|
|
72
72
|
assertTraceDerivedFindings
|
|
73
|
-
} from "../chunk-
|
|
74
|
-
import "../chunk-
|
|
73
|
+
} from "../chunk-72JQCHOZ.js";
|
|
74
|
+
import "../chunk-GSUO5QS6.js";
|
|
75
75
|
import "../chunk-DGUM43GV.js";
|
|
76
76
|
|
|
77
77
|
// src/mcp/tools/checks.ts
|
|
@@ -246,7 +246,30 @@ var idArg = { type: "string", description: "The workerId returned by spawn_worke
|
|
|
246
246
|
function createCoordinationTools(opts) {
|
|
247
247
|
let stopped = false;
|
|
248
248
|
let reason;
|
|
249
|
+
let questionSeq = 0;
|
|
249
250
|
const ledger = [];
|
|
251
|
+
const questions = [];
|
|
252
|
+
const questionPolicy = opts.questionPolicy ?? "auto";
|
|
253
|
+
const str = (v, field) => {
|
|
254
|
+
if (typeof v !== "string" || v.length === 0)
|
|
255
|
+
throw new Error(`coordination tools: "${field}" must be a non-empty string`);
|
|
256
|
+
return v;
|
|
257
|
+
};
|
|
258
|
+
const obj = (raw) => {
|
|
259
|
+
if (!raw || typeof raw !== "object")
|
|
260
|
+
throw new Error("coordination tools: arguments must be an object");
|
|
261
|
+
return raw;
|
|
262
|
+
};
|
|
263
|
+
const level = (v) => {
|
|
264
|
+
if (v === "worker" || v === "driver" || v === "loop") return v;
|
|
265
|
+
throw new Error('coordination tools: "level" must be worker, driver, or loop');
|
|
266
|
+
};
|
|
267
|
+
const urgency = (v) => {
|
|
268
|
+
if (v === "continue-without" || v === "blocks-step" || v === "blocks-run") return v;
|
|
269
|
+
throw new Error(
|
|
270
|
+
'coordination tools: "urgency" must be continue-without, blocks-step, or blocks-run'
|
|
271
|
+
);
|
|
272
|
+
};
|
|
250
273
|
const recordSettled = (s) => {
|
|
251
274
|
const w = s.kind === "done" ? {
|
|
252
275
|
id: s.handle.id,
|
|
@@ -258,24 +281,68 @@ function createCoordinationTools(opts) {
|
|
|
258
281
|
ledger.push(w);
|
|
259
282
|
return w;
|
|
260
283
|
};
|
|
261
|
-
const
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
return
|
|
284
|
+
const nextQuestionId = (from) => `${from}:q${questionSeq++}`;
|
|
285
|
+
const normalizeQuestion = (q, fallbackFrom) => {
|
|
286
|
+
const from = str(q.from ?? fallbackFrom, "from");
|
|
287
|
+
return {
|
|
288
|
+
id: typeof q.id === "string" && q.id.length > 0 ? q.id : nextQuestionId(from),
|
|
289
|
+
from,
|
|
290
|
+
level: level(q.level),
|
|
291
|
+
question: str(q.question, "question"),
|
|
292
|
+
reason: str(q.reason, "reason"),
|
|
293
|
+
...q.options ? { options: q.options } : {},
|
|
294
|
+
urgency: urgency(q.urgency)
|
|
295
|
+
};
|
|
265
296
|
};
|
|
266
|
-
const
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
return
|
|
297
|
+
const addQuestion = (raw, fallbackFrom, decision) => {
|
|
298
|
+
const q = normalizeQuestion(raw, fallbackFrom);
|
|
299
|
+
const existing = questions.find((x) => x.id === q.id);
|
|
300
|
+
if (existing) return { question: existing, added: false };
|
|
301
|
+
const effectiveDecision = decision ?? (questionPolicy === "bubble" ? {
|
|
302
|
+
kind: "escalate",
|
|
303
|
+
to: "parent",
|
|
304
|
+
reason: "question policy bubbled to parent"
|
|
305
|
+
} : void 0);
|
|
306
|
+
const status = effectiveDecision?.kind === "answer" ? "answered" : effectiveDecision?.kind === "defer" ? "deferred" : effectiveDecision?.kind === "escalate" ? "escalated" : "open";
|
|
307
|
+
const record = {
|
|
308
|
+
...q,
|
|
309
|
+
status,
|
|
310
|
+
openedAt: Date.now(),
|
|
311
|
+
...effectiveDecision ? { decision: effectiveDecision } : {}
|
|
312
|
+
};
|
|
313
|
+
questions.push(record);
|
|
314
|
+
return { question: record, added: true };
|
|
315
|
+
};
|
|
316
|
+
const emitNewQuestion = async (record) => {
|
|
317
|
+
if (record.added) await opts.onEvent?.({ type: "question", question: record.question });
|
|
318
|
+
return record.question;
|
|
319
|
+
};
|
|
320
|
+
const decideQuestion = (questionId, decision) => {
|
|
321
|
+
const idx = questions.findIndex((q) => q.id === questionId);
|
|
322
|
+
if (idx < 0) throw new Error(`unknown questionId ${JSON.stringify(questionId)}`);
|
|
323
|
+
const prior = questions[idx];
|
|
324
|
+
const status = decision.kind === "answer" ? "answered" : decision.kind === "defer" ? "deferred" : "escalated";
|
|
325
|
+
const next = { ...prior, status, decision };
|
|
326
|
+
questions[idx] = next;
|
|
327
|
+
return next;
|
|
328
|
+
};
|
|
329
|
+
const blockingQuestionsForStop = () => {
|
|
330
|
+
if (questionPolicy === "auto" || questionPolicy === "bubble") return [];
|
|
331
|
+
return questions.filter((q) => {
|
|
332
|
+
const blocking = q.urgency === "blocks-step" || q.urgency === "blocks-run";
|
|
333
|
+
if (!blocking) return false;
|
|
334
|
+
if (questionPolicy === "mustDecide") return q.status === "open";
|
|
335
|
+
return q.status !== "answered" && q.status !== "deferred";
|
|
336
|
+
});
|
|
270
337
|
};
|
|
271
338
|
const tools = [
|
|
272
339
|
{
|
|
273
340
|
name: "spawn_worker",
|
|
274
|
-
description:
|
|
341
|
+
description: "Start a worker the driver will drive. `profile` is the worker or another driver; `task` is what it should do. Reserves budget from the conserved pool and fails closed.",
|
|
275
342
|
inputSchema: {
|
|
276
343
|
type: "object",
|
|
277
344
|
properties: {
|
|
278
|
-
profile: { description: "The worker/driver profile to run
|
|
345
|
+
profile: { description: "The worker/driver profile to run." },
|
|
279
346
|
task: { description: "The task the worker should perform." },
|
|
280
347
|
label: { type: "string", description: "Optional trace label." }
|
|
281
348
|
},
|
|
@@ -293,7 +360,7 @@ function createCoordinationTools(opts) {
|
|
|
293
360
|
},
|
|
294
361
|
{
|
|
295
362
|
name: "observe_worker",
|
|
296
|
-
description: "Inspect a worker
|
|
363
|
+
description: "Inspect a worker status, spend, and settled output artifact when available.",
|
|
297
364
|
inputSchema: { type: "object", properties: { workerId: idArg }, required: ["workerId"] },
|
|
298
365
|
handler: async (raw) => {
|
|
299
366
|
const id = str(obj(raw).workerId, "workerId");
|
|
@@ -310,7 +377,7 @@ function createCoordinationTools(opts) {
|
|
|
310
377
|
},
|
|
311
378
|
{
|
|
312
379
|
name: "steer_worker",
|
|
313
|
-
description: "
|
|
380
|
+
description: "Deliver an out-of-band instruction to a running worker inbox.",
|
|
314
381
|
inputSchema: {
|
|
315
382
|
type: "object",
|
|
316
383
|
properties: {
|
|
@@ -329,23 +396,124 @@ function createCoordinationTools(opts) {
|
|
|
329
396
|
},
|
|
330
397
|
{
|
|
331
398
|
name: "await_next",
|
|
332
|
-
description:
|
|
399
|
+
description: "Wait for the next spawned worker to settle. Returns { idle: true } when none are live.",
|
|
333
400
|
inputSchema: { type: "object", properties: {} },
|
|
334
401
|
handler: async () => {
|
|
335
402
|
const s = await opts.scope.next();
|
|
336
403
|
if (!s) return { idle: true };
|
|
337
404
|
const w = recordSettled(s);
|
|
338
|
-
return w.status === "done" ? {
|
|
405
|
+
return w.status === "done" ? {
|
|
406
|
+
settled: w.id,
|
|
407
|
+
status: "done",
|
|
408
|
+
score: w.score,
|
|
409
|
+
valid: w.valid,
|
|
410
|
+
outRef: w.outRef
|
|
411
|
+
} : { settled: w.id, status: "down", reason: w.reason };
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
name: "list_questions",
|
|
416
|
+
description: "List questions raised by workers, drivers, or analysts. Blocking stop behavior follows questionPolicy.",
|
|
417
|
+
inputSchema: { type: "object", properties: {} },
|
|
418
|
+
handler: () => Promise.resolve({ questions })
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
name: "answer_question",
|
|
422
|
+
description: "Record an answer, deferral, or escalation for a loop question.",
|
|
423
|
+
inputSchema: {
|
|
424
|
+
type: "object",
|
|
425
|
+
properties: {
|
|
426
|
+
questionId: { type: "string" },
|
|
427
|
+
answer: { type: "string" },
|
|
428
|
+
by: { type: "string", description: 'Node id or "user".' },
|
|
429
|
+
deferReason: { type: "string" },
|
|
430
|
+
escalateTo: { type: "string", enum: ["parent", "user"] },
|
|
431
|
+
escalateReason: { type: "string" }
|
|
432
|
+
},
|
|
433
|
+
required: ["questionId"]
|
|
434
|
+
},
|
|
435
|
+
handler: (raw) => {
|
|
436
|
+
const a = obj(raw);
|
|
437
|
+
const questionId = str(a.questionId, "questionId");
|
|
438
|
+
if (typeof a.answer === "string" && a.answer.length > 0) {
|
|
439
|
+
return Promise.resolve({
|
|
440
|
+
question: decideQuestion(questionId, {
|
|
441
|
+
kind: "answer",
|
|
442
|
+
answer: a.answer,
|
|
443
|
+
by: typeof a.by === "string" && a.by.length > 0 ? a.by : "user"
|
|
444
|
+
})
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
if (typeof a.deferReason === "string" && a.deferReason.length > 0) {
|
|
448
|
+
return Promise.resolve({
|
|
449
|
+
question: decideQuestion(questionId, {
|
|
450
|
+
kind: "defer",
|
|
451
|
+
reason: a.deferReason
|
|
452
|
+
})
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
if (a.escalateTo === "parent" || a.escalateTo === "user") {
|
|
456
|
+
const escalateReason = typeof a.escalateReason === "string" && a.escalateReason.length > 0 ? a.escalateReason : "driver escalated";
|
|
457
|
+
return Promise.resolve({
|
|
458
|
+
question: decideQuestion(questionId, {
|
|
459
|
+
kind: "escalate",
|
|
460
|
+
to: a.escalateTo,
|
|
461
|
+
reason: escalateReason
|
|
462
|
+
})
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
throw new Error("answer_question: provide answer, deferReason, or escalateTo");
|
|
466
|
+
}
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
name: "ask_parent",
|
|
470
|
+
description: "Raise a question to the parent driver/Pi/user when this driver cannot decide.",
|
|
471
|
+
inputSchema: {
|
|
472
|
+
type: "object",
|
|
473
|
+
properties: {
|
|
474
|
+
from: { type: "string" },
|
|
475
|
+
level: { type: "string", enum: ["worker", "driver", "loop"] },
|
|
476
|
+
question: { type: "string" },
|
|
477
|
+
reason: { type: "string" },
|
|
478
|
+
urgency: { type: "string", enum: ["continue-without", "blocks-step", "blocks-run"] }
|
|
479
|
+
},
|
|
480
|
+
required: ["from", "level", "question", "reason", "urgency"]
|
|
481
|
+
},
|
|
482
|
+
handler: async (raw) => {
|
|
483
|
+
const a = obj(raw);
|
|
484
|
+
const from = str(a.from, "from");
|
|
485
|
+
const q = await emitNewQuestion(
|
|
486
|
+
addQuestion(
|
|
487
|
+
{
|
|
488
|
+
from,
|
|
489
|
+
level: level(a.level),
|
|
490
|
+
question: str(a.question, "question"),
|
|
491
|
+
reason: str(a.reason, "reason"),
|
|
492
|
+
urgency: urgency(a.urgency)
|
|
493
|
+
},
|
|
494
|
+
from,
|
|
495
|
+
{ kind: "escalate", to: "parent", reason: "asked parent" }
|
|
496
|
+
)
|
|
497
|
+
);
|
|
498
|
+
return { question: q };
|
|
339
499
|
}
|
|
340
500
|
},
|
|
341
501
|
{
|
|
342
502
|
name: "stop",
|
|
343
|
-
description: "Declare the run complete
|
|
503
|
+
description: "Declare the run complete.",
|
|
344
504
|
inputSchema: {
|
|
345
505
|
type: "object",
|
|
346
506
|
properties: { reason: { type: "string", description: "Why you are stopping." } }
|
|
347
507
|
},
|
|
348
508
|
handler: (raw) => {
|
|
509
|
+
const blocking = blockingQuestionsForStop();
|
|
510
|
+
if (blocking.length) {
|
|
511
|
+
return Promise.resolve({
|
|
512
|
+
stopped: false,
|
|
513
|
+
error: "unresolved-blocking-questions",
|
|
514
|
+
questions: blocking
|
|
515
|
+
});
|
|
516
|
+
}
|
|
349
517
|
stopped = true;
|
|
350
518
|
const r = obj(raw).reason;
|
|
351
519
|
reason = typeof r === "string" ? r : void 0;
|
|
@@ -353,22 +521,20 @@ function createCoordinationTools(opts) {
|
|
|
353
521
|
}
|
|
354
522
|
}
|
|
355
523
|
];
|
|
356
|
-
if (opts.
|
|
524
|
+
if (opts.analysts) {
|
|
357
525
|
tools.push({
|
|
358
526
|
name: "list_analysts",
|
|
359
|
-
description: "List
|
|
527
|
+
description: "List trace-analyst lenses available to run over a settled worker.",
|
|
360
528
|
inputSchema: { type: "object", properties: {} },
|
|
361
|
-
handler: () => Promise.resolve({ analysts: opts.
|
|
529
|
+
handler: () => Promise.resolve({ analysts: opts.analysts?.kinds })
|
|
362
530
|
});
|
|
363
|
-
}
|
|
364
|
-
if (opts.runAnalyst) {
|
|
365
531
|
tools.push({
|
|
366
532
|
name: "run_analyst",
|
|
367
|
-
description: "Apply an analyst
|
|
533
|
+
description: "Apply an analyst lens to a settled worker trace.",
|
|
368
534
|
inputSchema: {
|
|
369
535
|
type: "object",
|
|
370
536
|
properties: {
|
|
371
|
-
kind: { type: "string", description: "The analyst kind id
|
|
537
|
+
kind: { type: "string", description: "The analyst kind id." },
|
|
372
538
|
workerId: idArg
|
|
373
539
|
},
|
|
374
540
|
required: ["kind", "workerId"]
|
|
@@ -381,11 +547,17 @@ function createCoordinationTools(opts) {
|
|
|
381
547
|
if (!node.outRef)
|
|
382
548
|
return { error: `worker ${JSON.stringify(id)} has not settled \u2014 no trace to analyze yet` };
|
|
383
549
|
const trace = await opts.blobs.get(node.outRef);
|
|
384
|
-
return { findings: await opts.
|
|
550
|
+
return { findings: await opts.analysts?.run(str(a.kind, "kind"), trace) };
|
|
385
551
|
}
|
|
386
552
|
});
|
|
387
553
|
}
|
|
388
|
-
return {
|
|
554
|
+
return {
|
|
555
|
+
tools,
|
|
556
|
+
isStopped: () => stopped,
|
|
557
|
+
stopReason: () => reason,
|
|
558
|
+
settled: () => ledger,
|
|
559
|
+
questions: () => questions
|
|
560
|
+
};
|
|
389
561
|
}
|
|
390
562
|
export {
|
|
391
563
|
DELEGATE_CODE_DESCRIPTION,
|
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/tools/checks.ts","../../src/mcp/tools/coordination.ts"],"sourcesContent":["/**\n * @experimental\n *\n * The trace-analyst KIND directory — the operator's lenses, as composable DATA.\n *\n * An analyst is not one question. A kind is ONE lens (completeness, correctness, policy, efficiency,\n * tool-use, …); each emits `AnalystFinding`s tagged by its `area`. The driver `list_analysts` to see\n * the menu, `run_analyst(kind, worker)` to apply a lens, and `define_analyst` to author a new one —\n * so at test time you compose the exact lenses a domain needs (maximum specificity), not one generic\n * reviewer. The kinds are data, the runner is generic, and the finding shape + firewall are reused\n * from agent-eval / the keystone — never re-derived.\n *\n * A kind here is a lightweight lens (`Check`); it is a deliberate SUBSET of agent-eval's full\n * `TraceAnalystKindSpec`, so a kind that needs the heavy agentic actor (sub-agent recursion, tools,\n * goldens) upgrades to `createTraceAnalystKind` without changing this directory's surface.\n */\n\nimport {\n type AnalystFinding,\n type AnalystSeverity,\n type EvidenceRef,\n makeFinding,\n} from '@tangle-network/agent-eval'\nimport { assertTraceDerivedFindings } from '../../runtime'\n\n// agent-eval's root entry exports the lift (`makeFinding`) + the `AnalystFinding`/`EvidenceRef` shapes\n// but NOT the raw-row validator / schema prompt (kind-factory-internal). We inline a minimal,\n// equivalent pair so a lens emits the SAME finding shape without reaching into an unstable internal.\nconst ANALYST_SEVERITIES = ['critical', 'high', 'medium', 'low', 'info'] as const\n\nconst FINDING_SCHEMA_PROMPT = [\n 'Each finding is a JSON object with these fields:',\n '- severity: one of \"critical\" | \"high\" | \"medium\" | \"low\" | \"info\"',\n '- claim: one-sentence statement',\n '- evidence_uri: REQUIRED, never blank — exactly one of \"span://<trace>/<span>\", \"artifact://<path>\",',\n ' or \"metric://<name>\"; ALWAYS cite a real id from the trace. No citable id ⇒ omit the finding.',\n '- evidence_excerpt?: a short quote from the cited evidence',\n '- confidence: number 0..1',\n '- rationale?: one sentence of reasoning',\n '- recommended_action?: a concrete imperative (\"Add ...\", \"Replace ...\", \"Stop ...\")',\n 'Emit an empty array when there is nothing to report. Never fabricate evidence.',\n].join('\\n')\n\ninterface RawRow {\n severity: AnalystSeverity\n claim: string\n evidence_uri: string\n confidence: number\n evidence_excerpt?: string\n rationale?: string\n recommended_action?: string\n subject?: string\n}\n\n/** Validate one raw finding row (the lightweight equivalent of agent-eval's `parseRawFinding`):\n * require a claim + a real trace evidence_uri; drop anything else. Returns null to discard. */\nfunction validateRawFinding(row: unknown): RawRow | null {\n if (!row || typeof row !== 'object') return null\n const r = row as Record<string, unknown>\n if (typeof r.claim !== 'string' || r.claim.length === 0) return null\n if (typeof r.evidence_uri !== 'string' || !/^(span|artifact|metric):\\/\\//.test(r.evidence_uri))\n return null\n const sev = (ANALYST_SEVERITIES as readonly string[]).includes(r.severity as string)\n ? (r.severity as AnalystSeverity)\n : 'medium'\n return {\n severity: sev,\n claim: r.claim,\n evidence_uri: r.evidence_uri,\n confidence: typeof r.confidence === 'number' ? r.confidence : 0.5,\n ...(typeof r.evidence_excerpt === 'string' ? { evidence_excerpt: r.evidence_excerpt } : {}),\n ...(typeof r.rationale === 'string' ? { rationale: r.rationale } : {}),\n ...(typeof r.recommended_action === 'string'\n ? { recommended_action: r.recommended_action }\n : {}),\n ...(typeof r.subject === 'string' ? { subject: r.subject } : {}),\n }\n}\n\n/** One lens — a composable analyst kind. Identity fields mirror `TraceAnalystKindSpec` so a kind is\n * upgradeable to the full agentic factory; `lookFor` is the lens question the actor applies. */\nexport interface Check {\n readonly id: string\n readonly description: string\n /** Coarse classification stamped on every finding this kind emits (the renderer groups by it). */\n readonly area: string\n readonly version: string\n /** The lens — what this analyst looks for in the trace. */\n readonly lookFor: string\n}\n\n/** The built-in lens directory. Domain-blind (about any agent trace); compose at test time. */\nexport const defaultChecks: Record<string, Check> = {\n completeness: {\n id: 'completeness',\n description: 'Required work the trace does not yet show done or verified.',\n area: 'failure-mode',\n version: '1',\n lookFor:\n 'every change the task requires that the trace does NOT yet show completed AND verified by a ' +\n 'tool result. One finding per missing/unverified requirement.',\n },\n correctness: {\n id: 'correctness',\n description: 'Tool calls that produced wrong, erroring, or contradicted results.',\n area: 'correctness',\n version: '1',\n lookFor:\n 'tool calls whose RESULT shows an error, a wrong value, or contradicts what the task required ' +\n '(e.g. set the wrong field, value did not take, an error was ignored).',\n },\n policy: {\n id: 'policy',\n description: 'Actions that violate a stated policy, constraint, or allow-list.',\n area: 'safety',\n version: '1',\n lookFor:\n 'actions in the trace that violate a policy/constraint stated in the task or system prompt ' +\n '(forbidden tool, missing approval, out-of-scope mutation, skipped precondition).',\n },\n efficiency: {\n id: 'efficiency',\n description: 'Wasted, redundant, or looping work.',\n area: 'cost',\n version: '1',\n lookFor:\n 'redundant or wasted actions — repeated identical calls, a stalled line retried the same way, ' +\n 'work that produced no progress toward the goal.',\n },\n 'tool-use': {\n id: 'tool-use',\n description: 'Malformed or misused tool calls.',\n area: 'tool-use',\n version: '1',\n lookFor:\n 'tool calls with malformed/invalid arguments, the wrong tool for the intent, or a tool used ' +\n 'against its contract — judged from the call + its result.',\n },\n}\n\n/** Lift validated raw rows into `AnalystFinding`s (agent-eval `makeFinding` stamps `finding_id`/\n * `produced_at`), then enforce the trace-derived firewall (selector ≠ judge). Pure — no LLM. */\nexport function liftFindings(kind: Check, rows: unknown[], producedAt: string): AnalystFinding[] {\n const findings: AnalystFinding[] = []\n for (const row of rows) {\n const raw = validateRawFinding(row)\n if (!raw) continue\n findings.push(\n makeFinding({\n analyst_id: kind.id,\n area: kind.area,\n severity: raw.severity,\n claim: raw.claim,\n confidence: raw.confidence,\n produced_at: producedAt,\n evidence_refs: evidenceRefs(raw.evidence_uri, raw.evidence_excerpt),\n ...(raw.rationale ? { rationale: raw.rationale } : {}),\n ...(raw.recommended_action ? { recommended_action: raw.recommended_action } : {}),\n ...(raw.subject ? { subject: raw.subject } : {}),\n metadata: { kind_version: kind.version },\n }),\n )\n }\n assertTraceDerivedFindings(findings) // throws if a finding cites judge/verdict/score evidence\n return findings\n}\n\n/** Map a raw `evidence_uri` (span:// | artifact:// | metric://<name>) to a typed `EvidenceRef`. A\n * metric ref carries the bare NAME (the firewall checks the metric name for judge/verdict/score —\n * so a finding that cites a judge metric is rejected as not trace-derived). */\nfunction evidenceRefs(uri: string, excerpt?: string): EvidenceRef[] {\n const scheme = uri.split('://', 1)[0]\n if (scheme === 'metric')\n return [\n { kind: 'metric', uri: uri.replace(/^metric:\\/\\//, ''), ...(excerpt ? { excerpt } : {}) },\n ]\n const kind: EvidenceRef['kind'] = scheme === 'span' ? 'span' : 'artifact'\n return [{ kind, uri, ...(excerpt ? { excerpt } : {}) }]\n}\n\n/** Render a worker's trace (tool calls + results) into the text an analyst lens reads. Generic over\n * the trace shape: a `{ messages }` conversation, a bare message array, else stringified. */\nexport function renderTrace(trace: unknown): string {\n const messages = Array.isArray(trace)\n ? trace\n : trace &&\n typeof trace === 'object' &&\n Array.isArray((trace as { messages?: unknown[] }).messages)\n ? (trace as { messages: unknown[] }).messages\n : undefined\n if (!messages) return JSON.stringify(trace ?? {}).slice(0, 8000)\n return messages\n .map((m) => {\n const r = m as {\n role?: string\n content?: unknown\n tool_calls?: Array<{ function?: { name?: string; arguments?: string } }>\n }\n if (r.role === 'tool') return `RESULT ${String(r.content).slice(0, 300)}`\n const calls = r.tool_calls\n ?.map((c) => `${c.function?.name}(${c.function?.arguments})`)\n .join(', ')\n return calls ? `CALL ${calls}` : `SAY ${String(r.content ?? '').slice(0, 200)}`\n })\n .join('\\n')\n .slice(0, 8000)\n}\n\nexport interface CheckRunnerOptions {\n routerBaseUrl: string\n routerKey: string\n model: string\n /** Test/override seam — replace the LLM call. Default: a router chat completion. */\n chat?: (system: string, user: string) => Promise<string>\n}\n\n/** Run ONE lens over a trace → findings. Generic over any kind: prompt = the lens + the agent-eval\n * finding schema; the model's JSON array is parsed (`parseRawFinding`), lifted, and firewalled. */\nexport async function runCheck(\n kind: Check,\n trace: unknown,\n opts: CheckRunnerOptions,\n producedAt: string,\n): Promise<AnalystFinding[]> {\n const sys =\n `You are a trace analyst applying ONE lens: look for ${kind.lookFor}\\n\\n` +\n `${FINDING_SCHEMA_PROMPT}\\n\\nReturn ONLY a fenced \\`\\`\\`json array of finding objects (possibly empty).`\n const user = `WORKER TRACE:\\n${renderTrace(trace)}\\n\\nApply your lens and emit the findings array.`\n const chat = opts.chat ?? defaultChat(opts)\n const content = await chat(sys, user)\n const match = content.match(/```(?:json)?\\s*([\\s\\S]*?)```/)\n let rows: unknown[] = []\n try {\n const parsed = JSON.parse((match?.[1] ?? content).trim())\n rows = Array.isArray(parsed)\n ? parsed\n : Array.isArray((parsed as { findings?: unknown[] })?.findings)\n ? (parsed as { findings: unknown[] }).findings\n : []\n } catch {\n rows = []\n }\n return liftFindings(kind, rows, producedAt)\n}\n\nfunction defaultChat(opts: CheckRunnerOptions): (system: string, user: string) => Promise<string> {\n return async (system, user) => {\n const res = await fetch(`${opts.routerBaseUrl.replace(/\\/$/, '')}/chat/completions`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${opts.routerKey}` },\n body: JSON.stringify({\n model: opts.model,\n messages: [\n { role: 'system', content: system },\n { role: 'user', content: user },\n ],\n temperature: 0.3,\n }),\n })\n if (!res.ok) throw new Error(`analyst router ${res.status}`)\n const data = (await res.json()) as { choices?: Array<{ message?: { content?: string } }> }\n return data.choices?.[0]?.message?.content ?? ''\n }\n}\n\n/** Build a `run_analyst` runner over a kind directory — the seam the operator toolbox is wired with.\n * Returns the findings, or a typed error for an unknown kind. `producedAt` is passed in (the runtime\n * forbids `Date.now` in replay-safe paths; the caller stamps it). */\nexport function makeCheckRunner(\n kinds: Record<string, Check>,\n opts: CheckRunnerOptions,\n): (\n kindId: string,\n trace: unknown,\n producedAt: string,\n) => Promise<AnalystFinding[] | { error: string }> {\n return async (kindId, trace, producedAt) => {\n const kind = kinds[kindId]\n if (!kind)\n return {\n error: `unknown analyst kind ${JSON.stringify(kindId)} (have: ${Object.keys(kinds).join(', ')})`,\n }\n return runCheck(kind, trace, opts, producedAt)\n }\n}\n","/**\n * @experimental\n *\n * COORDINATION TOOLS — the verbs a parent agent uses to coordinate the child agents it spawns,\n * exposed as MCP tools backed by a live keystone `Scope`. This is `Scope`-as-MCP.\n *\n * NOT a transport. The cross-org message bus (`docs/agent-bus-protocol.md`) and the SDK's\n * `dispatchPrompt`/`SessionMessage` are the *transports* the `steer` verb rides; THIS file is the\n * verb set (the API). One verb, several bindings: in-process `Scope.send` is a direct call; across\n * sandboxes it rides SDK session-messaging; across orgs it rides the agent-bus protocol.\n *\n * spawn_worker → scope.spawn (budget-bounded, fail-closed — equal-k holds even for an LLM driver)\n * await_next → scope.next (THE wake event: block until the next spawned child settles)\n * observe_worker→ scope.view + the result blob (a child's status, spend, and settled output)\n * steer_worker → scope.send (deliver a next-instruction / interrupt to a RUNNING child)\n * list_analysts → the check menu (the trace lenses the agent can apply — see checks.ts)\n * run_analyst → apply a CHECK (run a kind over a child's trace → trace-derived findings)\n * stop → declare the run complete (the terminal move)\n *\n * The check verbs are present only when the check seam (`analystKinds` + `runAnalyst`) is wired —\n * an agent that does not review traces (a pure dispatcher) omits them. A trace check is a SEPARATE\n * lens (selector ≠ judge: it reads the trace, never the score); authoring a NEW check at runtime is\n * the next addition.\n *\n * A worker the driver spawns may itself carry the driver profile — `spawn_worker` does not care what\n * the profile is, so drivers-of-drivers fall out for free (each sub-driver gets its own sub-scope,\n * bounded by `maxDepth` + the conserved pool).\n */\n\nimport type {\n Budget,\n ResultBlobStore,\n Scope,\n Settled,\n Agent as SuperviseAgent,\n} from '../../runtime'\nimport type { McpToolDescriptor } from '../server'\n\n/** A worker the driver has drained via `await_next` — the operator's running ledger of settled\n * workers + their DEPLOYABLE verdict (the driver IS the selector, so it legitimately reads the\n * verdict; the analyst, which reads only the trace, is the separate selector≠judge lens). The\n * driver picks its deliverable from this ledger at `stop`. */\nexport interface SettledWorker {\n readonly id: string\n readonly status: 'done' | 'down'\n /** Deployable score in [0,1] from the worker's verdict (done only). */\n readonly score?: number\n /** Whether the deployable verdict passed (done only). */\n readonly valid?: boolean\n /** Result-blob pointer for the worker's output/trace (done only). */\n readonly outRef?: string\n /** Failure reason (down only). */\n readonly reason?: string\n}\n\n/** How a `spawn_worker` profile becomes a spawnable leaf `Agent`. The caller wires this (e.g. the\n * surface registry turns a profile into a shot executor) so the toolbox stays domain-blind. */\nexport type MakeWorkerAgent = (profile: unknown) => SuperviseAgent<unknown, unknown>\n\nexport interface CoordinationToolsOptions {\n /** The DRIVER's live scope — spawn/observe/steer all act on this. */\n readonly scope: Scope<unknown>\n /** Result blobs, so `observe_worker` can rehydrate a settled worker's output. */\n readonly blobs: ResultBlobStore\n /** Turn a spawn_worker `profile` into a leaf agent (registry-resolved on spawn). */\n readonly makeWorkerAgent: MakeWorkerAgent\n /** Per-worker conserved budget the driver reserves on each spawn. */\n readonly perWorker: Budget\n /** The analyst lens menu (for `list_analysts`) — id + one-line + area. Injected so the toolbox\n * stays domain-blind; wire it from `analyst-kinds.ts`'s directory. Omit to disable analyst tools. */\n readonly analystKinds?: ReadonlyArray<{ id: string; description: string; area: string }>\n /** Run a lens over a worker's trace → findings (or a typed error). Wire it from\n * `makeCheckRunner(...)`. `run_analyst` fetches the worker's settled output and passes it here. */\n readonly runAnalyst?: (kindId: string, trace: unknown) => Promise<unknown>\n}\n\nexport interface CoordinationTools {\n /** MCP tools — register on an `McpServer`, or call the handlers directly in-process. */\n readonly tools: McpToolDescriptor[]\n /** True once the driver called `stop` — the operator loop reads this to terminate. */\n isStopped(): boolean\n /** The reason passed to `stop`, if any. */\n stopReason(): string | undefined\n /** The workers drained so far via `await_next` (the driver's selection ledger). */\n settled(): ReadonlyArray<SettledWorker>\n}\n\nconst idArg = { type: 'string', description: 'The workerId returned by spawn_worker.' } as const\n\n/** Build the operator toolbox over a live scope. The tools are the driver's verbs; their handlers\n * are thin wrappers over the keystone (spawn/view/send), so the budget/journal/abort discipline of\n * the Supervisor applies to a sandbox driver exactly as to the in-process one. */\nexport function createCoordinationTools(opts: CoordinationToolsOptions): CoordinationTools {\n let stopped = false\n let reason: string | undefined\n const ledger: SettledWorker[] = []\n\n const recordSettled = (s: Settled<unknown>): SettledWorker => {\n const w: SettledWorker =\n s.kind === 'done'\n ? {\n id: s.handle.id,\n status: 'done',\n score: s.verdict?.score ?? 0,\n valid: s.verdict?.valid ?? false,\n outRef: s.outRef,\n }\n : { id: s.handle.id, status: 'down', reason: s.reason }\n ledger.push(w)\n return w\n }\n\n const str = (v: unknown, field: string): string => {\n if (typeof v !== 'string' || v.length === 0)\n throw new Error(`operator toolbox: \"${field}\" must be a non-empty string`)\n return v\n }\n const obj = (raw: unknown): Record<string, unknown> => {\n if (!raw || typeof raw !== 'object')\n throw new Error('operator toolbox: arguments must be an object')\n return raw as Record<string, unknown>\n }\n\n const tools: McpToolDescriptor[] = [\n {\n name: 'spawn_worker',\n description:\n 'Start a worker the operator will drive. `profile` is the worker (or another DRIVER — ' +\n 'drivers-of-drivers are allowed); `task` is what it should do. Reserves the worker’s budget ' +\n 'from the conserved pool and FAILS CLOSED when the pool is dry — so spawning \"at will\" is ' +\n 'bounded by the budget. Returns { workerId } or { error: \"budget-exhausted\" | \"depth-exceeded\" }.',\n inputSchema: {\n type: 'object',\n properties: {\n profile: { description: 'The worker/driver profile to run (passed to makeWorkerAgent).' },\n task: { description: 'The task the worker should perform.' },\n label: { type: 'string', description: 'Optional trace label.' },\n },\n required: ['profile', 'task'],\n },\n handler: (raw) => {\n const a = obj(raw)\n const agent = opts.makeWorkerAgent(a.profile)\n const res = opts.scope.spawn(agent, a.task, {\n budget: opts.perWorker,\n label: typeof a.label === 'string' ? a.label : 'worker',\n })\n return Promise.resolve(res.ok ? { workerId: res.handle.id } : { error: res.reason })\n },\n },\n {\n name: 'observe_worker',\n description:\n 'Inspect a worker you are driving: its live status + conserved spend, and — once it has ' +\n 'settled — its output artifact (rehydrated from the result blob). Use this to review work ' +\n 'before deciding your next move. (In-flight token-level trace is surfaced via the analyst, ' +\n 'not here.)',\n inputSchema: { type: 'object', properties: { workerId: idArg }, required: ['workerId'] },\n handler: async (raw) => {\n const id = str(obj(raw).workerId, 'workerId')\n const node = opts.scope.view.nodes.find((n) => n.id === id)\n if (!node) return { error: `unknown workerId ${JSON.stringify(id)}` }\n const output = node.outRef ? await opts.blobs.get(node.outRef) : undefined\n return {\n status: node.status,\n spent: node.spent,\n outRef: node.outRef ?? null,\n output: output ?? null,\n }\n },\n },\n {\n name: 'steer_worker',\n description:\n 'Steer a RUNNING worker out-of-band — deliver your next instruction / a course-correction / ' +\n 'an interrupt to its inbox. Returns { delivered } — false if the worker has finished or its ' +\n 'harness cannot be steered mid-flight (then spawn a fresh one or wait and re-observe).',\n inputSchema: {\n type: 'object',\n properties: {\n workerId: idArg,\n instruction: { type: 'string', description: 'What the worker should do next.' },\n },\n required: ['workerId', 'instruction'],\n },\n handler: (raw) => {\n const a = obj(raw)\n const delivered = opts.scope.send(str(a.workerId, 'workerId'), {\n steer: str(a.instruction, 'instruction'),\n })\n return Promise.resolve({ delivered })\n },\n },\n {\n name: 'await_next',\n description:\n 'Wait for the next worker you spawned to FINISH, then read its deployable verdict. This is ' +\n 'how you advance: spawn one or more workers, then call await_next to block until the next ' +\n 'one settles. Returns { settled: workerId, status: \"done\"|\"down\", score, valid } for a ' +\n 'finished worker, or { idle: true } when no worker is still running (then spawn more or stop). ' +\n 'Workers run concurrently — spawn a batch, then await_next repeatedly to collect them.',\n inputSchema: { type: 'object', properties: {} },\n handler: async () => {\n const s = await opts.scope.next()\n if (!s) return { idle: true }\n const w = recordSettled(s)\n return w.status === 'done'\n ? { settled: w.id, status: 'done', score: w.score, valid: w.valid }\n : { settled: w.id, status: 'down', reason: w.reason }\n },\n },\n {\n name: 'stop',\n description:\n 'Declare the run complete — every required change is made and verified. The terminal move.',\n inputSchema: {\n type: 'object',\n properties: { reason: { type: 'string', description: 'Why you are stopping.' } },\n },\n handler: (raw) => {\n stopped = true\n const r = obj(raw).reason\n reason = typeof r === 'string' ? r : undefined\n return Promise.resolve({ stopped: true })\n },\n },\n ]\n\n // list_analysts / run_analyst — present only when the analyst seam is wired. The driver picks a\n // kind from the menu and applies it to a worker it is driving; findings are trace-derived (the\n // firewall lives in the runner). (define_analyst — authoring a NEW kind at runtime — is deferred.)\n if (opts.analystKinds) {\n tools.push({\n name: 'list_analysts',\n description:\n 'List the trace-analyst lenses available to run over a worker — id, what each looks for, and its area.',\n inputSchema: { type: 'object', properties: {} },\n handler: () => Promise.resolve({ analysts: opts.analystKinds }),\n })\n }\n if (opts.runAnalyst) {\n tools.push({\n name: 'run_analyst',\n description:\n 'Apply an analyst LENS to a worker you are driving — run `kind` over the worker’s trace and ' +\n 'return its findings (trace-derived, never score-derived). Use `list_analysts` for the menu; ' +\n 'run several lenses to triangulate. The worker must have settled (its trace is read from its output).',\n inputSchema: {\n type: 'object',\n properties: {\n kind: { type: 'string', description: 'The analyst kind id (see list_analysts).' },\n workerId: idArg,\n },\n required: ['kind', 'workerId'],\n },\n handler: async (raw) => {\n const a = obj(raw)\n const id = str(a.workerId, 'workerId')\n const node = opts.scope.view.nodes.find((n) => n.id === id)\n if (!node) return { error: `unknown workerId ${JSON.stringify(id)}` }\n if (!node.outRef)\n return { error: `worker ${JSON.stringify(id)} has not settled — no trace to analyze yet` }\n const trace = await opts.blobs.get(node.outRef)\n return { findings: await opts.runAnalyst?.(str(a.kind, 'kind'), trace) }\n },\n })\n }\n\n return { tools, isStopped: () => stopped, stopReason: () => reason, settled: () => ledger }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/tools/checks.ts","../../src/mcp/tools/coordination.ts"],"sourcesContent":["/**\n * @experimental\n *\n * The trace-analyst KIND directory — the operator's lenses, as composable DATA.\n *\n * An analyst is not one question. A kind is ONE lens (completeness, correctness, policy, efficiency,\n * tool-use, …); each emits `AnalystFinding`s tagged by its `area`. The driver `list_analysts` to see\n * the menu, `run_analyst(kind, worker)` to apply a lens, and `define_analyst` to author a new one —\n * so at test time you compose the exact lenses a domain needs (maximum specificity), not one generic\n * reviewer. The kinds are data, the runner is generic, and the finding shape + firewall are reused\n * from agent-eval / the keystone — never re-derived.\n *\n * A kind here is a lightweight lens (`Check`); it is a deliberate SUBSET of agent-eval's full\n * `TraceAnalystKindSpec`, so a kind that needs the heavy agentic actor (sub-agent recursion, tools,\n * goldens) upgrades to `createTraceAnalystKind` without changing this directory's surface.\n */\n\nimport {\n type AnalystFinding,\n type AnalystSeverity,\n type EvidenceRef,\n makeFinding,\n} from '@tangle-network/agent-eval'\nimport { assertTraceDerivedFindings } from '../../runtime'\n\n// agent-eval's root entry exports the lift (`makeFinding`) + the `AnalystFinding`/`EvidenceRef` shapes\n// but NOT the raw-row validator / schema prompt (kind-factory-internal). We inline a minimal,\n// equivalent pair so a lens emits the SAME finding shape without reaching into an unstable internal.\nconst ANALYST_SEVERITIES = ['critical', 'high', 'medium', 'low', 'info'] as const\n\nconst FINDING_SCHEMA_PROMPT = [\n 'Each finding is a JSON object with these fields:',\n '- severity: one of \"critical\" | \"high\" | \"medium\" | \"low\" | \"info\"',\n '- claim: one-sentence statement',\n '- evidence_uri: REQUIRED, never blank — exactly one of \"span://<trace>/<span>\", \"artifact://<path>\",',\n ' or \"metric://<name>\"; ALWAYS cite a real id from the trace. No citable id ⇒ omit the finding.',\n '- evidence_excerpt?: a short quote from the cited evidence',\n '- confidence: number 0..1',\n '- rationale?: one sentence of reasoning',\n '- recommended_action?: a concrete imperative (\"Add ...\", \"Replace ...\", \"Stop ...\")',\n 'Emit an empty array when there is nothing to report. Never fabricate evidence.',\n].join('\\n')\n\ninterface RawRow {\n severity: AnalystSeverity\n claim: string\n evidence_uri: string\n confidence: number\n evidence_excerpt?: string\n rationale?: string\n recommended_action?: string\n subject?: string\n}\n\n/** Validate one raw finding row (the lightweight equivalent of agent-eval's `parseRawFinding`):\n * require a claim + a real trace evidence_uri; drop anything else. Returns null to discard. */\nfunction validateRawFinding(row: unknown): RawRow | null {\n if (!row || typeof row !== 'object') return null\n const r = row as Record<string, unknown>\n if (typeof r.claim !== 'string' || r.claim.length === 0) return null\n if (typeof r.evidence_uri !== 'string' || !/^(span|artifact|metric):\\/\\//.test(r.evidence_uri))\n return null\n const sev = (ANALYST_SEVERITIES as readonly string[]).includes(r.severity as string)\n ? (r.severity as AnalystSeverity)\n : 'medium'\n return {\n severity: sev,\n claim: r.claim,\n evidence_uri: r.evidence_uri,\n confidence: typeof r.confidence === 'number' ? r.confidence : 0.5,\n ...(typeof r.evidence_excerpt === 'string' ? { evidence_excerpt: r.evidence_excerpt } : {}),\n ...(typeof r.rationale === 'string' ? { rationale: r.rationale } : {}),\n ...(typeof r.recommended_action === 'string'\n ? { recommended_action: r.recommended_action }\n : {}),\n ...(typeof r.subject === 'string' ? { subject: r.subject } : {}),\n }\n}\n\n/** One lens — a composable analyst kind. Identity fields mirror `TraceAnalystKindSpec` so a kind is\n * upgradeable to the full agentic factory; `lookFor` is the lens question the actor applies. */\nexport interface Check {\n readonly id: string\n readonly description: string\n /** Coarse classification stamped on every finding this kind emits (the renderer groups by it). */\n readonly area: string\n readonly version: string\n /** The lens — what this analyst looks for in the trace. */\n readonly lookFor: string\n}\n\n/** The built-in lens directory. Domain-blind (about any agent trace); compose at test time. */\nexport const defaultChecks: Record<string, Check> = {\n completeness: {\n id: 'completeness',\n description: 'Required work the trace does not yet show done or verified.',\n area: 'failure-mode',\n version: '1',\n lookFor:\n 'every change the task requires that the trace does NOT yet show completed AND verified by a ' +\n 'tool result. One finding per missing/unverified requirement.',\n },\n correctness: {\n id: 'correctness',\n description: 'Tool calls that produced wrong, erroring, or contradicted results.',\n area: 'correctness',\n version: '1',\n lookFor:\n 'tool calls whose RESULT shows an error, a wrong value, or contradicts what the task required ' +\n '(e.g. set the wrong field, value did not take, an error was ignored).',\n },\n policy: {\n id: 'policy',\n description: 'Actions that violate a stated policy, constraint, or allow-list.',\n area: 'safety',\n version: '1',\n lookFor:\n 'actions in the trace that violate a policy/constraint stated in the task or system prompt ' +\n '(forbidden tool, missing approval, out-of-scope mutation, skipped precondition).',\n },\n efficiency: {\n id: 'efficiency',\n description: 'Wasted, redundant, or looping work.',\n area: 'cost',\n version: '1',\n lookFor:\n 'redundant or wasted actions — repeated identical calls, a stalled line retried the same way, ' +\n 'work that produced no progress toward the goal.',\n },\n 'tool-use': {\n id: 'tool-use',\n description: 'Malformed or misused tool calls.',\n area: 'tool-use',\n version: '1',\n lookFor:\n 'tool calls with malformed/invalid arguments, the wrong tool for the intent, or a tool used ' +\n 'against its contract — judged from the call + its result.',\n },\n}\n\n/** Lift validated raw rows into `AnalystFinding`s (agent-eval `makeFinding` stamps `finding_id`/\n * `produced_at`), then enforce the trace-derived firewall (selector ≠ judge). Pure — no LLM. */\nexport function liftFindings(kind: Check, rows: unknown[], producedAt: string): AnalystFinding[] {\n const findings: AnalystFinding[] = []\n for (const row of rows) {\n const raw = validateRawFinding(row)\n if (!raw) continue\n findings.push(\n makeFinding({\n analyst_id: kind.id,\n area: kind.area,\n severity: raw.severity,\n claim: raw.claim,\n confidence: raw.confidence,\n produced_at: producedAt,\n evidence_refs: evidenceRefs(raw.evidence_uri, raw.evidence_excerpt),\n ...(raw.rationale ? { rationale: raw.rationale } : {}),\n ...(raw.recommended_action ? { recommended_action: raw.recommended_action } : {}),\n ...(raw.subject ? { subject: raw.subject } : {}),\n metadata: { kind_version: kind.version },\n }),\n )\n }\n assertTraceDerivedFindings(findings) // throws if a finding cites judge/verdict/score evidence\n return findings\n}\n\n/** Map a raw `evidence_uri` (span:// | artifact:// | metric://<name>) to a typed `EvidenceRef`. A\n * metric ref carries the bare NAME (the firewall checks the metric name for judge/verdict/score —\n * so a finding that cites a judge metric is rejected as not trace-derived). */\nfunction evidenceRefs(uri: string, excerpt?: string): EvidenceRef[] {\n const scheme = uri.split('://', 1)[0]\n if (scheme === 'metric')\n return [\n { kind: 'metric', uri: uri.replace(/^metric:\\/\\//, ''), ...(excerpt ? { excerpt } : {}) },\n ]\n const kind: EvidenceRef['kind'] = scheme === 'span' ? 'span' : 'artifact'\n return [{ kind, uri, ...(excerpt ? { excerpt } : {}) }]\n}\n\n/** Render a worker's trace (tool calls + results) into the text an analyst lens reads. Generic over\n * the trace shape: a `{ messages }` conversation, a bare message array, else stringified. */\nexport function renderTrace(trace: unknown): string {\n const messages = Array.isArray(trace)\n ? trace\n : trace &&\n typeof trace === 'object' &&\n Array.isArray((trace as { messages?: unknown[] }).messages)\n ? (trace as { messages: unknown[] }).messages\n : undefined\n if (!messages) return JSON.stringify(trace ?? {}).slice(0, 8000)\n return messages\n .map((m) => {\n const r = m as {\n role?: string\n content?: unknown\n tool_calls?: Array<{ function?: { name?: string; arguments?: string } }>\n }\n if (r.role === 'tool') return `RESULT ${String(r.content).slice(0, 300)}`\n const calls = r.tool_calls\n ?.map((c) => `${c.function?.name}(${c.function?.arguments})`)\n .join(', ')\n return calls ? `CALL ${calls}` : `SAY ${String(r.content ?? '').slice(0, 200)}`\n })\n .join('\\n')\n .slice(0, 8000)\n}\n\nexport interface CheckRunnerOptions {\n routerBaseUrl: string\n routerKey: string\n model: string\n /** Test/override seam — replace the LLM call. Default: a router chat completion. */\n chat?: (system: string, user: string) => Promise<string>\n}\n\n/** Run ONE lens over a trace → findings. Generic over any kind: prompt = the lens + the agent-eval\n * finding schema; the model's JSON array is parsed (`parseRawFinding`), lifted, and firewalled. */\nexport async function runCheck(\n kind: Check,\n trace: unknown,\n opts: CheckRunnerOptions,\n producedAt: string,\n): Promise<AnalystFinding[]> {\n const sys =\n `You are a trace analyst applying ONE lens: look for ${kind.lookFor}\\n\\n` +\n `${FINDING_SCHEMA_PROMPT}\\n\\nReturn ONLY a fenced \\`\\`\\`json array of finding objects (possibly empty).`\n const user = `WORKER TRACE:\\n${renderTrace(trace)}\\n\\nApply your lens and emit the findings array.`\n const chat = opts.chat ?? defaultChat(opts)\n const content = await chat(sys, user)\n const match = content.match(/```(?:json)?\\s*([\\s\\S]*?)```/)\n let rows: unknown[] = []\n try {\n const parsed = JSON.parse((match?.[1] ?? content).trim())\n rows = Array.isArray(parsed)\n ? parsed\n : Array.isArray((parsed as { findings?: unknown[] })?.findings)\n ? (parsed as { findings: unknown[] }).findings\n : []\n } catch {\n rows = []\n }\n return liftFindings(kind, rows, producedAt)\n}\n\nfunction defaultChat(opts: CheckRunnerOptions): (system: string, user: string) => Promise<string> {\n return async (system, user) => {\n const res = await fetch(`${opts.routerBaseUrl.replace(/\\/$/, '')}/chat/completions`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${opts.routerKey}` },\n body: JSON.stringify({\n model: opts.model,\n messages: [\n { role: 'system', content: system },\n { role: 'user', content: user },\n ],\n temperature: 0.3,\n }),\n })\n if (!res.ok) throw new Error(`analyst router ${res.status}`)\n const data = (await res.json()) as { choices?: Array<{ message?: { content?: string } }> }\n return data.choices?.[0]?.message?.content ?? ''\n }\n}\n\n/**\n * Build a `run_analyst` runner over a kind directory.\n * Returns findings, or a typed error for an unknown kind. `producedAt` is\n * passed in because replay-safe paths must not read `Date.now`.\n */\nexport function makeCheckRunner(\n kinds: Record<string, Check>,\n opts: CheckRunnerOptions,\n): (\n kindId: string,\n trace: unknown,\n producedAt: string,\n) => Promise<AnalystFinding[] | { error: string }> {\n return async (kindId, trace, producedAt) => {\n const kind = kinds[kindId]\n if (!kind)\n return {\n error: `unknown analyst kind ${JSON.stringify(kindId)} (have: ${Object.keys(kinds).join(', ')})`,\n }\n return runCheck(kind, trace, opts, producedAt)\n }\n}\n","/**\n * @experimental\n *\n * MCP binding for a live `Scope`. A sandbox driver gets the same small verbs\n * the in-process driver has: spawn, observe, await, steer, ask/answer, analyze,\n * and stop. Settled outputs remain Scope artifacts; product code can project\n * them into any UI/report envelope it needs.\n */\n\nimport type {\n Budget,\n ResultBlobStore,\n Scope,\n Settled,\n Agent as SuperviseAgent,\n} from '../../runtime'\nimport type { McpToolDescriptor } from '../server'\n\n/** A worker the driver has drained via `await_next`. */\nexport interface SettledWorker {\n readonly id: string\n readonly status: 'done' | 'down'\n readonly score?: number\n readonly valid?: boolean\n readonly outRef?: string\n readonly reason?: string\n}\n\nexport type QuestionLevel = 'worker' | 'driver' | 'loop'\nexport type QuestionUrgency = 'continue-without' | 'blocks-step' | 'blocks-run'\n\nexport interface QuestionOption {\n readonly label: string\n readonly tradeoff: string\n}\n\nexport interface Question {\n readonly id: string\n readonly from: string\n readonly level: QuestionLevel\n readonly question: string\n readonly reason: string\n readonly urgency: QuestionUrgency\n readonly options?: ReadonlyArray<QuestionOption>\n}\n\nexport type QuestionDecision =\n | { readonly kind: 'answer'; readonly answer: string; readonly by: string }\n | { readonly kind: 'defer'; readonly reason: string }\n | { readonly kind: 'escalate'; readonly to: 'parent' | 'user' | string; readonly reason: string }\n\nexport interface QuestionRecord extends Question {\n readonly status: 'open' | 'answered' | 'deferred' | 'escalated'\n readonly decision?: QuestionDecision\n readonly openedAt: number\n}\n\ntype QuestionInput = Omit<Question, 'id'> & { readonly id?: string }\nexport type QuestionPolicy = 'auto' | 'mustDecide' | 'bubble' | 'failClosed'\n\nexport interface AnalystRegistry {\n readonly kinds: ReadonlyArray<{ id: string; description: string; area: string }>\n readonly run: (kindId: string, trace: unknown) => Promise<unknown>\n}\n\nexport type CoordinationEvent = { readonly type: 'question'; readonly question: QuestionRecord }\n\nexport type MakeWorkerAgent = (profile: unknown) => SuperviseAgent<unknown, unknown>\n\nexport interface CoordinationToolsOptions {\n readonly scope: Scope<unknown>\n readonly blobs: ResultBlobStore\n readonly makeWorkerAgent: MakeWorkerAgent\n readonly perWorker: Budget\n readonly analysts?: AnalystRegistry\n readonly onEvent?: (event: CoordinationEvent) => void | Promise<void>\n readonly questionPolicy?: QuestionPolicy\n}\n\nexport interface CoordinationTools {\n readonly tools: McpToolDescriptor[]\n isStopped(): boolean\n stopReason(): string | undefined\n settled(): ReadonlyArray<SettledWorker>\n questions(): ReadonlyArray<QuestionRecord>\n}\n\nconst idArg = { type: 'string', description: 'The workerId returned by spawn_worker.' } as const\n\n/** Build the driver's MCP tools over a live scope. */\nexport function createCoordinationTools(opts: CoordinationToolsOptions): CoordinationTools {\n let stopped = false\n let reason: string | undefined\n let questionSeq = 0\n const ledger: SettledWorker[] = []\n const questions: QuestionRecord[] = []\n const questionPolicy = opts.questionPolicy ?? 'auto'\n\n const str = (v: unknown, field: string): string => {\n if (typeof v !== 'string' || v.length === 0)\n throw new Error(`coordination tools: \"${field}\" must be a non-empty string`)\n return v\n }\n const obj = (raw: unknown): Record<string, unknown> => {\n if (!raw || typeof raw !== 'object')\n throw new Error('coordination tools: arguments must be an object')\n return raw as Record<string, unknown>\n }\n const level = (v: unknown): Question['level'] => {\n if (v === 'worker' || v === 'driver' || v === 'loop') return v\n throw new Error('coordination tools: \"level\" must be worker, driver, or loop')\n }\n const urgency = (v: unknown): Question['urgency'] => {\n if (v === 'continue-without' || v === 'blocks-step' || v === 'blocks-run') return v\n throw new Error(\n 'coordination tools: \"urgency\" must be continue-without, blocks-step, or blocks-run',\n )\n }\n\n const recordSettled = (s: Settled<unknown>): SettledWorker => {\n const w: SettledWorker =\n s.kind === 'done'\n ? {\n id: s.handle.id,\n status: 'done',\n score: s.verdict?.score ?? 0,\n valid: s.verdict?.valid ?? false,\n outRef: s.outRef,\n }\n : { id: s.handle.id, status: 'down', reason: s.reason }\n ledger.push(w)\n return w\n }\n\n const nextQuestionId = (from: string): string => `${from}:q${questionSeq++}`\n const normalizeQuestion = (q: QuestionInput, fallbackFrom: string): Question => {\n const from = str(q.from ?? fallbackFrom, 'from')\n return {\n id: typeof q.id === 'string' && q.id.length > 0 ? q.id : nextQuestionId(from),\n from,\n level: level(q.level),\n question: str(q.question, 'question'),\n reason: str(q.reason, 'reason'),\n ...(q.options ? { options: q.options } : {}),\n urgency: urgency(q.urgency),\n }\n }\n const addQuestion = (\n raw: QuestionInput,\n fallbackFrom: string,\n decision?: QuestionDecision,\n ): { question: QuestionRecord; added: boolean } => {\n const q = normalizeQuestion(raw, fallbackFrom)\n const existing = questions.find((x) => x.id === q.id)\n if (existing) return { question: existing, added: false }\n const effectiveDecision =\n decision ??\n (questionPolicy === 'bubble'\n ? ({\n kind: 'escalate',\n to: 'parent',\n reason: 'question policy bubbled to parent',\n } as const)\n : undefined)\n const status: QuestionRecord['status'] =\n effectiveDecision?.kind === 'answer'\n ? 'answered'\n : effectiveDecision?.kind === 'defer'\n ? 'deferred'\n : effectiveDecision?.kind === 'escalate'\n ? 'escalated'\n : 'open'\n const record: QuestionRecord = {\n ...q,\n status,\n openedAt: Date.now(),\n ...(effectiveDecision ? { decision: effectiveDecision } : {}),\n }\n questions.push(record)\n return { question: record, added: true }\n }\n const emitNewQuestion = async (record: {\n question: QuestionRecord\n added: boolean\n }): Promise<QuestionRecord> => {\n if (record.added) await opts.onEvent?.({ type: 'question', question: record.question })\n return record.question\n }\n const decideQuestion = (questionId: string, decision: QuestionDecision): QuestionRecord => {\n const idx = questions.findIndex((q) => q.id === questionId)\n if (idx < 0) throw new Error(`unknown questionId ${JSON.stringify(questionId)}`)\n const prior = questions[idx] as QuestionRecord\n const status: QuestionRecord['status'] =\n decision.kind === 'answer' ? 'answered' : decision.kind === 'defer' ? 'deferred' : 'escalated'\n const next: QuestionRecord = { ...prior, status, decision }\n questions[idx] = next\n return next\n }\n const blockingQuestionsForStop = (): QuestionRecord[] => {\n if (questionPolicy === 'auto' || questionPolicy === 'bubble') return []\n return questions.filter((q) => {\n const blocking = q.urgency === 'blocks-step' || q.urgency === 'blocks-run'\n if (!blocking) return false\n if (questionPolicy === 'mustDecide') return q.status === 'open'\n return q.status !== 'answered' && q.status !== 'deferred'\n })\n }\n\n const tools: McpToolDescriptor[] = [\n {\n name: 'spawn_worker',\n description:\n 'Start a worker the driver will drive. `profile` is the worker or another driver; ' +\n '`task` is what it should do. Reserves budget from the conserved pool and fails closed.',\n inputSchema: {\n type: 'object',\n properties: {\n profile: { description: 'The worker/driver profile to run.' },\n task: { description: 'The task the worker should perform.' },\n label: { type: 'string', description: 'Optional trace label.' },\n },\n required: ['profile', 'task'],\n },\n handler: (raw) => {\n const a = obj(raw)\n const agent = opts.makeWorkerAgent(a.profile)\n const res = opts.scope.spawn(agent, a.task, {\n budget: opts.perWorker,\n label: typeof a.label === 'string' ? a.label : 'worker',\n })\n return Promise.resolve(res.ok ? { workerId: res.handle.id } : { error: res.reason })\n },\n },\n {\n name: 'observe_worker',\n description: 'Inspect a worker status, spend, and settled output artifact when available.',\n inputSchema: { type: 'object', properties: { workerId: idArg }, required: ['workerId'] },\n handler: async (raw) => {\n const id = str(obj(raw).workerId, 'workerId')\n const node = opts.scope.view.nodes.find((n) => n.id === id)\n if (!node) return { error: `unknown workerId ${JSON.stringify(id)}` }\n const output = node.outRef ? await opts.blobs.get(node.outRef) : undefined\n return {\n status: node.status,\n spent: node.spent,\n outRef: node.outRef ?? null,\n output: output ?? null,\n }\n },\n },\n {\n name: 'steer_worker',\n description: 'Deliver an out-of-band instruction to a running worker inbox.',\n inputSchema: {\n type: 'object',\n properties: {\n workerId: idArg,\n instruction: { type: 'string', description: 'What the worker should do next.' },\n },\n required: ['workerId', 'instruction'],\n },\n handler: (raw) => {\n const a = obj(raw)\n const delivered = opts.scope.send(str(a.workerId, 'workerId'), {\n steer: str(a.instruction, 'instruction'),\n })\n return Promise.resolve({ delivered })\n },\n },\n {\n name: 'await_next',\n description:\n 'Wait for the next spawned worker to settle. Returns { idle: true } when none are live.',\n inputSchema: { type: 'object', properties: {} },\n handler: async () => {\n const s = await opts.scope.next()\n if (!s) return { idle: true }\n const w = recordSettled(s)\n return w.status === 'done'\n ? {\n settled: w.id,\n status: 'done',\n score: w.score,\n valid: w.valid,\n outRef: w.outRef,\n }\n : { settled: w.id, status: 'down', reason: w.reason }\n },\n },\n {\n name: 'list_questions',\n description:\n 'List questions raised by workers, drivers, or analysts. Blocking stop behavior follows questionPolicy.',\n inputSchema: { type: 'object', properties: {} },\n handler: () => Promise.resolve({ questions }),\n },\n {\n name: 'answer_question',\n description: 'Record an answer, deferral, or escalation for a loop question.',\n inputSchema: {\n type: 'object',\n properties: {\n questionId: { type: 'string' },\n answer: { type: 'string' },\n by: { type: 'string', description: 'Node id or \"user\".' },\n deferReason: { type: 'string' },\n escalateTo: { type: 'string', enum: ['parent', 'user'] },\n escalateReason: { type: 'string' },\n },\n required: ['questionId'],\n },\n handler: (raw) => {\n const a = obj(raw)\n const questionId = str(a.questionId, 'questionId')\n if (typeof a.answer === 'string' && a.answer.length > 0) {\n return Promise.resolve({\n question: decideQuestion(questionId, {\n kind: 'answer',\n answer: a.answer,\n by: typeof a.by === 'string' && a.by.length > 0 ? a.by : 'user',\n }),\n })\n }\n if (typeof a.deferReason === 'string' && a.deferReason.length > 0) {\n return Promise.resolve({\n question: decideQuestion(questionId, {\n kind: 'defer',\n reason: a.deferReason,\n }),\n })\n }\n if (a.escalateTo === 'parent' || a.escalateTo === 'user') {\n const escalateReason =\n typeof a.escalateReason === 'string' && a.escalateReason.length > 0\n ? a.escalateReason\n : 'driver escalated'\n return Promise.resolve({\n question: decideQuestion(questionId, {\n kind: 'escalate',\n to: a.escalateTo,\n reason: escalateReason,\n }),\n })\n }\n throw new Error('answer_question: provide answer, deferReason, or escalateTo')\n },\n },\n {\n name: 'ask_parent',\n description: 'Raise a question to the parent driver/Pi/user when this driver cannot decide.',\n inputSchema: {\n type: 'object',\n properties: {\n from: { type: 'string' },\n level: { type: 'string', enum: ['worker', 'driver', 'loop'] },\n question: { type: 'string' },\n reason: { type: 'string' },\n urgency: { type: 'string', enum: ['continue-without', 'blocks-step', 'blocks-run'] },\n },\n required: ['from', 'level', 'question', 'reason', 'urgency'],\n },\n handler: async (raw) => {\n const a = obj(raw)\n const from = str(a.from, 'from')\n const q = await emitNewQuestion(\n addQuestion(\n {\n from,\n level: level(a.level),\n question: str(a.question, 'question'),\n reason: str(a.reason, 'reason'),\n urgency: urgency(a.urgency),\n },\n from,\n { kind: 'escalate', to: 'parent', reason: 'asked parent' },\n ),\n )\n return { question: q }\n },\n },\n {\n name: 'stop',\n description: 'Declare the run complete.',\n inputSchema: {\n type: 'object',\n properties: { reason: { type: 'string', description: 'Why you are stopping.' } },\n },\n handler: (raw) => {\n const blocking = blockingQuestionsForStop()\n if (blocking.length) {\n return Promise.resolve({\n stopped: false,\n error: 'unresolved-blocking-questions',\n questions: blocking,\n })\n }\n stopped = true\n const r = obj(raw).reason\n reason = typeof r === 'string' ? r : undefined\n return Promise.resolve({ stopped: true })\n },\n },\n ]\n\n if (opts.analysts) {\n tools.push({\n name: 'list_analysts',\n description: 'List trace-analyst lenses available to run over a settled worker.',\n inputSchema: { type: 'object', properties: {} },\n handler: () => Promise.resolve({ analysts: opts.analysts?.kinds }),\n })\n tools.push({\n name: 'run_analyst',\n description: 'Apply an analyst lens to a settled worker trace.',\n inputSchema: {\n type: 'object',\n properties: {\n kind: { type: 'string', description: 'The analyst kind id.' },\n workerId: idArg,\n },\n required: ['kind', 'workerId'],\n },\n handler: async (raw) => {\n const a = obj(raw)\n const id = str(a.workerId, 'workerId')\n const node = opts.scope.view.nodes.find((n) => n.id === id)\n if (!node) return { error: `unknown workerId ${JSON.stringify(id)}` }\n if (!node.outRef)\n return { error: `worker ${JSON.stringify(id)} has not settled — no trace to analyze yet` }\n const trace = await opts.blobs.get(node.outRef)\n return { findings: await opts.analysts?.run(str(a.kind, 'kind'), trace) }\n },\n })\n }\n\n return {\n tools,\n isStopped: () => stopped,\n stopReason: () => reason,\n settled: () => ledger,\n questions: () => questions,\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/profiles.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { C as CoderOutput, b as CoderProfileOptions, a as CoderTask, M as MultiHarnessCoderFanoutOptions, c as coderProfile, d as createCoderValidator, m as multiHarnessCoderFanout } from './coder-
|
|
2
|
-
import {
|
|
1
|
+
export { C as CoderOutput, b as CoderProfileOptions, a as CoderTask, M as MultiHarnessCoderFanoutOptions, c as coderProfile, d as createCoderValidator, m as multiHarnessCoderFanout } from './coder-CVZNGbyg.js';
|
|
2
|
+
import { S as SandboxClient, O as OutputAdapter, V as Validator, A as AgentRunSpec } from './types-nBMuollC.js';
|
|
3
3
|
import { a as UiLens, U as UiFinding } from './substrate-CUgk7F7s.js';
|
|
4
4
|
export { b as UI_FINDING_SEVERITIES, c as UI_LENSES, d as UiFindingScreenshot, e as UiFindingSeverity } from './substrate-CUgk7F7s.js';
|
|
5
5
|
import { SandboxEvent, AgentProfile } from '@tangle-network/sandbox';
|
|
@@ -159,7 +159,7 @@ type UiJudge = (input: UiJudgeInput) => Promise<UiJudgeOutput>;
|
|
|
159
159
|
/**
|
|
160
160
|
* @experimental
|
|
161
161
|
*
|
|
162
|
-
* `createInProcessUiAuditClient` — a `
|
|
162
|
+
* `createInProcessUiAuditClient` — a `SandboxClient` that drives a
|
|
163
163
|
* Playwright browser in-process and delegates finding identification to a
|
|
164
164
|
* consumer-supplied {@link UiJudge}.
|
|
165
165
|
*
|
|
@@ -172,7 +172,7 @@ type UiJudge = (input: UiJudgeInput) => Promise<UiJudgeOutput>;
|
|
|
172
172
|
*
|
|
173
173
|
* The client owns ONE browser for its lifetime and creates a fresh
|
|
174
174
|
* context per iteration (isolated cookies/storage). Playwright is
|
|
175
|
-
* dynamically imported so consumers who use a different `
|
|
175
|
+
* dynamically imported so consumers who use a different `SandboxClient`
|
|
176
176
|
* — e.g. a fleet executor that drives Playwright remotely — do not pay
|
|
177
177
|
* the peer dep cost.
|
|
178
178
|
*
|
|
@@ -249,7 +249,7 @@ interface PageHandle {
|
|
|
249
249
|
};
|
|
250
250
|
}
|
|
251
251
|
/** @experimental */
|
|
252
|
-
declare function createInProcessUiAuditClient(options: InProcessUiAuditClientOptions):
|
|
252
|
+
declare function createInProcessUiAuditClient(options: InProcessUiAuditClientOptions): SandboxClient & {
|
|
253
253
|
/**
|
|
254
254
|
* Close the underlying browser. Idempotent.
|
|
255
255
|
*
|
|
@@ -293,7 +293,7 @@ declare function buildAuditorSystemPrompt(lens: UiLens): string;
|
|
|
293
293
|
* @experimental
|
|
294
294
|
*
|
|
295
295
|
* Sandbox-event stream → UiAuditOutput decoder. The custom auditor
|
|
296
|
-
* `
|
|
296
|
+
* `SandboxClient` emits events of the form:
|
|
297
297
|
*
|
|
298
298
|
* { type: 'audit.capture', data: UiAuditCapture }
|
|
299
299
|
* { type: 'audit.finding', data: UiFinding }
|
|
@@ -319,7 +319,7 @@ declare function parseAuditorEvents(events: SandboxEvent[]): UiAuditOutput;
|
|
|
319
319
|
* — it's a vision-capable judge driving a browser. The loop kernel still
|
|
320
320
|
* iterates `client.create() → box.streamPrompt() → box.delete()`; the
|
|
321
321
|
* client/box pair are provided by `createInProcessUiAuditClient` (in
|
|
322
|
-
* `./in-process-client.ts`) or by a consumer-supplied `
|
|
322
|
+
* `./in-process-client.ts`) or by a consumer-supplied `SandboxClient`.
|
|
323
323
|
*/
|
|
324
324
|
|
|
325
325
|
/** @experimental */
|
|
@@ -330,7 +330,7 @@ interface UiAuditorProfileOptions {
|
|
|
330
330
|
name?: string;
|
|
331
331
|
/**
|
|
332
332
|
* Optional model identifier passed in `AgentProfile.model.default`.
|
|
333
|
-
* The consumer's `
|
|
333
|
+
* The consumer's `SandboxClient` chooses how to interpret it.
|
|
334
334
|
*/
|
|
335
335
|
model?: string;
|
|
336
336
|
/**
|