@iowarp/clio-coder 0.3.3 → 0.3.4
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/CHANGELOG.md +39 -0
- package/CONTRIBUTING.md +1 -1
- package/README.md +3 -3
- package/dist/{acp-P2AQILE2.js → acp-S5R4RR5B.js} +7 -6
- package/dist/{agents-72W3BI7I.js → agents-P6DMMVZY.js} +24 -21
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-5TWEIYDN.js → auth-2XCZLPKS.js} +12 -8
- package/dist/{chunk-GGXXDWE4.js → chunk-22NAGB7X.js} +2 -2
- package/dist/{chunk-2DJ2KNFG.js → chunk-2LZI5CAG.js} +133 -13
- package/dist/{chunk-OAO4GE4M.js → chunk-2TZWSW76.js} +2 -2
- package/dist/{chunk-OOJYHWRB.js → chunk-34475P3I.js} +2 -2
- package/dist/{chunk-4XUGQOHA.js → chunk-35MKKU5R.js} +4 -4
- package/dist/{chunk-LM5TQCJZ.js → chunk-3HZ5RWN2.js} +5 -5
- package/dist/{chunk-AGYYIBLL.js → chunk-3JLKSKD7.js} +2 -2
- package/dist/{chunk-KZWTDYJF.js → chunk-4JUF2NNX.js} +7 -7
- package/dist/{chunk-ZDOOVTXZ.js → chunk-4OC57DA6.js} +27 -4
- package/dist/chunk-5M54SPOL.js +926 -0
- package/dist/{chunk-STBPMHSX.js → chunk-7RXG6QRZ.js} +51 -11
- package/dist/{chunk-X6IAEBZR.js → chunk-A2GZF7DC.js} +5 -5
- package/dist/{chunk-A3CYT5EX.js → chunk-AD2SYQYC.js} +55 -2
- package/dist/chunk-AOCYTWAV.js +449 -0
- package/dist/chunk-BEY543CS.js +258 -0
- package/dist/{chunk-6N5PTWMY.js → chunk-BP4OYD6A.js} +32 -13
- package/dist/chunk-BPGS2WCQ.js +612 -0
- package/dist/{chunk-V6RTAOC2.js → chunk-BRXQQJFP.js} +8 -8
- package/dist/chunk-CFGTUFWB.js +67 -0
- package/dist/{chunk-CBCAPZAA.js → chunk-E25LMLRW.js} +2 -2
- package/dist/{chunk-DUYJ5IO6.js → chunk-EDRHSCIE.js} +4 -4
- package/dist/{chunk-XBXAASKX.js → chunk-EFADSJET.js} +2 -2
- package/dist/{chunk-M6SHUN7Q.js → chunk-FO5ZOVUY.js} +2 -2
- package/dist/chunk-FYYLNIL5.js +313 -0
- package/dist/{chunk-FNTMWMX5.js → chunk-HV5X7OR2.js} +14 -12
- package/dist/{chunk-TZTZS7QK.js → chunk-HXG4IURW.js} +5 -3
- package/dist/{chunk-5UFT4SUX.js → chunk-K6WL7QZT.js} +3 -3
- package/dist/chunk-K7VKOLQQ.js +15 -0
- package/dist/{chunk-BMEMKKIT.js → chunk-KOHPCX4K.js} +2 -2
- package/dist/{chunk-OC7FIQPC.js → chunk-KRPY7NTG.js} +10 -7
- package/dist/chunk-LL4KHSZI.js +22 -0
- package/dist/{chunk-DSELYM6W.js → chunk-MEQ45TQ4.js} +15 -9
- package/dist/{chunk-5UUP6MWO.js → chunk-MV3K5QF2.js} +5 -436
- package/dist/{chunk-6SGHMWE3.js → chunk-N4CZJQRK.js} +5 -5
- package/dist/{chunk-TZK7PACC.js → chunk-NILBFAPG.js} +14 -8
- package/dist/chunk-OZNBF4L3.js +23 -0
- package/dist/{verify-375KUB3Y.js → chunk-PCZJO5TI.js} +127 -42
- package/dist/chunk-QQK64KLB.js +1360 -0
- package/dist/{chunk-SRDMMSEP.js → chunk-QQL5RT5M.js} +979 -1619
- package/dist/{chunk-LZSJBIVT.js → chunk-QWU7ZBO7.js} +70 -720
- package/dist/{chunk-2TLUCQVG.js → chunk-RD5U66HV.js} +3 -3
- package/dist/{chunk-OKGUZO2U.js → chunk-SPULKLCF.js} +4 -3
- package/dist/{chunk-OQ33BKR3.js → chunk-TTNYS3EA.js} +3 -60
- package/dist/chunk-TW3WDMVS.js +677 -0
- package/dist/chunk-TZSKNMZG.js +434 -0
- package/dist/{chunk-7MNJORFF.js → chunk-UL3WSD3F.js} +6 -1
- package/dist/{chunk-PIWWS5BL.js → chunk-UZHIZC5S.js} +7 -7
- package/dist/{chunk-UFIIWP2H.js → chunk-VAWWTKDP.js} +8 -8
- package/dist/{chunk-COU2UHX6.js → chunk-VEZEGCGW.js} +170 -2
- package/dist/{chunk-LW6DSM3M.js → chunk-VMNQ6OZA.js} +98 -202
- package/dist/chunk-VSNATDE6.js +122 -0
- package/dist/chunk-W6GROXXM.js +69 -0
- package/dist/chunk-WPQLXFOZ.js +375 -0
- package/dist/{chunk-ORBHGJC5.js → chunk-WR67VIZY.js} +3 -3
- package/dist/{chunk-PAJK6MAQ.js → chunk-X6COSD2O.js} +5 -5
- package/dist/chunk-ZGVHUX3M.js +66 -0
- package/dist/{chunk-LWLEKMDQ.js → chunk-ZYKPLLNQ.js} +510 -547
- package/dist/cli/index.js +27 -23
- package/dist/{clio-JOU4FXVA.js → clio-J5JIOIDS.js} +7 -6
- package/dist/{code-nav-7AX6FYE6.js → code-nav-AXCXSBHX.js} +5 -3
- package/dist/{config-XCDVKR23.js → config-OEBMIN2U.js} +37 -27
- package/dist/{configure-4GAP54ZW.js → configure-PUQOSIXQ.js} +16 -13
- package/dist/{context-5VKGUVJJ.js → context-EKDCKUUZ.js} +82 -7
- package/dist/{context-4UOGGLQ5.js → context-MGSE4Z2T.js} +33 -23
- package/dist/{context-77FM5DV5.js → context-URSXPBCK.js} +17 -9
- package/dist/{context-clear-XXJRLCJJ.js → context-clear-KDAJRNUK.js} +33 -23
- package/dist/context-working-set-SBKMPPI2.js +1552 -0
- package/dist/{dispatch-runner-QPRDDBDX.js → dispatch-runner-MSWN72NK.js} +43 -29
- package/dist/{doctor-HR46URBJ.js → doctor-7BSE27PJ.js} +10 -10
- package/dist/{eval-XSSNATB4.js → eval-IZGDOO4H.js} +9 -8
- package/dist/{evidence-6HG2PY2B.js → evidence-SR7WXB5B.js} +51 -23
- package/dist/{evolve-K7YU3NCY.js → evolve-K7VE2CBX.js} +30 -20
- package/dist/{fleet-VY3HHKN6.js → fleet-7XMJNQNF.js} +48 -38
- package/dist/{fleet-preflight-DDN536IT.js → fleet-preflight-AQNAH644.js} +3 -3
- package/dist/{init-JYGXI3FK.js → init-JGNPAYXT.js} +41 -31
- package/dist/{memory-WFZMGYHX.js → memory-4ALKDJ4Q.js} +32 -22
- package/dist/{models-I5QWSEOM.js → models-ZMMLFJNN.js} +22 -19
- package/dist/{monitor-GE4ID3IA.js → monitor-2F3T5KHP.js} +55 -43
- package/dist/{orchestrator-EM5MC3HM.js → orchestrator-ORHT43JB.js} +572 -388
- package/dist/{reset-L2FQEE3E.js → reset-NXGTYNUO.js} +4 -3
- package/dist/{run-ZU3QMZPZ.js → run-RF4WJGMT.js} +51 -41
- package/dist/{share-S5BZQC5I.js → share-UT3W6E4M.js} +5 -4
- package/dist/{skills-X5VXCRNQ.js → skills-PSACKC5Q.js} +2 -2
- package/dist/{skills-eval-WKIHWTHR.js → skills-eval-WJSI55RZ.js} +34 -24
- package/dist/{targets-SNCPI2NR.js → targets-PIIRAOYS.js} +23 -20
- package/dist/{terminal-lease-BNAHVHBS.js → terminal-lease-ULWXWNVY.js} +4 -3
- package/dist/{upgrade-JQHHPQ4K.js → upgrade-346TZ6AV.js} +18 -17
- package/dist/{usage-OR4O5SMZ.js → usage-6KKXR32N.js} +34 -24
- package/dist/verifiers-4UUM6TEE.js +1214 -0
- package/dist/verify-X5HDROLA.js +25 -0
- package/dist/{wiki-generate-UEXP2ARI.js → wiki-generate-7STOCIFZ.js} +42 -31
- package/dist/worker/entry.js +33 -24
- package/docs/README.md +7 -6
- package/docs/acp.md +1 -1
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +53 -21
- package/docs/config-knobs-audit.md +1 -2
- package/docs/configuration-and-targets.md +15 -1
- package/docs/context-engine.md +64 -12
- package/docs/context-working-set.md +194 -0
- package/docs/development-pipeline.md +1 -1
- package/docs/documentation-coverage.md +5 -5
- package/docs/documentation-guide.md +6 -5
- package/docs/environment-variables.md +2 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +14 -1
- package/docs/evidence-and-memory.md +74 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +2 -2
- package/docs/fleet-dispatch.md +22 -7
- package/docs/glossary.md +21 -1
- package/docs/installation-and-lifecycle.md +2 -2
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +7 -9
- package/docs/observability.md +4 -4
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +4 -4
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +31 -31
- package/docs/safety-model.md +23 -4
- package/docs/scientific-validation.md +21 -3
- package/docs/session-lifecycle.md +3 -3
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +79 -12
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +11 -1
- package/package.json +8 -11
- package/skills/meta/clio-test/SKILL.md +20 -17
- package/skills/meta/clio-test/evals.md +3 -3
- package/skills/meta/clio-test/references/harness.md +35 -6
- package/skills/meta/clio-test/references/test-map.md +20 -10
- package/skills/registry.yaml +2 -2
- package/skills/skill-marketplace.json +1 -1
- package/src/cli/context-working-set.ts +513 -0
- package/src/cli/context.ts +8 -0
- package/src/cli/evidence.ts +20 -2
- package/src/cli/index.ts +4 -0
- package/src/cli/verifiers.ts +325 -0
- package/src/core/bash-exec.ts +39 -14
- package/src/core/bus-events.ts +19 -4
- package/src/core/config.ts +54 -0
- package/src/core/defaults.ts +50 -3
- package/src/core/verification-scripts.ts +6 -0
- package/src/domains/agents/builtins/verifier.md +3 -0
- package/src/domains/config/classify.ts +1 -0
- package/src/domains/context/working-set/contract.ts +161 -0
- package/src/domains/context/working-set/defaults.ts +28 -0
- package/src/domains/context/working-set/engine.ts +203 -0
- package/src/domains/context/working-set/fold.ts +62 -0
- package/src/domains/context/working-set/horizon.ts +38 -0
- package/src/domains/context/working-set/marker.ts +103 -0
- package/src/domains/context/working-set/path-index.ts +436 -0
- package/src/domains/context/working-set/payload.ts +152 -0
- package/src/domains/context/working-set/policies/age-horizon.ts +55 -0
- package/src/domains/context/working-set/policies/index.ts +21 -0
- package/src/domains/context/working-set/policies/structural.ts +160 -0
- package/src/domains/context/working-set/project.ts +132 -0
- package/src/domains/context/working-set/protect.ts +109 -0
- package/src/domains/context/working-set/recall.ts +177 -0
- package/src/domains/context/working-set/replay/controls.ts +112 -0
- package/src/domains/context/working-set/replay/load-clio.ts +199 -0
- package/src/domains/context/working-set/replay/metrics.ts +185 -0
- package/src/domains/context/working-set/replay/reference-graph.ts +79 -0
- package/src/domains/context/working-set/replay/report.ts +139 -0
- package/src/domains/context/working-set/replay/runner.ts +325 -0
- package/src/domains/context/working-set/replay/synthetic.ts +422 -0
- package/src/domains/context/working-set/replay/trace.ts +21 -0
- package/src/domains/context/working-set/visible.ts +54 -0
- package/src/domains/evidence/build.ts +112 -45
- package/src/domains/evidence/eval.ts +24 -7
- package/src/domains/evidence/index.ts +53 -0
- package/src/domains/evidence/ordering.ts +12 -0
- package/src/domains/evidence/run-trust.ts +221 -0
- package/src/domains/evidence/store.ts +46 -6
- package/src/domains/evidence/trust-status.ts +854 -0
- package/src/domains/evidence/types.ts +26 -0
- package/src/domains/middleware/memory-intervention.ts +3 -0
- package/src/domains/middleware/stalled-turn.ts +165 -4
- package/src/domains/safety/autonomy.ts +1 -1
- package/src/domains/safety/default-path-policy.ts +8 -0
- package/src/domains/safety/finish-contract.ts +4 -3
- package/src/domains/safety/policy-engine.ts +48 -6
- package/src/domains/session/compaction/compact.ts +23 -1
- package/src/domains/session/compaction/cut-point.ts +2 -0
- package/src/domains/session/compaction/tokens.ts +16 -1
- package/src/domains/session/context-ledger.ts +2 -0
- package/src/domains/session/entries.ts +107 -1
- package/src/domains/session/manager.ts +9 -2
- package/src/domains/session/migrations/index.ts +22 -3
- package/src/engine/acp/server.ts +3 -0
- package/src/engine/agent.ts +18 -1
- package/src/engine/session.ts +9 -3
- package/src/entry/orchestrator.ts +16 -4
- package/src/interactive/chat-loop-messages.ts +18 -6
- package/src/interactive/chat-panel.ts +17 -1
- package/src/interactive/chat-renderer.ts +30 -21
- package/src/interactive/context-meter.ts +10 -0
- package/src/interactive/context-overlay.ts +81 -6
- package/src/interactive/context-recall-command.ts +110 -0
- package/src/interactive/interactive-slash-runtime.ts +37 -1
- package/src/interactive/model-session-replay.ts +21 -0
- package/src/interactive/overlay-general-openers.ts +6 -0
- package/src/interactive/overlay-session-lifecycle.ts +8 -4
- package/src/interactive/renderers/tool-execution.ts +18 -2
- package/src/interactive/session-transcript.ts +2 -2
- package/src/interactive/slash-commands.ts +29 -2
- package/src/interactive/turn-context.ts +238 -88
- package/src/interactive/turn-middleware.ts +6 -6
- package/src/tools/agent-tools.ts +11 -4
- package/src/tools/bash.ts +144 -82
- package/src/tools/builtin-tool-catalog.ts +11 -5
- package/src/tools/context/index.ts +105 -3
- package/src/tools/context/surface.ts +3 -2
- package/src/tools/core-bootstrap.ts +21 -0
- package/src/tools/dispatch-runner.ts +9 -7
- package/src/tools/monitor.ts +28 -20
- package/src/tools/registry.ts +59 -7
- package/src/tools/result-disposition.ts +550 -0
- package/src/tools/result-shaping.ts +262 -19
- package/src/tools/safe-exec.ts +2 -0
- package/src/tools/verify/authoring.ts +1119 -0
- package/src/tools/verify/catalog.ts +346 -0
- package/src/tools/verify/index.ts +13 -3
- package/src/tools/verify/scripts.ts +135 -37
- package/src/tools/verify/surface.ts +9 -5
- package/src/tools/worker-evidence.ts +35 -12
- package/dist/chunk-J7CWMCQD.js +0 -255
- package/dist/chunk-T6YILFSB.js +0 -80
- package/dist/chunk-VAKQQHWR.js +0 -434
- package/dist/chunk-VPAYEGVX.js +0 -184
package/src/tools/monitor.ts
CHANGED
|
@@ -4,13 +4,18 @@ import { renderAgentLedgerBoard } from "../domains/dispatch/agent-ledger-store.j
|
|
|
4
4
|
import type { DurableAssignmentRecord } from "../domains/dispatch/assignment-store.js";
|
|
5
5
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
6
6
|
import { UNVERIFIABLE_RECEIPT_VERIFICATION } from "../domains/dispatch/receipt-findings.js";
|
|
7
|
-
import {
|
|
7
|
+
import type { ReceiptIntegrityResult } from "../domains/dispatch/receipt-integrity.js";
|
|
8
8
|
import {
|
|
9
9
|
isTerminalRunEnvelope,
|
|
10
10
|
type RunEnvelope,
|
|
11
11
|
type RunReceipt,
|
|
12
12
|
type RunReceiptVerification,
|
|
13
13
|
} from "../domains/dispatch/types.js";
|
|
14
|
+
import {
|
|
15
|
+
adaptRunReceiptTrustStatus,
|
|
16
|
+
type CanonicalTrustStatus,
|
|
17
|
+
inspectRunReceiptTrustStatus,
|
|
18
|
+
} from "../domains/evidence/trust-status.js";
|
|
14
19
|
import { COST_NOT_MEASURED, costAggregateForAmount, formatCostAggregate } from "../domains/observability/index.js";
|
|
15
20
|
import type { DispatchRunEventRegistry } from "./dispatch.js";
|
|
16
21
|
import { monitorToolSurface } from "./monitor-surface.js";
|
|
@@ -333,14 +338,18 @@ function runReceipt(deps: MonitorToolDeps, runId: string): ToolResult {
|
|
|
333
338
|
const body = truncateUtf8(raw, RECEIPT_MAX_BYTES, `\n[receipt truncated; read ${run.receiptPath} for the rest]`);
|
|
334
339
|
let receipt: RunReceipt | null = null;
|
|
335
340
|
let receiptIntegrity: ReceiptIntegrityResult;
|
|
341
|
+
let trustStatus: CanonicalTrustStatus;
|
|
336
342
|
try {
|
|
337
343
|
receipt = JSON.parse(raw) as RunReceipt;
|
|
338
|
-
|
|
344
|
+
const inspection = inspectRunReceiptTrustStatus(receipt, run);
|
|
345
|
+
receiptIntegrity = inspection.integrity;
|
|
346
|
+
trustStatus = inspection.status;
|
|
339
347
|
} catch (err) {
|
|
340
348
|
receiptIntegrity = {
|
|
341
349
|
ok: false,
|
|
342
350
|
reason: `receipt invalid: ${err instanceof Error ? err.message : String(err)}`,
|
|
343
351
|
};
|
|
352
|
+
trustStatus = adaptRunReceiptTrustStatus(null, { integrity: receiptIntegrity });
|
|
344
353
|
}
|
|
345
354
|
return {
|
|
346
355
|
kind: "ok",
|
|
@@ -350,6 +359,7 @@ function runReceipt(deps: MonitorToolDeps, runId: string): ToolResult {
|
|
|
350
359
|
runId,
|
|
351
360
|
receiptPath: run.receiptPath,
|
|
352
361
|
receiptIntegrity,
|
|
362
|
+
trustStatus,
|
|
353
363
|
...(receipt !== null && receiptIntegrity.ok
|
|
354
364
|
? {
|
|
355
365
|
evidenceVerification: receipt.verification,
|
|
@@ -366,6 +376,7 @@ interface DurableRunEvidence {
|
|
|
366
376
|
output: RunReceipt["output"] | null;
|
|
367
377
|
verification: RunReceiptVerification;
|
|
368
378
|
integrity: ReceiptIntegrityResult;
|
|
379
|
+
trustStatus: CanonicalTrustStatus;
|
|
369
380
|
integrityNote: string | null;
|
|
370
381
|
integrityFailure: boolean;
|
|
371
382
|
}
|
|
@@ -376,6 +387,7 @@ function unavailableRunEvidence(reason: string, note: string, integrityFailure =
|
|
|
376
387
|
output: null,
|
|
377
388
|
verification: UNVERIFIABLE_RECEIPT_VERIFICATION,
|
|
378
389
|
integrity: { ok: false, reason },
|
|
390
|
+
trustStatus: adaptRunReceiptTrustStatus(null, { integrity: { ok: false, reason } }),
|
|
379
391
|
integrityNote: note,
|
|
380
392
|
integrityFailure,
|
|
381
393
|
};
|
|
@@ -410,29 +422,24 @@ function durableRunEvidence(run: RunEnvelope | null): DurableRunEvidence {
|
|
|
410
422
|
`receipt integrity unavailable: cannot read or parse ${run.receiptPath} (${detail}); worker text is unavailable and validation is unknown.`,
|
|
411
423
|
);
|
|
412
424
|
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
integrity = verifyReceiptIntegrity(receipt, run);
|
|
416
|
-
} catch (err) {
|
|
417
|
-
const detail = err instanceof Error ? err.message : String(err);
|
|
418
|
-
return unavailableRunEvidence(
|
|
419
|
-
`receipt invalid: ${detail}`,
|
|
420
|
-
`receipt integrity failed: invalid receipt (${detail}); worker text is withheld as untrusted and validation is unknown.`,
|
|
421
|
-
true,
|
|
422
|
-
);
|
|
423
|
-
}
|
|
425
|
+
const inspection = inspectRunReceiptTrustStatus(receipt, run);
|
|
426
|
+
const integrity = inspection.integrity;
|
|
424
427
|
if (!integrity.ok) {
|
|
425
|
-
return
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
428
|
+
return {
|
|
429
|
+
...unavailableRunEvidence(
|
|
430
|
+
integrity.reason,
|
|
431
|
+
`receipt integrity failed: ${integrity.reason}; worker text is withheld as untrusted and validation is unknown.`,
|
|
432
|
+
true,
|
|
433
|
+
),
|
|
434
|
+
trustStatus: inspection.status,
|
|
435
|
+
};
|
|
430
436
|
}
|
|
431
437
|
return {
|
|
432
438
|
receipt,
|
|
433
439
|
output: receipt.output ?? null,
|
|
434
440
|
verification: receipt.verification,
|
|
435
441
|
integrity,
|
|
442
|
+
trustStatus: inspection.status,
|
|
436
443
|
integrityNote: null,
|
|
437
444
|
integrityFailure: false,
|
|
438
445
|
};
|
|
@@ -534,7 +541,7 @@ function collectRunLine(row: CollectedRunRow): string[] {
|
|
|
534
541
|
);
|
|
535
542
|
}
|
|
536
543
|
if (row.evidence.integrityNote) lines.push(` ${row.evidence.integrityNote}`);
|
|
537
|
-
lines.push(` ${workerTextLabel(row.evidence.
|
|
544
|
+
lines.push(` ${workerTextLabel(row.evidence.trustStatus)}`);
|
|
538
545
|
const output = row.evidence.output;
|
|
539
546
|
if (output) {
|
|
540
547
|
const capped = truncateUtf8(output.text, COLLECT_TEXT_BYTES, "...");
|
|
@@ -543,7 +550,7 @@ function collectRunLine(row: CollectedRunRow): string[] {
|
|
|
543
550
|
lines.push(` agent output${qualifier}${truncatedNote}:`, ...capped.split("\n").map((line) => ` ${line}`));
|
|
544
551
|
if (row.evidence.receipt) {
|
|
545
552
|
lines.push(
|
|
546
|
-
...workerTextNonEvidenceNotices(row.evidence.receipt, row.evidence.
|
|
553
|
+
...workerTextNonEvidenceNotices(row.evidence.receipt, row.evidence.trustStatus, output.text).map(
|
|
547
554
|
(notice) => ` ${notice}`,
|
|
548
555
|
),
|
|
549
556
|
);
|
|
@@ -693,6 +700,7 @@ async function runCollect(
|
|
|
693
700
|
exitCode: row.run?.exitCode ?? null,
|
|
694
701
|
receiptPath: row.run?.receiptPath ?? null,
|
|
695
702
|
receiptIntegrity: row.evidence.integrity,
|
|
703
|
+
trustStatus: row.evidence.trustStatus,
|
|
696
704
|
evidenceVerification: row.evidence.verification,
|
|
697
705
|
briefing: row.evidence.receipt?.briefing ?? null,
|
|
698
706
|
projectContext: row.evidence.receipt?.projectContext ?? null,
|
package/src/tools/registry.ts
CHANGED
|
@@ -27,7 +27,8 @@ import { detectValidationCommand } from "../domains/safety/protected-artifacts.j
|
|
|
27
27
|
import { askUserExposure } from "./ask-user.js";
|
|
28
28
|
import { type DispatchPlanView, describeDispatchPlan } from "./dispatch-plan.js";
|
|
29
29
|
import type { ToolPresentationPolicy } from "./presentation.js";
|
|
30
|
-
import {
|
|
30
|
+
import type { ToolResultDisposition } from "./result-disposition.js";
|
|
31
|
+
import { DEFAULT_TOOL_RESULT_MAX_BYTES, shapeToolResult } from "./result-shaping.js";
|
|
31
32
|
|
|
32
33
|
/**
|
|
33
34
|
* Tool registry. Admission point for every tool call. Delegates classification
|
|
@@ -56,6 +57,8 @@ export interface ToolSourceInfo {
|
|
|
56
57
|
export interface ToolResultSizePolicy {
|
|
57
58
|
kind: "exact" | "bounded" | "summary" | "truncate";
|
|
58
59
|
maxBytes?: number;
|
|
60
|
+
/** Scratch retention ceiling for this tool; defaults to the generic 10 MiB cap. */
|
|
61
|
+
offloadMaxBytes?: number;
|
|
59
62
|
followUpHint?: string;
|
|
60
63
|
}
|
|
61
64
|
|
|
@@ -68,6 +71,8 @@ export interface ToolMetadata {
|
|
|
68
71
|
retrySafety: ToolRetrySafety;
|
|
69
72
|
/** Expected result-size behavior at the registry boundary. */
|
|
70
73
|
resultSizePolicy: ToolResultSizePolicy;
|
|
74
|
+
/** Independent operator-presentation and model-context policy for this result. */
|
|
75
|
+
resultDisposition?: ToolResultDisposition;
|
|
71
76
|
/** Coarse cost/latency bucket for dashboard diagnostics. */
|
|
72
77
|
costLatency: ToolCostLatencyClass;
|
|
73
78
|
/**
|
|
@@ -114,6 +119,15 @@ export interface ToolSpec {
|
|
|
114
119
|
* the same function at the top of `run`.
|
|
115
120
|
*/
|
|
116
121
|
prepareArguments?(args: Record<string, unknown>): Record<string, unknown>;
|
|
122
|
+
/**
|
|
123
|
+
* Resolve an argument-sensitive canonical disposition after normalization
|
|
124
|
+
* and before execution. The registry applies the result exactly once after
|
|
125
|
+
* middleware has annotated the terminal result.
|
|
126
|
+
*/
|
|
127
|
+
resolveResultDisposition?(
|
|
128
|
+
args: Record<string, unknown>,
|
|
129
|
+
declared: ToolResultDisposition | undefined,
|
|
130
|
+
): ToolResultDisposition | undefined;
|
|
117
131
|
/**
|
|
118
132
|
* Synchronous admission planner. Unlike `prepareArguments`, this runs before
|
|
119
133
|
* safety/autonomy mapping so approval-sensitive tools can attach the exact
|
|
@@ -136,6 +150,8 @@ export type ToolResult =
|
|
|
136
150
|
kind: "ok";
|
|
137
151
|
output: string;
|
|
138
152
|
details?: ToolResultDetails;
|
|
153
|
+
/** Internal registry projection consumed only by the agent-tool adapter. */
|
|
154
|
+
modelContext?: string;
|
|
139
155
|
/**
|
|
140
156
|
* Early-termination hint propagated to pi-agent-core's
|
|
141
157
|
* `AgentToolResult.terminate`. When every finalized tool result in
|
|
@@ -145,7 +161,7 @@ export type ToolResult =
|
|
|
145
161
|
*/
|
|
146
162
|
terminate?: boolean;
|
|
147
163
|
}
|
|
148
|
-
| { kind: "error"; message: string; details?: ToolResultDetails };
|
|
164
|
+
| { kind: "error"; message: string; details?: ToolResultDetails; modelContext?: string };
|
|
149
165
|
|
|
150
166
|
export interface RegistryDeps {
|
|
151
167
|
safety: SafetyContract;
|
|
@@ -384,6 +400,7 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
|
|
|
384
400
|
decision: SafetyDecision,
|
|
385
401
|
options?: ToolInvokeOptions,
|
|
386
402
|
): Promise<RegistryVerdict> => {
|
|
403
|
+
let resultDisposition = spec.metadata?.resultDisposition;
|
|
387
404
|
try {
|
|
388
405
|
// The hook layer is the only control stage past safety admission. Guards
|
|
389
406
|
// (loop, protected artifacts, dispatch dedup) are before_tool
|
|
@@ -402,17 +419,18 @@ export function createRegistry(deps: RegistryDeps): ToolRegistry {
|
|
|
402
419
|
}
|
|
403
420
|
try {
|
|
404
421
|
const preparedArgs = prepareToolArgs(spec, call.args ?? {});
|
|
405
|
-
|
|
422
|
+
resultDisposition = resolveToolResultDisposition(spec, preparedArgs);
|
|
423
|
+
const result = await spec.run(preparedArgs, options);
|
|
406
424
|
const afterEffects = runToolHook("after_tool", spec, call, decision, options, result);
|
|
407
|
-
const finalResult = shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options);
|
|
425
|
+
const finalResult = shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options, resultDisposition);
|
|
408
426
|
return { kind: "ok", result: finalResult, decision };
|
|
409
427
|
} catch (err) {
|
|
410
428
|
const message = err instanceof Error ? err.message : String(err);
|
|
411
|
-
const result =
|
|
429
|
+
const result: ToolResult = { kind: "error", message };
|
|
412
430
|
const afterEffects = runToolHook("after_tool", spec, call, decision, options, result);
|
|
413
431
|
return {
|
|
414
432
|
kind: "ok",
|
|
415
|
-
result: shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options),
|
|
433
|
+
result: shapeToolResult(spec, applyToolResultEffects(result, afterEffects), options, resultDisposition),
|
|
416
434
|
decision,
|
|
417
435
|
};
|
|
418
436
|
}
|
|
@@ -857,6 +875,38 @@ function prepareToolArgs(spec: ToolSpec, args: Record<string, unknown>): Record<
|
|
|
857
875
|
}
|
|
858
876
|
}
|
|
859
877
|
|
|
878
|
+
/**
|
|
879
|
+
* Resolve the argument-sensitive disposition, failing closed. A throwing
|
|
880
|
+
* resolver cannot fall back to the declared disposition: the caller may have
|
|
881
|
+
* asked for a narrower context than the tool declares, and silently restoring
|
|
882
|
+
* the declared mode would widen model context while recording the declared mode
|
|
883
|
+
* as the requested one. The failure keeps the declared presentation and applies
|
|
884
|
+
* the narrowest context instead, so the applied and recorded modes stay honest.
|
|
885
|
+
*/
|
|
886
|
+
function resolveToolResultDisposition(
|
|
887
|
+
spec: ToolSpec,
|
|
888
|
+
args: Record<string, unknown>,
|
|
889
|
+
): ToolResultDisposition | undefined {
|
|
890
|
+
const declared = spec.metadata?.resultDisposition;
|
|
891
|
+
if (!spec.resolveResultDisposition) return declared;
|
|
892
|
+
try {
|
|
893
|
+
return spec.resolveResultDisposition(args, declared);
|
|
894
|
+
} catch (error) {
|
|
895
|
+
const maxBytes =
|
|
896
|
+
declared !== undefined && declared.context.maxBytes !== undefined
|
|
897
|
+
? declared.context.maxBytes
|
|
898
|
+
: DEFAULT_TOOL_RESULT_MAX_BYTES;
|
|
899
|
+
return {
|
|
900
|
+
presentation: declared?.presentation ?? { foldDefault: "folded", showDiffWhenFolded: false, failureExcerpt: true },
|
|
901
|
+
context: { mode: "metadata-only", maxBytes },
|
|
902
|
+
// The narrowing is recorded with the result, so a resolver bug shows up
|
|
903
|
+
// on the transcript row and in the model's header instead of reading as
|
|
904
|
+
// a deliberate metadata-only request.
|
|
905
|
+
fallback: { reason: "resolver-error", message: error instanceof Error ? error.message : String(error) },
|
|
906
|
+
};
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
|
|
860
910
|
function disposeAdmissionArgs(spec: ToolSpec | undefined, args: Record<string, unknown>): void {
|
|
861
911
|
try {
|
|
862
912
|
spec?.disposeAdmissionArguments?.(args);
|
|
@@ -1161,7 +1211,9 @@ function applyToolResultEffects(result: ToolResult, effects: ReadonlyArray<Middl
|
|
|
1161
1211
|
if (result.terminate === true) annotated.terminate = true;
|
|
1162
1212
|
return annotated;
|
|
1163
1213
|
}
|
|
1164
|
-
|
|
1214
|
+
const annotated: ToolResult = { kind: "error", message: `${result.message}${suffix}` };
|
|
1215
|
+
if (result.details !== undefined) annotated.details = result.details;
|
|
1216
|
+
return annotated;
|
|
1165
1217
|
}
|
|
1166
1218
|
|
|
1167
1219
|
function annotationMessages(effects: ReadonlyArray<MiddlewareEffect>): string[] {
|